sacg-cronogramas/setup-project.js

146 lines
5.8 KiB
JavaScript

import fs from 'fs';
import path from 'path';
import readline from 'readline';
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log('🚀 Configurando nuevo proyecto basado en el template...');
// Preguntar por el nombre del proyecto
rl.question('¿Cuál es el nombre del nuevo proyecto? ', (projectName) => {
// Modificar package.json
const packageJsonPath = path.join(process.cwd(), 'package.json');
try {
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
// Guardar el nombre original para reportar cambios
const originalName = packageJson.name;
// Actualizar el nombre del proyecto
packageJson.name = projectName;
// Actualizar versión y descripción
packageJson.version = '0.1.0';
packageJson.description = `${projectName} - Proyecto generado desde template`;
// Guardar los cambios
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
console.log(`✅ package.json actualizado: nombre cambiado de ${originalName} a ${projectName}`);
} catch (error) {
console.error('❌ Error al modificar package.json:', error);
}
// Modificar angular.json
const angularJsonPath = path.join(process.cwd(), 'angular.json');
try {
const angularJson = JSON.parse(fs.readFileSync(angularJsonPath, 'utf8'));
// Obtener el nombre del proyecto original (la primera clave en el objeto projects)
const originalProjectName = Object.keys(angularJson.projects)[0];
// Crear nuevo objeto con el nuevo nombre del proyecto
const projectConfig = angularJson.projects[originalProjectName];
// Buscar otros nombres de proyectos en el archivo (como en outputPath o en configuraciones)
let angularJsonString = JSON.stringify(angularJson);
const possibleProjectNames = new Set();
// Buscar patrones como "dist/nombre-proyecto" o "nombre-proyecto:build"
const outputPathRegex = /dist\/([a-zA-Z0-9-_]+)/g;
const buildTargetRegex = /([a-zA-Z0-9-_]+):build/g;
let match;
while (match = outputPathRegex.exec(angularJsonString)) {
possibleProjectNames.add(match[1]);
}
while (match = buildTargetRegex.exec(angularJsonString)) {
possibleProjectNames.add(match[1]);
}
// Actualizar el outputPath
if (projectConfig.architect?.build?.options?.outputPath) {
const oldOutputPath = projectConfig.architect.build.options.outputPath;
projectConfig.architect.build.options.outputPath = `dist/${projectName}`;
console.log(`✅ Actualizado outputPath: de "${oldOutputPath}" a "dist/${projectName}"`);
}
// Actualizar referencias en las configuraciones de serve
if (projectConfig.architect?.serve?.configurations) {
Object.keys(projectConfig.architect.serve.configurations).forEach(configKey => {
const config = projectConfig.architect.serve.configurations[configKey];
if (config.buildTarget) {
// Buscar el patrón "nombreProyecto:build:config"
const parts = config.buildTarget.split(':');
if (parts.length === 3) {
const oldValue = config.buildTarget;
config.buildTarget = `${projectName}:${parts[1]}:${parts[2]}`;
console.log(`✅ Actualizada configuración de serve '${configKey}': de "${oldValue}" a "${config.buildTarget}"`);
}
}
});
}
// Buscar y reemplazar todas las posibles ocurrencias de otros nombres de proyectos
possibleProjectNames.forEach(oldName => {
if (oldName !== originalProjectName && oldName !== projectName) {
// Convertir a string para hacer reemplazos globales
const jsonStr = JSON.stringify(projectConfig);
if (jsonStr.includes(oldName)) {
const updatedJsonStr = jsonStr.replace(new RegExp(oldName, 'g'), projectName);
// Convertir de vuelta a objeto
const updatedConfig = JSON.parse(updatedJsonStr);
// Reemplazar la configuración con la versión actualizada
Object.assign(projectConfig, updatedConfig);
console.log(`✅ Reemplazado nombre de proyecto adicional: "${oldName}" por "${projectName}"`);
}
}
});
// Eliminar la entrada original
delete angularJson.projects[originalProjectName];
// Agregar nueva entrada con el nombre del proyecto
angularJson.projects[projectName] = projectConfig;
// Actualizar defaultProject si existe
if (angularJson.defaultProject === originalProjectName) {
angularJson.defaultProject = projectName;
}
// Actualizar rutas dentro de la configuración
if (projectConfig.root === originalProjectName) {
projectConfig.root = projectName;
}
// Guardar los cambios
fs.writeFileSync(angularJsonPath, JSON.stringify(angularJson, null, 2));
console.log(`✅ angular.json actualizado: nombre del proyecto cambiado de ${originalProjectName} a ${projectName}`);
} catch (error) {
console.error('❌ Error al modificar angular.json:', error);
}
// Modificar también src/index.html para actualizar el título
try {
const indexHtmlPath = path.join(process.cwd(), 'src', 'index.html');
let indexHtml = fs.readFileSync(indexHtmlPath, 'utf8');
// Reemplazar el título
indexHtml = indexHtml.replace(/<title>.*<\/title>/, `<title>${projectName}</title>`);
// Guardar los cambios
fs.writeFileSync(indexHtmlPath, indexHtml);
console.log('✅ src/index.html actualizado: título actualizado');
} catch (error) {
console.error('❌ Error al modificar src/index.html:', error);
}
console.log('\n🎉 Configuración completada! El proyecto está listo para ser usado.');
console.log('Ejecuta `ng serve` para iniciar el servidor de desarrollo.');
rl.close();
});