From fcbfeb679300863cbd4a44073453c6efc6c73b65 Mon Sep 17 00:00:00 2001 From: Stephen Wheet Date: Sat, 28 Mar 2026 19:45:01 +0000 Subject: [PATCH] fix: resolve all TypeScript errors - node types, Express v4 types, places/scheduler fixes --- server/package-lock.json | 44 +++++++++++++++++++++++++++---------- server/package.json | 2 +- server/src/routes/admin.ts | 2 +- server/src/routes/places.ts | 6 ++--- server/src/scheduler.ts | 6 ++--- server/tsconfig.json | 1 + 6 files changed, 41 insertions(+), 20 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 77c8247..4f8b27d 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -30,7 +30,7 @@ "@types/bcryptjs": "^2.4.6", "@types/better-sqlite3": "^7.6.13", "@types/cors": "^2.8.19", - "@types/express": "^5.0.6", + "@types/express": "^4.17.25", "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.1.0", "@types/node": "^25.5.0", @@ -516,21 +516,22 @@ } }, "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, "license": "MIT", "dependencies": { @@ -558,6 +559,13 @@ "@types/node": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -627,13 +635,25 @@ } }, "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, diff --git a/server/package.json b/server/package.json index 39ae754..becc76e 100644 --- a/server/package.json +++ b/server/package.json @@ -29,7 +29,7 @@ "@types/bcryptjs": "^2.4.6", "@types/better-sqlite3": "^7.6.13", "@types/cors": "^2.8.19", - "@types/express": "^5.0.6", + "@types/express": "^4.17.25", "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.1.0", "@types/node": "^25.5.0", diff --git a/server/src/routes/admin.ts b/server/src/routes/admin.ts index f6d0afd..b460e77 100644 --- a/server/src/routes/admin.ts +++ b/server/src/routes/admin.ts @@ -94,7 +94,7 @@ router.put('/users/:id', (req: Request, res: Response) => { router.delete('/users/:id', (req: Request, res: Response) => { const authReq = req as AuthRequest; - if (parseInt(req.params.id) === authReq.user.id) { + if (parseInt(req.params.id as string) === authReq.user.id) { return res.status(400).json({ error: 'Cannot delete own account' }); } diff --git a/server/src/routes/places.ts b/server/src/routes/places.ts index 9acddb7..8dae83d 100644 --- a/server/src/routes/places.ts +++ b/server/src/routes/places.ts @@ -41,12 +41,12 @@ router.get('/', authenticate, requireTripAccess, (req: Request, res: Response) = if (category) { query += ' AND p.category_id = ?'; - params.push(category); + params.push(category as string); } if (tag) { query += ' AND p.id IN (SELECT place_id FROM place_tags WHERE tag_id = ?)'; - params.push(tag); + params.push(tag as string); } query += ' ORDER BY p.created_at DESC'; @@ -107,7 +107,7 @@ router.post('/', authenticate, requireTripAccess, validateStringLengths({ name: } } - const place = getPlaceWithTags(placeId); + const place = getPlaceWithTags(Number(placeId)); res.status(201).json({ place }); broadcast(tripId, 'place:created', { place }, req.headers['x-socket-id'] as string); }); diff --git a/server/src/scheduler.ts b/server/src/scheduler.ts index 0d415f3..2a8a75d 100644 --- a/server/src/scheduler.ts +++ b/server/src/scheduler.ts @@ -1,4 +1,4 @@ -import cron from 'node-cron'; +import cron, { type ScheduledTask } from 'node-cron'; import archiver from 'archiver'; import path from 'path'; import fs from 'fs'; @@ -23,7 +23,7 @@ interface BackupSettings { keep_days: number; } -let currentTask: cron.ScheduledTask | null = null; +let currentTask: ScheduledTask | null = null; function loadSettings(): BackupSettings { try { @@ -110,7 +110,7 @@ function start(): void { } // Demo mode: hourly reset of demo user data -let demoTask: cron.ScheduledTask | null = null; +let demoTask: ScheduledTask | null = null; function startDemoReset(): void { if (demoTask) { demoTask.stop(); demoTask = null; } diff --git a/server/tsconfig.json b/server/tsconfig.json index 0ecff37..4659864 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -9,6 +9,7 @@ "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, + "types": ["node"], "resolveJsonModule": true, "declaration": false, "sourceMap": true,