From 9aca5b114502cc6a71283e77104eaa40f9bf4da4 Mon Sep 17 00:00:00 2001 From: Duncan Beevers Date: Sun, 10 Sep 2023 18:51:50 -0700 Subject: [PATCH 1/2] feat: parameters is optional when every parameter is optional Closes #1334 --- .changeset/unlucky-knives-look.md | 5 +++++ .../src/transform/components-object.ts | 17 +++++++++++++---- .../test/components-object.test.ts | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 .changeset/unlucky-knives-look.md diff --git a/.changeset/unlucky-knives-look.md b/.changeset/unlucky-knives-look.md new file mode 100644 index 000000000..a6712aacb --- /dev/null +++ b/.changeset/unlucky-knives-look.md @@ -0,0 +1,5 @@ +--- +"openapi-typescript": minor +--- + +Request parameters member is optional when all parameters are optional. diff --git a/packages/openapi-typescript/src/transform/components-object.ts b/packages/openapi-typescript/src/transform/components-object.ts index 74cccceae..36f8be343 100644 --- a/packages/openapi-typescript/src/transform/components-object.ts +++ b/packages/openapi-typescript/src/transform/components-object.ts @@ -48,27 +48,36 @@ export default function transformComponentsObject(components: ComponentsObject, // parameters if (components.parameters) { - output.push(indent("parameters: {", indentLv)); + const parameters: string[] = []; indentLv++; + + let isEveryParameterOptional = true; + for (const [name, parameterObject] of getEntries(components.parameters, ctx.alphabetize, ctx.excludeDeprecated)) { const c = getSchemaObjectComment(parameterObject, indentLv); - if (c) output.push(indent(c, indentLv)); + if (c) parameters.push(indent(c, indentLv)); let key = escObjKey(name); if (ctx.immutableTypes) key = tsReadonly(key); if ("$ref" in parameterObject) { - output.push(indent(`${key}: ${transformSchemaObject(parameterObject, { path: `#/components/parameters/${name}`, ctx })};`, indentLv)); + parameters.push(indent(`${key}: ${transformSchemaObject(parameterObject, { path: `#/components/parameters/${name}`, ctx })};`, indentLv)); + isEveryParameterOptional = false; } else { if (parameterObject.in !== "path" && !parameterObject.required) { key = tsOptionalProperty(key); + } else { + isEveryParameterOptional = false; } const parameterType = transformParameterObject(parameterObject, { path: `#/components/parameters/${name}`, ctx: { ...ctx, indentLv }, }); - output.push(indent(`${key}: ${parameterType};`, indentLv)); + parameters.push(indent(`${key}: ${parameterType};`, indentLv)); } } indentLv--; + const parametersKey = isEveryParameterOptional ? tsOptionalProperty("parameters") : "parameters"; + output.push(indent(`${parametersKey}: {`, indentLv)); + output.push(...parameters); output.push(indent("};", indentLv)); } else { output.push(indent("parameters: never;", indentLv)); diff --git a/packages/openapi-typescript/test/components-object.test.ts b/packages/openapi-typescript/test/components-object.test.ts index 1ab7bd925..b1d240076 100644 --- a/packages/openapi-typescript/test/components-object.test.ts +++ b/packages/openapi-typescript/test/components-object.test.ts @@ -293,7 +293,7 @@ describe("Components Object", () => { expect(generated).toBe(`{ schemas: never; responses: never; - parameters: { + parameters?: { myParam?: string; myParam2?: string; }; From 77c171b50b3662cf52f5a5215eec9681ebb0eee6 Mon Sep 17 00:00:00 2001 From: Duncan Beevers Date: Mon, 11 Sep 2023 10:27:39 -0700 Subject: [PATCH 2/2] fixup! feat: parameters is optional when every parameter is optional --- .../openapi-typescript/src/transform/components-object.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/openapi-typescript/src/transform/components-object.ts b/packages/openapi-typescript/src/transform/components-object.ts index 36f8be343..4ab1d10f6 100644 --- a/packages/openapi-typescript/src/transform/components-object.ts +++ b/packages/openapi-typescript/src/transform/components-object.ts @@ -76,9 +76,7 @@ export default function transformComponentsObject(components: ComponentsObject, } indentLv--; const parametersKey = isEveryParameterOptional ? tsOptionalProperty("parameters") : "parameters"; - output.push(indent(`${parametersKey}: {`, indentLv)); - output.push(...parameters); - output.push(indent("};", indentLv)); + output.push(indent(`${parametersKey}: {`, indentLv), ...parameters, indent("};", indentLv)); } else { output.push(indent("parameters: never;", indentLv)); }