create-fleetbo-project
Version:
Creates a new Fleetbo project.
122 lines (99 loc) • 5.02 kB
JavaScript
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();