UNPKG

openapi-typescript

Version:

Generate TypeScript types from Swagger OpenAPI specs

72 lines (60 loc) 2.66 kB
import { GlobalContext } from "../types"; import { comment, transformRef, tsReadonly } from "../utils"; import { transformHeaderObjMap } from "./headers"; import { transformSchemaObj } from "./schema"; const resType = (res: string | number) => (res === 204 || (res >= 300 && res < 400) ? "never" : "unknown"); export function transformResponsesObj(responsesObj: Record<string, any>, ctx: GlobalContext): string { const readonly = tsReadonly(ctx.immutableTypes); let output = ""; for (const httpStatusCode of Object.keys(responsesObj)) { const statusCode = Number(httpStatusCode) || `"${httpStatusCode}"`; // don’t surround w/ quotes if numeric status code const response = responsesObj[httpStatusCode]; if (response.description) output += comment(response.description); if (response.$ref) { output += ` ${readonly}${statusCode}: ${transformRef(response.$ref)};\n`; // reference continue; } if ((!response.content && !response.schema) || (response.content && !Object.keys(response.content).length)) { output += ` ${readonly}${statusCode}: ${resType(statusCode)};\n`; // unknown / missing response continue; } output += ` ${readonly}${statusCode}: {\n`; // open response // headers if (response.headers && Object.keys(response.headers).length) { if (response.headers.$ref) { output += ` ${readonly}headers: ${transformRef(response.headers.$ref)};\n`; } else { output += ` ${readonly}headers: {\n ${transformHeaderObjMap(response.headers, { ...ctx, required: new Set<string>(), })}\n }\n`; } } // response switch (ctx.version) { case 3: { output += ` ${readonly}content: {\n`; // open content for (const contentType of Object.keys(response.content)) { const contentResponse = response.content[contentType] as any; const responseType = contentResponse && contentResponse?.schema ? transformSchemaObj(contentResponse.schema, { ...ctx, required: new Set<string>() }) : "unknown"; output += ` ${readonly}"${contentType}": ${responseType};\n`; } output += ` }\n`; // close content break; } case 2: { // note: because of the presence of "headers", we have to namespace this somehow; "schema" seemed natural output += ` ${readonly} schema: ${transformSchemaObj(response.schema, { ...ctx, required: new Set<string>(), })};\n`; break; } } output += ` }\n`; // close response } return output; }