create-fleetbo-project 1.0.33 → 1.0.35
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 +39 -10
- package/package.json +1 -1
|
@@ -6,6 +6,15 @@ const path = require('path');
|
|
|
6
6
|
const https = require('https');
|
|
7
7
|
const unzipper = require('unzipper');
|
|
8
8
|
|
|
9
|
+
// --- Vérification de la version de Node.js ---
|
|
10
|
+
const [major, minor] = process.versions.node.split('.').map(parseFloat);
|
|
11
|
+
if (major < 16 || (major === 16 && minor < 7)) {
|
|
12
|
+
console.error(`\n❌ Erreur : Ce script requiert Node.js v16.7.0 ou une version supérieure pour fonctionner correctement.`);
|
|
13
|
+
console.error(` Votre version actuelle est ${process.versions.node}.`);
|
|
14
|
+
console.log(` Veuillez mettre à jour votre installation de Node.js.`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
|
|
9
18
|
// --- Configuration ---
|
|
10
19
|
const repoOwner = 'FleetFleetbo'; // Assurez-vous que c'est le bon nom d'utilisateur GitHub
|
|
11
20
|
const repoName = 'dev.fleetbo.io'; // Assurez-vous que c'est le bon nom de dépôt
|
|
@@ -49,7 +58,11 @@ function fetchProjectKeys(token) {
|
|
|
49
58
|
res.on('data', (chunk) => { data += chunk; });
|
|
50
59
|
res.on('end', () => {
|
|
51
60
|
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
52
|
-
|
|
61
|
+
try {
|
|
62
|
+
resolve(JSON.parse(data));
|
|
63
|
+
} catch (e) {
|
|
64
|
+
reject(new Error('Réponse invalide du serveur de clés.'));
|
|
65
|
+
}
|
|
53
66
|
} else {
|
|
54
67
|
const errorMsg = JSON.parse(data).error || `Erreur serveur (code: ${res.statusCode})`;
|
|
55
68
|
reject(new Error(errorMsg));
|
|
@@ -62,6 +75,28 @@ function fetchProjectKeys(token) {
|
|
|
62
75
|
});
|
|
63
76
|
}
|
|
64
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Fonction de copie récursive robuste pour garantir que tous les fichiers sont copiés.
|
|
80
|
+
* @param {string} src Le chemin source.
|
|
81
|
+
* @param {string} dest Le chemin de destination.
|
|
82
|
+
*/
|
|
83
|
+
function copyRecursiveSync(src, dest) {
|
|
84
|
+
const exists = fs.existsSync(src);
|
|
85
|
+
const stats = exists && fs.statSync(src);
|
|
86
|
+
const isDirectory = exists && stats.isDirectory();
|
|
87
|
+
if (isDirectory) {
|
|
88
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
89
|
+
fs.readdirSync(src).forEach(childItemName => {
|
|
90
|
+
copyRecursiveSync(
|
|
91
|
+
path.join(src, childItemName),
|
|
92
|
+
path.join(dest, childItemName)
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
fs.copyFileSync(src, dest);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
65
100
|
/**
|
|
66
101
|
* Fonction Principale Asynchrone (Version pro avec téléchargement direct et gestion de fichiers robuste)
|
|
67
102
|
*/
|
|
@@ -76,7 +111,6 @@ async function setupProject() {
|
|
|
76
111
|
await new Promise((resolve, reject) => {
|
|
77
112
|
https.get(repoUrl, (response) => {
|
|
78
113
|
if (response.statusCode === 301 || response.statusCode === 302) {
|
|
79
|
-
// Gérer la redirection
|
|
80
114
|
return https.get(response.headers.location, (redirectResponse) => {
|
|
81
115
|
redirectResponse.pipe(unzipper.Extract({ path: tempDir }))
|
|
82
116
|
.on('finish', resolve)
|
|
@@ -93,11 +127,10 @@ async function setupProject() {
|
|
|
93
127
|
});
|
|
94
128
|
console.log(' [2/5] ✅ Template téléchargé. Organisation des fichiers...');
|
|
95
129
|
|
|
96
|
-
// Étape 2 bis : Localiser
|
|
130
|
+
// Étape 2 bis : Localiser la racine du projet dans le dossier décompressé
|
|
97
131
|
const unzippedBaseFolder = fs.readdirSync(tempDir)[0];
|
|
98
132
|
let sourceDir = path.join(tempDir, unzippedBaseFolder);
|
|
99
133
|
|
|
100
|
-
// Gère le cas où le projet est dans un sous-dossier du repo
|
|
101
134
|
if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
|
|
102
135
|
const nestedProjectDir = fs.readdirSync(sourceDir).find(file => {
|
|
103
136
|
const fullPath = path.join(sourceDir, file);
|
|
@@ -109,11 +142,8 @@ async function setupProject() {
|
|
|
109
142
|
|
|
110
143
|
// Étape 2 ter : Copier les fichiers vers la destination finale
|
|
111
144
|
fs.mkdirSync(projectDir, { recursive: true });
|
|
112
|
-
// **CORRECTION :** Utilisation de `fs.cpSync` pour copier récursivement chaque élément.
|
|
113
|
-
// C'est une méthode plus fiable pour s'assurer que toute l'arborescence
|
|
114
|
-
// des fichiers (y compris le contenu de /src) est copiée à l'identique.
|
|
115
145
|
for (const file of fs.readdirSync(sourceDir)) {
|
|
116
|
-
|
|
146
|
+
copyRecursiveSync(path.join(sourceDir, file), path.join(projectDir, file));
|
|
117
147
|
}
|
|
118
148
|
|
|
119
149
|
process.chdir(projectDir);
|
|
@@ -130,7 +160,6 @@ async function setupProject() {
|
|
|
130
160
|
console.log(' [5/5] 📦 Installation des dépendances...');
|
|
131
161
|
execSync('npm install', { stdio: 'inherit' });
|
|
132
162
|
|
|
133
|
-
// Personnalisation du nom du projet dans package.json
|
|
134
163
|
const packageJsonPath = path.join(projectDir, 'package.json');
|
|
135
164
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
136
165
|
packageJson.name = projectName;
|
|
@@ -147,7 +176,6 @@ async function setupProject() {
|
|
|
147
176
|
fs.rmSync(projectDir, { recursive: true, force: true });
|
|
148
177
|
}
|
|
149
178
|
} finally {
|
|
150
|
-
// Nettoyage du dossier temporaire
|
|
151
179
|
if (fs.existsSync(tempDir)) {
|
|
152
180
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
153
181
|
}
|
|
@@ -155,3 +183,4 @@ async function setupProject() {
|
|
|
155
183
|
}
|
|
156
184
|
|
|
157
185
|
setupProject();
|
|
186
|
+
|