@lastbrain/app 2.0.1 → 2.0.2

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 (131) hide show
  1. package/dist/config/version.d.ts +7 -0
  2. package/dist/config/version.d.ts.map +1 -0
  3. package/dist/config/version.js +25 -0
  4. package/dist/src/__tests__/module-registry.test.d.ts +2 -0
  5. package/dist/src/__tests__/module-registry.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/module-registry.test.js +53 -0
  7. package/dist/src/app-shell/(admin)/layout.d.ts +4 -0
  8. package/dist/src/app-shell/(admin)/layout.d.ts.map +1 -0
  9. package/dist/src/app-shell/(admin)/layout.js +5 -0
  10. package/dist/src/app-shell/(auth)/layout.d.ts +4 -0
  11. package/dist/src/app-shell/(auth)/layout.d.ts.map +1 -0
  12. package/dist/src/app-shell/(auth)/layout.js +5 -0
  13. package/dist/src/app-shell/(public)/page.d.ts +2 -0
  14. package/dist/src/app-shell/(public)/page.d.ts.map +1 -0
  15. package/dist/src/app-shell/(public)/page.js +5 -0
  16. package/dist/src/app-shell/layout.d.ts +3 -0
  17. package/dist/src/app-shell/layout.d.ts.map +1 -0
  18. package/dist/src/app-shell/layout.js +3 -0
  19. package/dist/src/app-shell/not-found.d.ts +2 -0
  20. package/dist/src/app-shell/not-found.d.ts.map +1 -0
  21. package/dist/src/app-shell/not-found.js +10 -0
  22. package/dist/src/auth/authHelpers.d.ts +7 -0
  23. package/dist/src/auth/authHelpers.d.ts.map +1 -0
  24. package/dist/src/auth/authHelpers.js +19 -0
  25. package/dist/src/auth/useAuthSession.d.ts +7 -0
  26. package/dist/src/auth/useAuthSession.d.ts.map +1 -0
  27. package/dist/src/auth/useAuthSession.js +49 -0
  28. package/dist/src/cli.d.ts +3 -0
  29. package/dist/src/cli.d.ts.map +1 -0
  30. package/dist/src/cli.js +143 -0
  31. package/dist/src/components/NotificationContainer.d.ts +2 -0
  32. package/dist/src/components/NotificationContainer.d.ts.map +1 -0
  33. package/dist/src/components/NotificationContainer.js +8 -0
  34. package/dist/src/hooks/useNotifications.d.ts +30 -0
  35. package/dist/src/hooks/useNotifications.d.ts.map +1 -0
  36. package/dist/src/hooks/useNotifications.js +165 -0
  37. package/dist/src/index.d.ts +22 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +22 -0
  40. package/dist/src/layouts/AdminLayout.d.ts +4 -0
  41. package/dist/src/layouts/AdminLayout.d.ts.map +1 -0
  42. package/dist/src/layouts/AdminLayout.js +4 -0
  43. package/dist/src/layouts/AdminLayoutWithSidebar.d.ts +10 -0
  44. package/dist/src/layouts/AdminLayoutWithSidebar.d.ts.map +1 -0
  45. package/dist/src/layouts/AdminLayoutWithSidebar.js +62 -0
  46. package/dist/src/layouts/AppProviders.d.ts +27 -0
  47. package/dist/src/layouts/AppProviders.d.ts.map +1 -0
  48. package/dist/src/layouts/AppProviders.js +48 -0
  49. package/dist/src/layouts/AuthLayout.d.ts +4 -0
  50. package/dist/src/layouts/AuthLayout.d.ts.map +1 -0
  51. package/dist/src/layouts/AuthLayout.js +4 -0
  52. package/dist/src/layouts/AuthLayoutWithSidebar.d.ts +12 -0
  53. package/dist/src/layouts/AuthLayoutWithSidebar.d.ts.map +1 -0
  54. package/dist/src/layouts/AuthLayoutWithSidebar.js +60 -0
  55. package/dist/src/layouts/PublicLayout.d.ts +8 -0
  56. package/dist/src/layouts/PublicLayout.d.ts.map +1 -0
  57. package/dist/src/layouts/PublicLayout.js +6 -0
  58. package/dist/src/layouts/PublicLayoutWithSidebar.d.ts +9 -0
  59. package/dist/src/layouts/PublicLayoutWithSidebar.d.ts.map +1 -0
  60. package/dist/src/layouts/PublicLayoutWithSidebar.js +60 -0
  61. package/dist/src/layouts/RootLayout.d.ts +6 -0
  62. package/dist/src/layouts/RootLayout.d.ts.map +1 -0
  63. package/dist/src/layouts/RootLayout.js +9 -0
  64. package/dist/src/modules/module-loader.d.ts +5 -0
  65. package/dist/src/modules/module-loader.d.ts.map +1 -0
  66. package/dist/src/modules/module-loader.js +10 -0
  67. package/dist/src/scripts/db-init.d.ts +2 -0
  68. package/dist/src/scripts/db-init.d.ts.map +1 -0
  69. package/dist/src/scripts/db-init.js +300 -0
  70. package/dist/src/scripts/db-migrations-sync.d.ts +2 -0
  71. package/dist/src/scripts/db-migrations-sync.d.ts.map +1 -0
  72. package/dist/src/scripts/db-migrations-sync.js +84 -0
  73. package/dist/src/scripts/dev-sync.d.ts +2 -0
  74. package/dist/src/scripts/dev-sync.d.ts.map +1 -0
  75. package/dist/src/scripts/dev-sync.js +194 -0
  76. package/dist/src/scripts/init-app.d.ts +12 -0
  77. package/dist/src/scripts/init-app.d.ts.map +1 -0
  78. package/dist/src/scripts/init-app.js +2175 -0
  79. package/dist/src/scripts/module-add.d.ts +2 -0
  80. package/dist/src/scripts/module-add.d.ts.map +1 -0
  81. package/dist/src/scripts/module-add.js +232 -0
  82. package/dist/src/scripts/module-build.d.ts +2 -0
  83. package/dist/src/scripts/module-build.d.ts.map +1 -0
  84. package/dist/src/scripts/module-build.js +1280 -0
  85. package/dist/src/scripts/module-create.d.ts +28 -0
  86. package/dist/src/scripts/module-create.d.ts.map +1 -0
  87. package/dist/src/scripts/module-create.js +1429 -0
  88. package/dist/src/scripts/module-delete.d.ts +6 -0
  89. package/dist/src/scripts/module-delete.d.ts.map +1 -0
  90. package/dist/src/scripts/module-delete.js +147 -0
  91. package/dist/src/scripts/module-list.d.ts +2 -0
  92. package/dist/src/scripts/module-list.d.ts.map +1 -0
  93. package/dist/src/scripts/module-list.js +61 -0
  94. package/dist/src/scripts/module-remove.d.ts +2 -0
  95. package/dist/src/scripts/module-remove.d.ts.map +1 -0
  96. package/dist/src/scripts/module-remove.js +311 -0
  97. package/dist/src/scripts/readme-build.d.ts +2 -0
  98. package/dist/src/scripts/readme-build.d.ts.map +1 -0
  99. package/dist/src/scripts/readme-build.js +39 -0
  100. package/dist/src/scripts/script-runner.d.ts +5 -0
  101. package/dist/src/scripts/script-runner.d.ts.map +1 -0
  102. package/dist/src/scripts/script-runner.js +25 -0
  103. package/dist/src/templates/AuthGuidePage.d.ts +2 -0
  104. package/dist/src/templates/AuthGuidePage.d.ts.map +1 -0
  105. package/dist/src/templates/AuthGuidePage.js +9 -0
  106. package/dist/src/templates/DefaultDoc.d.ts +2 -0
  107. package/dist/src/templates/DefaultDoc.d.ts.map +1 -0
  108. package/dist/src/templates/DefaultDoc.js +240 -0
  109. package/dist/src/templates/DocPage.d.ts +17 -0
  110. package/dist/src/templates/DocPage.d.ts.map +1 -0
  111. package/dist/src/templates/DocPage.js +193 -0
  112. package/dist/src/templates/DocsPageWithModules.d.ts +2 -0
  113. package/dist/src/templates/DocsPageWithModules.d.ts.map +1 -0
  114. package/dist/src/templates/DocsPageWithModules.js +8 -0
  115. package/dist/src/templates/MigrationsGuidePage.d.ts +2 -0
  116. package/dist/src/templates/MigrationsGuidePage.d.ts.map +1 -0
  117. package/dist/src/templates/MigrationsGuidePage.js +11 -0
  118. package/dist/src/templates/ModuleGuidePage.d.ts +2 -0
  119. package/dist/src/templates/ModuleGuidePage.d.ts.map +1 -0
  120. package/dist/src/templates/ModuleGuidePage.js +14 -0
  121. package/dist/src/templates/SimpleDocPage.d.ts +2 -0
  122. package/dist/src/templates/SimpleDocPage.d.ts.map +1 -0
  123. package/dist/src/templates/SimpleDocPage.js +28 -0
  124. package/dist/src/templates/SimpleHomePage.d.ts +6 -0
  125. package/dist/src/templates/SimpleHomePage.d.ts.map +1 -0
  126. package/dist/src/templates/SimpleHomePage.js +7 -0
  127. package/dist/src/types/menu.d.ts +23 -0
  128. package/dist/src/types/menu.d.ts.map +1 -0
  129. package/dist/src/types/menu.js +1 -0
  130. package/package.json +4 -5
  131. package/src/scripts/init-app.ts +7 -76
@@ -0,0 +1,2 @@
1
+ export declare function addModule(moduleName: string, targetDir: string): Promise<void>;
2
+ //# sourceMappingURL=module-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-add.d.ts","sourceRoot":"","sources":["../../../src/scripts/module-add.ts"],"names":[],"mappings":"AAiCA,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBA+SpE"}
@@ -0,0 +1,232 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ import { execSync } from "child_process";
5
+ import inquirer from "inquirer";
6
+ import { AVAILABLE_MODULES, } from "@lastbrain/core/config/modules";
7
+ // Convert core module metadata to local module definition
8
+ function toModuleDefinition(meta) {
9
+ return {
10
+ name: meta.name,
11
+ package: meta.package,
12
+ displayName: `${meta.emoji} ${meta.name.charAt(0).toUpperCase() + meta.name.slice(1)}`,
13
+ description: meta.description,
14
+ hasMigrations: true,
15
+ migrationsPath: "supabase/migrations",
16
+ migrationsDownPath: "supabase/migrations-down",
17
+ };
18
+ }
19
+ export async function addModule(moduleName, targetDir) {
20
+ console.log(chalk.blue(`\n🔧 Ajout du module: ${moduleName}\n`));
21
+ const moduleMeta = AVAILABLE_MODULES.find((m) => m.name === moduleName);
22
+ if (!moduleMeta) {
23
+ console.error(chalk.red(`❌ Module "${moduleName}" non trouvé. Modules disponibles:`));
24
+ AVAILABLE_MODULES.forEach((m) => {
25
+ console.log(chalk.gray(` - ${m.emoji} ${m.name}: ${m.description}`));
26
+ });
27
+ process.exit(1);
28
+ }
29
+ const module = toModuleDefinition(moduleMeta);
30
+ // 1. Vérifier qu'on est dans un projet LastBrain
31
+ const pkgPath = path.join(targetDir, "package.json");
32
+ if (!fs.existsSync(pkgPath)) {
33
+ console.error(chalk.red("❌ package.json non trouvé"));
34
+ process.exit(1);
35
+ }
36
+ const pkg = await fs.readJson(pkgPath);
37
+ // Vérifier si le module n'est pas déjà installé
38
+ if (pkg.dependencies?.[module.package] ||
39
+ pkg.devDependencies?.[module.package]) {
40
+ console.log(chalk.yellow(`⚠️ Module ${module.package} déjà installé`));
41
+ return;
42
+ }
43
+ // 2. Ajouter la dépendance au package.json
44
+ console.log(chalk.yellow(`📦 Ajout de ${module.package} aux dépendances...`));
45
+ pkg.dependencies = pkg.dependencies || {};
46
+ pkg.dependencies[module.package] = "workspace:*";
47
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
48
+ // 3. Installer les dépendances
49
+ console.log(chalk.yellow("📥 Installation des dépendances..."));
50
+ try {
51
+ execSync("pnpm install", { cwd: targetDir, stdio: "inherit" });
52
+ }
53
+ catch {
54
+ console.error(chalk.red("❌ Erreur lors de l'installation"));
55
+ process.exit(1);
56
+ }
57
+ // 3.1 Build du module ajouté (pour générer dist/ et éviter les erreurs d'import)
58
+ console.log(chalk.yellow(`\n🏗️ Build du module ${module.package}...`));
59
+ try {
60
+ // Trouver la racine du monorepo (chercher pnpm-workspace.yaml en remontant)
61
+ let workspaceRoot = targetDir;
62
+ let attempts = 0;
63
+ const maxAttempts = 6;
64
+ while (attempts < maxAttempts) {
65
+ if (fs.existsSync(path.join(workspaceRoot, "pnpm-workspace.yaml"))) {
66
+ break;
67
+ }
68
+ const parent = path.resolve(workspaceRoot, "..");
69
+ if (parent === workspaceRoot)
70
+ break;
71
+ workspaceRoot = parent;
72
+ attempts++;
73
+ }
74
+ if (!fs.existsSync(path.join(workspaceRoot, "pnpm-workspace.yaml"))) {
75
+ console.log(chalk.gray(" ℹ️ Impossible de localiser la racine du monorepo, build ignoré"));
76
+ }
77
+ else {
78
+ execSync(`pnpm --filter ${module.package} build`, {
79
+ cwd: workspaceRoot,
80
+ stdio: "inherit",
81
+ });
82
+ console.log(chalk.green(" ✓ Module compilé"));
83
+ }
84
+ }
85
+ catch {
86
+ console.log(chalk.yellow(" ⚠️ Build du module échoué, essayez: pnpm --filter"), module.package, "build");
87
+ }
88
+ // 5. Copier les migrations du module
89
+ const copiedMigrationFiles = [];
90
+ if (module.hasMigrations) {
91
+ console.log(chalk.yellow("\n📋 Copie des migrations du module..."));
92
+ // Trouver le chemin du module installé
93
+ const modulePackagePath = path.join(targetDir, "node_modules", ...module.package.split("/"));
94
+ const moduleMigrationsDir = path.join(modulePackagePath, module.migrationsPath || "supabase/migrations");
95
+ const projectMigrationsDir = path.join(targetDir, "supabase", "migrations");
96
+ await fs.ensureDir(projectMigrationsDir);
97
+ if (fs.existsSync(moduleMigrationsDir)) {
98
+ const migrationFiles = fs.readdirSync(moduleMigrationsDir);
99
+ for (const file of migrationFiles) {
100
+ if (file.endsWith(".sql")) {
101
+ const sourcePath = path.join(moduleMigrationsDir, file);
102
+ const destPath = path.join(projectMigrationsDir, file);
103
+ await fs.copyFile(sourcePath, destPath);
104
+ copiedMigrationFiles.push(file);
105
+ console.log(chalk.green(` ✓ ${file}`));
106
+ }
107
+ }
108
+ // 6. Demander comment appliquer les migrations
109
+ console.log(chalk.yellow("\n🗄️ Application des migrations à la base de données\n"));
110
+ console.log("Choisissez une option:");
111
+ console.log(chalk.cyan(" 1) 🔄 Reset complet (supabase db reset) - Recommandé en dev"));
112
+ console.log(chalk.cyan(" 2) ⬆️ Push uniquement les nouvelles migrations (supabase migration up)"));
113
+ console.log(chalk.cyan(" 3) ⏭️ Ignorer pour l'instant"));
114
+ console.log("");
115
+ const { migrationAction } = await inquirer.prompt([
116
+ {
117
+ type: "rawlist",
118
+ name: "migrationAction",
119
+ message: "Comment voulez-vous appliquer les migrations ?",
120
+ choices: [
121
+ {
122
+ name: "🔄 Reset complet (supabase db reset) - Recommandé en dev",
123
+ value: "reset",
124
+ },
125
+ {
126
+ name: "⬆️ Push uniquement les nouvelles migrations (supabase migration up)",
127
+ value: "push",
128
+ },
129
+ {
130
+ name: "⏭️ Ignorer pour l'instant",
131
+ value: "skip",
132
+ },
133
+ ],
134
+ },
135
+ ]);
136
+ if (migrationAction === "reset") {
137
+ console.log(chalk.yellow("\n🔄 Reset de la base de données..."));
138
+ try {
139
+ execSync("supabase db reset", { cwd: targetDir, stdio: "inherit" });
140
+ console.log(chalk.green("✓ Base de données réinitialisée"));
141
+ }
142
+ catch {
143
+ console.error(chalk.red("❌ Erreur lors du reset"));
144
+ }
145
+ }
146
+ else if (migrationAction === "push") {
147
+ console.log(chalk.yellow("\n⬆️ Application des nouvelles migrations..."));
148
+ // Appliquer directement avec psql au lieu de supabase migration up
149
+ const migrationsDir = path.join(targetDir, "supabase", "migrations");
150
+ const migrationFiles = fs
151
+ .readdirSync(migrationsDir)
152
+ .filter((f) => f.endsWith(".sql"))
153
+ .filter((f) => copiedMigrationFiles.includes(f))
154
+ .sort();
155
+ if (migrationFiles.length === 0) {
156
+ console.log(chalk.yellow("⚠️ Aucune nouvelle migration à appliquer"));
157
+ }
158
+ else {
159
+ try {
160
+ const dbUrl = "postgresql://postgres:postgres@127.0.0.1:54322/postgres";
161
+ for (const file of migrationFiles) {
162
+ const filePath = path.join(migrationsDir, file);
163
+ console.log(chalk.gray(` Exécution de ${file}...`));
164
+ execSync(`psql "${dbUrl}" -f "${filePath}"`, {
165
+ cwd: targetDir,
166
+ stdio: "pipe",
167
+ });
168
+ }
169
+ console.log(chalk.green(`✓ ${migrationFiles.length} migration(s) appliquée(s)`));
170
+ }
171
+ catch (_error) {
172
+ console.error(chalk.red("❌ Erreur lors de l'application des migrations"));
173
+ console.log(chalk.gray("\nVous pouvez essayer manuellement:\n supabase db reset\n"));
174
+ }
175
+ }
176
+ }
177
+ else {
178
+ console.log(chalk.gray("\n⚠️ N'oubliez pas d'appliquer les migrations avec:\n supabase db reset ou supabase migration up\n"));
179
+ }
180
+ }
181
+ else {
182
+ console.log(chalk.gray(" Aucune migration trouvée pour ce module"));
183
+ }
184
+ }
185
+ // 4. Enregistrer le module dans la configuration
186
+ const modulesConfigPath = path.join(targetDir, ".lastbrain", "modules.json");
187
+ await fs.ensureDir(path.dirname(modulesConfigPath));
188
+ let modulesConfig = { modules: [] };
189
+ if (fs.existsSync(modulesConfigPath)) {
190
+ modulesConfig = await fs.readJson(modulesConfigPath);
191
+ }
192
+ // Initialiser tous les modules disponibles s'ils n'existent pas
193
+ for (const availableModule of AVAILABLE_MODULES) {
194
+ const exists = modulesConfig.modules.find((m) => m.package === availableModule.package);
195
+ if (!exists) {
196
+ modulesConfig.modules.push({
197
+ package: availableModule.package,
198
+ active: false,
199
+ migrations: [],
200
+ });
201
+ }
202
+ }
203
+ const existingModuleIndex = modulesConfig.modules.findIndex((m) => m.package === module.package);
204
+ const migrationsList = copiedMigrationFiles;
205
+ if (existingModuleIndex >= 0) {
206
+ modulesConfig.modules[existingModuleIndex] = {
207
+ package: module.package,
208
+ active: true,
209
+ migrations: migrationsList,
210
+ };
211
+ }
212
+ else {
213
+ modulesConfig.modules.push({
214
+ package: module.package,
215
+ active: true,
216
+ migrations: migrationsList,
217
+ });
218
+ }
219
+ await fs.writeJson(modulesConfigPath, modulesConfig, { spaces: 2 });
220
+ console.log(chalk.green(`\n✅ Module ${module.displayName} ajouté avec succès!\n`));
221
+ // 7. Générer automatiquement les routes du module
222
+ console.log(chalk.yellow("🔧 Génération des routes du module..."));
223
+ try {
224
+ execSync("pnpm run build:modules", { cwd: targetDir, stdio: "inherit" });
225
+ console.log(chalk.green("✓ Routes du module générées"));
226
+ }
227
+ catch {
228
+ console.error(chalk.red("❌ Erreur lors de la génération des routes"));
229
+ console.error(chalk.gray("Vous pouvez les générer manuellement avec: cd apps/<votre-app> && pnpm run build:modules"));
230
+ }
231
+ console.log(chalk.gray("\nLe serveur de développement redémarrera automatiquement.\n"));
232
+ }
@@ -0,0 +1,2 @@
1
+ export declare function runModuleBuild(): Promise<void>;
2
+ //# sourceMappingURL=module-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../../src/scripts/module-build.ts"],"names":[],"mappings":"AAi6CA,wBAAsB,cAAc,kBA+FnC"}