openapi-typescript
Version:
Convert OpenAPI 3.0 & 3.1 schemas to TypeScript
143 lines (135 loc) • 4.9 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
const ts = require('typescript');
const changeCase = require('change-case');
const node_perf_hooks = require('node:perf_hooks');
const ts$1 = require('../lib/ts.cjs');
const utils = require('../lib/utils.cjs');
const headerObject = require('./header-object.cjs');
const parameterObject = require('./parameter-object.cjs');
const pathItemObject = require('./path-item-object.cjs');
const requestBodyObject = require('./request-body-object.cjs');
const responseObject = require('./response-object.cjs');
const schemaObject = require('./schema-object.cjs');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
function _interopNamespaceCompat(e) {
if (e && typeof e === 'object' && 'default' in e) return e;
const n = Object.create(null);
if (e) {
for (const k in e) {
n[k] = e[k];
}
}
n.default = e;
return n;
}
const ts__default = /*#__PURE__*/_interopDefaultCompat(ts);
const changeCase__namespace = /*#__PURE__*/_interopNamespaceCompat(changeCase);
const transformers = {
schemas: schemaObject.default,
responses: responseObject,
parameters: parameterObject,
requestBodies: requestBodyObject,
headers: headerObject,
pathItems: pathItemObject
};
function transformComponentsObject(componentsObject, ctx) {
const type = [];
const rootTypeAliases = {};
for (const key of Object.keys(transformers)) {
const componentT = node_perf_hooks.performance.now();
const items = [];
if (componentsObject[key]) {
for (const [name, item] of utils.getEntries(componentsObject[key], ctx)) {
let subType = transformers[key](item, {
path: utils.createRef(["components", key, name]),
schema: item,
ctx
});
let hasQuestionToken = false;
if (ctx.transform) {
const result = ctx.transform(item, {
path: utils.createRef(["components", key, name]),
schema: item,
ctx
});
if (result) {
if ("schema" in result) {
subType = result.schema;
hasQuestionToken = result.questionToken;
} else {
subType = result;
}
}
}
const property = ts__default.factory.createPropertySignature(
/* modifiers */
ts$1.tsModifiers({ readonly: ctx.immutable }),
/* name */
ts$1.tsPropertyIndex(name),
/* questionToken */
hasQuestionToken ? ts$1.QUESTION_TOKEN : void 0,
/* type */
subType
);
ts$1.addJSDocComment(item, property);
items.push(property);
if (ctx.rootTypes) {
const componentKey = changeCase__namespace.pascalCase(singularizeComponentKey(key));
let aliasName = `${componentKey}${changeCase__namespace.pascalCase(name)}`;
let conflictCounter = 1;
while (rootTypeAliases[aliasName] !== void 0) {
conflictCounter++;
aliasName = `${componentKey}${changeCase__namespace.pascalCase(name)}_${conflictCounter}`;
}
const ref = ts__default.factory.createTypeReferenceNode(`components['${key}']['${name}']`);
if (ctx.rootTypesNoSchemaPrefix && key === "schemas") {
aliasName = aliasName.replace(componentKey, "");
}
const typeAlias = ts__default.factory.createTypeAliasDeclaration(
/* modifiers */
ts$1.tsModifiers({ export: true }),
/* name */
aliasName,
/* typeParameters */
void 0,
/* type */
ref
);
rootTypeAliases[aliasName] = typeAlias;
}
}
}
type.push(
ts__default.factory.createPropertySignature(
/* modifiers */
void 0,
/* name */
ts$1.tsPropertyIndex(key),
/* questionToken */
void 0,
/* type */
items.length ? ts__default.factory.createTypeLiteralNode(items) : ts$1.NEVER
)
);
utils.debug(`Transformed components \u2192 ${key}`, "ts", node_perf_hooks.performance.now() - componentT);
}
let rootTypes = [];
if (ctx.rootTypes) {
rootTypes = Object.keys(rootTypeAliases).map((k) => rootTypeAliases[k]);
}
return [ts__default.factory.createTypeLiteralNode(type), ...rootTypes];
}
function singularizeComponentKey(key) {
switch (key) {
// Handle special singular case
case "requestBodies":
return "requestBody";
// Default to removing the "s"
default:
return key.slice(0, -1);
}
}
exports.default = transformComponentsObject;
exports.singularizeComponentKey = singularizeComponentKey;
//# sourceMappingURL=components-object.cjs.map
;