openapi-typescript
Version:
Generate TypeScript types from Swagger OpenAPI specs
127 lines • 5.71 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformSchemaObj = exports.transformOneOf = exports.transformAnyOf = exports.transformSchemaObjMap = void 0;
const utils_1 = require("../utils");
function hasDefaultValue(node) {
if (node.hasOwnProperty("default"))
return true;
return false;
}
function transformSchemaObjMap(obj, options) {
let output = "";
for (const k of Object.keys(obj)) {
const v = obj[k];
if (v.description)
output += utils_1.comment(v.description);
const readonly = utils_1.tsReadonly(options.immutableTypes);
const required = options.required.has(k) || (options.defaultNonNullable && hasDefaultValue(v.schema || v)) ? "" : "?";
output += `${readonly}"${k}"${required}: `;
output += transformSchemaObj(v.schema || v, options);
output += `;\n`;
}
return output.replace(/\n+$/, "\n");
}
exports.transformSchemaObjMap = transformSchemaObjMap;
function transformAnyOf(anyOf, options) {
return utils_1.tsIntersectionOf(anyOf.map((s) => utils_1.tsPartial(transformSchemaObj(s, options))));
}
exports.transformAnyOf = transformAnyOf;
function transformOneOf(oneOf, options) {
return utils_1.tsUnionOf(oneOf.map((value) => transformSchemaObj(value, options)));
}
exports.transformOneOf = transformOneOf;
function transformSchemaObj(node, options) {
var _a;
const readonly = utils_1.tsReadonly(options.immutableTypes);
let output = "";
if (node.nullable) {
output += "(";
}
const overriddenType = options.formatter && options.formatter(node);
if (overriddenType) {
output += overriddenType;
}
else {
switch (utils_1.nodeType(node)) {
case "ref": {
output += utils_1.transformRef(node.$ref);
break;
}
case "string":
case "number":
case "boolean": {
output += utils_1.nodeType(node) || "any";
break;
}
case "enum": {
const items = [];
node.enum.forEach((item) => {
if (typeof item === "string")
items.push(`'${item.replace(/'/g, "\\'")}'`);
else if (typeof item === "number" || typeof item === "boolean")
items.push(item);
else if (item === null && !node.nullable)
items.push("null");
});
output += utils_1.tsUnionOf(items);
break;
}
case "object": {
const isAnyOfOrOneOfOrAllOf = "anyOf" in node || "oneOf" in node || "allOf" in node;
if (!isAnyOfOrOneOfOrAllOf &&
(!node.properties || !Object.keys(node.properties).length) &&
!node.additionalProperties) {
output += `{ ${readonly}[key: string]: any }`;
break;
}
let properties = transformSchemaObjMap(node.properties || {}, {
...options,
required: new Set(node.required || []),
});
let additionalProperties;
if (node.additionalProperties ||
(node.additionalProperties === undefined && options.additionalProperties && options.version === 3)) {
if (((_a = node.additionalProperties) !== null && _a !== void 0 ? _a : true) === true || Object.keys(node.additionalProperties).length === 0) {
additionalProperties = `{ ${readonly}[key: string]: any }`;
}
else if (typeof node.additionalProperties === "object") {
const oneOf = node.additionalProperties.oneOf || undefined;
const anyOf = node.additionalProperties.anyOf || undefined;
if (oneOf) {
additionalProperties = `{ ${readonly}[key: string]: ${transformOneOf(oneOf, options)}; }`;
}
else if (anyOf) {
additionalProperties = `{ ${readonly}[key: string]: ${transformAnyOf(anyOf, options)}; }`;
}
else {
additionalProperties = `{ ${readonly}[key: string]: ${transformSchemaObj(node.additionalProperties, options) || "any"}; }`;
}
}
}
output += utils_1.tsIntersectionOf([
...(node.allOf ? node.allOf.map((node) => transformSchemaObj(node, options)) : []),
...(node.anyOf ? [transformAnyOf(node.anyOf, options)] : []),
...(node.oneOf ? [transformOneOf(node.oneOf, options)] : []),
...(properties ? [`{\n${properties}\n}`] : []),
...(additionalProperties ? [additionalProperties] : []),
]);
break;
}
case "array": {
if (Array.isArray(node.items)) {
output += `${readonly}${utils_1.tsTupleOf(node.items.map((node) => transformSchemaObj(node, options)))}`;
}
else {
output += `${readonly}${utils_1.tsArrayOf(node.items ? transformSchemaObj(node.items, options) : "any")}`;
}
break;
}
}
}
if (node.nullable) {
output += ") | null";
}
return output;
}
exports.transformSchemaObj = transformSchemaObj;
//# sourceMappingURL=schema.js.map