From 9c2290c76e08bb646c71a727676c6573804132e8 Mon Sep 17 00:00:00 2001 From: Alex Batalov Date: Tue, 9 Feb 2021 18:29:32 +0500 Subject: [PATCH 1/2] Add requestBodies transform support --- src/transform/index.ts | 7 ++-- src/transform/operation.ts | 36 +++++++++++++-------- src/transform/responses.ts | 15 +++++++++ tests/operation.test.ts | 37 ++++++++++++++++++++++ tests/v3/expected/petstore-openapitools.ts | 15 ++++++--- 5 files changed, 88 insertions(+), 22 deletions(-) diff --git a/src/transform/index.ts b/src/transform/index.ts index bf79b7697..1384b0ae8 100644 --- a/src/transform/index.ts +++ b/src/transform/index.ts @@ -3,7 +3,7 @@ import { comment } from "../utils"; import { transformHeaderObjMap } from "./headers"; import { transformOperationObj } from "./operation"; import { transformPathsObj } from "./paths"; -import { transformResponsesObj } from "./responses"; +import { transformResponsesObj, transformRequestBodies } from "./responses"; import { transformSchemaObjMap } from "./schema"; interface TransformOptions { @@ -89,10 +89,7 @@ export function transformAll(schema: any, { version, rawSchema }: TransformOptio // #/components/requestBodies if (schema.components.requestBodies) { - const required = Object.keys(schema.components.requestBodies); - output += ` requestBodies: {\n ${transformSchemaObjMap(schema.components.requestBodies, { - required, - })}\n }\n`; + output += ` requestBodies: {\n ${transformRequestBodies(schema.components.requestBodies)}\n }\n`; } // #/components/headers diff --git a/src/transform/operation.ts b/src/transform/operation.ts index 3fb6b8230..b7eca0490 100644 --- a/src/transform/operation.ts +++ b/src/transform/operation.ts @@ -1,4 +1,4 @@ -import { OperationObject, ParameterObject } from "../types"; +import { OperationObject, ParameterObject, RequestBody } from "../types"; import { comment, isRef, transformRef } from "../utils"; import { transformParametersArray } from "./parameters"; import { transformResponsesObj } from "./responses"; @@ -22,21 +22,31 @@ export function transformOperationObj( if (isRef(operation.requestBody)) { output += ` requestBody: ${transformRef(operation.requestBody.$ref)};\n`; } else { - const { description, content } = operation.requestBody; + if (operation.requestBody.description) output += comment(operation.requestBody.description); - if (description) output += comment(description); + output += ` requestBody: {\n`; // open requestBody + output += ` ${transformRequestBodyObj(operation.requestBody)}`; + output += ` }\n`; // close requestBody + } + } - if (content && Object.keys(content).length) { - output += ` requestBody: {\n content: {\n`; // open requestBody + return output; +} - Object.entries(content).forEach(([k, v]) => { - output += ` "${k}": ${transformSchemaObj(v.schema)};\n`; - }); - output += ` }\n }\n`; // close requestBody - } else { - output += ` requestBody: unknown;\n`; - } - } +export function transformRequestBodyObj(requestBody: RequestBody) { + let output = ""; + + const { content } = requestBody; + + if (content && Object.keys(content).length) { + output += ` content: {\n`; // open content + + Object.entries(content).forEach(([k, v]) => { + output += ` "${k}": ${transformSchemaObj(v.schema)};\n`; + }); + output += ` }\n`; // close content + } else { + output += ` unknown;\n`; } return output; diff --git a/src/transform/responses.ts b/src/transform/responses.ts index d4aff4467..f4d4e6a24 100644 --- a/src/transform/responses.ts +++ b/src/transform/responses.ts @@ -1,6 +1,8 @@ import { comment, transformRef } from "../utils"; import { transformHeaderObjMap } from "./headers"; import { transformSchemaObj } from "./schema"; +import { transformRequestBodyObj } from "./operation"; +import { RequestBody } from "../types"; const resType = (res: string | number) => (res === 204 || (res >= 300 && res < 400) ? "never" : "unknown"); @@ -49,3 +51,16 @@ export function transformResponsesObj(responsesObj: Record): string }); return output; } + +export function transformRequestBodies(requestBodies: Record) { + let output = ""; + + Object.entries(requestBodies).forEach(([bodyName, requestBody]) => { + if (requestBody && requestBody.description) output += ` ${comment(requestBody.description)}`; + output += ` ${bodyName}: {`; + output += ` ${transformRequestBodyObj(requestBody)}`; + output += ` }\n`; + }); + + return output; +} diff --git a/tests/operation.test.ts b/tests/operation.test.ts index f9063c17f..b310b3bed 100644 --- a/tests/operation.test.ts +++ b/tests/operation.test.ts @@ -1,4 +1,6 @@ +import prettier from "prettier"; import { transformOperationObj } from "../src/transform/operation"; +import { transformRequestBodies } from "../src/transform/responses"; describe("requestBody", () => { it("basic", () => { @@ -31,3 +33,38 @@ describe("requestBody", () => { ).toBe(`requestBody: components["requestBodies"]["Request"];`); }); }); + +describe("requestBodies", () => { + const format = (source: string) => prettier.format(source, { parser: "typescript" }); + + it("basic", () => { + const output = transformRequestBodies({ + Pet: { + description: "Pet request body", + content: { + "application/json": { + schema: { + type: "object", + properties: { + test: { type: "string" }, + }, + }, + }, + }, + }, + }).trim(); + + expect(format(`type requestBodies = {${output}}`)).toBe( + format(`type requestBodies = { + /** Pet request body */ + Pet: { + content: { + "application/json": { + test?: string; + }; + }; + }; + };`) + ); + }); +}); diff --git a/tests/v3/expected/petstore-openapitools.ts b/tests/v3/expected/petstore-openapitools.ts index cbd11545c..f31370b06 100644 --- a/tests/v3/expected/petstore-openapitools.ts +++ b/tests/v3/expected/petstore-openapitools.ts @@ -115,10 +115,17 @@ export interface components { }; }; requestBodies: { - /** List of user object */ - UserArray: { [key: string]: any }; - /** Pet object that needs to be added to the store */ - Pet: { [key: string]: any }; + UserArray: { + content: { + "application/json": components["schemas"]["User"][]; + }; + }; + Pet: { + content: { + "application/json": components["schemas"]["Pet"]; + "application/xml": components["schemas"]["Pet"]; + }; + }; }; } From 7fb007dbfbbee1bd858c4da895ae66505c45cdc5 Mon Sep 17 00:00:00 2001 From: Alex Batalov Date: Wed, 10 Feb 2021 00:43:27 +0500 Subject: [PATCH 2/2] Add missing code to the expected file --- tests/v3/expected/petstore-openapitools.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/v3/expected/petstore-openapitools.ts b/tests/v3/expected/petstore-openapitools.ts index f31370b06..26fc4794b 100644 --- a/tests/v3/expected/petstore-openapitools.ts +++ b/tests/v3/expected/petstore-openapitools.ts @@ -115,11 +115,13 @@ export interface components { }; }; requestBodies: { + /** List of user object */ UserArray: { content: { "application/json": components["schemas"]["User"][]; }; }; + /** Pet object that needs to be added to the store */ Pet: { content: { "application/json": components["schemas"]["Pet"];