UNPKG

openapi-codegen-typescript

Version:

OpenApi codegen for generating types an mocks from swagger json file

223 lines (222 loc) 9.88 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var types_1 = require("./types"); var shared_1 = require("./shared"); var casual_1 = __importDefault(require("casual")); var MockGenerateHelper_1 = require("./MockGenerateHelper"); var getIsSchemaContainsAllOfArray = function (schema) { return schema && schema[types_1.SwaggerProps.AllOf] && Array.isArray(schema[types_1.SwaggerProps.AllOf]); }; /** * Get all interfaces that this schema exteds * @param schema DTO schema * @param DTOs all DTOs */ exports.getSchemaInterfaces = function (schema, DTOs) { if (getIsSchemaContainsAllOfArray(schema)) { var result_1 = []; schema[types_1.SwaggerProps.AllOf] .filter(function (e) { return e[types_1.SwaggerProps.$ref]; }) .forEach(function (obj) { var _a; var refType = obj[types_1.SwaggerProps.$ref].split('/'); /* Example: will return InviteMembersRequestDto if "SomeDTo extends InviteMembersRequestDto" */ var parsedRefType = MockGenerateHelper_1.MockGenerateHelper.parseRefType(refType); // Repeat "getSchemaInterfaces" in cycle for inner interfaces var newSchema = DTOs[parsedRefType]; if (getIsSchemaContainsAllOfArray(newSchema)) { (_a = exports.getSchemaInterfaces(newSchema, DTOs)) === null || _a === void 0 ? void 0 : _a.forEach(function (b) { result_1.push(b); }); } else if (newSchema) { result_1.push(parsedRefType); } result_1.push(parsedRefType); }); return result_1; } else { return undefined; } }; /** * Combines all properties from extended DTOs into one object. * * @param schema * @param schemas * @param interfaces */ exports.combineProperties = function (_a) { var schema = _a.schema, schemas = _a.schemas, interfaces = _a.interfaces; var combinedProperties = __assign({}, schema.properties); interfaces.forEach(function (interfaceName) { var dto = schemas[interfaceName]; if (dto) { var extendedDtoProps = void 0; if (dto.properties) { extendedDtoProps = dto.properties; } else if (dto[types_1.SwaggerProps.AllOf] && dto[types_1.SwaggerProps.AllOf][1].properties) { extendedDtoProps = dto[types_1.SwaggerProps.AllOf][1].properties; } combinedProperties = __assign(__assign({}, combinedProperties), extendedDtoProps); } }); schema.properties = combinedProperties; return __assign({}, schema); }; exports.parseSchema = function (_a) { var schema = _a.schema, name = _a.name, DTOs = _a.DTOs, overrideSchemas = _a.overrideSchemas; var parseSwaggerJsonObject = function (obj, interfaces) { if (interfaces) { obj = exports.combineProperties({ schema: obj, schemas: DTOs, interfaces: interfaces }); } var mocks = []; if (obj.properties) { var schemaProperties = shared_1.getSchemaProperties(obj.properties); schemaProperties.forEach(function (props) { var propertyName = props.propertyName, $ref = props.$ref, items = props.items, type = props.type, format = props.format, maxLength = props.maxLength, minLength = props.minLength, oneOf = props.oneOf, minimum = props.minimum, maximum = props.maximum, // Dictionary types xDictionaryKey = props.xDictionaryKey, additionalProperties = props.additionalProperties; if (name.includes('[') && name.includes(']')) { name = name.split('[')[0]; } casual_1.default.seed(shared_1.hashedString(name + propertyName)); var mockGenerator = new MockGenerateHelper_1.MockGenerateHelper(casual_1.default); if (type === types_1.DataTypes.String) { var stringMock = mockGenerator.getStringMock({ name: name, propertyName: propertyName, format: format, }); mocks.push(stringMock); } if (type === types_1.DataTypes.Integer || type === types_1.DataTypes.Number) { var numberMock = mockGenerator.getNumberMock({ propertyName: propertyName, type: type, minimum: minimum, maximum: maximum }); mocks.push(numberMock); } if (type === types_1.DataTypes.Boolean) { var boolMock = mockGenerator.getBooleanMock(propertyName); mocks.push(boolMock); } if (type === types_1.DataTypes.Array && items) { var arrayOfItemsMock = mockGenerator.getArrayOfItemsMock({ propertyName: propertyName, items: items, DTOs: DTOs, }); mocks.push(arrayOfItemsMock); } if (oneOf && Array.isArray(oneOf) && oneOf[0][types_1.SwaggerProps.$ref]) { var arrayOneOf = mockGenerator.getDtoMock({ propertyName: propertyName, oneOf: oneOf, DTOs: DTOs, overrideSchemas: overrideSchemas, }); mocks.push(arrayOneOf); } if ($ref) { var ref = mockGenerator.getRefTypeMock({ $ref: $ref, propertyName: propertyName, DTOs: DTOs, overrideSchemas: overrideSchemas }); mocks.push(ref); } if (xDictionaryKey && additionalProperties) { mocks.push(mockGenerator.getDictionaryMock({ propertyName: propertyName, xDictionaryKey: xDictionaryKey, additionalProperties: additionalProperties, DTOs: DTOs, overrideSchemas: overrideSchemas, })); } if (!xDictionaryKey && additionalProperties) { mocks.push(mockGenerator.getAdditionalPropertiesMock({ propertyName: propertyName, additionalProperties: additionalProperties, })); } if (!type && !$ref && !oneOf) { mocks.push(mockGenerator.getAnyMock({ propertyName: propertyName })); } }); } return MockGenerateHelper_1.MockGenerateHelper.getMockTemplateString({ typeName: name, varNamesAndValues: mocks }); }; if (schema[types_1.SwaggerProps.AllOf] && Array.isArray(schema[types_1.SwaggerProps.AllOf])) { var interfaces = exports.getSchemaInterfaces(schema, DTOs); var object = schema.allOf.find(function (schema) { return schema.type; }); return parseSwaggerJsonObject(object, interfaces); } else { return parseSwaggerJsonObject(schema); } }; exports.parseSchemas = function (_a) { var json = _a.json, overrideSchemas = _a.overrideSchemas; var schemas = shared_1.getSchemas({ json: json }); var DTOs = Object.keys(schemas); var resultString = ''; DTOs.forEach(function (dtoName) { try { var schema = schemas[dtoName]; if (schema.type === types_1.DataTypes.Object || schema.allOf) { var result = exports.parseSchema({ schema: schema, name: dtoName, DTOs: schemas, overrideSchemas: overrideSchemas, }); resultString += result; } } catch (error) { resultString += "// TODO: ERROR! Something wrong with " + dtoName + " \n"; } }); resultString += " \n"; return resultString; }; exports.convertToMocks = function (_a) { var json = _a.json, fileName = _a.fileName, folderPath = _a.folderPath, typesPath = _a.typesPath, overrideSchemas = _a.overrideSchemas; var schemas = shared_1.getSchemas({ json: json }); var imports = Object.keys(schemas) .map(function (dtoName) { // Sometimes in swagger 2.0 version could be such name as SomeDto[AnotherDto] if (shared_1.isSwaggerV2(json) && dtoName.includes('[') && dtoName.includes(']')) { return dtoName.split('[')[0]; } else { return dtoName; } }) .join(', '); var disableNoUse = '/* eslint-disable @typescript-eslint/no-use-before-define */\n'; var disableNoUsedVars = '/* eslint-disable @typescript-eslint/no-unused-vars */\n'; var importsDescription = "import {" + imports + "} from '" + typesPath + "';\n"; var result = exports.parseSchemas({ json: json, overrideSchemas: overrideSchemas }); var resultString = "" + disableNoUse + disableNoUsedVars + importsDescription + result; shared_1.writeToFile({ folderPath: folderPath, fileName: fileName, resultString: resultString, }); return resultString; };