@lastbrain/module-auth 0.1.10 → 0.1.13

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,128 @@
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** `/folder` - FolderPage
23
+ - **GET** `/reglage` - ReglagePage
24
+ - **GET** `/profile` - ProfilePage
121
25
 
122
- ```tsx
123
- import { ProfilePage } from "@lastbrain/module-auth";
26
+ ### Pages Admin
124
27
 
125
- export default function Profile() {
126
- return <ProfilePage />;
127
- }
128
- ```
28
+ - **GET** `/users` - AdminUsersPage
129
29
 
130
- #### 3. Paramètres (`/auth/settings`)
30
+ ## 🔌 API Routes
131
31
 
132
- **Component**: `ReglagePage`
32
+ ### `/api/auth/signin`
133
33
 
134
- Page de configuration du compte avec :
34
+ **Méthodes supportées**: GET, POST, PUT, DELETE
135
35
 
136
- - Notifications (email, push, marketing)
137
- - Apparence (thème)
138
- - Langue et région (langue, timezone)
36
+ ### `/api/auth/profile`
139
37
 
140
- **Usage** :
38
+ **Méthodes supportées**: GET, POST, PUT, DELETE
141
39
 
142
- ```tsx
143
- import { ReglagePage } from "@lastbrain/module-auth";
40
+ ### `/api/auth/me`
144
41
 
145
- export default function Settings() {
146
- return <ReglagePage />;
147
- }
148
- ```
42
+ **Méthodes supportées**: GET, POST, PUT, DELETE
149
43
 
150
- ### Pages Publiques
44
+ ### `/api/admin/users`
151
45
 
152
- #### 4. Connexion (`/signin`)
46
+ **Méthodes supportées**: GET, POST, PUT, DELETE
153
47
 
154
- **Component**: `SignInPage`
48
+ ## 🗄️ Base de Données
155
49
 
156
- Page de connexion avec gestion des erreurs et redirection.
50
+ ### Tables
157
51
 
158
- **Usage** :
52
+ #### `user_profil`
159
53
 
160
54
  ```tsx
161
- import { SignInPage } from "@lastbrain/module-auth";
162
-
163
- export default function SignIn() {
164
- return <SignInPage />;
165
- }
55
+ <TableStructure
56
+ tableName="user_profil"
57
+ title="user_profil"
58
+ description="Table user_profil du module auth"
59
+ />
166
60
  ```
167
61
 
168
- #### 5. Inscription (`/signup`)
169
-
170
- **Component**: `SignUpPage`
171
-
172
- Page d'inscription avec validation des champs.
173
-
174
- **Usage** :
62
+ #### `user_address`
175
63
 
176
64
  ```tsx
177
- import { SignUpPage } from "@lastbrain/module-auth";
178
-
179
- export default function SignUp() {
180
- return <SignUpPage />;
181
- }
65
+ <TableStructure
66
+ tableName="user_address"
67
+ title="user_address"
68
+ description="Table user_address du module auth"
69
+ />
182
70
  ```
183
71
 
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** :
72
+ #### `user_notifications`
201
73
 
202
74
  ```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
- }
75
+ <TableStructure
76
+ tableName="user_notifications"
77
+ title="user_notifications"
78
+ description="Table user_notifications du module auth"
79
+ />
243
80
  ```
244
81
 
245
- **Erreurs** :
246
-
247
- - `401` : Utilisateur non authentifié
82
+ ### Migrations
248
83
 
249
- #### GET `/api/auth/profile`
84
+ - `20251112000000_user_init.sql`
85
+ - `20251112000001_auto_profile_and_admin_view.sql`
86
+ - `20251112000002_sync_avatars.sql`
87
+ - `20251124000001_add_get_admin_user_details.sql`
250
88
 
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
89
+ ## 📦 Installation
440
90
 
441
91
  ```bash
442
- pnpm add @lastbrain/module-auth @lastbrain/core @lastbrain/ui
92
+ pnpm lastbrain add-module auth
93
+ pnpm build:modules
443
94
  ```
444
95
 
445
- ### 2. Appliquer les migrations Supabase
446
-
447
- Copiez les migrations du module dans votre projet Supabase et appliquez-les :
96
+ ### Appliquer les migrations
448
97
 
449
98
  ```bash
450
- cp node_modules/@lastbrain/module-auth/supabase/migrations/* supabase/migrations/
451
- supabase db push
99
+ cd apps/votre-app
100
+ supabase migration up
452
101
  ```
453
102
 
454
- ### 3. Créer les pages Next.js
455
-
456
- Créez les pages dans votre application Next.js :
103
+ ## 💡 Utilisation
457
104
 
458
- ```typescript
459
- // app/auth/dashboard/page.tsx
460
- import { DashboardPage } from "@lastbrain/module-auth";
461
- export default DashboardPage;
105
+ <!-- 📝 Section à compléter par l'auteur du module -->
462
106
 
463
- // app/auth/profile/page.tsx
464
- import { ProfilePage } from "@lastbrain/module-auth";
465
- export default ProfilePage;
107
+ ### Exemple d'utilisation
466
108
 
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
- });
109
+ ```tsx
110
+ // Importez les composants depuis le module
111
+ import { SignInPage } from "@lastbrain/module-auth";
513
112
 
514
- if (!isSuperAdmin) {
515
- return NextResponse.json({ error: "Forbidden" }, { status: 403 });
516
- }
113
+ // Utilisez-les dans votre application
114
+ <SignInPage />;
517
115
  ```
518
116
 
519
- ### Authentification
520
-
521
- Les routes API vérifient l'authentification :
117
+ ### Configuration
522
118
 
523
- ```typescript
524
- const {
525
- data: { user },
526
- error,
527
- } = await supabase.auth.getUser();
119
+ <!-- Ajoutez ici les détails de configuration spécifiques -->
528
120
 
529
- if (error || !user) {
530
- return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
531
- }
532
- ```
533
-
534
- ## Développement
121
+ ## ⚠️ Danger Zone
535
122
 
536
- ### Build
123
+ La suppression du module supprimera toutes les pages, routes API et migrations associées. **Cette action est irréversible.**
537
124
 
538
125
  ```bash
539
- pnpm build
540
- ```
541
-
542
- ### Watch mode
543
-
544
- ```bash
545
- pnpm dev
126
+ pnpm lastbrain remove-module auth
127
+ pnpm build:modules
546
128
  ```
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 +1 @@
1
- {"version":3,"file":"auth.build.config.d.ts","sourceRoot":"","sources":["../src/auth.build.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,QAAA,MAAM,eAAe,EAAE,iBAqMtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"auth.build.config.d.ts","sourceRoot":"","sources":["../src/auth.build.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,QAAA,MAAM,eAAe,EAAE,iBA6NtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -21,6 +21,11 @@ const authBuildConfig = {
21
21
  path: "/dashboard",
22
22
  componentExport: "DashboardPage",
23
23
  },
24
+ {
25
+ section: "auth",
26
+ path: "/folder",
27
+ componentExport: "FolderPage",
28
+ },
24
29
  {
25
30
  section: "auth",
26
31
  path: "/reglage",
@@ -136,22 +141,39 @@ const authBuildConfig = {
136
141
  icon: "Users2",
137
142
  path: "/admin/auth/users",
138
143
  order: 1,
144
+ shortcut: "cmd+shift+u",
145
+ shortcutDisplay: "⌘⇧U",
139
146
  },
140
147
  ],
141
- account: [
148
+ auth: [
142
149
  {
143
150
  title: "Tableau de bord",
144
151
  description: "Accédez à votre tableau de bord",
145
152
  icon: "LayoutDashboard",
146
153
  path: "/auth/dashboard",
147
154
  order: 1,
155
+ shortcut: "cmd+shift+d",
156
+ shortcutDisplay: "⌘⇧D",
148
157
  },
158
+ {
159
+ title: "Dossier",
160
+ description: "Accédez à votre dossier personnel",
161
+ icon: "FolderOpen",
162
+ path: "/auth/folder",
163
+ order: 2,
164
+ shortcut: "cmd+shift+f",
165
+ shortcutDisplay: "⌘⇧F",
166
+ },
167
+ ],
168
+ account: [
149
169
  {
150
170
  title: "Mon profil",
151
171
  description: "Gérez vos informations personnelles",
152
172
  icon: "User2",
153
173
  path: "/auth/profile",
154
174
  order: 1,
175
+ shortcut: "cmd+shift+p",
176
+ shortcutDisplay: "⌘⇧P",
155
177
  },
156
178
  {
157
179
  title: "Paramètres",
@@ -159,6 +181,8 @@ const authBuildConfig = {
159
181
  icon: "Settings",
160
182
  path: "/auth/reglage",
161
183
  order: 2,
184
+ shortcut: "cmd+shift+s",
185
+ shortcutDisplay: "⌘⇧S",
162
186
  },
163
187
  {
164
188
  title: "Déconnexion",
@@ -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