@lastbrain/module-auth 0.1.10 → 0.1.12

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/README.md CHANGED
@@ -1,554 +1,127 @@
1
- # @lastbrain/module-auth
1
+ # 📦 Module auth
2
2
 
3
- Module d'authentification complet pour LastBrain avec Supabase. Fournit des pages web, des API routes et une gestion complète de l'authentification utilisateur, du profil et de l'administration.
3
+ > @lastbrain/module-auth
4
4
 
5
- ## 🎯 Vue d'ensemble
5
+ ## 📋 Informations
6
6
 
7
- Ce module inclut tout ce dont vous avez besoin pour l'authentification :
7
+ - **Nom du package**: `@lastbrain/module-auth`
8
+ - **Slug**: `module-auth`
9
+ - **Type**: Module LastBrain
8
10
 
9
- - 🔐 **Pages complètes** - Connexion, inscription, profil, dashboard
10
- - 🛠️ **API routes** - Gestion utilisateur et administration
11
- - 🗄️ **Schema DB** - Tables et permissions Supabase
12
- - 👤 **Gestion profils** - Informations personnelles et préférences
13
- - 🛡️ **Sécurité** - Protection RLS et rôles admin
11
+ ## 📄 Pages Disponibles
14
12
 
15
- ## 🚀 Démarrage rapide
16
-
17
- > **Recommandé :** Utilisez le CLI LastBrain pour créer une application complète avec le module auth
18
-
19
- ```bash
20
- # Créer une nouvelle application avec le module auth inclus
21
- pnpx @lastbrain/app@latest init mon-app
22
- # Sélectionner "🔐 Authentication" lors de la création
23
-
24
- cd mon-app
25
- pnpm db:init # Applique automatiquement les migrations
26
- pnpm dev
27
- ```
28
-
29
- ## 📦 Installation manuelle
30
-
31
- Si vous intégrez LastBrain dans un projet existant :
32
-
33
- ```bash
34
- pnpm add @lastbrain/module-auth @lastbrain/core @lastbrain/ui
35
- ```
36
-
37
- Puis ajoutez le module à votre projet LastBrain :
38
-
39
- ```bash
40
- pnpm lastbrain add-module auth
41
- pnpm build:modules
42
- ```
43
-
44
- ## Configuration
45
-
46
- ### Prérequis
47
-
48
- 1. **Supabase configuré** : Vous devez avoir un projet Supabase avec les variables d'environnement suivantes :
49
-
50
- ```env
51
- NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
52
- NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
53
- ```
54
-
55
- 2. **Migrations appliquées** : Appliquez la migration fournie dans `supabase/migrations/20251112000000_user_init.sql` pour créer les tables nécessaires.
56
-
57
- 3. **Fonction RPC is_superadmin** : Assurez-vous que la fonction `is_superadmin` est disponible (généralement fournie par la migration de base de l'app).
58
-
59
- ### Configuration de la fonction is_superadmin
60
-
61
- La fonction `is_superadmin` vérifie si un utilisateur a le rôle d'administrateur. Elle est définie dans la migration de base et examine les métadonnées utilisateur :
62
-
63
- ```sql
64
- CREATE OR REPLACE FUNCTION public.is_superadmin(user_id uuid)
65
- RETURNS boolean
66
- LANGUAGE sql
67
- STABLE
68
- SECURITY DEFINER
69
- SET search_path = public, auth
70
- AS $function$
71
- SELECT COALESCE((
72
- SELECT
73
- COALESCE((raw_app_meta_data ->> 'is_super_admin')::boolean, FALSE)
74
- OR COALESCE((raw_user_meta_data ->> 'is_super_admin')::boolean, FALSE)
75
- OR COALESCE((raw_app_meta_data -> 'roles') ? 'admin', FALSE)
76
- OR COALESCE((raw_user_meta_data -> 'roles') ? 'admin', FALSE)
77
- FROM auth.users
78
- WHERE id = user_id
79
- ), FALSE);
80
- $function$;
81
- ```
82
-
83
- ## Pages Web Fournies
84
-
85
- Le module fournit plusieurs composants React prêts à l'emploi utilisant HeroUI :
86
-
87
- ### Pages Utilisateur Authentifié
88
-
89
- #### 1. Dashboard (`/auth/dashboard`)
90
-
91
- **Component**: `DashboardPage`
92
-
93
- Tableau de bord utilisateur affichant :
94
-
95
- - Résumé du profil avec avatar
96
- - Email et date de création du compte
97
- - Statut du compte
98
- - Statistiques rapides (projets, tâches, etc.)
99
-
100
- **Usage** :
101
-
102
- ```tsx
103
- import { DashboardPage } from "@lastbrain/module-auth";
104
-
105
- export default function Dashboard() {
106
- return <DashboardPage />;
107
- }
108
- ```
109
-
110
- #### 2. Profil (`/auth/profile`)
111
-
112
- **Component**: `ProfilePage`
13
+ ### Pages Publiques
113
14
 
114
- Page de modification du profil utilisateur permettant de mettre à jour :
15
+ - **GET** `/signin` - SignInPage
16
+ - **GET** `/signup` - SignUpPage
17
+ - **GET** `/reset-password` - ResetPassword
115
18
 
116
- - Informations personnelles (nom, prénom, téléphone, bio)
117
- - Informations professionnelles (entreprise, site web, localisation)
118
- - Préférences (langue, timezone, avatar)
19
+ ### Pages Protégées (Auth)
119
20
 
120
- **Usage** :
21
+ - **GET** `/dashboard` - DashboardPage
22
+ - **GET** `/reglage` - ReglagePage
23
+ - **GET** `/profile` - ProfilePage
121
24
 
122
- ```tsx
123
- import { ProfilePage } from "@lastbrain/module-auth";
25
+ ### Pages Admin
124
26
 
125
- export default function Profile() {
126
- return <ProfilePage />;
127
- }
128
- ```
27
+ - **GET** `/users` - AdminUsersPage
129
28
 
130
- #### 3. Paramètres (`/auth/settings`)
29
+ ## 🔌 API Routes
131
30
 
132
- **Component**: `ReglagePage`
31
+ ### `/api/auth/signin`
133
32
 
134
- Page de configuration du compte avec :
33
+ **Méthodes supportées**: GET, POST, PUT, DELETE
135
34
 
136
- - Notifications (email, push, marketing)
137
- - Apparence (thème)
138
- - Langue et région (langue, timezone)
35
+ ### `/api/auth/profile`
139
36
 
140
- **Usage** :
37
+ **Méthodes supportées**: GET, POST, PUT, DELETE
141
38
 
142
- ```tsx
143
- import { ReglagePage } from "@lastbrain/module-auth";
39
+ ### `/api/auth/me`
144
40
 
145
- export default function Settings() {
146
- return <ReglagePage />;
147
- }
148
- ```
41
+ **Méthodes supportées**: GET, POST, PUT, DELETE
149
42
 
150
- ### Pages Publiques
43
+ ### `/api/admin/users`
151
44
 
152
- #### 4. Connexion (`/signin`)
45
+ **Méthodes supportées**: GET, POST, PUT, DELETE
153
46
 
154
- **Component**: `SignInPage`
47
+ ## 🗄️ Base de Données
155
48
 
156
- Page de connexion avec gestion des erreurs et redirection.
49
+ ### Tables
157
50
 
158
- **Usage** :
51
+ #### `user_profil`
159
52
 
160
53
  ```tsx
161
- import { SignInPage } from "@lastbrain/module-auth";
162
-
163
- export default function SignIn() {
164
- return <SignInPage />;
165
- }
54
+ <TableStructure
55
+ tableName="user_profil"
56
+ title="user_profil"
57
+ description="Table user_profil du module auth"
58
+ />
166
59
  ```
167
60
 
168
- #### 5. Inscription (`/signup`)
169
-
170
- **Component**: `SignUpPage`
171
-
172
- Page d'inscription avec validation des champs.
173
-
174
- **Usage** :
61
+ #### `user_address`
175
62
 
176
63
  ```tsx
177
- import { SignUpPage } from "@lastbrain/module-auth";
178
-
179
- export default function SignUp() {
180
- return <SignUpPage />;
181
- }
64
+ <TableStructure
65
+ tableName="user_address"
66
+ title="user_address"
67
+ description="Table user_address du module auth"
68
+ />
182
69
  ```
183
70
 
184
- ### Pages Administration
185
-
186
- #### 6. Gestion des Utilisateurs (`/admin/users`)
187
-
188
- **Component**: `AdminUsersPage`
189
-
190
- Page d'administration pour lister et gérer tous les utilisateurs.
191
- **Accès réservé aux super admins uniquement.**
192
-
193
- Fonctionnalités :
194
-
195
- - Liste de tous les utilisateurs
196
- - Recherche par email ou nom
197
- - Pagination
198
- - Affichage des informations (email, rôle, date de création)
199
-
200
- **Usage** :
71
+ #### `user_notifications`
201
72
 
202
73
  ```tsx
203
- import { AdminUsersPage } from "@lastbrain/module-auth";
204
-
205
- export default function AdminUsers() {
206
- return <AdminUsersPage />;
207
- }
208
- ```
209
-
210
- ## Routes API
211
-
212
- Le module expose plusieurs routes API pour la gestion des utilisateurs et profils.
213
-
214
- ### API Authentification (`/api/auth/*`)
215
-
216
- #### GET `/api/auth/me`
217
-
218
- Récupère les informations de l'utilisateur connecté et son profil.
219
-
220
- **Réponse** :
221
-
222
- ```json
223
- {
224
- "data": {
225
- "id": "uuid",
226
- "email": "user@example.com",
227
- "created_at": "2024-01-01T00:00:00Z",
228
- "profile": {
229
- "first_name": "John",
230
- "last_name": "Doe",
231
- "avatar_url": "https://...",
232
- "bio": "...",
233
- "phone": "...",
234
- "company": "...",
235
- "website": "...",
236
- "location": "...",
237
- "language": "en",
238
- "timezone": "UTC",
239
- "preferences": {}
240
- }
241
- }
242
- }
74
+ <TableStructure
75
+ tableName="user_notifications"
76
+ title="user_notifications"
77
+ description="Table user_notifications du module auth"
78
+ />
243
79
  ```
244
80
 
245
- **Erreurs** :
246
-
247
- - `401` : Utilisateur non authentifié
81
+ ### Migrations
248
82
 
249
- #### GET `/api/auth/profile`
83
+ - `20251112000000_user_init.sql`
84
+ - `20251112000001_auto_profile_and_admin_view.sql`
85
+ - `20251112000002_sync_avatars.sql`
86
+ - `20251124000001_add_get_admin_user_details.sql`
250
87
 
251
- Récupère le profil de l'utilisateur connecté.
252
-
253
- **Réponse** :
254
-
255
- ```json
256
- {
257
- "data": {
258
- "id": "uuid",
259
- "owner_id": "uuid",
260
- "first_name": "John",
261
- "last_name": "Doe",
262
- ...
263
- }
264
- }
265
- ```
266
-
267
- #### PUT/PATCH `/api/auth/profile`
268
-
269
- Met à jour le profil de l'utilisateur. Crée le profil s'il n'existe pas.
270
-
271
- **Body** :
272
-
273
- ```json
274
- {
275
- "first_name": "John",
276
- "last_name": "Doe",
277
- "avatar_url": "https://...",
278
- "bio": "...",
279
- "phone": "...",
280
- "company": "...",
281
- "website": "...",
282
- "location": "...",
283
- "language": "fr",
284
- "timezone": "Europe/Paris",
285
- "preferences": {
286
- "email_notifications": true,
287
- "theme": "dark"
288
- }
289
- }
290
- ```
291
-
292
- **Réponse** :
293
-
294
- ```json
295
- {
296
- "data": {
297
- "id": "uuid",
298
- "owner_id": "uuid",
299
- "first_name": "John",
300
- ...
301
- }
302
- }
303
- ```
304
-
305
- ### API Administration (`/api/admin/*`)
306
-
307
- ⚠️ **Toutes les routes admin nécessitent un accès super admin.**
308
-
309
- #### GET `/api/admin/users`
310
-
311
- Liste tous les utilisateurs (paginé).
312
-
313
- **Query Parameters** :
314
-
315
- - `page` (optionnel, défaut: 1) : Numéro de page
316
- - `per_page` (optionnel, défaut: 20) : Nombre d'éléments par page
317
- - `search` (optionnel) : Recherche par email ou nom
318
-
319
- **Réponse** :
320
-
321
- ```json
322
- {
323
- "data": [
324
- {
325
- "id": "uuid",
326
- "email": "user@example.com",
327
- "created_at": "2024-01-01T00:00:00Z",
328
- "profile": {
329
- "first_name": "John",
330
- "last_name": "Doe",
331
- ...
332
- }
333
- }
334
- ],
335
- "pagination": {
336
- "page": 1,
337
- "per_page": 20,
338
- "total": 100,
339
- "total_pages": 5
340
- }
341
- }
342
- ```
343
-
344
- **Erreurs** :
345
-
346
- - `401` : Utilisateur non authentifié
347
- - `403` : Accès refusé (non super admin)
348
-
349
- ### Utilisation dans une API Route Next.js
350
-
351
- ```typescript
352
- // app/api/auth/me/route.ts
353
- export { GET } from "@lastbrain/module-auth/api/auth/me";
354
-
355
- // app/api/auth/profile/route.ts
356
- export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
357
-
358
- // app/api/admin/users/route.ts
359
- export { GET } from "@lastbrain/module-auth/api/admin/users";
360
- ```
361
-
362
- ## Schéma de Base de Données
363
-
364
- Le module utilise les tables suivantes (créées par la migration `20251112000000_user_init.sql`) :
365
-
366
- ### Table `user_profil`
367
-
368
- Stocke les informations de profil utilisateur.
369
-
370
- ```sql
371
- CREATE TABLE public.user_profil (
372
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
373
- owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
374
- first_name TEXT,
375
- last_name TEXT,
376
- avatar_url TEXT,
377
- bio TEXT,
378
- phone TEXT,
379
- company TEXT,
380
- website TEXT,
381
- location TEXT,
382
- language TEXT DEFAULT 'en',
383
- timezone TEXT,
384
- preferences JSONB DEFAULT '{}'::jsonb,
385
- created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
386
- updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
387
- );
388
- ```
389
-
390
- **Index** :
391
-
392
- - `idx_user_profil_owner_id` sur `owner_id`
393
-
394
- **RLS (Row Level Security)** :
395
-
396
- - Les utilisateurs peuvent lire, créer, modifier et supprimer leur propre profil
397
- - Les super admins ont accès à tous les profils
398
-
399
- ### Table `user_address`
400
-
401
- Stocke les adresses des utilisateurs.
402
-
403
- ```sql
404
- CREATE TABLE public.user_address (
405
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
406
- owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
407
- street TEXT NOT NULL,
408
- street2 TEXT,
409
- city TEXT NOT NULL,
410
- state TEXT,
411
- postal_code TEXT,
412
- country TEXT NOT NULL,
413
- is_default BOOLEAN DEFAULT false,
414
- address_type TEXT DEFAULT 'billing',
415
- created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
416
- updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
417
- );
418
- ```
419
-
420
- ### Table `user_notifications`
421
-
422
- Stocke les notifications des utilisateurs.
423
-
424
- ```sql
425
- CREATE TABLE public.user_notifications (
426
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
427
- owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
428
- title TEXT NOT NULL,
429
- body TEXT,
430
- type TEXT NOT NULL DEFAULT 'primary',
431
- read BOOLEAN NOT NULL DEFAULT false,
432
- created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
433
- updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
434
- );
435
- ```
436
-
437
- ## Intégration dans une Application
438
-
439
- ### 1. Installer les dépendances
88
+ ## 📦 Installation
440
89
 
441
90
  ```bash
442
- pnpm add @lastbrain/module-auth @lastbrain/core @lastbrain/ui
91
+ pnpm lastbrain add-module auth
92
+ pnpm build:modules
443
93
  ```
444
94
 
445
- ### 2. Appliquer les migrations Supabase
446
-
447
- Copiez les migrations du module dans votre projet Supabase et appliquez-les :
95
+ ### Appliquer les migrations
448
96
 
449
97
  ```bash
450
- cp node_modules/@lastbrain/module-auth/supabase/migrations/* supabase/migrations/
451
- supabase db push
98
+ cd apps/votre-app
99
+ supabase migration up
452
100
  ```
453
101
 
454
- ### 3. Créer les pages Next.js
455
-
456
- Créez les pages dans votre application Next.js :
102
+ ## 💡 Utilisation
457
103
 
458
- ```typescript
459
- // app/auth/dashboard/page.tsx
460
- import { DashboardPage } from "@lastbrain/module-auth";
461
- export default DashboardPage;
104
+ <!-- 📝 Section à compléter par l'auteur du module -->
462
105
 
463
- // app/auth/profile/page.tsx
464
- import { ProfilePage } from "@lastbrain/module-auth";
465
- export default ProfilePage;
106
+ ### Exemple d'utilisation
466
107
 
467
- // app/auth/settings/page.tsx
468
- import { ReglagePage } from "@lastbrain/module-auth";
469
- export default ReglagePage;
470
-
471
- // app/admin/users/page.tsx
472
- import { AdminUsersPage } from "@lastbrain/module-auth";
473
- export default AdminUsersPage;
474
- ```
475
-
476
- ### 4. Créer les routes API
477
-
478
- ```typescript
479
- // app/api/auth/me/route.ts
480
- export { GET } from "@lastbrain/module-auth/api/auth/me";
481
-
482
- // app/api/auth/profile/route.ts
483
- export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
484
-
485
- // app/api/admin/users/route.ts
486
- export { GET } from "@lastbrain/module-auth/api/admin/users";
487
- ```
488
-
489
- ### 5. Configurer les variables d'environnement
490
-
491
- ```env
492
- NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
493
- NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
494
- ```
495
-
496
- ## Sécurité
497
-
498
- ### Row Level Security (RLS)
499
-
500
- Toutes les tables sont protégées par RLS :
501
-
502
- - Les utilisateurs ne peuvent accéder qu'à leurs propres données
503
- - Les super admins ont accès à toutes les données
504
-
505
- ### Vérification Super Admin
506
-
507
- Les routes admin vérifient l'accès super admin via la RPC Supabase :
508
-
509
- ```typescript
510
- const { data: isSuperAdmin } = await supabase.rpc("is_superadmin", {
511
- user_id: user.id,
512
- });
108
+ ```tsx
109
+ // Importez les composants depuis le module
110
+ import { SignInPage } from "@lastbrain/module-auth";
513
111
 
514
- if (!isSuperAdmin) {
515
- return NextResponse.json({ error: "Forbidden" }, { status: 403 });
516
- }
112
+ // Utilisez-les dans votre application
113
+ <SignInPage />;
517
114
  ```
518
115
 
519
- ### Authentification
520
-
521
- Les routes API vérifient l'authentification :
116
+ ### Configuration
522
117
 
523
- ```typescript
524
- const {
525
- data: { user },
526
- error,
527
- } = await supabase.auth.getUser();
118
+ <!-- Ajoutez ici les détails de configuration spécifiques -->
528
119
 
529
- if (error || !user) {
530
- return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
531
- }
532
- ```
533
-
534
- ## Développement
120
+ ## ⚠️ Danger Zone
535
121
 
536
- ### Build
122
+ La suppression du module supprimera toutes les pages, routes API et migrations associées. **Cette action est irréversible.**
537
123
 
538
124
  ```bash
539
- pnpm build
540
- ```
541
-
542
- ### Watch mode
543
-
544
- ```bash
545
- pnpm dev
125
+ pnpm lastbrain remove-module auth
126
+ pnpm build:modules
546
127
  ```
547
-
548
- ## Support
549
-
550
- Pour des questions ou des problèmes, ouvrez une issue sur [GitHub](https://github.com/lastpublication/starter).
551
-
552
- ## Licence
553
-
554
- MIT
@@ -1,2 +1,9 @@
1
- export declare function AuthModuleDoc(): import("react/jsx-runtime").JSX.Element;
1
+ /**
2
+ * Documentation component for @lastbrain/module-auth
3
+ * Auto-generated from module-auth.build.config.ts
4
+ *
5
+ * To regenerate this file, run:
6
+ * pnpm update:module-docs
7
+ */
8
+ export declare function Doc(): import("react/jsx-runtime").JSX.Element;
2
9
  //# sourceMappingURL=Doc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/components/Doc.tsx"],"names":[],"mappings":"AAUA,wBAAgB,aAAa,4CA2S5B"}
1
+ {"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/components/Doc.tsx"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,GAAG,4CAyVlB"}
@@ -1,5 +1,22 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Card, CardBody, CardHeader, Snippet, Chip, TableStructure, } from "@lastbrain/ui";
3
- export function AuthModuleDoc() {
4
- return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-3xl font-bold mb-2", children: "Module Auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Authentification compl\u00E8te avec gestion des profils utilisateur" })] }), _jsx(Chip, { color: "primary", variant: "flat", children: "v0.1.0" })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCDD Informations" }) }), _jsxs(CardBody, { className: "space-y-2", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Auteur:" }), " LastBrain Team"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Package:" }), " ", "@lastbrain/module-auth"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Derni\u00E8re mise \u00E0 jour:" }), " 21 novembre 2025"] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCC4 Pages Disponibles" }) }), _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Publiques" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signin" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Connexion" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signup" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Inscription" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reset-password" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- R\u00E9initialisation mot de passe" })] })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Prot\u00E9g\u00E9es (Auth)" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/dashboard" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Tableau de bord" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/profile" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Profil utilisateur" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/reglage" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Param\u00E8tres" })] })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Admin" }), _jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/admin/users" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Gestion des utilisateurs" })] }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDD0C Routes API" }) }), _jsxs(CardBody, { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signin" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Authentification" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signup" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Cr\u00E9ation de compte" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signout" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- D\u00E9connexion" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/reset-password" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- R\u00E9initialisation" })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCC1 Structure" }) }), _jsx(CardBody, { children: _jsx(Snippet, { symbol: "", color: "default", size: "sm", hideSymbol: true, hideCopyButton: true, children: _jsxs("div", { className: "flex flex-col gap-1 text-xs font-mono", children: [_jsx("span", { children: "module-auth/" }), _jsx("span", { children: "\u251C\u2500\u2500 src/" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 web/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signin/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signup/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 dashboard/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 profile/" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 reglage/" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 api/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signin.ts" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signup.ts" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signout.ts" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 reset-password.ts" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 components/" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 Doc.tsx" }), _jsx("span", { children: "\u2502 \u2514\u2500\u2500 auth.build.config.ts" }), _jsx("span", { children: "\u2514\u2500\u2500 supabase/" }), _jsx("span", { children: " \u2514\u2500\u2500 migrations/" }), _jsx("span", { children: " \u2514\u2500\u2500 20251112000000_user_init.sql" })] }) }) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDDC4\uFE0F Tables de Donn\u00E9es" }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx(TableStructure, { tableName: "user_profil", title: "user_profil", description: "Profil \u00E9tendu des utilisateurs (pr\u00E9nom, nom, t\u00E9l\u00E9phone, avatar, bio, etc.)" }), _jsx(TableStructure, { tableName: "user_address", title: "user_address", description: "Adresses des utilisateurs (livraison, facturation)" }), _jsx(TableStructure, { tableName: "user_notifications", title: "user_notifications", description: "Pr\u00E9f\u00E9rences de notifications (email, SMS, push)" })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCE6 Installation" }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "supabase migration up" })] }), _jsxs("div", { className: "border-2 border-danger rounded-lg p-4 mt-6", children: [_jsx("h4", { className: "text-lg font-semibold text-danger mb-3", children: "\u26A0\uFE0F Danger Zone" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "La suppression du module supprimera toutes les pages, routes API et migrations associ\u00E9es. Cette action est irr\u00E9versible." }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "danger", size: "sm", children: "pnpm lastbrain remove-module auth" }), _jsx(Snippet, { symbol: "", color: "danger", size: "sm", children: "pnpm build:modules" })] })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCA1 Utilisation" }) }), _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Hooks disponibles" }), _jsxs(Snippet, { symbol: "", color: "default", size: "sm", children: ["import ", "{ useAuthSession }", " from \"@lastbrain/module-auth\";"] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2 mt-4", children: "Exemple d'utilisation" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", hideSymbol: true, children: _jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { children: ["const ", "{ session, user }", " = useAuthSession();"] }), _jsx("span", { children: "if (!session) return <p>Non connect\u00E9</p>;" }), _jsxs("span", { children: ["return <div>Bonjour ", "{user.email}", "</div>;"] })] }) })] })] })] })] }));
3
+ import { Card, CardBody, CardHeader } from "@lastbrain/ui";
4
+ import { Chip } from "@lastbrain/ui";
5
+ import { Snippet } from "@lastbrain/ui";
6
+ import { Alert } from "@lastbrain/ui";
7
+ import { TableStructure } from "@lastbrain/ui";
8
+ import { FileText, Zap, Database, Package, BookOpen, AlertTriangle, } from "lucide-react";
9
+ /**
10
+ * Documentation component for @lastbrain/module-auth
11
+ * Auto-generated from module-auth.build.config.ts
12
+ *
13
+ * To regenerate this file, run:
14
+ * pnpm update:module-docs
15
+ */
16
+ export function Doc() {
17
+ return (_jsxs("div", { className: "container mx-auto p-6 space-y-6", children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { children: [_jsx("h1", { className: "text-3xl font-bold mb-2", children: "\uD83D\uDCE6 Module auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "@lastbrain/module-auth" })] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Package" }), _jsx("code", { className: "text-sm font-semibold", children: "@lastbrain/module-auth" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Slug" }), _jsx("code", { className: "text-sm font-semibold", children: "module-auth" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Type" }), _jsx("code", { className: "text-sm font-semibold", children: "Module LastBrain" })] })] }) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Pages Disponibles"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Publiques" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signin" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- SignInPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signup" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- SignUpPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reset-password" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ResetPassword" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Prot\u00E9g\u00E9es (Auth)" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/dashboard" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- DashboardPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reglage" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ReglagePage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/profile" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ProfilePage" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Admin" }), _jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "secondary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/users" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- AdminUsersPage" })] }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "API Routes"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/signin" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/profile" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/me" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/admin/users" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] })] })] }), _jsxs(Card, { 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-6", children: [_jsx(TableStructure, { tableName: "user_profil", title: "user_profil", description: "Table user_profil du module auth" }), _jsx(TableStructure, { tableName: "user_address", title: "user_address", description: "Table user_address du module auth" }), _jsx(TableStructure, { tableName: "user_notifications", title: "user_notifications", description: "Table user_notifications du module auth" })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Package, { size: 24 }), "Installation"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Ajouter le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "cd apps/votre-app" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "supabase migration up" })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Utilisation"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs(Alert, { color: "default", className: "mb-4", children: [_jsxs("p", { className: "text-sm", children: ["\uD83D\uDCDD ", _jsx("strong", { children: "Section \u00E0 compl\u00E9ter par l'auteur du module" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "Ajoutez ici des exemples d'utilisation, des configurations sp\u00E9cifiques, et toute information utile pour les d\u00E9veloppeurs utilisant ce module." })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemple d'utilisation" }), _jsx(Alert, { color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Importez les composants depuis le module
18
+ import { SignInPage } from "@lastbrain/module-auth";
19
+
20
+ // Utilisez-les dans votre application
21
+ <SignInPage />` }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2 text-danger", children: [_jsx(AlertTriangle, { size: 24 }), "Danger Zone"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs(Alert, { color: "danger", className: "mb-4", children: [_jsx("p", { className: "text-sm font-semibold", children: "\u26A0\uFE0F Cette action est irr\u00E9versible" }), _jsx("p", { className: "text-sm mt-2", children: "La suppression du module supprimera toutes les pages, routes API et migrations associ\u00E9es." })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supprimer le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, color: "danger", className: "text-sm mb-2", children: "pnpm lastbrain remove-module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, color: "danger", className: "text-sm mb-2", children: "pnpm build:modules" })] })] })] })] }));
5
22
  }
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export { ProfilePage } from "./web/auth/profile.js";
6
6
  export { ReglagePage } from "./web/auth/reglage.js";
7
7
  export { AdminUsersPage } from "./web/admin/users.js";
8
8
  export { default as UserPage } from "./web/admin/users/[id].js";
9
- export { AuthModuleDoc } from "./components/Doc.js";
9
+ export { Doc } from "./components/Doc.js";
10
+ export { Doc as AuthModuleDoc } from "./components/Doc.js";
10
11
  export { default as authBuildConfig } from "./auth.build.config.js";
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export { ReglagePage } from "./web/auth/reglage.js";
8
8
  export { AdminUsersPage } from "./web/admin/users.js";
9
9
  export { default as UserPage } from "./web/admin/users/[id].js";
10
10
  // Documentation
11
- export { AuthModuleDoc } from "./components/Doc.js";
11
+ export { Doc } from "./components/Doc.js";
12
+ export { Doc as AuthModuleDoc } from "./components/Doc.js";
12
13
  // Configuration de build (utilisée par les scripts)
13
14
  export { default as authBuildConfig } from "./auth.build.config.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/module-auth",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Module d'authentification complet pour LastBrain avec Supabase",
5
5
  "private": false,
6
6
  "type": "module",
@@ -1,129 +1,144 @@
1
- import React from "react";
1
+ "use client";
2
+
3
+ import { Card, CardBody, CardHeader } from "@lastbrain/ui";
4
+ import { Chip } from "@lastbrain/ui";
5
+ import { Snippet } from "@lastbrain/ui";
6
+ import { Alert } from "@lastbrain/ui";
7
+ import { TableStructure } from "@lastbrain/ui";
2
8
  import {
3
- Card,
4
- CardBody,
5
- CardHeader,
6
- Snippet,
7
- Chip,
8
- TableStructure,
9
- } from "@lastbrain/ui";
9
+ FileText,
10
+ Zap,
11
+ Database,
12
+ Package,
13
+ BookOpen,
14
+ AlertTriangle,
15
+ } from "lucide-react";
10
16
 
11
- export function AuthModuleDoc() {
17
+ /**
18
+ * Documentation component for @lastbrain/module-auth
19
+ * Auto-generated from module-auth.build.config.ts
20
+ *
21
+ * To regenerate this file, run:
22
+ * pnpm update:module-docs
23
+ */
24
+ export function Doc() {
12
25
  return (
13
- <div className="space-y-6">
14
- {/* Header */}
15
- <div className="flex items-start justify-between">
16
- <div>
17
- <h2 className="text-3xl font-bold mb-2">Module Auth</h2>
18
- <p className="text-slate-600 dark:text-slate-400">
19
- Authentification complète avec gestion des profils utilisateur
20
- </p>
21
- </div>
22
- <Chip color="primary" variant="flat">
23
- v0.1.0
24
- </Chip>
25
- </div>
26
-
27
- {/* Author */}
26
+ <div className="container mx-auto p-6 space-y-6">
28
27
  <Card>
29
28
  <CardHeader>
30
- <h3 className="text-xl font-semibold">📝 Informations</h3>
31
- </CardHeader>
32
- <CardBody className="space-y-2">
33
- <div>
34
- <span className="font-semibold">Auteur:</span> LastBrain Team
35
- </div>
36
29
  <div>
37
- <span className="font-semibold">Package:</span>{" "}
38
- @lastbrain/module-auth
30
+ <h1 className="text-3xl font-bold mb-2">📦 Module auth</h1>
31
+ <p className="text-slate-600 dark:text-slate-400">
32
+ @lastbrain/module-auth
33
+ </p>
39
34
  </div>
40
- <div>
41
- <span className="font-semibold">Dernière mise à jour:</span> 21
42
- novembre 2025
35
+ </CardHeader>
36
+ <CardBody>
37
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
38
+ <div>
39
+ <p className="text-sm text-slate-600 dark:text-slate-400">
40
+ Package
41
+ </p>
42
+ <code className="text-sm font-semibold">
43
+ @lastbrain/module-auth
44
+ </code>
45
+ </div>
46
+ <div>
47
+ <p className="text-sm text-slate-600 dark:text-slate-400">Slug</p>
48
+ <code className="text-sm font-semibold">module-auth</code>
49
+ </div>
50
+ <div>
51
+ <p className="text-sm text-slate-600 dark:text-slate-400">Type</p>
52
+ <code className="text-sm font-semibold">Module LastBrain</code>
53
+ </div>
43
54
  </div>
44
55
  </CardBody>
45
56
  </Card>
46
57
 
47
- {/* Pages disponibles */}
48
58
  <Card>
49
59
  <CardHeader>
50
- <h3 className="text-xl font-semibold">📄 Pages Disponibles</h3>
60
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
61
+ <FileText size={24} />
62
+ Pages Disponibles
63
+ </h2>
51
64
  </CardHeader>
52
- <CardBody className="space-y-3">
65
+ <CardBody className="space-y-4">
53
66
  <div>
54
- <h4 className="font-semibold mb-2">Pages Publiques</h4>
67
+ <h3 className="text-lg font-semibold mb-2">Pages Publiques</h3>
55
68
  <div className="space-y-2">
56
- <div className="flex items-center gap-2">
69
+ <div className="flex items-start gap-2">
57
70
  <Chip size="sm" color="success" variant="flat">
58
71
  GET
59
72
  </Chip>
60
73
  <code className="text-sm">/signin</code>
61
- <span className="text-slate-600 dark:text-slate-400">
62
- - Connexion
74
+ <span className="text-sm text-slate-600 dark:text-slate-400">
75
+ - SignInPage
63
76
  </span>
64
77
  </div>
65
- <div className="flex items-center gap-2">
78
+ <div className="flex items-start gap-2">
66
79
  <Chip size="sm" color="success" variant="flat">
67
80
  GET
68
81
  </Chip>
69
82
  <code className="text-sm">/signup</code>
70
- <span className="text-slate-600 dark:text-slate-400">
71
- - Inscription
83
+ <span className="text-sm text-slate-600 dark:text-slate-400">
84
+ - SignUpPage
72
85
  </span>
73
86
  </div>
74
- <div className="flex items-center gap-2">
87
+ <div className="flex items-start gap-2">
75
88
  <Chip size="sm" color="success" variant="flat">
76
89
  GET
77
90
  </Chip>
78
91
  <code className="text-sm">/reset-password</code>
79
- <span className="text-slate-600 dark:text-slate-400">
80
- - Réinitialisation mot de passe
92
+ <span className="text-sm text-slate-600 dark:text-slate-400">
93
+ - ResetPassword
81
94
  </span>
82
95
  </div>
83
96
  </div>
84
97
  </div>
85
98
  <div>
86
- <h4 className="font-semibold mb-2">Pages Protégées (Auth)</h4>
99
+ <h3 className="text-lg font-semibold mb-2">
100
+ Pages Protégées (Auth)
101
+ </h3>
87
102
  <div className="space-y-2">
88
- <div className="flex items-center gap-2">
103
+ <div className="flex items-start gap-2">
89
104
  <Chip size="sm" color="primary" variant="flat">
90
105
  GET
91
106
  </Chip>
92
- <code className="text-sm">/auth/dashboard</code>
93
- <span className="text-slate-600 dark:text-slate-400">
94
- - Tableau de bord
107
+ <code className="text-sm">/dashboard</code>
108
+ <span className="text-sm text-slate-600 dark:text-slate-400">
109
+ - DashboardPage
95
110
  </span>
96
111
  </div>
97
- <div className="flex items-center gap-2">
112
+ <div className="flex items-start gap-2">
98
113
  <Chip size="sm" color="primary" variant="flat">
99
114
  GET
100
115
  </Chip>
101
- <code className="text-sm">/auth/profile</code>
102
- <span className="text-slate-600 dark:text-slate-400">
103
- - Profil utilisateur
116
+ <code className="text-sm">/reglage</code>
117
+ <span className="text-sm text-slate-600 dark:text-slate-400">
118
+ - ReglagePage
104
119
  </span>
105
120
  </div>
106
- <div className="flex items-center gap-2">
121
+ <div className="flex items-start gap-2">
107
122
  <Chip size="sm" color="primary" variant="flat">
108
123
  GET
109
124
  </Chip>
110
- <code className="text-sm">/auth/reglage</code>
111
- <span className="text-slate-600 dark:text-slate-400">
112
- - Paramètres
125
+ <code className="text-sm">/profile</code>
126
+ <span className="text-sm text-slate-600 dark:text-slate-400">
127
+ - ProfilePage
113
128
  </span>
114
129
  </div>
115
130
  </div>
116
131
  </div>
117
132
  <div>
118
- <h4 className="font-semibold mb-2">Pages Admin</h4>
133
+ <h3 className="text-lg font-semibold mb-2">Pages Admin</h3>
119
134
  <div className="space-y-2">
120
- <div className="flex items-center gap-2">
121
- <Chip size="sm" color="danger" variant="flat">
135
+ <div className="flex items-start gap-2">
136
+ <Chip size="sm" color="secondary" variant="flat">
122
137
  GET
123
138
  </Chip>
124
- <code className="text-sm">/admin/users</code>
125
- <span className="text-slate-600 dark:text-slate-400">
126
- - Gestion des utilisateurs
139
+ <code className="text-sm">/users</code>
140
+ <span className="text-sm text-slate-600 dark:text-slate-400">
141
+ - AdminUsersPage
127
142
  </span>
128
143
  </div>
129
144
  </div>
@@ -131,176 +146,220 @@ export function AuthModuleDoc() {
131
146
  </CardBody>
132
147
  </Card>
133
148
 
134
- {/* Routes API */}
135
149
  <Card>
136
150
  <CardHeader>
137
- <h3 className="text-xl font-semibold">🔌 Routes API</h3>
151
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
152
+ <Zap size={24} />
153
+ API Routes
154
+ </h2>
138
155
  </CardHeader>
139
- <CardBody className="space-y-2">
140
- <div className="flex items-center gap-2">
141
- <Chip size="sm" color="warning" variant="flat">
142
- POST
143
- </Chip>
144
- <code className="text-sm">/api/auth/signin</code>
145
- <span className="text-slate-600 dark:text-slate-400">
146
- - Authentification
147
- </span>
148
- </div>
149
- <div className="flex items-center gap-2">
150
- <Chip size="sm" color="warning" variant="flat">
151
- POST
152
- </Chip>
153
- <code className="text-sm">/api/auth/signup</code>
154
- <span className="text-slate-600 dark:text-slate-400">
155
- - Création de compte
156
- </span>
156
+ <CardBody className="space-y-4">
157
+ <div>
158
+ <h3 className="text-lg font-semibold mb-2">
159
+ <code>/api/auth/signin</code>
160
+ </h3>
161
+ <div className="flex gap-2">
162
+ <Chip size="sm" color="success" variant="flat">
163
+ GET
164
+ </Chip>
165
+ <Chip size="sm" color="primary" variant="flat">
166
+ POST
167
+ </Chip>
168
+ <Chip size="sm" color="warning" variant="flat">
169
+ PUT
170
+ </Chip>
171
+ <Chip size="sm" color="danger" variant="flat">
172
+ DELETE
173
+ </Chip>
174
+ </div>
157
175
  </div>
158
- <div className="flex items-center gap-2">
159
- <Chip size="sm" color="warning" variant="flat">
160
- POST
161
- </Chip>
162
- <code className="text-sm">/api/auth/signout</code>
163
- <span className="text-slate-600 dark:text-slate-400">
164
- - Déconnexion
165
- </span>
176
+ <div>
177
+ <h3 className="text-lg font-semibold mb-2">
178
+ <code>/api/auth/profile</code>
179
+ </h3>
180
+ <div className="flex gap-2">
181
+ <Chip size="sm" color="success" variant="flat">
182
+ GET
183
+ </Chip>
184
+ <Chip size="sm" color="primary" variant="flat">
185
+ POST
186
+ </Chip>
187
+ <Chip size="sm" color="warning" variant="flat">
188
+ PUT
189
+ </Chip>
190
+ <Chip size="sm" color="danger" variant="flat">
191
+ DELETE
192
+ </Chip>
193
+ </div>
166
194
  </div>
167
- <div className="flex items-center gap-2">
168
- <Chip size="sm" color="warning" variant="flat">
169
- POST
170
- </Chip>
171
- <code className="text-sm">/api/auth/reset-password</code>
172
- <span className="text-slate-600 dark:text-slate-400">
173
- - Réinitialisation
174
- </span>
195
+ <div>
196
+ <h3 className="text-lg font-semibold mb-2">
197
+ <code>/api/auth/me</code>
198
+ </h3>
199
+ <div className="flex gap-2">
200
+ <Chip size="sm" color="success" variant="flat">
201
+ GET
202
+ </Chip>
203
+ <Chip size="sm" color="primary" variant="flat">
204
+ POST
205
+ </Chip>
206
+ <Chip size="sm" color="warning" variant="flat">
207
+ PUT
208
+ </Chip>
209
+ <Chip size="sm" color="danger" variant="flat">
210
+ DELETE
211
+ </Chip>
212
+ </div>
175
213
  </div>
176
- </CardBody>
177
- </Card>
178
-
179
- {/* Structure */}
180
- <Card>
181
- <CardHeader>
182
- <h3 className="text-xl font-semibold">📁 Structure</h3>
183
- </CardHeader>
184
- <CardBody>
185
- <Snippet
186
- symbol=""
187
- color="default"
188
- size="sm"
189
- hideSymbol
190
- hideCopyButton
191
- >
192
- <div className="flex flex-col gap-1 text-xs font-mono">
193
- <span>module-auth/</span>
194
- <span>├── src/</span>
195
- <span>│ ├── web/</span>
196
- <span>│ │ ├── signin/</span>
197
- <span>│ │ ├── signup/</span>
198
- <span>│ │ ├── dashboard/</span>
199
- <span>│ │ ├── profile/</span>
200
- <span>│ │ └── reglage/</span>
201
- <span>│ ├── api/</span>
202
- <span>│ │ ├── signin.ts</span>
203
- <span>│ │ ├── signup.ts</span>
204
- <span>│ │ ├── signout.ts</span>
205
- <span>│ │ └── reset-password.ts</span>
206
- <span>│ ├── components/</span>
207
- <span>│ │ └── Doc.tsx</span>
208
- <span>│ └── auth.build.config.ts</span>
209
- <span>└── supabase/</span>
210
- <span> └── migrations/</span>
211
- <span> └── 20251112000000_user_init.sql</span>
214
+ <div>
215
+ <h3 className="text-lg font-semibold mb-2">
216
+ <code>/api/admin/users</code>
217
+ </h3>
218
+ <div className="flex gap-2">
219
+ <Chip size="sm" color="success" variant="flat">
220
+ GET
221
+ </Chip>
222
+ <Chip size="sm" color="primary" variant="flat">
223
+ POST
224
+ </Chip>
225
+ <Chip size="sm" color="warning" variant="flat">
226
+ PUT
227
+ </Chip>
228
+ <Chip size="sm" color="danger" variant="flat">
229
+ DELETE
230
+ </Chip>
212
231
  </div>
213
- </Snippet>
232
+ </div>
214
233
  </CardBody>
215
234
  </Card>
216
235
 
217
- {/* Tables de données */}
218
236
  <Card>
219
237
  <CardHeader>
220
- <h3 className="text-xl font-semibold">🗄️ Tables de Données</h3>
238
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
239
+ <Database size={24} />
240
+ Base de Données
241
+ </h2>
221
242
  </CardHeader>
222
- <CardBody className="space-y-4">
243
+ <CardBody className="space-y-6">
223
244
  <TableStructure
224
245
  tableName="user_profil"
225
246
  title="user_profil"
226
- description="Profil étendu des utilisateurs (prénom, nom, téléphone, avatar, bio, etc.)"
247
+ description="Table user_profil du module auth"
227
248
  />
228
249
  <TableStructure
229
250
  tableName="user_address"
230
251
  title="user_address"
231
- description="Adresses des utilisateurs (livraison, facturation)"
252
+ description="Table user_address du module auth"
232
253
  />
233
254
  <TableStructure
234
255
  tableName="user_notifications"
235
256
  title="user_notifications"
236
- description="Préférences de notifications (email, SMS, push)"
257
+ description="Table user_notifications du module auth"
237
258
  />
238
259
  </CardBody>
239
260
  </Card>
240
261
 
241
- {/* Installation */}
242
262
  <Card>
243
263
  <CardHeader>
244
- <h3 className="text-xl font-semibold">📦 Installation</h3>
264
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
265
+ <Package size={24} />
266
+ Installation
267
+ </h2>
245
268
  </CardHeader>
246
269
  <CardBody className="space-y-4">
247
- <div className="flex flex-col gap-2">
248
- <Snippet symbol="" color="default" size="sm">
270
+ <div>
271
+ <h3 className="text-lg font-semibold mb-2">Ajouter le module</h3>
272
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
249
273
  pnpm lastbrain add-module auth
250
274
  </Snippet>
251
- <Snippet symbol="" color="default" size="sm">
275
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
252
276
  pnpm build:modules
253
277
  </Snippet>
254
- <Snippet symbol="" color="default" size="sm">
278
+ </div>
279
+
280
+ <div>
281
+ <h3 className="text-lg font-semibold mb-2">
282
+ Appliquer les migrations
283
+ </h3>
284
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
285
+ cd apps/votre-app
286
+ </Snippet>
287
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
255
288
  supabase migration up
256
289
  </Snippet>
257
290
  </div>
291
+ </CardBody>
292
+ </Card>
258
293
 
259
- {/* Danger Zone */}
260
- <div className="border-2 border-danger rounded-lg p-4 mt-6">
261
- <h4 className="text-lg font-semibold text-danger mb-3">
262
- ⚠️ Danger Zone
263
- </h4>
264
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-3">
265
- La suppression du module supprimera toutes les pages, routes API
266
- et migrations associées. Cette action est irréversible.
294
+ <Card>
295
+ <CardHeader>
296
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
297
+ <BookOpen size={24} />
298
+ Utilisation
299
+ </h2>
300
+ </CardHeader>
301
+ <CardBody className="space-y-4">
302
+ <Alert color="default" className="mb-4">
303
+ <p className="text-sm">
304
+ 📝 <strong>Section à compléter par l'auteur du module</strong>
267
305
  </p>
268
- <div className="flex flex-col gap-2">
269
- <Snippet symbol="" color="danger" size="sm">
270
- pnpm lastbrain remove-module auth
271
- </Snippet>
272
- <Snippet symbol="" color="danger" size="sm">
273
- pnpm build:modules
274
- </Snippet>
275
- </div>
306
+ <p className="text-sm text-slate-600 dark:text-slate-400 mt-2">
307
+ Ajoutez ici des exemples d'utilisation, des configurations
308
+ spécifiques, et toute information utile pour les développeurs
309
+ utilisant ce module.
310
+ </p>
311
+ </Alert>
312
+
313
+ <div>
314
+ <h3 className="text-lg font-semibold mb-2">
315
+ Exemple d'utilisation
316
+ </h3>
317
+ <Alert color="primary" className="p-4 mb-4">
318
+ <pre className="whitespace-pre-wrap">{`// Importez les composants depuis le module
319
+ import { SignInPage } from "@lastbrain/module-auth";
320
+
321
+ // Utilisez-les dans votre application
322
+ <SignInPage />`}</pre>
323
+ </Alert>
276
324
  </div>
277
325
  </CardBody>
278
326
  </Card>
279
327
 
280
- {/* Utilisation */}
281
328
  <Card>
282
329
  <CardHeader>
283
- <h3 className="text-xl font-semibold">💡 Utilisation</h3>
330
+ <h2 className="text-2xl font-semibold flex items-center gap-2 text-danger">
331
+ <AlertTriangle size={24} />
332
+ Danger Zone
333
+ </h2>
284
334
  </CardHeader>
285
- <CardBody className="space-y-3">
335
+ <CardBody className="space-y-4">
336
+ <Alert color="danger" className="mb-4">
337
+ <p className="text-sm font-semibold">
338
+ ⚠️ Cette action est irréversible
339
+ </p>
340
+ <p className="text-sm mt-2">
341
+ La suppression du module supprimera toutes les pages, routes API
342
+ et migrations associées.
343
+ </p>
344
+ </Alert>
345
+
286
346
  <div>
287
- <h4 className="font-semibold mb-2">Hooks disponibles</h4>
288
- <Snippet symbol="" color="default" size="sm">
289
- import {"{ useAuthSession }"} from "@lastbrain/module-auth";
347
+ <h3 className="text-lg font-semibold mb-2">Supprimer le module</h3>
348
+ <Snippet
349
+ symbol=""
350
+ hideSymbol
351
+ color="danger"
352
+ className="text-sm mb-2"
353
+ >
354
+ pnpm lastbrain remove-module auth
290
355
  </Snippet>
291
- </div>
292
- <div>
293
- <h4 className="font-semibold mb-2 mt-4">Exemple d'utilisation</h4>
294
- <Snippet symbol="" color="default" size="sm" hideSymbol>
295
- <div className="flex flex-col gap-1">
296
- <span>const {"{ session, user }"} = useAuthSession();</span>
297
- <span>
298
- if (!session) return &lt;p&gt;Non connecté&lt;/p&gt;;
299
- </span>
300
- <span>
301
- return &lt;div&gt;Bonjour {"{user.email}"}&lt;/div&gt;;
302
- </span>
303
- </div>
356
+ <Snippet
357
+ symbol=""
358
+ hideSymbol
359
+ color="danger"
360
+ className="text-sm mb-2"
361
+ >
362
+ pnpm build:modules
304
363
  </Snippet>
305
364
  </div>
306
365
  </CardBody>
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export { ReglagePage } from "./web/auth/reglage.js";
8
8
  export { AdminUsersPage } from "./web/admin/users.js";
9
9
  export { default as UserPage } from "./web/admin/users/[id].js";
10
10
  // Documentation
11
- export { AuthModuleDoc } from "./components/Doc.js";
11
+ export { Doc } from "./components/Doc.js";
12
+ export { Doc as AuthModuleDoc } from "./components/Doc.js";
12
13
  // Configuration de build (utilisée par les scripts)
13
14
  export { default as authBuildConfig } from "./auth.build.config.js";