feat(scanner): detect missing books via watcher and propagate to UI

This commit is contained in:
neon
2026-01-28 07:58:26 -06:00
parent 14ebb843bd
commit 426bc5fc82
22 changed files with 1083 additions and 70 deletions
+20 -7
View File
@@ -16,6 +16,7 @@
"db:migrate": "drizzle-kit migrate",
"db:studio": "drizzle-kit studio",
"scan:test": "ts-node -r tsconfig-paths/register src/scripts/scan-test.ts",
"sim:missing": "ts-node -r tsconfig-paths/register src/scripts/missing-detection-sim.ts",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
@@ -40,14 +41,14 @@
"@nestjs/websockets": "^11.1.12",
"@projectx/types": "workspace:*",
"bcryptjs": "^3.0.3",
"chokidar": "^4.0.3",
"chokidar": "5.0.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.3",
"drizzle-orm": "^0.45.1",
"fast-xml-parser": "^5.3.3",
"jose": "^6.1.3",
"node-unrar-js": "^2.0.2",
"nodemailer": "^7.0.12",
"nodemailer": "^7.0.13",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"pdf-lib": "^1.17.1",
@@ -57,7 +58,7 @@
"sharp": "^0.34.5",
"socket.io": "^4.8.3",
"unzipper": "^0.12.3",
"zod": "^4.3.5"
"zod": "^4.3.6"
},
"devDependencies": {
"@eslint/eslintrc": "^3.2.0",
@@ -66,14 +67,13 @@
"@nestjs/schematics": "^11.0.0",
"@nestjs/testing": "^11.0.1",
"@swc/cli": "^0.7.10",
"@swc/core": "^1.15.10",
"@swc/core": "^1.15.11",
"@types/bcrypt": "^6.0.0",
"@types/bcryptjs": "^3.0.0",
"@types/chokidar": "^1.7.5",
"@types/express": "^5.0.0",
"@types/jest": "^30.0.0",
"@types/node": "^22.10.7",
"@types/nodemailer": "^7.0.5",
"@types/nodemailer": "^7.0.9",
"@types/passport-jwt": "^4.0.1",
"@types/pg": "^8.16.0",
"@types/supertest": "^6.0.2",
@@ -104,7 +104,20 @@
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
"^.+\\.(t|j)s$": [
"ts-jest",
{
"tsconfig": {
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"resolvePackageJsonExports": false
}
}
]
},
"moduleNameMapper": {
"^@projectx/types$": "<rootDir>/../../packages/types/src/index.ts"
},
"collectCoverageFrom": [
"**/*.(t|j)s"