UNPKG

jswagger-generator

Version:

This is jswagger's generator package.

97 lines (96 loc) 3.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const property_mapper_1 = require("../property-mapper"); const utils_1 = require("../utils"); exports.PRIMITIVES = { // boolean types boolean: 'boolean', // string types string: 'string', // number types integer: 'number', number: 'number', }; function generateTypesV3(schema, options) { if (!schema.components || !schema.components.schemas) { throw new Error('⛔️ \'components\' missing from schema https://swagger.io/specification'); } // propertyMapper const propertyMapped = options ? property_mapper_1.default(schema.components.schemas, options.propertyMapper) : schema.components.schemas; // type converter function transform(node) { switch (utils_1.nodeType(node)) { case 'ref': { return utils_1.transformRef(node.$ref); } case 'string': case 'number': case 'boolean': { return utils_1.nodeType(node) || 'any'; } case 'enum': { return utils_1.tsUnionOf(node.enum.map((item) => `'${item}'`)); } case 'oneOf': { return utils_1.tsUnionOf(node.oneOf.map(transform)); } case 'anyOf': { return utils_1.tsIntersectionOf(node.anyOf.map((anyOf) => utils_1.tsPartial(transform(anyOf)))); } case 'object': { // if empty object, then return generic map type if ((!node.properties || !Object.keys(node.properties).length) && !node.allOf && !node.additionalProperties) { return '{ [key: string]: any }'; } let properties = createKeys(node.properties || {}, node.required); // if additional properties, add to end of properties if (node.additionalProperties) { properties += `[key: string]: ${utils_1.nodeType(node.additionalProperties) || 'any'};\n`; } return utils_1.tsIntersectionOf([ ...(node.allOf ? node.allOf.map(transform) : []), ...(properties ? [`{ ${properties} }`] : []), ]); } case 'array': { return utils_1.tsArrayOf(transform(node.items)); } } return ''; } function createKeys(obj, required) { let output = ''; Object.entries(obj).forEach(([key, value]) => { // 1. JSDoc comment (goes above property) if (value.description) { output += utils_1.comment(value.description); } // 2. name (with “?” if optional property) output += `"${key}"${!required || !required.includes(key) ? '?' : ''}: `; // 3. open nullable if (value.nullable) { output += '('; } // 4. transform output += transform(value); // 5. close nullable if (value.nullable) { output += ') | null'; } // 6. close type output += ';\n'; }); return output; } // note: make sure that base-level schemas are required return `export interface components { schemas: { ${createKeys(propertyMapped, Object.keys(propertyMapped))} } }`; } exports.default = generateTypesV3;