create-fleetbo-project 1.0.27 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,12 +4,15 @@ const { execSync } = require('child_process');
4
4
  const fs = require('fs');
5
5
  const path = require('path');
6
6
  const https = require('https');
7
+ const unzipper = require('unzipper');
7
8
 
8
9
  // --- Configuration ---
9
10
  const repoOwner = 'FleetFleetbo'; // Assurez-vous que c'est le bon nom d'utilisateur GitHub
10
11
  const repoName = 'dev.fleetbo.io'; // Assurez-vous que c'est le bon nom de dépôt
11
12
  const branchName = 'master'; // Le nom de la branche est maintenant configurable
12
13
 
14
+ const repoUrl = `https://github.com/${repoOwner}/${repoName}/archive/refs/heads/${branchName}.zip`;
15
+
13
16
  // URL de votre Cloud Function.
14
17
  const bootstrapUrl = 'https://us-central1-myapp-259bf.cloudfunctions.net/bootstrapProject';
15
18
 
@@ -60,21 +63,50 @@ function fetchProjectKeys(token) {
60
63
  }
61
64
 
62
65
  /**
63
- * Fonction Principale Asynchrone (Version utilisant degit pour un clonage fiable)
66
+ * Fonction Principale Asynchrone (Version pro avec téléchargement direct et gestion de fichiers robuste)
64
67
  */
65
68
  async function setupProject() {
66
69
  console.log(`\nCréation de votre projet Fleetbo "${projectName}"...`);
67
70
  const projectDir = path.join(process.cwd(), projectName);
71
+ const tempDir = path.join(process.cwd(), `fleetbo-temp-${Date.now()}`);
68
72
 
69
73
  try {
70
- // *** DÉBUT DE LA NOUVELLE LOGIQUE DE CLONAGE AVEC DEGIT ***
71
- console.log(` [1/5] 📥 Clonage du template via degit (cela peut prendre un moment)...`);
72
- const degitRepo = `${repoOwner}/${repoName}#${branchName}`;
73
- // Utilise npx pour s'assurer que degit est disponible sans installation globale
74
- execSync(`npx degit ${degitRepo} ${projectName}`, { stdio: 'inherit' });
75
- console.log(' [2/5] Template cloné avec succès.');
76
- // *** FIN DE LA NOUVELLE LOGIQUE ***
77
-
74
+ // Étape 1 : Téléchargement et décompression
75
+ console.log(` [1/5] 📥 Téléchargement du template...`);
76
+ await new Promise((resolve, reject) => {
77
+ https.get(repoUrl, (response) => {
78
+ if (response.statusCode === 301 || response.statusCode === 302) {
79
+ return https.get(response.headers.location, (redirectResponse) => {
80
+ redirectResponse.pipe(unzipper.Extract({ path: tempDir }))
81
+ .on('finish', resolve)
82
+ .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
83
+ }).on('error', (err) => reject(new Error(`Erreur réseau après redirection: ${err.message}`)));
84
+ }
85
+ response.pipe(unzipper.Extract({ path: tempDir }))
86
+ .on('finish', resolve)
87
+ .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
88
+ }).on('error', (err) => reject(new Error(`Erreur réseau: ${err.message}`)));
89
+ });
90
+ console.log(' [2/5] ✅ Template téléchargé. Organisation des fichiers...');
91
+
92
+ // Étape 2 bis : Localiser intelligemment la racine du projet
93
+ const unzippedBaseFolder = fs.readdirSync(tempDir)[0];
94
+ let sourceDir = path.join(tempDir, unzippedBaseFolder);
95
+ if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
96
+ const nestedProjectDir = fs.readdirSync(sourceDir).find(file => {
97
+ const fullPath = path.join(sourceDir, file);
98
+ return fs.statSync(fullPath).isDirectory() && fs.existsSync(path.join(fullPath, 'package.json'));
99
+ });
100
+ if (!nestedProjectDir) throw new Error('Impossible de trouver package.json dans le template.');
101
+ sourceDir = path.join(sourceDir, nestedProjectDir);
102
+ }
103
+
104
+ // Étape 2 ter : Déplacer les fichiers vers la destination finale
105
+ fs.mkdirSync(projectDir);
106
+ for (const file of fs.readdirSync(sourceDir)) {
107
+ fs.renameSync(path.join(sourceDir, file), path.join(projectDir, file));
108
+ }
109
+
78
110
  process.chdir(projectDir);
79
111
  console.log(' [3/5] 🔑 Récupération des clés de projet...');
80
112
  const keys = await fetchProjectKeys(bootstrapToken);
@@ -86,7 +118,7 @@ async function setupProject() {
86
118
  const envContent = `REACT_APP_FLEETBO_DB_KEY=${keys.fleetboDBKey}\nREACT_APP_ENTERPRISE_ID=${keys.enterpriseId}\n`;
87
119
  fs.writeFileSync(path.join(projectDir, '.env'), envContent, 'utf8');
88
120
 
89
- console.log(' [5/5] 📦 Installation des dépendances (cela peut prendre quelques minutes)...');
121
+ console.log(' [5/5] 📦 Installation des dépendances...');
90
122
  execSync('npm install', { stdio: 'inherit' });
91
123
 
92
124
  const packageJsonPath = path.join(projectDir, 'package.json');
@@ -102,10 +134,12 @@ async function setupProject() {
102
134
  } catch (error) {
103
135
  console.error('\n❌ Une erreur est survenue lors de la création du projet :', error.message);
104
136
  if (fs.existsSync(projectDir)) {
105
- console.log(' Nettoyage du répertoire du projet...');
106
137
  fs.rmSync(projectDir, { recursive: true, force: true });
107
138
  }
108
- process.exit(1);
139
+ } finally {
140
+ if (fs.existsSync(tempDir)) {
141
+ fs.rmSync(tempDir, { recursive: true, force: true });
142
+ }
109
143
  }
110
144
  }
111
145
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fleetbo-project",
3
- "version": "1.0.27",
3
+ "version": "1.0.28",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {