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.
- package/install-react-template.js +135 -25
- package/package.json +1 -1
|
@@ -7,13 +7,11 @@ const https = require('https');
|
|
|
7
7
|
const unzipper = require('unzipper');
|
|
8
8
|
|
|
9
9
|
// --- Configuration ---
|
|
10
|
-
const repoOwner = 'FleetFleetbo';
|
|
11
|
-
const repoName = 'dev.fleetbo.io';
|
|
12
|
-
const branchName = 'master';
|
|
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 = {
|
|
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
|
|
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('
|
|
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('
|
|
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
|
-
|
|
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
|
|
93
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
111
|
-
console.log(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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();
|