create-fleetbo-project 1.0.28 → 1.0.29

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}"...`);
@@ -87,11 +114,13 @@ async function setupProject() {
87
114
  .on('error', (err) => reject(new Error(`Erreur de décompression: ${err.message}`)));
88
115
  }).on('error', (err) => reject(new Error(`Erreur réseau: ${err.message}`)));
89
116
  });
117
+
90
118
  console.log(' [2/5] ✅ Template téléchargé. Organisation des fichiers...');
91
119
 
92
- // Étape 2 bis : Localiser intelligemment la racine du projet
120
+ // Étape 2 : Localiser intelligemment la racine du projet
93
121
  const unzippedBaseFolder = fs.readdirSync(tempDir)[0];
94
122
  let sourceDir = path.join(tempDir, unzippedBaseFolder);
123
+
95
124
  if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
96
125
  const nestedProjectDir = fs.readdirSync(sourceDir).find(file => {
97
126
  const fullPath = path.join(sourceDir, file);
@@ -101,31 +130,52 @@ async function setupProject() {
101
130
  sourceDir = path.join(sourceDir, nestedProjectDir);
102
131
  }
103
132
 
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));
133
+ // Étape 3 : Copier RÉCURSIVEMENT tous les fichiers et dossiers
134
+ console.log(` [3/5] 📂 Copie de tous les fichiers du template...`);
135
+
136
+ // Vérifier que le répertoire source existe et contient des fichiers
137
+ if (!fs.existsSync(sourceDir)) {
138
+ throw new Error(`Le répertoire source n'existe pas: ${sourceDir}`);
108
139
  }
109
140
 
110
- process.chdir(projectDir);
111
- console.log(' [3/5] 🔑 Récupération des clés de projet...');
141
+ const sourceFiles = fs.readdirSync(sourceDir);
142
+ console.log(` → ${sourceFiles.length} éléments détectés à la racine du template`);
143
+
144
+ // Copier récursivement tout le contenu
145
+ copyRecursiveSync(sourceDir, projectDir);
146
+
147
+ // Vérifier que la copie a réussi
148
+ const copiedFiles = fs.readdirSync(projectDir);
149
+ console.log(` → ${copiedFiles.length} éléments copiés dans le nouveau projet`);
150
+
151
+ if (!fs.existsSync(path.join(projectDir, 'package.json'))) {
152
+ throw new Error('Erreur: package.json n\'a pas été copié correctement');
153
+ }
154
+
155
+ // Étape 4 : Récupération des clés
156
+ console.log(' [4/5] 🔑 Récupération des clés de projet...');
112
157
  const keys = await fetchProjectKeys(bootstrapToken);
158
+
113
159
  if (!keys.enterpriseId || !keys.fleetboDBKey) {
114
160
  throw new Error("Les clés reçues du serveur sont invalides.");
115
161
  }
116
162
 
117
- console.log(' [4/5] Fichier .env configuré avec succès.');
163
+ // Configuration du fichier .env
118
164
  const envContent = `REACT_APP_FLEETBO_DB_KEY=${keys.fleetboDBKey}\nREACT_APP_ENTERPRISE_ID=${keys.enterpriseId}\n`;
119
165
  fs.writeFileSync(path.join(projectDir, '.env'), envContent, 'utf8');
166
+ console.log(' ✅ Fichier .env configuré avec succès.');
120
167
 
121
- console.log(' [5/5] 📦 Installation des dépendances...');
122
- execSync('npm install', { stdio: 'inherit' });
123
-
168
+ // Mise à jour du package.json avec le nom du projet
124
169
  const packageJsonPath = path.join(projectDir, 'package.json');
125
170
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
126
171
  packageJson.name = projectName;
127
172
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
128
173
 
174
+ // Étape 5 : Installation des dépendances
175
+ console.log(' [5/5] 📦 Installation des dépendances...');
176
+ process.chdir(projectDir);
177
+ execSync('npm install', { stdio: 'inherit' });
178
+
129
179
  console.log('\n🚀 Votre projet Fleetbo est prêt !');
130
180
  console.log(`\nPour commencer, exécutez les commandes suivantes :`);
131
181
  console.log(` cd ${projectName}`);
@@ -133,9 +183,12 @@ async function setupProject() {
133
183
 
134
184
  } catch (error) {
135
185
  console.error('\n❌ Une erreur est survenue lors de la création du projet :', error.message);
186
+ console.error(' Détails:', error);
136
187
  if (fs.existsSync(projectDir)) {
188
+ console.log(' 🧹 Nettoyage du projet incomplet...');
137
189
  fs.rmSync(projectDir, { recursive: true, force: true });
138
190
  }
191
+ process.exit(1);
139
192
  } finally {
140
193
  if (fs.existsSync(tempDir)) {
141
194
  fs.rmSync(tempDir, { recursive: true, force: true });
@@ -143,5 +196,4 @@ async function setupProject() {
143
196
  }
144
197
  }
145
198
 
146
- setupProject();
147
-
199
+ 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.29",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {