openapi-codegen-typescript
Version:
OpenApi codegen for generating types an mocks from swagger json file
223 lines (222 loc) • 9.88 kB
JavaScript
"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;
};