Skip to content

Commit 009fc07

Browse files
authored
WIP: Adding requestBodies transform support (#474)
* Add requestBodies transform support * Add missing code to the expected file
1 parent 6edecca commit 009fc07

File tree

5 files changed

+88
-20
lines changed

5 files changed

+88
-20
lines changed

src/transform/index.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { comment } from "../utils";
33
import { transformHeaderObjMap } from "./headers";
44
import { transformOperationObj } from "./operation";
55
import { transformPathsObj } from "./paths";
6-
import { transformResponsesObj } from "./responses";
6+
import { transformResponsesObj, transformRequestBodies } from "./responses";
77
import { transformSchemaObjMap } from "./schema";
88

99
interface TransformOptions {
@@ -89,10 +89,7 @@ export function transformAll(schema: any, { version, rawSchema }: TransformOptio
8989

9090
// #/components/requestBodies
9191
if (schema.components.requestBodies) {
92-
const required = Object.keys(schema.components.requestBodies);
93-
output += ` requestBodies: {\n ${transformSchemaObjMap(schema.components.requestBodies, {
94-
required,
95-
})}\n }\n`;
92+
output += ` requestBodies: {\n ${transformRequestBodies(schema.components.requestBodies)}\n }\n`;
9693
}
9794

9895
// #/components/headers

src/transform/operation.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { OperationObject, ParameterObject } from "../types";
1+
import { OperationObject, ParameterObject, RequestBody } from "../types";
22
import { comment, isRef, transformRef } from "../utils";
33
import { transformParametersArray } from "./parameters";
44
import { transformResponsesObj } from "./responses";
@@ -22,21 +22,31 @@ export function transformOperationObj(
2222
if (isRef(operation.requestBody)) {
2323
output += ` requestBody: ${transformRef(operation.requestBody.$ref)};\n`;
2424
} else {
25-
const { description, content } = operation.requestBody;
25+
if (operation.requestBody.description) output += comment(operation.requestBody.description);
2626

27-
if (description) output += comment(description);
27+
output += ` requestBody: {\n`; // open requestBody
28+
output += ` ${transformRequestBodyObj(operation.requestBody)}`;
29+
output += ` }\n`; // close requestBody
30+
}
31+
}
2832

29-
if (content && Object.keys(content).length) {
30-
output += ` requestBody: {\n content: {\n`; // open requestBody
33+
return output;
34+
}
3135

32-
Object.entries(content).forEach(([k, v]) => {
33-
output += ` "${k}": ${transformSchemaObj(v.schema)};\n`;
34-
});
35-
output += ` }\n }\n`; // close requestBody
36-
} else {
37-
output += ` requestBody: unknown;\n`;
38-
}
39-
}
36+
export function transformRequestBodyObj(requestBody: RequestBody) {
37+
let output = "";
38+
39+
const { content } = requestBody;
40+
41+
if (content && Object.keys(content).length) {
42+
output += ` content: {\n`; // open content
43+
44+
Object.entries(content).forEach(([k, v]) => {
45+
output += ` "${k}": ${transformSchemaObj(v.schema)};\n`;
46+
});
47+
output += ` }\n`; // close content
48+
} else {
49+
output += ` unknown;\n`;
4050
}
4151

4252
return output;

src/transform/responses.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { comment, transformRef } from "../utils";
22
import { transformHeaderObjMap } from "./headers";
33
import { transformSchemaObj } from "./schema";
4+
import { transformRequestBodyObj } from "./operation";
5+
import { RequestBody } from "../types";
46

57
const resType = (res: string | number) => (res === 204 || (res >= 300 && res < 400) ? "never" : "unknown");
68

@@ -49,3 +51,16 @@ export function transformResponsesObj(responsesObj: Record<string, any>): string
4951
});
5052
return output;
5153
}
54+
55+
export function transformRequestBodies(requestBodies: Record<string, RequestBody>) {
56+
let output = "";
57+
58+
Object.entries(requestBodies).forEach(([bodyName, requestBody]) => {
59+
if (requestBody && requestBody.description) output += ` ${comment(requestBody.description)}`;
60+
output += ` ${bodyName}: {`;
61+
output += ` ${transformRequestBodyObj(requestBody)}`;
62+
output += ` }\n`;
63+
});
64+
65+
return output;
66+
}

tests/operation.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import prettier from "prettier";
12
import { transformOperationObj } from "../src/transform/operation";
3+
import { transformRequestBodies } from "../src/transform/responses";
24

35
describe("requestBody", () => {
46
it("basic", () => {
@@ -31,3 +33,38 @@ describe("requestBody", () => {
3133
).toBe(`requestBody: components["requestBodies"]["Request"];`);
3234
});
3335
});
36+
37+
describe("requestBodies", () => {
38+
const format = (source: string) => prettier.format(source, { parser: "typescript" });
39+
40+
it("basic", () => {
41+
const output = transformRequestBodies({
42+
Pet: {
43+
description: "Pet request body",
44+
content: {
45+
"application/json": {
46+
schema: {
47+
type: "object",
48+
properties: {
49+
test: { type: "string" },
50+
},
51+
},
52+
},
53+
},
54+
},
55+
}).trim();
56+
57+
expect(format(`type requestBodies = {${output}}`)).toBe(
58+
format(`type requestBodies = {
59+
/** Pet request body */
60+
Pet: {
61+
content: {
62+
"application/json": {
63+
test?: string;
64+
};
65+
};
66+
};
67+
};`)
68+
);
69+
});
70+
});

tests/v3/expected/petstore-openapitools.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,18 @@ export interface components {
116116
};
117117
requestBodies: {
118118
/** List of user object */
119-
UserArray: { [key: string]: any };
119+
UserArray: {
120+
content: {
121+
"application/json": components["schemas"]["User"][];
122+
};
123+
};
120124
/** Pet object that needs to be added to the store */
121-
Pet: { [key: string]: any };
125+
Pet: {
126+
content: {
127+
"application/json": components["schemas"]["Pet"];
128+
"application/xml": components["schemas"]["Pet"];
129+
};
130+
};
122131
};
123132
}
124133

0 commit comments

Comments
 (0)