behsseui 0.0.4 → 0.0.6

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 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
@@ -2,14 +2,19 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { Command as Command3 } from "commander";
5
+ import { readFileSync as readFileSync7 } from "fs";
6
+ import { join as join8 } from "path";
7
+ import { fileURLToPath as fileURLToPath2 } from "url";
8
+ import { dirname as dirname3 } from "path";
5
9
 
6
10
  // src/commands/init.ts
7
11
  import { Command } from "commander";
8
12
  import prompts from "prompts";
9
13
  import chalk from "chalk";
10
14
  import ora from "ora";
11
- import { existsSync as existsSync4, mkdirSync, writeFileSync as writeFileSync3, unlinkSync } from "fs";
15
+ import { existsSync as existsSync5, mkdirSync, writeFileSync as writeFileSync4, readFileSync as readFileSync6, unlinkSync } from "fs";
12
16
  import { join as join6, dirname as dirname2 } from "path";
17
+ import { execSync as execSync2 } from "child_process";
13
18
 
14
19
  // src/utils/package-manager.ts
15
20
  import { execSync } from "child_process";
@@ -142,10 +147,10 @@ function detectFramework() {
142
147
  return info;
143
148
  }
144
149
  try {
145
- const packageJson = JSON.parse(readFileSync3(packageJsonPath, "utf-8"));
150
+ const packageJson2 = JSON.parse(readFileSync3(packageJsonPath, "utf-8"));
146
151
  const allDeps = {
147
- ...packageJson.dependencies,
148
- ...packageJson.devDependencies
152
+ ...packageJson2.dependencies,
153
+ ...packageJson2.devDependencies
149
154
  };
150
155
  if (allDeps.tailwindcss) {
151
156
  info.tailwindVersion = allDeps.tailwindcss;
@@ -207,6 +212,49 @@ function getTypeScriptMajorVersion(version) {
207
212
  // src/utils/vite-config.ts
208
213
  import { readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "fs";
209
214
  import { join as join5 } from "path";
215
+ function addAliasToViteConfig(configPath) {
216
+ const fullPath = join5(process.cwd(), configPath);
217
+ try {
218
+ let content = readFileSync4(fullPath, "utf-8");
219
+ if (content.includes("resolve:") && content.includes("alias:")) {
220
+ return false;
221
+ }
222
+ if (!content.includes("import path from")) {
223
+ const firstImport = content.indexOf("import");
224
+ if (firstImport !== -1) {
225
+ content = 'import path from "path";\n' + content;
226
+ }
227
+ }
228
+ const defineConfigRegex = /defineConfig\(\{([\s\S]*?)\}\)/;
229
+ const match = content.match(defineConfigRegex);
230
+ if (match) {
231
+ const configContent = match[1];
232
+ if (configContent.includes("resolve:")) {
233
+ const resolveRegex = /resolve:\s*\{([\s\S]*?)\}/;
234
+ const resolveMatch = configContent.match(resolveRegex);
235
+ if (resolveMatch && !resolveMatch[1].includes("alias:")) {
236
+ const newResolve = `resolve: {
237
+ alias: {
238
+ "@": path.resolve(__dirname, "."),
239
+ },${resolveMatch[1]}
240
+ }`;
241
+ content = content.replace(resolveRegex, newResolve);
242
+ }
243
+ } else {
244
+ const resolveConfig = '\n resolve: {\n alias: {\n "@": path.resolve(__dirname, "."),\n },\n },';
245
+ content = content.replace(
246
+ defineConfigRegex,
247
+ `defineConfig({${resolveConfig}${configContent}})`
248
+ );
249
+ }
250
+ }
251
+ writeFileSync2(fullPath, content, "utf-8");
252
+ return true;
253
+ } catch (error) {
254
+ console.error("Error adding alias to vite.config:", error);
255
+ return false;
256
+ }
257
+ }
210
258
  function addTailwindToViteConfig(configPath) {
211
259
  const fullPath = join5(process.cwd(), configPath);
212
260
  try {
@@ -262,6 +310,44 @@ function addTailwindToViteConfig(configPath) {
262
310
  }
263
311
  }
264
312
 
313
+ // src/utils/tsconfig.ts
314
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync4 } from "fs";
315
+ function stripJsonComments(jsonString) {
316
+ jsonString = jsonString.replace(/\/\/.*$/gm, "");
317
+ jsonString = jsonString.replace(/\/\*[\s\S]*?\*\//g, "");
318
+ jsonString = jsonString.replace(/,(\s*[}\]])/g, "$1");
319
+ return jsonString;
320
+ }
321
+ function configureTsconfigForAlias(path, isAppConfig = false) {
322
+ if (!existsSync4(path)) {
323
+ return false;
324
+ }
325
+ try {
326
+ const content = readFileSync5(path, "utf-8");
327
+ const cleanContent = stripJsonComments(content);
328
+ const tsconfig = JSON.parse(cleanContent);
329
+ if (!tsconfig.compilerOptions) {
330
+ tsconfig.compilerOptions = {};
331
+ }
332
+ tsconfig.compilerOptions.baseUrl = ".";
333
+ if (!tsconfig.compilerOptions.paths) {
334
+ tsconfig.compilerOptions.paths = {};
335
+ }
336
+ tsconfig.compilerOptions.paths["@/*"] = ["./*"];
337
+ if (isAppConfig && Array.isArray(tsconfig.include)) {
338
+ const includes = new Set(tsconfig.include);
339
+ includes.add("ui");
340
+ includes.add("lib");
341
+ tsconfig.include = Array.from(includes);
342
+ }
343
+ writeFileSync3(path, JSON.stringify(tsconfig, null, 2) + "\n", "utf-8");
344
+ return true;
345
+ } catch (error) {
346
+ console.error(`Error configuring ${path}:`, error);
347
+ return false;
348
+ }
349
+ }
350
+
265
351
  // src/commands/init.ts
266
352
  var REQUIRED_DEPENDENCIES = [
267
353
  "class-variance-authority",
@@ -273,7 +359,7 @@ function ensureDirectory(path) {
273
359
  throw new Error("Invalid directory path");
274
360
  }
275
361
  const fullPath = join6(process.cwd(), path);
276
- if (!existsSync4(fullPath)) {
362
+ if (!existsSync5(fullPath)) {
277
363
  mkdirSync(fullPath, { recursive: true });
278
364
  }
279
365
  }
@@ -283,10 +369,10 @@ function writeFileSecurely(relativePath, content, spinner) {
283
369
  }
284
370
  const fullPath = join6(process.cwd(), relativePath);
285
371
  const dir = dirname2(fullPath);
286
- if (!existsSync4(dir)) {
372
+ if (!existsSync5(dir)) {
287
373
  mkdirSync(dir, { recursive: true });
288
374
  }
289
- writeFileSync3(fullPath, content, "utf-8");
375
+ writeFileSync4(fullPath, content, "utf-8");
290
376
  spinner.text = `Fichier cr\xE9\xE9: ${relativePath}`;
291
377
  }
292
378
  async function setupTailwindForVite(spinner, packageManager) {
@@ -297,9 +383,9 @@ async function setupTailwindForVite(spinner, packageManager) {
297
383
  const viteConfigPath = findViteConfig();
298
384
  if (viteConfigPath) {
299
385
  spinner.text = `Modification de ${viteConfigPath}...`;
300
- const success = addTailwindToViteConfig(viteConfigPath);
301
- if (success) {
302
- spinner.text = `\u2713 ${viteConfigPath} modifi\xE9`;
386
+ const tailwindSuccess = addTailwindToViteConfig(viteConfigPath);
387
+ if (tailwindSuccess) {
388
+ spinner.text = `\u2713 ${viteConfigPath} modifi\xE9 avec Tailwind`;
303
389
  } else {
304
390
  console.log(
305
391
  chalk.yellow(
@@ -316,11 +402,59 @@ plugins: [tailwindcss()]`
316
402
  )
317
403
  );
318
404
  }
405
+ spinner.text = `Configuration de l'alias @ dans ${viteConfigPath}...`;
406
+ const aliasSuccess = addAliasToViteConfig(viteConfigPath);
407
+ if (aliasSuccess) {
408
+ spinner.text = `\u2713 Alias @ configur\xE9 dans ${viteConfigPath}`;
409
+ } else {
410
+ console.log(
411
+ chalk.yellow(
412
+ `
413
+ \u26A0\uFE0F Impossible de configurer l'alias @ automatiquement.`
414
+ )
415
+ );
416
+ console.log(
417
+ chalk.dim(
418
+ `Ajoutez manuellement dans vite.config.ts:
419
+ resolve: {
420
+ alias: {
421
+ "@": path.resolve(__dirname, "."),
422
+ },
423
+ }`
424
+ )
425
+ );
426
+ }
319
427
  } else {
320
428
  console.log(
321
429
  chalk.yellow("\n\u26A0\uFE0F Fichier vite.config non trouv\xE9. Cr\xE9ez-le d'abord.")
322
430
  );
323
431
  }
432
+ spinner.text = "Configuration de tsconfig.json...";
433
+ const tsconfigPath = join6(process.cwd(), "tsconfig.json");
434
+ const tsconfigAppPath = join6(process.cwd(), "tsconfig.app.json");
435
+ const mainConfigured = configureTsconfigForAlias(tsconfigPath, false);
436
+ const appConfigured = configureTsconfigForAlias(tsconfigAppPath, true);
437
+ if (mainConfigured || appConfigured) {
438
+ spinner.text = "\u2713 tsconfig.json configur\xE9 avec alias @";
439
+ } else {
440
+ console.log(
441
+ chalk.yellow("\n\u26A0\uFE0F Erreur lors de la configuration de tsconfig.json")
442
+ );
443
+ }
444
+ spinner.text = "V\xE9rification de @types/node...";
445
+ try {
446
+ const packageJsonPath = join6(process.cwd(), "package.json");
447
+ if (existsSync5(packageJsonPath)) {
448
+ const packageJson2 = JSON.parse(readFileSync6(packageJsonPath, "utf-8"));
449
+ const hasTypesNode = packageJson2.dependencies?.["@types/node"] || packageJson2.devDependencies?.["@types/node"];
450
+ if (!hasTypesNode) {
451
+ spinner.text = "Installation de @types/node...";
452
+ installDependencies(["@types/node"], packageManager, true);
453
+ spinner.text = "\u2713 @types/node install\xE9";
454
+ }
455
+ }
456
+ } catch (error) {
457
+ }
324
458
  }
325
459
  async function setupTailwindForNextJs(spinner, packageManager) {
326
460
  spinner.text = "Configuration de Tailwind CSS v4 pour Next.js...";
@@ -335,13 +469,194 @@ function updateGlobalCss(cssPath, spinner) {
335
469
  const fullPath = join6(process.cwd(), cssPath);
336
470
  const cssTemplate = readTemplate("globals.css.template");
337
471
  spinner.text = `Configuration de ${cssPath}...`;
338
- if (existsSync4(fullPath)) {
472
+ if (existsSync5(fullPath)) {
339
473
  unlinkSync(fullPath);
340
474
  spinner.text = `Suppression de l'ancien ${cssPath}...`;
341
475
  }
342
476
  writeFileSecurely(cssPath, cssTemplate, spinner);
343
477
  spinner.text = `\u2713 ${cssPath} cr\xE9\xE9 avec Tailwind v4`;
344
478
  }
479
+ async function createNextJsProject(projectName) {
480
+ const spinner = ora("Cr\xE9ation du projet Next.js...").start();
481
+ try {
482
+ spinner.text = `Cr\xE9ation du projet Next.js: ${projectName}...`;
483
+ execSync2(
484
+ `npx create-next-app@latest ${projectName} --typescript --tailwind --eslint --app --no-src-dir --turbopack --import-alias "@/*" --no-git --yes`,
485
+ { stdio: "inherit" }
486
+ );
487
+ spinner.succeed(chalk.green(`\u2713 Projet Next.js "${projectName}" cr\xE9\xE9 avec succ\xE8s`));
488
+ return join6(process.cwd(), projectName);
489
+ } catch (error) {
490
+ spinner.fail(chalk.red("Erreur lors de la cr\xE9ation du projet Next.js"));
491
+ throw error;
492
+ }
493
+ }
494
+ async function createViteProject(projectName) {
495
+ const spinner = ora("Cr\xE9ation du projet Vite...").start();
496
+ try {
497
+ spinner.text = `Cr\xE9ation du projet Vite: ${projectName}...`;
498
+ const isWindows = process.platform === "win32";
499
+ const command = isWindows ? `echo n | npm create vite@latest ${projectName} -- --template react-ts` : `echo "n" | npm create vite@latest ${projectName} -- --template react-ts`;
500
+ execSync2(command, { stdio: "inherit" });
501
+ spinner.text = "Installation des d\xE9pendances du projet Vite...";
502
+ const projectPath = join6(process.cwd(), projectName);
503
+ const packageManager = detectPackageManager();
504
+ if (packageManager === "npm") {
505
+ execSync2("npm install", { cwd: projectPath, stdio: "inherit" });
506
+ } else if (packageManager === "pnpm") {
507
+ execSync2("pnpm install", { cwd: projectPath, stdio: "inherit" });
508
+ } else {
509
+ execSync2("yarn install", { cwd: projectPath, stdio: "inherit" });
510
+ }
511
+ spinner.text = "Installation de @types/node...";
512
+ if (packageManager === "npm") {
513
+ execSync2("npm install -D @types/node", { cwd: projectPath, stdio: "inherit" });
514
+ } else if (packageManager === "pnpm") {
515
+ execSync2("pnpm add -D @types/node", { cwd: projectPath, stdio: "inherit" });
516
+ } else {
517
+ execSync2("yarn add -D @types/node", { cwd: projectPath, stdio: "inherit" });
518
+ }
519
+ spinner.text = "Configuration de tsconfig.json...";
520
+ const tsconfigPath = join6(projectPath, "tsconfig.json");
521
+ const tsconfigAppPath = join6(projectPath, "tsconfig.app.json");
522
+ configureTsconfigForAlias(tsconfigPath, false);
523
+ configureTsconfigForAlias(tsconfigAppPath, true);
524
+ spinner.text = "\u2713 tsconfig.json configur\xE9";
525
+ spinner.succeed(chalk.green(`\u2713 Projet Vite "${projectName}" cr\xE9\xE9 avec succ\xE8s`));
526
+ return projectPath;
527
+ } catch (error) {
528
+ spinner.fail(chalk.red("Erreur lors de la cr\xE9ation du projet Vite"));
529
+ throw error;
530
+ }
531
+ }
532
+ async function createProjectWithBehsseui(framework) {
533
+ console.log(
534
+ chalk.bold.cyan(
535
+ `
536
+ \u2728 Cr\xE9ation d'un projet ${framework === "nextjs" ? "Next.js" : "Vite"} avec behsseui
537
+ `
538
+ )
539
+ );
540
+ const { projectName } = await prompts({
541
+ type: "text",
542
+ name: "projectName",
543
+ message: "Nom du projet ?",
544
+ initial: "my-app",
545
+ validate: (value) => {
546
+ if (!value || value.trim() === "") {
547
+ return "Le nom du projet ne peut pas \xEAtre vide";
548
+ }
549
+ if (existsSync5(join6(process.cwd(), value))) {
550
+ return `Le dossier "${value}" existe d\xE9j\xE0`;
551
+ }
552
+ return true;
553
+ }
554
+ });
555
+ if (!projectName) {
556
+ console.log(chalk.red("\n\u274C Cr\xE9ation annul\xE9e."));
557
+ process.exit(0);
558
+ }
559
+ let projectPath;
560
+ try {
561
+ if (framework === "nextjs") {
562
+ projectPath = await createNextJsProject(projectName);
563
+ } else {
564
+ projectPath = await createViteProject(projectName);
565
+ }
566
+ process.chdir(projectPath);
567
+ console.log(chalk.dim(`
568
+ \u{1F4C2} Dossier courant: ${projectPath}
569
+ `));
570
+ await initProjectAuto(framework);
571
+ console.log(
572
+ chalk.bold.green(
573
+ `
574
+ \u{1F389} Projet ${framework === "nextjs" ? "Next.js" : "Vite"} avec behsseui cr\xE9\xE9 avec succ\xE8s!
575
+ `
576
+ )
577
+ );
578
+ console.log(chalk.dim("Pour d\xE9marrer:"));
579
+ console.log(chalk.cyan(` cd ${projectName}`));
580
+ console.log(
581
+ chalk.cyan(
582
+ ` ${detectPackageManager()} ${framework === "nextjs" ? "dev" : "dev"}`
583
+ )
584
+ );
585
+ console.log();
586
+ } catch (error) {
587
+ console.error(
588
+ chalk.red(
589
+ `
590
+ \u274C Erreur lors de la cr\xE9ation du projet ${framework === "nextjs" ? "Next.js" : "Vite"}`
591
+ )
592
+ );
593
+ console.error(error);
594
+ process.exit(1);
595
+ }
596
+ }
597
+ async function initProjectAuto(framework) {
598
+ console.log(chalk.bold.cyan("\n\u2728 Initialisation de behsseui\n"));
599
+ const packageManager = detectPackageManager();
600
+ console.log(
601
+ chalk.dim(`\u{1F4E6} Package manager: ${chalk.bold(packageManager)}
602
+ `)
603
+ );
604
+ const componentsDir = "./ui";
605
+ const tailwindCss = framework === "nextjs" ? "./app/globals.css" : "./src/index.css";
606
+ const spinner = ora("Configuration du projet...").start();
607
+ try {
608
+ spinner.text = `Cr\xE9ation du dossier ${componentsDir}...`;
609
+ ensureDirectory(componentsDir);
610
+ spinner.text = "Cr\xE9ation du fichier de configuration...";
611
+ const config = createDefaultConfig(componentsDir);
612
+ config.tailwind.css = tailwindCss;
613
+ delete config.tailwind.config;
614
+ writeConfig(config);
615
+ spinner.text = "Installation des d\xE9pendances...";
616
+ try {
617
+ installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);
618
+ } catch (error) {
619
+ spinner.warn(
620
+ chalk.yellow(
621
+ "Erreur lors de l'installation automatique des d\xE9pendances"
622
+ )
623
+ );
624
+ }
625
+ if (framework === "vite") {
626
+ await setupTailwindForVite(spinner, packageManager);
627
+ } else if (framework === "nextjs") {
628
+ await setupTailwindForNextJs(spinner, packageManager);
629
+ }
630
+ updateGlobalCss(tailwindCss, spinner);
631
+ spinner.text = "Cr\xE9ation du helper cn() dans lib/...";
632
+ ensureDirectory("./lib");
633
+ const utilsTemplate = readTemplate("utils.ts.template");
634
+ const utilsPath = "./lib/utils.ts";
635
+ writeFileSecurely(utilsPath, utilsTemplate, spinner);
636
+ spinner.succeed(chalk.green("\u2705 Projet initialis\xE9 avec succ\xE8s !\n"));
637
+ console.log(chalk.bold("\u{1F4CB} Prochaines \xE9tapes:\n"));
638
+ console.log(
639
+ chalk.dim("1."),
640
+ "Utilisez le helper cn():",
641
+ chalk.gray(`import { cn } from "./lib/utils"`)
642
+ );
643
+ console.log(
644
+ chalk.dim("2."),
645
+ "Ajoutez des composants:",
646
+ chalk.cyan(`${packageManager} behsseui add Button`)
647
+ );
648
+ console.log(
649
+ chalk.dim("3."),
650
+ "Importez dans votre code:",
651
+ chalk.gray(`import { Button } from "@/${componentsDir.replace("./", "")}/components/Button"`)
652
+ );
653
+ console.log();
654
+ } catch (error) {
655
+ spinner.fail(chalk.red("\u274C Erreur lors de l'initialisation"));
656
+ console.error(error);
657
+ process.exit(1);
658
+ }
659
+ }
345
660
  async function initProject() {
346
661
  console.log(chalk.bold.cyan("\n\u2728 Initialisation de behsseui\n"));
347
662
  if (isProjectInitialized()) {
@@ -529,7 +844,7 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
529
844
  updateGlobalCss(answers.tailwindCss, spinner);
530
845
  } else if (frameworkInfo.framework === "nextjs") {
531
846
  const postcssConfigPath = join6(process.cwd(), "postcss.config.mjs");
532
- if (!existsSync4(postcssConfigPath)) {
847
+ if (!existsSync5(postcssConfigPath)) {
533
848
  spinner.text = "Cr\xE9ation de postcss.config.mjs...";
534
849
  const postcssTemplate = readTemplate("postcss.config.mjs.template");
535
850
  writeFileSecurely("postcss.config.mjs", postcssTemplate, spinner);
@@ -556,7 +871,7 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
556
871
  console.log(
557
872
  chalk.dim("3."),
558
873
  "Importez dans votre code:",
559
- chalk.gray(`import { Button } from "${answers.componentsDir}/Button"`)
874
+ chalk.gray(`import { Button } from "@/${answers.componentsDir.replace("./", "")}/components/Button"`)
560
875
  );
561
876
  console.log(
562
877
  chalk.dim("4."),
@@ -582,16 +897,34 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
582
897
  process.exit(1);
583
898
  }
584
899
  }
585
- var init = new Command().name("init").description("Initialiser behsseui dans votre projet").action(initProject);
900
+ 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) => {
901
+ if (options.nextjs && options.vite) {
902
+ console.log(
903
+ chalk.red(
904
+ "\n\u274C Erreur: Vous ne pouvez pas utiliser --nextjs et --vite en m\xEAme temps"
905
+ )
906
+ );
907
+ process.exit(1);
908
+ }
909
+ if (options.nextjs) {
910
+ await createProjectWithBehsseui("nextjs");
911
+ return;
912
+ }
913
+ if (options.vite) {
914
+ await createProjectWithBehsseui("vite");
915
+ return;
916
+ }
917
+ await initProject();
918
+ });
586
919
 
587
920
  // src/commands/add.ts
588
921
  import { Command as Command2 } from "commander";
589
- import { existsSync as existsSync5, mkdirSync as mkdirSync2, writeFileSync as writeFileSync4 } from "fs";
922
+ import { existsSync as existsSync6, mkdirSync as mkdirSync2, writeFileSync as writeFileSync5 } from "fs";
590
923
  import { join as join7 } from "path";
591
924
  import chalk2 from "chalk";
592
925
  import ora2 from "ora";
593
- import https from "https";
594
- var REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/packages/components";
926
+ var COMPONENTS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components";
927
+ var ICONS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/icons";
595
928
  var COMPONENTS_MAP = {
596
929
  Button: {
597
930
  file: "Button.tsx",
@@ -602,22 +935,19 @@ var COMPONENTS_MAP = {
602
935
  }
603
936
  // Ajoutez d'autres composants ici au fur et à mesure
604
937
  };
605
- function downloadFile(url) {
606
- return new Promise((resolve, reject) => {
607
- https.get(url, (res) => {
608
- if (res.statusCode !== 200) {
609
- reject(new Error(`Failed to download: ${res.statusCode}`));
610
- return;
611
- }
612
- let data = "";
613
- res.on("data", (chunk) => {
614
- data += chunk;
615
- });
616
- res.on("end", () => {
617
- resolve(data);
618
- });
619
- }).on("error", reject);
620
- });
938
+ var ICONS_MAP = {
939
+ Close: { file: "Close.tsx" },
940
+ Github: { file: "Github.tsx" },
941
+ Search: { file: "Search.tsx" },
942
+ File: { file: "File.tsx" }
943
+ // Ajoutez d'autres icônes ici au fur et à mesure
944
+ };
945
+ async function downloadFile(url) {
946
+ const response = await fetch(url);
947
+ if (!response.ok) {
948
+ throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
949
+ }
950
+ return response.text();
621
951
  }
622
952
  async function addComponent(componentName) {
623
953
  if (!isProjectInitialized()) {
@@ -640,32 +970,33 @@ async function addComponent(componentName) {
640
970
  }
641
971
  const componentConfig = COMPONENTS_MAP[componentName];
642
972
  const config = readConfig();
643
- const targetDir = join7(process.cwd(), config.componentsDir);
644
- if (!existsSync5(targetDir)) {
645
- mkdirSync2(targetDir, { recursive: true });
973
+ const baseDir = join7(process.cwd(), config.componentsDir);
974
+ const componentsDir = join7(baseDir, "components");
975
+ if (!existsSync6(componentsDir)) {
976
+ mkdirSync2(componentsDir, { recursive: true });
646
977
  }
647
978
  if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {
648
979
  spinner.text = `T\xE9l\xE9chargement des d\xE9pendances...`;
649
980
  for (const dep of componentConfig.dependencies) {
650
- const depUrl = `${REGISTRY_URL}/${dep.file}`;
981
+ const depUrl = `${COMPONENTS_REGISTRY_URL}/${dep.file}`;
651
982
  const depContent = await downloadFile(depUrl);
652
- const depTargetDir = dep.subdir ? join7(targetDir, dep.subdir) : targetDir;
653
- if (!existsSync5(depTargetDir)) {
983
+ const depTargetDir = dep.subdir ? join7(componentsDir, dep.subdir) : componentsDir;
984
+ if (!existsSync6(depTargetDir)) {
654
985
  mkdirSync2(depTargetDir, { recursive: true });
655
986
  }
656
987
  const depFileName = dep.file.split("/").pop();
657
988
  const depTargetPath = join7(depTargetDir, depFileName);
658
- writeFileSync4(depTargetPath, depContent, "utf-8");
989
+ writeFileSync5(depTargetPath, depContent, "utf-8");
659
990
  }
660
991
  }
661
- const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;
992
+ const componentUrl = `${COMPONENTS_REGISTRY_URL}/${componentConfig.file}`;
662
993
  spinner.text = `T\xE9l\xE9chargement de ${componentName}...`;
663
994
  const componentContent = await downloadFile(componentUrl);
664
- const targetComponentPath = join7(targetDir, componentConfig.file);
665
- writeFileSync4(targetComponentPath, componentContent, "utf-8");
995
+ const targetComponentPath = join7(componentsDir, componentConfig.file);
996
+ writeFileSync5(targetComponentPath, componentContent, "utf-8");
666
997
  spinner.succeed(
667
998
  chalk2.green(
668
- `\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/`
999
+ `\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/components/`
669
1000
  )
670
1001
  );
671
1002
  console.log(
@@ -673,7 +1004,7 @@ async function addComponent(componentName) {
673
1004
  );
674
1005
  console.log(
675
1006
  chalk2.gray(
676
- `import { ${componentName} } from "${config.componentsDir}/${componentConfig.file.replace(".tsx", "")}";`
1007
+ `import { ${componentName} } from "@/${config.componentsDir.replace("./", "")}/components/${componentConfig.file.replace(".tsx", "")}";`
677
1008
  )
678
1009
  );
679
1010
  console.log();
@@ -683,11 +1014,81 @@ async function addComponent(componentName) {
683
1014
  process.exit(1);
684
1015
  }
685
1016
  }
686
- var add = new Command2().name("add").description("Ajouter un composant \xE0 votre projet").argument("<component>", "Nom du composant \xE0 ajouter").action(addComponent);
1017
+ async function addIcon(iconName) {
1018
+ if (!isProjectInitialized()) {
1019
+ console.log(
1020
+ chalk2.red(
1021
+ "\n\u274C Le projet n'est pas initialis\xE9. Ex\xE9cutez d'abord 'behsseui init'.\n"
1022
+ )
1023
+ );
1024
+ process.exit(1);
1025
+ }
1026
+ const spinner = ora2(`T\xE9l\xE9chargement de l'ic\xF4ne ${iconName}...`).start();
1027
+ try {
1028
+ if (!ICONS_MAP[iconName]) {
1029
+ spinner.fail(chalk2.red(`L'ic\xF4ne "${iconName}" n'existe pas.`));
1030
+ console.log(
1031
+ chalk2.yellow("\nIc\xF4nes disponibles:"),
1032
+ Object.keys(ICONS_MAP).join(", ")
1033
+ );
1034
+ process.exit(1);
1035
+ }
1036
+ const iconConfig = ICONS_MAP[iconName];
1037
+ const config = readConfig();
1038
+ const baseDir = join7(process.cwd(), config.componentsDir);
1039
+ const iconsDir = join7(baseDir, "icons");
1040
+ if (!existsSync6(iconsDir)) {
1041
+ mkdirSync2(iconsDir, { recursive: true });
1042
+ }
1043
+ const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;
1044
+ spinner.text = `T\xE9l\xE9chargement de ${iconName}...`;
1045
+ const iconContent = await downloadFile(iconUrl);
1046
+ const targetIconPath = join7(iconsDir, iconConfig.file);
1047
+ writeFileSync5(targetIconPath, iconContent, "utf-8");
1048
+ spinner.succeed(
1049
+ chalk2.green(
1050
+ `\u2705 Ic\xF4ne ${iconName} ajout\xE9e avec succ\xE8s dans ${config.componentsDir}/icons/`
1051
+ )
1052
+ );
1053
+ console.log(
1054
+ chalk2.cyan("\n\u{1F4E6} Vous pouvez maintenant l'importer dans votre projet:")
1055
+ );
1056
+ console.log(
1057
+ chalk2.gray(
1058
+ `import ${iconName} from "@/${config.componentsDir.replace("./", "")}/icons/${iconConfig.file.replace(".tsx", "")}";`
1059
+ )
1060
+ );
1061
+ console.log();
1062
+ } catch (error) {
1063
+ spinner.fail(chalk2.red("\u274C Erreur lors de l'installation de l'ic\xF4ne"));
1064
+ console.error(error);
1065
+ process.exit(1);
1066
+ }
1067
+ }
1068
+ var add = new Command2().name("add").description("Ajouter un composant ou une ic\xF4ne \xE0 votre projet").argument("<type>", "Type: nom du composant ou 'i' pour ic\xF4ne").argument("[name]", "Nom de l'ic\xF4ne (si type = 'i')").action((type, name) => {
1069
+ if (type === "i") {
1070
+ if (!name) {
1071
+ console.log(
1072
+ chalk2.red(
1073
+ "\n\u274C Veuillez sp\xE9cifier le nom de l'ic\xF4ne. Exemple: behsseui add i Close\n"
1074
+ )
1075
+ );
1076
+ process.exit(1);
1077
+ }
1078
+ addIcon(name);
1079
+ } else {
1080
+ addComponent(type);
1081
+ }
1082
+ });
687
1083
 
688
1084
  // src/index.ts
1085
+ var __filename2 = fileURLToPath2(import.meta.url);
1086
+ var __dirname2 = dirname3(__filename2);
1087
+ var packageJson = JSON.parse(
1088
+ readFileSync7(join8(__dirname2, "../package.json"), "utf-8")
1089
+ );
689
1090
  var program = new Command3();
690
- program.name("behsseui").description("CLI pour ajouter des composants behsseui dans vos projets").version("0.0.2");
1091
+ program.name("behsseui").description("CLI pour ajouter des composants behsseui dans vos projets").version(packageJson.version);
691
1092
  program.addCommand(init);
692
1093
  program.addCommand(add);
693
1094
  program.parse();
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 { readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\n\n// Lire la version depuis package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, \"../package.json\"), \"utf-8\")\n);\n\nconst program = new Command();\n\nprogram\n .name(\"behsseui\")\n .description(\"CLI pour ajouter des composants behsseui dans vos projets\")\n .version(packageJson.version);\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.replace(\"./\", \"\")}/components/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.replace(\"./\", \"\")}/components/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 { isProjectInitialized, readConfig } from \"../utils/config.js\";\r\n\r\n// URL du registry (GitHub raw)\r\nconst COMPONENTS_REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components\";\r\nconst ICONS_REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/icons\";\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// Mapping des icônes disponibles\r\nconst ICONS_MAP: Record<string, { file: string }> = {\r\n Close: { file: \"Close.tsx\" },\r\n Github: { file: \"Github.tsx\" },\r\n Search: { file: \"Search.tsx\" },\r\n File: { file: \"File.tsx\" },\r\n // Ajoutez d'autres icônes ici au fur et à mesure\r\n};\r\n\r\n// Fonction pour télécharger un fichier depuis une URL\r\nasync function downloadFile(url: string): Promise<string> {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to download: ${response.status} ${response.statusText}`);\r\n }\r\n return response.text();\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 baseDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le sous-dossier components/ pour les composants principaux\r\n const componentsDir = join(baseDir, \"components\");\r\n\r\n // Créer le dossier components/ si nécessaire\r\n if (!existsSync(componentsDir)) {\r\n mkdirSync(componentsDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les dépendances d'abord (elles vont dans componentsDir avec leurs sous-dossiers)\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 = `${COMPONENTS_REGISTRY_URL}/${dep.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n\r\n // Les dépendances avec subdir vont dans componentsDir/subdir (ex: ui/components/internals/)\r\n const depTargetDir = dep.subdir\r\n ? join(componentsDir, dep.subdir)\r\n : componentsDir;\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 = `${COMPONENTS_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 dans components/\r\n const targetComponentPath = join(componentsDir, 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}/components/`\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.replace(\"./\", \"\")}/components/${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\nasync function addIcon(iconName: 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 de l'icône ${iconName}...`).start();\r\n\r\n try {\r\n // Vérifier si l'icône existe\r\n if (!ICONS_MAP[iconName]) {\r\n spinner.fail(chalk.red(`L'icône \"${iconName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nIcônes disponibles:\"),\r\n Object.keys(ICONS_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const iconConfig = ICONS_MAP[iconName];\r\n const config = readConfig();\r\n const baseDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le dossier icons/ pour les icônes\r\n const iconsDir = join(baseDir, \"icons\");\r\n\r\n // Créer le dossier icons/ si nécessaire\r\n if (!existsSync(iconsDir)) {\r\n mkdirSync(iconsDir, { recursive: true });\r\n }\r\n\r\n // Télécharger l'icône\r\n const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;\r\n spinner.text = `Téléchargement de ${iconName}...`;\r\n const iconContent = await downloadFile(iconUrl);\r\n\r\n // Écrire l'icône dans icons/\r\n const targetIconPath = join(iconsDir, iconConfig.file);\r\n writeFileSync(targetIconPath, iconContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Icône ${iconName} ajoutée avec succès dans ${config.componentsDir}/icons/`\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 ${iconName} from \"@/${config.componentsDir.replace(\"./\", \"\")}/icons/${iconConfig.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 de l'icône\"));\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 ou une icône à votre projet\")\r\n .argument(\"<type>\", \"Type: nom du composant ou 'i' pour icône\")\r\n .argument(\"[name]\", \"Nom de l'icône (si type = 'i')\")\r\n .action((type: string, name?: string) => {\r\n // Si le premier argument est \"i\", c'est une icône\r\n if (type === \"i\") {\r\n if (!name) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Veuillez spécifier le nom de l'icône. Exemple: behsseui add i Close\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n addIcon(name);\r\n } else {\r\n // Sinon, c'est un composant\r\n addComponent(type);\r\n }\r\n });\r\n"],"mappings":"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","names":["Command","readFileSync","join","fileURLToPath","dirname","existsSync","writeFileSync","readFileSync","join","dirname","execSync","existsSync","join","readFileSync","join","existsSync","readFileSync","join","packageJson","existsSync","join","readFileSync","writeFileSync","join","readFileSync","writeFileSync","existsSync","join","existsSync","dirname","writeFileSync","packageJson","readFileSync","execSync","Command","existsSync","mkdirSync","writeFileSync","join","chalk","ora","chalk","ora","join","existsSync","mkdirSync","writeFileSync","Command","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","Command"]}
package/package.json CHANGED
@@ -1,54 +1,47 @@
1
- {
2
- "name": "behsseui",
3
- "version": "0.0.4",
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.6",
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
+ "chalk": "^5.3.0",
35
+ "commander": "^12.1.0",
36
+ "fs-extra": "^11.2.0",
37
+ "ora": "^8.1.1",
38
+ "prompts": "^2.4.2"
39
+ },
40
+ "devDependencies": {
41
+ "@types/fs-extra": "^11.0.4",
42
+ "@types/node": "^22.10.5",
43
+ "@types/prompts": "^2.4.9",
44
+ "tsup": "^8.3.5",
45
+ "typescript": "^5.9.3"
46
+ }
47
+ }