@lastbrain/app 0.1.24 → 0.1.26

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.
Files changed (87) hide show
  1. package/dist/__tests__/module-registry.test.d.ts +2 -0
  2. package/dist/__tests__/module-registry.test.d.ts.map +1 -0
  3. package/dist/__tests__/module-registry.test.js +64 -0
  4. package/dist/app-shell/(admin)/layout.d.ts +3 -2
  5. package/dist/app-shell/(admin)/layout.d.ts.map +1 -1
  6. package/dist/app-shell/(admin)/layout.js +1 -1
  7. package/dist/app-shell/(auth)/layout.d.ts +3 -2
  8. package/dist/app-shell/(auth)/layout.d.ts.map +1 -1
  9. package/dist/app-shell/(auth)/layout.js +1 -1
  10. package/dist/app-shell/(public)/page.d.ts.map +1 -1
  11. package/dist/cli.js +50 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +4 -0
  15. package/dist/layouts/AdminLayout.d.ts +3 -2
  16. package/dist/layouts/AdminLayout.d.ts.map +1 -1
  17. package/dist/layouts/AdminLayoutWithSidebar.d.ts +8 -0
  18. package/dist/layouts/AdminLayoutWithSidebar.d.ts.map +1 -0
  19. package/dist/layouts/AdminLayoutWithSidebar.js +9 -0
  20. package/dist/layouts/AppProviders.d.ts +3 -2
  21. package/dist/layouts/AppProviders.d.ts.map +1 -1
  22. package/dist/layouts/AuthLayout.d.ts +3 -2
  23. package/dist/layouts/AuthLayout.d.ts.map +1 -1
  24. package/dist/layouts/AuthLayoutWithSidebar.d.ts +8 -0
  25. package/dist/layouts/AuthLayoutWithSidebar.d.ts.map +1 -0
  26. package/dist/layouts/AuthLayoutWithSidebar.js +9 -0
  27. package/dist/layouts/PublicLayout.d.ts +3 -2
  28. package/dist/layouts/PublicLayout.d.ts.map +1 -1
  29. package/dist/layouts/RootLayout.d.ts +3 -2
  30. package/dist/layouts/RootLayout.d.ts.map +1 -1
  31. package/dist/scripts/db-init.js +2 -2
  32. package/dist/scripts/db-migrations-sync.js +5 -5
  33. package/dist/scripts/dev-sync.js +21 -10
  34. package/dist/scripts/init-app.d.ts.map +1 -1
  35. package/dist/scripts/init-app.js +126 -21
  36. package/dist/scripts/module-add.d.ts.map +1 -1
  37. package/dist/scripts/module-add.js +20 -7
  38. package/dist/scripts/module-build.d.ts.map +1 -1
  39. package/dist/scripts/module-build.js +285 -30
  40. package/dist/scripts/module-create.d.ts.map +1 -1
  41. package/dist/scripts/module-create.js +25 -15
  42. package/dist/scripts/module-remove.d.ts.map +1 -1
  43. package/dist/scripts/module-remove.js +24 -11
  44. package/dist/scripts/script-runner.d.ts +5 -0
  45. package/dist/scripts/script-runner.d.ts.map +1 -0
  46. package/dist/scripts/script-runner.js +25 -0
  47. package/dist/styles.css +1 -1
  48. package/dist/templates/DefaultDoc.js +1 -7
  49. package/dist/templates/DocPage.d.ts.map +1 -1
  50. package/dist/templates/DocPage.js +14 -14
  51. package/dist/templates/components/AppAside.d.ts +6 -0
  52. package/dist/templates/components/AppAside.d.ts.map +1 -0
  53. package/dist/templates/components/AppAside.js +9 -0
  54. package/dist/templates/layouts/admin-layout.d.ts +4 -0
  55. package/dist/templates/layouts/admin-layout.d.ts.map +1 -0
  56. package/dist/templates/layouts/admin-layout.js +6 -0
  57. package/dist/templates/layouts/auth-layout.d.ts +4 -0
  58. package/dist/templates/layouts/auth-layout.d.ts.map +1 -0
  59. package/dist/templates/layouts/auth-layout.js +6 -0
  60. package/package.json +2 -1
  61. package/src/__tests__/module-registry.test.ts +74 -0
  62. package/src/app-shell/(admin)/layout.tsx +5 -3
  63. package/src/app-shell/(auth)/layout.tsx +5 -3
  64. package/src/app-shell/(public)/page.tsx +6 -2
  65. package/src/auth/useAuthSession.ts +1 -1
  66. package/src/cli.ts +51 -1
  67. package/src/index.ts +6 -0
  68. package/src/layouts/AdminLayout.tsx +1 -3
  69. package/src/layouts/AdminLayoutWithSidebar.tsx +35 -0
  70. package/src/layouts/AppProviders.tsx +3 -5
  71. package/src/layouts/AuthLayout.tsx +1 -3
  72. package/src/layouts/AuthLayoutWithSidebar.tsx +35 -0
  73. package/src/layouts/PublicLayout.tsx +1 -3
  74. package/src/layouts/RootLayout.tsx +1 -2
  75. package/src/scripts/db-init.ts +13 -8
  76. package/src/scripts/db-migrations-sync.ts +4 -4
  77. package/src/scripts/dev-sync.ts +49 -18
  78. package/src/scripts/init-app.ts +246 -73
  79. package/src/scripts/module-add.ts +49 -23
  80. package/src/scripts/module-build.ts +393 -88
  81. package/src/scripts/module-create.ts +85 -49
  82. package/src/scripts/module-remove.ts +116 -57
  83. package/src/scripts/readme-build.ts +2 -2
  84. package/src/scripts/script-runner.ts +28 -0
  85. package/src/templates/AuthGuidePage.tsx +1 -1
  86. package/src/templates/DefaultDoc.tsx +7 -7
  87. package/src/templates/DocPage.tsx +74 -46
@@ -38,6 +38,12 @@ export async function initApp(options) {
38
38
  withAuth = selectedModules.includes("auth");
39
39
  console.log();
40
40
  }
41
+ else if (!interactive) {
42
+ // En mode non-interactif, installer auth et ai par défaut
43
+ selectedModules.push("auth", "ai");
44
+ withAuth = true;
45
+ console.log(chalk.blue("📦 Modules installés par défaut : Authentication, AI Generation\n"));
46
+ }
41
47
  // Créer le dossier s'il n'existe pas
42
48
  await fs.ensureDir(targetDir);
43
49
  // 1. Vérifier/créer package.json
@@ -58,7 +64,10 @@ export async function initApp(options) {
58
64
  // 8. Ajouter les scripts NPM
59
65
  await addScriptsToPackageJson(targetDir);
60
66
  // 9. Enregistrer les modules sélectionnés
61
- if (withAuth || selectedModules.length > 0) {
67
+ if (withAuth && !selectedModules.includes("auth")) {
68
+ selectedModules.push("auth");
69
+ }
70
+ if (selectedModules.length > 0) {
62
71
  await saveModulesConfig(targetDir, selectedModules, withAuth);
63
72
  }
64
73
  console.log(chalk.green("\n✅ Application LastBrain initialisée avec succès!\n"));
@@ -80,6 +89,14 @@ export async function initApp(options) {
80
89
  console.log(chalk.yellow("🔧 Génération des routes des modules...\n"));
81
90
  execSync("pnpm build:modules", { cwd: targetDir, stdio: "inherit" });
82
91
  console.log(chalk.green("\n✓ Routes des modules générées\n"));
92
+ console.log(chalk.yellow("🗄️ Initialisation de la base de données...\n"));
93
+ try {
94
+ execSync("pnpm db:init", { cwd: targetDir, stdio: "inherit" });
95
+ console.log(chalk.green("\n✓ Base de données initialisée\n"));
96
+ }
97
+ catch (dbError) {
98
+ console.log(chalk.yellow("\n⚠️ Erreur d'initialisation de la DB (normal si Supabase pas configuré)\n"));
99
+ }
83
100
  // Détecter le port (par défaut 3000 pour Next.js)
84
101
  const port = 3000;
85
102
  const url = `http://127.0.0.1:${port}`;
@@ -92,24 +109,29 @@ export async function initApp(options) {
92
109
  console.log(chalk.white(" 4. Exécutez : pnpm db:init"));
93
110
  console.log(chalk.white(" 5. Rechargez la page\n"));
94
111
  // Ouvrir le navigateur
95
- const openCommand = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
112
+ const openCommand = process.platform === "darwin"
113
+ ? "open"
114
+ : process.platform === "win32"
115
+ ? "start"
116
+ : "xdg-open";
96
117
  setTimeout(() => {
97
118
  try {
98
119
  execSync(`${openCommand} ${url}`, { stdio: "ignore" });
99
120
  }
100
- catch (error) {
121
+ catch {
101
122
  // Ignorer les erreurs d'ouverture du navigateur
102
123
  }
103
124
  }, 2000);
104
125
  // Lancer pnpm dev
105
126
  execSync("pnpm dev", { cwd: targetDir, stdio: "inherit" });
106
127
  }
107
- catch (error) {
128
+ catch {
108
129
  console.error(chalk.red("\n❌ Erreur lors du lancement\n"));
109
130
  console.log(chalk.cyan("\nVous pouvez lancer manuellement avec :"));
110
131
  console.log(chalk.white(` cd ${relativePath}`));
111
132
  console.log(chalk.white(" pnpm install"));
112
133
  console.log(chalk.white(" pnpm build:modules"));
134
+ console.log(chalk.white(" pnpm db:init"));
113
135
  console.log(chalk.white(" pnpm dev\n"));
114
136
  }
115
137
  }
@@ -118,6 +140,8 @@ export async function initApp(options) {
118
140
  console.log(chalk.white(" 1. cd " + relativePath));
119
141
  console.log(chalk.white(" 2. pnpm install (installer les dépendances)"));
120
142
  console.log(chalk.white(" 3. pnpm build:modules (générer les routes des modules)"));
143
+ console.log(chalk.white(" 4. pnpm db:init (initialiser la base de données)"));
144
+ console.log(chalk.white(" 5. pnpm dev (lancer le serveur)"));
121
145
  console.log(chalk.white(" 4. pnpm db:init (initialiser Supabase)"));
122
146
  console.log(chalk.white(" 5. pnpm dev (démarrer le serveur)\n"));
123
147
  console.log(chalk.gray("Prérequis pour Supabase :"));
@@ -182,7 +206,7 @@ function getLastBrainVersions(targetDir) {
182
206
  };
183
207
  }
184
208
  }
185
- catch (error) {
209
+ catch {
186
210
  console.warn(chalk.yellow("⚠️ Impossible de lire les versions locales, utilisation de 'latest'"));
187
211
  }
188
212
  // Fallback: utiliser "latest"
@@ -214,7 +238,7 @@ async function addDependencies(targetDir, useHeroUI, withAuth, selectedModules =
214
238
  }
215
239
  // Ajouter les autres modules sélectionnés
216
240
  for (const moduleName of selectedModules) {
217
- const moduleInfo = AVAILABLE_MODULES.find(m => m.name === moduleName);
241
+ const moduleInfo = AVAILABLE_MODULES.find((m) => m.name === moduleName);
218
242
  if (moduleInfo && moduleInfo.package !== "@lastbrain/module-auth") {
219
243
  // Pour les autres modules, utiliser "latest" ou la version depuis le package
220
244
  requiredDeps[moduleInfo.package] = versions.app; // Utiliser la même version que app
@@ -223,6 +247,7 @@ async function addDependencies(targetDir, useHeroUI, withAuth, selectedModules =
223
247
  // Ajouter les dépendances HeroUI si nécessaire
224
248
  if (useHeroUI) {
225
249
  // Tous les packages HeroUI nécessaires (car @lastbrain/ui les ré-exporte)
250
+ requiredDeps["@heroui/system"] = "^2.4.23";
226
251
  requiredDeps["@heroui/theme"] = "^2.4.23";
227
252
  requiredDeps["@heroui/accordion"] = "^2.2.24";
228
253
  requiredDeps["@heroui/alert"] = "^2.2.27";
@@ -257,7 +282,6 @@ async function addDependencies(targetDir, useHeroUI, withAuth, selectedModules =
257
282
  requiredDeps["@heroui/switch"] = "^2.2.24";
258
283
  requiredDeps["@heroui/table"] = "^2.2.27";
259
284
  requiredDeps["@heroui/tabs"] = "^2.2.24";
260
- requiredDeps["@heroui/system"] = "^2.4.23"; // Ajout pour HeroUIProvider
261
285
  requiredDeps["@heroui/toast"] = "^2.0.17";
262
286
  requiredDeps["@heroui/tooltip"] = "^2.2.24";
263
287
  requiredDeps["@heroui/user"] = "^2.2.22";
@@ -435,9 +459,12 @@ export default function NotFound() {
435
459
  }
436
460
  // Créer les routes avec leurs layouts
437
461
  await createRoute(appDir, "admin", "admin", force);
462
+ await createRoute(appDir, "auth", "auth", force);
438
463
  await createRoute(appDir, "docs", "public", force);
439
464
  // Créer le composant AppHeader
440
465
  await createAppHeader(targetDir, force);
466
+ // Créer le composant AppAside
467
+ await createAppAside(targetDir, force);
441
468
  }
442
469
  async function createRoute(appDir, routeName, layoutType, force) {
443
470
  const routeDir = path.join(appDir, routeName);
@@ -445,11 +472,48 @@ async function createRoute(appDir, routeName, layoutType, force) {
445
472
  // Layout pour la route
446
473
  const layoutPath = path.join(routeDir, "layout.tsx");
447
474
  if (!fs.existsSync(layoutPath) || force) {
448
- const layoutComponent = layoutType.charAt(0).toUpperCase() + layoutType.slice(1) + "Layout";
449
- const layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
475
+ let layoutContent = "";
476
+ if (routeName === "admin") {
477
+ // Layout admin avec sidebar
478
+ layoutContent = `import { AdminLayoutWithSidebar } from "@lastbrain/app";
479
+ import { menuConfig } from "../../config/menu";
480
+
481
+ export default function AdminLayout({
482
+ children,
483
+ }: {
484
+ children: React.ReactNode;
485
+ }) {
486
+ return (
487
+ <AdminLayoutWithSidebar menuConfig={menuConfig}>
488
+ {children}
489
+ </AdminLayoutWithSidebar>
490
+ );
491
+ }`;
492
+ }
493
+ else if (routeName === "auth") {
494
+ // Layout auth avec sidebar
495
+ layoutContent = `import { AuthLayoutWithSidebar } from "@lastbrain/app";
496
+ import { menuConfig } from "../../config/menu";
497
+
498
+ export default function AuthLayout({
499
+ children,
500
+ }: {
501
+ children: React.ReactNode;
502
+ }) {
503
+ return (
504
+ <AuthLayoutWithSidebar menuConfig={menuConfig}>
505
+ {children}
506
+ </AuthLayoutWithSidebar>
507
+ );
508
+ }`;
509
+ }
510
+ else {
511
+ // Layout standard pour les autres routes
512
+ const layoutComponent = layoutType.charAt(0).toUpperCase() + layoutType.slice(1) + "Layout";
513
+ layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
450
514
 
451
- export default ${layoutComponent};
452
- `;
515
+ export default ${layoutComponent};`;
516
+ }
453
517
  await fs.writeFile(layoutPath, layoutContent);
454
518
  console.log(chalk.green(`✓ app/${routeName}/layout.tsx créé`));
455
519
  }
@@ -544,6 +608,41 @@ export function AppHeader() {
544
608
  console.log(chalk.gray(" components/AppHeader.tsx existe déjà (utilisez --force pour écraser)"));
545
609
  }
546
610
  }
611
+ async function createAppAside(targetDir, force) {
612
+ const componentsDir = path.join(targetDir, "components");
613
+ await fs.ensureDir(componentsDir);
614
+ const asidePath = path.join(componentsDir, "AppAside.tsx");
615
+ if (!fs.existsSync(asidePath) || force) {
616
+ const asideContent = `"use client";
617
+
618
+ import { AppAside as UIAppAside } from "@lastbrain/app";
619
+ import { useAuthSession } from "@lastbrain/app";
620
+ import { menuConfig } from "../config/menu";
621
+
622
+ interface AppAsideProps {
623
+ className?: string;
624
+ isVisible?: boolean;
625
+ }
626
+
627
+ export function AppAside({ className = "", isVisible = true }: AppAsideProps) {
628
+ const { isSuperAdmin } = useAuthSession();
629
+
630
+ return (
631
+ <UIAppAside
632
+ className={className}
633
+ menuConfig={menuConfig}
634
+ isSuperAdmin={isSuperAdmin}
635
+ isVisible={isVisible}
636
+ />
637
+ );
638
+ }`;
639
+ await fs.writeFile(asidePath, asideContent);
640
+ console.log(chalk.green("✓ components/AppAside.tsx créé"));
641
+ }
642
+ else {
643
+ console.log(chalk.gray(" components/AppAside.tsx existe déjà (utilisez --force pour écraser)"));
644
+ }
645
+ }
547
646
  async function createConfigFiles(targetDir, force, useHeroUI) {
548
647
  console.log(chalk.yellow("\n⚙️ Création des fichiers de configuration..."));
549
648
  // middleware.ts - Protection des routes /auth/* et /admin/*
@@ -903,21 +1002,26 @@ async function addScriptsToPackageJson(targetDir) {
903
1002
  // Détecter si le projet cible est dans un workspace
904
1003
  const targetIsInMonorepo = fs.existsSync(path.join(targetDir, "../../../packages/core/package.json")) ||
905
1004
  fs.existsSync(path.join(targetDir, "../../packages/core/package.json"));
906
- let scriptsPrefix = "node node_modules/@lastbrain/app/dist/scripts/";
907
- if (targetIsInMonorepo) {
908
- // Dans un monorepo, utiliser pnpm exec pour résoudre correctement les workspace packages
909
- scriptsPrefix = "pnpm exec lastbrain ";
1005
+ let scriptsPrefix = "lastbrain";
1006
+ if (!targetIsInMonorepo) {
1007
+ // Hors monorepo, utiliser le chemin direct vers le CLI
1008
+ scriptsPrefix = "node node_modules/@lastbrain/app/dist/cli.js";
910
1009
  }
911
1010
  const scripts = {
1011
+ predev: targetIsInMonorepo
1012
+ ? "pnpm --filter @lastbrain/core build && pnpm --filter @lastbrain/ui build && pnpm --filter @lastbrain/module-auth build && pnpm --filter @lastbrain/module-ai build"
1013
+ : "echo 'No prebuild needed outside monorepo'",
912
1014
  dev: "next dev",
913
1015
  build: "next build",
914
1016
  start: "next start",
915
1017
  lint: "next lint",
916
- lastbrain: "node node_modules/@lastbrain/app/dist/cli.js",
917
- "build:modules": "node node_modules/@lastbrain/app/dist/scripts/module-build.js",
918
- "db:migrations:sync": "node node_modules/@lastbrain/app/dist/scripts/db-migrations-sync.js",
919
- "db:init": "node node_modules/@lastbrain/app/dist/scripts/db-init.js",
920
- "readme:create": "node node_modules/@lastbrain/app/dist/scripts/readme-build.js",
1018
+ lastbrain: targetIsInMonorepo
1019
+ ? "lastbrain"
1020
+ : "node node_modules/@lastbrain/app/dist/cli.js",
1021
+ "build:modules": `${scriptsPrefix} module:build`,
1022
+ "db:migrations:sync": `${scriptsPrefix} db:migrations:sync`,
1023
+ "db:init": `${scriptsPrefix} db:init`,
1024
+ "readme:create": `${scriptsPrefix} readme:create`,
921
1025
  };
922
1026
  pkg.scripts = { ...pkg.scripts, ...scripts };
923
1027
  await fs.writeJson(pkgPath, pkg, { spaces: 2 });
@@ -929,7 +1033,8 @@ async function saveModulesConfig(targetDir, selectedModules, withAuth) {
929
1033
  const modules = [];
930
1034
  // Ajouter TOUS les modules disponibles
931
1035
  for (const availableModule of AVAILABLE_MODULES) {
932
- const isSelected = selectedModules.includes(availableModule.name) || (withAuth && availableModule.name === 'auth');
1036
+ const isSelected = selectedModules.includes(availableModule.name) ||
1037
+ (withAuth && availableModule.name === "auth");
933
1038
  // Vérifier si le module a des migrations
934
1039
  const modulePath = path.join(targetDir, "node_modules", ...availableModule.package.split("/"));
935
1040
  const migrationsDir = path.join(modulePath, "supabase", "migrations");
@@ -1 +1 @@
1
- {"version":3,"file":"module-add.d.ts","sourceRoot":"","sources":["../../src/scripts/module-add.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAsB/C,CAAC;AAEF,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAwMpE"}
1
+ {"version":3,"file":"module-add.d.ts","sourceRoot":"","sources":["../../src/scripts/module-add.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAqB/C,CAAC;AAEF,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAmOpE"}
@@ -58,12 +58,12 @@ export async function addModule(moduleName, targetDir) {
58
58
  try {
59
59
  execSync("pnpm install", { cwd: targetDir, stdio: "inherit" });
60
60
  }
61
- catch (error) {
61
+ catch {
62
62
  console.error(chalk.red("❌ Erreur lors de l'installation"));
63
63
  process.exit(1);
64
64
  }
65
65
  // 5. Copier les migrations du module
66
- let copiedMigrationFiles = [];
66
+ const copiedMigrationFiles = [];
67
67
  if (module.hasMigrations) {
68
68
  console.log(chalk.yellow("\n📋 Copie des migrations du module..."));
69
69
  // Trouver le chemin du module installé
@@ -116,17 +116,20 @@ export async function addModule(moduleName, targetDir) {
116
116
  execSync("supabase db reset", { cwd: targetDir, stdio: "inherit" });
117
117
  console.log(chalk.green("✓ Base de données réinitialisée"));
118
118
  }
119
- catch (error) {
119
+ catch {
120
120
  console.error(chalk.red("❌ Erreur lors du reset"));
121
121
  }
122
122
  }
123
123
  else if (migrationAction === "push") {
124
124
  console.log(chalk.yellow("\n⬆️ Application des nouvelles migrations..."));
125
125
  try {
126
- execSync("supabase migration up", { cwd: targetDir, stdio: "inherit" });
126
+ execSync("supabase migration up", {
127
+ cwd: targetDir,
128
+ stdio: "inherit",
129
+ });
127
130
  console.log(chalk.green("✓ Migrations appliquées"));
128
131
  }
129
- catch (error) {
132
+ catch {
130
133
  console.error(chalk.red("❌ Erreur lors de l'application des migrations"));
131
134
  }
132
135
  }
@@ -147,7 +150,7 @@ export async function addModule(moduleName, targetDir) {
147
150
  }
148
151
  // Initialiser tous les modules disponibles s'ils n'existent pas
149
152
  for (const availableModule of AVAILABLE_MODULES) {
150
- const exists = modulesConfig.modules.find(m => m.package === availableModule.package);
153
+ const exists = modulesConfig.modules.find((m) => m.package === availableModule.package);
151
154
  if (!exists) {
152
155
  modulesConfig.modules.push({
153
156
  package: availableModule.package,
@@ -174,5 +177,15 @@ export async function addModule(moduleName, targetDir) {
174
177
  }
175
178
  await fs.writeJson(modulesConfigPath, modulesConfig, { spaces: 2 });
176
179
  console.log(chalk.green(`\n✅ Module ${module.displayName} ajouté avec succès!\n`));
177
- console.log(chalk.gray("Le serveur de développement redémarrera automatiquement.\n"));
180
+ // 7. Générer automatiquement les routes du module
181
+ console.log(chalk.yellow("🔧 Génération des routes du module..."));
182
+ try {
183
+ execSync("pnpm build:modules", { cwd: targetDir, stdio: "inherit" });
184
+ console.log(chalk.green("✓ Routes du module générées"));
185
+ }
186
+ catch (error) {
187
+ console.error(chalk.red("❌ Erreur lors de la génération des routes"));
188
+ console.error(chalk.gray("Vous pouvez les générer manuellement avec: pnpm build:modules"));
189
+ }
190
+ console.log(chalk.gray("\nLe serveur de développement redémarrera automatiquement.\n"));
178
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../src/scripts/module-build.ts"],"names":[],"mappings":"AAseA,wBAAsB,cAAc,kBAanC"}
1
+ {"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../src/scripts/module-build.ts"],"names":[],"mappings":"AA+vBA,wBAAsB,cAAc,kBAuCnC"}