UNPKG

create-fleetbo-project

Version:

Creates a new Fleetbo project.

122 lines (99 loc) 5.02 kB
#!/usr/bin/env node const { execSync } = require('child_process'); const fs = require('fs'); const path = require('path'); const https = require('https'); // --- Configuration --- const repoOwner = 'FleetFleetbo'; const repoName = 'dev.fleetbo.io'; const branchName = 'master'; // Assurez-vous que c'est la bonne branche const repoGitUrl = `https://github.com/${repoOwner}/${repoName}.git`; const bootstrapUrl = 'https://us-central1-myapp-259bf.cloudfunctions.net/bootstrapProject'; // --- Analyse des Arguments --- const args = process.argv.slice(2); const projectNameArg = args.find(arg => !arg.startsWith('--')); const tokenArg = args.find(arg => arg.startsWith('--token=')); if (!projectNameArg) { console.error('\n❌ Erreur : Veuillez spécifier un nom pour votre projet.'); console.log(' Usage: npx create-fleetbo-project <nom-du-projet> --token=<votre-token>'); process.exit(1); } const bootstrapToken = tokenArg ? tokenArg.split('=')[1] : null; if (!bootstrapToken) { console.error('\n❌ Erreur : Le token d\'amorçage est manquant.'); console.log(' Usage: npx create-fleetbo-project <nom-du-projet> --token=<votre-token>'); process.exit(1); } const projectName = projectNameArg; // --- Fonctions Utilitaires --- function fetchProjectKeys(token) { return new Promise((resolve, reject) => { const postData = JSON.stringify({ token }); const options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } }; const req = https.request(bootstrapUrl, options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { if (res.statusCode >= 200 && res.statusCode < 300) { try { resolve(JSON.parse(data)); } catch (e) { reject(new Error('Invalid response from the key server.')); } } else { const errorMsg = JSON.parse(data).error || `Server error (code: ${res.statusCode})`; reject(new Error(errorMsg)); } }); }); req.on('error', (e) => reject(e)); req.write(postData); req.end(); }); } // --- Fonction Principale --- async function setupProject() { console.log(`\nCreating your Fleetbo project "${projectName}"...`); const projectDir = path.join(process.cwd(), projectName); try { // Étape 1 : Télécharger la structure de base du projet console.log(' [1/5] Initializing project structure...'); // On redirige la sortie d'erreur (stderr) vers null pour masquer les messages de progression de Git execSync(`git clone --depth 1 --branch ${branchName} ${repoGitUrl} "${projectName}" 2> /dev/null`); // Étape 2 : Se déplacer dans le dossier du projet et nettoyer console.log(' [2/5] Project structure initialized. Configuring...'); process.chdir(projectDir); // Supprimer l'historique Git pour commencer avec un projet propre fs.rmSync(path.join(projectDir, '.git'), { recursive: true, force: true }); // Étape 3 : Récupération des clés de projet console.log(' [3/5] Fetching project keys...'); const keys = await fetchProjectKeys(bootstrapToken); if (!keys.enterpriseId || !keys.fleetboDBKey) { throw new Error("Received keys from the server are invalid."); } // Étape 4 : Configuration du fichier .env console.log(' [4/5] .env file configured successfully.'); //const envContent = `REACT_APP_FLEETBO_DB_KEY=${keys.fleetboDBKey}\nREACT_APP_ENTERPRISE_ID=${keys.enterpriseId}\n`; //99b426483d543b042209671dd53fb18 const envContent = `REACT_APP_FLEETBO_DB_KEY=${keys.fleetboDBKey}\nREACT_APP_ENTERPRISE_ID=99b426483d543b042209671dd53fb18\n`; fs.writeFileSync(path.join(projectDir, '.env'), envContent, 'utf8'); // Étape 5 : Installation des dépendances console.log(' [5/5] Installing dependencies...'); execSync('npm install', { stdio: 'inherit' }); // Personnalisation du package.json const packageJsonPath = path.join(projectDir, 'package.json'); const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); packageJson.name = projectName; fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8'); console.log('\n🚀 Your Fleetbo project is ready !'); console.log(`\nTo get started, run the following commands :`); console.log(` cd ${projectName}`); console.log(` npm start`); } catch (error) { console.error('\n An error occurred while creating the project :', error.message); // Nettoyage en cas d'erreur if (fs.existsSync(projectDir)) { fs.rmSync(projectDir, { recursive: true, force: true }); } } } setupProject();