openapi-typescript
Version:
Convert OpenAPI 3.0 & 3.1 schemas to TypeScript
97 lines (94 loc) • 3.35 kB
JavaScript
import ts from 'typescript';
import { oapiRef, tsModifiers, tsPropertyIndex, QUESTION_TOKEN, addJSDocComment, NEVER } from '../lib/ts.mjs';
import { createRef } from '../lib/utils.mjs';
import { transformParametersArray } from './parameters-array.mjs';
import transformRequestBodyObject from './request-body-object.mjs';
import transformResponsesObject from './responses-object.mjs';
function transformOperationObject(operationObject, options) {
const type = [];
type.push(...transformParametersArray(operationObject.parameters ?? [], options));
if (operationObject.requestBody) {
const requestBodyType = "$ref" in operationObject.requestBody ? oapiRef(operationObject.requestBody.$ref) : transformRequestBodyObject(operationObject.requestBody, {
...options,
path: createRef([options.path, "requestBody"])
});
const required = !!("$ref" in operationObject.requestBody ? options.ctx.resolve(operationObject.requestBody.$ref) : operationObject.requestBody)?.required;
const property = ts.factory.createPropertySignature(
/* modifiers */
tsModifiers({ readonly: options.ctx.immutable }),
/* name */
tsPropertyIndex("requestBody"),
/* questionToken */
required ? void 0 : QUESTION_TOKEN,
/* type */
requestBodyType
);
addJSDocComment(operationObject.requestBody, property);
type.push(property);
} else {
type.push(
ts.factory.createPropertySignature(
/* modifiers */
tsModifiers({ readonly: options.ctx.immutable }),
/* name */
tsPropertyIndex("requestBody"),
/* questionToken */
QUESTION_TOKEN,
/* type */
NEVER
)
);
}
type.push(
ts.factory.createPropertySignature(
/* modifiers */
tsModifiers({ readonly: options.ctx.immutable }),
/* name */
tsPropertyIndex("responses"),
/* questionToken */
void 0,
/* type */
transformResponsesObject(operationObject.responses ?? {}, options)
)
);
return type;
}
function injectOperationObject(operationId, operationObject, options) {
let operations = options.ctx.injectFooter.find(
(node) => ts.isInterfaceDeclaration(node) && node.name.text === "operations"
);
if (!operations) {
operations = ts.factory.createInterfaceDeclaration(
/* modifiers */
tsModifiers({
export: true
// important: do NOT make this immutable
}),
/* name */
ts.factory.createIdentifier("operations"),
/* typeParameters */
void 0,
/* heritageClauses */
void 0,
/* members */
[]
);
options.ctx.injectFooter.push(operations);
}
const type = transformOperationObject(operationObject, options);
operations.members = ts.factory.createNodeArray([
...operations.members,
ts.factory.createPropertySignature(
/* modifiers */
tsModifiers({ readonly: options.ctx.immutable }),
/* name */
tsPropertyIndex(operationId),
/* questionToken */
void 0,
/* type */
ts.factory.createTypeLiteralNode(type)
)
]);
}
export { transformOperationObject as default, injectOperationObject };
//# sourceMappingURL=operation-object.mjs.map