Skip to content

Commit e8d8347

Browse files
committed
log-server: fix request with querystrings
This pins express-openapi-validator while cdimascio/express-openapi-validator#1071 is being fixed
1 parent 1ac951b commit e8d8347

File tree

6 files changed

+671
-883
lines changed

6 files changed

+671
-883
lines changed

.changeset/real-regions-attack.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@lightmill/log-server': patch
3+
---
4+
5+
Fix broken requests with query strings

packages/log-server/__tests__/app-errors.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
createAllRoute,
1010
createMockStore,
1111
MockSessionStore,
12+
type MockStore,
1213
} from './test-utils.js';
1314

1415
let allRoutes = createAllRoute();

packages/log-server/package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
"devDependencies": {
3131
"@types/better-sqlite3": "^7.6.13",
3232
"@types/cookie-parser": "^1.4.8",
33-
"@types/cors": "^2.8.17",
34-
"@types/express": "^5.0.1",
33+
"@types/cors": "^2.8.18",
34+
"@types/express": "^5.0.2",
3535
"@types/express-session": "^1.18.1",
3636
"@types/node": "catalog:",
3737
"@types/supertest": "^6.0.3",
@@ -40,9 +40,9 @@
4040
"cross-env": "^7.0.3",
4141
"onchange": "^7.1.0",
4242
"string-dedent": "^3.0.1",
43-
"supertest": "^7.1.0",
43+
"supertest": "^7.1.1",
4444
"tsx": "catalog:",
45-
"type-fest": "^4.39.1",
45+
"type-fest": "^4.41.0",
4646
"typescript": "catalog:",
4747
"vitest": "catalog:"
4848
},
@@ -51,21 +51,21 @@
5151
"express": "^5.1.0"
5252
},
5353
"dependencies": {
54-
"@gabriel/ts-pattern": "npm:@jsr/gabriel__ts-pattern@^5.6.2",
55-
"better-sqlite3": "^11.9.1",
54+
"@gabriel/ts-pattern": "npm:@jsr/gabriel__ts-pattern@^5.7.1",
55+
"better-sqlite3": "^11.10.0",
5656
"cookie-parser": "^1.4.7",
5757
"cors": "^2.8.5",
5858
"csv": "^6.3.11",
59-
"dotenv": "^16.4.7",
59+
"dotenv": "^16.5.0",
6060
"express": "^5.1.0",
61-
"express-openapi-validator": "^5.4.9",
61+
"express-openapi-validator": "5.4.9",
6262
"express-session": "^1.18.1",
63-
"kysely": "^0.28.1",
63+
"kysely": "^0.28.2",
6464
"loglevel": "^1.9.2",
6565
"memorystore": "^1.6.7",
66-
"remeda": "^2.21.2",
66+
"remeda": "^2.21.8",
6767
"yargs": "17.7.2",
68-
"zod": "^3.24.2"
68+
"zod": "^3.25.7"
6969
},
7070
"engines": {
7171
"node": "^22.x.x"

packages/log-server/src/api-utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,13 @@ export type ApiOperation<
100100
M extends HttpMethod = HttpMethod,
101101
> = NonNullable<A[P][M]>;
102102

103+
interface QueryParameter {
104+
[key: string]: string | string[] | QueryParameter;
105+
}
106+
103107
export interface RequestParameters {
104108
path?: Record<string, string>;
105-
query?: Record<string, string | string[]>;
109+
query?: QueryParameter;
106110
header?: Record<string, string>;
107111
cookie?: Record<string, string>;
108112
}

packages/log-server/src/app.ts

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,24 @@ export function LogServer({
4646
sessionStore = new MemorySessionStore({ checkPeriod: 1000 * 60 * 60 * 24 }),
4747
baseUrl = '/',
4848
}: CreateLogServerOptions): { middleware: express.RequestHandler } {
49-
const app = express.Router();
49+
const app = express();
50+
51+
app.set('query parser', (str: string | null) => {
52+
if (str == null) return {};
53+
let params = new URLSearchParams(decodeURIComponent(str));
54+
let values: Record<string, string[] | string> = {};
55+
for (const [key, value] of params.entries()) {
56+
let oldValue = values[key];
57+
if (oldValue == null) {
58+
values[key] = value;
59+
} else if (Array.isArray(oldValue)) {
60+
oldValue.push(value);
61+
} else {
62+
values[key] = [oldValue, value];
63+
}
64+
}
65+
return values;
66+
});
5067

5168
app.use(express.json());
5269

@@ -89,34 +106,6 @@ export function LogServer({
89106
}),
90107
);
91108

92-
app.use(
93-
(
94-
request: express.Request,
95-
_res: express.Response,
96-
next: NextFunction,
97-
): void => {
98-
let str = request.url.split('?')[1];
99-
if (str == null) {
100-
next();
101-
return;
102-
}
103-
let params = new URLSearchParams(decodeURIComponent(str));
104-
let values: Record<string, string[] | string> = {};
105-
for (const [key, value] of params.entries()) {
106-
let oldValue = values[key];
107-
if (oldValue == null) {
108-
values[key] = value;
109-
} else if (Array.isArray(oldValue)) {
110-
oldValue.push(value);
111-
} else {
112-
values[key] = [oldValue, value];
113-
}
114-
}
115-
request.query = values;
116-
next();
117-
},
118-
);
119-
120109
createTypedExpressServer<ServerApi>(
121110
store,
122111
{

0 commit comments

Comments
 (0)