UNPKG

easy-nest-generator

Version:

generate interface, hooks for nestjs project

89 lines 3.98 kB
import lib from "ts-morph"; import fs from "fs"; import path from "path"; import { cleanType } from "./utils/index.js"; async function generateInterfaces() { try { const project = new lib.Project(); const configPath = "ngconfig.json"; let rootFilePath; let destFilePath; let entityDestFileName; let entitySourceFolder; if (fs.existsSync(configPath)) { const config = JSON.parse(fs.readFileSync(configPath, "utf8")); rootFilePath = config.rootFilePath; destFilePath = config.destFilePath; entityDestFileName = config.entityDestFileName || "models.d.ts"; entitySourceFolder = config.entitySourceFolder || "entities"; } else { console.error("Config file not found: ngconfig.json"); return; } if (!fs.existsSync(rootFilePath)) { console.error(`Entities folder not found: ${rootFilePath}`); return; } const files = fs .readdirSync(`${rootFilePath}/${entitySourceFolder}`) .filter((file) => file.endsWith(".entity.ts")); if (files.length === 0) { console.error(`No entity files found in folder: ${rootFilePath}/${entitySourceFolder}`); return; } const destFile = project.createSourceFile(`${destFilePath}/${entityDestFileName}`, "", { overwrite: true, }); console.log("Generating models for you, hold on... 🍕"); files.forEach((file) => { const sourceFilePath = path.join(`${rootFilePath}/${entitySourceFolder}`, file); const sourceFile = project.addSourceFileAtPath(sourceFilePath); const classDecls = sourceFile.getClasses(); const interfaces = sourceFile.getInterfaces(); const enums = sourceFile.getEnums(); enums.forEach((enumDecl) => { destFile.addStatements((writer) => { writer.writeLine(`export enum I${enumDecl.getName()} {`); enumDecl.getMembers().forEach((member) => { writer.writeLine(` ${member.getName()} = ${member.getValue()},`); }); writer.writeLine(`}\n`); }); }); classDecls?.length > 0 && classDecls.forEach((classDecl) => { if (classDecl) { destFile.addStatements((writer) => { writer.writeLine(`export interface I${classDecl.getName()} {`); classDecl.getProperties().forEach((prop) => { const propName = prop.getName(); const propType = cleanType(prop.getType().getText(sourceFile)); writer.writeLine(` ${propName}: ${propType};`); }); writer.writeLine(`}\n`); }); } }); interfaces?.length > 0 && interfaces.forEach((interfaceDecl) => { destFile.addStatements((writer) => { writer.writeLine(`export interface ${interfaceDecl.getName()} {`); interfaceDecl.getProperties().forEach((prop) => { const propName = prop.getName(); const propType = cleanType(prop.getType().getText(sourceFile)); writer.writeLine(` ${propName}: ${propType};`); }); writer.writeLine(`}\n`); }); }); }); console.log("Models generated successfully 🚀"); await project.save(); } catch (e) { console.log("error creating project", e); } } generateInterfaces(); //# sourceMappingURL=gen-model.js.map