@fraza/core 0.3.8 → 0.3.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/CHANGELOG.md +32 -0
- package/THIRD-PARTY-NOTICES.md +2 -2
- package/changelog.json +86 -0
- package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
- package/dist/docs/01-demarrage/01-installation.md +9 -15
- package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
- package/dist/docs/01-demarrage/03-configuration.md +1 -1
- package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
- package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
- package/dist/docs/02-guides/blocs-personnalises.md +1 -1
- package/dist/docs/02-guides/etendre-l-admin.md +2 -2
- package/dist/docs/02-guides/gerer-les-medias.md +1 -1
- package/dist/docs/02-guides/index.md +1 -1
- package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
- package/dist/docs/03-reference/01-cores/templates.md +3 -3
- package/dist/docs/03-reference/02-features/admin.md +13 -2
- package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
- package/dist/docs/03-reference/04-partage/composants.md +2 -0
- package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
- package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
- package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
- package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
- package/dist/docs/04-architecture/05-securite.md +1 -1
- package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
- package/dist/docs/05-contribution/03-redaction.md +10 -0
- package/dist/docs/05-contribution/05-publication.md +0 -1
- package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
- package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
- package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
- package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
- package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
- package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
- package/dist/docs/06-modules/booking/index.md +22 -12
- package/dist/docs/06-modules/drive/01-installation.md +92 -0
- package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
- package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
- package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
- package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
- package/dist/docs/06-modules/drive/index.md +23 -13
- package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
- package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
- package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
- package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
- package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
- package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
- package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
- package/dist/docs/06-modules/facturation/index.md +26 -16
- package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
- package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
- package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
- package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
- package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
- package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
- package/dist/docs/06-modules/forms/index.md +26 -14
- package/dist/docs/06-modules/index.md +2 -2
- package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
- package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
- package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
- package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
- package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
- package/dist/docs/06-modules/medias/index.md +25 -13
- package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
- package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
- package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
- package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
- package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
- package/dist/docs/06-modules/pages/index.md +21 -9
- package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
- package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
- package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
- package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
- package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
- package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
- package/dist/docs/06-modules/posts/index.md +25 -13
- package/dist/docs/assets/decouverte/tableau-de-bord.dark.webp +0 -0
- package/dist/docs/assets/decouverte/tableau-de-bord.light.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.dark.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.light.webp +0 -0
- package/dist/docs/assets/demarrage/roles.dark.webp +0 -0
- package/dist/docs/assets/demarrage/roles.light.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.dark.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.light.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.dark.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.light.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.dark.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.light.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.dark.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.light.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.dark.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.light.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.dark.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.light.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.light.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.light.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.dark.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.light.webp +0 -0
- package/dist/features/admin/components/dashboard/DashboardGrid.client.js +34 -23
- package/dist/shared/lib/version.js +1 -1
- package/package.json +1 -1
- package/supported.json +1 -1
- package/dist/docs/06-modules/drive/installation.md +0 -69
- /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,38 @@ 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.12 (2026-10-25)
|
|
8
|
+
|
|
9
|
+
### Documentation
|
|
10
|
+
|
|
11
|
+
- update screenshots for various pages (08afd94)
|
|
12
|
+
|
|
13
|
+
## 0.3.11 (2026-10-25)
|
|
14
|
+
|
|
15
|
+
### Corrections
|
|
16
|
+
|
|
17
|
+
- **admin** : update dashboard grid layout documentation and implementation (8a86eb3)
|
|
18
|
+
|
|
19
|
+
### Documentation
|
|
20
|
+
|
|
21
|
+
- **form** : update section grouping and order in admin configuration (5ae2e37)
|
|
22
|
+
|
|
23
|
+
## 0.3.10 (2026-10-25)
|
|
24
|
+
|
|
25
|
+
### Autres
|
|
26
|
+
|
|
27
|
+
- Update dependencies, fix vulnerabilities (23dbec5)
|
|
28
|
+
|
|
29
|
+
## 0.3.9 (2026-10-25)
|
|
30
|
+
|
|
31
|
+
### Refontes
|
|
32
|
+
|
|
33
|
+
- **docs/06-modules** : reorganize module documentation into numbered files (9c93a28)
|
|
34
|
+
|
|
35
|
+
### Documentation
|
|
36
|
+
|
|
37
|
+
- reorder and update installation instructions (254c39d)
|
|
38
|
+
|
|
7
39
|
## 0.3.8 (2026-10-25)
|
|
8
40
|
|
|
9
41
|
### Documentation
|
package/THIRD-PARTY-NOTICES.md
CHANGED
|
@@ -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.
|
|
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.
|
|
149
|
+
### @fraza/icons@0.3.16
|
|
150
150
|
|
|
151
151
|
Licence : MIT
|
|
152
152
|
|
package/changelog.json
CHANGED
|
@@ -1,6 +1,92 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fraza/core",
|
|
3
3
|
"versions": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.3.12",
|
|
6
|
+
"date": "2026-10-25",
|
|
7
|
+
"breaking": [],
|
|
8
|
+
"envAdded": [],
|
|
9
|
+
"envRemoved": [],
|
|
10
|
+
"templateChanged": [],
|
|
11
|
+
"action": [],
|
|
12
|
+
"entries": [
|
|
13
|
+
{
|
|
14
|
+
"type": "docs",
|
|
15
|
+
"scope": null,
|
|
16
|
+
"subject": "update screenshots for various pages",
|
|
17
|
+
"hash": "08afd94",
|
|
18
|
+
"breaking": false
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"version": "0.3.11",
|
|
24
|
+
"date": "2026-10-25",
|
|
25
|
+
"breaking": [],
|
|
26
|
+
"envAdded": [],
|
|
27
|
+
"envRemoved": [],
|
|
28
|
+
"templateChanged": [],
|
|
29
|
+
"action": [],
|
|
30
|
+
"entries": [
|
|
31
|
+
{
|
|
32
|
+
"type": "fix",
|
|
33
|
+
"scope": "admin",
|
|
34
|
+
"subject": "update dashboard grid layout documentation and implementation",
|
|
35
|
+
"hash": "8a86eb3",
|
|
36
|
+
"breaking": false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"type": "docs",
|
|
40
|
+
"scope": "form",
|
|
41
|
+
"subject": "update section grouping and order in admin configuration",
|
|
42
|
+
"hash": "5ae2e37",
|
|
43
|
+
"breaking": false
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"version": "0.3.10",
|
|
49
|
+
"date": "2026-10-25",
|
|
50
|
+
"breaking": [],
|
|
51
|
+
"envAdded": [],
|
|
52
|
+
"envRemoved": [],
|
|
53
|
+
"templateChanged": [],
|
|
54
|
+
"action": [],
|
|
55
|
+
"entries": [
|
|
56
|
+
{
|
|
57
|
+
"type": "Chore",
|
|
58
|
+
"scope": null,
|
|
59
|
+
"subject": "Update dependencies, fix vulnerabilities",
|
|
60
|
+
"hash": "23dbec5",
|
|
61
|
+
"breaking": false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"version": "0.3.9",
|
|
67
|
+
"date": "2026-10-25",
|
|
68
|
+
"breaking": [],
|
|
69
|
+
"envAdded": [],
|
|
70
|
+
"envRemoved": [],
|
|
71
|
+
"templateChanged": [],
|
|
72
|
+
"action": [],
|
|
73
|
+
"entries": [
|
|
74
|
+
{
|
|
75
|
+
"type": "docs",
|
|
76
|
+
"scope": null,
|
|
77
|
+
"subject": "reorder and update installation instructions",
|
|
78
|
+
"hash": "254c39d",
|
|
79
|
+
"breaking": false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "refactor",
|
|
83
|
+
"scope": "docs/06-modules",
|
|
84
|
+
"subject": "reorganize module documentation into numbered files",
|
|
85
|
+
"hash": "9c93a28",
|
|
86
|
+
"breaking": false
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
},
|
|
4
90
|
{
|
|
5
91
|
"version": "0.3.8",
|
|
6
92
|
"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.
|
|
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:
|
|
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.
|
|
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.
|
|
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 :
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
|
@@ -189,12 +189,12 @@ Le composant reçoit `data`, le retour du fetcher, `loading` et `size`. **Si le
|
|
|
189
189
|
|
|
190
190
|
### Largeur d'une tuile
|
|
191
191
|
|
|
192
|
-
La grille compte 4 colonnes sur un
|
|
192
|
+
La grille compte jusqu'à 4 colonnes, selon la place dont elle dispose : 3 sur un portable de 1440 px, une sur un téléphone. `size` déclare la largeur d'une tuile en colonnes : `default` à l'arrivée, `min` et `max` pour borner ce que l'utilisateur peut choisir. Sans `size`, une tuile fait une colonne et peut s'étendre à quatre.
|
|
193
193
|
|
|
194
194
|
```jsx
|
|
195
195
|
function OrdersWidget({ data, loading, size }) {
|
|
196
196
|
// `size` est la largeur réellement occupée : 1 sur un téléphone, au plus 2
|
|
197
|
-
// sur un écran moyen, la largeur choisie sur un grand écran.
|
|
197
|
+
// sur un écran moyen, 3 sur un portable, la largeur choisie sur un grand écran.
|
|
198
198
|
const wide = size >= 2;
|
|
199
199
|
return (
|
|
200
200
|
<Card padding="none" spacing="none" className="px-5 py-4">
|
|
@@ -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
|
|
|
@@ -210,7 +210,7 @@ Le composant reçoit trois props :
|
|
|
210
210
|
|---|---|
|
|
211
211
|
| `data` | Retour du fetcher, ou `null` si le fetcher a échoué ou n'existe pas. |
|
|
212
212
|
| `loading` | `true` tant que la donnée n'est pas là. |
|
|
213
|
-
| `size` | Largeur réellement occupée, en colonnes : la largeur choisie, bornée par les colonnes de
|
|
213
|
+
| `size` | Largeur réellement occupée, en colonnes : la largeur choisie, bornée par les colonnes de la grille. |
|
|
214
214
|
|
|
215
215
|
`size` sert à adapter le rendu. La tuile de facturation pose son graphique à côté de ses chiffres à partir de deux colonnes, et dessous sur une seule. Sur un téléphone, `size` vaut toujours 1.
|
|
216
216
|
|
|
@@ -222,7 +222,18 @@ Une tuile `devkit` est écartée par le tableau de bord, pas par le registre. `F
|
|
|
222
222
|
|
|
223
223
|
## Disposition du tableau de bord
|
|
224
224
|
|
|
225
|
-
Les tuiles sont posées dans une
|
|
225
|
+
Les tuiles sont posées dans une grille de 1 à 4 colonnes. Le nombre suit la **largeur de la grille elle-même**, pas celle de la fenêtre : la barre latérale prend déjà le quart d'un écran de portable, et quatre colonnes dans le reste donnaient des tuiles trop étroites pour se lire.
|
|
226
|
+
|
|
227
|
+
| Largeur de la grille | Colonnes | Avec la barre latérale |
|
|
228
|
+
|---|---|---|
|
|
229
|
+
| 80rem (1280 px) et plus | 4 | fenêtre d'environ 1510 px et plus |
|
|
230
|
+
| de 64rem (1024 px) à 80rem | 3 | de 1250 à 1510 px environ, dont le portable de 1440 px |
|
|
231
|
+
| de 42rem (672 px) à 64rem | 2 | de 900 à 1250 px environ |
|
|
232
|
+
| moins de 42rem | 1 | téléphone |
|
|
233
|
+
|
|
234
|
+
Une tuile occupe de 1 à 4 colonnes, bornées par celles de la grille : une tuile de 4 colonnes en prend 3 sur un portable, soit toute la largeur. Sa hauteur suit son contenu.
|
|
235
|
+
|
|
236
|
+
Les colonnes sont des requêtes de conteneur Tailwind (`@container`, puis `@2xl:`, `@5xl:` et `@7xl:`) : le bon nombre est déjà dans le HTML du serveur, sans saut au chargement. Le composant mesure aussi la largeur de la grille, avec les mêmes seuils, pour donner à chaque tuile son `size` et borner le redimensionnement en mode édition.
|
|
226
237
|
|
|
227
238
|
La grille se tasse d'elle-même. Ses rangées font 4 px, et chaque tuile en couvre autant que sa hauteur mesurée l'exige, espacement compris : un `ResizeObserver` suit la hauteur de chaque tuile. Avec `grid-auto-flow: dense`, une tuile courte remonte dans le vide laissé à côté d'une tuile haute. Le résultat est celui d'une maçonnerie, avec en plus des tuiles qui s'étendent sur plusieurs colonnes. Avant la mesure (rendu serveur, puis premier affichage) la grille garde des rangées ordinaires : une tuile peut y laisser un vide sous elle, jamais en chevaucher une autre.
|
|
228
239
|
|
|
@@ -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
|
|
|
@@ -663,6 +663,8 @@ Un clic qui part d'un contrôle de la ligne lui appartient : un bouton, un lien,
|
|
|
663
663
|
|
|
664
664
|
Sous 1024 px de large, `Table` ne rend plus le tableau mais une liste : une ligne par élément, deux lignes de texte au plus. Une carte par élément, qui reprenait toutes les colonnes en grille, faisait défiler trois éléments par écran de téléphone. La liste en montre une dizaine, et le détail reste à un toucher.
|
|
665
665
|
|
|
666
|
+

|
|
667
|
+
|
|
666
668
|
```
|
|
667
669
|
┌────────────────────────────────────────────────────┐
|
|
668
670
|
│ ☐ Boréalis Café inc. 1 345,21 $ … │
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|