@infinite-debugger/swagger-to-ts
Version:
swagger-to-ts is a powerful library that allows you to generate TypeScript code from Swagger documentation or OpenAPI specifications. It simplifies the process of integrating API definitions into your TypeScript projects, saving you time and effort.
279 lines • 23.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateModelMappings = void 0;
const TypescriptAPIGenerator_1 = require("../../models/TypescriptAPIGenerator");
const SchemaGenerator_1 = require("../SchemaGenerator");
const Utils_1 = require("../Utils");
const ModelCodeGenerator_1 = require("./ModelCodeGenerator");
/**
* Generate model mappings
*
* @param options The options to use when generating the model mappings
* @returns The model mappings
*/
const generateModelMappings = ({ requestGroupings, openAPISpecification, generateTsEDControllers, inferTypeFromValidationSchema, }) => {
//#region Find all Schemas referenced in the requests
const schemaEntityReferences = Object.entries(requestGroupings).reduce((accumulator, [tagName, { requests }]) => {
requests.forEach(({ responses, requestBody, headerParametersModelReference, queryParametersModelReference, }) => {
[
...Object.values(responses),
...(() => {
if (requestBody) {
return [requestBody];
}
return [];
})(),
].forEach(({ content }) => {
if (content) {
if (content['application/json']?.schema) {
if ('$ref' in content['application/json'].schema) {
const schemaReference = content['application/json'].schema.$ref;
const schemaName = schemaReference.replace('#/components/schemas/', '');
[
...(0, SchemaGenerator_1.findSchemaReferencedSchemas)({
schemaName,
openAPISpecification,
}),
schemaName,
].forEach((schemaName) => {
if (!accumulator[schemaName]) {
accumulator[schemaName] = [];
}
if (!accumulator[schemaName].includes(tagName)) {
accumulator[schemaName].push(tagName);
}
});
}
else if ('type' in content['application/json'].schema &&
content['application/json'].schema.type === 'array' &&
content['application/json'].schema.items &&
'$ref' in content['application/json'].schema.items) {
const schemaReference = content['application/json'].schema.items.$ref;
const schemaName = schemaReference.replace('#/components/schemas/', '');
[
...(0, SchemaGenerator_1.findSchemaReferencedSchemas)({
schemaName,
openAPISpecification,
}),
schemaName,
].forEach((schemaName) => {
if (!accumulator[schemaName]) {
accumulator[schemaName] = [];
}
if (!accumulator[schemaName].includes(tagName)) {
accumulator[schemaName].push(tagName);
}
});
}
}
if ('image/png' in content || 'application/pdf' in content) {
const schemaName = TypescriptAPIGenerator_1.BINARY_RESPONSE_TYPE_MODEL_NAME;
if (!accumulator[schemaName]) {
accumulator[schemaName] = [];
}
if (!accumulator[schemaName].includes(tagName)) {
accumulator[schemaName].push(tagName);
}
}
}
});
if (headerParametersModelReference) {
const schemaName = headerParametersModelReference;
[
...(0, SchemaGenerator_1.findSchemaReferencedSchemas)({
schemaName,
openAPISpecification,
}),
schemaName,
].forEach((schemaName) => {
if (!accumulator[schemaName]) {
accumulator[schemaName] = [];
}
if (!accumulator[schemaName].includes(tagName)) {
accumulator[schemaName].push(tagName);
}
});
}
if (queryParametersModelReference) {
const schemaName = queryParametersModelReference;
[
...(0, SchemaGenerator_1.findSchemaReferencedSchemas)({
schemaName,
openAPISpecification,
}),
schemaName,
].forEach((schemaName) => {
if (!accumulator[schemaName]) {
accumulator[schemaName] = [];
}
if (!accumulator[schemaName].includes(tagName)) {
accumulator[schemaName].push(tagName);
}
});
}
});
return accumulator;
}, {});
//#endregion
//#region Generate Schema to entity mappings
const schemaToEntityMappings = Object.keys(schemaEntityReferences).reduce((accumulator, schemaName) => {
if (schemaEntityReferences[schemaName].length === 1) {
accumulator[schemaName] = schemaEntityReferences[schemaName][0];
}
else {
accumulator[schemaName] = 'Utils';
}
return accumulator;
}, {});
//#endregion
//#region Map schema references to entities
const entitySchemaGroups = Object.keys(schemaEntityReferences).reduce((accumulator, schemaName) => {
if (schemaEntityReferences[schemaName].length === 1) {
schemaEntityReferences[schemaName].forEach((entityName) => {
if (!accumulator[entityName]) {
accumulator[entityName] = [];
}
accumulator[entityName].push(schemaName);
});
}
else {
const utilsEntityName = 'Utils';
if (!accumulator[utilsEntityName]) {
accumulator[utilsEntityName] = [];
}
accumulator[utilsEntityName].push(schemaName);
}
return accumulator;
}, {});
//#endregion
//#region Generate validation schemas code
const models = Object.keys(entitySchemaGroups)
.sort()
.reduce((accumulator, entityName) => {
entitySchemaGroups[entityName]
.filter((schemaName) => {
return !TypescriptAPIGenerator_1.ENVIRONMENT_DEFINED_MODELS.includes(schemaName);
})
.forEach((schemaName) => {
if (!accumulator[entityName]) {
accumulator[entityName] = {
models: {},
};
}
const modelCodeConfiguration = (0, ModelCodeGenerator_1.generateModelCode)({
schemaName,
openAPISpecification,
generateTsEDControllers,
inferTypeFromValidationSchema,
});
if (modelCodeConfiguration) {
const { generatedVariables, zodValidationSchemaCode, referencedSchemas, inferedTypeCode, zodValidationSchemaName, imports, tsedModelCode, tsedModelName, } = modelCodeConfiguration;
referencedSchemas.forEach((referencedSchemaName) => {
const referencedSchemaEntityName = schemaToEntityMappings[referencedSchemaName];
if (referencedSchemaEntityName &&
referencedSchemaEntityName != entityName) {
(0, Utils_1.addModuleImport)({
imports,
importName: `${referencedSchemaName}ValidationSchema`,
importFilePath: `./${referencedSchemaEntityName}`,
});
if (generateTsEDControllers || !inferTypeFromValidationSchema) {
(0, Utils_1.addModuleImport)({
imports,
importName: referencedSchemaName,
importFilePath: `./${referencedSchemaEntityName}`,
});
}
}
});
accumulator[entityName].models[schemaName] = {
name: schemaName,
zodValidationSchemaCode,
zodValidationSchemaName,
inferedTypeCode,
generatedVariables,
imports,
tsedModelCode,
tsedModelName,
...(() => {
if (referencedSchemas.length > 0) {
return {
referencedSchemas,
};
}
})(),
};
if (imports) {
if (!accumulator[entityName].imports) {
accumulator[entityName].imports = {};
}
Object.keys(imports).forEach((importFilePath) => {
imports[importFilePath].forEach((importName) => {
(0, Utils_1.addModuleImport)({
imports: accumulator[entityName].imports,
importName: importName,
importFilePath,
});
});
});
}
}
});
//#region Sort models by dependency on eath other
if (accumulator[entityName]?.models) {
accumulator[entityName].models = (() => {
const models = accumulator[entityName].models;
const modelKeys = Object.keys(models);
const modelsReferencingModelsInSameFile = modelKeys.filter((modelKey) => {
const model = models[modelKey];
return model.referencedSchemas?.some((referencedSchema) => {
return modelKeys.includes(referencedSchema);
});
});
return modelKeys
.sort((aKey, bKey) => {
if ((modelsReferencingModelsInSameFile.includes(aKey) &&
!modelsReferencingModelsInSameFile.includes(bKey)) ||
models[aKey].referencedSchemas?.some((referencedSchema) => {
return referencedSchema === bKey;
})) {
return 1;
}
if ((!modelsReferencingModelsInSameFile.includes(aKey) &&
modelsReferencingModelsInSameFile.includes(bKey)) ||
models[bKey].referencedSchemas?.some((referencedSchema) => {
return referencedSchema === aKey;
})) {
return -1;
}
return 0;
})
.reduce((accumulator, modelKey) => {
accumulator[modelKey] = models[modelKey];
return accumulator;
}, {});
})();
}
//#endregion
return accumulator;
}, {});
//#endregion
//#region Generate models to validation schema mappings
const modelsToValidationSchemaMappings = Object.entries(models).reduce((accumulator, [, { models }]) => {
Object.entries(models).forEach(([schemaName, model]) => {
accumulator[schemaName] = model;
});
return accumulator;
}, {});
//#endregion
return {
entitySchemaGroups,
schemaToEntityMappings,
schemaEntityReferences,
models,
modelsToValidationSchemaMappings,
};
};
exports.generateModelMappings = generateModelMappings;
//#endregion
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxNYXBwaW5nc0dlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvTW9kZWxDb2RlR2VuZXJhdG9yL01vZGVsTWFwcGluZ3NHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsZ0ZBTTZDO0FBQzdDLHdEQUFpRTtBQUNqRSxvQ0FBMkM7QUFDM0MsNkRBRzhCO0FBcUI5Qjs7Ozs7R0FLRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUNwQyxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN2Qiw2QkFBNkIsR0FDQSxFQUFpQixFQUFFO0lBQ2hELHFEQUFxRDtJQUNyRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBRXBFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3pDLFFBQVEsQ0FBQyxPQUFPLENBQ2QsQ0FBQyxFQUNDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsOEJBQThCLEVBQzlCLDZCQUE2QixHQUM5QixFQUFFLEVBQUU7WUFDSDtnQkFDRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUMzQixHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNQLElBQUksV0FBVyxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDdEI7b0JBQ0QsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQyxDQUFDLEVBQUU7YUFDTCxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxPQUFPLEVBQUU7b0JBQ1gsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUU7d0JBQ3ZDLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FB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