flare-api
Version:
A modern, fast, and intuitive Node.js framework for building APIs
142 lines (125 loc) • 5.45 kB
JavaScript
const fs = require("fs");
const path = require("path");
const { interpretText } = require("./src/ml-model/textInterpreter");
const {
loadThemes,
generateThemeResources,
generateController,
generateService,
generateEntity,
generateBackoffice,
generateServerStart,
generateUnitTests,
generateConfigFiles,
generateMicroservicesStructure
} = require("./src/ml-model/utils");
const srcPath = path.resolve(process.cwd(), "src");
if (!fs.existsSync(srcPath)) {
fs.mkdirSync(srcPath, { recursive: true });
}
// CLI command handler
async function handleCommand(command, type, entityOrTheme) {
const themes = loadThemes();
const lowerCaseEntityOrTheme = entityOrTheme?.toLowerCase();
const themesLowerCaseKeys = Object.keys(themes).map(key => key.toLowerCase());
if (command === "generate" && type === "framework") {
console.log("Generando estructura base del framework...");
generateFrameworkStructure();
generateConfigFiles();
console.log("Generación de framework completa.");
} else if (command === "generate" && type === "microservices") {
console.log("Generando estructura de microservicios...");
generateMicroservicesStructure();
console.log("Generación de microservicios completa.");
} else if (command === "generate" && type === "entity") {
if (themesLowerCaseKeys.includes(lowerCaseEntityOrTheme)) {
const originalTheme = Object.keys(themes).find(key => key.toLowerCase() === lowerCaseEntityOrTheme);
generateThemeResources(originalTheme);
} else {
generateEntity(entityOrTheme, { id: "number", name: "string", description: "string" });
}
} else if (command === "assistant") {
console.log("Interpretando el texto:", entityOrTheme);
// Procesar el texto usando el modelo para identificar acción, entidad y relaciones
const { action, type, entityName, fields, relatedEntities } = await interpretText(entityOrTheme);
console.log("Resultado de la interpretación:", { action, type, entityName, fields, relatedEntities });
// Ejecutar acción en función de la interpretación
if (action === "crear" || action === "create") {
if (entityName) {
console.log(`Generando entidad principal: ${entityName}`);
generateEntity(entityName, fields);
generateController(entityName, fields);
generateService(entityName, fields);
generateUnitTests(entityName);
generateServerStart();
} else {
console.error("Error: No se pudo identificar la entidad principal.");
}
if (relatedEntities && Array.isArray(relatedEntities) && relatedEntities.length > 0) {
relatedEntities.forEach(({ entity, relatedEntity }) => {
if (relatedEntity.name) {
console.log(`Generando entidad relacionada: ${relatedEntity.name}`);
generateEntity(relatedEntity.name, relatedEntity.fields || {});
generateController(relatedEntity.name, relatedEntity.fields || {});
generateService(relatedEntity.name, relatedEntity.fields || {});
generateUnitTests(relatedEntity.name);
} else {
console.error("Error: Se encontró una entidad relacionada sin nombre o campos.");
}
});
} else {
console.log("No se encontraron entidades relacionadas para generar.");
}
} else if (action === "integrar" || action === "integrate") {
console.log("Integración solicitada:", type);
if (type === "authentication" || type === "autenticación") {
// Código para integración de autenticación
console.log("Integrando autenticación...");
}
}
console.log("Generación de recursos completada.");
} else {
console.log("Comando no válido. Comandos disponibles:");
console.log("flareapi-cli generate framework");
console.log("flareapi-cli generate microservices");
console.log("flareapi-cli generate controller <entity> <theme>");
console.log("flareapi-cli generate service <entity> <theme>");
console.log("flareapi-cli generate entity <entity> <theme>");
console.log("flareapi-cli generate backoffice <entity>");
console.log("flareapi-cli generate swagger");
console.log("flareapi-cli generate server-start");
console.log('flareapi-cli assistant "<descripción en lenguaje natural>"');
}
}
// Function to generate the framework base structure
function generateFrameworkStructure() {
const baseFolders = ["middleware", "auth", "config", "controllers", "entities", "services", "tests", "backoffice"];
baseFolders.forEach(folder => {
const folderPath = path.join(srcPath, folder);
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
console.log(`Carpeta ${folder} creada en ./src/`);
}
});
generateServerStart();
console.log("Archivo de inicio del servidor generado en ./src/");
}
// Execute the CLI command
(async () => {
const command = process.argv[2];
const type = process.argv[3];
const entityOrTheme = command === "assistant" ? process.argv.slice(3).join(" ") : process.argv[4];
await handleCommand(command, type, entityOrTheme);
})();
// Export functions for testing
module.exports = {
loadThemes,
generateThemeResources,
generateController,
generateService,
generateEntity,
generateBackoffice,
handleCommand,
generateMicroservicesStructure
};