in compiler/src/model/build-model.ts [99:165]
export function compileSpecification (endpointMappings: Record<string, model.Endpoint>, specsFolder: string, outputFolder: string): model.Model {
const tsConfigFilePath = join(specsFolder, 'tsconfig.json')
const project = new Project({ tsConfigFilePath })
verifyUniqueness(project)
const model: model.Model = {
types: new Array<model.TypeDefinition>(),
endpoints: new Array<model.Endpoint>()
}
// Read and compile source files
const declarations = {
classes: new Array<ClassDeclaration>(),
interfaces: new Array<InterfaceDeclaration>(),
enums: new Array<EnumDeclaration>(),
typeAliases: new Array<TypeAliasDeclaration>()
}
const definedButNeverUsed: string[] = []
for (const sourceFile of project.getSourceFiles()) {
for (const declaration of sourceFile.getClasses()) {
if (customTypes.includes(declaration.getName() ?? '')) continue
declarations.classes.push(declaration)
}
for (const declaration of sourceFile.getInterfaces()) {
declarations.interfaces.push(declaration)
}
for (const declaration of sourceFile.getEnums()) {
declarations.enums.push(declaration)
}
for (const declaration of sourceFile.getTypeAliases()) {
declarations.typeAliases.push(declaration)
}
}
mkdirSync(join(outputFolder, 'dangling-types'), { recursive: true })
writeFileSync(
join(outputFolder, 'dangling-types', 'dangling.csv'),
definedButNeverUsed.join('\n'),
{ encoding: 'utf8', flag: 'w' }
)
for (const api of jsonSpec.keys()) {
model.endpoints.push(endpointMappings[api])
}
// Visit all class, interface, enum and type alias definitions
for (const declaration of declarations.classes) {
model.types.push(compileClassOrInterfaceDeclaration(declaration, endpointMappings, declarations.classes))
}
for (const declaration of declarations.interfaces) {
model.types.push(compileClassOrInterfaceDeclaration(declaration, endpointMappings, declarations.classes))
}
for (const declaration of declarations.enums) {
model.types.push(modelEnumDeclaration(declaration))
}
for (const declaration of declarations.typeAliases) {
model.types.push(modelTypeAlias(declaration))
}
// Sort the types in alphabetical order
sortTypeDefinitions(model.types)
return model
}