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.
@@ -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
- resolve(JSON.parse(data));
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 intelligemment la racine du projet dans le dossier décompressé
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
- fs.cpSync(path.join(sourceDir, file), path.join(projectDir, file), { recursive: true });
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
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fleetbo-project",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {