@fraza/core 0.3.8 → 0.3.10

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.
Files changed (87) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/THIRD-PARTY-NOTICES.md +2 -2
  3. package/changelog.json +43 -0
  4. package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
  5. package/dist/docs/01-demarrage/01-installation.md +9 -15
  6. package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
  7. package/dist/docs/01-demarrage/03-configuration.md +1 -1
  8. package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
  9. package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
  10. package/dist/docs/02-guides/blocs-personnalises.md +1 -1
  11. package/dist/docs/02-guides/gerer-les-medias.md +1 -1
  12. package/dist/docs/02-guides/index.md +1 -1
  13. package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
  14. package/dist/docs/03-reference/01-cores/templates.md +3 -3
  15. package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
  16. package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
  17. package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
  18. package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
  19. package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
  20. package/dist/docs/04-architecture/05-securite.md +1 -1
  21. package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
  22. package/dist/docs/05-contribution/03-redaction.md +10 -0
  23. package/dist/docs/05-contribution/05-publication.md +0 -1
  24. package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
  25. package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
  26. package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
  27. package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
  28. package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
  29. package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
  30. package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
  31. package/dist/docs/06-modules/booking/index.md +22 -12
  32. package/dist/docs/06-modules/drive/01-installation.md +92 -0
  33. package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
  34. package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
  35. package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
  36. package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
  37. package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
  38. package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
  39. package/dist/docs/06-modules/drive/index.md +22 -12
  40. package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
  41. package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
  42. package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
  43. package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
  44. package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
  45. package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
  46. package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
  47. package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
  48. package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
  49. package/dist/docs/06-modules/facturation/index.md +26 -16
  50. package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
  51. package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +4 -4
  52. package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
  53. package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
  54. package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
  55. package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
  56. package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
  57. package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
  58. package/dist/docs/06-modules/forms/index.md +26 -14
  59. package/dist/docs/06-modules/index.md +2 -2
  60. package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
  61. package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
  62. package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
  63. package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
  64. package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
  65. package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
  66. package/dist/docs/06-modules/medias/index.md +25 -13
  67. package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
  68. package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
  69. package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
  70. package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
  71. package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
  72. package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
  73. package/dist/docs/06-modules/pages/index.md +21 -9
  74. package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
  75. package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
  76. package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
  77. package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
  78. package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
  79. package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
  80. package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
  81. package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
  82. package/dist/docs/06-modules/posts/index.md +25 -13
  83. package/dist/shared/lib/version.js +1 -1
  84. package/package.json +1 -1
  85. package/supported.json +1 -1
  86. package/dist/docs/06-modules/drive/installation.md +0 -69
  87. /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@ Historique des versions publiées de `@fraza/core`.
4
4
 
5
5
  Ce fichier est généré par `fraza-module changelog` à partir des messages de commit. Ne pas le modifier à la main.
6
6
 
7
+ ## 0.3.10 (2026-10-25)
8
+
9
+ ### Autres
10
+
11
+ - Update dependencies, fix vulnerabilities (23dbec5)
12
+
13
+ ## 0.3.9 (2026-10-25)
14
+
15
+ ### Refontes
16
+
17
+ - **docs/06-modules** : reorganize module documentation into numbered files (9c93a28)
18
+
19
+ ### Documentation
20
+
21
+ - reorder and update installation instructions (254c39d)
22
+
7
23
  ## 0.3.8 (2026-10-25)
8
24
 
9
25
  ### Documentation
@@ -19,7 +19,7 @@ Il est généré par `fraza-module notices` à partir de l'arbre réellement ins
19
19
 
20
20
  | Paquet | Version | Licence |
21
21
  |---|---|---|
22
- | `@fraza/icons` | 0.3.10 | MIT |
22
+ | `@fraza/icons` | 0.3.16 | MIT |
23
23
  | `node-cron` | 4.2.1 | ISC |
24
24
  | `pg` | 8.20.0 | MIT |
25
25
  | `pg-cloudflare` | 1.3.0 | MIT |
@@ -146,7 +146,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
146
146
 
147
147
  ## Textes de licence
148
148
 
149
- ### @fraza/icons@0.3.10
149
+ ### @fraza/icons@0.3.16
150
150
 
151
151
  Licence : MIT
152
152
 
package/changelog.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@fraza/core",
3
3
  "versions": [
4
+ {
5
+ "version": "0.3.10",
6
+ "date": "2026-10-25",
7
+ "breaking": [],
8
+ "envAdded": [],
9
+ "envRemoved": [],
10
+ "templateChanged": [],
11
+ "action": [],
12
+ "entries": [
13
+ {
14
+ "type": "Chore",
15
+ "scope": null,
16
+ "subject": "Update dependencies, fix vulnerabilities",
17
+ "hash": "23dbec5",
18
+ "breaking": false
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "version": "0.3.9",
24
+ "date": "2026-10-25",
25
+ "breaking": [],
26
+ "envAdded": [],
27
+ "envRemoved": [],
28
+ "templateChanged": [],
29
+ "action": [],
30
+ "entries": [
31
+ {
32
+ "type": "docs",
33
+ "scope": null,
34
+ "subject": "reorder and update installation instructions",
35
+ "hash": "254c39d",
36
+ "breaking": false
37
+ },
38
+ {
39
+ "type": "refactor",
40
+ "scope": "docs/06-modules",
41
+ "subject": "reorganize module documentation into numbered files",
42
+ "hash": "9c93a28",
43
+ "breaking": false
44
+ }
45
+ ]
46
+ },
4
47
  {
5
48
  "version": "0.3.8",
6
49
  "date": "2026-10-25",
@@ -69,7 +69,7 @@ Le core et les modules gratuits, publiés sous `@fraza/`, relèvent de la licenc
69
69
 
70
70
  ## L'accès
71
71
 
72
- Le core, `@fraza/start` et les modules gratuits, sous le scope `@fraza`, sont publiés sur npmjs et s'installent sans compte ni configuration. Chaque version est aussi publiée sur le registre `https://registry.fraza.ca/`, en copie de secours. Les modules Pro vivent sous le scope `@fraza-pro`, sur ce registre seulement, qui ne les sert qu'avec les identifiants délivrés avec la licence. L'accès est décrit dans [Installation](../01-demarrage/01-installation.md).
72
+ Le core, `@fraza/start` et les modules gratuits, sous le scope `@fraza`, sont publiés sur npmjs et s'installent sans compte ni configuration. Les modules Pro vivent sous le scope `@fraza-pro`, sur le registre `https://registry.fraza.ca/`, qui ne les sert qu'avec les identifiants délivrés avec la licence. L'accès est décrit dans [Installation](../01-demarrage/01-installation.md).
73
73
 
74
74
  ## Étape suivante
75
75
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Installation
3
- description: Configurer le registre Fraza, générer un projet avec npx @fraza/start et initialiser la base.
3
+ description: Générer un projet avec npx @fraza/start, configurer l'environnement et initialiser la base.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
@@ -8,7 +8,7 @@ related:
8
8
  - 01-demarrage/03-configuration
9
9
  ---
10
10
 
11
- Un projet Fraza se génère par une seule commande. Cette page couvre l'accès au registre, la génération et le premier démarrage.
11
+ Un projet Fraza se génère par une seule commande. Le core, `@fraza/start` et les modules gratuits viennent de npmjs, le registre par défaut de npm : il n'y a rien à configurer ni de compte à créer. Cette page couvre la génération et le premier démarrage.
12
12
 
13
13
  ## Prérequis
14
14
 
@@ -17,13 +17,7 @@ Un projet Fraza se génère par une seule commande. Cette page couvre l'accès a
17
17
  - Un compte sur le registre `https://registry.fraza.ca/`, seulement pour les modules Pro.
18
18
  - Un terminal bash, zsh ou PowerShell. Sous Windows, les commandes de cette documentation sont écrites pour PowerShell, pas pour l'invite `cmd.exe`.
19
19
 
20
- ## 1. Le registre
21
-
22
- Rien à configurer. Le core, `@fraza/start` et les modules gratuits sont publiés sur npmjs, le registre par défaut de npm : aucune ligne de configuration ni connexion n'est demandée. Seuls les modules Pro passent par le registre Fraza, avec un compte : voir [Modules Pro](#modules-pro).
23
-
24
- Chaque version gratuite est aussi publiée sur `https://registry.fraza.ca/`, en copie de secours. Si npmjs devient indisponible, voir [Basculer sur le registre de secours](../02-guides/basculer-sur-le-registre-de-secours.md).
25
-
26
- ## 2. Générer le projet
20
+ ## 1. Générer le projet
27
21
 
28
22
  ```bash
29
23
  npx @fraza/start
@@ -37,11 +31,11 @@ La commande enchaîne :
37
31
  2. L'écriture d'un `README.md` au nom du projet et l'ajout des scripts `dev`, `build`, `postinstall` et `audit`. Les trois premiers sont préfixés par `fraza-modules sync`.
38
32
  3. La copie des fichiers de gabarit : `app/`, `components/`, `styles/`, `instrumentation.js`, `theme.js`, `jsconfig.json`. Le `next.config.mjs` de `create-next-app` est conservé, car c'est lui qui branche Tailwind : seul `devIndicators: false` y est ajouté.
39
33
  4. Le `.gitignore` : les règles `.env*` de `create-next-app` restent actives, `!.env.example` rend le modèle à git, et `app/.fraza/` s'ajoute. Le `.npmrc` n'est pas ignoré.
40
- 5. L'écriture du `.npmrc` du projet : les scopes `@fraza` et `@fraza-pro` vers le registre, sans token. Le token ne sert qu'aux modules Pro, et `npx fraza-key` l'ajoute le jour où le projet en installe un.
34
+ 5. L'écriture du `.npmrc` du projet : la ligne de scope `@fraza-pro`, sans token. Elle ne sert qu'aux modules Pro, et `npx fraza-key` y ajoute le token le jour où le projet en installe un.
41
35
  6. L'installation de `@fraza/core`.
42
36
  7. La création de `.env.example`, copie du modèle du package sans aucune valeur secrète, et de `.env.local`, la même copie avec `FRAZA_ENCRYPTION_KEY` générée et `NEXT_PUBLIC_URL` locale. Un fichier qui existe déjà n'est pas remplacé.
43
37
 
44
- ## 3. Configurer l'environnement
38
+ ## 2. Configurer l'environnement
45
39
 
46
40
  Les valeurs de la machine vont dans `.env.local`, que git ignore. Le CLI l'a créé à partir de `node_modules/@fraza/core/.env.example`, avec la clé de chiffrement déjà générée. Il reste à le remplir avant de démarrer.
47
41
 
@@ -55,7 +49,7 @@ FRAZA_DATABASE_URL=postgres://user:password@localhost:5432/mon_projet
55
49
 
56
50
  `.env.example`, lui, est suivi par git et ne porte que des noms de variables et des valeurs sans secret. Il ne se charge pas : il sert de modèle à une nouvelle machine, qui le copie en `.env.local`. Le détail de chaque variable est dans [Configuration](./03-configuration.md), et la règle complète dans [Secrets et git](#secrets-et-git).
57
51
 
58
- ## 4. Initialiser la base
52
+ ## 3. Initialiser la base
59
53
 
60
54
  ```bash
61
55
  npx fraza-db test # vérifier la connexion
@@ -69,7 +63,7 @@ npx fraza-db init # créer les tables
69
63
 
70
64
  La commande est idempotente : la relancer après chaque ajout de module ne casse rien.
71
65
 
72
- ## 5. Démarrer
66
+ ## 4. Démarrer
73
67
 
74
68
  ```bash
75
69
  npm run dev
@@ -92,7 +86,7 @@ npm config set "@fraza-pro:registry" https://registry.fraza.ca/
92
86
  npm login --registry=https://registry.fraza.ca/
93
87
  ```
94
88
 
95
- Le token est déposé dans `~/.npmrc`, le `.npmrc` du dossier personnel : `%USERPROFILE%\.npmrc` sous Windows. Il est lié à l'hôte du registre, pas au scope : la même ligne sert à `@fraza-pro`, et à `@fraza` pour un projet passé sur le registre de secours. Il n'expire pas dans le temps : il cesse de fonctionner seulement si le secret du serveur change, si le mot de passe est modifié, ou si le compte est révoqué.
89
+ Le token est déposé dans `~/.npmrc`, le `.npmrc` du dossier personnel : `%USERPROFILE%\.npmrc` sous Windows. Il n'expire pas dans le temps : il cesse de fonctionner seulement si le secret du serveur change, si le mot de passe est modifié, ou si le compte est révoqué.
96
90
 
97
91
  Écrire ensuite le token dans le `.npmrc` du projet. La commande se relance après chaque nouveau `npm login` :
98
92
 
@@ -126,7 +120,7 @@ Le `.npmrc`, lui, reste suivi par git. Il pointe le scope `@fraza-pro` vers `htt
126
120
 
127
121
  | Symptôme | Cause probable |
128
122
  |---|---|
129
- | `404 Not Found - @fraza/core` à l'installation | Une ligne `@fraza:registry` du `.npmrc` du projet ou de `~/.npmrc` pointe vers un registre qui n'a pas le paquet. La retirer pour revenir à npmjs, ou la pointer vers `https://registry.fraza.ca/`. |
123
+ | `404 Not Found - @fraza/core` à l'installation | Une ligne `@fraza:registry` du `.npmrc` du projet ou de `~/.npmrc` pointe vers un registre qui n'a pas le paquet. La retirer pour revenir à npmjs. |
130
124
  | npmjs injoignable, ou `@fraza/core` retiré de npmjs | Voir [Basculer sur le registre de secours](../02-guides/basculer-sur-le-registre-de-secours.md). |
131
125
  | `401` ou `404` sur un `@fraza-pro/module-*` | Ligne `@fraza-pro:registry` ou token absent du `.npmrc`. Voir [Modules Pro](#modules-pro) : `npm login` puis `npx fraza-key`. |
132
126
  | `FRAZA_DATABASE_URL is not defined` | `.env.local` non rempli, ou variable absente de la plateforme en production. |
@@ -78,7 +78,7 @@ npm run dev
78
78
 
79
79
  Une section **Pages** apparaît dans la barre latérale. Ouvrir `/admin/pages`, créer une page, lui donner un titre et un slug, ajouter quelques blocs, la passer en visible, enregistrer. L'URL publique complète est affichée sous le champ slug, et le bouton de lien de la liste l'ouvre dans un nouvel onglet.
80
80
 
81
- La page est en ligne. Le détail de l'écran est dans [Administration du module Pages](../06-modules/pages/admin.md), et les variantes d'installation dans [Installation](../06-modules/pages/installation.md).
81
+ La page est en ligne. Le détail de l'écran est dans [Administration du module Pages](../06-modules/pages/03-admin.md), et les variantes d'installation dans [Installation](../06-modules/pages/01-installation.md).
82
82
 
83
83
  ## Ce qui vient de se passer
84
84
 
@@ -168,7 +168,7 @@ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
168
168
  STRIPE_WEBHOOK_SECRET=whsec_…
169
169
  ```
170
170
 
171
- Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement, sans le SDK Stripe. `STRIPE_WEBHOOK_SECRET` suffit à l'activer : sans lui, la route répond 404. Les appels sortants vers Stripe (sessions de paiement, remboursements) appartiennent au module qui encaisse, avec son propre SDK. Le module de [facturation](../06-modules/facturation/configuration.md) demande aussi `STRIPE_SECRET_KEY`.
171
+ Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement, sans le SDK Stripe. `STRIPE_WEBHOOK_SECRET` suffit à l'activer : sans lui, la route répond 404. Les appels sortants vers Stripe (sessions de paiement, remboursements) appartiennent au module qui encaisse, avec son propre SDK. Le module de [facturation](../06-modules/facturation/02-configuration.md) demande aussi `STRIPE_SECRET_KEY`.
172
172
 
173
173
  ### Récupérer la clé secrète
174
174
 
@@ -8,7 +8,7 @@ related:
8
8
  - 03-reference/01-cores/api
9
9
  ---
10
10
 
11
- Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement. Les appels vers Stripe, eux, passent par le SDK officiel, que le projet installe. Ce guide couvre le parcours complet d'un paiement unique par Checkout, le plus court chemin vers un encaissement fiable. Le module de [facturation](../06-modules/facturation/paiements.md) fait déjà tout cela pour les factures.
11
+ Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement. Les appels vers Stripe, eux, passent par le SDK officiel, que le projet installe. Ce guide couvre le parcours complet d'un paiement unique par Checkout, le plus court chemin vers un encaissement fiable. Le module de [facturation](../06-modules/facturation/05-paiements.md) fait déjà tout cela pour les factures.
12
12
 
13
13
  ## Configuration
14
14
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Basculer sur le registre de secours
3
- description: Installer @fraza/* depuis registry.fraza.ca quand npmjs est indisponible, puis revenir à npmjs.
3
+ description: Installer @fraza/* depuis registry.fraza.ca quand npmjs est indisponible ou par choix, puis revenir à npmjs.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
@@ -8,11 +8,11 @@ related:
8
8
  - 02-guides/mettre-a-jour-un-projet
9
9
  ---
10
10
 
11
- Ce guide s'adresse à qui doit installer ou déployer un projet Fraza pendant que npmjs ne sert plus les paquets `@fraza/*` : panne de npmjs, ou paquet retiré de npmjs.
11
+ Un projet installe `@fraza/*` depuis npmjs par défaut. Ce guide s'adresse à qui veut l'installer depuis le registre Fraza à la place : en urgence, pendant que npmjs ne sert plus les paquets (panne de npmjs, paquet retiré de npmjs), ou par choix.
12
12
 
13
13
  ## Pourquoi c'est possible
14
14
 
15
- Le core, `@fraza/start` et les modules gratuits sont publiés sur npmjs, d'où un projet les installe par défaut. Chaque version publiée sur npmjs l'est aussi sur `https://registry.fraza.ca/`, en copie de secours, en lecture libre. Ce registre porte en plus des versions intermédiaires, publiées pour tester un changement, qui ne vont pas sur npmjs.
15
+ Chaque version de `@fraza/*` publiée sur npmjs l'est aussi sur `https://registry.fraza.ca/`, en copie de secours, en lecture libre. Ce registre porte en plus des versions intermédiaires, publiées pour tester un changement, qui ne vont pas sur npmjs.
16
16
 
17
17
  Les deux registres reçoivent le même fichier, octet pour octet : la commande de publication construit un seul tarball et l'envoie aux deux. Le `package-lock.json` vérifie l'empreinte (`integrity`) de chaque paquet installé. Comme l'empreinte est la même sur les deux registres, le lockfile reste valable après la bascule.
18
18
 
@@ -73,7 +73,7 @@ Champs disponibles : `TextField`, `TextareaField`, `NumberField`, `SelectField`,
73
73
 
74
74
  `IconField` propose tout le jeu `@fraza/icons` et stocke le nom choisi. Le rendu du bloc l'affiche avec `<Icon name={item.icon} />` de `@fraza/core/shared/components/Icon`, qui ne charge que cette icône. Aucune liste à tenir dans le projet. Voir [Sélecteur d'icône d'un bloc](../03-reference/04-partage/icones.md#sélecteur-dicône-dun-bloc).
75
75
 
76
- `ImageField` passe par le sélecteur de [`@fraza/module-medias`](../06-modules/medias/index.md) et se masque quand le module est absent. Voir [Intégrer les médias](../06-modules/medias/integration.md).
76
+ `ImageField` passe par le sélecteur de [`@fraza/module-medias`](../06-modules/medias/index.md) et se masque quand le module est absent. Voir [Intégrer les médias](../06-modules/medias/05-integration.md).
77
77
 
78
78
  ### `render.js`
79
79
 
@@ -24,7 +24,7 @@ npm install @fraza/module-medias
24
24
  FRAZA_MODULE_MEDIAS=true
25
25
  ```
26
26
 
27
- Le détail de l'installation, dont la route de fichier à monter dans le projet, est dans [Installer le module Médias](../06-modules/medias/installation.md).
27
+ Le détail de l'installation, dont la route de fichier à monter dans le projet, est dans [Installer le module Médias](../06-modules/medias/01-installation.md).
28
28
 
29
29
  ```bash
30
30
  npx fraza-db init
@@ -56,6 +56,6 @@ Pour savoir lesquels vont ensemble, et dans quel ordre, [Que peut-on construire]
56
56
 
57
57
  | Guide | Besoin |
58
58
  |---|---|
59
- | [Basculer sur le registre de secours](./basculer-sur-le-registre-de-secours.md) | Installer `@fraza/*` depuis le registre Fraza quand npmjs est indisponible. |
59
+ | [Basculer sur le registre de secours](./basculer-sur-le-registre-de-secours.md) | Installer `@fraza/*` depuis le registre Fraza quand npmjs est indisponible, ou par choix. |
60
60
 
61
61
  Pour le détail d'une signature ou d'une option, voir la [Référence](../03-reference/index.md).
@@ -129,7 +129,7 @@ Un contenu dont la zone SEO est vide n'a pas de raison de sortir sans descriptio
129
129
 
130
130
  Passez ces deux valeurs aux quatre endroits de ce guide, pas seulement au rendu : `SeoFields` les affiche en filigrane, `SeoScoreBadge` et `computeSeoScore` les comptent dans le score. Sans cela l'éditeur signale une description manquante alors que la page publique en émet une.
131
131
 
132
- `@fraza/module-posts` en donne un exemple complet : il dérive la description d'un champ `text` ou `editor` et l'image d'un champ `thumbnail` ou `image`, avec un drapeau de configuration pour désigner explicitement la source. Voir [Repli SEO automatique](../06-modules/posts/types-et-champs.md#repli-seo-automatique).
132
+ `@fraza/module-posts` en donne un exemple complet : il dérive la description d'un champ `text` ou `editor` et l'image d'un champ `thumbnail` ou `image`, avec un drapeau de configuration pour désigner explicitement la source. Voir [Repli SEO automatique](../06-modules/posts/03-types-et-champs.md#repli-seo-automatique).
133
133
 
134
134
  ## Tokens
135
135
 
@@ -22,7 +22,7 @@ Registre **purement serveur**. Voir les notes pour la raison : ce n'est pas un o
22
22
 
23
23
  ## Qui alimente le registre
24
24
 
25
- 1. Le projet hôte dépose un fichier dans `components/fraza/templates/<id>.js` exportant `meta` et un composant par défaut. Le CLI `fraza-modules sync` génère le manifeste `app/.fraza/templates.server.js` qui appelle `registerTemplate` au boot. C'est de là que vient le template `default` de [`@fraza/module-pages`](../../06-modules/pages/templates.md), qui n'en enregistre aucun lui-même. [`@fraza/module-posts`](../../06-modules/posts/templates.md) en enregistre un par type déclaré, que le projet remplace en reprenant le même identifiant : le manifeste enregistre les templates du projet avec `override: true`.
25
+ 1. Le projet hôte dépose un fichier dans `components/fraza/templates/<id>.js` exportant `meta` et un composant par défaut. Le CLI `fraza-modules sync` génère le manifeste `app/.fraza/templates.server.js` qui appelle `registerTemplate` au boot. C'est de là que vient le template `default` de [`@fraza/module-pages`](../../06-modules/pages/05-templates.md), qui n'en enregistre aucun lui-même. [`@fraza/module-posts`](../../06-modules/posts/07-templates.md) en enregistre un par type déclaré, que le projet remplace en reprenant le même identifiant : le manifeste enregistre les templates du projet avec `override: true`.
26
26
  2. Un module peut enregistrer un template à l'exécution via l'API impérative, quand l'identifiant dépend d'une condition inconnue au build.
27
27
 
28
28
  ## API
@@ -63,8 +63,8 @@ Le registre est agnostique : ce sont les modules qui décident des props passée
63
63
 
64
64
  | `kind` | Props |
65
65
  |---|---|
66
- | `'page'` | `{ page, blocks, url, breadcrumb }`. Voir [Templates de page](../../06-modules/pages/templates.md). |
67
- | `'post'` | `{ post, blocks, url, breadcrumb }`. Voir [Templates de post](../../06-modules/posts/templates.md). |
66
+ | `'page'` | `{ page, blocks, url, breadcrumb }`. Voir [Templates de page](../../06-modules/pages/05-templates.md). |
67
+ | `'post'` | `{ post, blocks, url, breadcrumb }`. Voir [Templates de post](../../06-modules/posts/07-templates.md). |
68
68
 
69
69
  Le template est **responsable du rendu des blocs**. Il importe son propre `<Content>` depuis `components/fraza/templates/content.js` et l'utilise avec `<Content blocks={blocks} />`. Aucun `children` n'est injecté implicitement : le template a la main complète sur sa JSX.
70
70
 
@@ -10,7 +10,7 @@ related:
10
10
 
11
11
  Le gestionnaire de médias est distribué comme un module externe, [`@fraza/module-medias`](../../06-modules/medias/index.md). Le core ne dépend pas de ce package : il fournit un **registre** que le module remplit au runtime.
12
12
 
13
- Un module tiers peut donc téléverser un fichier et attacher des médias à son contenu sans déclarer `@fraza/module-medias` en dépendance, et sans conditionner ses appels. Le mode d'emploi côté consommateur est dans [Intégrer les médias](../../06-modules/medias/integration.md).
13
+ Un module tiers peut donc téléverser un fichier et attacher des médias à son contenu sans déclarer `@fraza/module-medias` en dépendance, et sans conditionner ses appels. Le mode d'emploi côté consommateur est dans [Intégrer les médias](../../06-modules/medias/05-integration.md).
14
14
 
15
15
  Quand le module est absent ou désactivé (`FRAZA_MODULE_MEDIAS` différent de `true`), les façades restent appelables et se comportent de façon **neutre** : les lectures retournent vide, les écritures retournent un échec explicite, `getMediaPicker()` retourne `null`. Le code consommateur reste naïf.
16
16
 
@@ -72,7 +72,7 @@ Chaque façade transmet ses arguments au module tels quels. `client` y désigne
72
72
 
73
73
  La taille enregistrée d'un fichier est celle des octets stockés, après optimisation : un ancien paramètre `size` d'`uploadMedia` ou de `replaceMedia` est ignoré.
74
74
 
75
- Le détail du comportement de chaque écriture, avec le module actif, est dans [Téléversement](../../06-modules/medias/televersement.md) et [API](../../06-modules/medias/api.md).
75
+ Le détail du comportement de chaque écriture, avec le module actif, est dans [Téléversement](../../06-modules/medias/03-televersement.md) et [API](../../06-modules/medias/07-api.md).
76
76
 
77
77
  ```js
78
78
  import { attachMedia, detachAllForSource } from '@fraza/core/media-registry';
@@ -119,7 +119,7 @@ const url = buildMediaUrl(result.media);
119
119
 
120
120
  `uploadedBy` est optionnel. Omis, la colonne `uploaded_by` reste nulle et la médiathèque n'affiche aucun auteur, ce qui est exact pour un dépôt machine. La colonne porte une clé étrangère vers la table des utilisateurs : seul un identifiant réel, ou rien, est accepté. Un identifiant inventé fait échouer l'enregistrement.
121
121
 
122
- Les formats, les tailles et les validations sont les mêmes que pour un téléversement depuis l'interface : la règle vit dans la fonction, pas dans la route. Voir [Téléversement](../../06-modules/medias/televersement.md).
122
+ Les formats, les tailles et les validations sont les mêmes que pour un téléversement depuis l'interface : la règle vit dans la fonction, pas dans la route. Voir [Téléversement](../../06-modules/medias/03-televersement.md).
123
123
 
124
124
  `deleteMedia` refuse un média encore référencé. Interroger `countReferences` avant, ou lire le champ `referenceCount` de l'échec.
125
125
 
@@ -167,7 +167,7 @@ Vérifier `isMediaPickerAvailable()` **avant** de rendre : `getMediaPicker()` re
167
167
  | `initialSelected` | Tableau de médias déjà retenus, affichés cochés à l'ouverture. Mode multiple. |
168
168
  | `title` | Titre de la fenêtre. |
169
169
 
170
- En mode multiple, la sélection retient les objets média et survit donc à la pagination et aux filtres, `onSelect` rend le tableau dans l'ordre où la sélection a été constituée, et le téléversement accepte plusieurs fichiers. Voir [Intégrer les médias](../../06-modules/medias/integration.md).
170
+ En mode multiple, la sélection retient les objets média et survit donc à la pagination et aux filtres, `onSelect` rend le tableau dans l'ordre où la sélection a été constituée, et le téléversement accepte plusieurs fichiers. Voir [Intégrer les médias](../../06-modules/medias/05-integration.md).
171
171
 
172
172
  ## Route fichier
173
173
 
@@ -74,7 +74,7 @@ Le registre Fraza tourne sous Verdaccio, qui ne sert pas la route de `npm access
74
74
 
75
75
  ## Basculer sur le registre de secours
76
76
 
77
- `secours` et `npmjs` changent le registre d'où le projet installe `@fraza/*`, pour une panne de npmjs ou un paquet retiré de npmjs. Ils écrivent le `.npmrc` et réécrivent l'hôte des adresses `@fraza/*` du `package-lock.json` : sans cette réécriture, `npm ci` retournerait chercher les paquets sur l'hôte d'origine. Lancer ensuite `npm install`, puis committer les deux fichiers. Voir [Basculer sur le registre de secours](../../02-guides/basculer-sur-le-registre-de-secours.md).
77
+ `secours` et `npmjs` changent le registre d'où le projet installe `@fraza/*`, pour une panne de npmjs, un paquet retiré de npmjs, ou par choix. Ils écrivent le `.npmrc` et réécrivent l'hôte des adresses `@fraza/*` du `package-lock.json` : sans cette réécriture, `npm ci` retournerait chercher les paquets sur l'hôte d'origine. Lancer ensuite `npm install`, puis committer les deux fichiers. Voir [Basculer sur le registre de secours](../../02-guides/basculer-sur-le-registre-de-secours.md).
78
78
 
79
79
  ## Quand la lancer
80
80
 
@@ -32,7 +32,7 @@ Trois informations distinctes qu'un simple champ `peerDependencies` ne porte pas
32
32
  "node": { "floor": "20.12.0", "range": ">=20.12.0", "tested": "22.0.0" }
33
33
  },
34
34
  "packages": {
35
- "next": { "floor": "16.0.0", "range": ">=16.0.0 <17.0.0", "tested": "16.3.8" },
35
+ "next": { "floor": "16.0.0", "range": ">=16.0.0 <17.0.0", "tested": "16.4.3" },
36
36
  "sharp": { "floor": "0.35.0", "range": ">=0.35.0 <1.0.0", "tested": "0.35.5",
37
37
  "requiredBy": ["@fraza/module-medias"] }
38
38
  }
@@ -142,7 +142,7 @@ Les variables `FRAZA_EMAIL_FROM_*` et `FRAZA_EMAIL_LOGO*` servent les deux fourn
142
142
  |---|---|---|---|
143
143
  | `STRIPE_WEBHOOK_SECRET` | — | `core/payments` | Secret de signature de l'endpoint de webhook (`whsec_…`). Sans lui, la route répond 404. |
144
144
 
145
- Le core ne garde de Stripe que l'endpoint de webhook, et il vérifie la signature sans le SDK. `STRIPE_SECRET_KEY` appartient au module qui appelle Stripe, la [facturation](../../06-modules/facturation/configuration.md) par exemple, et se déclare dans son manifeste.
145
+ Le core ne garde de Stripe que l'endpoint de webhook, et il vérifie la signature sans le SDK. `STRIPE_SECRET_KEY` appartient au module qui appelle Stripe, la [facturation](../../06-modules/facturation/02-configuration.md) par exemple, et se déclare dans son manifeste.
146
146
 
147
147
  ## Authentification
148
148
 
@@ -208,7 +208,7 @@ La tuile `update` du tableau de bord lit la même variable, mais elle n'a aucune
208
208
 
209
209
  ## Variables d'un module
210
210
 
211
- Chaque module, `@fraza/module-*` ou `@fraza-pro/module-*`, déclare ses propres variables dans `manifest.envVars`. Leur effet est documenté module par module : [Pages](../../06-modules/pages/configuration.md), [Posts](../../06-modules/posts/configuration.md), [Médias](../../06-modules/medias/configuration.md), [Formulaires](../../06-modules/forms/configuration.md), [Facturation](../../06-modules/facturation/configuration.md), [Fichiers](../../06-modules/drive/configuration.md), [Rendez-vous](../../06-modules/booking/configuration.md). Une variable `required: true` absente produit un avertissement au boot, sans faire tomber le serveur : le module gère son propre repli. `fraza-doctor`, lui, la signale comme bloquante ; il reste muet sur les optionnelles absentes, dont la valeur par défaut suffit.
211
+ Chaque module, `@fraza/module-*` ou `@fraza-pro/module-*`, déclare ses propres variables dans `manifest.envVars`. Leur effet est documenté module par module : [Pages](../../06-modules/pages/02-configuration.md), [Posts](../../06-modules/posts/02-configuration.md), [Médias](../../06-modules/medias/02-configuration.md), [Formulaires](../../06-modules/forms/02-configuration.md), [Facturation](../../06-modules/facturation/02-configuration.md), [Fichiers](../../06-modules/drive/02-configuration.md), [Rendez-vous](../../06-modules/booking/02-configuration.md). Une variable `required: true` absente produit un avertissement au boot, sans faire tomber le serveur : le module gère son propre repli. `fraza-doctor`, lui, la signale comme bloquante ; il reste muet sur les optionnelles absentes, dont la valeur par défaut suffit.
212
212
 
213
213
  Un module porte en plus une variable d'activation de la forme `FRAZA_MODULE_<NOM>`, où `<NOM>` est le nom du paquet sans son préfixe : `@fraza-pro/module-billing` s'active par `FRAZA_MODULE_BILLING`. Installé mais non activé, il n'enregistre rien.
214
214
 
@@ -88,7 +88,7 @@ Deux raisons.
88
88
 
89
89
  **Échec silencieux en production.** S'appeler via l'URL publique ressort sur le reverse proxy ou le WAF, qui bloque ou réécrit ces requêtes serveur à serveur. La réponse n'est pas le JSON attendu, le code fait `if (!res.ok) return []`, et la section disparaît sans erreur, alors qu'elle s'affichait en développement.
90
90
 
91
- **À la place, lire la donnée directement côté serveur** via les helpers `./public` que chaque module de contenu expose : [`getPublicPosts`, `getPublicPostBySlug`, `getPublicTaxonomyTerms`](../06-modules/posts/api.md) pour `@fraza/module-posts`, [`listPublicChildPages`, `getPublishedPageBySegments`](../06-modules/pages/api.md) pour `@fraza/module-pages`.
91
+ **À la place, lire la donnée directement côté serveur** via les helpers `./public` que chaque module de contenu expose : [`getPublicPosts`, `getPublicPostBySlug`, `getPublicTaxonomyTerms`](../06-modules/posts/08-api.md) pour `@fraza/module-posts`, [`listPublicChildPages`, `getPublishedPageBySegments`](../06-modules/pages/06-api.md) pour `@fraza/module-pages`.
92
92
 
93
93
  Les routes HTTP restent réservées aux clients navigateur et à l'admin.
94
94
 
@@ -156,7 +156,7 @@ Deux limites à connaître avant d'en ajouter une :
156
156
 
157
157
  L'ordre compte : la deuxième ligne couvre la grande majorité des alertes d'un site Fraza. Next tire `postcss`, `nanoid`, `sharp` et tout le reste de leur arbre, si bien qu'un `npm update next` règle d'un coup la plupart des alertes remontées par `npm audit`. La cible de cette montée est le champ `tested` de [`supported.json`](../03-reference/06-configuration/paquets-supportes.md) : c'est lui que `fraza-doctor` affiche dans son remède.
158
158
 
159
- **Un `package-lock.json` figé est le risque, pas l'exception.** Next lui-même est régulièrement l'objet d'avis de sécurité : la ligne `16.0.0` à `16.3.2` portait deux exécutions de code à distance non authentifiées, et le `sharp` embarqué traînait une faille `libheif` sous `0.35.4`, puis une faille `librsvg` sous `0.35.5`. Un site qui n'a pas rafraîchi son verrou depuis sa création reste exposé même si son `package.json` autorise déjà la version corrigée.
159
+ **Un `package-lock.json` figé est le risque, pas l'exception.** Next lui-même est régulièrement l'objet d'avis de sécurité : la ligne `16.0.0` à `16.3.2` portait deux exécutions de code à distance non authentifiées, la ligne `16.0.0` à `16.4.0` deux autres, corrigées en `16.4.1`, et le `sharp` embarqué traînait une faille `libheif` sous `0.35.4`, puis une faille `librsvg` sous `0.35.5`. Un site qui n'a pas rafraîchi son verrou depuis sa création reste exposé même si son `package.json` autorise déjà la version corrigée.
160
160
 
161
161
  ## Signaler une faille
162
162
 
@@ -77,7 +77,7 @@ L'inverse est permis : un module Pro dépend du core et peut s'appuyer sur les m
77
77
 
78
78
  ## Distribution par le registre
79
79
 
80
- Les paquets sont distribués sous deux scopes. Les paquets Fraza Libre, sous `@fraza`, sont publiés sur npmjs, d'où ils s'installent sans connexion, et sur `registry.fraza.ca` en copie de secours. Les paquets Pro, sous `@fraza-pro`, ne sont publiés que sur `registry.fraza.ca`, et demandent des identifiants nominatifs délivrés par HYKO. Pour eux, le registre est la vraie barrière : sans ces identifiants, le paquet n'est pas installable. L'administration des comptes et des droits est décrite dans [Registre Verdaccio](../05-contribution/06-registre-verdaccio.md).
80
+ Les paquets sont distribués sous deux scopes. Les paquets Fraza Libre, sous `@fraza`, sont publiés sur npmjs, d'où ils s'installent sans connexion. Les paquets Pro, sous `@fraza-pro`, ne sont publiés que sur `registry.fraza.ca`, et demandent des identifiants nominatifs délivrés par HYKO. Pour eux, le registre est la vraie barrière : sans ces identifiants, le paquet n'est pas installable. L'administration des comptes et des droits est décrite dans [Registre Verdaccio](../05-contribution/06-registre-verdaccio.md).
81
81
 
82
82
  Un contrat n'empêche rien techniquement. Il ouvre un recours après la violation, à condition de pouvoir la prouver. Le contrat Pro donne ce recours, le registre empêche l'installation sans droit.
83
83
 
@@ -130,6 +130,16 @@ Uniforme sur toute la section `03-reference/` :
130
130
  4. `## Variables d'environnement`, le cas échéant.
131
131
  5. `## Notes` : pièges et frontières, à la fin.
132
132
 
133
+ ### Structure d'une section de module
134
+
135
+ Uniforme sur toute la section `06-modules/`, pour que la commande d'installation se trouve au même endroit d'un module à l'autre :
136
+
137
+ 1. `index.md` : une phrase de présentation, le bloc `npm i <paquet>`, puis le tableau Paquet, Licence, Registre et Activation, suivi d'un renvoi à Installation. Viennent ensuite la capture, `## Pages de cette section` et `## Ce que le module apporte`.
138
+ 2. Les pages portent un préfixe numérique dans l'ordre du tableau « Pages de cette section », `01-installation.md` en tête. Le site de documentation retire le préfixe de l'URL et s'en sert pour ordonner la barre latérale.
139
+ 3. `01-installation.md` : une phrase, `## Prérequis`, puis `## Installer`, qui enchaîne le paquet, la variable d'activation, `fraza-modules sync` et `fraza-db init`. Viennent ensuite les étapes propres au module, puis `## Vérifier`, `## Mettre à jour` et `## Notes`.
140
+
141
+ Une variable d'environnement montrée dans une page de module va dans un bloc `dotenv`, jamais dans un bloc `bash`.
142
+
133
143
  ### Blocs de commandes
134
144
 
135
145
  Une commande documentée se copie et s'exécute telle quelle dans **bash, zsh et PowerShell**, y compris PowerShell 5.1, celui que Windows livre par défaut. L'invite `cmd.exe` n'est pas une cible : elle ne connaît pas les commentaires `#`, que les blocs utilisent.
@@ -165,7 +165,6 @@ Un `@fraza/module-*` suit la même procédure et les mêmes registres. Un module
165
165
  - Le champ `files` ne publie que `dist`, `LICENSE`, `THIRD-PARTY-NOTICES.md`, `CHANGELOG.md` et `changelog.json`. `README.md` est ajouté par npm quel que soit le champ, et le core y ajoute `.env.example`. `fraza-module release-check` refuse un paquet dont les notes de version manquent ou ne sont pas déclarées dans `files` : sans elles, `fraza-update` ne peut rien annoncer. Chaque module porte son propre exemplaire des deux fichiers légaux : voir [Licence et propriété](../04-architecture/07-licence-et-propriete.md).
166
166
  - Avant publication, vérifier que `dist/` ne contient aucune syntaxe JSX brute. Voir [Créer un module](../02-guides/creer-un-module.md#build-avant-publication).
167
167
  - La documentation d'usage du module vit dans [`docs/06-modules/`](../06-modules/index.md) du core, pas dans le dépôt du module. La mettre à jour **et la publier avant** de publier le module : sinon un projet installe un module dont la documentation décrit la version précédente.
168
- - Mettre à jour la version indiquée en tête de `docs/06-modules/<module>/index.md`.
169
168
 
170
169
  ## Administration du registre
171
170
 
@@ -4,20 +4,18 @@ description: Installer @fraza-pro/module-booking, créer les tables, poser l'hor
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/booking/configuration
8
- - 06-modules/booking/reservation-en-ligne
7
+ - 06-modules/booking/02-configuration
8
+ - 06-modules/booking/04-reservation-en-ligne
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza-pro/module-booking` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
-
13
- Ce module est distribué sous la licence Fraza Pro : son utilisation en production demande une licence par projet, renouvelée chaque année, qui comprend les mises à jour, la conformité et le support. Voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md).
11
+ Cette page installe `@fraza-pro/module-booking` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md). Son utilisation en production demande une licence Fraza Pro : voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md).
14
12
 
15
13
  ## Prérequis
16
14
 
17
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Le token du registre Fraza dans le `.npmrc` du projet, sans lequel `npm i` échoue : `npm login --registry=https://registry.fraza.ca/`, puis `npx fraza-key`. Voir [Modules Pro](../../01-demarrage/01-installation.md#modules-pro).
18
17
  - `NEXT_PUBLIC_URL` renseignée, sinon toute réservation en ligne est rejetée par la vérification d'origine du core.
19
18
  - La configuration courriel du core, Resend ou SMTP, pour les confirmations et les rappels.
20
- - La ligne `@fraza-pro:registry=https://registry.fraza.ca/` et le token du registre dans le `.npmrc` du projet, sans lesquels `npm i` échoue. `npx @fraza/start` écrit déjà la ligne de portée. Le token s'obtient avec `npm login --registry=https://registry.fraza.ca/`, puis `npx fraza-key` le reprend dans le projet. Voir [`fraza-key`](../../03-reference/05-cli/fraza-key.md).
21
19
 
22
20
  ## Installer
23
21
 
@@ -27,29 +25,25 @@ npm i @fraza-pro/module-booking
27
25
 
28
26
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
29
27
 
30
- ```bash
28
+ ```dotenv
31
29
  #------ MODULE - BOOKING ------#
32
30
  FRAZA_MODULE_BOOKING=true
33
31
  ```
34
32
 
35
33
  Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin.
36
34
 
37
- Régénérer les manifestes puis créer les tables :
35
+ Régénérer les manifestes, puis créer les tables :
38
36
 
39
37
  ```bash
40
38
  npx fraza-modules sync # déclenché automatiquement au postinstall
41
39
  npx fraza-db init # crée les dix tables fraza_booking_*
42
40
  ```
43
41
 
44
- Sur une base existante, `npx fraza-db migrate` suffit.
42
+ `fraza-db init` est idempotent : sur une base qui a déjà les tables, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les permissions du module, et les attribue au rôle `admin`. Voir [Modèle de données](./06-modele-de-donnees.md).
45
43
 
46
44
  ## Version du core
47
45
 
48
- Le module fonctionne avec la dernière version de `@fraza/core` : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Installer la dernière version de tous les paquets Fraza du site, toutes à la fois :
49
-
50
- ```bash
51
- npx fraza-update
52
- ```
46
+ Le module suit la dernière version de `@fraza/core` : tous les paquets Fraza à leur dernière version fonctionnent ensemble, et `npx fraza-update` les met à jour ensemble.
53
47
 
54
48
  Un core en retard échoue sans bruit. Il ne dériverait pas `FRAZA_MODULE_BOOKING` du nom du paquet, et le module resterait désactivé, sans erreur. Il lui manquerait aussi trois briques :
55
49
 
@@ -57,7 +51,7 @@ Un core en retard échoue sans bruit. Il ne dériverait pas `FRAZA_MODULE_BOOKIN
57
51
  - [`registerAdminIcons`](../../03-reference/04-partage/icones.md#registeradminicons), qui enregistre les icônes de la section et de ses items, et sans lequel le point d'entrée client du module échoue au chargement ;
58
52
  - les fonctions de fuseau horaire de [`shared/dates`](../../03-reference/04-partage/dates.md#fuseaux-horaires), sans lesquelles les créneaux glissent d'une heure deux fois par an.
59
53
 
60
- Aucune de ces absences ne lève d'erreur claire à l'usage, d'où le plancher explicite.
54
+ Aucune de ces absences ne lève d'erreur claire à l'usage : garder le core à jour avec le module.
61
55
 
62
56
  ## Premier réglage, dans l'ordre
63
57
 
@@ -70,9 +64,9 @@ Les trois premières étapes se font dans la page Options, un onglet chacune. L'
70
64
 
71
65
  ## Ouvrir la prise de rendez-vous en ligne
72
66
 
73
- Elle est fermée par défaut. Deux gestes :
67
+ Elle est fermée par défaut. Deux gestes : la variable, dans `.env.local` et dans les variables de la plateforme en production,
74
68
 
75
- ```bash
69
+ ```dotenv
76
70
  FRAZA_MODULE_BOOKING_ONLINE=true
77
71
  ```
78
72
 
@@ -82,8 +76,29 @@ Tant que la variable est à false, un lien parfaitement configuré répond 404,
82
76
 
83
77
  ## Vérifier
84
78
 
79
+ 1. La connexion à la base répond :
80
+ ```bash
81
+ npx fraza-db test
82
+ ```
83
+ 2. `Rendez-vous` apparaît dans la barre latérale de l'admin.
84
+ 3. Le projet est cohérent :
85
+ ```bash
86
+ npx fraza-doctor
87
+ ```
88
+
89
+ Le doctor connaît toutes les variables du module par son manifeste : une variable `FRAZA_MODULE_BOOKING_*` que le manifeste ne déclare pas est dénoncée.
90
+
91
+ ## Mettre à jour
92
+
85
93
  ```bash
86
- npx fraza-doctor
94
+ npx fraza-update
87
95
  ```
88
96
 
89
- Le doctor connaît toutes les variables du module par son manifeste : une variable `FRAZA_MODULE_BOOKING_*` que le manifeste ne déclare pas est dénoncée, et le plancher de version est vérifié.
97
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza-pro/module-booking` seul, par `npm i`, laisserait le core et les autres modules en arrière.
98
+
99
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza-pro/module-booking/CHANGELOG.md`.
100
+
101
+ ## Notes
102
+
103
+ - Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
104
+ - Désinstaller le module ne supprime pas les tables. `dropTables` est exporté depuis `@fraza-pro/module-booking` pour le faire explicitement.
@@ -4,15 +4,15 @@ description: Variables d'environnement de @fraza-pro/module-booking, permissions
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/booking/admin
8
- - 06-modules/booking/courriels
7
+ - 06-modules/booking/03-admin
8
+ - 06-modules/booking/05-courriels
9
9
  ---
10
10
 
11
11
  Toutes les variables du module portent le préfixe `FRAZA_MODULE_BOOKING`. Elles se lisent une fois par processus et sont gelées : modifier une valeur demande un redémarrage.
12
12
 
13
13
  ## Ce qui n'est pas ici
14
14
 
15
- Les types de rendez-vous, les intervenants, les horaires et les liens de réservation sont des **données**, pas de la configuration. Ils se créent dans la page Options de l'admin, sous la permission `booking.options`, et changent sans redéploiement. Voir [Administration](./admin.md).
15
+ Les types de rendez-vous, les intervenants, les horaires et les liens de réservation sont des **données**, pas de la configuration. Ils se créent dans la page Options de l'admin, sous la permission `booking.options`, et changent sans redéploiement. Voir [Administration](./03-admin.md).
16
16
 
17
17
  L'environnement ne porte que ce qui vaut pour tout le site : l'ouverture de la prise en ligne, la forme d'un nouveau type de rendez-vous, les fenêtres de réservation et d'annulation, les rappels et la marque de la page publique.
18
18
 
@@ -78,7 +78,7 @@ Le plafond par adresse courriel est compté en base, dans la transaction de rés
78
78
  | `FRAZA_MODULE_BOOKING_ADMIN_EMAIL` | - | Adresse recevant les avis de l'administration. |
79
79
  | `FRAZA_MODULE_BOOKING_CONTACT_EMAIL` | l'adresse ci-dessus | Adresse de réponse des courriels du client. |
80
80
 
81
- Voir [Courriels](./courriels.md).
81
+ Voir [Courriels](./05-courriels.md).
82
82
 
83
83
  ## Intégration
84
84
 
@@ -86,7 +86,7 @@ Voir [Courriels](./courriels.md).
86
86
  |---|---|---|
87
87
  | `FRAZA_MODULE_BOOKING_FRAME_ANCESTORS` | vide (tous les sites) | Sites autorisés à afficher l'assistant dans un cadre : origines, `self` ou `none`. La page de gestion n'est jamais affichée dans un cadre. |
88
88
 
89
- Voir [Intégration sur un site externe](./reservation-en-ligne.md#intégration-sur-un-site-externe).
89
+ Voir [Intégration sur un site externe](./04-reservation-en-ligne.md#intégration-sur-un-site-externe).
90
90
 
91
91
  ## Marque de la page publique
92
92