behsseui 0.0.7 → 0.1.0

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/dist/index.js CHANGED
@@ -925,6 +925,7 @@ import chalk2 from "chalk";
925
925
  import ora2 from "ora";
926
926
  var COMPONENTS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components";
927
927
  var ICONS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/icons";
928
+ var SLICES_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components/slices";
928
929
  var COMPONENTS_MAP = {
929
930
  Accordion: { file: "Accordion.tsx" },
930
931
  Alert: {
@@ -1001,6 +1002,17 @@ var ICONS_MAP = {
1001
1002
  Tablet: { file: "Tablet.tsx" },
1002
1003
  Terminal: { file: "Terminal.tsx" }
1003
1004
  };
1005
+ var SLICES_MAP = {
1006
+ Navbar01: { sourceFile: "Navbar01.tsx", outputName: "Navbar", icons: ["Menu", "Close"], dependencies: ["Button"] },
1007
+ Navbar02: { sourceFile: "Navbar02.tsx", outputName: "Navbar", icons: ["Menu", "Close"], dependencies: ["Button", "Input"] },
1008
+ Hero01: { sourceFile: "Hero01.tsx", outputName: "Hero", dependencies: ["Button", "Badge"] },
1009
+ Hero02: { sourceFile: "Hero02.tsx", outputName: "Hero", dependencies: ["Button", "Input"] },
1010
+ Pricing01: { sourceFile: "Pricing01.tsx", outputName: "Pricing", dependencies: ["Button", "Badge", "Card"], icons: ["Check"] },
1011
+ Pricing02: { sourceFile: "Pricing02.tsx", outputName: "Pricing", dependencies: ["Button", "Badge", "Card"], icons: ["Check"] },
1012
+ Pricing03: { sourceFile: "Pricing03.tsx", outputName: "Pricing", dependencies: ["Button", "Badge", "Card"], icons: ["Check"] },
1013
+ Footer01: { sourceFile: "Footer01.tsx", outputName: "Footer" },
1014
+ Footer02: { sourceFile: "Footer02.tsx", outputName: "Footer", dependencies: ["Button", "Input"] }
1015
+ };
1004
1016
  async function downloadFile(url) {
1005
1017
  const response = await fetch(url);
1006
1018
  if (!response.ok) {
@@ -1096,6 +1108,139 @@ async function addComponent(componentName) {
1096
1108
  process.exit(1);
1097
1109
  }
1098
1110
  }
1111
+ async function addSlice(sliceName) {
1112
+ if (!isProjectInitialized()) {
1113
+ console.log(
1114
+ chalk2.red(
1115
+ "\n\u274C Le projet n'est pas initialis\xE9. Ex\xE9cutez d'abord 'behsseui init'.\n"
1116
+ )
1117
+ );
1118
+ process.exit(1);
1119
+ }
1120
+ const spinner = ora2(`T\xE9l\xE9chargement de la slice ${sliceName}...`).start();
1121
+ try {
1122
+ if (!SLICES_MAP[sliceName]) {
1123
+ spinner.fail(chalk2.red(`La slice "${sliceName}" n'existe pas.`));
1124
+ console.log(
1125
+ chalk2.yellow("\nSlices disponibles:"),
1126
+ Object.keys(SLICES_MAP).join(", ")
1127
+ );
1128
+ process.exit(1);
1129
+ }
1130
+ const sliceConfig = SLICES_MAP[sliceName];
1131
+ const config = readConfig();
1132
+ const baseDir = join7(process.cwd(), config.componentsDir);
1133
+ const slicesDir = join7(baseDir, "slices");
1134
+ if (!existsSync6(slicesDir)) {
1135
+ mkdirSync2(slicesDir, { recursive: true });
1136
+ }
1137
+ if (sliceConfig.dependencies && sliceConfig.dependencies.length > 0) {
1138
+ spinner.text = `T\xE9l\xE9chargement des composants d\xE9pendants...`;
1139
+ const componentsDir = join7(baseDir, "components");
1140
+ if (!existsSync6(componentsDir)) {
1141
+ mkdirSync2(componentsDir, { recursive: true });
1142
+ }
1143
+ for (const depName of sliceConfig.dependencies) {
1144
+ if (COMPONENTS_MAP[depName]) {
1145
+ const depConfig = COMPONENTS_MAP[depName];
1146
+ const depUrl = `${COMPONENTS_REGISTRY_URL}/${depConfig.file}`;
1147
+ const depContent = await downloadFile(depUrl);
1148
+ const depPath = join7(componentsDir, depConfig.file);
1149
+ if (!existsSync6(depPath)) {
1150
+ writeFileSync5(depPath, depContent, "utf-8");
1151
+ }
1152
+ if (depConfig.dependencies && depConfig.dependencies.length > 0) {
1153
+ for (const subDep of depConfig.dependencies) {
1154
+ const subDepUrl = `${COMPONENTS_REGISTRY_URL}/${subDep.file}`;
1155
+ const subDepContent = await downloadFile(subDepUrl);
1156
+ const subDepTargetDir = subDep.subdir ? join7(componentsDir, subDep.subdir) : componentsDir;
1157
+ if (!existsSync6(subDepTargetDir)) {
1158
+ mkdirSync2(subDepTargetDir, { recursive: true });
1159
+ }
1160
+ const subDepFileName = subDep.file.split("/").pop();
1161
+ const subDepPath = join7(subDepTargetDir, subDepFileName);
1162
+ if (!existsSync6(subDepPath)) {
1163
+ writeFileSync5(subDepPath, subDepContent, "utf-8");
1164
+ }
1165
+ }
1166
+ }
1167
+ if (depConfig.icons && depConfig.icons.length > 0) {
1168
+ const iconsDir = join7(baseDir, "icons");
1169
+ if (!existsSync6(iconsDir)) {
1170
+ mkdirSync2(iconsDir, { recursive: true });
1171
+ }
1172
+ for (const iconName of depConfig.icons) {
1173
+ const iconConfig = ICONS_MAP[iconName];
1174
+ if (iconConfig) {
1175
+ const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;
1176
+ const iconContent = await downloadFile(iconUrl);
1177
+ const iconTargetPath = join7(iconsDir, iconConfig.file);
1178
+ if (!existsSync6(iconTargetPath)) {
1179
+ writeFileSync5(iconTargetPath, iconContent, "utf-8");
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+ }
1185
+ }
1186
+ }
1187
+ if (sliceConfig.icons && sliceConfig.icons.length > 0) {
1188
+ const iconsDir = join7(baseDir, "icons");
1189
+ if (!existsSync6(iconsDir)) {
1190
+ mkdirSync2(iconsDir, { recursive: true });
1191
+ }
1192
+ spinner.text = `T\xE9l\xE9chargement des ic\xF4nes d\xE9pendantes...`;
1193
+ for (const iconName of sliceConfig.icons) {
1194
+ const iconConfig = ICONS_MAP[iconName];
1195
+ if (iconConfig) {
1196
+ const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;
1197
+ const iconContent = await downloadFile(iconUrl);
1198
+ const iconTargetPath = join7(iconsDir, iconConfig.file);
1199
+ if (!existsSync6(iconTargetPath)) {
1200
+ writeFileSync5(iconTargetPath, iconContent, "utf-8");
1201
+ }
1202
+ }
1203
+ }
1204
+ }
1205
+ const sliceUrl = `${SLICES_REGISTRY_URL}/${sliceConfig.sourceFile}`;
1206
+ spinner.text = `T\xE9l\xE9chargement de ${sliceName}...`;
1207
+ let sliceContent = await downloadFile(sliceUrl);
1208
+ sliceContent = sliceContent.replace(
1209
+ `export function ${sliceName}`,
1210
+ `export function ${sliceConfig.outputName}`
1211
+ );
1212
+ const targetPath = join7(slicesDir, `${sliceConfig.outputName}.tsx`);
1213
+ writeFileSync5(targetPath, sliceContent, "utf-8");
1214
+ spinner.succeed(
1215
+ chalk2.green(
1216
+ `\u2705 Slice ${sliceName} ajout\xE9e en tant que ${sliceConfig.outputName} dans ${config.componentsDir}/slices/`
1217
+ )
1218
+ );
1219
+ if (sliceConfig.dependencies && sliceConfig.dependencies.length > 0) {
1220
+ console.log(
1221
+ chalk2.gray(` Composants install\xE9s: ${sliceConfig.dependencies.join(", ")}`)
1222
+ );
1223
+ }
1224
+ if (sliceConfig.icons && sliceConfig.icons.length > 0) {
1225
+ console.log(
1226
+ chalk2.gray(` Ic\xF4nes install\xE9es: ${sliceConfig.icons.join(", ")}`)
1227
+ );
1228
+ }
1229
+ console.log(
1230
+ chalk2.cyan("\n\u{1F4E6} Vous pouvez maintenant l'importer dans votre projet:")
1231
+ );
1232
+ console.log(
1233
+ chalk2.gray(
1234
+ `import { ${sliceConfig.outputName} } from "@/${config.componentsDir.replace("./", "")}/slices/${sliceConfig.outputName}";`
1235
+ )
1236
+ );
1237
+ console.log();
1238
+ } catch (error) {
1239
+ spinner.fail(chalk2.red("\u274C Erreur lors de l'installation de la slice"));
1240
+ console.error(error);
1241
+ process.exit(1);
1242
+ }
1243
+ }
1099
1244
  async function addIcon(iconName) {
1100
1245
  if (!isProjectInitialized()) {
1101
1246
  console.log(
@@ -1147,7 +1292,7 @@ async function addIcon(iconName) {
1147
1292
  process.exit(1);
1148
1293
  }
1149
1294
  }
1150
- 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) => {
1295
+ var add = new Command2().name("add").description("Ajouter un composant, une ic\xF4ne ou une slice \xE0 votre projet").argument("<type>", "Type: nom du composant, 'i' pour ic\xF4ne, ou 'slices/NomSlice'").argument("[name]", "Nom de l'ic\xF4ne (si type = 'i')").action((type, name) => {
1151
1296
  if (type === "i") {
1152
1297
  if (!name) {
1153
1298
  console.log(
@@ -1158,6 +1303,17 @@ var add = new Command2().name("add").description("Ajouter un composant ou une ic
1158
1303
  process.exit(1);
1159
1304
  }
1160
1305
  addIcon(name);
1306
+ } else if (type.startsWith("slices/")) {
1307
+ const sliceName = type.replace("slices/", "");
1308
+ if (!sliceName) {
1309
+ console.log(
1310
+ chalk2.red(
1311
+ "\n\u274C Veuillez sp\xE9cifier le nom de la slice. Exemple: behsseui add slices/Navbar01\n"
1312
+ )
1313
+ );
1314
+ process.exit(1);
1315
+ }
1316
+ addSlice(sliceName);
1161
1317
  } else {
1162
1318
  addComponent(type);
1163
1319
  }
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/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 {\r\n file: string;\r\n dependencies?: Array<{ file: string; subdir?: string }>;\r\n icons?: string[];\r\n }\r\n> = {\r\n Accordion: { file: \"Accordion.tsx\" },\r\n Alert: {\r\n file: \"Alert.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n AlertDialog: { file: \"AlertDialog.tsx\" },\r\n Avatar: { file: \"Avatar.tsx\" },\r\n Badge: {\r\n file: \"Badge.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n Breadcrumb: {\r\n file: \"Breadcrumb.tsx\",\r\n icons: [\"ChevronRight\"],\r\n },\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n Calendar: {\r\n file: \"Calendar.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Card: { file: \"Card.tsx\" },\r\n Carousel: {\r\n file: \"Carousel.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Checkbox: {\r\n file: \"Checkbox.tsx\",\r\n icons: [\"Check\"],\r\n },\r\n Dialog: {\r\n file: \"Dialog.tsx\",\r\n icons: [\"Close\"],\r\n },\r\n Drawer: { file: \"Drawer.tsx\" },\r\n DropdownMenu: {\r\n file: \"DropdownMenu.tsx\",\r\n icons: [\"ChevronRight\"],\r\n },\r\n HoverCard: { file: \"HoverCard.tsx\" },\r\n Input: { file: \"Input.tsx\" },\r\n InputOTP: { file: \"InputOTP.tsx\" },\r\n Pagination: {\r\n file: \"Pagination.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Progress: { file: \"Progress.tsx\" },\r\n Select: {\r\n file: \"Select.tsx\",\r\n icons: [\"ChevronDown\", \"Check\"],\r\n },\r\n};\r\n\r\n// Mapping des icônes disponibles\r\nconst ICONS_MAP: Record<string, { file: string }> = {\r\n AlertCircle: { file: \"AlertCircle.tsx\" },\r\n AlertTriangle: { file: \"AlertTriangle.tsx\" },\r\n ArrowUpRight: { file: \"ArrowUpRight.tsx\" },\r\n Check: { file: \"Check.tsx\" },\r\n CheckCircle: { file: \"CheckCircle.tsx\" },\r\n ChevronDown: { file: \"ChevronDown.tsx\" },\r\n ChevronLeft: { file: \"ChevronLeft.tsx\" },\r\n ChevronRight: { file: \"ChevronRight.tsx\" },\r\n Close: { file: \"Close.tsx\" },\r\n Copy: { file: \"Copy.tsx\" },\r\n File: { file: \"File.tsx\" },\r\n Github: { file: \"Github.tsx\" },\r\n Info: { file: \"Info.tsx\" },\r\n Menu: { file: \"Menu.tsx\" },\r\n Monitor: { file: \"Monitor.tsx\" },\r\n Search: { file: \"Search.tsx\" },\r\n Smartphone: { file: \"Smartphone.tsx\" },\r\n Tablet: { file: \"Tablet.tsx\" },\r\n Terminal: { file: \"Terminal.tsx\" },\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 les icônes dépendantes\r\n if (componentConfig.icons && componentConfig.icons.length > 0) {\r\n const iconsDir = join(baseDir, \"icons\");\r\n if (!existsSync(iconsDir)) {\r\n mkdirSync(iconsDir, { recursive: true });\r\n }\r\n\r\n spinner.text = `Téléchargement des icônes dépendantes...`;\r\n\r\n for (const iconName of componentConfig.icons) {\r\n const iconConfig = ICONS_MAP[iconName];\r\n if (iconConfig) {\r\n const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;\r\n const iconContent = await downloadFile(iconUrl);\r\n const iconTargetPath = join(iconsDir, iconConfig.file);\r\n\r\n if (!existsSync(iconTargetPath)) {\r\n writeFileSync(iconTargetPath, iconContent, \"utf-8\");\r\n }\r\n }\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 if (componentConfig.icons && componentConfig.icons.length > 0) {\r\n console.log(\r\n chalk.gray(` Icônes installées: ${componentConfig.icons.join(\", \")}`)\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"]}
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\nconst SLICES_REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components/slices\";\r\n\r\n// Mapping des composants disponibles et leurs dépendances\r\nconst COMPONENTS_MAP: Record<\r\n string,\r\n {\r\n file: string;\r\n dependencies?: Array<{ file: string; subdir?: string }>;\r\n icons?: string[];\r\n }\r\n> = {\r\n Accordion: { file: \"Accordion.tsx\" },\r\n Alert: {\r\n file: \"Alert.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n AlertDialog: { file: \"AlertDialog.tsx\" },\r\n Avatar: { file: \"Avatar.tsx\" },\r\n Badge: {\r\n file: \"Badge.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n Breadcrumb: {\r\n file: \"Breadcrumb.tsx\",\r\n icons: [\"ChevronRight\"],\r\n },\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [{ file: \"internals/Slot.tsx\", subdir: \"internals\" }],\r\n },\r\n Calendar: {\r\n file: \"Calendar.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Card: { file: \"Card.tsx\" },\r\n Carousel: {\r\n file: \"Carousel.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Checkbox: {\r\n file: \"Checkbox.tsx\",\r\n icons: [\"Check\"],\r\n },\r\n Dialog: {\r\n file: \"Dialog.tsx\",\r\n icons: [\"Close\"],\r\n },\r\n Drawer: { file: \"Drawer.tsx\" },\r\n DropdownMenu: {\r\n file: \"DropdownMenu.tsx\",\r\n icons: [\"ChevronRight\"],\r\n },\r\n HoverCard: { file: \"HoverCard.tsx\" },\r\n Input: { file: \"Input.tsx\" },\r\n InputOTP: { file: \"InputOTP.tsx\" },\r\n Pagination: {\r\n file: \"Pagination.tsx\",\r\n icons: [\"ChevronLeft\", \"ChevronRight\"],\r\n },\r\n Progress: { file: \"Progress.tsx\" },\r\n Select: {\r\n file: \"Select.tsx\",\r\n icons: [\"ChevronDown\", \"Check\"],\r\n },\r\n};\r\n\r\n// Mapping des icônes disponibles\r\nconst ICONS_MAP: Record<string, { file: string }> = {\r\n AlertCircle: { file: \"AlertCircle.tsx\" },\r\n AlertTriangle: { file: \"AlertTriangle.tsx\" },\r\n ArrowUpRight: { file: \"ArrowUpRight.tsx\" },\r\n Check: { file: \"Check.tsx\" },\r\n CheckCircle: { file: \"CheckCircle.tsx\" },\r\n ChevronDown: { file: \"ChevronDown.tsx\" },\r\n ChevronLeft: { file: \"ChevronLeft.tsx\" },\r\n ChevronRight: { file: \"ChevronRight.tsx\" },\r\n Close: { file: \"Close.tsx\" },\r\n Copy: { file: \"Copy.tsx\" },\r\n File: { file: \"File.tsx\" },\r\n Github: { file: \"Github.tsx\" },\r\n Info: { file: \"Info.tsx\" },\r\n Menu: { file: \"Menu.tsx\" },\r\n Monitor: { file: \"Monitor.tsx\" },\r\n Search: { file: \"Search.tsx\" },\r\n Smartphone: { file: \"Smartphone.tsx\" },\r\n Tablet: { file: \"Tablet.tsx\" },\r\n Terminal: { file: \"Terminal.tsx\" },\r\n};\r\n\r\n// Mapping des slices disponibles\r\n// Clé = ce que l'utilisateur tape (ex: Navbar01), outputName = nom générique dans le projet\r\nconst SLICES_MAP: Record<\r\n string,\r\n { sourceFile: string; outputName: string; icons?: string[]; dependencies?: string[] }\r\n> = {\r\n Navbar01: { sourceFile: \"Navbar01.tsx\", outputName: \"Navbar\", icons: [\"Menu\", \"Close\"], dependencies: [\"Button\"] },\r\n Navbar02: { sourceFile: \"Navbar02.tsx\", outputName: \"Navbar\", icons: [\"Menu\", \"Close\"], dependencies: [\"Button\", \"Input\"] },\r\n Hero01: { sourceFile: \"Hero01.tsx\", outputName: \"Hero\", dependencies: [\"Button\", \"Badge\"] },\r\n Hero02: { sourceFile: \"Hero02.tsx\", outputName: \"Hero\", dependencies: [\"Button\", \"Input\"] },\r\n Pricing01: { sourceFile: \"Pricing01.tsx\", outputName: \"Pricing\", dependencies: [\"Button\", \"Badge\", \"Card\"], icons: [\"Check\"] },\r\n Pricing02: { sourceFile: \"Pricing02.tsx\", outputName: \"Pricing\", dependencies: [\"Button\", \"Badge\", \"Card\"], icons: [\"Check\"] },\r\n Pricing03: { sourceFile: \"Pricing03.tsx\", outputName: \"Pricing\", dependencies: [\"Button\", \"Badge\", \"Card\"], icons: [\"Check\"] },\r\n Footer01: { sourceFile: \"Footer01.tsx\", outputName: \"Footer\" },\r\n Footer02: { sourceFile: \"Footer02.tsx\", outputName: \"Footer\", dependencies: [\"Button\", \"Input\"] },\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 les icônes dépendantes\r\n if (componentConfig.icons && componentConfig.icons.length > 0) {\r\n const iconsDir = join(baseDir, \"icons\");\r\n if (!existsSync(iconsDir)) {\r\n mkdirSync(iconsDir, { recursive: true });\r\n }\r\n\r\n spinner.text = `Téléchargement des icônes dépendantes...`;\r\n\r\n for (const iconName of componentConfig.icons) {\r\n const iconConfig = ICONS_MAP[iconName];\r\n if (iconConfig) {\r\n const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;\r\n const iconContent = await downloadFile(iconUrl);\r\n const iconTargetPath = join(iconsDir, iconConfig.file);\r\n\r\n if (!existsSync(iconTargetPath)) {\r\n writeFileSync(iconTargetPath, iconContent, \"utf-8\");\r\n }\r\n }\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 if (componentConfig.icons && componentConfig.icons.length > 0) {\r\n console.log(\r\n chalk.gray(` Icônes installées: ${componentConfig.icons.join(\", \")}`)\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 addSlice(sliceName: string) {\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 la slice ${sliceName}...`).start();\r\n\r\n try {\r\n if (!SLICES_MAP[sliceName]) {\r\n spinner.fail(chalk.red(`La slice \"${sliceName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nSlices disponibles:\"),\r\n Object.keys(SLICES_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const sliceConfig = SLICES_MAP[sliceName];\r\n const config = readConfig();\r\n const baseDir = join(process.cwd(), config.componentsDir);\r\n const slicesDir = join(baseDir, \"slices\");\r\n\r\n if (!existsSync(slicesDir)) {\r\n mkdirSync(slicesDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les composants dépendants (Button, Input, Badge, etc.)\r\n if (sliceConfig.dependencies && sliceConfig.dependencies.length > 0) {\r\n spinner.text = `Téléchargement des composants dépendants...`;\r\n const componentsDir = join(baseDir, \"components\");\r\n if (!existsSync(componentsDir)) {\r\n mkdirSync(componentsDir, { recursive: true });\r\n }\r\n\r\n for (const depName of sliceConfig.dependencies) {\r\n if (COMPONENTS_MAP[depName]) {\r\n const depConfig = COMPONENTS_MAP[depName];\r\n\r\n // Télécharger le composant principal\r\n const depUrl = `${COMPONENTS_REGISTRY_URL}/${depConfig.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n const depPath = join(componentsDir, depConfig.file);\r\n if (!existsSync(depPath)) {\r\n writeFileSync(depPath, depContent, \"utf-8\");\r\n }\r\n\r\n // Télécharger les sous-dépendances du composant (ex: internals/Slot.tsx)\r\n if (depConfig.dependencies && depConfig.dependencies.length > 0) {\r\n for (const subDep of depConfig.dependencies) {\r\n const subDepUrl = `${COMPONENTS_REGISTRY_URL}/${subDep.file}`;\r\n const subDepContent = await downloadFile(subDepUrl);\r\n const subDepTargetDir = subDep.subdir\r\n ? join(componentsDir, subDep.subdir)\r\n : componentsDir;\r\n if (!existsSync(subDepTargetDir)) {\r\n mkdirSync(subDepTargetDir, { recursive: true });\r\n }\r\n const subDepFileName = subDep.file.split('/').pop()!;\r\n const subDepPath = join(subDepTargetDir, subDepFileName);\r\n if (!existsSync(subDepPath)) {\r\n writeFileSync(subDepPath, subDepContent, \"utf-8\");\r\n }\r\n }\r\n }\r\n\r\n // Télécharger les icônes du composant dépendant\r\n if (depConfig.icons && depConfig.icons.length > 0) {\r\n const iconsDir = join(baseDir, \"icons\");\r\n if (!existsSync(iconsDir)) {\r\n mkdirSync(iconsDir, { recursive: true });\r\n }\r\n for (const iconName of depConfig.icons) {\r\n const iconConfig = ICONS_MAP[iconName];\r\n if (iconConfig) {\r\n const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;\r\n const iconContent = await downloadFile(iconUrl);\r\n const iconTargetPath = join(iconsDir, iconConfig.file);\r\n if (!existsSync(iconTargetPath)) {\r\n writeFileSync(iconTargetPath, iconContent, \"utf-8\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Télécharger les icônes dépendantes\r\n if (sliceConfig.icons && sliceConfig.icons.length > 0) {\r\n const iconsDir = join(baseDir, \"icons\");\r\n if (!existsSync(iconsDir)) {\r\n mkdirSync(iconsDir, { recursive: true });\r\n }\r\n\r\n spinner.text = `Téléchargement des icônes dépendantes...`;\r\n for (const iconName of sliceConfig.icons) {\r\n const iconConfig = ICONS_MAP[iconName];\r\n if (iconConfig) {\r\n const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;\r\n const iconContent = await downloadFile(iconUrl);\r\n const iconTargetPath = join(iconsDir, iconConfig.file);\r\n if (!existsSync(iconTargetPath)) {\r\n writeFileSync(iconTargetPath, iconContent, \"utf-8\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Télécharger la slice\r\n const sliceUrl = `${SLICES_REGISTRY_URL}/${sliceConfig.sourceFile}`;\r\n spinner.text = `Téléchargement de ${sliceName}...`;\r\n let sliceContent = await downloadFile(sliceUrl);\r\n\r\n // Renommer l'export : \"export function Navbar01\" -> \"export function Navbar\"\r\n sliceContent = sliceContent.replace(\r\n `export function ${sliceName}`,\r\n `export function ${sliceConfig.outputName}`\r\n );\r\n\r\n // Sauvegarder avec le nom générique\r\n const targetPath = join(slicesDir, `${sliceConfig.outputName}.tsx`);\r\n writeFileSync(targetPath, sliceContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Slice ${sliceName} ajoutée en tant que ${sliceConfig.outputName} dans ${config.componentsDir}/slices/`\r\n )\r\n );\r\n\r\n if (sliceConfig.dependencies && sliceConfig.dependencies.length > 0) {\r\n console.log(\r\n chalk.gray(` Composants installés: ${sliceConfig.dependencies.join(\", \")}`)\r\n );\r\n }\r\n\r\n if (sliceConfig.icons && sliceConfig.icons.length > 0) {\r\n console.log(\r\n chalk.gray(` Icônes installées: ${sliceConfig.icons.join(\", \")}`)\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 { ${sliceConfig.outputName} } from \"@/${config.componentsDir.replace(\"./\", \"\")}/slices/${sliceConfig.outputName}\";`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'installation de la slice\"));\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, une icône ou une slice à votre projet\")\r\n .argument(\"<type>\", \"Type: nom du composant, 'i' pour icône, ou 'slices/NomSlice'\")\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 if (type.startsWith(\"slices/\")) {\r\n // C'est une slice : behsseui add slices/Navbar01\r\n const sliceName = type.replace(\"slices/\", \"\");\r\n if (!sliceName) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Veuillez spécifier le nom de la slice. Exemple: behsseui add slices/Navbar01\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n addSlice(sliceName);\r\n } else {\r\n // Sinon, c'est un composant\r\n addComponent(type);\r\n }\r\n });\r\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;AACxB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;;;ACJxB,SAAS,eAAe;AACxB,OAAO,aAAa;AACpB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,cAAAC,aAAY,WAAW,iBAAAC,gBAAe,gBAAAC,eAAc,kBAAkB;AAC/E,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,YAAAC,iBAAgB;;;ACNzB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAOd,SAAS,uBAAuC;AACrD,QAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AACtC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AACtC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK,KAAK,mBAAmB,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AAGA,MAAI;AACF,aAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,aAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,aAAS,iBAAiB,EAAE,OAAO,SAAS,CAAC;AAC7C,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,SAAO;AACT;AAKO,SAAS,oBACd,cACA,gBACA,QAAQ,OACF;AACN,QAAM,UAAU,QAAQ,OAAO;AAC/B,QAAM,OAAO,aAAa,KAAK,GAAG;AAElC,MAAI;AACJ,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,gBAAU,YAAY,OAAO,IAAI,IAAI;AACrC;AAAA,IACF,KAAK;AACH,gBAAU,YAAY,OAAO,IAAI,IAAI;AACrC;AAAA,IACF,KAAK;AACH,gBAAU,WAAW,OAAO,IAAI,IAAI;AACpC;AAAA,IACF,KAAK;AAAA,IACL;AACE,gBAAU,eAAe,QAAQ,eAAe,EAAE,IAAI,IAAI;AAC1D;AAAA,EACJ;AAEA,WAAS,SAAS,EAAE,OAAO,UAAU,CAAC;AACxC;;;AC1EA,SAAS,cAAAC,aAAY,cAAc,qBAAqB;AACxD,SAAS,QAAAC,aAAY;AAarB,IAAM,mBAAmB;AAKlB,SAAS,gBAAwB;AACtC,SAAOA,MAAK,QAAQ,IAAI,GAAG,gBAAgB;AAC7C;AAKO,SAAS,uBAAgC;AAC9C,QAAM,aAAa,cAAc;AACjC,MAAI,CAACD,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,WAAO,OAAO,gBAAgB;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,aAA6B;AAC3C,QAAM,aAAa,cAAc;AACjC,MAAI,CAACA,YAAW,UAAU,GAAG;AAC3B,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,UAAU,aAAa,YAAY,OAAO;AAChD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAKO,SAAS,YAAY,QAA8B;AACxD,QAAM,aAAa,cAAc;AACjC,gBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE;AAKO,SAAS,oBACd,gBAAgB,QAChB,SAAS,SACO;AAChB,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA,IACA,aAAa;AAAA,EACf;AACF;;;AC9EA,SAAS,gBAAAE,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,qBAAqB;AAE9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAK7B,SAAS,aAAa,cAA8B;AAGzD,QAAM,eAAeA,MAAK,WAAW,aAAa,YAAY;AAC9D,SAAOD,cAAa,cAAc,OAAO;AAC3C;;;ACfA,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAed,SAAS,kBAAiC;AAC/C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,kBAAkBA,MAAK,KAAK,cAAc;AAEhD,QAAM,OAAsB;AAAA,IAC1B,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAGA,OAAK,gBACHF,YAAWE,MAAK,KAAK,gBAAgB,CAAC,KACtCF,YAAWE,MAAK,KAAK,gBAAgB,CAAC,KACtCF,YAAWE,MAAK,KAAK,iBAAiB,CAAC;AAEzC,OAAK,gBACHF,YAAWE,MAAK,KAAK,gBAAgB,CAAC,KACtCF,YAAWE,MAAK,KAAK,iBAAiB,CAAC,KACvCF,YAAWE,MAAK,KAAK,gBAAgB,CAAC;AAGxC,MAAI,CAACF,YAAW,eAAe,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAMG,eAAc,KAAK,MAAMF,cAAa,iBAAiB,OAAO,CAAC;AACrE,UAAM,UAAU;AAAA,MACd,GAAGE,aAAY;AAAA,MACf,GAAGA,aAAY;AAAA,IACjB;AAGA,QAAI,QAAQ,aAAa;AACvB,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AAGA,QAAI,QAAQ,YAAY;AACtB,WAAK,oBAAoB,QAAQ;AAAA,IACnC;AAGA,QAAI,QAAQ,MAAM;AAChB,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,QAAQ,KAAK,eAAe;AACtC,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAAA,EACpD;AAEA,SAAO;AACT;AAKO,SAAS,wBAAwB,SAAuC;AAC7E,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,eAAe,QAAQ,QAAQ,WAAW,EAAE;AAClD,QAAM,eAAe,SAAS,aAAa,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAE5D,SAAO,MAAM,YAAY,IAAI,OAAO;AACtC;AAaO,SAAS,iBAAgC;AAC9C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU,CAAC,kBAAkB,kBAAkB,iBAAiB;AAEtE,aAAW,UAAU,SAAS;AAC5B,QAAIC,YAAWC,MAAK,KAAK,MAAM,CAAC,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,qBAAoC;AAClD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,QAAID,YAAWC,MAAK,KAAK,MAAM,CAAC,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,0BAA0B,SAAuC;AAC/E,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,eAAe,QAAQ,QAAQ,WAAW,EAAE;AAClD,QAAM,eAAe,SAAS,aAAa,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAE5D,SAAO,MAAM,YAAY,IAAI,OAAO;AACtC;;;ACpJA,SAAS,gBAAAC,eAAc,iBAAAC,sBAAqB;AAC5C,SAAS,QAAAC,aAAY;AAKd,SAAS,qBAAqB,YAA6B;AAChE,QAAM,WAAWA,MAAK,QAAQ,IAAI,GAAG,UAAU;AAE/C,MAAI;AACF,QAAI,UAAUF,cAAa,UAAU,OAAO;AAG5C,QAAI,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,QAAQ,GAAG;AAC9D,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,QAAQ,SAAS,kBAAkB,GAAG;AACzC,YAAM,cAAc,QAAQ,QAAQ,QAAQ;AAC5C,UAAI,gBAAgB,IAAI;AACtB,kBAAU,+BAA+B;AAAA,MAC3C;AAAA,IACF;AAGA,UAAM,oBAAoB;AAC1B,UAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAE7C,QAAI,OAAO;AACT,YAAM,gBAAgB,MAAM,CAAC;AAG7B,UAAI,cAAc,SAAS,UAAU,GAAG;AAEtC,cAAM,eAAe;AACrB,cAAM,eAAe,cAAc,MAAM,YAAY;AAErD,YAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE,SAAS,QAAQ,GAAG;AACvD,gBAAM,aAAa;AAAA;AAAA;AAAA,QAA6E,aAAa,CAAC,CAAC;AAAA;AAC/G,oBAAU,QAAQ,QAAQ,cAAc,UAAU;AAAA,QACpD;AAAA,MACF,OAAO;AAEL,cAAM,gBAAgB;AACtB,kBAAU,QAAQ;AAAA,UAChB;AAAA,UACA,iBAAiB,aAAa,GAAG,aAAa;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,IAAAC,eAAc,UAAU,SAAS,OAAO;AACxC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,sCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AACF;AAKO,SAAS,wBAAwB,YAA6B;AACnE,QAAM,WAAWC,MAAK,QAAQ,IAAI,GAAG,UAAU;AAE/C,MAAI;AACF,QAAI,UAAUF,cAAa,UAAU,OAAO;AAG5C,QAAI,QAAQ,SAAS,mBAAmB,GAAG;AACzC,aAAO;AAAA,IACT;AAIA,UAAM,kBAAkB;AACxB,UAAM,QAAQ,QAAQ,MAAM,eAAe;AAE3C,QAAI,OAAO;AACT,YAAM,kBAAkB;AACxB,gBAAU,QAAQ;AAAA,QAChB;AAAA,QACA,MAAM,CAAC,IAAI;AAAA,MACb;AAAA,IACF,OAAO;AAEL,YAAM,cAAc,QAAQ,QAAQ,QAAQ;AAC5C,UAAI,gBAAgB,IAAI;AACtB,cAAM,eAAe,QAAQ,QAAQ,MAAM,WAAW;AACtD,kBACE,QAAQ,MAAM,GAAG,eAAe,CAAC,IACjC,mDACA,QAAQ,MAAM,eAAe,CAAC;AAAA,MAClC;AAAA,IACF;AAIA,UAAM,eAAe;AACrB,UAAM,eAAe,QAAQ,MAAM,YAAY;AAE/C,QAAI,cAAc;AAChB,YAAM,iBAAiB,aAAa,CAAC,EAAE,KAAK;AAC5C,UAAI;AAEJ,UAAI,mBAAmB,IAAI;AAEzB,4BAAoB;AAAA,MACtB,OAAO;AAEL,4BAAoB,iBAAiB;AAAA,MACvC;AAEA,gBAAU,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,MAAmB,iBAAiB;AAAA;AAAA,MACtC;AAAA,IACF,OAAO;AAGL,YAAM,oBAAoB;AAC1B,UAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,kBAAU,QAAQ;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAAC,eAAc,UAAU,SAAS,OAAO;AACxC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO;AAAA,EACT;AACF;;;ACxIA,SAAS,gBAAAE,eAAc,iBAAAC,gBAAe,cAAAC,mBAAkB;AAKxD,SAAS,kBAAkB,YAA4B;AAErD,eAAa,WAAW,QAAQ,aAAa,EAAE;AAG/C,eAAa,WAAW,QAAQ,qBAAqB,EAAE;AAGvD,eAAa,WAAW,QAAQ,gBAAgB,IAAI;AAEpD,SAAO;AACT;AAKO,SAAS,0BACd,MACA,cAAuB,OACd;AACT,MAAI,CAACA,YAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAUF,cAAa,MAAM,OAAO;AAG1C,UAAM,eAAe,kBAAkB,OAAO;AAC9C,UAAM,WAAW,KAAK,MAAM,YAAY;AAGxC,QAAI,CAAC,SAAS,iBAAiB;AAC7B,eAAS,kBAAkB,CAAC;AAAA,IAC9B;AAGA,aAAS,gBAAgB,UAAU;AAGnC,QAAI,CAAC,SAAS,gBAAgB,OAAO;AACnC,eAAS,gBAAgB,QAAQ,CAAC;AAAA,IACpC;AACA,aAAS,gBAAgB,MAAM,KAAK,IAAI,CAAC,KAAK;AAG9C,QAAI,eAAe,MAAM,QAAQ,SAAS,OAAO,GAAG;AAClD,YAAM,WAAW,IAAI,IAAI,SAAS,OAAO;AACzC,eAAS,IAAI,IAAI;AACjB,eAAS,IAAI,KAAK;AAClB,eAAS,UAAU,MAAM,KAAK,QAAQ;AAAA,IACxC;AAGA,IAAAC,eAAc,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,OAAO;AACrE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,qBAAqB,IAAI,KAAK,KAAK;AACjD,WAAO;AAAA,EACT;AACF;;;ANpCA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,gBAAgB,MAAoB;AAC3C,MAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,WAAWE,MAAK,QAAQ,IAAI,GAAG,IAAI;AACzC,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AACF;AAKA,SAAS,kBACP,cACA,SACA,SACM;AACN,MAAI,CAAC,gBAAgB,aAAa,KAAK,MAAM,IAAI;AAC/C,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAEA,QAAM,WAAWD,MAAK,QAAQ,IAAI,GAAG,YAAY;AACjD,QAAM,MAAME,SAAQ,QAAQ;AAG5B,MAAI,CAACD,YAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,EAAAE,eAAc,UAAU,SAAS,OAAO;AACxC,UAAQ,OAAO,uBAAiB,YAAY;AAC9C;AAKA,eAAe,qBACb,SACA,gBACe;AACf,UAAQ,OAAO;AAGf,QAAM,OAAO,CAAC,sBAAsB,0BAA0B;AAC9D,UAAQ,OAAO;AACf,sBAAoB,MAAM,gBAAgB,IAAI;AAG9C,QAAM,iBAAiB,eAAe;AACtC,MAAI,gBAAgB;AAClB,YAAQ,OAAO,mBAAmB,cAAc;AAGhD,UAAM,kBAAkB,wBAAwB,cAAc;AAC9D,QAAI,iBAAiB;AACnB,cAAQ,OAAO,UAAK,cAAc;AAAA,IACpC,OAAO;AACL,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,uDAAgD,cAAc;AAAA,QAChE;AAAA,MACF;AACA,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA;AAAA;AAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,YAAQ,OAAO,mCAAmC,cAAc;AAChE,UAAM,eAAe,qBAAqB,cAAc;AACxD,QAAI,cAAc;AAChB,cAAQ,OAAO,oCAA4B,cAAc;AAAA,IAC3D,OAAO;AACL,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA;AAAA,QACF;AAAA,MACF;AACA,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,MAAM,OAAO,yEAAyD;AAAA,IACxE;AAAA,EACF;AAGA,UAAQ,OAAO;AACf,QAAM,eAAeH,MAAK,QAAQ,IAAI,GAAG,eAAe;AACxD,QAAM,kBAAkBA,MAAK,QAAQ,IAAI,GAAG,mBAAmB;AAG/D,QAAM,iBAAiB,0BAA0B,cAAc,KAAK;AAGpE,QAAM,gBAAgB,0BAA0B,iBAAiB,IAAI;AAErE,MAAI,kBAAkB,eAAe;AACnC,YAAQ,OAAO;AAAA,EACjB,OAAO;AACL,YAAQ;AAAA,MACN,MAAM,OAAO,kEAAwD;AAAA,IACvE;AAAA,EACF;AAGA,UAAQ,OAAO;AACf,MAAI;AACF,UAAM,kBAAkBA,MAAK,QAAQ,IAAI,GAAG,cAAc;AAC1D,QAAIC,YAAW,eAAe,GAAG;AAC/B,YAAMG,eAAc,KAAK,MAAMC,cAAa,iBAAiB,OAAO,CAAC;AACrE,YAAM,eACJD,aAAY,eAAe,aAAa,KACxCA,aAAY,kBAAkB,aAAa;AAE7C,UAAI,CAAC,cAAc;AACjB,gBAAQ,OAAO;AACf,4BAAoB,CAAC,aAAa,GAAG,gBAAgB,IAAI;AACzD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAAA,EAEhB;AACF;AAKA,eAAe,uBACb,SACA,gBACe;AACf,UAAQ,OAAO;AAGf,QAAM,OAAO,CAAC,sBAAsB,+BAA+B,SAAS;AAC5E,UAAQ,OAAO;AACf,sBAAoB,MAAM,gBAAgB,IAAI;AAG9C,UAAQ,OAAO;AACf,QAAM,kBAAkB,aAAa,6BAA6B;AAClE,oBAAkB,sBAAsB,iBAAiB,OAAO;AAClE;AAKA,SAAS,gBAAgB,SAAiB,SAAoB;AAC5D,QAAM,WAAWJ,MAAK,QAAQ,IAAI,GAAG,OAAO;AAC5C,QAAM,cAAc,aAAa,sBAAsB;AAEvD,UAAQ,OAAO,oBAAoB,OAAO;AAG1C,MAAIC,YAAW,QAAQ,GAAG;AACxB,eAAW,QAAQ;AACnB,YAAQ,OAAO,2BAA2B,OAAO;AAAA,EACnD;AAGA,oBAAkB,SAAS,aAAa,OAAO;AAC/C,UAAQ,OAAO,UAAK,OAAO;AAC7B;AAKA,eAAe,oBAAoB,aAAsC;AACvE,QAAM,UAAU,IAAI,kCAA+B,EAAE,MAAM;AAE3D,MAAI;AACF,YAAQ,OAAO,kCAA+B,WAAW;AAIzD,IAAAK;AAAA,MACE,8BAA8B,WAAW;AAAA,MACzC,EAAE,OAAO,UAAU;AAAA,IACrB;AAEA,YAAQ,QAAQ,MAAM,MAAM,0BAAqB,WAAW,6BAAoB,CAAC;AAGjF,WAAON,MAAK,QAAQ,IAAI,GAAG,WAAW;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,KAAK,MAAM,IAAI,iDAA8C,CAAC;AACtE,UAAM;AAAA,EACR;AACF;AAKA,eAAe,kBAAkB,aAAsC;AACrE,QAAM,UAAU,IAAI,+BAA4B,EAAE,MAAM;AAExD,MAAI;AACF,YAAQ,OAAO,+BAA4B,WAAW;AAItD,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,UAAU,YACZ,mCAAmC,WAAW,4BAC9C,qCAAqC,WAAW;AAEpD,IAAAM,UAAS,SAAS,EAAE,OAAO,UAAU,CAAC;AAEtC,YAAQ,OAAO;AAGf,UAAM,cAAcN,MAAK,QAAQ,IAAI,GAAG,WAAW;AACnD,UAAM,iBAAiB,qBAAqB;AAG5C,QAAI,mBAAmB,OAAO;AAC5B,MAAAM,UAAS,eAAe,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IAChE,WAAW,mBAAmB,QAAQ;AACpC,MAAAA,UAAS,gBAAgB,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IACjE,OAAO;AACL,MAAAA,UAAS,gBAAgB,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IACjE;AAGA,YAAQ,OAAO;AACf,QAAI,mBAAmB,OAAO;AAC5B,MAAAA,UAAS,8BAA8B,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IAC/E,WAAW,mBAAmB,QAAQ;AACpC,MAAAA,UAAS,2BAA2B,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IAC5E,OAAO;AACL,MAAAA,UAAS,2BAA2B,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAAA,IAC5E;AAGA,YAAQ,OAAO;AACf,UAAM,eAAeN,MAAK,aAAa,eAAe;AACtD,UAAM,kBAAkBA,MAAK,aAAa,mBAAmB;AAG7D,8BAA0B,cAAc,KAAK;AAG7C,8BAA0B,iBAAiB,IAAI;AAE/C,YAAQ,OAAO;AAEf,YAAQ,QAAQ,MAAM,MAAM,uBAAkB,WAAW,6BAAoB,CAAC;AAG9E,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,MAAM,IAAI,8CAA2C,CAAC;AACnE,UAAM;AAAA,EACR;AACF;AAKA,eAAe,0BACb,WACe;AACf,UAAQ;AAAA,IACN,MAAM,KAAK;AAAA,MACT;AAAA,iCAA4B,cAAc,WAAW,YAAY,MAAM;AAAA;AAAA,IACzE;AAAA,EACF;AAGA,QAAM,EAAE,YAAY,IAAI,MAAM,QAAQ;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,SAAS,MAAM,KAAK,MAAM,IAAI;AACjC,eAAO;AAAA,MACT;AACA,UAAIC,YAAWD,MAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,GAAG;AAC1C,eAAO,eAAe,KAAK;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,MAAM,IAAI,kCAAuB,CAAC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AAEJ,MAAI;AAEF,QAAI,cAAc,UAAU;AAC1B,oBAAc,MAAM,oBAAoB,WAAW;AAAA,IACrD,OAAO;AACL,oBAAc,MAAM,kBAAkB,WAAW;AAAA,IACnD;AAGA,YAAQ,MAAM,WAAW;AAEzB,YAAQ,IAAI,MAAM,IAAI;AAAA,6BAAyB,WAAW;AAAA,CAAI,CAAC;AAG/D,UAAM,gBAAgB,SAAS;AAG/B,YAAQ;AAAA,MACN,MAAM,KAAK;AAAA,QACT;AAAA,mBAAe,cAAc,WAAW,YAAY,MAAM;AAAA;AAAA,MAC5D;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,IAAI,mBAAgB,CAAC;AACvC,YAAQ,IAAI,MAAM,KAAK,QAAQ,WAAW,EAAE,CAAC;AAC7C,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,KAAK,qBAAqB,CAAC,IAAI,cAAc,WAAW,QAAQ,KAAK;AAAA,MACvE;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,iDAA4C,cAAc,WAAW,YAAY,MAAM;AAAA,MACzF;AAAA,IACF;AACA,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAMA,eAAe,gBAAgB,WAA6C;AAC1E,UAAQ,IAAI,MAAM,KAAK,KAAK,uCAAkC,CAAC;AAE/D,QAAM,iBAAiB,qBAAqB;AAC5C,UAAQ;AAAA,IACN,MAAM,IAAI,8BAAuB,MAAM,KAAK,cAAc,CAAC;AAAA,CAAI;AAAA,EACjE;AAEA,QAAM,gBAAgB;AACtB,QAAM,cACJ,cAAc,WAAW,sBAAsB;AAEjD,QAAM,UAAU,IAAI,4BAA4B,EAAE,MAAM;AAExD,MAAI;AAEF,YAAQ,OAAO,0BAAuB,aAAa;AACnD,oBAAgB,aAAa;AAG7B,YAAQ,OAAO;AACf,UAAM,SAAS,oBAAoB,aAAa;AAChD,WAAO,SAAS,MAAM;AACtB,WAAO,OAAO,SAAS;AACvB,gBAAY,MAAM;AAGlB,YAAQ,OAAO;AACf,QAAI;AACF,0BAAoB,uBAAuB,gBAAgB,IAAI;AAAA,IACjE,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,cAAc,QAAQ;AACxB,YAAM,qBAAqB,SAAS,cAAc;AAAA,IACpD,WAAW,cAAc,UAAU;AACjC,YAAM,uBAAuB,SAAS,cAAc;AAAA,IACtD;AAGA,oBAAgB,aAAa,OAAO;AAGpC,YAAQ,OAAO;AACf,oBAAgB,OAAO;AACvB,UAAM,gBAAgB,aAAa,mBAAmB;AACtD,UAAM,YAAY;AAClB,sBAAkB,WAAW,eAAe,OAAO;AAEnD,YAAQ,QAAQ,MAAM,MAAM,gDAAqC,CAAC;AAGlE,YAAQ,IAAI,MAAM,KAAK,mCAAyB,CAAC;AACjD,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,kCAAkC;AAAA,IAC/C;AACA,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,GAAG,cAAc,sBAAsB;AAAA,IACpD;AACA,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,6BAA6B,cAAc,QAAQ,MAAM,EAAE,CAAC,qBAAqB;AAAA,IAC9F;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAK,MAAM,IAAI,wCAAmC,CAAC;AAC3D,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,cAAc;AAC3B,UAAQ,IAAI,MAAM,KAAK,KAAK,uCAAkC,CAAC;AAG/D,MAAI,qBAAqB,GAAG;AAC1B,UAAM,EAAE,UAAU,IAAI,MAAM,QAAQ;AAAA,MAClC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,MAAM,OAAO,4CAA+B,CAAC;AACzD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,iBAAiB,qBAAqB;AAC5C,UAAQ;AAAA,IACN,MAAM,IAAI,8BAAuB,MAAM,KAAK,cAAc,CAAC;AAAA,CAAI;AAAA,EACjE;AAGA,QAAM,gBAAgB,gBAAgB;AACtC,UAAQ;AAAA,IACN,MAAM,IAAI,wBAAiB,MAAM,KAAK,cAAc,SAAS,CAAC;AAAA,CAAI;AAAA,EACpE;AAEA,MAAI,cAAc,cAAc,WAAW;AACzC,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,eAAe,IAAI,MAAM,QAAQ;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,oBAAoB;AAAA,IACxB,cAAc;AAAA,EAChB;AACA,MAAI,yBAAyB;AAE7B,MAAI,CAAC,cAAc,mBAAmB;AACpC,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,6BAAyB;AAAA,EAC3B,WAAW,qBAAqB,oBAAoB,GAAG;AACrD,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,6BAAmB,iBAAiB;AAAA,MACtC;AAAA,IACF;AACA,6BAAyB;AAAA,EAC3B,WAAW,qBAAqB,qBAAqB,GAAG;AACtD,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,sBAAiB,iBAAiB;AAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB;AAAA,IACtB,cAAc;AAAA,EAChB;AACA,MAAI,mBAAmB,kBAAkB,GAAG;AAC1C,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,+BAAqB,eAAe;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,mBAAmB;AAC7C,MAAI,mBAAmB;AACrB,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,qEAAqD,iBAAiB;AAAA,MACxE;AAAA,IACF;AACA,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B;AAAA,MACE,MAAM,oBAAoB,YAAY;AAAA,MACtC,MAAM;AAAA,MACN,SAAS,aAAa,iBAAiB;AAAA,MACvC,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM,yBAAyB,YAAY;AAAA,MAC3C,MAAM;AAAA,MACN,SAAS,cAAc,oBACnB,uDAAoD,iBAAiB,QACrE;AAAA,MACJ,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU,CAAC,UACT,SAAS,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC1C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SACE,cAAc,cAAc,WACxB,sBACA;AAAA,MACN,UAAU,CAAC,UACT,SAAS,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC1C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SACE,mBAAmB,mBAAmB,IAClC,2DACA;AAAA,MACN,SAAS,CAAC,mBAAmB,kBAAkB;AAAA,IACjD;AAAA,EACF,CAAC;AAED,MAAI,CAAC,QAAQ,eAAe;AAC1B,YAAQ,IAAI,MAAM,IAAI,qCAA6B,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,IAAI,4BAA4B,EAAE,MAAM;AAExD,MAAI;AAEF,YAAQ,OAAO,0BAAuB,QAAQ,aAAa;AAC3D,oBAAgB,QAAQ,aAAa;AAGrC,QAAI,qBAAqB,QAAQ,yBAAyB;AACxD,cAAQ,OAAO,kBAAkB,iBAAiB;AAClD,iBAAWA,MAAK,QAAQ,IAAI,GAAG,iBAAiB,CAAC;AACjD,cAAQ,OAAO,UAAK,iBAAiB;AAAA,IACvC;AAGA,YAAQ,OAAO;AACf,UAAM,SAAS,oBAAoB,QAAQ,aAAa;AACxD,WAAO,SAAS,MAAM,QAAQ;AAE9B,WAAO,OAAO,SAAS;AACvB,gBAAY,MAAM;AAGlB,QAAI,0BAA0B,QAAQ,mBAAmB;AACvD,cAAQ,OAAO;AACf,UAAI;AACF,4BAAoB,CAAC,eAAe,GAAG,gBAAgB,IAAI;AAC3D,gBAAQ,OAAO;AAAA,MACjB,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,MAAM,OAAO,gDAA6C;AAAA,QAC5D;AACA,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ;AAAA;AAAA,EAA8B,mBAAmB,QAAQ,2BAA2B,GAAG,cAAc,SAAS;AAAA;AAAA,UAChH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,QAAI;AACF,0BAAoB,uBAAuB,gBAAgB,IAAI;AAAA,IACjE,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA;AAAA,EAA8B,mBAAmB,QAAQ,2BAA2B,GAAG,cAAc,SAAS,IAAI,sBAAsB,KAAK,GAAG,CAAC;AAAA;AAAA,QACnJ;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,iBAAiB;AAC3B,UAAI,cAAc,cAAc,QAAQ;AACtC,cAAM,qBAAqB,SAAS,cAAc;AAAA,MACpD,WAAW,cAAc,cAAc,UAAU;AAC/C,cAAM,uBAAuB,SAAS,cAAc;AAAA,MACtD;AAGA,sBAAgB,QAAQ,aAAa,OAAO;AAAA,IAC9C,WAAW,cAAc,cAAc,UAAU;AAE/C,YAAM,oBAAoBA,MAAK,QAAQ,IAAI,GAAG,oBAAoB;AAClE,UAAI,CAACC,YAAW,iBAAiB,GAAG;AAClC,gBAAQ,OAAO;AACf,cAAM,kBAAkB,aAAa,6BAA6B;AAClE,0BAAkB,sBAAsB,iBAAiB,OAAO;AAChE,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,oBAAgB,OAAO;AACvB,UAAM,gBAAgB,aAAa,mBAAmB;AACtD,UAAM,YAAY;AAClB,sBAAkB,WAAW,eAAe,OAAO;AAEnD,YAAQ,QAAQ,MAAM,MAAM,gDAAqC,CAAC;AAGlE,YAAQ,IAAI,MAAM,KAAK,mCAAyB,CAAC;AACjD,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,kCAAkC;AAAA,IAC/C;AACA,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,GAAG,cAAc,sBAAsB;AAAA,IACpD;AACA,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,6BAA6B,QAAQ,cAAc,QAAQ,MAAM,EAAE,CAAC,qBAAqB;AAAA,IACtG;AACA,YAAQ;AAAA,MACN,MAAM,IAAI,IAAI;AAAA,MACd;AAAA,MACA,MAAM,KAAK,8BAA8B;AAAA,IAC3C;AACA,YAAQ,IAAI;AAGZ,QAAI,cAAc,cAAc,UAAU,QAAQ,iBAAiB;AACjE,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,WACE,cAAc,cAAc,YAC5B,QAAQ,iBACR;AACA,cAAQ;AAAA,QACN,MAAM,IAAI,8EAA2D;AAAA,MACvE;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAK,MAAM,IAAI,wCAAmC,CAAC;AAC3D,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,OAAO,IAAI,QAAQ,EAC7B,KAAK,MAAM,EACX,YAAY,wCAAwC,EACpD,OAAO,YAAY,kDAA+C,EAClE,OAAO,UAAU,+CAA4C,EAC7D,OAAO,OAAO,YAAkD;AAE/D,MAAI,QAAQ,UAAU,QAAQ,MAAM;AAClC,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,0BAA0B,QAAQ;AACxC;AAAA,EACF;AAGA,MAAI,QAAQ,MAAM;AAChB,UAAM,0BAA0B,MAAM;AACtC;AAAA,EACF;AAGA,QAAM,YAAY;AACpB,CAAC;;;AOjxBH,SAAS,WAAAM,gBAAe;AACxB,SAAS,cAAAC,aAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,SAAS,QAAAC,aAAY;AACrB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAIhB,IAAM,0BACJ;AACF,IAAM,qBACJ;AACF,IAAM,sBACJ;AAGF,IAAM,iBAOF;AAAA,EACF,WAAW,EAAE,MAAM,gBAAgB;AAAA,EACnC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc,CAAC,EAAE,MAAM,sBAAsB,QAAQ,YAAY,CAAC;AAAA,EACpE;AAAA,EACA,aAAa,EAAE,MAAM,kBAAkB;AAAA,EACvC,QAAQ,EAAE,MAAM,aAAa;AAAA,EAC7B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc,CAAC,EAAE,MAAM,sBAAsB,QAAQ,YAAY,CAAC;AAAA,EACpE;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,OAAO,CAAC,cAAc;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,cAAc,CAAC,EAAE,MAAM,sBAAsB,QAAQ,YAAY,CAAC;AAAA,EACpE;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,cAAc;AAAA,EACvC;AAAA,EACA,MAAM,EAAE,MAAM,WAAW;AAAA,EACzB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,cAAc;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EACA,QAAQ,EAAE,MAAM,aAAa;AAAA,EAC7B,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,OAAO,CAAC,cAAc;AAAA,EACxB;AAAA,EACA,WAAW,EAAE,MAAM,gBAAgB;AAAA,EACnC,OAAO,EAAE,MAAM,YAAY;AAAA,EAC3B,UAAU,EAAE,MAAM,eAAe;AAAA,EACjC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,cAAc;AAAA,EACvC;AAAA,EACA,UAAU,EAAE,MAAM,eAAe;AAAA,EACjC,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO,CAAC,eAAe,OAAO;AAAA,EAChC;AACF;AAGA,IAAM,YAA8C;AAAA,EAClD,aAAa,EAAE,MAAM,kBAAkB;AAAA,EACvC,eAAe,EAAE,MAAM,oBAAoB;AAAA,EAC3C,cAAc,EAAE,MAAM,mBAAmB;AAAA,EACzC,OAAO,EAAE,MAAM,YAAY;AAAA,EAC3B,aAAa,EAAE,MAAM,kBAAkB;AAAA,EACvC,aAAa,EAAE,MAAM,kBAAkB;AAAA,EACvC,aAAa,EAAE,MAAM,kBAAkB;AAAA,EACvC,cAAc,EAAE,MAAM,mBAAmB;AAAA,EACzC,OAAO,EAAE,MAAM,YAAY;AAAA,EAC3B,MAAM,EAAE,MAAM,WAAW;AAAA,EACzB,MAAM,EAAE,MAAM,WAAW;AAAA,EACzB,QAAQ,EAAE,MAAM,aAAa;AAAA,EAC7B,MAAM,EAAE,MAAM,WAAW;AAAA,EACzB,MAAM,EAAE,MAAM,WAAW;AAAA,EACzB,SAAS,EAAE,MAAM,cAAc;AAAA,EAC/B,QAAQ,EAAE,MAAM,aAAa;AAAA,EAC7B,YAAY,EAAE,MAAM,iBAAiB;AAAA,EACrC,QAAQ,EAAE,MAAM,aAAa;AAAA,EAC7B,UAAU,EAAE,MAAM,eAAe;AACnC;AAIA,IAAM,aAGF;AAAA,EACF,UAAU,EAAE,YAAY,gBAAgB,YAAY,UAAU,OAAO,CAAC,QAAQ,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE;AAAA,EACjH,UAAU,EAAE,YAAY,gBAAgB,YAAY,UAAU,OAAO,CAAC,QAAQ,OAAO,GAAG,cAAc,CAAC,UAAU,OAAO,EAAE;AAAA,EAC1H,QAAQ,EAAE,YAAY,cAAc,YAAY,QAAQ,cAAc,CAAC,UAAU,OAAO,EAAE;AAAA,EAC1F,QAAQ,EAAE,YAAY,cAAc,YAAY,QAAQ,cAAc,CAAC,UAAU,OAAO,EAAE;AAAA,EAC1F,WAAW,EAAE,YAAY,iBAAiB,YAAY,WAAW,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE;AAAA,EAC7H,WAAW,EAAE,YAAY,iBAAiB,YAAY,WAAW,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE;AAAA,EAC7H,WAAW,EAAE,YAAY,iBAAiB,YAAY,WAAW,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE;AAAA,EAC7H,UAAU,EAAE,YAAY,gBAAgB,YAAY,SAAS;AAAA,EAC7D,UAAU,EAAE,YAAY,gBAAgB,YAAY,UAAU,cAAc,CAAC,UAAU,OAAO,EAAE;AAClG;AAGA,eAAe,aAAa,KAA8B;AACxD,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACjF;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAe,aAAa,eAAuB;AAEjD,MAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAQ;AAAA,MACNC,OAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,qCAA+B,aAAa,KAAK,EAAE,MAAM;AAE7E,MAAI;AAEF,QAAI,CAAC,eAAe,aAAa,GAAG;AAClC,cAAQ,KAAKD,OAAM,IAAI,iBAAiB,aAAa,iBAAiB,CAAC;AACvE,cAAQ;AAAA,QACNA,OAAM,OAAO,2BAA2B;AAAA,QACxC,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI;AAAA,MACvC;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,kBAAkB,eAAe,aAAa;AACpD,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAUE,MAAK,QAAQ,IAAI,GAAG,OAAO,aAAa;AAGxD,UAAM,gBAAgBA,MAAK,SAAS,YAAY;AAGhD,QAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,MAAAC,WAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAGA,QAAI,gBAAgB,gBAAgB,gBAAgB,aAAa,SAAS,GAAG;AAC3E,cAAQ,OAAO;AAEf,iBAAW,OAAO,gBAAgB,cAAc;AAC9C,cAAM,SAAS,GAAG,uBAAuB,IAAI,IAAI,IAAI;AACrD,cAAM,aAAa,MAAM,aAAa,MAAM;AAG5C,cAAM,eAAe,IAAI,SACrBF,MAAK,eAAe,IAAI,MAAM,IAC9B;AAEJ,YAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,UAAAC,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAGA,cAAM,cAAc,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAC5C,cAAM,gBAAgBF,MAAK,cAAc,WAAW;AACpD,QAAAG,eAAc,eAAe,YAAY,OAAO;AAAA,MAClD;AAAA,IACF;AAGA,QAAI,gBAAgB,SAAS,gBAAgB,MAAM,SAAS,GAAG;AAC7D,YAAM,WAAWH,MAAK,SAAS,OAAO;AACtC,UAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,QAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACzC;AAEA,cAAQ,OAAO;AAEf,iBAAW,YAAY,gBAAgB,OAAO;AAC5C,cAAM,aAAa,UAAU,QAAQ;AACrC,YAAI,YAAY;AACd,gBAAM,UAAU,GAAG,kBAAkB,IAAI,WAAW,IAAI;AACxD,gBAAM,cAAc,MAAM,aAAa,OAAO;AAC9C,gBAAM,iBAAiBF,MAAK,UAAU,WAAW,IAAI;AAErD,cAAI,CAACC,YAAW,cAAc,GAAG;AAC/B,YAAAE,eAAc,gBAAgB,aAAa,OAAO;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,GAAG,uBAAuB,IAAI,gBAAgB,IAAI;AACvE,YAAQ,OAAO,2BAAqB,aAAa;AACjD,UAAM,mBAAmB,MAAM,aAAa,YAAY;AAGxD,UAAM,sBAAsBH,MAAK,eAAe,gBAAgB,IAAI;AACpE,IAAAG,eAAc,qBAAqB,kBAAkB,OAAO;AAE5D,YAAQ;AAAA,MACNL,OAAM;AAAA,QACJ,oBAAe,aAAa,kCAA4B,OAAO,aAAa;AAAA,MAC9E;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,gBAAgB,MAAM,SAAS,GAAG;AAC7D,cAAQ;AAAA,QACNA,OAAM,KAAK,+BAAyB,gBAAgB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACxE;AAAA,IACF;AAEA,YAAQ;AAAA,MACNA,OAAM,KAAK,kEAA2D;AAAA,IACxE;AACA,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,YAAY,aAAa,cAAc,OAAO,cAAc,QAAQ,MAAM,EAAE,CAAC,eAAe,gBAAgB,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACtI;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAKA,OAAM,IAAI,mDAA8C,CAAC;AACtE,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,SAAS,WAAmB;AACzC,MAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,oCAA8B,SAAS,KAAK,EAAE,MAAM;AAExE,MAAI;AACF,QAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,cAAQ,KAAKD,OAAM,IAAI,aAAa,SAAS,iBAAiB,CAAC;AAC/D,cAAQ;AAAA,QACNA,OAAM,OAAO,uBAAuB;AAAA,QACpC,OAAO,KAAK,UAAU,EAAE,KAAK,IAAI;AAAA,MACnC;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,WAAW,SAAS;AACxC,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAUE,MAAK,QAAQ,IAAI,GAAG,OAAO,aAAa;AACxD,UAAM,YAAYA,MAAK,SAAS,QAAQ;AAExC,QAAI,CAACC,YAAW,SAAS,GAAG;AAC1B,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,QAAI,YAAY,gBAAgB,YAAY,aAAa,SAAS,GAAG;AACnE,cAAQ,OAAO;AACf,YAAM,gBAAgBF,MAAK,SAAS,YAAY;AAChD,UAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,QAAAC,WAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C;AAEA,iBAAW,WAAW,YAAY,cAAc;AAC9C,YAAI,eAAe,OAAO,GAAG;AAC3B,gBAAM,YAAY,eAAe,OAAO;AAGxC,gBAAM,SAAS,GAAG,uBAAuB,IAAI,UAAU,IAAI;AAC3D,gBAAM,aAAa,MAAM,aAAa,MAAM;AAC5C,gBAAM,UAAUF,MAAK,eAAe,UAAU,IAAI;AAClD,cAAI,CAACC,YAAW,OAAO,GAAG;AACxB,YAAAE,eAAc,SAAS,YAAY,OAAO;AAAA,UAC5C;AAGA,cAAI,UAAU,gBAAgB,UAAU,aAAa,SAAS,GAAG;AAC/D,uBAAW,UAAU,UAAU,cAAc;AAC3C,oBAAM,YAAY,GAAG,uBAAuB,IAAI,OAAO,IAAI;AAC3D,oBAAM,gBAAgB,MAAM,aAAa,SAAS;AAClD,oBAAM,kBAAkB,OAAO,SAC3BH,MAAK,eAAe,OAAO,MAAM,IACjC;AACJ,kBAAI,CAACC,YAAW,eAAe,GAAG;AAChC,gBAAAC,WAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAAA,cAChD;AACA,oBAAM,iBAAiB,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAClD,oBAAM,aAAaF,MAAK,iBAAiB,cAAc;AACvD,kBAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,gBAAAE,eAAc,YAAY,eAAe,OAAO;AAAA,cAClD;AAAA,YACF;AAAA,UACF;AAGA,cAAI,UAAU,SAAS,UAAU,MAAM,SAAS,GAAG;AACjD,kBAAM,WAAWH,MAAK,SAAS,OAAO;AACtC,gBAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,cAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,YACzC;AACA,uBAAW,YAAY,UAAU,OAAO;AACtC,oBAAM,aAAa,UAAU,QAAQ;AACrC,kBAAI,YAAY;AACd,sBAAM,UAAU,GAAG,kBAAkB,IAAI,WAAW,IAAI;AACxD,sBAAM,cAAc,MAAM,aAAa,OAAO;AAC9C,sBAAM,iBAAiBF,MAAK,UAAU,WAAW,IAAI;AACrD,oBAAI,CAACC,YAAW,cAAc,GAAG;AAC/B,kBAAAE,eAAc,gBAAgB,aAAa,OAAO;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AACrD,YAAM,WAAWH,MAAK,SAAS,OAAO;AACtC,UAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,QAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACzC;AAEA,cAAQ,OAAO;AACf,iBAAW,YAAY,YAAY,OAAO;AACxC,cAAM,aAAa,UAAU,QAAQ;AACrC,YAAI,YAAY;AACd,gBAAM,UAAU,GAAG,kBAAkB,IAAI,WAAW,IAAI;AACxD,gBAAM,cAAc,MAAM,aAAa,OAAO;AAC9C,gBAAM,iBAAiBF,MAAK,UAAU,WAAW,IAAI;AACrD,cAAI,CAACC,YAAW,cAAc,GAAG;AAC/B,YAAAE,eAAc,gBAAgB,aAAa,OAAO;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,GAAG,mBAAmB,IAAI,YAAY,UAAU;AACjE,YAAQ,OAAO,2BAAqB,SAAS;AAC7C,QAAI,eAAe,MAAM,aAAa,QAAQ;AAG9C,mBAAe,aAAa;AAAA,MAC1B,mBAAmB,SAAS;AAAA,MAC5B,mBAAmB,YAAY,UAAU;AAAA,IAC3C;AAGA,UAAM,aAAaH,MAAK,WAAW,GAAG,YAAY,UAAU,MAAM;AAClE,IAAAG,eAAc,YAAY,cAAc,OAAO;AAE/C,YAAQ;AAAA,MACNL,OAAM;AAAA,QACJ,gBAAW,SAAS,2BAAwB,YAAY,UAAU,SAAS,OAAO,aAAa;AAAA,MACjG;AAAA,IACF;AAEA,QAAI,YAAY,gBAAgB,YAAY,aAAa,SAAS,GAAG;AACnE,cAAQ;AAAA,QACNA,OAAM,KAAK,+BAA4B,YAAY,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,MAC9E;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AACrD,cAAQ;AAAA,QACNA,OAAM,KAAK,+BAAyB,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACpE;AAAA,IACF;AAEA,YAAQ;AAAA,MACNA,OAAM,KAAK,kEAA2D;AAAA,IACxE;AACA,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,YAAY,YAAY,UAAU,cAAc,OAAO,cAAc,QAAQ,MAAM,EAAE,CAAC,WAAW,YAAY,UAAU;AAAA,MACzH;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAKA,OAAM,IAAI,kDAA6C,CAAC;AACrE,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,QAAQ,UAAkB;AAEvC,MAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,sCAA6B,QAAQ,KAAK,EAAE,MAAM;AAEtE,MAAI;AAEF,QAAI,CAAC,UAAU,QAAQ,GAAG;AACxB,cAAQ,KAAKD,OAAM,IAAI,eAAY,QAAQ,iBAAiB,CAAC;AAC7D,cAAQ;AAAA,QACNA,OAAM,OAAO,0BAAuB;AAAA,QACpC,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAAA,MAClC;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,UAAU,QAAQ;AACrC,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAUE,MAAK,QAAQ,IAAI,GAAG,OAAO,aAAa;AAGxD,UAAM,WAAWA,MAAK,SAAS,OAAO;AAGtC,QAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,MAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC;AAGA,UAAM,UAAU,GAAG,kBAAkB,IAAI,WAAW,IAAI;AACxD,YAAQ,OAAO,2BAAqB,QAAQ;AAC5C,UAAM,cAAc,MAAM,aAAa,OAAO;AAG9C,UAAM,iBAAiBF,MAAK,UAAU,WAAW,IAAI;AACrD,IAAAG,eAAc,gBAAgB,aAAa,OAAO;AAElD,YAAQ;AAAA,MACNL,OAAM;AAAA,QACJ,mBAAW,QAAQ,mCAA6B,OAAO,aAAa;AAAA,MACtE;AAAA,IACF;AAEA,YAAQ;AAAA,MACNA,OAAM,KAAK,kEAA2D;AAAA,IACxE;AACA,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,UAAU,QAAQ,YAAY,OAAO,cAAc,QAAQ,MAAM,EAAE,CAAC,UAAU,WAAW,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACnH;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAKA,OAAM,IAAI,oDAA4C,CAAC;AACpE,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,MAAM,IAAIM,SAAQ,EAC5B,KAAK,KAAK,EACV,YAAY,mEAA6D,EACzE,SAAS,UAAU,iEAA8D,EACjF,SAAS,UAAU,mCAAgC,EACnD,OAAO,CAAC,MAAc,SAAkB;AAEvC,MAAI,SAAS,KAAK;AAChB,QAAI,CAAC,MAAM;AACT,cAAQ;AAAA,QACNN,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,IAAI;AAAA,EACd,WAAW,KAAK,WAAW,SAAS,GAAG;AAErC,UAAM,YAAY,KAAK,QAAQ,WAAW,EAAE;AAC5C,QAAI,CAAC,WAAW;AACd,cAAQ;AAAA,QACNA,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,aAAS,SAAS;AAAA,EACpB,OAAO;AAEL,iBAAa,IAAI;AAAA,EACnB;AACF,CAAC;;;ARrfH,IAAMO,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,SAAQH,WAAU;AACpC,IAAM,cAAc,KAAK;AAAA,EACvBI,cAAaC,MAAKH,YAAW,iBAAiB,GAAG,OAAO;AAC1D;AAEA,IAAM,UAAU,IAAII,SAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,2DAA2D,EACvE,QAAQ,YAAY,OAAO;AAG9B,QAAQ,WAAW,IAAI;AACvB,QAAQ,WAAW,GAAG;AAEtB,QAAQ,MAAM;","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,6 +1,6 @@
1
1
  {
2
2
  "name": "behsseui",
3
- "version": "0.0.7",
3
+ "version": "0.1.0",
4
4
  "description": "CLI to add behsseui components to your projects",
5
5
  "type": "module",
6
6
  "author": "Behsse",