create-fleetbo-project 1.0.30 → 1.0.31

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.
@@ -36,25 +36,41 @@ if (!bootstrapToken) {
36
36
  const projectName = projectNameArg;
37
37
 
38
38
  /**
39
- * Fonction pour copier récursivement un dossier
39
+ * Fonction pour copier récursivement un dossier (version robuste)
40
40
  */
41
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 });
42
+ try {
43
+ const stat = fs.statSync(src);
44
+
45
+ if (stat.isDirectory()) {
46
+ // Créer le dossier de destination
47
+ if (!fs.existsSync(dest)) {
48
+ fs.mkdirSync(dest, { recursive: true });
49
+ }
50
+
51
+ // Copier tous les enfants
52
+ const entries = fs.readdirSync(src, { withFileTypes: true });
53
+ for (const entry of entries) {
54
+ const srcPath = path.join(src, entry.name);
55
+ const destPath = path.join(dest, entry.name);
56
+
57
+ if (entry.isDirectory()) {
58
+ copyRecursiveSync(srcPath, destPath);
59
+ } else if (entry.isFile() || entry.isSymbolicLink()) {
60
+ fs.copyFileSync(srcPath, destPath);
61
+ }
62
+ }
63
+ } else if (stat.isFile()) {
64
+ // Créer le dossier parent si nécessaire
65
+ const destDir = path.dirname(dest);
66
+ if (!fs.existsSync(destDir)) {
67
+ fs.mkdirSync(destDir, { recursive: true });
68
+ }
69
+ fs.copyFileSync(src, dest);
49
70
  }
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);
71
+ } catch (error) {
72
+ console.error(`Erreur lors de la copie de ${src} vers ${dest}:`, error.message);
73
+ throw error;
58
74
  }
59
75
  }
60
76
 
@@ -105,20 +121,14 @@ async function setupProject() {
105
121
  if (response.statusCode === 301 || response.statusCode === 302) {
106
122
  return https.get(response.headers.location, (redirectResponse) => {
107
123
  redirectResponse.pipe(unzipper.Extract({ path: tempDir }))
108
- .on('close', () => {
109
- // Attendre un peu pour s'assurer que tous les fichiers sont écrits
110
- setTimeout(resolve, 500);
111
- })
112
- .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
113
- }).on('error', (err) => reject(new Error(`Erreur réseau après redirection: ${err.message}`)));
124
+ .on('close', () => setTimeout(resolve, 1000))
125
+ .on('error', reject);
126
+ }).on('error', reject);
114
127
  }
115
128
  response.pipe(unzipper.Extract({ path: tempDir }))
116
- .on('close', () => {
117
- // Attendre un peu pour s'assurer que tous les fichiers sont écrits
118
- setTimeout(resolve, 500);
119
- })
120
- .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
121
- }).on('error', (err) => reject(new Error(`Erreur réseau: ${err.message}`)));
129
+ .on('close', () => setTimeout(resolve, 1000))
130
+ .on('error', reject);
131
+ }).on('error', reject);
122
132
  });
123
133
 
124
134
  console.log(' [2/5] ✅ Template téléchargé. Vérification...');
@@ -129,11 +139,7 @@ async function setupProject() {
129
139
  }
130
140
 
131
141
  // É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];
142
+ const unzippedBaseFolder = fs.readdirSync(tempDir)[0];
137
143
  let sourceDir = path.join(tempDir, unzippedBaseFolder);
138
144
 
139
145
  if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
@@ -145,62 +151,10 @@ async function setupProject() {
145
151
  sourceDir = path.join(sourceDir, nestedProjectDir);
146
152
  }
147
153
 
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;
164
- }
165
-
166
- const totalSourceFiles = countFilesRecursive(sourceDir);
167
- console.log(` → ${totalSourceFiles} fichiers au total dans le template`);
168
-
169
154
  // É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
155
+ console.log(` [3/5] 📂 Copie de la structure complète du projet...`);
181
156
  copyRecursiveSync(sourceDir, projectDir);
182
157
 
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
158
  // Étape 4 : Récupération des clés
205
159
  console.log(' [4/5] 🔑 Récupération des clés de projet...');
206
160
  const keys = await fetchProjectKeys(bootstrapToken);
@@ -242,15 +196,12 @@ async function setupProject() {
242
196
  }
243
197
  process.exit(1);
244
198
  } finally {
245
- // Attendre avant de nettoyer pour être sûr que tout est copié
246
- if (fs.existsSync(tempDir)) {
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);
253
- }
199
+ // Nettoyer APRÈS que tout soit terminé
200
+ setTimeout(() => {
201
+ if (fs.existsSync(tempDir)) {
202
+ fs.rmSync(tempDir, { recursive: true, force: true });
203
+ }
204
+ }, 2000);
254
205
  }
255
206
  }
256
207
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fleetbo-project",
3
- "version": "1.0.30",
3
+ "version": "1.0.31",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {