behsseui 0.0.4 → 0.0.5
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/README.md +108 -108
- package/dist/index.js +344 -15
- package/dist/index.js.map +1 -1
- package/package.json +54 -54
package/README.md
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
# behsse-ui
|
|
2
|
-
|
|
3
|
-
CLI pour ajouter des composants behsseui dans vos projets.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install -g behsse-ui
|
|
9
|
-
# ou
|
|
10
|
-
pnpm add -g behsse-ui
|
|
11
|
-
# ou
|
|
12
|
-
yarn global add behsse-ui
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Utilisation
|
|
16
|
-
|
|
17
|
-
### 1. Initialiser votre projet
|
|
18
|
-
|
|
19
|
-
Avant d'ajouter des composants, vous devez initialiser votre projet :
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
behsseui init
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Cette commande va :
|
|
26
|
-
- Détecter automatiquement votre package manager (npm, pnpm, yarn, bun)
|
|
27
|
-
- Vous demander où installer les composants (par défaut : `./ui`)
|
|
28
|
-
- Installer les dépendances nécessaires :
|
|
29
|
-
- `class-variance-authority` - Pour gérer les variants des composants
|
|
30
|
-
- `clsx` - Pour manipuler les classes CSS
|
|
31
|
-
- `tailwind-merge` - Pour fusionner les classes Tailwind intelligemment
|
|
32
|
-
- Optionnellement installer et configurer Tailwind CSS
|
|
33
|
-
- Créer un fichier de configuration `behsseui.json`
|
|
34
|
-
- Créer un helper `cn()` dans votre dossier de composants
|
|
35
|
-
|
|
36
|
-
### 2. Ajouter des composants
|
|
37
|
-
|
|
38
|
-
Une fois initialisé, vous pouvez ajouter des composants :
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
behsseui add Button
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Le composant sera téléchargé et placé dans le dossier que vous avez configuré.
|
|
45
|
-
|
|
46
|
-
### 3. Utiliser les composants
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
import { Button } from "./ui/Button";
|
|
50
|
-
|
|
51
|
-
export default function App() {
|
|
52
|
-
return (
|
|
53
|
-
<Button variant="default" size="lg">
|
|
54
|
-
Click me
|
|
55
|
-
</Button>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Composants disponibles
|
|
61
|
-
|
|
62
|
-
- `Button` - Bouton avec variants (default, destructive, outline, secondary, ghost, link)
|
|
63
|
-
|
|
64
|
-
Plus de composants à venir...
|
|
65
|
-
|
|
66
|
-
## Configuration
|
|
67
|
-
|
|
68
|
-
Le fichier `behsseui.json` à la racine de votre projet contient la configuration :
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"$schema": "https://behsseui.dev/schema.json",
|
|
73
|
-
"componentsDir": "./ui",
|
|
74
|
-
"libDir": "./lib",
|
|
75
|
-
"tailwind": {
|
|
76
|
-
"css": "./app/globals.css"
|
|
77
|
-
},
|
|
78
|
-
"initialized": true
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Pourquoi cette approche ?
|
|
83
|
-
|
|
84
|
-
Contrairement aux bibliothèques de composants traditionnelles, behsseui copie le code directement dans votre projet. Cela vous donne :
|
|
85
|
-
|
|
86
|
-
- **Contrôle total** - Modifiez les composants selon vos besoins
|
|
87
|
-
- **Pas de dépendances cachées** - Toutes les dépendances sont visibles dans votre `package.json`
|
|
88
|
-
- **Pas de bloat** - Seulement les composants que vous utilisez
|
|
89
|
-
- **Apprentissage** - Voyez comment les composants sont construits
|
|
90
|
-
|
|
91
|
-
## Dépendances
|
|
92
|
-
|
|
93
|
-
### Obligatoires
|
|
94
|
-
- `class-variance-authority` - Gestion des variants
|
|
95
|
-
- `clsx` - Manipulation de classes
|
|
96
|
-
- `tailwind-merge` - Fusion intelligente de classes Tailwind
|
|
97
|
-
|
|
98
|
-
### Optionnelles
|
|
99
|
-
- `tailwindcss` - Framework CSS (recommandé)
|
|
100
|
-
- `react` - v18.0.0 ou supérieur
|
|
101
|
-
|
|
102
|
-
## Repository
|
|
103
|
-
|
|
104
|
-
[https://github.com/behsse/ui](https://github.com/behsse/ui)
|
|
105
|
-
|
|
106
|
-
## License
|
|
107
|
-
|
|
108
|
-
MIT
|
|
1
|
+
# behsse-ui
|
|
2
|
+
|
|
3
|
+
CLI pour ajouter des composants behsseui dans vos projets.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g behsse-ui
|
|
9
|
+
# ou
|
|
10
|
+
pnpm add -g behsse-ui
|
|
11
|
+
# ou
|
|
12
|
+
yarn global add behsse-ui
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Utilisation
|
|
16
|
+
|
|
17
|
+
### 1. Initialiser votre projet
|
|
18
|
+
|
|
19
|
+
Avant d'ajouter des composants, vous devez initialiser votre projet :
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
behsseui init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Cette commande va :
|
|
26
|
+
- Détecter automatiquement votre package manager (npm, pnpm, yarn, bun)
|
|
27
|
+
- Vous demander où installer les composants (par défaut : `./ui`)
|
|
28
|
+
- Installer les dépendances nécessaires :
|
|
29
|
+
- `class-variance-authority` - Pour gérer les variants des composants
|
|
30
|
+
- `clsx` - Pour manipuler les classes CSS
|
|
31
|
+
- `tailwind-merge` - Pour fusionner les classes Tailwind intelligemment
|
|
32
|
+
- Optionnellement installer et configurer Tailwind CSS
|
|
33
|
+
- Créer un fichier de configuration `behsseui.json`
|
|
34
|
+
- Créer un helper `cn()` dans votre dossier de composants
|
|
35
|
+
|
|
36
|
+
### 2. Ajouter des composants
|
|
37
|
+
|
|
38
|
+
Une fois initialisé, vous pouvez ajouter des composants :
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
behsseui add Button
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Le composant sera téléchargé et placé dans le dossier que vous avez configuré.
|
|
45
|
+
|
|
46
|
+
### 3. Utiliser les composants
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import { Button } from "./ui/Button";
|
|
50
|
+
|
|
51
|
+
export default function App() {
|
|
52
|
+
return (
|
|
53
|
+
<Button variant="default" size="lg">
|
|
54
|
+
Click me
|
|
55
|
+
</Button>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Composants disponibles
|
|
61
|
+
|
|
62
|
+
- `Button` - Bouton avec variants (default, destructive, outline, secondary, ghost, link)
|
|
63
|
+
|
|
64
|
+
Plus de composants à venir...
|
|
65
|
+
|
|
66
|
+
## Configuration
|
|
67
|
+
|
|
68
|
+
Le fichier `behsseui.json` à la racine de votre projet contient la configuration :
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"$schema": "https://behsseui.dev/schema.json",
|
|
73
|
+
"componentsDir": "./ui",
|
|
74
|
+
"libDir": "./lib",
|
|
75
|
+
"tailwind": {
|
|
76
|
+
"css": "./app/globals.css"
|
|
77
|
+
},
|
|
78
|
+
"initialized": true
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Pourquoi cette approche ?
|
|
83
|
+
|
|
84
|
+
Contrairement aux bibliothèques de composants traditionnelles, behsseui copie le code directement dans votre projet. Cela vous donne :
|
|
85
|
+
|
|
86
|
+
- **Contrôle total** - Modifiez les composants selon vos besoins
|
|
87
|
+
- **Pas de dépendances cachées** - Toutes les dépendances sont visibles dans votre `package.json`
|
|
88
|
+
- **Pas de bloat** - Seulement les composants que vous utilisez
|
|
89
|
+
- **Apprentissage** - Voyez comment les composants sont construits
|
|
90
|
+
|
|
91
|
+
## Dépendances
|
|
92
|
+
|
|
93
|
+
### Obligatoires
|
|
94
|
+
- `class-variance-authority` - Gestion des variants
|
|
95
|
+
- `clsx` - Manipulation de classes
|
|
96
|
+
- `tailwind-merge` - Fusion intelligente de classes Tailwind
|
|
97
|
+
|
|
98
|
+
### Optionnelles
|
|
99
|
+
- `tailwindcss` - Framework CSS (recommandé)
|
|
100
|
+
- `react` - v18.0.0 ou supérieur
|
|
101
|
+
|
|
102
|
+
## Repository
|
|
103
|
+
|
|
104
|
+
[https://github.com/behsse/ui](https://github.com/behsse/ui)
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -8,8 +8,9 @@ import { Command } from "commander";
|
|
|
8
8
|
import prompts from "prompts";
|
|
9
9
|
import chalk from "chalk";
|
|
10
10
|
import ora from "ora";
|
|
11
|
-
import { existsSync as
|
|
11
|
+
import { existsSync as existsSync5, mkdirSync, writeFileSync as writeFileSync4, readFileSync as readFileSync6, unlinkSync } from "fs";
|
|
12
12
|
import { join as join6, dirname as dirname2 } from "path";
|
|
13
|
+
import { execSync as execSync2 } from "child_process";
|
|
13
14
|
|
|
14
15
|
// src/utils/package-manager.ts
|
|
15
16
|
import { execSync } from "child_process";
|
|
@@ -207,6 +208,49 @@ function getTypeScriptMajorVersion(version) {
|
|
|
207
208
|
// src/utils/vite-config.ts
|
|
208
209
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "fs";
|
|
209
210
|
import { join as join5 } from "path";
|
|
211
|
+
function addAliasToViteConfig(configPath) {
|
|
212
|
+
const fullPath = join5(process.cwd(), configPath);
|
|
213
|
+
try {
|
|
214
|
+
let content = readFileSync4(fullPath, "utf-8");
|
|
215
|
+
if (content.includes("resolve:") && content.includes("alias:")) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
if (!content.includes("import path from")) {
|
|
219
|
+
const firstImport = content.indexOf("import");
|
|
220
|
+
if (firstImport !== -1) {
|
|
221
|
+
content = 'import path from "path";\n' + content;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const defineConfigRegex = /defineConfig\(\{([\s\S]*?)\}\)/;
|
|
225
|
+
const match = content.match(defineConfigRegex);
|
|
226
|
+
if (match) {
|
|
227
|
+
const configContent = match[1];
|
|
228
|
+
if (configContent.includes("resolve:")) {
|
|
229
|
+
const resolveRegex = /resolve:\s*\{([\s\S]*?)\}/;
|
|
230
|
+
const resolveMatch = configContent.match(resolveRegex);
|
|
231
|
+
if (resolveMatch && !resolveMatch[1].includes("alias:")) {
|
|
232
|
+
const newResolve = `resolve: {
|
|
233
|
+
alias: {
|
|
234
|
+
"@": path.resolve(__dirname, "."),
|
|
235
|
+
},${resolveMatch[1]}
|
|
236
|
+
}`;
|
|
237
|
+
content = content.replace(resolveRegex, newResolve);
|
|
238
|
+
}
|
|
239
|
+
} else {
|
|
240
|
+
const resolveConfig = '\n resolve: {\n alias: {\n "@": path.resolve(__dirname, "."),\n },\n },';
|
|
241
|
+
content = content.replace(
|
|
242
|
+
defineConfigRegex,
|
|
243
|
+
`defineConfig({${resolveConfig}${configContent}})`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
writeFileSync2(fullPath, content, "utf-8");
|
|
248
|
+
return true;
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error("Error adding alias to vite.config:", error);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
210
254
|
function addTailwindToViteConfig(configPath) {
|
|
211
255
|
const fullPath = join5(process.cwd(), configPath);
|
|
212
256
|
try {
|
|
@@ -262,6 +306,44 @@ function addTailwindToViteConfig(configPath) {
|
|
|
262
306
|
}
|
|
263
307
|
}
|
|
264
308
|
|
|
309
|
+
// src/utils/tsconfig.ts
|
|
310
|
+
import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync4 } from "fs";
|
|
311
|
+
function stripJsonComments(jsonString) {
|
|
312
|
+
jsonString = jsonString.replace(/\/\/.*$/gm, "");
|
|
313
|
+
jsonString = jsonString.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
314
|
+
jsonString = jsonString.replace(/,(\s*[}\]])/g, "$1");
|
|
315
|
+
return jsonString;
|
|
316
|
+
}
|
|
317
|
+
function configureTsconfigForAlias(path, isAppConfig = false) {
|
|
318
|
+
if (!existsSync4(path)) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
const content = readFileSync5(path, "utf-8");
|
|
323
|
+
const cleanContent = stripJsonComments(content);
|
|
324
|
+
const tsconfig = JSON.parse(cleanContent);
|
|
325
|
+
if (!tsconfig.compilerOptions) {
|
|
326
|
+
tsconfig.compilerOptions = {};
|
|
327
|
+
}
|
|
328
|
+
tsconfig.compilerOptions.baseUrl = ".";
|
|
329
|
+
if (!tsconfig.compilerOptions.paths) {
|
|
330
|
+
tsconfig.compilerOptions.paths = {};
|
|
331
|
+
}
|
|
332
|
+
tsconfig.compilerOptions.paths["@/*"] = ["./*"];
|
|
333
|
+
if (isAppConfig && Array.isArray(tsconfig.include)) {
|
|
334
|
+
const includes = new Set(tsconfig.include);
|
|
335
|
+
includes.add("ui");
|
|
336
|
+
includes.add("lib");
|
|
337
|
+
tsconfig.include = Array.from(includes);
|
|
338
|
+
}
|
|
339
|
+
writeFileSync3(path, JSON.stringify(tsconfig, null, 2) + "\n", "utf-8");
|
|
340
|
+
return true;
|
|
341
|
+
} catch (error) {
|
|
342
|
+
console.error(`Error configuring ${path}:`, error);
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
265
347
|
// src/commands/init.ts
|
|
266
348
|
var REQUIRED_DEPENDENCIES = [
|
|
267
349
|
"class-variance-authority",
|
|
@@ -273,7 +355,7 @@ function ensureDirectory(path) {
|
|
|
273
355
|
throw new Error("Invalid directory path");
|
|
274
356
|
}
|
|
275
357
|
const fullPath = join6(process.cwd(), path);
|
|
276
|
-
if (!
|
|
358
|
+
if (!existsSync5(fullPath)) {
|
|
277
359
|
mkdirSync(fullPath, { recursive: true });
|
|
278
360
|
}
|
|
279
361
|
}
|
|
@@ -283,10 +365,10 @@ function writeFileSecurely(relativePath, content, spinner) {
|
|
|
283
365
|
}
|
|
284
366
|
const fullPath = join6(process.cwd(), relativePath);
|
|
285
367
|
const dir = dirname2(fullPath);
|
|
286
|
-
if (!
|
|
368
|
+
if (!existsSync5(dir)) {
|
|
287
369
|
mkdirSync(dir, { recursive: true });
|
|
288
370
|
}
|
|
289
|
-
|
|
371
|
+
writeFileSync4(fullPath, content, "utf-8");
|
|
290
372
|
spinner.text = `Fichier cr\xE9\xE9: ${relativePath}`;
|
|
291
373
|
}
|
|
292
374
|
async function setupTailwindForVite(spinner, packageManager) {
|
|
@@ -297,9 +379,9 @@ async function setupTailwindForVite(spinner, packageManager) {
|
|
|
297
379
|
const viteConfigPath = findViteConfig();
|
|
298
380
|
if (viteConfigPath) {
|
|
299
381
|
spinner.text = `Modification de ${viteConfigPath}...`;
|
|
300
|
-
const
|
|
301
|
-
if (
|
|
302
|
-
spinner.text = `\u2713 ${viteConfigPath} modifi\xE9`;
|
|
382
|
+
const tailwindSuccess = addTailwindToViteConfig(viteConfigPath);
|
|
383
|
+
if (tailwindSuccess) {
|
|
384
|
+
spinner.text = `\u2713 ${viteConfigPath} modifi\xE9 avec Tailwind`;
|
|
303
385
|
} else {
|
|
304
386
|
console.log(
|
|
305
387
|
chalk.yellow(
|
|
@@ -316,11 +398,59 @@ plugins: [tailwindcss()]`
|
|
|
316
398
|
)
|
|
317
399
|
);
|
|
318
400
|
}
|
|
401
|
+
spinner.text = `Configuration de l'alias @ dans ${viteConfigPath}...`;
|
|
402
|
+
const aliasSuccess = addAliasToViteConfig(viteConfigPath);
|
|
403
|
+
if (aliasSuccess) {
|
|
404
|
+
spinner.text = `\u2713 Alias @ configur\xE9 dans ${viteConfigPath}`;
|
|
405
|
+
} else {
|
|
406
|
+
console.log(
|
|
407
|
+
chalk.yellow(
|
|
408
|
+
`
|
|
409
|
+
\u26A0\uFE0F Impossible de configurer l'alias @ automatiquement.`
|
|
410
|
+
)
|
|
411
|
+
);
|
|
412
|
+
console.log(
|
|
413
|
+
chalk.dim(
|
|
414
|
+
`Ajoutez manuellement dans vite.config.ts:
|
|
415
|
+
resolve: {
|
|
416
|
+
alias: {
|
|
417
|
+
"@": path.resolve(__dirname, "."),
|
|
418
|
+
},
|
|
419
|
+
}`
|
|
420
|
+
)
|
|
421
|
+
);
|
|
422
|
+
}
|
|
319
423
|
} else {
|
|
320
424
|
console.log(
|
|
321
425
|
chalk.yellow("\n\u26A0\uFE0F Fichier vite.config non trouv\xE9. Cr\xE9ez-le d'abord.")
|
|
322
426
|
);
|
|
323
427
|
}
|
|
428
|
+
spinner.text = "Configuration de tsconfig.json...";
|
|
429
|
+
const tsconfigPath = join6(process.cwd(), "tsconfig.json");
|
|
430
|
+
const tsconfigAppPath = join6(process.cwd(), "tsconfig.app.json");
|
|
431
|
+
const mainConfigured = configureTsconfigForAlias(tsconfigPath, false);
|
|
432
|
+
const appConfigured = configureTsconfigForAlias(tsconfigAppPath, true);
|
|
433
|
+
if (mainConfigured || appConfigured) {
|
|
434
|
+
spinner.text = "\u2713 tsconfig.json configur\xE9 avec alias @";
|
|
435
|
+
} else {
|
|
436
|
+
console.log(
|
|
437
|
+
chalk.yellow("\n\u26A0\uFE0F Erreur lors de la configuration de tsconfig.json")
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
spinner.text = "V\xE9rification de @types/node...";
|
|
441
|
+
try {
|
|
442
|
+
const packageJsonPath = join6(process.cwd(), "package.json");
|
|
443
|
+
if (existsSync5(packageJsonPath)) {
|
|
444
|
+
const packageJson = JSON.parse(readFileSync6(packageJsonPath, "utf-8"));
|
|
445
|
+
const hasTypesNode = packageJson.dependencies?.["@types/node"] || packageJson.devDependencies?.["@types/node"];
|
|
446
|
+
if (!hasTypesNode) {
|
|
447
|
+
spinner.text = "Installation de @types/node...";
|
|
448
|
+
installDependencies(["@types/node"], packageManager, true);
|
|
449
|
+
spinner.text = "\u2713 @types/node install\xE9";
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
} catch (error) {
|
|
453
|
+
}
|
|
324
454
|
}
|
|
325
455
|
async function setupTailwindForNextJs(spinner, packageManager) {
|
|
326
456
|
spinner.text = "Configuration de Tailwind CSS v4 pour Next.js...";
|
|
@@ -335,13 +465,194 @@ function updateGlobalCss(cssPath, spinner) {
|
|
|
335
465
|
const fullPath = join6(process.cwd(), cssPath);
|
|
336
466
|
const cssTemplate = readTemplate("globals.css.template");
|
|
337
467
|
spinner.text = `Configuration de ${cssPath}...`;
|
|
338
|
-
if (
|
|
468
|
+
if (existsSync5(fullPath)) {
|
|
339
469
|
unlinkSync(fullPath);
|
|
340
470
|
spinner.text = `Suppression de l'ancien ${cssPath}...`;
|
|
341
471
|
}
|
|
342
472
|
writeFileSecurely(cssPath, cssTemplate, spinner);
|
|
343
473
|
spinner.text = `\u2713 ${cssPath} cr\xE9\xE9 avec Tailwind v4`;
|
|
344
474
|
}
|
|
475
|
+
async function createNextJsProject(projectName) {
|
|
476
|
+
const spinner = ora("Cr\xE9ation du projet Next.js...").start();
|
|
477
|
+
try {
|
|
478
|
+
spinner.text = `Cr\xE9ation du projet Next.js: ${projectName}...`;
|
|
479
|
+
execSync2(
|
|
480
|
+
`npx create-next-app@latest ${projectName} --typescript --tailwind --eslint --app --no-src-dir --turbopack --import-alias "@/*" --no-git --yes`,
|
|
481
|
+
{ stdio: "inherit" }
|
|
482
|
+
);
|
|
483
|
+
spinner.succeed(chalk.green(`\u2713 Projet Next.js "${projectName}" cr\xE9\xE9 avec succ\xE8s`));
|
|
484
|
+
return join6(process.cwd(), projectName);
|
|
485
|
+
} catch (error) {
|
|
486
|
+
spinner.fail(chalk.red("Erreur lors de la cr\xE9ation du projet Next.js"));
|
|
487
|
+
throw error;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
async function createViteProject(projectName) {
|
|
491
|
+
const spinner = ora("Cr\xE9ation du projet Vite...").start();
|
|
492
|
+
try {
|
|
493
|
+
spinner.text = `Cr\xE9ation du projet Vite: ${projectName}...`;
|
|
494
|
+
const isWindows = process.platform === "win32";
|
|
495
|
+
const command = isWindows ? `echo n | npm create vite@latest ${projectName} -- --template react-ts` : `echo "n" | npm create vite@latest ${projectName} -- --template react-ts`;
|
|
496
|
+
execSync2(command, { stdio: "inherit" });
|
|
497
|
+
spinner.text = "Installation des d\xE9pendances du projet Vite...";
|
|
498
|
+
const projectPath = join6(process.cwd(), projectName);
|
|
499
|
+
const packageManager = detectPackageManager();
|
|
500
|
+
if (packageManager === "npm") {
|
|
501
|
+
execSync2("npm install", { cwd: projectPath, stdio: "inherit" });
|
|
502
|
+
} else if (packageManager === "pnpm") {
|
|
503
|
+
execSync2("pnpm install", { cwd: projectPath, stdio: "inherit" });
|
|
504
|
+
} else {
|
|
505
|
+
execSync2("yarn install", { cwd: projectPath, stdio: "inherit" });
|
|
506
|
+
}
|
|
507
|
+
spinner.text = "Installation de @types/node...";
|
|
508
|
+
if (packageManager === "npm") {
|
|
509
|
+
execSync2("npm install -D @types/node", { cwd: projectPath, stdio: "inherit" });
|
|
510
|
+
} else if (packageManager === "pnpm") {
|
|
511
|
+
execSync2("pnpm add -D @types/node", { cwd: projectPath, stdio: "inherit" });
|
|
512
|
+
} else {
|
|
513
|
+
execSync2("yarn add -D @types/node", { cwd: projectPath, stdio: "inherit" });
|
|
514
|
+
}
|
|
515
|
+
spinner.text = "Configuration de tsconfig.json...";
|
|
516
|
+
const tsconfigPath = join6(projectPath, "tsconfig.json");
|
|
517
|
+
const tsconfigAppPath = join6(projectPath, "tsconfig.app.json");
|
|
518
|
+
configureTsconfigForAlias(tsconfigPath, false);
|
|
519
|
+
configureTsconfigForAlias(tsconfigAppPath, true);
|
|
520
|
+
spinner.text = "\u2713 tsconfig.json configur\xE9";
|
|
521
|
+
spinner.succeed(chalk.green(`\u2713 Projet Vite "${projectName}" cr\xE9\xE9 avec succ\xE8s`));
|
|
522
|
+
return projectPath;
|
|
523
|
+
} catch (error) {
|
|
524
|
+
spinner.fail(chalk.red("Erreur lors de la cr\xE9ation du projet Vite"));
|
|
525
|
+
throw error;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async function createProjectWithBehsseui(framework) {
|
|
529
|
+
console.log(
|
|
530
|
+
chalk.bold.cyan(
|
|
531
|
+
`
|
|
532
|
+
\u2728 Cr\xE9ation d'un projet ${framework === "nextjs" ? "Next.js" : "Vite"} avec behsseui
|
|
533
|
+
`
|
|
534
|
+
)
|
|
535
|
+
);
|
|
536
|
+
const { projectName } = await prompts({
|
|
537
|
+
type: "text",
|
|
538
|
+
name: "projectName",
|
|
539
|
+
message: "Nom du projet ?",
|
|
540
|
+
initial: "my-app",
|
|
541
|
+
validate: (value) => {
|
|
542
|
+
if (!value || value.trim() === "") {
|
|
543
|
+
return "Le nom du projet ne peut pas \xEAtre vide";
|
|
544
|
+
}
|
|
545
|
+
if (existsSync5(join6(process.cwd(), value))) {
|
|
546
|
+
return `Le dossier "${value}" existe d\xE9j\xE0`;
|
|
547
|
+
}
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
if (!projectName) {
|
|
552
|
+
console.log(chalk.red("\n\u274C Cr\xE9ation annul\xE9e."));
|
|
553
|
+
process.exit(0);
|
|
554
|
+
}
|
|
555
|
+
let projectPath;
|
|
556
|
+
try {
|
|
557
|
+
if (framework === "nextjs") {
|
|
558
|
+
projectPath = await createNextJsProject(projectName);
|
|
559
|
+
} else {
|
|
560
|
+
projectPath = await createViteProject(projectName);
|
|
561
|
+
}
|
|
562
|
+
process.chdir(projectPath);
|
|
563
|
+
console.log(chalk.dim(`
|
|
564
|
+
\u{1F4C2} Dossier courant: ${projectPath}
|
|
565
|
+
`));
|
|
566
|
+
await initProjectAuto(framework);
|
|
567
|
+
console.log(
|
|
568
|
+
chalk.bold.green(
|
|
569
|
+
`
|
|
570
|
+
\u{1F389} Projet ${framework === "nextjs" ? "Next.js" : "Vite"} avec behsseui cr\xE9\xE9 avec succ\xE8s!
|
|
571
|
+
`
|
|
572
|
+
)
|
|
573
|
+
);
|
|
574
|
+
console.log(chalk.dim("Pour d\xE9marrer:"));
|
|
575
|
+
console.log(chalk.cyan(` cd ${projectName}`));
|
|
576
|
+
console.log(
|
|
577
|
+
chalk.cyan(
|
|
578
|
+
` ${detectPackageManager()} ${framework === "nextjs" ? "dev" : "dev"}`
|
|
579
|
+
)
|
|
580
|
+
);
|
|
581
|
+
console.log();
|
|
582
|
+
} catch (error) {
|
|
583
|
+
console.error(
|
|
584
|
+
chalk.red(
|
|
585
|
+
`
|
|
586
|
+
\u274C Erreur lors de la cr\xE9ation du projet ${framework === "nextjs" ? "Next.js" : "Vite"}`
|
|
587
|
+
)
|
|
588
|
+
);
|
|
589
|
+
console.error(error);
|
|
590
|
+
process.exit(1);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
async function initProjectAuto(framework) {
|
|
594
|
+
console.log(chalk.bold.cyan("\n\u2728 Initialisation de behsseui\n"));
|
|
595
|
+
const packageManager = detectPackageManager();
|
|
596
|
+
console.log(
|
|
597
|
+
chalk.dim(`\u{1F4E6} Package manager: ${chalk.bold(packageManager)}
|
|
598
|
+
`)
|
|
599
|
+
);
|
|
600
|
+
const componentsDir = "./ui";
|
|
601
|
+
const tailwindCss = framework === "nextjs" ? "./app/globals.css" : "./src/index.css";
|
|
602
|
+
const spinner = ora("Configuration du projet...").start();
|
|
603
|
+
try {
|
|
604
|
+
spinner.text = `Cr\xE9ation du dossier ${componentsDir}...`;
|
|
605
|
+
ensureDirectory(componentsDir);
|
|
606
|
+
spinner.text = "Cr\xE9ation du fichier de configuration...";
|
|
607
|
+
const config = createDefaultConfig(componentsDir);
|
|
608
|
+
config.tailwind.css = tailwindCss;
|
|
609
|
+
delete config.tailwind.config;
|
|
610
|
+
writeConfig(config);
|
|
611
|
+
spinner.text = "Installation des d\xE9pendances...";
|
|
612
|
+
try {
|
|
613
|
+
installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);
|
|
614
|
+
} catch (error) {
|
|
615
|
+
spinner.warn(
|
|
616
|
+
chalk.yellow(
|
|
617
|
+
"Erreur lors de l'installation automatique des d\xE9pendances"
|
|
618
|
+
)
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
if (framework === "vite") {
|
|
622
|
+
await setupTailwindForVite(spinner, packageManager);
|
|
623
|
+
} else if (framework === "nextjs") {
|
|
624
|
+
await setupTailwindForNextJs(spinner, packageManager);
|
|
625
|
+
}
|
|
626
|
+
updateGlobalCss(tailwindCss, spinner);
|
|
627
|
+
spinner.text = "Cr\xE9ation du helper cn() dans lib/...";
|
|
628
|
+
ensureDirectory("./lib");
|
|
629
|
+
const utilsTemplate = readTemplate("utils.ts.template");
|
|
630
|
+
const utilsPath = "./lib/utils.ts";
|
|
631
|
+
writeFileSecurely(utilsPath, utilsTemplate, spinner);
|
|
632
|
+
spinner.succeed(chalk.green("\u2705 Projet initialis\xE9 avec succ\xE8s !\n"));
|
|
633
|
+
console.log(chalk.bold("\u{1F4CB} Prochaines \xE9tapes:\n"));
|
|
634
|
+
console.log(
|
|
635
|
+
chalk.dim("1."),
|
|
636
|
+
"Utilisez le helper cn():",
|
|
637
|
+
chalk.gray(`import { cn } from "./lib/utils"`)
|
|
638
|
+
);
|
|
639
|
+
console.log(
|
|
640
|
+
chalk.dim("2."),
|
|
641
|
+
"Ajoutez des composants:",
|
|
642
|
+
chalk.cyan(`${packageManager} behsseui add Button`)
|
|
643
|
+
);
|
|
644
|
+
console.log(
|
|
645
|
+
chalk.dim("3."),
|
|
646
|
+
"Importez dans votre code:",
|
|
647
|
+
chalk.gray(`import { Button } from "${componentsDir}/Button"`)
|
|
648
|
+
);
|
|
649
|
+
console.log();
|
|
650
|
+
} catch (error) {
|
|
651
|
+
spinner.fail(chalk.red("\u274C Erreur lors de l'initialisation"));
|
|
652
|
+
console.error(error);
|
|
653
|
+
process.exit(1);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
345
656
|
async function initProject() {
|
|
346
657
|
console.log(chalk.bold.cyan("\n\u2728 Initialisation de behsseui\n"));
|
|
347
658
|
if (isProjectInitialized()) {
|
|
@@ -529,7 +840,7 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
|
|
|
529
840
|
updateGlobalCss(answers.tailwindCss, spinner);
|
|
530
841
|
} else if (frameworkInfo.framework === "nextjs") {
|
|
531
842
|
const postcssConfigPath = join6(process.cwd(), "postcss.config.mjs");
|
|
532
|
-
if (!
|
|
843
|
+
if (!existsSync5(postcssConfigPath)) {
|
|
533
844
|
spinner.text = "Cr\xE9ation de postcss.config.mjs...";
|
|
534
845
|
const postcssTemplate = readTemplate("postcss.config.mjs.template");
|
|
535
846
|
writeFileSecurely("postcss.config.mjs", postcssTemplate, spinner);
|
|
@@ -582,11 +893,29 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
|
|
|
582
893
|
process.exit(1);
|
|
583
894
|
}
|
|
584
895
|
}
|
|
585
|
-
var init = new Command().name("init").description("Initialiser behsseui dans votre projet").action(
|
|
896
|
+
var init = new Command().name("init").description("Initialiser behsseui dans votre projet").option("--nextjs", "Cr\xE9er un nouveau projet Next.js avec behsseui").option("--vite", "Cr\xE9er un nouveau projet Vite avec behsseui").action(async (options) => {
|
|
897
|
+
if (options.nextjs && options.vite) {
|
|
898
|
+
console.log(
|
|
899
|
+
chalk.red(
|
|
900
|
+
"\n\u274C Erreur: Vous ne pouvez pas utiliser --nextjs et --vite en m\xEAme temps"
|
|
901
|
+
)
|
|
902
|
+
);
|
|
903
|
+
process.exit(1);
|
|
904
|
+
}
|
|
905
|
+
if (options.nextjs) {
|
|
906
|
+
await createProjectWithBehsseui("nextjs");
|
|
907
|
+
return;
|
|
908
|
+
}
|
|
909
|
+
if (options.vite) {
|
|
910
|
+
await createProjectWithBehsseui("vite");
|
|
911
|
+
return;
|
|
912
|
+
}
|
|
913
|
+
await initProject();
|
|
914
|
+
});
|
|
586
915
|
|
|
587
916
|
// src/commands/add.ts
|
|
588
917
|
import { Command as Command2 } from "commander";
|
|
589
|
-
import { existsSync as
|
|
918
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync2, writeFileSync as writeFileSync5 } from "fs";
|
|
590
919
|
import { join as join7 } from "path";
|
|
591
920
|
import chalk2 from "chalk";
|
|
592
921
|
import ora2 from "ora";
|
|
@@ -641,7 +970,7 @@ async function addComponent(componentName) {
|
|
|
641
970
|
const componentConfig = COMPONENTS_MAP[componentName];
|
|
642
971
|
const config = readConfig();
|
|
643
972
|
const targetDir = join7(process.cwd(), config.componentsDir);
|
|
644
|
-
if (!
|
|
973
|
+
if (!existsSync6(targetDir)) {
|
|
645
974
|
mkdirSync2(targetDir, { recursive: true });
|
|
646
975
|
}
|
|
647
976
|
if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {
|
|
@@ -650,19 +979,19 @@ async function addComponent(componentName) {
|
|
|
650
979
|
const depUrl = `${REGISTRY_URL}/${dep.file}`;
|
|
651
980
|
const depContent = await downloadFile(depUrl);
|
|
652
981
|
const depTargetDir = dep.subdir ? join7(targetDir, dep.subdir) : targetDir;
|
|
653
|
-
if (!
|
|
982
|
+
if (!existsSync6(depTargetDir)) {
|
|
654
983
|
mkdirSync2(depTargetDir, { recursive: true });
|
|
655
984
|
}
|
|
656
985
|
const depFileName = dep.file.split("/").pop();
|
|
657
986
|
const depTargetPath = join7(depTargetDir, depFileName);
|
|
658
|
-
|
|
987
|
+
writeFileSync5(depTargetPath, depContent, "utf-8");
|
|
659
988
|
}
|
|
660
989
|
}
|
|
661
990
|
const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;
|
|
662
991
|
spinner.text = `T\xE9l\xE9chargement de ${componentName}...`;
|
|
663
992
|
const componentContent = await downloadFile(componentUrl);
|
|
664
993
|
const targetComponentPath = join7(targetDir, componentConfig.file);
|
|
665
|
-
|
|
994
|
+
writeFileSync5(targetComponentPath, componentContent, "utf-8");
|
|
666
995
|
spinner.succeed(
|
|
667
996
|
chalk2.green(
|
|
668
997
|
`\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/`
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/package-manager.ts","../src/utils/config.ts","../src/utils/templates.ts","../src/utils/framework.ts","../src/utils/vite-config.ts","../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { init } from \"./commands/init.js\";\r\nimport { add } from \"./commands/add.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"behsseui\")\r\n .description(\"CLI pour ajouter des composants behsseui dans vos projets\")\r\n .version(\"0.0.2\");\r\n\r\n// Ajouter les commandes\r\nprogram.addCommand(init);\r\nprogram.addCommand(add);\r\n\r\nprogram.parse();\r\n","import { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport {\r\n detectPackageManager,\r\n installDependencies,\r\n type PackageManager,\r\n} from \"../utils/package-manager.js\";\r\nimport {\r\n createDefaultConfig,\r\n isProjectInitialized,\r\n writeConfig,\r\n} from \"../utils/config.js\";\r\nimport { readTemplate } from \"../utils/templates.js\";\r\nimport {\r\n detectFramework,\r\n getTailwindMajorVersion,\r\n getTypeScriptMajorVersion,\r\n isTypeScriptV5OrHigher,\r\n findViteConfig,\r\n findTailwindConfig,\r\n} from \"../utils/framework.js\";\r\nimport { addTailwindToViteConfig } from \"../utils/vite-config.js\";\r\n\r\nconst REQUIRED_DEPENDENCIES = [\r\n \"class-variance-authority\",\r\n \"clsx\",\r\n \"tailwind-merge\",\r\n];\r\n\r\n/**\r\n * Crée un dossier de manière sécurisée\r\n */\r\nfunction ensureDirectory(path: string): void {\r\n if (!path || path.trim() === \"\") {\r\n throw new Error(\"Invalid directory path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), path);\r\n if (!existsSync(fullPath)) {\r\n mkdirSync(fullPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Écrit un fichier de manière sécurisée\r\n */\r\nfunction writeFileSecurely(\r\n relativePath: string,\r\n content: string,\r\n spinner: any\r\n): void {\r\n if (!relativePath || relativePath.trim() === \"\") {\r\n throw new Error(\"Invalid file path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), relativePath);\r\n const dir = dirname(fullPath);\r\n\r\n // S'assurer que le dossier parent existe\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n spinner.text = `Fichier créé: ${relativePath}`;\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Vite\r\n */\r\nasync function setupTailwindForVite(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Vite...\";\r\n\r\n // Installer Tailwind v4 + plugin Vite\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/vite@latest\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Trouver et modifier vite.config\r\n const viteConfigPath = findViteConfig();\r\n if (viteConfigPath) {\r\n spinner.text = `Modification de ${viteConfigPath}...`;\r\n const success = addTailwindToViteConfig(viteConfigPath);\r\n if (success) {\r\n spinner.text = `✓ ${viteConfigPath} modifié`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de modifier automatiquement ${viteConfigPath}.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement:\\nimport tailwindcss from \"@tailwindcss/vite\";\\n\\nplugins: [tailwindcss()]`\r\n )\r\n );\r\n }\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Fichier vite.config non trouvé. Créez-le d'abord.\")\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Next.js\r\n */\r\nasync function setupTailwindForNextJs(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Next.js...\";\r\n\r\n // Installer Tailwind v4 + PostCSS\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/postcss@latest\", \"postcss\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Créer postcss.config.mjs\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n}\r\n\r\n/**\r\n * Remplace le CSS global par le template Tailwind v4\r\n */\r\nfunction updateGlobalCss(cssPath: string, spinner: any): void {\r\n const fullPath = join(process.cwd(), cssPath);\r\n const cssTemplate = readTemplate(\"globals.css.template\");\r\n\r\n spinner.text = `Configuration de ${cssPath}...`;\r\n\r\n // Si le fichier existe, le supprimer d'abord\r\n if (existsSync(fullPath)) {\r\n unlinkSync(fullPath);\r\n spinner.text = `Suppression de l'ancien ${cssPath}...`;\r\n }\r\n\r\n // Créer le nouveau fichier avec le template\r\n writeFileSecurely(cssPath, cssTemplate, spinner);\r\n spinner.text = `✓ ${cssPath} créé avec Tailwind v4`;\r\n}\r\n\r\nasync function initProject() {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n // Vérifier si déjà initialisé\r\n if (isProjectInitialized()) {\r\n const { overwrite } = await prompts({\r\n type: \"confirm\",\r\n name: \"overwrite\",\r\n message: \"Le projet est déjà initialisé. Voulez-vous reconfigurer ?\",\r\n initial: false,\r\n });\r\n\r\n if (!overwrite) {\r\n console.log(chalk.yellow(\"\\n⚠️ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Détecter le package manager\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n // Détecter le framework\r\n const frameworkInfo = detectFramework();\r\n console.log(\r\n chalk.dim(`🔧 Framework: ${chalk.bold(frameworkInfo.framework)}\\n`)\r\n );\r\n\r\n if (frameworkInfo.framework === \"unknown\") {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ Framework non détecté. Assurez-vous d'utiliser Vite ou Next.js.\"\r\n )\r\n );\r\n const { continueAnyway } = await prompts({\r\n type: \"confirm\",\r\n name: \"continueAnyway\",\r\n message: \"Voulez-vous continuer quand même ?\",\r\n initial: false,\r\n });\r\n\r\n if (!continueAnyway) {\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n const typescriptVersion = getTypeScriptMajorVersion(\r\n frameworkInfo.typescriptVersion\r\n );\r\n let needsTypeScriptUpgrade = false;\r\n\r\n if (!frameworkInfo.typescriptVersion) {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ TypeScript n'est pas installé. behsseui nécessite TypeScript v5+.\"\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion < 5) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ TypeScript v${typescriptVersion} détecté. behsseui nécessite TypeScript v5+.`\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion >= 5) {\r\n console.log(\r\n chalk.green(\r\n `✓ TypeScript v${typescriptVersion} détecté\\n`\r\n )\r\n );\r\n }\r\n\r\n // Vérifier la version de Tailwind\r\n const tailwindVersion = getTailwindMajorVersion(\r\n frameworkInfo.tailwindVersion\r\n );\r\n if (tailwindVersion && tailwindVersion < 4) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Tailwind CSS v${tailwindVersion} détecté. behsseui nécessite Tailwind v4.`\r\n )\r\n );\r\n }\r\n\r\n // Détecter l'ancien fichier tailwind.config (Tailwind v3)\r\n const oldTailwindConfig = findTailwindConfig();\r\n if (oldTailwindConfig) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Fichier de configuration Tailwind v3 détecté: ${oldTailwindConfig}`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n \"Tailwind v4 n'utilise plus de fichier de configuration.\\n\"\r\n )\r\n );\r\n }\r\n\r\n // Questions de configuration\r\n const answers = await prompts([\r\n {\r\n type: oldTailwindConfig ? \"confirm\" : null,\r\n name: \"deleteOldTailwindConfig\",\r\n message: `Supprimer ${oldTailwindConfig} ? (Tailwind v4 n'en a plus besoin)`,\r\n initial: true,\r\n },\r\n {\r\n type: needsTypeScriptUpgrade ? \"confirm\" : null,\r\n name: \"upgradeTypeScript\",\r\n message: frameworkInfo.typescriptVersion\r\n ? `Mettre à jour TypeScript vers v5+ (actuellement v${typescriptVersion}) ?`\r\n : \"Installer TypeScript v5+ ?\",\r\n initial: true,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"Où voulez-vous installer les composants ?\",\r\n initial: \"./ui\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"text\",\r\n name: \"tailwindCss\",\r\n message: \"Chemin du fichier CSS global ?\",\r\n initial:\r\n frameworkInfo.framework === \"nextjs\"\r\n ? \"./app/globals.css\"\r\n : \"./src/index.css\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"installTailwind\",\r\n message:\r\n tailwindVersion && tailwindVersion >= 4\r\n ? \"Tailwind v4 est déjà installé. Reconfigurer ?\"\r\n : \"Installer et configurer Tailwind CSS v4 ?\",\r\n initial: !tailwindVersion || tailwindVersion < 4,\r\n },\r\n ]);\r\n\r\n if (!answers.componentsDir) {\r\n console.log(chalk.red(\"\\n❌ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${answers.componentsDir}...`;\r\n ensureDirectory(answers.componentsDir);\r\n\r\n // Supprimer l'ancien tailwind.config si l'utilisateur a accepté\r\n if (oldTailwindConfig && answers.deleteOldTailwindConfig) {\r\n spinner.text = `Suppression de ${oldTailwindConfig}...`;\r\n unlinkSync(join(process.cwd(), oldTailwindConfig));\r\n spinner.text = `✓ ${oldTailwindConfig} supprimé`;\r\n }\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(answers.componentsDir);\r\n config.tailwind.css = answers.tailwindCss;\r\n // Plus besoin de tailwind.config pour v4\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Mettre à jour TypeScript si nécessaire\r\n if (needsTypeScriptUpgrade && answers.upgradeTypeScript) {\r\n spinner.text = \"Mise à jour de TypeScript vers v5+...\";\r\n try {\r\n installDependencies([\"typescript@^5\"], packageManager, true);\r\n spinner.text = \"✓ TypeScript mis à jour\";\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\"Erreur lors de la mise à jour de TypeScript\")\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} typescript@^5\\n`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} ${REQUIRED_DEPENDENCIES.join(\" \")}\\n`\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (answers.installTailwind) {\r\n if (frameworkInfo.framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global\r\n updateGlobalCss(answers.tailwindCss, spinner);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n // Vérifier si postcss.config.mjs existe, sinon le créer\r\n const postcssConfigPath = join(process.cwd(), \"postcss.config.mjs\");\r\n if (!existsSync(postcssConfigPath)) {\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n spinner.text = \"✓ postcss.config.mjs créé\";\r\n }\r\n }\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${answers.componentsDir}/Button\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"4.\"),\r\n \"Consultez la doc:\",\r\n chalk.blue(\"https://github.com/behsse/ui\")\r\n );\r\n console.log();\r\n\r\n // Informations spécifiques au framework\r\n if (frameworkInfo.framework === \"vite\" && answers.installTailwind) {\r\n console.log(\r\n chalk.dim(\r\n `💡 Vite: Vérifiez que tailwindcss() est dans vite.config plugins`\r\n )\r\n );\r\n } else if (\r\n frameworkInfo.framework === \"nextjs\" &&\r\n answers.installTailwind\r\n ) {\r\n console.log(\r\n chalk.dim(`💡 Next.js: postcss.config.mjs a été créé automatiquement`)\r\n );\r\n }\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const init = new Command()\r\n .name(\"init\")\r\n .description(\"Initialiser behsseui dans votre projet\")\r\n .action(initProject);\r\n","import { execSync } from \"child_process\";\r\nimport { existsSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\r\n\r\n/**\r\n * Détecte le package manager utilisé dans le projet\r\n */\r\nexport function detectPackageManager(): PackageManager {\r\n const cwd = process.cwd();\r\n\r\n // Vérifier les fichiers de lock\r\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\r\n return \"pnpm\";\r\n }\r\n if (existsSync(join(cwd, \"yarn.lock\"))) {\r\n return \"yarn\";\r\n }\r\n if (existsSync(join(cwd, \"bun.lockb\"))) {\r\n return \"bun\";\r\n }\r\n if (existsSync(join(cwd, \"package-lock.json\"))) {\r\n return \"npm\";\r\n }\r\n\r\n // Par défaut, vérifier ce qui est installé globalement\r\n try {\r\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"yarn --version\", { stdio: \"ignore\" });\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"bun --version\", { stdio: \"ignore\" });\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\n/**\r\n * Installe des dépendances avec le package manager détecté\r\n */\r\nexport function installDependencies(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): void {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n let command: string;\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n command = `pnpm add ${devFlag} ${deps}`;\r\n break;\r\n case \"yarn\":\r\n command = `yarn add ${devFlag} ${deps}`;\r\n break;\r\n case \"bun\":\r\n command = `bun add ${devFlag} ${deps}`;\r\n break;\r\n case \"npm\":\r\n default:\r\n command = `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n break;\r\n }\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n}\r\n\r\n/**\r\n * Obtient la commande d'installation formatée pour affichage\r\n */\r\nexport function getInstallCommand(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): string {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n return `pnpm add ${devFlag} ${deps}`;\r\n case \"yarn\":\r\n return `yarn add ${devFlag} ${deps}`;\r\n case \"bun\":\r\n return `bun add ${devFlag} ${deps}`;\r\n case \"npm\":\r\n default:\r\n return `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport interface BehsseUIConfig {\r\n $schema?: string;\r\n componentsDir: string;\r\n libDir: string;\r\n tailwind: {\r\n config?: string; // Optional pour v4\r\n css: string;\r\n };\r\n initialized: boolean;\r\n}\r\n\r\nconst CONFIG_FILE_NAME = \"behsseui.json\";\r\n\r\n/**\r\n * Obtient le chemin du fichier de configuration\r\n */\r\nexport function getConfigPath(): string {\r\n return join(process.cwd(), CONFIG_FILE_NAME);\r\n}\r\n\r\n/**\r\n * Vérifie si le projet est initialisé\r\n */\r\nexport function isProjectInitialized(): boolean {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const config = readConfig();\r\n return config.initialized === true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Lit la configuration\r\n */\r\nexport function readConfig(): BehsseUIConfig {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n throw new Error(\"Configuration file not found. Run 'behsseui init' first.\");\r\n }\r\n\r\n const content = readFileSync(configPath, \"utf-8\");\r\n return JSON.parse(content);\r\n}\r\n\r\n/**\r\n * Écrit la configuration\r\n */\r\nexport function writeConfig(config: BehsseUIConfig): void {\r\n const configPath = getConfigPath();\r\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Crée la configuration par défaut\r\n */\r\nexport function createDefaultConfig(\r\n componentsDir = \"./ui\",\r\n libDir = \"./lib\"\r\n): BehsseUIConfig {\r\n return {\r\n $schema: \"https://behsseui.dev/schema.json\",\r\n componentsDir,\r\n libDir,\r\n tailwind: {\r\n config: \"./tailwind.config.js\",\r\n css: \"./app/globals.css\",\r\n },\r\n initialized: true,\r\n };\r\n}\r\n","import { readFileSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n/**\r\n * Lit un template depuis le dossier templates\r\n */\r\nexport function readTemplate(templateName: string): string {\r\n // Le fichier compilé est dans dist/index.js, donc __dirname pointe vers dist/\r\n // Les templates sont dans dist/templates/\r\n const templatePath = join(__dirname, \"templates\", templateName);\r\n return readFileSync(templatePath, \"utf-8\");\r\n}\r\n\r\n/**\r\n * Remplace les variables dans un template\r\n */\r\nexport function renderTemplate(\r\n template: string,\r\n variables: Record<string, string>\r\n): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(variables)) {\r\n result = result.replace(new RegExp(`{{${key}}}`, \"g\"), value);\r\n }\r\n return result;\r\n}\r\n","import { existsSync, readFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type Framework = \"nextjs\" | \"vite\" | \"unknown\";\r\n\r\nexport interface FrameworkInfo {\r\n framework: Framework;\r\n tailwindVersion: string | null;\r\n typescriptVersion: string | null;\r\n hasViteConfig: boolean;\r\n hasNextConfig: boolean;\r\n}\r\n\r\n/**\r\n * Détecte le framework utilisé dans le projet\r\n */\r\nexport function detectFramework(): FrameworkInfo {\r\n const cwd = process.cwd();\r\n const packageJsonPath = join(cwd, \"package.json\");\r\n\r\n const info: FrameworkInfo = {\r\n framework: \"unknown\",\r\n tailwindVersion: null,\r\n typescriptVersion: null,\r\n hasViteConfig: false,\r\n hasNextConfig: false,\r\n };\r\n\r\n // Vérifier les fichiers de config\r\n info.hasViteConfig =\r\n existsSync(join(cwd, \"vite.config.ts\")) ||\r\n existsSync(join(cwd, \"vite.config.js\")) ||\r\n existsSync(join(cwd, \"vite.config.mjs\"));\r\n\r\n info.hasNextConfig =\r\n existsSync(join(cwd, \"next.config.js\")) ||\r\n existsSync(join(cwd, \"next.config.mjs\")) ||\r\n existsSync(join(cwd, \"next.config.ts\"));\r\n\r\n // Lire le package.json\r\n if (!existsSync(packageJsonPath)) {\r\n return info;\r\n }\r\n\r\n try {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Vérifier la version de Tailwind\r\n if (allDeps.tailwindcss) {\r\n info.tailwindVersion = allDeps.tailwindcss;\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n if (allDeps.typescript) {\r\n info.typescriptVersion = allDeps.typescript;\r\n }\r\n\r\n // Détecter Next.js\r\n if (allDeps.next) {\r\n info.framework = \"nextjs\";\r\n return info;\r\n }\r\n\r\n // Détecter Vite\r\n if (allDeps.vite || info.hasViteConfig) {\r\n info.framework = \"vite\";\r\n return info;\r\n }\r\n } catch (error) {\r\n console.error(\"Error reading package.json:\", error);\r\n }\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de Tailwind\r\n */\r\nexport function getTailwindMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si Tailwind v4 est installé\r\n */\r\nexport function isTailwindV4(version: string | null): boolean {\r\n const major = getTailwindMajorVersion(version);\r\n return major !== null && major >= 4;\r\n}\r\n\r\n/**\r\n * Trouve le fichier vite.config\r\n */\r\nexport function findViteConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\"vite.config.ts\", \"vite.config.js\", \"vite.config.mjs\"];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Trouve le fichier tailwind.config (v3) s'il existe\r\n */\r\nexport function findTailwindConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.mjs\",\r\n \"tailwind.config.cjs\",\r\n ];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de TypeScript\r\n */\r\nexport function getTypeScriptMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si TypeScript v5+ est installé\r\n */\r\nexport function isTypeScriptV5OrHigher(version: string | null): boolean {\r\n const major = getTypeScriptMajorVersion(version);\r\n return major !== null && major >= 5;\r\n}\r\n","import { readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\n/**\r\n * Ajoute le plugin Tailwind CSS à vite.config.ts\r\n */\r\nexport function addTailwindToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si tailwindcss est déjà importé\r\n if (content.includes(\"@tailwindcss/vite\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import\r\n // Chercher la ligne d'import de 'vite' pour ajouter après\r\n const viteImportRegex = /import\\s+{[^}]+}\\s+from\\s+['\"]vite['\"]/;\r\n const match = content.match(viteImportRegex);\r\n\r\n if (match) {\r\n const importStatement = '\\nimport tailwindcss from \"@tailwindcss/vite\";';\r\n content = content.replace(\r\n viteImportRegex,\r\n match[0] + importStatement\r\n );\r\n } else {\r\n // Si pas trouvé, ajouter en haut après les imports existants\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n const firstNewline = content.indexOf(\"\\n\", firstImport);\r\n content =\r\n content.slice(0, firstNewline + 1) +\r\n 'import tailwindcss from \"@tailwindcss/vite\";\\n' +\r\n content.slice(firstNewline + 1);\r\n }\r\n }\r\n\r\n // Ajouter le plugin dans le tableau plugins\r\n // Chercher plugins: [...]\r\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/;\r\n const pluginsMatch = content.match(pluginsRegex);\r\n\r\n if (pluginsMatch) {\r\n const pluginsContent = pluginsMatch[1].trim();\r\n let newPluginsContent: string;\r\n\r\n if (pluginsContent === \"\") {\r\n // Tableau vide\r\n newPluginsContent = \"tailwindcss()\";\r\n } else {\r\n // Ajouter tailwindcss() à la fin\r\n newPluginsContent = pluginsContent + \",\\n tailwindcss()\";\r\n }\r\n\r\n content = content.replace(\r\n pluginsRegex,\r\n `plugins: [\\n ${newPluginsContent}\\n ]`\r\n );\r\n } else {\r\n // Si pas de plugins, ajouter la propriété\r\n // Chercher defineConfig({\r\n const defineConfigRegex = /defineConfig\\(\\{/;\r\n if (defineConfigRegex.test(content)) {\r\n content = content.replace(\r\n defineConfigRegex,\r\n \"defineConfig({\\n plugins: [tailwindcss()],\"\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error modifying vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport https from \"https\";\r\nimport { isProjectInitialized, readConfig } from \"../utils/config.js\";\r\n\r\n// URL du registry des composants (GitHub raw)\r\nconst REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/packages/components\";\r\n\r\n// Mapping des composants disponibles et leurs dépendances\r\nconst COMPONENTS_MAP: Record<\r\n string,\r\n { file: string; dependencies?: Array<{ file: string; subdir?: string }> }\r\n> = {\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [\r\n { file: \"internals/Slot.tsx\", subdir: \"internals\" }, // Slot doit être dans internals/\r\n ],\r\n },\r\n // Ajoutez d'autres composants ici au fur et à mesure\r\n};\r\n\r\n// Fonction pour télécharger un fichier depuis une URL\r\nfunction downloadFile(url: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n https\r\n .get(url, (res) => {\r\n if (res.statusCode !== 200) {\r\n reject(new Error(`Failed to download: ${res.statusCode}`));\r\n return;\r\n }\r\n\r\n let data = \"\";\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n res.on(\"end\", () => {\r\n resolve(data);\r\n });\r\n })\r\n .on(\"error\", reject);\r\n });\r\n}\r\n\r\nasync function addComponent(componentName: string) {\r\n // Vérifier si le projet est initialisé\r\n if (!isProjectInitialized()) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Le projet n'est pas initialisé. Exécutez d'abord 'behsseui init'.\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(`Téléchargement du composant ${componentName}...`).start();\r\n\r\n try {\r\n // Vérifier si le composant existe\r\n if (!COMPONENTS_MAP[componentName]) {\r\n spinner.fail(chalk.red(`Le composant \"${componentName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nComposants disponibles:\"),\r\n Object.keys(COMPONENTS_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const componentConfig = COMPONENTS_MAP[componentName];\r\n const config = readConfig();\r\n const targetDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le dossier principal si nécessaire\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les dépendances d'abord\r\n if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {\r\n spinner.text = `Téléchargement des dépendances...`;\r\n\r\n for (const dep of componentConfig.dependencies) {\r\n const depUrl = `${REGISTRY_URL}/${dep.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n\r\n // Créer le sous-dossier si spécifié\r\n const depTargetDir = dep.subdir\r\n ? join(targetDir, dep.subdir)\r\n : targetDir;\r\n\r\n if (!existsSync(depTargetDir)) {\r\n mkdirSync(depTargetDir, { recursive: true });\r\n }\r\n\r\n // Extraire le nom du fichier depuis le path\r\n const depFileName = dep.file.split('/').pop()!;\r\n const depTargetPath = join(depTargetDir, depFileName);\r\n writeFileSync(depTargetPath, depContent, \"utf-8\");\r\n }\r\n }\r\n\r\n // Télécharger le composant principal\r\n const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;\r\n spinner.text = `Téléchargement de ${componentName}...`;\r\n const componentContent = await downloadFile(componentUrl);\r\n\r\n // Écrire le composant principal\r\n const targetComponentPath = join(targetDir, componentConfig.file);\r\n writeFileSync(targetComponentPath, componentContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Composant ${componentName} ajouté avec succès dans ${config.componentsDir}/`\r\n )\r\n );\r\n\r\n console.log(\r\n chalk.cyan(\"\\n📦 Vous pouvez maintenant l'importer dans votre projet:\")\r\n );\r\n console.log(\r\n chalk.gray(\r\n `import { ${componentName} } from \"${config.componentsDir}/${componentConfig.file.replace(\".tsx\", \"\")}\";`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'installation du composant\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const add = new Command()\r\n .name(\"add\")\r\n .description(\"Ajouter un composant à votre projet\")\r\n .argument(\"<component>\", \"Nom du composant à ajouter\")\r\n .action(addComponent);\r\n"],"mappings":"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","names":["Command","existsSync","writeFileSync","join","dirname","existsSync","join","readFileSync","join","existsSync","readFileSync","join","existsSync","join","readFileSync","writeFileSync","join","join","existsSync","dirname","writeFileSync","Command","existsSync","mkdirSync","writeFileSync","join","chalk","ora","chalk","ora","join","existsSync","mkdirSync","writeFileSync","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/package-manager.ts","../src/utils/config.ts","../src/utils/templates.ts","../src/utils/framework.ts","../src/utils/vite-config.ts","../src/utils/tsconfig.ts","../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"behsseui\")\n .description(\"CLI pour ajouter des composants behsseui dans vos projets\")\n .version(\"0.0.2\");\n\n// Ajouter les commandes\nprogram.addCommand(init);\nprogram.addCommand(add);\n\nprogram.parse();\n","import { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { execSync } from \"child_process\";\r\nimport {\r\n detectPackageManager,\r\n installDependencies,\r\n type PackageManager,\r\n} from \"../utils/package-manager.js\";\r\nimport {\r\n createDefaultConfig,\r\n isProjectInitialized,\r\n writeConfig,\r\n} from \"../utils/config.js\";\r\nimport { readTemplate } from \"../utils/templates.js\";\r\nimport {\r\n detectFramework,\r\n getTailwindMajorVersion,\r\n getTypeScriptMajorVersion,\r\n isTypeScriptV5OrHigher,\r\n findViteConfig,\r\n findTailwindConfig,\r\n} from \"../utils/framework.js\";\r\nimport { addTailwindToViteConfig, addAliasToViteConfig } from \"../utils/vite-config.js\";\r\nimport { configureTsconfigForAlias } from \"../utils/tsconfig.js\";\r\n\r\nconst REQUIRED_DEPENDENCIES = [\r\n \"class-variance-authority\",\r\n \"clsx\",\r\n \"tailwind-merge\",\r\n];\r\n\r\n/**\r\n * Crée un dossier de manière sécurisée\r\n */\r\nfunction ensureDirectory(path: string): void {\r\n if (!path || path.trim() === \"\") {\r\n throw new Error(\"Invalid directory path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), path);\r\n if (!existsSync(fullPath)) {\r\n mkdirSync(fullPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Écrit un fichier de manière sécurisée\r\n */\r\nfunction writeFileSecurely(\r\n relativePath: string,\r\n content: string,\r\n spinner: any\r\n): void {\r\n if (!relativePath || relativePath.trim() === \"\") {\r\n throw new Error(\"Invalid file path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), relativePath);\r\n const dir = dirname(fullPath);\r\n\r\n // S'assurer que le dossier parent existe\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n spinner.text = `Fichier créé: ${relativePath}`;\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Vite\r\n */\r\nasync function setupTailwindForVite(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Vite...\";\r\n\r\n // Installer Tailwind v4 + plugin Vite\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/vite@latest\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Trouver et modifier vite.config\r\n const viteConfigPath = findViteConfig();\r\n if (viteConfigPath) {\r\n spinner.text = `Modification de ${viteConfigPath}...`;\r\n\r\n // Ajouter Tailwind\r\n const tailwindSuccess = addTailwindToViteConfig(viteConfigPath);\r\n if (tailwindSuccess) {\r\n spinner.text = `✓ ${viteConfigPath} modifié avec Tailwind`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de modifier automatiquement ${viteConfigPath}.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement:\\nimport tailwindcss from \"@tailwindcss/vite\";\\n\\nplugins: [tailwindcss()]`\r\n )\r\n );\r\n }\r\n\r\n // Ajouter l'alias @ pour les imports\r\n spinner.text = `Configuration de l'alias @ dans ${viteConfigPath}...`;\r\n const aliasSuccess = addAliasToViteConfig(viteConfigPath);\r\n if (aliasSuccess) {\r\n spinner.text = `✓ Alias @ configuré dans ${viteConfigPath}`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de configurer l'alias @ automatiquement.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement dans vite.config.ts:\\nresolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },\\n}`\r\n )\r\n );\r\n }\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Fichier vite.config non trouvé. Créez-le d'abord.\")\r\n );\r\n }\r\n\r\n // Configurer tsconfig.json pour l'alias @\r\n spinner.text = \"Configuration de tsconfig.json...\";\r\n const tsconfigPath = join(process.cwd(), \"tsconfig.json\");\r\n const tsconfigAppPath = join(process.cwd(), \"tsconfig.app.json\");\r\n\r\n // Configurer tsconfig.json (racine)\r\n const mainConfigured = configureTsconfigForAlias(tsconfigPath, false);\r\n\r\n // Configurer tsconfig.app.json (utilisé par Vite pour l'application)\r\n const appConfigured = configureTsconfigForAlias(tsconfigAppPath, true);\r\n\r\n if (mainConfigured || appConfigured) {\r\n spinner.text = \"✓ tsconfig.json configuré avec alias @\";\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Erreur lors de la configuration de tsconfig.json\")\r\n );\r\n }\r\n\r\n // Installer @types/node si pas déjà présent\r\n spinner.text = \"Vérification de @types/node...\";\r\n try {\r\n const packageJsonPath = join(process.cwd(), \"package.json\");\r\n if (existsSync(packageJsonPath)) {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const hasTypesNode =\r\n packageJson.dependencies?.[\"@types/node\"] ||\r\n packageJson.devDependencies?.[\"@types/node\"];\r\n\r\n if (!hasTypesNode) {\r\n spinner.text = \"Installation de @types/node...\";\r\n installDependencies([\"@types/node\"], packageManager, true);\r\n spinner.text = \"✓ @types/node installé\";\r\n }\r\n }\r\n } catch (error) {\r\n // Ignorer l'erreur si @types/node ne peut pas être installé\r\n }\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Next.js\r\n */\r\nasync function setupTailwindForNextJs(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Next.js...\";\r\n\r\n // Installer Tailwind v4 + PostCSS\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/postcss@latest\", \"postcss\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Créer postcss.config.mjs\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n}\r\n\r\n/**\r\n * Remplace le CSS global par le template Tailwind v4\r\n */\r\nfunction updateGlobalCss(cssPath: string, spinner: any): void {\r\n const fullPath = join(process.cwd(), cssPath);\r\n const cssTemplate = readTemplate(\"globals.css.template\");\r\n\r\n spinner.text = `Configuration de ${cssPath}...`;\r\n\r\n // Si le fichier existe, le supprimer d'abord\r\n if (existsSync(fullPath)) {\r\n unlinkSync(fullPath);\r\n spinner.text = `Suppression de l'ancien ${cssPath}...`;\r\n }\r\n\r\n // Créer le nouveau fichier avec le template\r\n writeFileSecurely(cssPath, cssTemplate, spinner);\r\n spinner.text = `✓ ${cssPath} créé avec Tailwind v4`;\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet Next.js avec TypeScript\r\n */\r\nasync function createNextJsProject(projectName: string): Promise<string> {\r\n const spinner = ora(\"Création du projet Next.js...\").start();\r\n\r\n try {\r\n spinner.text = `Création du projet Next.js: ${projectName}...`;\r\n\r\n // Créer le projet avec create-next-app en mode non-interactif avec TypeScript\r\n // --yes accepte tous les paramètres par défaut sans poser de questions\r\n execSync(\r\n `npx create-next-app@latest ${projectName} --typescript --tailwind --eslint --app --no-src-dir --turbopack --import-alias \"@/*\" --no-git --yes`,\r\n { stdio: \"inherit\" }\r\n );\r\n\r\n spinner.succeed(chalk.green(`✓ Projet Next.js \"${projectName}\" créé avec succès`));\r\n\r\n // Retourner le chemin du projet\r\n return join(process.cwd(), projectName);\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"Erreur lors de la création du projet Next.js\"));\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet Vite avec TypeScript et React\r\n */\r\nasync function createViteProject(projectName: string): Promise<string> {\r\n const spinner = ora(\"Création du projet Vite...\").start();\r\n\r\n try {\r\n spinner.text = `Création du projet Vite: ${projectName}...`;\r\n\r\n // Créer le projet avec create-vite en utilisant le template react-ts\r\n // Utiliser echo pour répondre automatiquement \"n\" (no) pour ne pas lancer le serveur de dev\r\n const isWindows = process.platform === \"win32\";\r\n const command = isWindows\r\n ? `echo n | npm create vite@latest ${projectName} -- --template react-ts`\r\n : `echo \"n\" | npm create vite@latest ${projectName} -- --template react-ts`;\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n\r\n spinner.text = \"Installation des dépendances du projet Vite...\";\r\n\r\n // Se déplacer dans le projet pour installer les dépendances\r\n const projectPath = join(process.cwd(), projectName);\r\n const packageManager = detectPackageManager();\r\n\r\n // Installer les dépendances de base\r\n if (packageManager === \"npm\") {\r\n execSync(\"npm install\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else if (packageManager === \"pnpm\") {\r\n execSync(\"pnpm install\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else {\r\n execSync(\"yarn install\", { cwd: projectPath, stdio: \"inherit\" });\r\n }\r\n\r\n // Installer @types/node pour supporter path et __dirname\r\n spinner.text = \"Installation de @types/node...\";\r\n if (packageManager === \"npm\") {\r\n execSync(\"npm install -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else if (packageManager === \"pnpm\") {\r\n execSync(\"pnpm add -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else {\r\n execSync(\"yarn add -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n }\r\n\r\n // Configurer tsconfig.json pour l'alias @\r\n spinner.text = \"Configuration de tsconfig.json...\";\r\n const tsconfigPath = join(projectPath, \"tsconfig.json\");\r\n const tsconfigAppPath = join(projectPath, \"tsconfig.app.json\");\r\n\r\n // Configurer tsconfig.json (racine)\r\n configureTsconfigForAlias(tsconfigPath, false);\r\n\r\n // Configurer tsconfig.app.json (utilisé par Vite pour l'application)\r\n configureTsconfigForAlias(tsconfigAppPath, true);\r\n\r\n spinner.text = \"✓ tsconfig.json configuré\";\r\n\r\n spinner.succeed(chalk.green(`✓ Projet Vite \"${projectName}\" créé avec succès`));\r\n\r\n // Retourner le chemin du projet\r\n return projectPath;\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"Erreur lors de la création du projet Vite\"));\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet (Next.js ou Vite) et initialise behsseui\r\n */\r\nasync function createProjectWithBehsseui(\r\n framework: \"nextjs\" | \"vite\"\r\n): Promise<void> {\r\n console.log(\r\n chalk.bold.cyan(\r\n `\\n✨ Création d'un projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"} avec behsseui\\n`\r\n )\r\n );\r\n\r\n // Demander le nom du projet\r\n const { projectName } = await prompts({\r\n type: \"text\",\r\n name: \"projectName\",\r\n message: \"Nom du projet ?\",\r\n initial: \"my-app\",\r\n validate: (value) => {\r\n if (!value || value.trim() === \"\") {\r\n return \"Le nom du projet ne peut pas être vide\";\r\n }\r\n if (existsSync(join(process.cwd(), value))) {\r\n return `Le dossier \"${value}\" existe déjà`;\r\n }\r\n return true;\r\n },\r\n });\r\n\r\n if (!projectName) {\r\n console.log(chalk.red(\"\\n❌ Création annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n let projectPath: string;\r\n\r\n try {\r\n // Créer le projet selon le framework choisi\r\n if (framework === \"nextjs\") {\r\n projectPath = await createNextJsProject(projectName);\r\n } else {\r\n projectPath = await createViteProject(projectName);\r\n }\r\n\r\n // Se déplacer dans le dossier du projet\r\n process.chdir(projectPath);\r\n\r\n console.log(chalk.dim(`\\n📂 Dossier courant: ${projectPath}\\n`));\r\n\r\n // Initialiser behsseui dans le nouveau projet avec mode automatique\r\n await initProjectAuto(framework);\r\n\r\n // Message de succès final\r\n console.log(\r\n chalk.bold.green(\r\n `\\n🎉 Projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"} avec behsseui créé avec succès!\\n`\r\n )\r\n );\r\n console.log(chalk.dim(\"Pour démarrer:\"));\r\n console.log(chalk.cyan(` cd ${projectName}`));\r\n console.log(\r\n chalk.cyan(\r\n ` ${detectPackageManager()} ${framework === \"nextjs\" ? \"dev\" : \"dev\"}`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n console.error(\r\n chalk.red(\r\n `\\n❌ Erreur lors de la création du projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"}`\r\n )\r\n );\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Initialise behsseui dans un nouveau projet créé automatiquement\r\n * (mode non-interactif avec valeurs par défaut)\r\n */\r\nasync function initProjectAuto(framework: \"nextjs\" | \"vite\"): Promise<void> {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n const componentsDir = \"./ui\";\r\n const tailwindCss =\r\n framework === \"nextjs\" ? \"./app/globals.css\" : \"./src/index.css\";\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${componentsDir}...`;\r\n ensureDirectory(componentsDir);\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(componentsDir);\r\n config.tailwind.css = tailwindCss;\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global avec le template behsseui\r\n updateGlobalCss(tailwindCss, spinner);\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${componentsDir}/Button\"`)\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function initProject() {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n // Vérifier si déjà initialisé\r\n if (isProjectInitialized()) {\r\n const { overwrite } = await prompts({\r\n type: \"confirm\",\r\n name: \"overwrite\",\r\n message: \"Le projet est déjà initialisé. Voulez-vous reconfigurer ?\",\r\n initial: false,\r\n });\r\n\r\n if (!overwrite) {\r\n console.log(chalk.yellow(\"\\n⚠️ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Détecter le package manager\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n // Détecter le framework\r\n const frameworkInfo = detectFramework();\r\n console.log(\r\n chalk.dim(`🔧 Framework: ${chalk.bold(frameworkInfo.framework)}\\n`)\r\n );\r\n\r\n if (frameworkInfo.framework === \"unknown\") {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ Framework non détecté. Assurez-vous d'utiliser Vite ou Next.js.\"\r\n )\r\n );\r\n const { continueAnyway } = await prompts({\r\n type: \"confirm\",\r\n name: \"continueAnyway\",\r\n message: \"Voulez-vous continuer quand même ?\",\r\n initial: false,\r\n });\r\n\r\n if (!continueAnyway) {\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n const typescriptVersion = getTypeScriptMajorVersion(\r\n frameworkInfo.typescriptVersion\r\n );\r\n let needsTypeScriptUpgrade = false;\r\n\r\n if (!frameworkInfo.typescriptVersion) {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ TypeScript n'est pas installé. behsseui nécessite TypeScript v5+.\"\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion < 5) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ TypeScript v${typescriptVersion} détecté. behsseui nécessite TypeScript v5+.`\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion >= 5) {\r\n console.log(\r\n chalk.green(\r\n `✓ TypeScript v${typescriptVersion} détecté\\n`\r\n )\r\n );\r\n }\r\n\r\n // Vérifier la version de Tailwind\r\n const tailwindVersion = getTailwindMajorVersion(\r\n frameworkInfo.tailwindVersion\r\n );\r\n if (tailwindVersion && tailwindVersion < 4) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Tailwind CSS v${tailwindVersion} détecté. behsseui nécessite Tailwind v4.`\r\n )\r\n );\r\n }\r\n\r\n // Détecter l'ancien fichier tailwind.config (Tailwind v3)\r\n const oldTailwindConfig = findTailwindConfig();\r\n if (oldTailwindConfig) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Fichier de configuration Tailwind v3 détecté: ${oldTailwindConfig}`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n \"Tailwind v4 n'utilise plus de fichier de configuration.\\n\"\r\n )\r\n );\r\n }\r\n\r\n // Questions de configuration\r\n const answers = await prompts([\r\n {\r\n type: oldTailwindConfig ? \"confirm\" : null,\r\n name: \"deleteOldTailwindConfig\",\r\n message: `Supprimer ${oldTailwindConfig} ? (Tailwind v4 n'en a plus besoin)`,\r\n initial: true,\r\n },\r\n {\r\n type: needsTypeScriptUpgrade ? \"confirm\" : null,\r\n name: \"upgradeTypeScript\",\r\n message: frameworkInfo.typescriptVersion\r\n ? `Mettre à jour TypeScript vers v5+ (actuellement v${typescriptVersion}) ?`\r\n : \"Installer TypeScript v5+ ?\",\r\n initial: true,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"Où voulez-vous installer les composants ?\",\r\n initial: \"./ui\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"text\",\r\n name: \"tailwindCss\",\r\n message: \"Chemin du fichier CSS global ?\",\r\n initial:\r\n frameworkInfo.framework === \"nextjs\"\r\n ? \"./app/globals.css\"\r\n : \"./src/index.css\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"installTailwind\",\r\n message:\r\n tailwindVersion && tailwindVersion >= 4\r\n ? \"Tailwind v4 est déjà installé. Reconfigurer ?\"\r\n : \"Installer et configurer Tailwind CSS v4 ?\",\r\n initial: !tailwindVersion || tailwindVersion < 4,\r\n },\r\n ]);\r\n\r\n if (!answers.componentsDir) {\r\n console.log(chalk.red(\"\\n❌ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${answers.componentsDir}...`;\r\n ensureDirectory(answers.componentsDir);\r\n\r\n // Supprimer l'ancien tailwind.config si l'utilisateur a accepté\r\n if (oldTailwindConfig && answers.deleteOldTailwindConfig) {\r\n spinner.text = `Suppression de ${oldTailwindConfig}...`;\r\n unlinkSync(join(process.cwd(), oldTailwindConfig));\r\n spinner.text = `✓ ${oldTailwindConfig} supprimé`;\r\n }\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(answers.componentsDir);\r\n config.tailwind.css = answers.tailwindCss;\r\n // Plus besoin de tailwind.config pour v4\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Mettre à jour TypeScript si nécessaire\r\n if (needsTypeScriptUpgrade && answers.upgradeTypeScript) {\r\n spinner.text = \"Mise à jour de TypeScript vers v5+...\";\r\n try {\r\n installDependencies([\"typescript@^5\"], packageManager, true);\r\n spinner.text = \"✓ TypeScript mis à jour\";\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\"Erreur lors de la mise à jour de TypeScript\")\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} typescript@^5\\n`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} ${REQUIRED_DEPENDENCIES.join(\" \")}\\n`\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (answers.installTailwind) {\r\n if (frameworkInfo.framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global\r\n updateGlobalCss(answers.tailwindCss, spinner);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n // Vérifier si postcss.config.mjs existe, sinon le créer\r\n const postcssConfigPath = join(process.cwd(), \"postcss.config.mjs\");\r\n if (!existsSync(postcssConfigPath)) {\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n spinner.text = \"✓ postcss.config.mjs créé\";\r\n }\r\n }\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${answers.componentsDir}/Button\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"4.\"),\r\n \"Consultez la doc:\",\r\n chalk.blue(\"https://github.com/behsse/ui\")\r\n );\r\n console.log();\r\n\r\n // Informations spécifiques au framework\r\n if (frameworkInfo.framework === \"vite\" && answers.installTailwind) {\r\n console.log(\r\n chalk.dim(\r\n `💡 Vite: Vérifiez que tailwindcss() est dans vite.config plugins`\r\n )\r\n );\r\n } else if (\r\n frameworkInfo.framework === \"nextjs\" &&\r\n answers.installTailwind\r\n ) {\r\n console.log(\r\n chalk.dim(`💡 Next.js: postcss.config.mjs a été créé automatiquement`)\r\n );\r\n }\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const init = new Command()\r\n .name(\"init\")\r\n .description(\"Initialiser behsseui dans votre projet\")\r\n .option(\"--nextjs\", \"Créer un nouveau projet Next.js avec behsseui\")\r\n .option(\"--vite\", \"Créer un nouveau projet Vite avec behsseui\")\r\n .action(async (options: { nextjs?: boolean; vite?: boolean }) => {\r\n // Vérifier qu'une seule option est sélectionnée\r\n if (options.nextjs && options.vite) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Erreur: Vous ne pouvez pas utiliser --nextjs et --vite en même temps\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Si --nextjs est spécifié, créer un projet Next.js\r\n if (options.nextjs) {\r\n await createProjectWithBehsseui(\"nextjs\");\r\n return;\r\n }\r\n\r\n // Si --vite est spécifié, créer un projet Vite\r\n if (options.vite) {\r\n await createProjectWithBehsseui(\"vite\");\r\n return;\r\n }\r\n\r\n // Sinon, initialiser behsseui dans le projet existant\r\n await initProject();\r\n });\r\n","import { execSync } from \"child_process\";\r\nimport { existsSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\r\n\r\n/**\r\n * Détecte le package manager utilisé dans le projet\r\n */\r\nexport function detectPackageManager(): PackageManager {\r\n const cwd = process.cwd();\r\n\r\n // Vérifier les fichiers de lock\r\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\r\n return \"pnpm\";\r\n }\r\n if (existsSync(join(cwd, \"yarn.lock\"))) {\r\n return \"yarn\";\r\n }\r\n if (existsSync(join(cwd, \"bun.lockb\"))) {\r\n return \"bun\";\r\n }\r\n if (existsSync(join(cwd, \"package-lock.json\"))) {\r\n return \"npm\";\r\n }\r\n\r\n // Par défaut, vérifier ce qui est installé globalement\r\n try {\r\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"yarn --version\", { stdio: \"ignore\" });\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"bun --version\", { stdio: \"ignore\" });\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\n/**\r\n * Installe des dépendances avec le package manager détecté\r\n */\r\nexport function installDependencies(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): void {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n let command: string;\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n command = `pnpm add ${devFlag} ${deps}`;\r\n break;\r\n case \"yarn\":\r\n command = `yarn add ${devFlag} ${deps}`;\r\n break;\r\n case \"bun\":\r\n command = `bun add ${devFlag} ${deps}`;\r\n break;\r\n case \"npm\":\r\n default:\r\n command = `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n break;\r\n }\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n}\r\n\r\n/**\r\n * Obtient la commande d'installation formatée pour affichage\r\n */\r\nexport function getInstallCommand(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): string {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n return `pnpm add ${devFlag} ${deps}`;\r\n case \"yarn\":\r\n return `yarn add ${devFlag} ${deps}`;\r\n case \"bun\":\r\n return `bun add ${devFlag} ${deps}`;\r\n case \"npm\":\r\n default:\r\n return `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport interface BehsseUIConfig {\r\n $schema?: string;\r\n componentsDir: string;\r\n libDir: string;\r\n tailwind: {\r\n config?: string; // Optional pour v4\r\n css: string;\r\n };\r\n initialized: boolean;\r\n}\r\n\r\nconst CONFIG_FILE_NAME = \"behsseui.json\";\r\n\r\n/**\r\n * Obtient le chemin du fichier de configuration\r\n */\r\nexport function getConfigPath(): string {\r\n return join(process.cwd(), CONFIG_FILE_NAME);\r\n}\r\n\r\n/**\r\n * Vérifie si le projet est initialisé\r\n */\r\nexport function isProjectInitialized(): boolean {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const config = readConfig();\r\n return config.initialized === true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Lit la configuration\r\n */\r\nexport function readConfig(): BehsseUIConfig {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n throw new Error(\"Configuration file not found. Run 'behsseui init' first.\");\r\n }\r\n\r\n const content = readFileSync(configPath, \"utf-8\");\r\n return JSON.parse(content);\r\n}\r\n\r\n/**\r\n * Écrit la configuration\r\n */\r\nexport function writeConfig(config: BehsseUIConfig): void {\r\n const configPath = getConfigPath();\r\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Crée la configuration par défaut\r\n */\r\nexport function createDefaultConfig(\r\n componentsDir = \"./ui\",\r\n libDir = \"./lib\"\r\n): BehsseUIConfig {\r\n return {\r\n $schema: \"https://behsseui.dev/schema.json\",\r\n componentsDir,\r\n libDir,\r\n tailwind: {\r\n config: \"./tailwind.config.js\",\r\n css: \"./app/globals.css\",\r\n },\r\n initialized: true,\r\n };\r\n}\r\n","import { readFileSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n/**\r\n * Lit un template depuis le dossier templates\r\n */\r\nexport function readTemplate(templateName: string): string {\r\n // Le fichier compilé est dans dist/index.js, donc __dirname pointe vers dist/\r\n // Les templates sont dans dist/templates/\r\n const templatePath = join(__dirname, \"templates\", templateName);\r\n return readFileSync(templatePath, \"utf-8\");\r\n}\r\n\r\n/**\r\n * Remplace les variables dans un template\r\n */\r\nexport function renderTemplate(\r\n template: string,\r\n variables: Record<string, string>\r\n): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(variables)) {\r\n result = result.replace(new RegExp(`{{${key}}}`, \"g\"), value);\r\n }\r\n return result;\r\n}\r\n","import { existsSync, readFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type Framework = \"nextjs\" | \"vite\" | \"unknown\";\r\n\r\nexport interface FrameworkInfo {\r\n framework: Framework;\r\n tailwindVersion: string | null;\r\n typescriptVersion: string | null;\r\n hasViteConfig: boolean;\r\n hasNextConfig: boolean;\r\n}\r\n\r\n/**\r\n * Détecte le framework utilisé dans le projet\r\n */\r\nexport function detectFramework(): FrameworkInfo {\r\n const cwd = process.cwd();\r\n const packageJsonPath = join(cwd, \"package.json\");\r\n\r\n const info: FrameworkInfo = {\r\n framework: \"unknown\",\r\n tailwindVersion: null,\r\n typescriptVersion: null,\r\n hasViteConfig: false,\r\n hasNextConfig: false,\r\n };\r\n\r\n // Vérifier les fichiers de config\r\n info.hasViteConfig =\r\n existsSync(join(cwd, \"vite.config.ts\")) ||\r\n existsSync(join(cwd, \"vite.config.js\")) ||\r\n existsSync(join(cwd, \"vite.config.mjs\"));\r\n\r\n info.hasNextConfig =\r\n existsSync(join(cwd, \"next.config.js\")) ||\r\n existsSync(join(cwd, \"next.config.mjs\")) ||\r\n existsSync(join(cwd, \"next.config.ts\"));\r\n\r\n // Lire le package.json\r\n if (!existsSync(packageJsonPath)) {\r\n return info;\r\n }\r\n\r\n try {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Vérifier la version de Tailwind\r\n if (allDeps.tailwindcss) {\r\n info.tailwindVersion = allDeps.tailwindcss;\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n if (allDeps.typescript) {\r\n info.typescriptVersion = allDeps.typescript;\r\n }\r\n\r\n // Détecter Next.js\r\n if (allDeps.next) {\r\n info.framework = \"nextjs\";\r\n return info;\r\n }\r\n\r\n // Détecter Vite\r\n if (allDeps.vite || info.hasViteConfig) {\r\n info.framework = \"vite\";\r\n return info;\r\n }\r\n } catch (error) {\r\n console.error(\"Error reading package.json:\", error);\r\n }\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de Tailwind\r\n */\r\nexport function getTailwindMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si Tailwind v4 est installé\r\n */\r\nexport function isTailwindV4(version: string | null): boolean {\r\n const major = getTailwindMajorVersion(version);\r\n return major !== null && major >= 4;\r\n}\r\n\r\n/**\r\n * Trouve le fichier vite.config\r\n */\r\nexport function findViteConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\"vite.config.ts\", \"vite.config.js\", \"vite.config.mjs\"];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Trouve le fichier tailwind.config (v3) s'il existe\r\n */\r\nexport function findTailwindConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.mjs\",\r\n \"tailwind.config.cjs\",\r\n ];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de TypeScript\r\n */\r\nexport function getTypeScriptMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si TypeScript v5+ est installé\r\n */\r\nexport function isTypeScriptV5OrHigher(version: string | null): boolean {\r\n const major = getTypeScriptMajorVersion(version);\r\n return major !== null && major >= 5;\r\n}\r\n","import { readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\n/**\r\n * Ajoute l'alias @ pour résoudre les imports depuis la racine du projet\r\n */\r\nexport function addAliasToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si l'alias @ est déjà configuré\r\n if (content.includes(\"resolve:\") && content.includes(\"alias:\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import de path si pas déjà présent\r\n if (!content.includes(\"import path from\")) {\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n content = 'import path from \"path\";\\n' + content;\r\n }\r\n }\r\n\r\n // Ajouter resolve.alias dans defineConfig\r\n const defineConfigRegex = /defineConfig\\(\\{([\\s\\S]*?)\\}\\)/;\r\n const match = content.match(defineConfigRegex);\r\n\r\n if (match) {\r\n const configContent = match[1];\r\n\r\n // Vérifier si resolve existe déjà\r\n if (configContent.includes(\"resolve:\")) {\r\n // Ajouter alias dans resolve existant (pointe vers la racine pour accéder à src/, lib/, ui/)\r\n const resolveRegex = /resolve:\\s*\\{([\\s\\S]*?)\\}/;\r\n const resolveMatch = configContent.match(resolveRegex);\r\n\r\n if (resolveMatch && !resolveMatch[1].includes(\"alias:\")) {\r\n const newResolve = `resolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },${resolveMatch[1]}\\n }`;\r\n content = content.replace(resolveRegex, newResolve);\r\n }\r\n } else {\r\n // Ajouter resolve avec alias (pointe vers la racine pour accéder à src/, lib/, ui/)\r\n const resolveConfig = '\\n resolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },\\n },';\r\n content = content.replace(\r\n defineConfigRegex,\r\n `defineConfig({${resolveConfig}${configContent}})`\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error adding alias to vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Ajoute le plugin Tailwind CSS à vite.config.ts\r\n */\r\nexport function addTailwindToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si tailwindcss est déjà importé\r\n if (content.includes(\"@tailwindcss/vite\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import\r\n // Chercher la ligne d'import de 'vite' pour ajouter après\r\n const viteImportRegex = /import\\s+{[^}]+}\\s+from\\s+['\"]vite['\"]/;\r\n const match = content.match(viteImportRegex);\r\n\r\n if (match) {\r\n const importStatement = '\\nimport tailwindcss from \"@tailwindcss/vite\";';\r\n content = content.replace(\r\n viteImportRegex,\r\n match[0] + importStatement\r\n );\r\n } else {\r\n // Si pas trouvé, ajouter en haut après les imports existants\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n const firstNewline = content.indexOf(\"\\n\", firstImport);\r\n content =\r\n content.slice(0, firstNewline + 1) +\r\n 'import tailwindcss from \"@tailwindcss/vite\";\\n' +\r\n content.slice(firstNewline + 1);\r\n }\r\n }\r\n\r\n // Ajouter le plugin dans le tableau plugins\r\n // Chercher plugins: [...]\r\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/;\r\n const pluginsMatch = content.match(pluginsRegex);\r\n\r\n if (pluginsMatch) {\r\n const pluginsContent = pluginsMatch[1].trim();\r\n let newPluginsContent: string;\r\n\r\n if (pluginsContent === \"\") {\r\n // Tableau vide\r\n newPluginsContent = \"tailwindcss()\";\r\n } else {\r\n // Ajouter tailwindcss() à la fin\r\n newPluginsContent = pluginsContent + \",\\n tailwindcss()\";\r\n }\r\n\r\n content = content.replace(\r\n pluginsRegex,\r\n `plugins: [\\n ${newPluginsContent}\\n ]`\r\n );\r\n } else {\r\n // Si pas de plugins, ajouter la propriété\r\n // Chercher defineConfig({\r\n const defineConfigRegex = /defineConfig\\(\\{/;\r\n if (defineConfigRegex.test(content)) {\r\n content = content.replace(\r\n defineConfigRegex,\r\n \"defineConfig({\\n plugins: [tailwindcss()],\"\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error modifying vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from \"fs\";\r\n\r\n/**\r\n * Supprime les commentaires d'un fichier JSON (pour supporter les tsconfig avec commentaires)\r\n */\r\nfunction stripJsonComments(jsonString: string): string {\r\n // Supprimer les commentaires // (ligne)\r\n jsonString = jsonString.replace(/\\/\\/.*$/gm, \"\");\r\n\r\n // Supprimer les commentaires /* */ (bloc)\r\n jsonString = jsonString.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\r\n\r\n // Supprimer les trailing commas avant } ou ]\r\n jsonString = jsonString.replace(/,(\\s*[}\\]])/g, \"$1\");\r\n\r\n return jsonString;\r\n}\r\n\r\n/**\r\n * Configure un fichier tsconfig.json avec l'alias @ et les includes\r\n */\r\nexport function configureTsconfigForAlias(\r\n path: string,\r\n isAppConfig: boolean = false\r\n): boolean {\r\n if (!existsSync(path)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const content = readFileSync(path, \"utf-8\");\r\n\r\n // Supprimer les commentaires avant de parser\r\n const cleanContent = stripJsonComments(content);\r\n const tsconfig = JSON.parse(cleanContent);\r\n\r\n // Ajouter compilerOptions si absent\r\n if (!tsconfig.compilerOptions) {\r\n tsconfig.compilerOptions = {};\r\n }\r\n\r\n // Ajouter baseUrl\r\n tsconfig.compilerOptions.baseUrl = \".\";\r\n\r\n // Ajouter paths pour l'alias @\r\n if (!tsconfig.compilerOptions.paths) {\r\n tsconfig.compilerOptions.paths = {};\r\n }\r\n tsconfig.compilerOptions.paths[\"@/*\"] = [\"./*\"];\r\n\r\n // Pour tsconfig.app.json, ajouter ui et lib dans include\r\n if (isAppConfig && Array.isArray(tsconfig.include)) {\r\n const includes = new Set(tsconfig.include);\r\n includes.add(\"ui\");\r\n includes.add(\"lib\");\r\n tsconfig.include = Array.from(includes);\r\n }\r\n\r\n // Écrire le fichier avec une indentation propre\r\n writeFileSync(path, JSON.stringify(tsconfig, null, 2) + \"\\n\", \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(`Error configuring ${path}:`, error);\r\n return false;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport https from \"https\";\r\nimport { isProjectInitialized, readConfig } from \"../utils/config.js\";\r\n\r\n// URL du registry des composants (GitHub raw)\r\nconst REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/packages/components\";\r\n\r\n// Mapping des composants disponibles et leurs dépendances\r\nconst COMPONENTS_MAP: Record<\r\n string,\r\n { file: string; dependencies?: Array<{ file: string; subdir?: string }> }\r\n> = {\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [\r\n { file: \"internals/Slot.tsx\", subdir: \"internals\" }, // Slot doit être dans internals/\r\n ],\r\n },\r\n // Ajoutez d'autres composants ici au fur et à mesure\r\n};\r\n\r\n// Fonction pour télécharger un fichier depuis une URL\r\nfunction downloadFile(url: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n https\r\n .get(url, (res) => {\r\n if (res.statusCode !== 200) {\r\n reject(new Error(`Failed to download: ${res.statusCode}`));\r\n return;\r\n }\r\n\r\n let data = \"\";\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n res.on(\"end\", () => {\r\n resolve(data);\r\n });\r\n })\r\n .on(\"error\", reject);\r\n });\r\n}\r\n\r\nasync function addComponent(componentName: string) {\r\n // Vérifier si le projet est initialisé\r\n if (!isProjectInitialized()) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Le projet n'est pas initialisé. Exécutez d'abord 'behsseui init'.\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(`Téléchargement du composant ${componentName}...`).start();\r\n\r\n try {\r\n // Vérifier si le composant existe\r\n if (!COMPONENTS_MAP[componentName]) {\r\n spinner.fail(chalk.red(`Le composant \"${componentName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nComposants disponibles:\"),\r\n Object.keys(COMPONENTS_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const componentConfig = COMPONENTS_MAP[componentName];\r\n const config = readConfig();\r\n const targetDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le dossier principal si nécessaire\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les dépendances d'abord\r\n if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {\r\n spinner.text = `Téléchargement des dépendances...`;\r\n\r\n for (const dep of componentConfig.dependencies) {\r\n const depUrl = `${REGISTRY_URL}/${dep.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n\r\n // Créer le sous-dossier si spécifié\r\n const depTargetDir = dep.subdir\r\n ? join(targetDir, dep.subdir)\r\n : targetDir;\r\n\r\n if (!existsSync(depTargetDir)) {\r\n mkdirSync(depTargetDir, { recursive: true });\r\n }\r\n\r\n // Extraire le nom du fichier depuis le path\r\n const depFileName = dep.file.split('/').pop()!;\r\n const depTargetPath = join(depTargetDir, depFileName);\r\n writeFileSync(depTargetPath, depContent, \"utf-8\");\r\n }\r\n }\r\n\r\n // Télécharger le composant principal\r\n const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;\r\n spinner.text = `Téléchargement de ${componentName}...`;\r\n const componentContent = await downloadFile(componentUrl);\r\n\r\n // Écrire le composant principal\r\n const targetComponentPath = join(targetDir, componentConfig.file);\r\n writeFileSync(targetComponentPath, componentContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Composant ${componentName} ajouté avec succès dans ${config.componentsDir}/`\r\n )\r\n );\r\n\r\n console.log(\r\n chalk.cyan(\"\\n📦 Vous pouvez maintenant l'importer dans votre projet:\")\r\n );\r\n console.log(\r\n chalk.gray(\r\n `import { ${componentName} } from \"${config.componentsDir}/${componentConfig.file.replace(\".tsx\", \"\")}\";`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'installation du composant\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const add = new Command()\r\n .name(\"add\")\r\n .description(\"Ajouter un composant à votre projet\")\r\n .argument(\"<component>\", \"Nom du composant à ajouter\")\r\n .action(addComponent);\r\n"],"mappings":"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","names":["Command","existsSync","writeFileSync","readFileSync","join","dirname","execSync","existsSync","join","readFileSync","join","existsSync","readFileSync","join","existsSync","join","readFileSync","writeFileSync","join","readFileSync","writeFileSync","existsSync","join","existsSync","dirname","writeFileSync","readFileSync","execSync","Command","existsSync","mkdirSync","writeFileSync","join","chalk","ora","chalk","ora","join","existsSync","mkdirSync","writeFileSync","Command","Command"]}
|
package/package.json
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "behsseui",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "CLI to add behsseui components to your projects",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"author": "Behsse",
|
|
7
|
-
"license": "MIT",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "https://github.com/behsse/ui.git"
|
|
11
|
-
},
|
|
12
|
-
"homepage": "https://github.com/behsse/ui#readme",
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/behsse/ui/issues"
|
|
15
|
-
},
|
|
16
|
-
"bin": {
|
|
17
|
-
"behsseui": "./dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"files": [
|
|
20
|
-
"dist",
|
|
21
|
-
"README.md"
|
|
22
|
-
],
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "tsup",
|
|
25
|
-
"dev": "tsup --watch",
|
|
26
|
-
"typecheck": "tsc --noEmit"
|
|
27
|
-
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"cli",
|
|
30
|
-
"components",
|
|
31
|
-
"ui"
|
|
32
|
-
],
|
|
33
|
-
"dependencies": {
|
|
34
|
-
"commander": "^12.1.0",
|
|
35
|
-
"prompts": "^2.4.2",
|
|
36
|
-
"chalk": "^5.3.0",
|
|
37
|
-
"ora": "^8.1.1",
|
|
38
|
-
"fs-extra": "^11.2.0",
|
|
39
|
-
"clsx": "^2.1.1",
|
|
40
|
-
"tailwind-merge": "^2.5.5"
|
|
41
|
-
},
|
|
42
|
-
"devDependencies": {
|
|
43
|
-
"@types/fs-extra": "^11.0.4",
|
|
44
|
-
"@types/node": "^22.10.5",
|
|
45
|
-
"@types/prompts": "^2.4.9",
|
|
46
|
-
"@types/react": "^18.3.18",
|
|
47
|
-
"react": "^18.3.1",
|
|
48
|
-
"tsup": "^8.3.5",
|
|
49
|
-
"typescript": "^5.9.3"
|
|
50
|
-
},
|
|
51
|
-
"peerDependencies": {
|
|
52
|
-
"react": "^18.0.0"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "behsseui",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "CLI to add behsseui components to your projects",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"author": "Behsse",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/behsse/ui.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/behsse/ui#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/behsse/ui/issues"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"behsseui": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"dev": "tsup --watch",
|
|
26
|
+
"typecheck": "tsc --noEmit"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"cli",
|
|
30
|
+
"components",
|
|
31
|
+
"ui"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"commander": "^12.1.0",
|
|
35
|
+
"prompts": "^2.4.2",
|
|
36
|
+
"chalk": "^5.3.0",
|
|
37
|
+
"ora": "^8.1.1",
|
|
38
|
+
"fs-extra": "^11.2.0",
|
|
39
|
+
"clsx": "^2.1.1",
|
|
40
|
+
"tailwind-merge": "^2.5.5"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/fs-extra": "^11.0.4",
|
|
44
|
+
"@types/node": "^22.10.5",
|
|
45
|
+
"@types/prompts": "^2.4.9",
|
|
46
|
+
"@types/react": "^18.3.18",
|
|
47
|
+
"react": "^18.3.1",
|
|
48
|
+
"tsup": "^8.3.5",
|
|
49
|
+
"typescript": "^5.9.3"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"react": "^18.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|