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..4ab1d10f6 100644 --- a/packages/openapi-typescript/src/transform/components-object.ts +++ b/packages/openapi-typescript/src/transform/components-object.ts @@ -48,28 +48,35 @@ 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--; - output.push(indent("};", indentLv)); + const parametersKey = isEveryParameterOptional ? tsOptionalProperty("parameters") : "parameters"; + output.push(indent(`${parametersKey}: {`, indentLv), ...parameters, 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; };