Skip to content

Commit 59fe1ed

Browse files
authored
Merge pull request #15 from maxholman/fix/ref-query-header-coercion
fix: resolve $ref schemas for query and header param coercion
2 parents 0a4bb64 + 13a4b41 commit 59fe1ed

3 files changed

Lines changed: 33 additions & 8 deletions

File tree

__tests__/__snapshots__/nullables.test.ts.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ exports[`nullables 1`] = `
7777

7878
exports[`query and header integer params coerce strings to numbers 1`] = `
7979
"export type Dummy = string;
80+
export type ExpireTime = number;
8081
export type ListFilesCommandQuery = {
8182
exp: \`\${number}\`;
8283
limit?: \`\${number}\` | undefined;
@@ -92,6 +93,7 @@ exports[`query and header integer params coerce strings to numbers 2`] = `
9293
"import * as v from "valibot";
9394
9495
export const dummySchema = v.string();
96+
export const expireTimeSchema = v.pipe(v.number(), v.integer(), v.minValue(0));
9597
export const listFilesCommandQuerySchema = v.strictObject({
9698
"exp": v.pipe(v.string(), v.digits(), v.transform((n) => Number.parseInt(n, 10)), v.number(), v.integer(), v.minValue(0)),
9799
"limit": v.exactOptional(v.pipe(v.string(), v.digits(), v.transform((n) => Number.parseInt(n, 10)), v.number(), v.integer(), v.minValue(1), v.maxValue(100)))

__tests__/nullables.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ test("query and header integer params coerce strings to numbers", async () => {
113113
components: {
114114
schemas: {
115115
Dummy: { type: "string" },
116+
ExpireTime: {
117+
type: "integer",
118+
format: "int64",
119+
minimum: 0,
120+
},
116121
},
117122
},
118123
paths: {
@@ -125,9 +130,7 @@ test("query and header integer params coerce strings to numbers", async () => {
125130
in: "query",
126131
required: true,
127132
schema: {
128-
type: "integer",
129-
format: "int64",
130-
minimum: 0,
133+
$ref: "#/components/schemas/ExpireTime",
131134
},
132135
},
133136
{

lib/process-document.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,12 +407,32 @@ export async function processOpenApiDocument(
407407
// });
408408
}
409409

410-
if (resolvedParameter.in === "query") {
411-
queryParameters.push(resolvedParameter);
412-
}
410+
if (
411+
resolvedParameter.in === "query" ||
412+
resolvedParameter.in === "header"
413+
) {
414+
// Resolve $ref schemas so the valibot coercion
415+
// pipeline can inspect the underlying type
416+
const resolvedSchema =
417+
resolvedParameter.schema &&
418+
"$ref" in resolvedParameter.schema
419+
? (refs.get(resolvedParameter.schema.$ref) ?? undefined)
420+
: undefined;
421+
422+
const paramWithResolvedSchema: oas30.ParameterObject = {
423+
...resolvedParameter,
424+
...(resolvedSchema &&
425+
typeof resolvedSchema === "object" &&
426+
!Array.isArray(resolvedSchema) && {
427+
schema: resolvedSchema,
428+
}),
429+
};
413430

414-
if (resolvedParameter.in === "header") {
415-
headerParameters.push(resolvedParameter);
431+
if (resolvedParameter.in === "query") {
432+
queryParameters.push(paramWithResolvedSchema);
433+
} else {
434+
headerParameters.push(paramWithResolvedSchema);
435+
}
416436
}
417437
}
418438

0 commit comments

Comments
 (0)