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.
- package/install-react-template.js +46 -12
- package/package.json +1 -1
|
@@ -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
|
|
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
|
-
//
|
|
71
|
-
console.log(` [1/5] 📥
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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
|
-
|
|
139
|
+
} finally {
|
|
140
|
+
if (fs.existsSync(tempDir)) {
|
|
141
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
142
|
+
}
|
|
109
143
|
}
|
|
110
144
|
}
|
|
111
145
|
|