Skip to content

Commit 7cb02ac

Browse files
feat: parameters is optional when every parameter is optional (#1335)
* feat: parameters is optional when every parameter is optional Closes #1334 * fixup! feat: parameters is optional when every parameter is optional
1 parent ee908d0 commit 7cb02ac

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

.changeset/unlucky-knives-look.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"openapi-typescript": minor
3+
---
4+
5+
Request parameters member is optional when all parameters are optional.

packages/openapi-typescript/src/transform/components-object.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,35 @@ export default function transformComponentsObject(components: ComponentsObject,
4848

4949
// parameters
5050
if (components.parameters) {
51-
output.push(indent("parameters: {", indentLv));
51+
const parameters: string[] = [];
5252
indentLv++;
53+
54+
let isEveryParameterOptional = true;
55+
5356
for (const [name, parameterObject] of getEntries(components.parameters, ctx.alphabetize, ctx.excludeDeprecated)) {
5457
const c = getSchemaObjectComment(parameterObject, indentLv);
55-
if (c) output.push(indent(c, indentLv));
58+
if (c) parameters.push(indent(c, indentLv));
5659
let key = escObjKey(name);
5760
if (ctx.immutableTypes) key = tsReadonly(key);
5861
if ("$ref" in parameterObject) {
59-
output.push(indent(`${key}: ${transformSchemaObject(parameterObject, { path: `#/components/parameters/${name}`, ctx })};`, indentLv));
62+
parameters.push(indent(`${key}: ${transformSchemaObject(parameterObject, { path: `#/components/parameters/${name}`, ctx })};`, indentLv));
63+
isEveryParameterOptional = false;
6064
} else {
6165
if (parameterObject.in !== "path" && !parameterObject.required) {
6266
key = tsOptionalProperty(key);
67+
} else {
68+
isEveryParameterOptional = false;
6369
}
6470
const parameterType = transformParameterObject(parameterObject, {
6571
path: `#/components/parameters/${name}`,
6672
ctx: { ...ctx, indentLv },
6773
});
68-
output.push(indent(`${key}: ${parameterType};`, indentLv));
74+
parameters.push(indent(`${key}: ${parameterType};`, indentLv));
6975
}
7076
}
7177
indentLv--;
72-
output.push(indent("};", indentLv));
78+
const parametersKey = isEveryParameterOptional ? tsOptionalProperty("parameters") : "parameters";
79+
output.push(indent(`${parametersKey}: {`, indentLv), ...parameters, indent("};", indentLv));
7380
} else {
7481
output.push(indent("parameters: never;", indentLv));
7582
}

packages/openapi-typescript/test/components-object.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ describe("Components Object", () => {
293293
expect(generated).toBe(`{
294294
schemas: never;
295295
responses: never;
296-
parameters: {
296+
parameters?: {
297297
myParam?: string;
298298
myParam2?: string;
299299
};

0 commit comments

Comments
 (0)