UNPKG

@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
"use strict"; 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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