UNPKG

openapi-typescript

Version:

Generate TypeScript types from Swagger OpenAPI specs

127 lines 5.71 kB
"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