Skip to content

Commit 52d9681

Browse files
author
Piet van Agtmaal
committed
Fix empty request / response bodies
1 parent e735ff2 commit 52d9681

File tree

5 files changed

+102
-6
lines changed

5 files changed

+102
-6
lines changed

.changeset/mighty-ligers-cheat.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"openapi-typescript": patch
3+
---
4+
5+
Fix invalid typescript for empty request bodies, fix headers being left out when response body is omitted

packages/openapi-typescript/src/transform/request-body-object.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@ export default function transformRequestBodyObject(requestBodyObject: RequestBod
1313
const output: string[] = ["{"];
1414
indentLv++;
1515
output.push(indent(ctx.immutableTypes ? tsReadonly("content: {") : "content: {", indentLv));
16-
if (!Object.keys(requestBodyObject.content).length) return `${escStr("*/*")}: never`;
1716
indentLv++;
17+
18+
if (!Object.keys(requestBodyObject.content).length) {
19+
output.push(indent('"*/*": never;', indentLv));
20+
}
21+
1822
for (const [contentType, mediaTypeObject] of getEntries(requestBodyObject.content, ctx.alphabetize, ctx.excludeDeprecated)) {
1923
const c = getSchemaObjectComment(mediaTypeObject, indentLv);
2024
if (c) output.push(indent(c, indentLv));

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

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ export interface TransformResponseObjectOptions {
99
}
1010

1111
export default function transformResponseObject(responseObject: ResponseObject, { path, ctx }: TransformResponseObjectOptions): string {
12-
// never
13-
if (!responseObject.content) {
14-
return "never";
15-
}
16-
1712
const output: string[] = ["{"];
1813
let { indentLv } = ctx;
1914

@@ -68,6 +63,10 @@ export default function transformResponseObject(responseObject: ResponseObject,
6863
indentLv--;
6964
output.push(indent("};", indentLv));
7065
indentLv--;
66+
} else {
67+
indentLv++;
68+
output.push(indent("content: never;", indentLv));
69+
indentLv--;
7170
}
7271

7372
output.push(indent("}", indentLv));

packages/openapi-typescript/test/request-body-object.test.ts

+10
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,14 @@ describe("Request Body Object", () => {
4848
};
4949
}`);
5050
});
51+
52+
test("empty", () => {
53+
const schema: RequestBodyObject = { content: {} };
54+
const generated = transformRequestBodyObject(schema, options);
55+
expect(generated).toBe(`{
56+
content: {
57+
"*/*": never;
58+
};
59+
}`)
60+
});
5161
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import transformResponseObject, { TransformResponseObjectOptions } from "../src/transform/response-object.js";
2+
import type { ResponseObject } from "../src/types.js";
3+
4+
const options: TransformResponseObjectOptions = {
5+
path: "#/test/response-object",
6+
ctx: {
7+
additionalProperties: false,
8+
alphabetize: false,
9+
emptyObjectsUnknown: false,
10+
defaultNonNullable: false,
11+
discriminators: {},
12+
immutableTypes: false,
13+
indentLv: 0,
14+
operations: {},
15+
parameters: {},
16+
pathParamsAsTypes: false,
17+
postTransform: undefined,
18+
silent: true,
19+
supportArrayLength: false,
20+
transform: undefined,
21+
excludeDeprecated: false,
22+
},
23+
};
24+
25+
describe("Response Object", () => {
26+
test("basic", () => {
27+
const schema: ResponseObject = {
28+
description: "basic",
29+
headers: {
30+
foo: {
31+
schema: { type: "string" }
32+
}
33+
},
34+
content: {
35+
"application/json": {
36+
schema: {
37+
type: "object",
38+
properties: {
39+
url: { type: "string" },
40+
"content-type": { type: "string" },
41+
},
42+
required: ["url"],
43+
},
44+
},
45+
},
46+
};
47+
const generated = transformResponseObject(schema, options);
48+
expect(generated).toBe(`{
49+
headers: {
50+
foo?: string;
51+
};
52+
content: {
53+
"application/json": {
54+
url: string;
55+
"content-type"?: string;
56+
};
57+
};
58+
}`);
59+
});
60+
61+
test("empty", () => {
62+
const schema: ResponseObject = {
63+
description: "empty",
64+
headers: {
65+
"some-header": {
66+
schema: { type: "string" }
67+
}
68+
}
69+
};
70+
const generated = transformResponseObject(schema, options);
71+
expect(generated).toBe(`{
72+
headers: {
73+
"some-header"?: string;
74+
};
75+
content: never;
76+
}`)
77+
});
78+
});

0 commit comments

Comments
 (0)