@lastbrain/module-auth 0.1.9 → 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 +71 -477
- package/dist/components/Doc.d.ts +8 -1
- package/dist/components/Doc.d.ts.map +1 -1
- package/dist/components/Doc.js +20 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/package.json +1 -1
- package/src/components/Doc.tsx +246 -187
- package/src/index.ts +2 -1
package/README.md
CHANGED
|
@@ -1,533 +1,127 @@
|
|
|
1
|
-
# Module
|
|
1
|
+
# 📦 Module auth
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> @lastbrain/module-auth
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 📋 Informations
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
- [Routes API](#routes-api)
|
|
11
|
-
- [Schéma de Base de Données](#schéma-de-base-de-données)
|
|
12
|
-
- [Intégration dans une Application](#intégration-dans-une-application)
|
|
13
|
-
- [Sécurité](#sécurité)
|
|
7
|
+
- **Nom du package**: `@lastbrain/module-auth`
|
|
8
|
+
- **Slug**: `module-auth`
|
|
9
|
+
- **Type**: Module LastBrain
|
|
14
10
|
|
|
15
|
-
##
|
|
11
|
+
## 📄 Pages Disponibles
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
npm install @lastbrain/module-auth
|
|
19
|
-
# or
|
|
20
|
-
pnpm add @lastbrain/module-auth
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Configuration
|
|
24
|
-
|
|
25
|
-
### Prérequis
|
|
26
|
-
|
|
27
|
-
1. **Supabase configuré** : Vous devez avoir un projet Supabase avec les variables d'environnement suivantes :
|
|
28
|
-
|
|
29
|
-
```env
|
|
30
|
-
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
31
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
2. **Migrations appliquées** : Appliquez la migration fournie dans `supabase/migrations/20251112000000_user_init.sql` pour créer les tables nécessaires.
|
|
13
|
+
### Pages Publiques
|
|
35
14
|
|
|
36
|
-
|
|
15
|
+
- **GET** `/signin` - SignInPage
|
|
16
|
+
- **GET** `/signup` - SignUpPage
|
|
17
|
+
- **GET** `/reset-password` - ResetPassword
|
|
37
18
|
|
|
38
|
-
###
|
|
19
|
+
### Pages Protégées (Auth)
|
|
39
20
|
|
|
40
|
-
|
|
21
|
+
- **GET** `/dashboard` - DashboardPage
|
|
22
|
+
- **GET** `/reglage` - ReglagePage
|
|
23
|
+
- **GET** `/profile` - ProfilePage
|
|
41
24
|
|
|
42
|
-
|
|
43
|
-
CREATE OR REPLACE FUNCTION public.is_superadmin(user_id uuid)
|
|
44
|
-
RETURNS boolean
|
|
45
|
-
LANGUAGE sql
|
|
46
|
-
STABLE
|
|
47
|
-
SECURITY DEFINER
|
|
48
|
-
SET search_path = public, auth
|
|
49
|
-
AS $function$
|
|
50
|
-
SELECT COALESCE((
|
|
51
|
-
SELECT
|
|
52
|
-
COALESCE((raw_app_meta_data ->> 'is_super_admin')::boolean, FALSE)
|
|
53
|
-
OR COALESCE((raw_user_meta_data ->> 'is_super_admin')::boolean, FALSE)
|
|
54
|
-
OR COALESCE((raw_app_meta_data -> 'roles') ? 'admin', FALSE)
|
|
55
|
-
OR COALESCE((raw_user_meta_data -> 'roles') ? 'admin', FALSE)
|
|
56
|
-
FROM auth.users
|
|
57
|
-
WHERE id = user_id
|
|
58
|
-
), FALSE);
|
|
59
|
-
$function$;
|
|
60
|
-
```
|
|
25
|
+
### Pages Admin
|
|
61
26
|
|
|
62
|
-
|
|
27
|
+
- **GET** `/users` - AdminUsersPage
|
|
63
28
|
|
|
64
|
-
|
|
29
|
+
## 🔌 API Routes
|
|
65
30
|
|
|
66
|
-
###
|
|
31
|
+
### `/api/auth/signin`
|
|
67
32
|
|
|
68
|
-
|
|
33
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
69
34
|
|
|
70
|
-
|
|
35
|
+
### `/api/auth/profile`
|
|
71
36
|
|
|
72
|
-
|
|
37
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
73
38
|
|
|
74
|
-
|
|
75
|
-
- Email et date de création du compte
|
|
76
|
-
- Statut du compte
|
|
77
|
-
- Statistiques rapides (projets, tâches, etc.)
|
|
39
|
+
### `/api/auth/me`
|
|
78
40
|
|
|
79
|
-
**
|
|
41
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
80
42
|
|
|
81
|
-
|
|
82
|
-
import { DashboardPage } from "@lastbrain/module-auth";
|
|
43
|
+
### `/api/admin/users`
|
|
83
44
|
|
|
84
|
-
|
|
85
|
-
return <DashboardPage />;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
45
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
88
46
|
|
|
89
|
-
|
|
47
|
+
## 🗄️ Base de Données
|
|
90
48
|
|
|
91
|
-
|
|
49
|
+
### Tables
|
|
92
50
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
- Informations personnelles (nom, prénom, téléphone, bio)
|
|
96
|
-
- Informations professionnelles (entreprise, site web, localisation)
|
|
97
|
-
- Préférences (langue, timezone, avatar)
|
|
98
|
-
|
|
99
|
-
**Usage** :
|
|
51
|
+
#### `user_profil`
|
|
100
52
|
|
|
101
53
|
```tsx
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
54
|
+
<TableStructure
|
|
55
|
+
tableName="user_profil"
|
|
56
|
+
title="user_profil"
|
|
57
|
+
description="Table user_profil du module auth"
|
|
58
|
+
/>
|
|
107
59
|
```
|
|
108
60
|
|
|
109
|
-
####
|
|
110
|
-
|
|
111
|
-
**Component**: `ReglagePage`
|
|
112
|
-
|
|
113
|
-
Page de configuration du compte avec :
|
|
114
|
-
|
|
115
|
-
- Notifications (email, push, marketing)
|
|
116
|
-
- Apparence (thème)
|
|
117
|
-
- Langue et région (langue, timezone)
|
|
118
|
-
|
|
119
|
-
**Usage** :
|
|
61
|
+
#### `user_address`
|
|
120
62
|
|
|
121
63
|
```tsx
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
64
|
+
<TableStructure
|
|
65
|
+
tableName="user_address"
|
|
66
|
+
title="user_address"
|
|
67
|
+
description="Table user_address du module auth"
|
|
68
|
+
/>
|
|
127
69
|
```
|
|
128
70
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
#### 4. Connexion (`/signin`)
|
|
132
|
-
|
|
133
|
-
**Component**: `SignInPage`
|
|
134
|
-
|
|
135
|
-
Page de connexion avec gestion des erreurs et redirection.
|
|
136
|
-
|
|
137
|
-
**Usage** :
|
|
71
|
+
#### `user_notifications`
|
|
138
72
|
|
|
139
73
|
```tsx
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
#### 5. Inscription (`/signup`)
|
|
148
|
-
|
|
149
|
-
**Component**: `SignUpPage`
|
|
150
|
-
|
|
151
|
-
Page d'inscription avec validation des champs.
|
|
152
|
-
|
|
153
|
-
**Usage** :
|
|
154
|
-
|
|
155
|
-
```tsx
|
|
156
|
-
import { SignUpPage } from "@lastbrain/module-auth";
|
|
157
|
-
|
|
158
|
-
export default function SignUp() {
|
|
159
|
-
return <SignUpPage />;
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Pages Administration
|
|
164
|
-
|
|
165
|
-
#### 6. Gestion des Utilisateurs (`/admin/users`)
|
|
166
|
-
|
|
167
|
-
**Component**: `AdminUsersPage`
|
|
168
|
-
|
|
169
|
-
Page d'administration pour lister et gérer tous les utilisateurs.
|
|
170
|
-
**Accès réservé aux super admins uniquement.**
|
|
171
|
-
|
|
172
|
-
Fonctionnalités :
|
|
173
|
-
|
|
174
|
-
- Liste de tous les utilisateurs
|
|
175
|
-
- Recherche par email ou nom
|
|
176
|
-
- Pagination
|
|
177
|
-
- Affichage des informations (email, rôle, date de création)
|
|
178
|
-
|
|
179
|
-
**Usage** :
|
|
180
|
-
|
|
181
|
-
```tsx
|
|
182
|
-
import { AdminUsersPage } from "@lastbrain/module-auth";
|
|
183
|
-
|
|
184
|
-
export default function AdminUsers() {
|
|
185
|
-
return <AdminUsersPage />;
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## Routes API
|
|
190
|
-
|
|
191
|
-
Le module expose plusieurs routes API pour la gestion des utilisateurs et profils.
|
|
192
|
-
|
|
193
|
-
### API Authentification (`/api/auth/*`)
|
|
194
|
-
|
|
195
|
-
#### GET `/api/auth/me`
|
|
196
|
-
|
|
197
|
-
Récupère les informations de l'utilisateur connecté et son profil.
|
|
198
|
-
|
|
199
|
-
**Réponse** :
|
|
200
|
-
|
|
201
|
-
```json
|
|
202
|
-
{
|
|
203
|
-
"data": {
|
|
204
|
-
"id": "uuid",
|
|
205
|
-
"email": "user@example.com",
|
|
206
|
-
"created_at": "2024-01-01T00:00:00Z",
|
|
207
|
-
"profile": {
|
|
208
|
-
"first_name": "John",
|
|
209
|
-
"last_name": "Doe",
|
|
210
|
-
"avatar_url": "https://...",
|
|
211
|
-
"bio": "...",
|
|
212
|
-
"phone": "...",
|
|
213
|
-
"company": "...",
|
|
214
|
-
"website": "...",
|
|
215
|
-
"location": "...",
|
|
216
|
-
"language": "en",
|
|
217
|
-
"timezone": "UTC",
|
|
218
|
-
"preferences": {}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Erreurs** :
|
|
225
|
-
|
|
226
|
-
- `401` : Utilisateur non authentifié
|
|
227
|
-
|
|
228
|
-
#### GET `/api/auth/profile`
|
|
229
|
-
|
|
230
|
-
Récupère le profil de l'utilisateur connecté.
|
|
231
|
-
|
|
232
|
-
**Réponse** :
|
|
233
|
-
|
|
234
|
-
```json
|
|
235
|
-
{
|
|
236
|
-
"data": {
|
|
237
|
-
"id": "uuid",
|
|
238
|
-
"owner_id": "uuid",
|
|
239
|
-
"first_name": "John",
|
|
240
|
-
"last_name": "Doe",
|
|
241
|
-
...
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
#### PUT/PATCH `/api/auth/profile`
|
|
247
|
-
|
|
248
|
-
Met à jour le profil de l'utilisateur. Crée le profil s'il n'existe pas.
|
|
249
|
-
|
|
250
|
-
**Body** :
|
|
251
|
-
|
|
252
|
-
```json
|
|
253
|
-
{
|
|
254
|
-
"first_name": "John",
|
|
255
|
-
"last_name": "Doe",
|
|
256
|
-
"avatar_url": "https://...",
|
|
257
|
-
"bio": "...",
|
|
258
|
-
"phone": "...",
|
|
259
|
-
"company": "...",
|
|
260
|
-
"website": "...",
|
|
261
|
-
"location": "...",
|
|
262
|
-
"language": "fr",
|
|
263
|
-
"timezone": "Europe/Paris",
|
|
264
|
-
"preferences": {
|
|
265
|
-
"email_notifications": true,
|
|
266
|
-
"theme": "dark"
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
**Réponse** :
|
|
272
|
-
|
|
273
|
-
```json
|
|
274
|
-
{
|
|
275
|
-
"data": {
|
|
276
|
-
"id": "uuid",
|
|
277
|
-
"owner_id": "uuid",
|
|
278
|
-
"first_name": "John",
|
|
279
|
-
...
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
### API Administration (`/api/admin/*`)
|
|
285
|
-
|
|
286
|
-
⚠️ **Toutes les routes admin nécessitent un accès super admin.**
|
|
287
|
-
|
|
288
|
-
#### GET `/api/admin/users`
|
|
289
|
-
|
|
290
|
-
Liste tous les utilisateurs (paginé).
|
|
291
|
-
|
|
292
|
-
**Query Parameters** :
|
|
293
|
-
|
|
294
|
-
- `page` (optionnel, défaut: 1) : Numéro de page
|
|
295
|
-
- `per_page` (optionnel, défaut: 20) : Nombre d'éléments par page
|
|
296
|
-
- `search` (optionnel) : Recherche par email ou nom
|
|
297
|
-
|
|
298
|
-
**Réponse** :
|
|
299
|
-
|
|
300
|
-
```json
|
|
301
|
-
{
|
|
302
|
-
"data": [
|
|
303
|
-
{
|
|
304
|
-
"id": "uuid",
|
|
305
|
-
"email": "user@example.com",
|
|
306
|
-
"created_at": "2024-01-01T00:00:00Z",
|
|
307
|
-
"profile": {
|
|
308
|
-
"first_name": "John",
|
|
309
|
-
"last_name": "Doe",
|
|
310
|
-
...
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
],
|
|
314
|
-
"pagination": {
|
|
315
|
-
"page": 1,
|
|
316
|
-
"per_page": 20,
|
|
317
|
-
"total": 100,
|
|
318
|
-
"total_pages": 5
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
**Erreurs** :
|
|
324
|
-
|
|
325
|
-
- `401` : Utilisateur non authentifié
|
|
326
|
-
- `403` : Accès refusé (non super admin)
|
|
327
|
-
|
|
328
|
-
### Utilisation dans une API Route Next.js
|
|
329
|
-
|
|
330
|
-
```typescript
|
|
331
|
-
// app/api/auth/me/route.ts
|
|
332
|
-
export { GET } from "@lastbrain/module-auth/api/auth/me";
|
|
333
|
-
|
|
334
|
-
// app/api/auth/profile/route.ts
|
|
335
|
-
export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
|
|
336
|
-
|
|
337
|
-
// app/api/admin/users/route.ts
|
|
338
|
-
export { GET } from "@lastbrain/module-auth/api/admin/users";
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## Schéma de Base de Données
|
|
342
|
-
|
|
343
|
-
Le module utilise les tables suivantes (créées par la migration `20251112000000_user_init.sql`) :
|
|
344
|
-
|
|
345
|
-
### Table `user_profil`
|
|
346
|
-
|
|
347
|
-
Stocke les informations de profil utilisateur.
|
|
348
|
-
|
|
349
|
-
```sql
|
|
350
|
-
CREATE TABLE public.user_profil (
|
|
351
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
352
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
353
|
-
first_name TEXT,
|
|
354
|
-
last_name TEXT,
|
|
355
|
-
avatar_url TEXT,
|
|
356
|
-
bio TEXT,
|
|
357
|
-
phone TEXT,
|
|
358
|
-
company TEXT,
|
|
359
|
-
website TEXT,
|
|
360
|
-
location TEXT,
|
|
361
|
-
language TEXT DEFAULT 'en',
|
|
362
|
-
timezone TEXT,
|
|
363
|
-
preferences JSONB DEFAULT '{}'::jsonb,
|
|
364
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
365
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
366
|
-
);
|
|
74
|
+
<TableStructure
|
|
75
|
+
tableName="user_notifications"
|
|
76
|
+
title="user_notifications"
|
|
77
|
+
description="Table user_notifications du module auth"
|
|
78
|
+
/>
|
|
367
79
|
```
|
|
368
80
|
|
|
369
|
-
|
|
81
|
+
### Migrations
|
|
370
82
|
|
|
371
|
-
- `
|
|
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`
|
|
372
87
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
- Les utilisateurs peuvent lire, créer, modifier et supprimer leur propre profil
|
|
376
|
-
- Les super admins ont accès à tous les profils
|
|
377
|
-
|
|
378
|
-
### Table `user_address`
|
|
379
|
-
|
|
380
|
-
Stocke les adresses des utilisateurs.
|
|
381
|
-
|
|
382
|
-
```sql
|
|
383
|
-
CREATE TABLE public.user_address (
|
|
384
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
385
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
386
|
-
street TEXT NOT NULL,
|
|
387
|
-
street2 TEXT,
|
|
388
|
-
city TEXT NOT NULL,
|
|
389
|
-
state TEXT,
|
|
390
|
-
postal_code TEXT,
|
|
391
|
-
country TEXT NOT NULL,
|
|
392
|
-
is_default BOOLEAN DEFAULT false,
|
|
393
|
-
address_type TEXT DEFAULT 'billing',
|
|
394
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
395
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
396
|
-
);
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
### Table `user_notifications`
|
|
400
|
-
|
|
401
|
-
Stocke les notifications des utilisateurs.
|
|
402
|
-
|
|
403
|
-
```sql
|
|
404
|
-
CREATE TABLE public.user_notifications (
|
|
405
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
406
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
407
|
-
title TEXT NOT NULL,
|
|
408
|
-
body TEXT,
|
|
409
|
-
type TEXT NOT NULL DEFAULT 'primary',
|
|
410
|
-
read BOOLEAN NOT NULL DEFAULT false,
|
|
411
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
412
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
413
|
-
);
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
## Intégration dans une Application
|
|
417
|
-
|
|
418
|
-
### 1. Installer les dépendances
|
|
88
|
+
## 📦 Installation
|
|
419
89
|
|
|
420
90
|
```bash
|
|
421
|
-
pnpm add
|
|
91
|
+
pnpm lastbrain add-module auth
|
|
92
|
+
pnpm build:modules
|
|
422
93
|
```
|
|
423
94
|
|
|
424
|
-
###
|
|
425
|
-
|
|
426
|
-
Copiez les migrations du module dans votre projet Supabase et appliquez-les :
|
|
95
|
+
### Appliquer les migrations
|
|
427
96
|
|
|
428
97
|
```bash
|
|
429
|
-
|
|
430
|
-
supabase
|
|
98
|
+
cd apps/votre-app
|
|
99
|
+
supabase migration up
|
|
431
100
|
```
|
|
432
101
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
Créez les pages dans votre application Next.js :
|
|
102
|
+
## 💡 Utilisation
|
|
436
103
|
|
|
437
|
-
|
|
438
|
-
// app/auth/dashboard/page.tsx
|
|
439
|
-
import { DashboardPage } from "@lastbrain/module-auth";
|
|
440
|
-
export default DashboardPage;
|
|
104
|
+
<!-- 📝 Section à compléter par l'auteur du module -->
|
|
441
105
|
|
|
442
|
-
|
|
443
|
-
import { ProfilePage } from "@lastbrain/module-auth";
|
|
444
|
-
export default ProfilePage;
|
|
445
|
-
|
|
446
|
-
// app/auth/settings/page.tsx
|
|
447
|
-
import { ReglagePage } from "@lastbrain/module-auth";
|
|
448
|
-
export default ReglagePage;
|
|
449
|
-
|
|
450
|
-
// app/admin/users/page.tsx
|
|
451
|
-
import { AdminUsersPage } from "@lastbrain/module-auth";
|
|
452
|
-
export default AdminUsersPage;
|
|
453
|
-
```
|
|
106
|
+
### Exemple d'utilisation
|
|
454
107
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
// app/api/auth/me/route.ts
|
|
459
|
-
export { GET } from "@lastbrain/module-auth/api/auth/me";
|
|
460
|
-
|
|
461
|
-
// app/api/auth/profile/route.ts
|
|
462
|
-
export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
|
|
463
|
-
|
|
464
|
-
// app/api/admin/users/route.ts
|
|
465
|
-
export { GET } from "@lastbrain/module-auth/api/admin/users";
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
### 5. Configurer les variables d'environnement
|
|
469
|
-
|
|
470
|
-
```env
|
|
471
|
-
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
472
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
## Sécurité
|
|
476
|
-
|
|
477
|
-
### Row Level Security (RLS)
|
|
478
|
-
|
|
479
|
-
Toutes les tables sont protégées par RLS :
|
|
480
|
-
|
|
481
|
-
- Les utilisateurs ne peuvent accéder qu'à leurs propres données
|
|
482
|
-
- Les super admins ont accès à toutes les données
|
|
483
|
-
|
|
484
|
-
### Vérification Super Admin
|
|
485
|
-
|
|
486
|
-
Les routes admin vérifient l'accès super admin via la RPC Supabase :
|
|
487
|
-
|
|
488
|
-
```typescript
|
|
489
|
-
const { data: isSuperAdmin } = await supabase.rpc("is_superadmin", {
|
|
490
|
-
user_id: user.id,
|
|
491
|
-
});
|
|
108
|
+
```tsx
|
|
109
|
+
// Importez les composants depuis le module
|
|
110
|
+
import { SignInPage } from "@lastbrain/module-auth";
|
|
492
111
|
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
}
|
|
112
|
+
// Utilisez-les dans votre application
|
|
113
|
+
<SignInPage />;
|
|
496
114
|
```
|
|
497
115
|
|
|
498
|
-
###
|
|
116
|
+
### Configuration
|
|
499
117
|
|
|
500
|
-
|
|
118
|
+
<!-- Ajoutez ici les détails de configuration spécifiques -->
|
|
501
119
|
|
|
502
|
-
|
|
503
|
-
const {
|
|
504
|
-
data: { user },
|
|
505
|
-
error,
|
|
506
|
-
} = await supabase.auth.getUser();
|
|
507
|
-
|
|
508
|
-
if (error || !user) {
|
|
509
|
-
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
510
|
-
}
|
|
511
|
-
```
|
|
120
|
+
## ⚠️ Danger Zone
|
|
512
121
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
### Build
|
|
122
|
+
La suppression du module supprimera toutes les pages, routes API et migrations associées. **Cette action est irréversible.**
|
|
516
123
|
|
|
517
124
|
```bash
|
|
518
|
-
pnpm
|
|
125
|
+
pnpm lastbrain remove-module auth
|
|
126
|
+
pnpm build:modules
|
|
519
127
|
```
|
|
520
|
-
|
|
521
|
-
### Watch mode
|
|
522
|
-
|
|
523
|
-
```bash
|
|
524
|
-
pnpm dev
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
## Support
|
|
528
|
-
|
|
529
|
-
Pour des questions ou des problèmes, ouvrez une issue sur [GitHub](https://github.com/lastpublication/starter).
|
|
530
|
-
|
|
531
|
-
## Licence
|
|
532
|
-
|
|
533
|
-
MIT
|
package/dist/components/Doc.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/components/Doc.tsx"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,GAAG,4CAyVlB"}
|
package/dist/components/Doc.js
CHANGED
|
@@ -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
|
|
3
|
-
|
|
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 {
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
package/src/components/Doc.tsx
CHANGED
|
@@ -1,129 +1,144 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} from "
|
|
9
|
+
FileText,
|
|
10
|
+
Zap,
|
|
11
|
+
Database,
|
|
12
|
+
Package,
|
|
13
|
+
BookOpen,
|
|
14
|
+
AlertTriangle,
|
|
15
|
+
} from "lucide-react";
|
|
10
16
|
|
|
11
|
-
|
|
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
|
-
<
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
<
|
|
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-
|
|
65
|
+
<CardBody className="space-y-4">
|
|
53
66
|
<div>
|
|
54
|
-
<
|
|
67
|
+
<h3 className="text-lg font-semibold mb-2">Pages Publiques</h3>
|
|
55
68
|
<div className="space-y-2">
|
|
56
|
-
<div className="flex items-
|
|
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
|
-
-
|
|
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-
|
|
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
|
-
-
|
|
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-
|
|
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
|
-
-
|
|
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
|
-
<
|
|
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-
|
|
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">/
|
|
93
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
94
|
-
-
|
|
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-
|
|
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">/
|
|
102
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
103
|
-
-
|
|
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-
|
|
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">/
|
|
111
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
112
|
-
-
|
|
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
|
-
<
|
|
133
|
+
<h3 className="text-lg font-semibold mb-2">Pages Admin</h3>
|
|
119
134
|
<div className="space-y-2">
|
|
120
|
-
<div className="flex items-
|
|
121
|
-
<Chip size="sm" color="
|
|
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">/
|
|
125
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
126
|
-
-
|
|
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
|
-
<
|
|
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-
|
|
140
|
-
<div
|
|
141
|
-
<
|
|
142
|
-
|
|
143
|
-
</
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
|
159
|
-
<
|
|
160
|
-
|
|
161
|
-
</
|
|
162
|
-
<
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
</
|
|
171
|
-
<
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
</
|
|
232
|
+
</div>
|
|
214
233
|
</CardBody>
|
|
215
234
|
</Card>
|
|
216
235
|
|
|
217
|
-
{/* Tables de données */}
|
|
218
236
|
<Card>
|
|
219
237
|
<CardHeader>
|
|
220
|
-
<
|
|
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-
|
|
243
|
+
<CardBody className="space-y-6">
|
|
223
244
|
<TableStructure
|
|
224
245
|
tableName="user_profil"
|
|
225
246
|
title="user_profil"
|
|
226
|
-
description="
|
|
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="
|
|
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="
|
|
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
|
-
<
|
|
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
|
|
248
|
-
<
|
|
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=""
|
|
275
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
252
276
|
pnpm build:modules
|
|
253
277
|
</Snippet>
|
|
254
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
<
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
<
|
|
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-
|
|
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
|
-
<
|
|
288
|
-
<Snippet
|
|
289
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!session) return <p>Non connecté</p>;
|
|
299
|
-
</span>
|
|
300
|
-
<span>
|
|
301
|
-
return <div>Bonjour {"{user.email}"}</div>;
|
|
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 {
|
|
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";
|