From e6e09f8c3e507817411f9a77d2cad055cdaf1420 Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Tue, 30 Dec 2025 20:58:07 -0500 Subject: [PATCH 1/2] redesigned http logger to output json objects --- api/src/index.ts | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/api/src/index.ts b/api/src/index.ts index 118162e..f5331a8 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -5,24 +5,24 @@ import express = require('express'); import cors = require('cors'); import morgan = require('morgan'); const app = express() -import chalk from 'chalk'; + app.use(morgan((tokens: morgan.TokenIndexer, req: express.Request, res: express.Response) => { - const status = Number(tokens.status(req, res)); + return JSON.stringify({ + type: 'http', + timestamp: new Date().toISOString(), - // Colorize status code - const statusColor = status >= 500 ? chalk.red - : status >= 400 ? chalk.yellow - : status >= 300 ? chalk.cyan - : chalk.green; + method: tokens.method(req, res), + path: tokens.url(req, res), + status: Number(tokens.status(req, res)), + response_time_ms: Number(tokens['response-time'](req, res)), - return [ - chalk.gray(`[${new Date().toISOString()}]`), - chalk.blue.bold(tokens.method(req, res)), - tokens.url(req, res), - statusColor(status), - chalk.magenta(tokens['response-time'](req, res) + ' ms'), - chalk.yellow(`- User: ${req.user?.name ? `${req.user.name} (${req.user.id})` : 'Unauthenticated'}`), - ].join(' '); + ip: req.ip, + user_agent: req.headers['user-agent'], + + user: req.user + ? { id: req.user.id, name: req.user.name } + : null, + }); }, { skip: (req: express.Request) => { return req.originalUrl === '/members/me'; From 6acd423557301e2c77f200ef192a97ec8be34e3b Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Tue, 30 Dec 2025 20:58:31 -0500 Subject: [PATCH 2/2] removed chalk dependency and patched vulnerability --- api/package-lock.json | 19 +++---------------- api/package.json | 1 - 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 1cc11a1..8cbfa51 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "@sentry/node": "^10.27.0", "@types/express-session": "^1.18.2", - "chalk": "^5.6.2", "connect-sqlite3": "^0.9.16", "cors": "^2.8.5", "dotenv": "^17.2.1", @@ -1315,18 +1314,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3235,9 +3222,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" diff --git a/api/package.json b/api/package.json index 73ad3fb..4168206 100644 --- a/api/package.json +++ b/api/package.json @@ -14,7 +14,6 @@ "dependencies": { "@sentry/node": "^10.27.0", "@types/express-session": "^1.18.2", - "chalk": "^5.6.2", "connect-sqlite3": "^0.9.16", "cors": "^2.8.5", "dotenv": "^17.2.1",