From 7ec8e9d4272ea6002612fb65f4cacd305ca06423 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 12 Jul 2026 13:31:14 +0100 Subject: [PATCH 1/3] fix: path parameters are always required --- .../core/normalization/parameter-normalizer.spec.ts | 11 +++++++++++ .../src/core/normalization/parameter-normalizer.ts | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts index c7aed5d00..fcb113747 100644 --- a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts +++ b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts @@ -102,6 +102,17 @@ describe("ParameterNormalizer", () => { }), ).toThrow("unsupported parameter style: 'form' for in: 'path'") }) + + it("forces required=true", ()=>{ + expect(parameterNormalizer.normalizeParameter({ + name: "id", + in: "path", + required: false, + schema: {type: "string"}, + })).toStrictEqual( + ir.pathParameter({style: "simple", explode: false, required: true}), + ) + }) }) describe("query parameters", () => { diff --git a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.ts b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.ts index 8d0962ba8..befa35d1d 100644 --- a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.ts +++ b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.ts @@ -117,7 +117,7 @@ export class ParameterNormalizer { properties[parameter.name] = schema - if (parameter.required) { + if (parameter.required || parameter.in === "path") { required.push(parameter.name) } } From cd287b326a8fff29e86bf7b830a4549eadbf84d7 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 12 Jul 2026 13:31:49 +0100 Subject: [PATCH 2/3] chore: regenerate --- .../src/generated/todo-lists.yaml/generated.ts | 2 +- .../typescript-express/src/generated/todo-lists.yaml/models.ts | 2 +- .../typescript-koa/src/generated/todo-lists.yaml/generated.ts | 2 +- .../typescript-koa/src/generated/todo-lists.yaml/models.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/typescript-express/src/generated/todo-lists.yaml/generated.ts b/integration-tests/typescript-express/src/generated/todo-lists.yaml/generated.ts index 6b508e4f3..9c68b8cbf 100644 --- a/integration-tests/typescript-express/src/generated/todo-lists.yaml/generated.ts +++ b/integration-tests/typescript-express/src/generated/todo-lists.yaml/generated.ts @@ -607,7 +607,7 @@ export function createRouter( }, ) - const replaceAttachmentParamSchema = z.object({id: z.string().optional()}) + const replaceAttachmentParamSchema = z.object({id: z.string()}) const replaceAttachmentResponseBodyValidator = responseValidationFactory( [["202", z.undefined()]], diff --git a/integration-tests/typescript-express/src/generated/todo-lists.yaml/models.ts b/integration-tests/typescript-express/src/generated/todo-lists.yaml/models.ts index 3b6579785..b52e29b1b 100644 --- a/integration-tests/typescript-express/src/generated/todo-lists.yaml/models.ts +++ b/integration-tests/typescript-express/src/generated/todo-lists.yaml/models.ts @@ -53,7 +53,7 @@ export type t_GetTodoListsQuerySchema = { } export type t_ReplaceAttachmentParamSchema = { - id?: string | undefined + id: string } export type t_UpdateTodoListByIdParamSchema = { diff --git a/integration-tests/typescript-koa/src/generated/todo-lists.yaml/generated.ts b/integration-tests/typescript-koa/src/generated/todo-lists.yaml/generated.ts index 31ab76033..9a4caefa9 100644 --- a/integration-tests/typescript-koa/src/generated/todo-lists.yaml/generated.ts +++ b/integration-tests/typescript-koa/src/generated/todo-lists.yaml/generated.ts @@ -564,7 +564,7 @@ export function createRouter( .then(handleResponse(ctx, uploadAttachmentResponseValidator)) }) - const replaceAttachmentParamSchema = z.object({id: z.string().optional()}) + const replaceAttachmentParamSchema = z.object({id: z.string()}) const replaceAttachmentResponseValidator = responseValidationFactory( [["202", z.undefined()]], diff --git a/integration-tests/typescript-koa/src/generated/todo-lists.yaml/models.ts b/integration-tests/typescript-koa/src/generated/todo-lists.yaml/models.ts index 724d4ac33..8633abcde 100644 --- a/integration-tests/typescript-koa/src/generated/todo-lists.yaml/models.ts +++ b/integration-tests/typescript-koa/src/generated/todo-lists.yaml/models.ts @@ -53,7 +53,7 @@ export type t_GetTodoListsQuerySchema = { } export type t_ReplaceAttachmentParamSchema = { - id?: string + id: string } export type t_UpdateTodoListByIdParamSchema = { From 09d72a5a0925a6c2c771ad1b7cc6d4eb18ad7340 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 12 Jul 2026 13:32:17 +0100 Subject: [PATCH 3/3] fix: required --- integration-tests-definitions/todo-lists.yaml | 1 + .../normalization/parameter-normalizer.spec.ts | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/integration-tests-definitions/todo-lists.yaml b/integration-tests-definitions/todo-lists.yaml index 7bc1f10b4..6146e6e8b 100644 --- a/integration-tests-definitions/todo-lists.yaml +++ b/integration-tests-definitions/todo-lists.yaml @@ -198,6 +198,7 @@ paths: parameters: - name: id in: path + required: true schema: type: string put: diff --git a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts index fcb113747..1f3166c05 100644 --- a/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts +++ b/packages/openapi-code-generator/src/core/normalization/parameter-normalizer.spec.ts @@ -103,13 +103,15 @@ describe("ParameterNormalizer", () => { ).toThrow("unsupported parameter style: 'form' for in: 'path'") }) - it("forces required=true", ()=>{ - expect(parameterNormalizer.normalizeParameter({ - name: "id", - in: "path", - required: false, - schema: {type: "string"}, - })).toStrictEqual( + it("forces required=true", () => { + expect( + parameterNormalizer.normalizeParameter({ + name: "id", + in: "path", + required: false, + schema: {type: "string"}, + }), + ).toStrictEqual( ir.pathParameter({style: "simple", explode: false, required: true}), ) })