create-fleetbo-project 1.0.28 → 1.0.30

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.
@@ -7,13 +7,11 @@ const https = require('https');
7
7
  const unzipper = require('unzipper');
8
8
 
9
9
  // --- Configuration ---
10
- const repoOwner = 'FleetFleetbo'; // Assurez-vous que c'est le bon nom d'utilisateur GitHub
11
- const repoName = 'dev.fleetbo.io'; // Assurez-vous que c'est le bon nom de dépôt
12
- const branchName = 'master'; // Le nom de la branche est maintenant configurable
10
+ const repoOwner = 'FleetFleetbo';
11
+ const repoName = 'dev.fleetbo.io';
12
+ const branchName = 'master';
13
13
 
14
14
  const repoUrl = `https://github.com/${repoOwner}/${repoName}/archive/refs/heads/${branchName}.zip`;
15
-
16
- // URL de votre Cloud Function.
17
15
  const bootstrapUrl = 'https://us-central1-myapp-259bf.cloudfunctions.net/bootstrapProject';
18
16
 
19
17
  // --- Analyse des Arguments ---
@@ -37,13 +35,42 @@ if (!bootstrapToken) {
37
35
 
38
36
  const projectName = projectNameArg;
39
37
 
38
+ /**
39
+ * Fonction pour copier récursivement un dossier
40
+ */
41
+ function copyRecursiveSync(src, dest) {
42
+ const exists = fs.existsSync(src);
43
+ const stats = exists && fs.statSync(src);
44
+ const isDirectory = exists && stats.isDirectory();
45
+
46
+ if (isDirectory) {
47
+ if (!fs.existsSync(dest)) {
48
+ fs.mkdirSync(dest, { recursive: true });
49
+ }
50
+ fs.readdirSync(src).forEach(childItemName => {
51
+ copyRecursiveSync(
52
+ path.join(src, childItemName),
53
+ path.join(dest, childItemName)
54
+ );
55
+ });
56
+ } else {
57
+ fs.copyFileSync(src, dest);
58
+ }
59
+ }
60
+
40
61
  /**
41
62
  * Fonction pour appeler la Cloud Function et récupérer les clés.
42
63
  */
43
64
  function fetchProjectKeys(token) {
44
65
  return new Promise((resolve, reject) => {
45
66
  const postData = JSON.stringify({ token });
46
- const options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } };
67
+ const options = {
68
+ method: 'POST',
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ 'Content-Length': Buffer.byteLength(postData)
72
+ }
73
+ };
47
74
  const req = https.request(bootstrapUrl, options, (res) => {
48
75
  let data = '';
49
76
  res.on('data', (chunk) => { data += chunk; });
@@ -63,7 +90,7 @@ function fetchProjectKeys(token) {
63
90
  }
64
91
 
65
92
  /**
66
- * Fonction Principale Asynchrone (Version pro avec téléchargement direct et gestion de fichiers robuste)
93
+ * Fonction Principale Asynchrone
67
94
  */
68
95
  async function setupProject() {
69
96
  console.log(`\nCréation de votre projet Fleetbo "${projectName}"...`);
@@ -78,20 +105,37 @@ async function setupProject() {
78
105
  if (response.statusCode === 301 || response.statusCode === 302) {
79
106
  return https.get(response.headers.location, (redirectResponse) => {
80
107
  redirectResponse.pipe(unzipper.Extract({ path: tempDir }))
81
- .on('finish', resolve)
108
+ .on('close', () => {
109
+ // Attendre un peu pour s'assurer que tous les fichiers sont écrits
110
+ setTimeout(resolve, 500);
111
+ })
82
112
  .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
83
113
  }).on('error', (err) => reject(new Error(`Erreur réseau après redirection: ${err.message}`)));
84
114
  }
85
115
  response.pipe(unzipper.Extract({ path: tempDir }))
86
- .on('finish', resolve)
116
+ .on('close', () => {
117
+ // Attendre un peu pour s'assurer que tous les fichiers sont écrits
118
+ setTimeout(resolve, 500);
119
+ })
87
120
  .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
88
121
  }).on('error', (err) => reject(new Error(`Erreur réseau: ${err.message}`)));
89
122
  });
90
- console.log(' [2/5] ✅ Template téléchargé. Organisation des fichiers...');
123
+
124
+ console.log(' [2/5] ✅ Template téléchargé. Vérification...');
125
+
126
+ // Vérifier que l'extraction est complète
127
+ if (!fs.existsSync(tempDir) || fs.readdirSync(tempDir).length === 0) {
128
+ throw new Error('Le téléchargement ou l\'extraction a échoué');
129
+ }
91
130
 
92
- // Étape 2 bis : Localiser intelligemment la racine du projet
93
- const unzippedBaseFolder = fs.readdirSync(tempDir)[0];
131
+ // Étape 2 : Localiser intelligemment la racine du projet
132
+ console.log(' [2/5] 🔍 Localisation de la racine du projet...');
133
+ const tempContents = fs.readdirSync(tempDir);
134
+ console.log(` → Contenu du dossier temporaire: ${tempContents.join(', ')}`);
135
+
136
+ const unzippedBaseFolder = tempContents[0];
94
137
  let sourceDir = path.join(tempDir, unzippedBaseFolder);
138
+
95
139
  if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
96
140
  const nestedProjectDir = fs.readdirSync(sourceDir).find(file => {
97
141
  const fullPath = path.join(sourceDir, file);
@@ -101,31 +145,86 @@ async function setupProject() {
101
145
  sourceDir = path.join(sourceDir, nestedProjectDir);
102
146
  }
103
147
 
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));
148
+ console.log(` ✅ Racine du projet trouvée: ${sourceDir}`);
149
+
150
+ // Lister tous les fichiers du source avant copie
151
+ function countFilesRecursive(dir) {
152
+ let count = 0;
153
+ const items = fs.readdirSync(dir);
154
+ items.forEach(item => {
155
+ const fullPath = path.join(dir, item);
156
+ const stat = fs.statSync(fullPath);
157
+ if (stat.isDirectory()) {
158
+ count += countFilesRecursive(fullPath);
159
+ } else {
160
+ count++;
161
+ }
162
+ });
163
+ return count;
108
164
  }
109
165
 
110
- process.chdir(projectDir);
111
- console.log(' [3/5] 🔑 Récupération des clés de projet...');
166
+ const totalSourceFiles = countFilesRecursive(sourceDir);
167
+ console.log(` → ${totalSourceFiles} fichiers au total dans le template`);
168
+
169
+ // Étape 3 : Copier RÉCURSIVEMENT tous les fichiers et dossiers
170
+ console.log(` [3/5] 📂 Copie de tous les fichiers du template...`);
171
+
172
+ // Vérifier que le répertoire source existe et contient des fichiers
173
+ if (!fs.existsSync(sourceDir)) {
174
+ throw new Error(`Le répertoire source n'existe pas: ${sourceDir}`);
175
+ }
176
+
177
+ const sourceFiles = fs.readdirSync(sourceDir);
178
+ console.log(` → ${sourceFiles.length} éléments à la racine: ${sourceFiles.join(', ')}`);
179
+
180
+ // Copier récursivement tout le contenu
181
+ copyRecursiveSync(sourceDir, projectDir);
182
+
183
+ // Vérifier que la copie a réussi
184
+ const totalCopiedFiles = countFilesRecursive(projectDir);
185
+ console.log(` ✅ ${totalCopiedFiles} fichiers copiés dans le nouveau projet`);
186
+
187
+ if (totalCopiedFiles !== totalSourceFiles) {
188
+ console.warn(` ⚠️ ATTENTION: ${totalSourceFiles - totalCopiedFiles} fichiers manquants!`);
189
+ }
190
+
191
+ if (!fs.existsSync(path.join(projectDir, 'package.json'))) {
192
+ throw new Error('Erreur: package.json n\'a pas été copié correctement');
193
+ }
194
+
195
+ // Vérifier spécifiquement le dossier src
196
+ const srcDir = path.join(projectDir, 'src');
197
+ if (fs.existsSync(srcDir)) {
198
+ const srcFiles = fs.readdirSync(srcDir);
199
+ console.log(` → Dossier src contient: ${srcFiles.length} éléments`);
200
+ } else {
201
+ console.warn(' ⚠️ ATTENTION: Le dossier src n\'existe pas!');
202
+ }
203
+
204
+ // Étape 4 : Récupération des clés
205
+ console.log(' [4/5] 🔑 Récupération des clés de projet...');
112
206
  const keys = await fetchProjectKeys(bootstrapToken);
207
+
113
208
  if (!keys.enterpriseId || !keys.fleetboDBKey) {
114
209
  throw new Error("Les clés reçues du serveur sont invalides.");
115
210
  }
116
211
 
117
- console.log(' [4/5] Fichier .env configuré avec succès.');
212
+ // Configuration du fichier .env
118
213
  const envContent = `REACT_APP_FLEETBO_DB_KEY=${keys.fleetboDBKey}\nREACT_APP_ENTERPRISE_ID=${keys.enterpriseId}\n`;
119
214
  fs.writeFileSync(path.join(projectDir, '.env'), envContent, 'utf8');
215
+ console.log(' ✅ Fichier .env configuré avec succès.');
120
216
 
121
- console.log(' [5/5] 📦 Installation des dépendances...');
122
- execSync('npm install', { stdio: 'inherit' });
123
-
217
+ // Mise à jour du package.json avec le nom du projet
124
218
  const packageJsonPath = path.join(projectDir, 'package.json');
125
219
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
126
220
  packageJson.name = projectName;
127
221
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
128
222
 
223
+ // Étape 5 : Installation des dépendances
224
+ console.log(' [5/5] 📦 Installation des dépendances...');
225
+ process.chdir(projectDir);
226
+ execSync('npm install', { stdio: 'inherit' });
227
+
129
228
  console.log('\n🚀 Votre projet Fleetbo est prêt !');
130
229
  console.log(`\nPour commencer, exécutez les commandes suivantes :`);
131
230
  console.log(` cd ${projectName}`);
@@ -133,15 +232,26 @@ async function setupProject() {
133
232
 
134
233
  } catch (error) {
135
234
  console.error('\n❌ Une erreur est survenue lors de la création du projet :', error.message);
235
+ console.error(' Détails:', error);
236
+
237
+ // NE PAS nettoyer le projectDir si on veut déboguer
238
+ // Commenter cette section pour garder les fichiers et voir ce qui manque
136
239
  if (fs.existsSync(projectDir)) {
240
+ console.log(' 🧹 Nettoyage du projet incomplet...');
137
241
  fs.rmSync(projectDir, { recursive: true, force: true });
138
242
  }
243
+ process.exit(1);
139
244
  } finally {
245
+ // Attendre avant de nettoyer pour être sûr que tout est copié
140
246
  if (fs.existsSync(tempDir)) {
141
- fs.rmSync(tempDir, { recursive: true, force: true });
247
+ console.log(' 🧹 Nettoyage du dossier temporaire...');
248
+ setTimeout(() => {
249
+ if (fs.existsSync(tempDir)) {
250
+ fs.rmSync(tempDir, { recursive: true, force: true });
251
+ }
252
+ }, 1000);
142
253
  }
143
254
  }
144
255
  }
145
256
 
146
- setupProject();
147
-
257
+ setupProject();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fleetbo-project",
3
- "version": "1.0.28",
3
+ "version": "1.0.30",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {