@lastbrain/app 2.0.1 → 2.0.3
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/config/version.d.ts +7 -0
- package/dist/config/version.d.ts.map +1 -0
- package/dist/config/version.js +25 -0
- package/dist/src/__tests__/module-registry.test.d.ts +2 -0
- package/dist/src/__tests__/module-registry.test.d.ts.map +1 -0
- package/dist/src/__tests__/module-registry.test.js +53 -0
- package/dist/src/app-shell/(admin)/layout.d.ts +4 -0
- package/dist/src/app-shell/(admin)/layout.d.ts.map +1 -0
- package/dist/src/app-shell/(admin)/layout.js +5 -0
- package/dist/src/app-shell/(auth)/layout.d.ts +4 -0
- package/dist/src/app-shell/(auth)/layout.d.ts.map +1 -0
- package/dist/src/app-shell/(auth)/layout.js +5 -0
- package/dist/src/app-shell/(public)/page.d.ts +2 -0
- package/dist/src/app-shell/(public)/page.d.ts.map +1 -0
- package/dist/src/app-shell/(public)/page.js +5 -0
- package/dist/src/app-shell/layout.d.ts +3 -0
- package/dist/src/app-shell/layout.d.ts.map +1 -0
- package/dist/src/app-shell/layout.js +3 -0
- package/dist/src/app-shell/not-found.d.ts +2 -0
- package/dist/src/app-shell/not-found.d.ts.map +1 -0
- package/dist/src/app-shell/not-found.js +10 -0
- package/dist/src/auth/authHelpers.d.ts +7 -0
- package/dist/src/auth/authHelpers.d.ts.map +1 -0
- package/dist/src/auth/authHelpers.js +19 -0
- package/dist/src/auth/useAuthSession.d.ts +7 -0
- package/dist/src/auth/useAuthSession.d.ts.map +1 -0
- package/dist/src/auth/useAuthSession.js +49 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +143 -0
- package/dist/src/components/NotificationContainer.d.ts +2 -0
- package/dist/src/components/NotificationContainer.d.ts.map +1 -0
- package/dist/src/components/NotificationContainer.js +8 -0
- package/dist/src/hooks/useNotifications.d.ts +30 -0
- package/dist/src/hooks/useNotifications.d.ts.map +1 -0
- package/dist/src/hooks/useNotifications.js +165 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/layouts/AdminLayout.d.ts +4 -0
- package/dist/src/layouts/AdminLayout.d.ts.map +1 -0
- package/dist/src/layouts/AdminLayout.js +4 -0
- package/dist/src/layouts/AdminLayoutWithSidebar.d.ts +10 -0
- package/dist/src/layouts/AdminLayoutWithSidebar.d.ts.map +1 -0
- package/dist/src/layouts/AdminLayoutWithSidebar.js +62 -0
- package/dist/src/layouts/AppProviders.d.ts +27 -0
- package/dist/src/layouts/AppProviders.d.ts.map +1 -0
- package/dist/src/layouts/AppProviders.js +48 -0
- package/dist/src/layouts/AuthLayout.d.ts +4 -0
- package/dist/src/layouts/AuthLayout.d.ts.map +1 -0
- package/dist/src/layouts/AuthLayout.js +4 -0
- package/dist/src/layouts/AuthLayoutWithSidebar.d.ts +12 -0
- package/dist/src/layouts/AuthLayoutWithSidebar.d.ts.map +1 -0
- package/dist/src/layouts/AuthLayoutWithSidebar.js +60 -0
- package/dist/src/layouts/PublicLayout.d.ts +8 -0
- package/dist/src/layouts/PublicLayout.d.ts.map +1 -0
- package/dist/src/layouts/PublicLayout.js +6 -0
- package/dist/src/layouts/PublicLayoutWithSidebar.d.ts +9 -0
- package/dist/src/layouts/PublicLayoutWithSidebar.d.ts.map +1 -0
- package/dist/src/layouts/PublicLayoutWithSidebar.js +60 -0
- package/dist/src/layouts/RootLayout.d.ts +6 -0
- package/dist/src/layouts/RootLayout.d.ts.map +1 -0
- package/dist/src/layouts/RootLayout.js +9 -0
- package/dist/src/modules/module-loader.d.ts +5 -0
- package/dist/src/modules/module-loader.d.ts.map +1 -0
- package/dist/src/modules/module-loader.js +10 -0
- package/dist/src/scripts/db-init.d.ts +2 -0
- package/dist/src/scripts/db-init.d.ts.map +1 -0
- package/dist/src/scripts/db-init.js +300 -0
- package/dist/src/scripts/db-migrations-sync.d.ts +2 -0
- package/dist/src/scripts/db-migrations-sync.d.ts.map +1 -0
- package/dist/src/scripts/db-migrations-sync.js +84 -0
- package/dist/src/scripts/dev-sync.d.ts +2 -0
- package/dist/src/scripts/dev-sync.d.ts.map +1 -0
- package/dist/src/scripts/dev-sync.js +194 -0
- package/dist/src/scripts/init-app.d.ts +12 -0
- package/dist/src/scripts/init-app.d.ts.map +1 -0
- package/dist/src/scripts/init-app.js +2175 -0
- package/dist/src/scripts/module-add.d.ts +2 -0
- package/dist/src/scripts/module-add.d.ts.map +1 -0
- package/dist/src/scripts/module-add.js +232 -0
- package/dist/src/scripts/module-build.d.ts +2 -0
- package/dist/src/scripts/module-build.d.ts.map +1 -0
- package/dist/src/scripts/module-build.js +1280 -0
- package/dist/src/scripts/module-create.d.ts +28 -0
- package/dist/src/scripts/module-create.d.ts.map +1 -0
- package/dist/src/scripts/module-create.js +1429 -0
- package/dist/src/scripts/module-delete.d.ts +6 -0
- package/dist/src/scripts/module-delete.d.ts.map +1 -0
- package/dist/src/scripts/module-delete.js +147 -0
- package/dist/src/scripts/module-list.d.ts +2 -0
- package/dist/src/scripts/module-list.d.ts.map +1 -0
- package/dist/src/scripts/module-list.js +61 -0
- package/dist/src/scripts/module-remove.d.ts +2 -0
- package/dist/src/scripts/module-remove.d.ts.map +1 -0
- package/dist/src/scripts/module-remove.js +311 -0
- package/dist/src/scripts/readme-build.d.ts +2 -0
- package/dist/src/scripts/readme-build.d.ts.map +1 -0
- package/dist/src/scripts/readme-build.js +39 -0
- package/dist/src/scripts/script-runner.d.ts +5 -0
- package/dist/src/scripts/script-runner.d.ts.map +1 -0
- package/dist/src/scripts/script-runner.js +25 -0
- package/dist/src/templates/AuthGuidePage.d.ts +2 -0
- package/dist/src/templates/AuthGuidePage.d.ts.map +1 -0
- package/dist/src/templates/AuthGuidePage.js +9 -0
- package/dist/src/templates/DefaultDoc.d.ts +2 -0
- package/dist/src/templates/DefaultDoc.d.ts.map +1 -0
- package/dist/src/templates/DefaultDoc.js +240 -0
- package/dist/src/templates/DocPage.d.ts +17 -0
- package/dist/src/templates/DocPage.d.ts.map +1 -0
- package/dist/src/templates/DocPage.js +193 -0
- package/dist/src/templates/DocsPageWithModules.d.ts +2 -0
- package/dist/src/templates/DocsPageWithModules.d.ts.map +1 -0
- package/dist/src/templates/DocsPageWithModules.js +8 -0
- package/dist/src/templates/MigrationsGuidePage.d.ts +2 -0
- package/dist/src/templates/MigrationsGuidePage.d.ts.map +1 -0
- package/dist/src/templates/MigrationsGuidePage.js +11 -0
- package/dist/src/templates/ModuleGuidePage.d.ts +2 -0
- package/dist/src/templates/ModuleGuidePage.d.ts.map +1 -0
- package/dist/src/templates/ModuleGuidePage.js +14 -0
- package/dist/src/templates/SimpleDocPage.d.ts +2 -0
- package/dist/src/templates/SimpleDocPage.d.ts.map +1 -0
- package/dist/src/templates/SimpleDocPage.js +28 -0
- package/dist/src/templates/SimpleHomePage.d.ts +6 -0
- package/dist/src/templates/SimpleHomePage.d.ts.map +1 -0
- package/dist/src/templates/SimpleHomePage.js +7 -0
- package/dist/src/types/menu.d.ts +23 -0
- package/dist/src/types/menu.d.ts.map +1 -0
- package/dist/src/types/menu.js +1 -0
- package/package.json +4 -5
- package/src/scripts/init-app.ts +7 -76
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../../src/scripts/module-build.ts"],"names":[],"mappings":"AAi6CA,wBAAsB,cAAc,kBA+FnC"}
|