app-wizard-cli
Version:
CLI pour gérer votre projet Nest/Angular
133 lines (132 loc) • 5.31 kB
JavaScript
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...',
});
}