Skip to content

Commit ce043da

Browse files
committed
fix: don't use custom parsing for simple cases
1 parent f7290ce commit ce043da

4 files changed

Lines changed: 20 additions & 11 deletions

File tree

packages/openapi-code-generator/src/core/openapi-types-normalized.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export interface IRParameterPath extends IRParameterBase {
142142
export interface IRParameterQuery extends IRParameterBase {
143143
in: "query"
144144
style: "form" | "spaceDelimited" | "pipeDelimited" | "deepObject" // default: form
145-
explode: boolean | undefined // default: true for form/cookie, false for other styles
145+
explode: boolean // default: true for form/cookie, false for other styles
146146
allowEmptyValue: boolean //default: false
147147
}
148148

packages/openapi-code-generator/src/typescript/server/server-operation-builder.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export type Parameters = {
6262
schema: string | undefined
6363
type: string
6464
parameters: QueryParameter[]
65+
isSimpleQuery: boolean
6566
}
6667
header: {
6768
name: string
@@ -198,6 +199,7 @@ export class ServerOperationBuilder {
198199

199200
private queryParameters(): Parameters["query"] {
200201
const $ref = this.operation.parameters.query.$ref
202+
const parameters = this.operation.parameters.query.list
201203

202204
const schema = $ref
203205
? this.schemaBuilder.fromModel(this.input.schema($ref), true, true)
@@ -210,18 +212,25 @@ export class ServerOperationBuilder {
210212
}
211213

212214

215+
const reflectionParameters = parameters.map((it) => ({
216+
name: it.name,
217+
explode: it.explode,
218+
style: it.style,
219+
schema: this.queryParameterRuntimeSchema(this.input.schema(it.schema)),
220+
}))
221+
222+
// When all the query parameters are primitives, we don't need to do custom parsing, as server frameworks
223+
// will already parse them naively.
224+
const isSimpleQuery = reflectionParameters.every(
225+
(it) => it.schema.type !== "object" && it.schema.type !== "array",
226+
)
227+
213228
return {
214229
name: this.operation.parameters.query.name,
215230
schema: schema,
216231
type,
217-
parameters: this.operation.parameters.query.list.map((it) => ({
218-
name: it.name,
219-
// todo: only default true when style: form
220-
// todo: remove defaulting - normalization does this
221-
explode: it.explode ?? true,
222-
style: it.style ?? "form",
223-
schema: this.queryParameterRuntimeSchema(this.input.schema(it.schema)),
224-
})),
232+
parameters: reflectionParameters,
233+
isSimpleQuery,
225234
}
226235
}
227236

packages/openapi-code-generator/src/typescript/server/typescript-express/typescript-express-router-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ router.${builder.method.toLowerCase()}(\`${builder.route}\`, async (req: Request
143143
try {
144144
const input = {
145145
params: ${params.path.schema ? `parseRequestInput(${params.path.name}, req.params, RequestInputType.RouteParam)` : "undefined"},
146-
query: ${params.query.schema ? `parseRequestInput(${params.query.name}, parseQueryParameters(new URL(\`http://localhost\${req.originalUrl}\`).search, ${JSON.stringify(params.query.parameters)}), RequestInputType.QueryString)` : "undefined"},
146+
query: ${params.query.schema ? `parseRequestInput(${params.query.name}, ${params.query.isSimpleQuery ? `req.query` : `parseQueryParameters(new URL(\`http://localhost\${req.originalUrl}\`).search, ${JSON.stringify(params.query.parameters)})`}, RequestInputType.QueryString)` : "undefined"},
147147
${params.body.schema && !params.body.isSupported ? `// todo: request bodies with content-type '${params.body.contentType}' not yet supported\n` : ""}body: ${params.body.schema ? `parseRequestInput(${params.body.schema}, req.body, RequestInputType.RequestBody)${!params.body.isSupported ? " as never" : ""}` : "undefined"},
148148
headers: ${params.header.schema ? `parseRequestInput(${params.header.name}, req.headers, RequestInputType.RequestHeader)` : "undefined"}
149149
}

packages/openapi-code-generator/src/typescript/server/typescript-koa/typescript-koa-router-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ const ${symbols.responseBodyValidator} = ${builder.responseValidator()}
146146
router.${builder.method.toLowerCase()}('${symbols.implPropName}','${builder.route}', async (ctx, next) => {
147147
const input = {
148148
params: ${params.path.schema ? `parseRequestInput(${params.path.name}, ctx.params, RequestInputType.RouteParam)` : "undefined"},
149-
query: ${params.query.schema ? `parseRequestInput(${params.query.name}, parseQueryParameters(ctx.querystring, ${JSON.stringify(params.query.parameters)}), RequestInputType.QueryString)` : "undefined"},
149+
query: ${params.query.schema ? `parseRequestInput(${params.query.name}, ${params.query.isSimpleQuery ? "ctx.query" : `parseQueryParameters(ctx.querystring, ${JSON.stringify(params.query.parameters)})`}, RequestInputType.QueryString)` : "undefined"},
150150
${params.body.schema && !params.body.isSupported ? `// todo: request bodies with content-type '${params.body.contentType}' not yet supported\n` : ""}body: ${params.body.schema ? `parseRequestInput(${params.body.schema}, Reflect.get(ctx.request, "body"), RequestInputType.RequestBody)${!params.body.isSupported ? " as never" : ""}` : "undefined"},
151151
headers: ${params.header.schema ? `parseRequestInput(${params.header.name}, Reflect.get(ctx.request, "headers"), RequestInputType.RequestHeader)` : "undefined"}
152152
}

0 commit comments

Comments
 (0)