Skip to content

Commit

Permalink
feat: parameters is optional when every parameter is optional (#1335)
Browse files Browse the repository at this point in the history
* feat: parameters is optional when every parameter is optional

Closes #1334

* fixup! feat: parameters is optional when every parameter is optional
  • Loading branch information
duncanbeevers committed Sep 12, 2023
1 parent ee908d0 commit 7cb02ac
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/unlucky-knives-look.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"openapi-typescript": minor
---

Request parameters member is optional when all parameters are optional.
17 changes: 12 additions & 5 deletions packages/openapi-typescript/src/transform/components-object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand Down
2 changes: 1 addition & 1 deletion packages/openapi-typescript/test/components-object.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ describe("Components Object", () => {
expect(generated).toBe(`{
schemas: never;
responses: never;
parameters: {
parameters?: {
myParam?: string;
myParam2?: string;
};
Expand Down

0 comments on commit 7cb02ac

Please sign in to comment.