@lastbrain/app 0.1.14 → 0.1.16
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"AAaA,wBAAgB,oBAAoB,4CAioBnC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Card, CardBody, CardHeader, Chip, Snippet } from "@lastbrain/ui";
|
|
3
|
-
import { Rocket, Building2, BookOpen, Database, Palette, Link as LinkIcon, } from "lucide-react";
|
|
3
|
+
import { Rocket, Building2, BookOpen, Database, Palette, Link as LinkIcon, Shield, Zap, } from "lucide-react";
|
|
4
4
|
export function DefaultDocumentation() {
|
|
5
5
|
return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("div", { className: "flex items-center justify-between w-full", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Documentation LastBrain" }), _jsx(Chip, { color: "primary", variant: "flat", children: "v1.0.0" })] }) }), _jsx(CardBody, { className: "space-y-6", children: _jsx("div", { children: _jsx("p", { className: "text-slate-600 dark:text-slate-400 text-lg", children: "LastBrain est un framework modulaire pour cr\u00E9er des applications Next.js avec une architecture bas\u00E9e sur des modules r\u00E9utilisables." }) }) })] }), _jsxs(Card, { id: "section-quickstart", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9marrage rapide"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Installation" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm install" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Initialiser la base de donn\u00E9es" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm db:init" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "D\u00E9marre Supabase en local et applique les migrations" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Ajouter des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain list-modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain add-module auth" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Modules disponibles : ", _jsx("strong", { children: "auth" }), " (authentification),", " ", _jsx("strong", { children: "ai" }), " (g\u00E9n\u00E9ration IA)"] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Construire les modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm build:modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "G\u00E9n\u00E8re les pages et routes \u00E0 partir des modules install\u00E9s" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm dev" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Ouvre l'application sur", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:3000" })] })] })] })] }), _jsxs(Card, { id: "section-architecture", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Building2, { size: 24 }), "Architecture"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "border-l-4 border-blue-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." })] }), _jsxs("div", { className: "border-l-4 border-green-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." })] }), _jsxs("div", { className: "border-l-4 border-purple-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." })] }), _jsxs("div", { className: "border-l-4 border-orange-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-*" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Modules fonctionnels (auth, ai, etc.). Chaque module contient ses pages, APIs, composants, migrations et documentation." })] })] })] })] }), _jsxs(Card, { id: "section-create-module", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documentation des modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commande CLI" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain create-module mon-module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-4", children: ["Cr\u00E9e un nouveau module dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-mon-module" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono", children: _jsxs("div", { className: "space-y-1", children: [_jsx("div", { children: "\uD83D\uDCC1 module-mon-module/" }), _jsx("div", { className: "ml-4", children: "\u251C\u2500\u2500 \uD83D\uDCC4 package.json" }), _jsx("div", { className: "ml-4", children: "\u251C\u2500\u2500 \uD83D\uDCC4 mon-module.build.config.ts" }), _jsx("div", { className: "ml-4", children: "\u2514\u2500\u2500 \uD83D\uDCC1 src/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC4 index.ts" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC4 server.ts" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 web/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 api/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 components/" }), _jsx("div", { className: "ml-8", children: "\u2514\u2500\u2500 \uD83D\uDCC1 supabase/" }), _jsx("div", { className: "ml-12", children: "\u2514\u2500\u2500 \uD83D\uDCC1 migrations/" })] }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration du module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le fichier", " ", _jsxs("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: ["{slug}", ".build.config.ts"] }), " ", "d\u00E9finit les pages et APIs :"] }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono overflow-x-auto", children: _jsx("pre", { children: `export default {
|
|
6
6
|
name: "Mon Module",
|
|
@@ -18,7 +18,13 @@ export function DefaultDocumentation() {
|
|
|
18
18
|
handler: "./api/mon-api"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
|
-
}` }) })] })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "D\u00E9marrer Supabase :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:init" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Synchroniser les migrations :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:migrations:sync" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Cr\u00E9er une migration :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration new ma_migration" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Les modules peuvent avoir leurs propres migrations dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] })] }), _jsxs(Card, { id: "section-
|
|
21
|
+
}` }) })] })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "D\u00E9marrer Supabase :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:init" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Synchroniser les migrations :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:migrations:sync" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Cr\u00E9er une migration :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration new ma_migration" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Les modules peuvent avoir leurs propres migrations dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] })] }), _jsxs(Card, { id: "section-admin", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsx("h2", { className: "text-2xl font-semibold", children: "\uD83D\uDC64 Cr\u00E9er un Compte Administrateur" }) }), _jsx(CardBody, { className: "space-y-4", children: _jsxs("ol", { className: "list-decimal list-inside space-y-4", children: [_jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Cr\u00E9er un compte" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Promouvoir en administrateur" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsx("div", { className: "ml-6", children: _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: `update auth.users
|
|
22
|
+
set raw_app_meta_data = jsonb_set(
|
|
23
|
+
coalesce(raw_app_meta_data, '{}'::jsonb),
|
|
24
|
+
'{roles}',
|
|
25
|
+
'["admin"]'::jsonb
|
|
26
|
+
)
|
|
27
|
+
where email = 'votre@email.com';` }) })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/admin" })] })] })] }) })] }), _jsxs(Card, { id: "section-development", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm dev" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm build" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm dev" })] })] })] }), _jsxs(Card, { id: "section-routes", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Shield, { size: 24 }), "Routes Prot\u00E9g\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-blue-600 dark:text-blue-400", children: "/auth/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Authentification requise" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-purple-600 dark:text-purple-400", children: "/admin/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Superadmin uniquement" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-green-600 dark:text-green-400", children: "/docs/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Acc\u00E8s public" })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-4", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "middleware.ts" })] })] })] }), _jsxs(Card, { id: "section-workflow", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "Workflow de D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "packages/module-*/src" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Compiler le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm build" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration up" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm dev" })] })] })] }), _jsxs(Card, { id: "section-ui", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Palette, { size: 24 }), "Interface utilisateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Composants NextUI" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: ["Le package", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), "r\u00E9exporte les composants NextUI avec une configuration Tailwind personnalis\u00E9e."] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Th\u00E8mes" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le mode sombre/clair est g\u00E9r\u00E9 par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "next-themes" }), ". Le switch est disponible dans le header de l'application."] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS v4" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Le projet utilise Tailwind CSS v4 avec un preset personnalis\u00E9 partag\u00E9 via", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui/tailwind.preset" }), "."] })] })] })] }), _jsxs(Card, { id: "section-module-docs", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documenter ses modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9er une documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans votre module, cr\u00E9ez", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/components/Doc.tsx" }), " ", ":"] }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono overflow-x-auto", children: _jsx("pre", { children: `export function MonModuleDoc() {
|
|
22
28
|
return (
|
|
23
29
|
<div>
|
|
24
30
|
<h1>Mon Module</h1>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lastbrain/app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"description": "Framework modulaire Next.js avec CLI et système de modules",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"next-themes": "^0.4.6",
|
|
41
41
|
"react": "^19.0.0",
|
|
42
42
|
"react-dom": "^19.0.0",
|
|
43
|
-
"@lastbrain/
|
|
44
|
-
"@lastbrain/
|
|
45
|
-
"@lastbrain/
|
|
43
|
+
"@lastbrain/core": "0.1.0",
|
|
44
|
+
"@lastbrain/module-auth": "0.1.1",
|
|
45
|
+
"@lastbrain/ui": "0.1.3"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"next": ">=15.0.0"
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
Database,
|
|
8
8
|
Palette,
|
|
9
9
|
Link as LinkIcon,
|
|
10
|
+
Shield,
|
|
11
|
+
Zap,
|
|
10
12
|
} from "lucide-react";
|
|
11
13
|
|
|
12
14
|
export function DefaultDocumentation() {
|
|
@@ -299,6 +301,197 @@ export function DefaultDocumentation() {
|
|
|
299
301
|
</CardBody>
|
|
300
302
|
</Card>
|
|
301
303
|
|
|
304
|
+
<Card id="section-admin" className="scroll-mt-32">
|
|
305
|
+
<CardHeader>
|
|
306
|
+
<h2 className="text-2xl font-semibold">
|
|
307
|
+
👤 Créer un Compte Administrateur
|
|
308
|
+
</h2>
|
|
309
|
+
</CardHeader>
|
|
310
|
+
<CardBody className="space-y-4">
|
|
311
|
+
<ol className="list-decimal list-inside space-y-4">
|
|
312
|
+
<li className="text-lg">
|
|
313
|
+
<strong>Créer un compte</strong>
|
|
314
|
+
<p className="text-slate-600 dark:text-slate-400 ml-6 mb-2">
|
|
315
|
+
Allez sur{" "}
|
|
316
|
+
<code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
|
|
317
|
+
/signup
|
|
318
|
+
</code>{" "}
|
|
319
|
+
et créez votre compte
|
|
320
|
+
</p>
|
|
321
|
+
</li>
|
|
322
|
+
<li className="text-lg">
|
|
323
|
+
<strong>Promouvoir en administrateur</strong>
|
|
324
|
+
<p className="text-slate-600 dark:text-slate-400 ml-6 mb-2">
|
|
325
|
+
Exécutez cette requête SQL dans le Studio Supabase (
|
|
326
|
+
<code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
|
|
327
|
+
http://localhost:54323
|
|
328
|
+
</code>
|
|
329
|
+
) ou via psql :
|
|
330
|
+
</p>
|
|
331
|
+
<div className="ml-6">
|
|
332
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
333
|
+
{`update auth.users
|
|
334
|
+
set raw_app_meta_data = jsonb_set(
|
|
335
|
+
coalesce(raw_app_meta_data, '{}'::jsonb),
|
|
336
|
+
'{roles}',
|
|
337
|
+
'["admin"]'::jsonb
|
|
338
|
+
)
|
|
339
|
+
where email = 'votre@email.com';`}
|
|
340
|
+
</Snippet>
|
|
341
|
+
</div>
|
|
342
|
+
</li>
|
|
343
|
+
<li className="text-lg">
|
|
344
|
+
<strong>Accéder à l'interface admin</strong>
|
|
345
|
+
<p className="text-slate-600 dark:text-slate-400 ml-6">
|
|
346
|
+
Vous pouvez maintenant accéder à{" "}
|
|
347
|
+
<code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
|
|
348
|
+
/admin
|
|
349
|
+
</code>
|
|
350
|
+
</p>
|
|
351
|
+
</li>
|
|
352
|
+
</ol>
|
|
353
|
+
</CardBody>
|
|
354
|
+
</Card>
|
|
355
|
+
|
|
356
|
+
<Card id="section-development" className="scroll-mt-32">
|
|
357
|
+
<CardHeader>
|
|
358
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
359
|
+
<Rocket size={24} />
|
|
360
|
+
Développement
|
|
361
|
+
</h2>
|
|
362
|
+
</CardHeader>
|
|
363
|
+
<CardBody className="space-y-4">
|
|
364
|
+
<div>
|
|
365
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
366
|
+
Lancer le serveur de développement
|
|
367
|
+
</h3>
|
|
368
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
369
|
+
pnpm dev
|
|
370
|
+
</Snippet>
|
|
371
|
+
</div>
|
|
372
|
+
<div>
|
|
373
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
374
|
+
Générer les routes des modules
|
|
375
|
+
</h3>
|
|
376
|
+
<p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
|
|
377
|
+
À exécuter après avoir ajouté ou modifié des modules
|
|
378
|
+
</p>
|
|
379
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
380
|
+
pnpm build:modules
|
|
381
|
+
</Snippet>
|
|
382
|
+
</div>
|
|
383
|
+
<div>
|
|
384
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
385
|
+
Build de production
|
|
386
|
+
</h3>
|
|
387
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
388
|
+
pnpm build
|
|
389
|
+
</Snippet>
|
|
390
|
+
</div>
|
|
391
|
+
<div>
|
|
392
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
393
|
+
Développer un module
|
|
394
|
+
</h3>
|
|
395
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
396
|
+
cd packages/module-auth
|
|
397
|
+
</Snippet>
|
|
398
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
399
|
+
pnpm dev
|
|
400
|
+
</Snippet>
|
|
401
|
+
</div>
|
|
402
|
+
</CardBody>
|
|
403
|
+
</Card>
|
|
404
|
+
|
|
405
|
+
<Card id="section-routes" className="scroll-mt-32">
|
|
406
|
+
<CardHeader>
|
|
407
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
408
|
+
<Shield size={24} />
|
|
409
|
+
Routes Protégées
|
|
410
|
+
</h2>
|
|
411
|
+
</CardHeader>
|
|
412
|
+
<CardBody className="space-y-4">
|
|
413
|
+
<p className="text-slate-600 dark:text-slate-400 mb-4">
|
|
414
|
+
Le middleware protège automatiquement vos routes selon ces règles :
|
|
415
|
+
</p>
|
|
416
|
+
<div className="space-y-2">
|
|
417
|
+
<div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
|
|
418
|
+
<code className="text-blue-600 dark:text-blue-400">/auth/*</code>
|
|
419
|
+
<span className="ml-2">→ Authentification requise</span>
|
|
420
|
+
</div>
|
|
421
|
+
<div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
|
|
422
|
+
<code className="text-purple-600 dark:text-purple-400">
|
|
423
|
+
/admin/*
|
|
424
|
+
</code>
|
|
425
|
+
<span className="ml-2">→ Superadmin uniquement</span>
|
|
426
|
+
</div>
|
|
427
|
+
<div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
|
|
428
|
+
<code className="text-green-600 dark:text-green-400">
|
|
429
|
+
/docs/*
|
|
430
|
+
</code>
|
|
431
|
+
<span className="ml-2">→ Accès public</span>
|
|
432
|
+
</div>
|
|
433
|
+
</div>
|
|
434
|
+
<p className="text-sm text-slate-600 dark:text-slate-400 mt-4">
|
|
435
|
+
Le middleware se trouve dans{" "}
|
|
436
|
+
<code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
|
|
437
|
+
middleware.ts
|
|
438
|
+
</code>
|
|
439
|
+
</p>
|
|
440
|
+
</CardBody>
|
|
441
|
+
</Card>
|
|
442
|
+
|
|
443
|
+
<Card id="section-workflow" className="scroll-mt-32">
|
|
444
|
+
<CardHeader>
|
|
445
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
446
|
+
<Zap size={24} />
|
|
447
|
+
Workflow de Développement
|
|
448
|
+
</h2>
|
|
449
|
+
</CardHeader>
|
|
450
|
+
<CardBody className="space-y-4">
|
|
451
|
+
<div>
|
|
452
|
+
<h3 className="text-lg font-semibold mb-2">1. Modifier un module</h3>
|
|
453
|
+
<p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
|
|
454
|
+
Éditez les fichiers dans{" "}
|
|
455
|
+
<code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
|
|
456
|
+
packages/module-*/src
|
|
457
|
+
</code>
|
|
458
|
+
</p>
|
|
459
|
+
</div>
|
|
460
|
+
<div>
|
|
461
|
+
<h3 className="text-lg font-semibold mb-2">2. Compiler le module</h3>
|
|
462
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
463
|
+
cd packages/module-auth
|
|
464
|
+
</Snippet>
|
|
465
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
466
|
+
pnpm build
|
|
467
|
+
</Snippet>
|
|
468
|
+
</div>
|
|
469
|
+
<div>
|
|
470
|
+
<h3 className="text-lg font-semibold mb-2">3. Régénérer les pages</h3>
|
|
471
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
472
|
+
cd apps/my-app
|
|
473
|
+
</Snippet>
|
|
474
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
475
|
+
pnpm build:modules
|
|
476
|
+
</Snippet>
|
|
477
|
+
</div>
|
|
478
|
+
<div>
|
|
479
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
480
|
+
4. Appliquer les migrations
|
|
481
|
+
</h3>
|
|
482
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
483
|
+
supabase migration up
|
|
484
|
+
</Snippet>
|
|
485
|
+
</div>
|
|
486
|
+
<div>
|
|
487
|
+
<h3 className="text-lg font-semibold mb-2">5. Tester</h3>
|
|
488
|
+
<Snippet symbol="" hideSymbol className="text-sm">
|
|
489
|
+
pnpm dev
|
|
490
|
+
</Snippet>
|
|
491
|
+
</div>
|
|
492
|
+
</CardBody>
|
|
493
|
+
</Card>
|
|
494
|
+
|
|
302
495
|
<Card id="section-ui" className="scroll-mt-32">
|
|
303
496
|
<CardHeader>
|
|
304
497
|
<h2 className="text-2xl font-semibold flex items-center gap-2">
|