diff --git a/package.json b/package.json index 17cb376..b756ac1 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "build": "ng build", "build:prod": "ng build --configuration production", "watch": "ng build --watch --configuration development", - "test": "ng test" + "test": "ng test", + "postinstall": "node setup-project.js" }, "private": true, "dependencies": { @@ -44,4 +45,4 @@ "karma-jasmine-html-reporter": "~2.1.0", "typescript": "~5.7.2" } -} +} \ No newline at end of file diff --git a/setup-project.js b/setup-project.js new file mode 100644 index 0000000..3e97b04 --- /dev/null +++ b/setup-project.js @@ -0,0 +1,147 @@ +const fs = require('fs'); +const path = require('path'); +const readline = require('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) + // Este es un enfoque para encontrar nombres de proyectos "ocultos" en otras partes del archivo + 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(/