openapi-typescript
Version:
Generate TypeScript types from Swagger OpenAPI specs
87 lines (78 loc) • 2.97 kB
text/typescript
import { GlobalContext, ParameterObject, ReferenceObject } from "../types";
import { comment, tsReadonly } from "../utils";
import { transformSchemaObj } from "./schema";
interface TransformParametersOptions extends GlobalContext {
globalParameters?: Record<string, ParameterObject>;
}
export function transformParametersArray(
parameters: (ReferenceObject | ParameterObject)[],
options: TransformParametersOptions
): string {
const { globalParameters = {}, ...ctx } = options;
const readonly = tsReadonly(ctx.immutableTypes);
let output = "";
// sort into map
let mappedParams: Record<string, Record<string, ParameterObject>> = {};
for (const paramObj of parameters as any[]) {
if (paramObj.$ref && globalParameters) {
const paramName = paramObj.$ref.split("/").pop(); // take last segment
if (globalParameters[paramName]) {
const reference = globalParameters[paramName] as any;
if (!mappedParams[reference.in]) mappedParams[reference.in] = {};
switch (ctx.version) {
case 3: {
mappedParams[reference.in][reference.name || paramName] = {
...reference,
schema: { $ref: paramObj.$ref },
};
break;
}
case 2: {
mappedParams[reference.in][reference.name || paramName] = {
...reference,
$ref: paramObj.$ref,
};
break;
}
}
}
continue;
}
if (!paramObj.in || !paramObj.name) continue;
if (!mappedParams[paramObj.in]) mappedParams[paramObj.in] = {};
mappedParams[paramObj.in][paramObj.name] = paramObj;
}
// transform output
for (const [paramIn, paramGroup] of Object.entries(mappedParams)) {
output += ` ${readonly}${paramIn}: {\n`; // open in
for (const [paramName, paramObj] of Object.entries(paramGroup)) {
let paramComment = "";
if (paramObj.deprecated) paramComment += `@deprecated `;
if (paramObj.description) paramComment += paramObj.description;
if (paramComment) output += comment(paramComment);
const required = paramObj.required ? `` : `?`;
let paramType = ``;
switch (ctx.version) {
case 3: {
paramType = paramObj.schema
? transformSchemaObj(paramObj.schema, { ...ctx, required: new Set<string>() })
: "unknown";
break;
}
case 2: {
if (paramObj.in === "body" && paramObj.schema) {
paramType = transformSchemaObj(paramObj.schema, { ...ctx, required: new Set<string>() });
} else if (paramObj.type) {
paramType = transformSchemaObj(paramObj, { ...ctx, required: new Set<string>() });
} else {
paramType = "unknown";
}
break;
}
}
output += ` ${readonly}"${paramName}"${required}: ${paramType};\n`;
}
output += ` }\n`; // close in
}
return output;
}