behsseui 0.0.5 → 0.0.7
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 +195 -41
- package/dist/index.js.map +1 -1
- package/package.json +4 -11
package/dist/index.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import { Command as Command3 } from "commander";
|
|
5
|
+
import { readFileSync as readFileSync7 } from "fs";
|
|
6
|
+
import { join as join8 } from "path";
|
|
7
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
8
|
+
import { dirname as dirname3 } from "path";
|
|
5
9
|
|
|
6
10
|
// src/commands/init.ts
|
|
7
11
|
import { Command } from "commander";
|
|
@@ -143,10 +147,10 @@ function detectFramework() {
|
|
|
143
147
|
return info;
|
|
144
148
|
}
|
|
145
149
|
try {
|
|
146
|
-
const
|
|
150
|
+
const packageJson2 = JSON.parse(readFileSync3(packageJsonPath, "utf-8"));
|
|
147
151
|
const allDeps = {
|
|
148
|
-
...
|
|
149
|
-
...
|
|
152
|
+
...packageJson2.dependencies,
|
|
153
|
+
...packageJson2.devDependencies
|
|
150
154
|
};
|
|
151
155
|
if (allDeps.tailwindcss) {
|
|
152
156
|
info.tailwindVersion = allDeps.tailwindcss;
|
|
@@ -441,8 +445,8 @@ resolve: {
|
|
|
441
445
|
try {
|
|
442
446
|
const packageJsonPath = join6(process.cwd(), "package.json");
|
|
443
447
|
if (existsSync5(packageJsonPath)) {
|
|
444
|
-
const
|
|
445
|
-
const hasTypesNode =
|
|
448
|
+
const packageJson2 = JSON.parse(readFileSync6(packageJsonPath, "utf-8"));
|
|
449
|
+
const hasTypesNode = packageJson2.dependencies?.["@types/node"] || packageJson2.devDependencies?.["@types/node"];
|
|
446
450
|
if (!hasTypesNode) {
|
|
447
451
|
spinner.text = "Installation de @types/node...";
|
|
448
452
|
installDependencies(["@types/node"], packageManager, true);
|
|
@@ -644,7 +648,7 @@ async function initProjectAuto(framework) {
|
|
|
644
648
|
console.log(
|
|
645
649
|
chalk.dim("3."),
|
|
646
650
|
"Importez dans votre code:",
|
|
647
|
-
chalk.gray(`import { Button } from "
|
|
651
|
+
chalk.gray(`import { Button } from "@/${componentsDir.replace("./", "")}/components/Button"`)
|
|
648
652
|
);
|
|
649
653
|
console.log();
|
|
650
654
|
} catch (error) {
|
|
@@ -867,7 +871,7 @@ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -
|
|
|
867
871
|
console.log(
|
|
868
872
|
chalk.dim("3."),
|
|
869
873
|
"Importez dans votre code:",
|
|
870
|
-
chalk.gray(`import { Button } from "
|
|
874
|
+
chalk.gray(`import { Button } from "@/${answers.componentsDir.replace("./", "")}/components/Button"`)
|
|
871
875
|
);
|
|
872
876
|
console.log(
|
|
873
877
|
chalk.dim("4."),
|
|
@@ -919,34 +923,90 @@ import { existsSync as existsSync6, mkdirSync as mkdirSync2, writeFileSync as wr
|
|
|
919
923
|
import { join as join7 } from "path";
|
|
920
924
|
import chalk2 from "chalk";
|
|
921
925
|
import ora2 from "ora";
|
|
922
|
-
|
|
923
|
-
var
|
|
926
|
+
var COMPONENTS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/components";
|
|
927
|
+
var ICONS_REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/apps/www/ui/icons";
|
|
924
928
|
var COMPONENTS_MAP = {
|
|
929
|
+
Accordion: { file: "Accordion.tsx" },
|
|
930
|
+
Alert: {
|
|
931
|
+
file: "Alert.tsx",
|
|
932
|
+
dependencies: [{ file: "internals/Slot.tsx", subdir: "internals" }]
|
|
933
|
+
},
|
|
934
|
+
AlertDialog: { file: "AlertDialog.tsx" },
|
|
935
|
+
Avatar: { file: "Avatar.tsx" },
|
|
936
|
+
Badge: {
|
|
937
|
+
file: "Badge.tsx",
|
|
938
|
+
dependencies: [{ file: "internals/Slot.tsx", subdir: "internals" }]
|
|
939
|
+
},
|
|
940
|
+
Breadcrumb: {
|
|
941
|
+
file: "Breadcrumb.tsx",
|
|
942
|
+
icons: ["ChevronRight"]
|
|
943
|
+
},
|
|
925
944
|
Button: {
|
|
926
945
|
file: "Button.tsx",
|
|
927
|
-
dependencies: [
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
946
|
+
dependencies: [{ file: "internals/Slot.tsx", subdir: "internals" }]
|
|
947
|
+
},
|
|
948
|
+
Calendar: {
|
|
949
|
+
file: "Calendar.tsx",
|
|
950
|
+
icons: ["ChevronLeft", "ChevronRight"]
|
|
951
|
+
},
|
|
952
|
+
Card: { file: "Card.tsx" },
|
|
953
|
+
Carousel: {
|
|
954
|
+
file: "Carousel.tsx",
|
|
955
|
+
icons: ["ChevronLeft", "ChevronRight"]
|
|
956
|
+
},
|
|
957
|
+
Checkbox: {
|
|
958
|
+
file: "Checkbox.tsx",
|
|
959
|
+
icons: ["Check"]
|
|
960
|
+
},
|
|
961
|
+
Dialog: {
|
|
962
|
+
file: "Dialog.tsx",
|
|
963
|
+
icons: ["Close"]
|
|
964
|
+
},
|
|
965
|
+
Drawer: { file: "Drawer.tsx" },
|
|
966
|
+
DropdownMenu: {
|
|
967
|
+
file: "DropdownMenu.tsx",
|
|
968
|
+
icons: ["ChevronRight"]
|
|
969
|
+
},
|
|
970
|
+
HoverCard: { file: "HoverCard.tsx" },
|
|
971
|
+
Input: { file: "Input.tsx" },
|
|
972
|
+
InputOTP: { file: "InputOTP.tsx" },
|
|
973
|
+
Pagination: {
|
|
974
|
+
file: "Pagination.tsx",
|
|
975
|
+
icons: ["ChevronLeft", "ChevronRight"]
|
|
976
|
+
},
|
|
977
|
+
Progress: { file: "Progress.tsx" },
|
|
978
|
+
Select: {
|
|
979
|
+
file: "Select.tsx",
|
|
980
|
+
icons: ["ChevronDown", "Check"]
|
|
931
981
|
}
|
|
932
|
-
// Ajoutez d'autres composants ici au fur et à mesure
|
|
933
982
|
};
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
}
|
|
983
|
+
var ICONS_MAP = {
|
|
984
|
+
AlertCircle: { file: "AlertCircle.tsx" },
|
|
985
|
+
AlertTriangle: { file: "AlertTriangle.tsx" },
|
|
986
|
+
ArrowUpRight: { file: "ArrowUpRight.tsx" },
|
|
987
|
+
Check: { file: "Check.tsx" },
|
|
988
|
+
CheckCircle: { file: "CheckCircle.tsx" },
|
|
989
|
+
ChevronDown: { file: "ChevronDown.tsx" },
|
|
990
|
+
ChevronLeft: { file: "ChevronLeft.tsx" },
|
|
991
|
+
ChevronRight: { file: "ChevronRight.tsx" },
|
|
992
|
+
Close: { file: "Close.tsx" },
|
|
993
|
+
Copy: { file: "Copy.tsx" },
|
|
994
|
+
File: { file: "File.tsx" },
|
|
995
|
+
Github: { file: "Github.tsx" },
|
|
996
|
+
Info: { file: "Info.tsx" },
|
|
997
|
+
Menu: { file: "Menu.tsx" },
|
|
998
|
+
Monitor: { file: "Monitor.tsx" },
|
|
999
|
+
Search: { file: "Search.tsx" },
|
|
1000
|
+
Smartphone: { file: "Smartphone.tsx" },
|
|
1001
|
+
Tablet: { file: "Tablet.tsx" },
|
|
1002
|
+
Terminal: { file: "Terminal.tsx" }
|
|
1003
|
+
};
|
|
1004
|
+
async function downloadFile(url) {
|
|
1005
|
+
const response = await fetch(url);
|
|
1006
|
+
if (!response.ok) {
|
|
1007
|
+
throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
|
|
1008
|
+
}
|
|
1009
|
+
return response.text();
|
|
950
1010
|
}
|
|
951
1011
|
async function addComponent(componentName) {
|
|
952
1012
|
if (!isProjectInitialized()) {
|
|
@@ -969,16 +1029,17 @@ async function addComponent(componentName) {
|
|
|
969
1029
|
}
|
|
970
1030
|
const componentConfig = COMPONENTS_MAP[componentName];
|
|
971
1031
|
const config = readConfig();
|
|
972
|
-
const
|
|
973
|
-
|
|
974
|
-
|
|
1032
|
+
const baseDir = join7(process.cwd(), config.componentsDir);
|
|
1033
|
+
const componentsDir = join7(baseDir, "components");
|
|
1034
|
+
if (!existsSync6(componentsDir)) {
|
|
1035
|
+
mkdirSync2(componentsDir, { recursive: true });
|
|
975
1036
|
}
|
|
976
1037
|
if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {
|
|
977
1038
|
spinner.text = `T\xE9l\xE9chargement des d\xE9pendances...`;
|
|
978
1039
|
for (const dep of componentConfig.dependencies) {
|
|
979
|
-
const depUrl = `${
|
|
1040
|
+
const depUrl = `${COMPONENTS_REGISTRY_URL}/${dep.file}`;
|
|
980
1041
|
const depContent = await downloadFile(depUrl);
|
|
981
|
-
const depTargetDir = dep.subdir ? join7(
|
|
1042
|
+
const depTargetDir = dep.subdir ? join7(componentsDir, dep.subdir) : componentsDir;
|
|
982
1043
|
if (!existsSync6(depTargetDir)) {
|
|
983
1044
|
mkdirSync2(depTargetDir, { recursive: true });
|
|
984
1045
|
}
|
|
@@ -987,22 +1048,45 @@ async function addComponent(componentName) {
|
|
|
987
1048
|
writeFileSync5(depTargetPath, depContent, "utf-8");
|
|
988
1049
|
}
|
|
989
1050
|
}
|
|
990
|
-
|
|
1051
|
+
if (componentConfig.icons && componentConfig.icons.length > 0) {
|
|
1052
|
+
const iconsDir = join7(baseDir, "icons");
|
|
1053
|
+
if (!existsSync6(iconsDir)) {
|
|
1054
|
+
mkdirSync2(iconsDir, { recursive: true });
|
|
1055
|
+
}
|
|
1056
|
+
spinner.text = `T\xE9l\xE9chargement des ic\xF4nes d\xE9pendantes...`;
|
|
1057
|
+
for (const iconName of componentConfig.icons) {
|
|
1058
|
+
const iconConfig = ICONS_MAP[iconName];
|
|
1059
|
+
if (iconConfig) {
|
|
1060
|
+
const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;
|
|
1061
|
+
const iconContent = await downloadFile(iconUrl);
|
|
1062
|
+
const iconTargetPath = join7(iconsDir, iconConfig.file);
|
|
1063
|
+
if (!existsSync6(iconTargetPath)) {
|
|
1064
|
+
writeFileSync5(iconTargetPath, iconContent, "utf-8");
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
const componentUrl = `${COMPONENTS_REGISTRY_URL}/${componentConfig.file}`;
|
|
991
1070
|
spinner.text = `T\xE9l\xE9chargement de ${componentName}...`;
|
|
992
1071
|
const componentContent = await downloadFile(componentUrl);
|
|
993
|
-
const targetComponentPath = join7(
|
|
1072
|
+
const targetComponentPath = join7(componentsDir, componentConfig.file);
|
|
994
1073
|
writeFileSync5(targetComponentPath, componentContent, "utf-8");
|
|
995
1074
|
spinner.succeed(
|
|
996
1075
|
chalk2.green(
|
|
997
|
-
`\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/`
|
|
1076
|
+
`\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/components/`
|
|
998
1077
|
)
|
|
999
1078
|
);
|
|
1079
|
+
if (componentConfig.icons && componentConfig.icons.length > 0) {
|
|
1080
|
+
console.log(
|
|
1081
|
+
chalk2.gray(` Ic\xF4nes install\xE9es: ${componentConfig.icons.join(", ")}`)
|
|
1082
|
+
);
|
|
1083
|
+
}
|
|
1000
1084
|
console.log(
|
|
1001
1085
|
chalk2.cyan("\n\u{1F4E6} Vous pouvez maintenant l'importer dans votre projet:")
|
|
1002
1086
|
);
|
|
1003
1087
|
console.log(
|
|
1004
1088
|
chalk2.gray(
|
|
1005
|
-
`import { ${componentName} } from "
|
|
1089
|
+
`import { ${componentName} } from "@/${config.componentsDir.replace("./", "")}/components/${componentConfig.file.replace(".tsx", "")}";`
|
|
1006
1090
|
)
|
|
1007
1091
|
);
|
|
1008
1092
|
console.log();
|
|
@@ -1012,11 +1096,81 @@ async function addComponent(componentName) {
|
|
|
1012
1096
|
process.exit(1);
|
|
1013
1097
|
}
|
|
1014
1098
|
}
|
|
1015
|
-
|
|
1099
|
+
async function addIcon(iconName) {
|
|
1100
|
+
if (!isProjectInitialized()) {
|
|
1101
|
+
console.log(
|
|
1102
|
+
chalk2.red(
|
|
1103
|
+
"\n\u274C Le projet n'est pas initialis\xE9. Ex\xE9cutez d'abord 'behsseui init'.\n"
|
|
1104
|
+
)
|
|
1105
|
+
);
|
|
1106
|
+
process.exit(1);
|
|
1107
|
+
}
|
|
1108
|
+
const spinner = ora2(`T\xE9l\xE9chargement de l'ic\xF4ne ${iconName}...`).start();
|
|
1109
|
+
try {
|
|
1110
|
+
if (!ICONS_MAP[iconName]) {
|
|
1111
|
+
spinner.fail(chalk2.red(`L'ic\xF4ne "${iconName}" n'existe pas.`));
|
|
1112
|
+
console.log(
|
|
1113
|
+
chalk2.yellow("\nIc\xF4nes disponibles:"),
|
|
1114
|
+
Object.keys(ICONS_MAP).join(", ")
|
|
1115
|
+
);
|
|
1116
|
+
process.exit(1);
|
|
1117
|
+
}
|
|
1118
|
+
const iconConfig = ICONS_MAP[iconName];
|
|
1119
|
+
const config = readConfig();
|
|
1120
|
+
const baseDir = join7(process.cwd(), config.componentsDir);
|
|
1121
|
+
const iconsDir = join7(baseDir, "icons");
|
|
1122
|
+
if (!existsSync6(iconsDir)) {
|
|
1123
|
+
mkdirSync2(iconsDir, { recursive: true });
|
|
1124
|
+
}
|
|
1125
|
+
const iconUrl = `${ICONS_REGISTRY_URL}/${iconConfig.file}`;
|
|
1126
|
+
spinner.text = `T\xE9l\xE9chargement de ${iconName}...`;
|
|
1127
|
+
const iconContent = await downloadFile(iconUrl);
|
|
1128
|
+
const targetIconPath = join7(iconsDir, iconConfig.file);
|
|
1129
|
+
writeFileSync5(targetIconPath, iconContent, "utf-8");
|
|
1130
|
+
spinner.succeed(
|
|
1131
|
+
chalk2.green(
|
|
1132
|
+
`\u2705 Ic\xF4ne ${iconName} ajout\xE9e avec succ\xE8s dans ${config.componentsDir}/icons/`
|
|
1133
|
+
)
|
|
1134
|
+
);
|
|
1135
|
+
console.log(
|
|
1136
|
+
chalk2.cyan("\n\u{1F4E6} Vous pouvez maintenant l'importer dans votre projet:")
|
|
1137
|
+
);
|
|
1138
|
+
console.log(
|
|
1139
|
+
chalk2.gray(
|
|
1140
|
+
`import ${iconName} from "@/${config.componentsDir.replace("./", "")}/icons/${iconConfig.file.replace(".tsx", "")}";`
|
|
1141
|
+
)
|
|
1142
|
+
);
|
|
1143
|
+
console.log();
|
|
1144
|
+
} catch (error) {
|
|
1145
|
+
spinner.fail(chalk2.red("\u274C Erreur lors de l'installation de l'ic\xF4ne"));
|
|
1146
|
+
console.error(error);
|
|
1147
|
+
process.exit(1);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
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) => {
|
|
1151
|
+
if (type === "i") {
|
|
1152
|
+
if (!name) {
|
|
1153
|
+
console.log(
|
|
1154
|
+
chalk2.red(
|
|
1155
|
+
"\n\u274C Veuillez sp\xE9cifier le nom de l'ic\xF4ne. Exemple: behsseui add i Close\n"
|
|
1156
|
+
)
|
|
1157
|
+
);
|
|
1158
|
+
process.exit(1);
|
|
1159
|
+
}
|
|
1160
|
+
addIcon(name);
|
|
1161
|
+
} else {
|
|
1162
|
+
addComponent(type);
|
|
1163
|
+
}
|
|
1164
|
+
});
|
|
1016
1165
|
|
|
1017
1166
|
// src/index.ts
|
|
1167
|
+
var __filename2 = fileURLToPath2(import.meta.url);
|
|
1168
|
+
var __dirname2 = dirname3(__filename2);
|
|
1169
|
+
var packageJson = JSON.parse(
|
|
1170
|
+
readFileSync7(join8(__dirname2, "../package.json"), "utf-8")
|
|
1171
|
+
);
|
|
1018
1172
|
var program = new Command3();
|
|
1019
|
-
program.name("behsseui").description("CLI pour ajouter des composants behsseui dans vos projets").version(
|
|
1173
|
+
program.name("behsseui").description("CLI pour ajouter des composants behsseui dans vos projets").version(packageJson.version);
|
|
1020
1174
|
program.addCommand(init);
|
|
1021
1175
|
program.addCommand(add);
|
|
1022
1176
|
program.parse();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/package-manager.ts","../src/utils/config.ts","../src/utils/templates.ts","../src/utils/framework.ts","../src/utils/vite-config.ts","../src/utils/tsconfig.ts","../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"behsseui\")\n .description(\"CLI pour ajouter des composants behsseui dans vos projets\")\n .version(\"0.0.2\");\n\n// Ajouter les commandes\nprogram.addCommand(init);\nprogram.addCommand(add);\n\nprogram.parse();\n","import { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { execSync } from \"child_process\";\r\nimport {\r\n detectPackageManager,\r\n installDependencies,\r\n type PackageManager,\r\n} from \"../utils/package-manager.js\";\r\nimport {\r\n createDefaultConfig,\r\n isProjectInitialized,\r\n writeConfig,\r\n} from \"../utils/config.js\";\r\nimport { readTemplate } from \"../utils/templates.js\";\r\nimport {\r\n detectFramework,\r\n getTailwindMajorVersion,\r\n getTypeScriptMajorVersion,\r\n isTypeScriptV5OrHigher,\r\n findViteConfig,\r\n findTailwindConfig,\r\n} from \"../utils/framework.js\";\r\nimport { addTailwindToViteConfig, addAliasToViteConfig } from \"../utils/vite-config.js\";\r\nimport { configureTsconfigForAlias } from \"../utils/tsconfig.js\";\r\n\r\nconst REQUIRED_DEPENDENCIES = [\r\n \"class-variance-authority\",\r\n \"clsx\",\r\n \"tailwind-merge\",\r\n];\r\n\r\n/**\r\n * Crée un dossier de manière sécurisée\r\n */\r\nfunction ensureDirectory(path: string): void {\r\n if (!path || path.trim() === \"\") {\r\n throw new Error(\"Invalid directory path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), path);\r\n if (!existsSync(fullPath)) {\r\n mkdirSync(fullPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Écrit un fichier de manière sécurisée\r\n */\r\nfunction writeFileSecurely(\r\n relativePath: string,\r\n content: string,\r\n spinner: any\r\n): void {\r\n if (!relativePath || relativePath.trim() === \"\") {\r\n throw new Error(\"Invalid file path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), relativePath);\r\n const dir = dirname(fullPath);\r\n\r\n // S'assurer que le dossier parent existe\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n spinner.text = `Fichier créé: ${relativePath}`;\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Vite\r\n */\r\nasync function setupTailwindForVite(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Vite...\";\r\n\r\n // Installer Tailwind v4 + plugin Vite\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/vite@latest\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Trouver et modifier vite.config\r\n const viteConfigPath = findViteConfig();\r\n if (viteConfigPath) {\r\n spinner.text = `Modification de ${viteConfigPath}...`;\r\n\r\n // Ajouter Tailwind\r\n const tailwindSuccess = addTailwindToViteConfig(viteConfigPath);\r\n if (tailwindSuccess) {\r\n spinner.text = `✓ ${viteConfigPath} modifié avec Tailwind`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de modifier automatiquement ${viteConfigPath}.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement:\\nimport tailwindcss from \"@tailwindcss/vite\";\\n\\nplugins: [tailwindcss()]`\r\n )\r\n );\r\n }\r\n\r\n // Ajouter l'alias @ pour les imports\r\n spinner.text = `Configuration de l'alias @ dans ${viteConfigPath}...`;\r\n const aliasSuccess = addAliasToViteConfig(viteConfigPath);\r\n if (aliasSuccess) {\r\n spinner.text = `✓ Alias @ configuré dans ${viteConfigPath}`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de configurer l'alias @ automatiquement.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement dans vite.config.ts:\\nresolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },\\n}`\r\n )\r\n );\r\n }\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Fichier vite.config non trouvé. Créez-le d'abord.\")\r\n );\r\n }\r\n\r\n // Configurer tsconfig.json pour l'alias @\r\n spinner.text = \"Configuration de tsconfig.json...\";\r\n const tsconfigPath = join(process.cwd(), \"tsconfig.json\");\r\n const tsconfigAppPath = join(process.cwd(), \"tsconfig.app.json\");\r\n\r\n // Configurer tsconfig.json (racine)\r\n const mainConfigured = configureTsconfigForAlias(tsconfigPath, false);\r\n\r\n // Configurer tsconfig.app.json (utilisé par Vite pour l'application)\r\n const appConfigured = configureTsconfigForAlias(tsconfigAppPath, true);\r\n\r\n if (mainConfigured || appConfigured) {\r\n spinner.text = \"✓ tsconfig.json configuré avec alias @\";\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Erreur lors de la configuration de tsconfig.json\")\r\n );\r\n }\r\n\r\n // Installer @types/node si pas déjà présent\r\n spinner.text = \"Vérification de @types/node...\";\r\n try {\r\n const packageJsonPath = join(process.cwd(), \"package.json\");\r\n if (existsSync(packageJsonPath)) {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const hasTypesNode =\r\n packageJson.dependencies?.[\"@types/node\"] ||\r\n packageJson.devDependencies?.[\"@types/node\"];\r\n\r\n if (!hasTypesNode) {\r\n spinner.text = \"Installation de @types/node...\";\r\n installDependencies([\"@types/node\"], packageManager, true);\r\n spinner.text = \"✓ @types/node installé\";\r\n }\r\n }\r\n } catch (error) {\r\n // Ignorer l'erreur si @types/node ne peut pas être installé\r\n }\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Next.js\r\n */\r\nasync function setupTailwindForNextJs(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Next.js...\";\r\n\r\n // Installer Tailwind v4 + PostCSS\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/postcss@latest\", \"postcss\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Créer postcss.config.mjs\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n}\r\n\r\n/**\r\n * Remplace le CSS global par le template Tailwind v4\r\n */\r\nfunction updateGlobalCss(cssPath: string, spinner: any): void {\r\n const fullPath = join(process.cwd(), cssPath);\r\n const cssTemplate = readTemplate(\"globals.css.template\");\r\n\r\n spinner.text = `Configuration de ${cssPath}...`;\r\n\r\n // Si le fichier existe, le supprimer d'abord\r\n if (existsSync(fullPath)) {\r\n unlinkSync(fullPath);\r\n spinner.text = `Suppression de l'ancien ${cssPath}...`;\r\n }\r\n\r\n // Créer le nouveau fichier avec le template\r\n writeFileSecurely(cssPath, cssTemplate, spinner);\r\n spinner.text = `✓ ${cssPath} créé avec Tailwind v4`;\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet Next.js avec TypeScript\r\n */\r\nasync function createNextJsProject(projectName: string): Promise<string> {\r\n const spinner = ora(\"Création du projet Next.js...\").start();\r\n\r\n try {\r\n spinner.text = `Création du projet Next.js: ${projectName}...`;\r\n\r\n // Créer le projet avec create-next-app en mode non-interactif avec TypeScript\r\n // --yes accepte tous les paramètres par défaut sans poser de questions\r\n execSync(\r\n `npx create-next-app@latest ${projectName} --typescript --tailwind --eslint --app --no-src-dir --turbopack --import-alias \"@/*\" --no-git --yes`,\r\n { stdio: \"inherit\" }\r\n );\r\n\r\n spinner.succeed(chalk.green(`✓ Projet Next.js \"${projectName}\" créé avec succès`));\r\n\r\n // Retourner le chemin du projet\r\n return join(process.cwd(), projectName);\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"Erreur lors de la création du projet Next.js\"));\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet Vite avec TypeScript et React\r\n */\r\nasync function createViteProject(projectName: string): Promise<string> {\r\n const spinner = ora(\"Création du projet Vite...\").start();\r\n\r\n try {\r\n spinner.text = `Création du projet Vite: ${projectName}...`;\r\n\r\n // Créer le projet avec create-vite en utilisant le template react-ts\r\n // Utiliser echo pour répondre automatiquement \"n\" (no) pour ne pas lancer le serveur de dev\r\n const isWindows = process.platform === \"win32\";\r\n const command = isWindows\r\n ? `echo n | npm create vite@latest ${projectName} -- --template react-ts`\r\n : `echo \"n\" | npm create vite@latest ${projectName} -- --template react-ts`;\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n\r\n spinner.text = \"Installation des dépendances du projet Vite...\";\r\n\r\n // Se déplacer dans le projet pour installer les dépendances\r\n const projectPath = join(process.cwd(), projectName);\r\n const packageManager = detectPackageManager();\r\n\r\n // Installer les dépendances de base\r\n if (packageManager === \"npm\") {\r\n execSync(\"npm install\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else if (packageManager === \"pnpm\") {\r\n execSync(\"pnpm install\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else {\r\n execSync(\"yarn install\", { cwd: projectPath, stdio: \"inherit\" });\r\n }\r\n\r\n // Installer @types/node pour supporter path et __dirname\r\n spinner.text = \"Installation de @types/node...\";\r\n if (packageManager === \"npm\") {\r\n execSync(\"npm install -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else if (packageManager === \"pnpm\") {\r\n execSync(\"pnpm add -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n } else {\r\n execSync(\"yarn add -D @types/node\", { cwd: projectPath, stdio: \"inherit\" });\r\n }\r\n\r\n // Configurer tsconfig.json pour l'alias @\r\n spinner.text = \"Configuration de tsconfig.json...\";\r\n const tsconfigPath = join(projectPath, \"tsconfig.json\");\r\n const tsconfigAppPath = join(projectPath, \"tsconfig.app.json\");\r\n\r\n // Configurer tsconfig.json (racine)\r\n configureTsconfigForAlias(tsconfigPath, false);\r\n\r\n // Configurer tsconfig.app.json (utilisé par Vite pour l'application)\r\n configureTsconfigForAlias(tsconfigAppPath, true);\r\n\r\n spinner.text = \"✓ tsconfig.json configuré\";\r\n\r\n spinner.succeed(chalk.green(`✓ Projet Vite \"${projectName}\" créé avec succès`));\r\n\r\n // Retourner le chemin du projet\r\n return projectPath;\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"Erreur lors de la création du projet Vite\"));\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Crée un nouveau projet (Next.js ou Vite) et initialise behsseui\r\n */\r\nasync function createProjectWithBehsseui(\r\n framework: \"nextjs\" | \"vite\"\r\n): Promise<void> {\r\n console.log(\r\n chalk.bold.cyan(\r\n `\\n✨ Création d'un projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"} avec behsseui\\n`\r\n )\r\n );\r\n\r\n // Demander le nom du projet\r\n const { projectName } = await prompts({\r\n type: \"text\",\r\n name: \"projectName\",\r\n message: \"Nom du projet ?\",\r\n initial: \"my-app\",\r\n validate: (value) => {\r\n if (!value || value.trim() === \"\") {\r\n return \"Le nom du projet ne peut pas être vide\";\r\n }\r\n if (existsSync(join(process.cwd(), value))) {\r\n return `Le dossier \"${value}\" existe déjà`;\r\n }\r\n return true;\r\n },\r\n });\r\n\r\n if (!projectName) {\r\n console.log(chalk.red(\"\\n❌ Création annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n let projectPath: string;\r\n\r\n try {\r\n // Créer le projet selon le framework choisi\r\n if (framework === \"nextjs\") {\r\n projectPath = await createNextJsProject(projectName);\r\n } else {\r\n projectPath = await createViteProject(projectName);\r\n }\r\n\r\n // Se déplacer dans le dossier du projet\r\n process.chdir(projectPath);\r\n\r\n console.log(chalk.dim(`\\n📂 Dossier courant: ${projectPath}\\n`));\r\n\r\n // Initialiser behsseui dans le nouveau projet avec mode automatique\r\n await initProjectAuto(framework);\r\n\r\n // Message de succès final\r\n console.log(\r\n chalk.bold.green(\r\n `\\n🎉 Projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"} avec behsseui créé avec succès!\\n`\r\n )\r\n );\r\n console.log(chalk.dim(\"Pour démarrer:\"));\r\n console.log(chalk.cyan(` cd ${projectName}`));\r\n console.log(\r\n chalk.cyan(\r\n ` ${detectPackageManager()} ${framework === \"nextjs\" ? \"dev\" : \"dev\"}`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n console.error(\r\n chalk.red(\r\n `\\n❌ Erreur lors de la création du projet ${framework === \"nextjs\" ? \"Next.js\" : \"Vite\"}`\r\n )\r\n );\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Initialise behsseui dans un nouveau projet créé automatiquement\r\n * (mode non-interactif avec valeurs par défaut)\r\n */\r\nasync function initProjectAuto(framework: \"nextjs\" | \"vite\"): Promise<void> {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n const componentsDir = \"./ui\";\r\n const tailwindCss =\r\n framework === \"nextjs\" ? \"./app/globals.css\" : \"./src/index.css\";\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${componentsDir}...`;\r\n ensureDirectory(componentsDir);\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(componentsDir);\r\n config.tailwind.css = tailwindCss;\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global avec le template behsseui\r\n updateGlobalCss(tailwindCss, spinner);\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${componentsDir}/Button\"`)\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function initProject() {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n // Vérifier si déjà initialisé\r\n if (isProjectInitialized()) {\r\n const { overwrite } = await prompts({\r\n type: \"confirm\",\r\n name: \"overwrite\",\r\n message: \"Le projet est déjà initialisé. Voulez-vous reconfigurer ?\",\r\n initial: false,\r\n });\r\n\r\n if (!overwrite) {\r\n console.log(chalk.yellow(\"\\n⚠️ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Détecter le package manager\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n // Détecter le framework\r\n const frameworkInfo = detectFramework();\r\n console.log(\r\n chalk.dim(`🔧 Framework: ${chalk.bold(frameworkInfo.framework)}\\n`)\r\n );\r\n\r\n if (frameworkInfo.framework === \"unknown\") {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ Framework non détecté. Assurez-vous d'utiliser Vite ou Next.js.\"\r\n )\r\n );\r\n const { continueAnyway } = await prompts({\r\n type: \"confirm\",\r\n name: \"continueAnyway\",\r\n message: \"Voulez-vous continuer quand même ?\",\r\n initial: false,\r\n });\r\n\r\n if (!continueAnyway) {\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n const typescriptVersion = getTypeScriptMajorVersion(\r\n frameworkInfo.typescriptVersion\r\n );\r\n let needsTypeScriptUpgrade = false;\r\n\r\n if (!frameworkInfo.typescriptVersion) {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ TypeScript n'est pas installé. behsseui nécessite TypeScript v5+.\"\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion < 5) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ TypeScript v${typescriptVersion} détecté. behsseui nécessite TypeScript v5+.`\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion >= 5) {\r\n console.log(\r\n chalk.green(\r\n `✓ TypeScript v${typescriptVersion} détecté\\n`\r\n )\r\n );\r\n }\r\n\r\n // Vérifier la version de Tailwind\r\n const tailwindVersion = getTailwindMajorVersion(\r\n frameworkInfo.tailwindVersion\r\n );\r\n if (tailwindVersion && tailwindVersion < 4) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Tailwind CSS v${tailwindVersion} détecté. behsseui nécessite Tailwind v4.`\r\n )\r\n );\r\n }\r\n\r\n // Détecter l'ancien fichier tailwind.config (Tailwind v3)\r\n const oldTailwindConfig = findTailwindConfig();\r\n if (oldTailwindConfig) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Fichier de configuration Tailwind v3 détecté: ${oldTailwindConfig}`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n \"Tailwind v4 n'utilise plus de fichier de configuration.\\n\"\r\n )\r\n );\r\n }\r\n\r\n // Questions de configuration\r\n const answers = await prompts([\r\n {\r\n type: oldTailwindConfig ? \"confirm\" : null,\r\n name: \"deleteOldTailwindConfig\",\r\n message: `Supprimer ${oldTailwindConfig} ? (Tailwind v4 n'en a plus besoin)`,\r\n initial: true,\r\n },\r\n {\r\n type: needsTypeScriptUpgrade ? \"confirm\" : null,\r\n name: \"upgradeTypeScript\",\r\n message: frameworkInfo.typescriptVersion\r\n ? `Mettre à jour TypeScript vers v5+ (actuellement v${typescriptVersion}) ?`\r\n : \"Installer TypeScript v5+ ?\",\r\n initial: true,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"Où voulez-vous installer les composants ?\",\r\n initial: \"./ui\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"text\",\r\n name: \"tailwindCss\",\r\n message: \"Chemin du fichier CSS global ?\",\r\n initial:\r\n frameworkInfo.framework === \"nextjs\"\r\n ? \"./app/globals.css\"\r\n : \"./src/index.css\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"installTailwind\",\r\n message:\r\n tailwindVersion && tailwindVersion >= 4\r\n ? \"Tailwind v4 est déjà installé. Reconfigurer ?\"\r\n : \"Installer et configurer Tailwind CSS v4 ?\",\r\n initial: !tailwindVersion || tailwindVersion < 4,\r\n },\r\n ]);\r\n\r\n if (!answers.componentsDir) {\r\n console.log(chalk.red(\"\\n❌ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${answers.componentsDir}...`;\r\n ensureDirectory(answers.componentsDir);\r\n\r\n // Supprimer l'ancien tailwind.config si l'utilisateur a accepté\r\n if (oldTailwindConfig && answers.deleteOldTailwindConfig) {\r\n spinner.text = `Suppression de ${oldTailwindConfig}...`;\r\n unlinkSync(join(process.cwd(), oldTailwindConfig));\r\n spinner.text = `✓ ${oldTailwindConfig} supprimé`;\r\n }\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(answers.componentsDir);\r\n config.tailwind.css = answers.tailwindCss;\r\n // Plus besoin de tailwind.config pour v4\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Mettre à jour TypeScript si nécessaire\r\n if (needsTypeScriptUpgrade && answers.upgradeTypeScript) {\r\n spinner.text = \"Mise à jour de TypeScript vers v5+...\";\r\n try {\r\n installDependencies([\"typescript@^5\"], packageManager, true);\r\n spinner.text = \"✓ TypeScript mis à jour\";\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\"Erreur lors de la mise à jour de TypeScript\")\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} typescript@^5\\n`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} ${REQUIRED_DEPENDENCIES.join(\" \")}\\n`\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (answers.installTailwind) {\r\n if (frameworkInfo.framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global\r\n updateGlobalCss(answers.tailwindCss, spinner);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n // Vérifier si postcss.config.mjs existe, sinon le créer\r\n const postcssConfigPath = join(process.cwd(), \"postcss.config.mjs\");\r\n if (!existsSync(postcssConfigPath)) {\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n spinner.text = \"✓ postcss.config.mjs créé\";\r\n }\r\n }\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${answers.componentsDir}/Button\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"4.\"),\r\n \"Consultez la doc:\",\r\n chalk.blue(\"https://github.com/behsse/ui\")\r\n );\r\n console.log();\r\n\r\n // Informations spécifiques au framework\r\n if (frameworkInfo.framework === \"vite\" && answers.installTailwind) {\r\n console.log(\r\n chalk.dim(\r\n `💡 Vite: Vérifiez que tailwindcss() est dans vite.config plugins`\r\n )\r\n );\r\n } else if (\r\n frameworkInfo.framework === \"nextjs\" &&\r\n answers.installTailwind\r\n ) {\r\n console.log(\r\n chalk.dim(`💡 Next.js: postcss.config.mjs a été créé automatiquement`)\r\n );\r\n }\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const init = new Command()\r\n .name(\"init\")\r\n .description(\"Initialiser behsseui dans votre projet\")\r\n .option(\"--nextjs\", \"Créer un nouveau projet Next.js avec behsseui\")\r\n .option(\"--vite\", \"Créer un nouveau projet Vite avec behsseui\")\r\n .action(async (options: { nextjs?: boolean; vite?: boolean }) => {\r\n // Vérifier qu'une seule option est sélectionnée\r\n if (options.nextjs && options.vite) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Erreur: Vous ne pouvez pas utiliser --nextjs et --vite en même temps\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Si --nextjs est spécifié, créer un projet Next.js\r\n if (options.nextjs) {\r\n await createProjectWithBehsseui(\"nextjs\");\r\n return;\r\n }\r\n\r\n // Si --vite est spécifié, créer un projet Vite\r\n if (options.vite) {\r\n await createProjectWithBehsseui(\"vite\");\r\n return;\r\n }\r\n\r\n // Sinon, initialiser behsseui dans le projet existant\r\n await initProject();\r\n });\r\n","import { execSync } from \"child_process\";\r\nimport { existsSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\r\n\r\n/**\r\n * Détecte le package manager utilisé dans le projet\r\n */\r\nexport function detectPackageManager(): PackageManager {\r\n const cwd = process.cwd();\r\n\r\n // Vérifier les fichiers de lock\r\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\r\n return \"pnpm\";\r\n }\r\n if (existsSync(join(cwd, \"yarn.lock\"))) {\r\n return \"yarn\";\r\n }\r\n if (existsSync(join(cwd, \"bun.lockb\"))) {\r\n return \"bun\";\r\n }\r\n if (existsSync(join(cwd, \"package-lock.json\"))) {\r\n return \"npm\";\r\n }\r\n\r\n // Par défaut, vérifier ce qui est installé globalement\r\n try {\r\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"yarn --version\", { stdio: \"ignore\" });\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"bun --version\", { stdio: \"ignore\" });\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\n/**\r\n * Installe des dépendances avec le package manager détecté\r\n */\r\nexport function installDependencies(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): void {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n let command: string;\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n command = `pnpm add ${devFlag} ${deps}`;\r\n break;\r\n case \"yarn\":\r\n command = `yarn add ${devFlag} ${deps}`;\r\n break;\r\n case \"bun\":\r\n command = `bun add ${devFlag} ${deps}`;\r\n break;\r\n case \"npm\":\r\n default:\r\n command = `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n break;\r\n }\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n}\r\n\r\n/**\r\n * Obtient la commande d'installation formatée pour affichage\r\n */\r\nexport function getInstallCommand(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): string {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n return `pnpm add ${devFlag} ${deps}`;\r\n case \"yarn\":\r\n return `yarn add ${devFlag} ${deps}`;\r\n case \"bun\":\r\n return `bun add ${devFlag} ${deps}`;\r\n case \"npm\":\r\n default:\r\n return `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport interface BehsseUIConfig {\r\n $schema?: string;\r\n componentsDir: string;\r\n libDir: string;\r\n tailwind: {\r\n config?: string; // Optional pour v4\r\n css: string;\r\n };\r\n initialized: boolean;\r\n}\r\n\r\nconst CONFIG_FILE_NAME = \"behsseui.json\";\r\n\r\n/**\r\n * Obtient le chemin du fichier de configuration\r\n */\r\nexport function getConfigPath(): string {\r\n return join(process.cwd(), CONFIG_FILE_NAME);\r\n}\r\n\r\n/**\r\n * Vérifie si le projet est initialisé\r\n */\r\nexport function isProjectInitialized(): boolean {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const config = readConfig();\r\n return config.initialized === true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Lit la configuration\r\n */\r\nexport function readConfig(): BehsseUIConfig {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n throw new Error(\"Configuration file not found. Run 'behsseui init' first.\");\r\n }\r\n\r\n const content = readFileSync(configPath, \"utf-8\");\r\n return JSON.parse(content);\r\n}\r\n\r\n/**\r\n * Écrit la configuration\r\n */\r\nexport function writeConfig(config: BehsseUIConfig): void {\r\n const configPath = getConfigPath();\r\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Crée la configuration par défaut\r\n */\r\nexport function createDefaultConfig(\r\n componentsDir = \"./ui\",\r\n libDir = \"./lib\"\r\n): BehsseUIConfig {\r\n return {\r\n $schema: \"https://behsseui.dev/schema.json\",\r\n componentsDir,\r\n libDir,\r\n tailwind: {\r\n config: \"./tailwind.config.js\",\r\n css: \"./app/globals.css\",\r\n },\r\n initialized: true,\r\n };\r\n}\r\n","import { readFileSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n/**\r\n * Lit un template depuis le dossier templates\r\n */\r\nexport function readTemplate(templateName: string): string {\r\n // Le fichier compilé est dans dist/index.js, donc __dirname pointe vers dist/\r\n // Les templates sont dans dist/templates/\r\n const templatePath = join(__dirname, \"templates\", templateName);\r\n return readFileSync(templatePath, \"utf-8\");\r\n}\r\n\r\n/**\r\n * Remplace les variables dans un template\r\n */\r\nexport function renderTemplate(\r\n template: string,\r\n variables: Record<string, string>\r\n): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(variables)) {\r\n result = result.replace(new RegExp(`{{${key}}}`, \"g\"), value);\r\n }\r\n return result;\r\n}\r\n","import { existsSync, readFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type Framework = \"nextjs\" | \"vite\" | \"unknown\";\r\n\r\nexport interface FrameworkInfo {\r\n framework: Framework;\r\n tailwindVersion: string | null;\r\n typescriptVersion: string | null;\r\n hasViteConfig: boolean;\r\n hasNextConfig: boolean;\r\n}\r\n\r\n/**\r\n * Détecte le framework utilisé dans le projet\r\n */\r\nexport function detectFramework(): FrameworkInfo {\r\n const cwd = process.cwd();\r\n const packageJsonPath = join(cwd, \"package.json\");\r\n\r\n const info: FrameworkInfo = {\r\n framework: \"unknown\",\r\n tailwindVersion: null,\r\n typescriptVersion: null,\r\n hasViteConfig: false,\r\n hasNextConfig: false,\r\n };\r\n\r\n // Vérifier les fichiers de config\r\n info.hasViteConfig =\r\n existsSync(join(cwd, \"vite.config.ts\")) ||\r\n existsSync(join(cwd, \"vite.config.js\")) ||\r\n existsSync(join(cwd, \"vite.config.mjs\"));\r\n\r\n info.hasNextConfig =\r\n existsSync(join(cwd, \"next.config.js\")) ||\r\n existsSync(join(cwd, \"next.config.mjs\")) ||\r\n existsSync(join(cwd, \"next.config.ts\"));\r\n\r\n // Lire le package.json\r\n if (!existsSync(packageJsonPath)) {\r\n return info;\r\n }\r\n\r\n try {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Vérifier la version de Tailwind\r\n if (allDeps.tailwindcss) {\r\n info.tailwindVersion = allDeps.tailwindcss;\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n if (allDeps.typescript) {\r\n info.typescriptVersion = allDeps.typescript;\r\n }\r\n\r\n // Détecter Next.js\r\n if (allDeps.next) {\r\n info.framework = \"nextjs\";\r\n return info;\r\n }\r\n\r\n // Détecter Vite\r\n if (allDeps.vite || info.hasViteConfig) {\r\n info.framework = \"vite\";\r\n return info;\r\n }\r\n } catch (error) {\r\n console.error(\"Error reading package.json:\", error);\r\n }\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de Tailwind\r\n */\r\nexport function getTailwindMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si Tailwind v4 est installé\r\n */\r\nexport function isTailwindV4(version: string | null): boolean {\r\n const major = getTailwindMajorVersion(version);\r\n return major !== null && major >= 4;\r\n}\r\n\r\n/**\r\n * Trouve le fichier vite.config\r\n */\r\nexport function findViteConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\"vite.config.ts\", \"vite.config.js\", \"vite.config.mjs\"];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Trouve le fichier tailwind.config (v3) s'il existe\r\n */\r\nexport function findTailwindConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.mjs\",\r\n \"tailwind.config.cjs\",\r\n ];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de TypeScript\r\n */\r\nexport function getTypeScriptMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si TypeScript v5+ est installé\r\n */\r\nexport function isTypeScriptV5OrHigher(version: string | null): boolean {\r\n const major = getTypeScriptMajorVersion(version);\r\n return major !== null && major >= 5;\r\n}\r\n","import { readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\n/**\r\n * Ajoute l'alias @ pour résoudre les imports depuis la racine du projet\r\n */\r\nexport function addAliasToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si l'alias @ est déjà configuré\r\n if (content.includes(\"resolve:\") && content.includes(\"alias:\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import de path si pas déjà présent\r\n if (!content.includes(\"import path from\")) {\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n content = 'import path from \"path\";\\n' + content;\r\n }\r\n }\r\n\r\n // Ajouter resolve.alias dans defineConfig\r\n const defineConfigRegex = /defineConfig\\(\\{([\\s\\S]*?)\\}\\)/;\r\n const match = content.match(defineConfigRegex);\r\n\r\n if (match) {\r\n const configContent = match[1];\r\n\r\n // Vérifier si resolve existe déjà\r\n if (configContent.includes(\"resolve:\")) {\r\n // Ajouter alias dans resolve existant (pointe vers la racine pour accéder à src/, lib/, ui/)\r\n const resolveRegex = /resolve:\\s*\\{([\\s\\S]*?)\\}/;\r\n const resolveMatch = configContent.match(resolveRegex);\r\n\r\n if (resolveMatch && !resolveMatch[1].includes(\"alias:\")) {\r\n const newResolve = `resolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },${resolveMatch[1]}\\n }`;\r\n content = content.replace(resolveRegex, newResolve);\r\n }\r\n } else {\r\n // Ajouter resolve avec alias (pointe vers la racine pour accéder à src/, lib/, ui/)\r\n const resolveConfig = '\\n resolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \".\"),\\n },\\n },';\r\n content = content.replace(\r\n defineConfigRegex,\r\n `defineConfig({${resolveConfig}${configContent}})`\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error adding alias to vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Ajoute le plugin Tailwind CSS à vite.config.ts\r\n */\r\nexport function addTailwindToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si tailwindcss est déjà importé\r\n if (content.includes(\"@tailwindcss/vite\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import\r\n // Chercher la ligne d'import de 'vite' pour ajouter après\r\n const viteImportRegex = /import\\s+{[^}]+}\\s+from\\s+['\"]vite['\"]/;\r\n const match = content.match(viteImportRegex);\r\n\r\n if (match) {\r\n const importStatement = '\\nimport tailwindcss from \"@tailwindcss/vite\";';\r\n content = content.replace(\r\n viteImportRegex,\r\n match[0] + importStatement\r\n );\r\n } else {\r\n // Si pas trouvé, ajouter en haut après les imports existants\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n const firstNewline = content.indexOf(\"\\n\", firstImport);\r\n content =\r\n content.slice(0, firstNewline + 1) +\r\n 'import tailwindcss from \"@tailwindcss/vite\";\\n' +\r\n content.slice(firstNewline + 1);\r\n }\r\n }\r\n\r\n // Ajouter le plugin dans le tableau plugins\r\n // Chercher plugins: [...]\r\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/;\r\n const pluginsMatch = content.match(pluginsRegex);\r\n\r\n if (pluginsMatch) {\r\n const pluginsContent = pluginsMatch[1].trim();\r\n let newPluginsContent: string;\r\n\r\n if (pluginsContent === \"\") {\r\n // Tableau vide\r\n newPluginsContent = \"tailwindcss()\";\r\n } else {\r\n // Ajouter tailwindcss() à la fin\r\n newPluginsContent = pluginsContent + \",\\n tailwindcss()\";\r\n }\r\n\r\n content = content.replace(\r\n pluginsRegex,\r\n `plugins: [\\n ${newPluginsContent}\\n ]`\r\n );\r\n } else {\r\n // Si pas de plugins, ajouter la propriété\r\n // Chercher defineConfig({\r\n const defineConfigRegex = /defineConfig\\(\\{/;\r\n if (defineConfigRegex.test(content)) {\r\n content = content.replace(\r\n defineConfigRegex,\r\n \"defineConfig({\\n plugins: [tailwindcss()],\"\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error modifying vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n","import { readFileSync, writeFileSync, existsSync } from \"fs\";\r\n\r\n/**\r\n * Supprime les commentaires d'un fichier JSON (pour supporter les tsconfig avec commentaires)\r\n */\r\nfunction stripJsonComments(jsonString: string): string {\r\n // Supprimer les commentaires // (ligne)\r\n jsonString = jsonString.replace(/\\/\\/.*$/gm, \"\");\r\n\r\n // Supprimer les commentaires /* */ (bloc)\r\n jsonString = jsonString.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\r\n\r\n // Supprimer les trailing commas avant } ou ]\r\n jsonString = jsonString.replace(/,(\\s*[}\\]])/g, \"$1\");\r\n\r\n return jsonString;\r\n}\r\n\r\n/**\r\n * Configure un fichier tsconfig.json avec l'alias @ et les includes\r\n */\r\nexport function configureTsconfigForAlias(\r\n path: string,\r\n isAppConfig: boolean = false\r\n): boolean {\r\n if (!existsSync(path)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const content = readFileSync(path, \"utf-8\");\r\n\r\n // Supprimer les commentaires avant de parser\r\n const cleanContent = stripJsonComments(content);\r\n const tsconfig = JSON.parse(cleanContent);\r\n\r\n // Ajouter compilerOptions si absent\r\n if (!tsconfig.compilerOptions) {\r\n tsconfig.compilerOptions = {};\r\n }\r\n\r\n // Ajouter baseUrl\r\n tsconfig.compilerOptions.baseUrl = \".\";\r\n\r\n // Ajouter paths pour l'alias @\r\n if (!tsconfig.compilerOptions.paths) {\r\n tsconfig.compilerOptions.paths = {};\r\n }\r\n tsconfig.compilerOptions.paths[\"@/*\"] = [\"./*\"];\r\n\r\n // Pour tsconfig.app.json, ajouter ui et lib dans include\r\n if (isAppConfig && Array.isArray(tsconfig.include)) {\r\n const includes = new Set(tsconfig.include);\r\n includes.add(\"ui\");\r\n includes.add(\"lib\");\r\n tsconfig.include = Array.from(includes);\r\n }\r\n\r\n // Écrire le fichier avec une indentation propre\r\n writeFileSync(path, JSON.stringify(tsconfig, null, 2) + \"\\n\", \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(`Error configuring ${path}:`, error);\r\n return false;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport https from \"https\";\r\nimport { isProjectInitialized, readConfig } from \"../utils/config.js\";\r\n\r\n// URL du registry des composants (GitHub raw)\r\nconst REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/packages/components\";\r\n\r\n// Mapping des composants disponibles et leurs dépendances\r\nconst COMPONENTS_MAP: Record<\r\n string,\r\n { file: string; dependencies?: Array<{ file: string; subdir?: string }> }\r\n> = {\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [\r\n { file: \"internals/Slot.tsx\", subdir: \"internals\" }, // Slot doit être dans internals/\r\n ],\r\n },\r\n // Ajoutez d'autres composants ici au fur et à mesure\r\n};\r\n\r\n// Fonction pour télécharger un fichier depuis une URL\r\nfunction downloadFile(url: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n https\r\n .get(url, (res) => {\r\n if (res.statusCode !== 200) {\r\n reject(new Error(`Failed to download: ${res.statusCode}`));\r\n return;\r\n }\r\n\r\n let data = \"\";\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n res.on(\"end\", () => {\r\n resolve(data);\r\n });\r\n })\r\n .on(\"error\", reject);\r\n });\r\n}\r\n\r\nasync function addComponent(componentName: string) {\r\n // Vérifier si le projet est initialisé\r\n if (!isProjectInitialized()) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Le projet n'est pas initialisé. Exécutez d'abord 'behsseui init'.\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(`Téléchargement du composant ${componentName}...`).start();\r\n\r\n try {\r\n // Vérifier si le composant existe\r\n if (!COMPONENTS_MAP[componentName]) {\r\n spinner.fail(chalk.red(`Le composant \"${componentName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nComposants disponibles:\"),\r\n Object.keys(COMPONENTS_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const componentConfig = COMPONENTS_MAP[componentName];\r\n const config = readConfig();\r\n const targetDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le dossier principal si nécessaire\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les dépendances d'abord\r\n if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {\r\n spinner.text = `Téléchargement des dépendances...`;\r\n\r\n for (const dep of componentConfig.dependencies) {\r\n const depUrl = `${REGISTRY_URL}/${dep.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n\r\n // Créer le sous-dossier si spécifié\r\n const depTargetDir = dep.subdir\r\n ? join(targetDir, dep.subdir)\r\n : targetDir;\r\n\r\n if (!existsSync(depTargetDir)) {\r\n mkdirSync(depTargetDir, { recursive: true });\r\n }\r\n\r\n // Extraire le nom du fichier depuis le path\r\n const depFileName = dep.file.split('/').pop()!;\r\n const depTargetPath = join(depTargetDir, depFileName);\r\n writeFileSync(depTargetPath, depContent, \"utf-8\");\r\n }\r\n }\r\n\r\n // Télécharger le composant principal\r\n const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;\r\n spinner.text = `Téléchargement de ${componentName}...`;\r\n const componentContent = await downloadFile(componentUrl);\r\n\r\n // Écrire le composant principal\r\n const targetComponentPath = join(targetDir, componentConfig.file);\r\n writeFileSync(targetComponentPath, componentContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Composant ${componentName} ajouté avec succès dans ${config.componentsDir}/`\r\n )\r\n );\r\n\r\n console.log(\r\n chalk.cyan(\"\\n📦 Vous pouvez maintenant l'importer dans votre projet:\")\r\n );\r\n console.log(\r\n chalk.gray(\r\n `import { ${componentName} } from \"${config.componentsDir}/${componentConfig.file.replace(\".tsx\", \"\")}\";`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'installation du composant\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const add = new Command()\r\n .name(\"add\")\r\n .description(\"Ajouter un composant à votre projet\")\r\n .argument(\"<component>\", \"Nom du composant à ajouter\")\r\n .action(addComponent);\r\n"],"mappings":"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","names":["Command","existsSync","writeFileSync","readFileSync","join","dirname","execSync","existsSync","join","readFileSync","join","existsSync","readFileSync","join","existsSync","join","readFileSync","writeFileSync","join","readFileSync","writeFileSync","existsSync","join","existsSync","dirname","writeFileSync","readFileSync","execSync","Command","existsSync","mkdirSync","writeFileSync","join","chalk","ora","chalk","ora","join","existsSync","mkdirSync","writeFileSync","Command","Command"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "behsseui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "CLI to add behsseui components to your projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Behsse",
|
|
@@ -31,24 +31,17 @@
|
|
|
31
31
|
"ui"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"commander": "^12.1.0",
|
|
35
|
-
"prompts": "^2.4.2",
|
|
36
34
|
"chalk": "^5.3.0",
|
|
37
|
-
"
|
|
35
|
+
"commander": "^12.1.0",
|
|
38
36
|
"fs-extra": "^11.2.0",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
37
|
+
"ora": "^8.1.1",
|
|
38
|
+
"prompts": "^2.4.2"
|
|
41
39
|
},
|
|
42
40
|
"devDependencies": {
|
|
43
41
|
"@types/fs-extra": "^11.0.4",
|
|
44
42
|
"@types/node": "^22.10.5",
|
|
45
43
|
"@types/prompts": "^2.4.9",
|
|
46
|
-
"@types/react": "^18.3.18",
|
|
47
|
-
"react": "^18.3.1",
|
|
48
44
|
"tsup": "^8.3.5",
|
|
49
45
|
"typescript": "^5.9.3"
|
|
50
|
-
},
|
|
51
|
-
"peerDependencies": {
|
|
52
|
-
"react": "^18.0.0"
|
|
53
46
|
}
|
|
54
47
|
}
|