UNPKG

app-wizard-cli

Version:

CLI pour gérer votre projet Nest/Angular

133 lines (132 loc) 5.31 kB
import prompts from 'prompts'; import chalk from 'chalk'; import { execSync } from 'child_process'; import { BuildService } from '../services/build-service.js'; import { TemplateConfigService } from '../services/template-config-service.js'; import { CleanService } from '../services/clean-service.js'; /** * Commande interactive "dev-run" qui lance les conteneurs Docker en mode développement. * L'utilisateur peut choisir de lancer un nettoyage (optionnel), un build pré-run (optionnel), puis le run. */ export async function devRunCommand() { console.clear(); console.log(chalk.yellow('======================================')); console.log(chalk.yellow(' Dev Run Options')); console.log(chalk.yellow('======================================')); // Chargement et validation de la configuration du template const templateConfig = await TemplateConfigService.checkTemplateConfig(); // Initialisation des flags let shouldPrebuild = false; let shouldBuild = false; // 1) Demander si on souhaite un nettoyage complet (standard ou intégral) const cleanResponse = await prompts({ type: 'confirm', name: 'clean', message: 'Souhaitez-vous effectuer un nettoyage complet (standard ou intégral) avant le build ?', initial: false }); if (cleanResponse.clean) { // Si nettoyage accepté, demander le type const cleanTypeResponse = await prompts({ type: 'select', name: 'cleanType', message: 'Quel type de nettoyage voulez-vous ?', choices: [ { title: 'Light (nettoyage standard)', value: 'light' }, { title: 'Intégral (nettoyage complet)', value: 'integral' } ] }); if (cleanTypeResponse.cleanType === 'light') { console.log(chalk.blue('Exécution d\'un nettoyage standard...')); try { await CleanService.performGlobalClean(); console.log(chalk.green('Nettoyage standard terminé.')); } catch (error) { console.error(chalk.red('Erreur lors du nettoyage standard :'), error); return; } } else { console.log(chalk.blue('Exécution d\'un nettoyage complet...')); try { await CleanService.fullClean(); console.log(chalk.green('Nettoyage complet terminé.')); } catch (error) { console.error(chalk.red('Erreur lors du nettoyage complet :'), error); return; } } // Après un nettoyage complet, on fait automatiquement prébuild + build shouldPrebuild = true; shouldBuild = true; } else { // Si nettoyage refusé, effectuer au moins le nettoyage minimal des fichiers de signalisation console.log(chalk.blue('Nettoyage minimal des fichiers de signalisation...')); try { await CleanService.signalFilesClean(); console.log(chalk.green('Nettoyage minimal terminé.')); } catch (error) { console.error(chalk.red('Erreur lors du nettoyage minimal :'), error); return; } // 2) Demander si on souhaite un pré-build const prebuildResponse = await prompts({ type: 'confirm', name: 'prebuild', message: 'Souhaitez-vous effectuer un pré-build avant le build principal ?', initial: false }); if (prebuildResponse.prebuild) { shouldPrebuild = true; shouldBuild = true; } else { // 3) Si pré-build refusé, demander si on souhaite juste le build const buildResponse = await prompts({ type: 'confirm', name: 'build', message: 'Souhaitez-vous effectuer le build en mode développement uniquement ?', initial: false }); if (buildResponse.build) { shouldBuild = true; } } } // 4) Exécution du(s) build(s) si nécessaire if (shouldBuild) { try { await BuildService.buildDev(shouldPrebuild); } catch (error) { console.error(chalk.red('Erreur lors du build en mode dev :'), error); return; } } else { console.log(chalk.yellow('Aucun build demandé, passage à l\'exécution.')); } // Vérification de la commande runDevCommand dans la config if (!templateConfig.runDevCommand) { console.error(chalk.red('La commande runDevCommand n\'est pas définie dans le template.')); return; } // Lancement des conteneurs en mode dev try { console.log(chalk.blue(`Lancement des conteneurs en mode dev via : ${templateConfig.runDevCommand}`)); execSync(templateConfig.runDevCommand, { stdio: 'inherit' }); } catch (error) { console.error(chalk.red('Erreur lors du lancement des conteneurs en mode dev :'), error); } // Pause finale pour l'utilisateur await prompts({ type: 'text', name: 'pause', message: 'Appuyez sur Entrée pour continuer...', }); }