a3aff9fa49
- add `src/core/modules/` with registry, discovery (server), and public index - add `src/core/public-pages/` with registry, server component, and public index - add `src/core/users/permissions-registry.js` for runtime permission registration - expose `./modules`, `./public-pages`, and `./public-pages/server` package exports - rename `registerFeatureRoutes` to `registerApiRoutes` with backward-compatible alias - extend `seedDefaultRolesAndPermissions` to include module-registered permissions - update `initializeZen` and shared init to wire module discovery and registration - add `docs/MODULES.md` documenting the `@zen/module-*` authoring contract - update `docs/DEV.md` with references to module system docs
1.2 KiB
1.2 KiB
Public Module Pages
Registre runtime pour les pages publiques /zen/<module>/<...> ajoutées par les modules externes.
Concept
Tout chemin /zen/<segment>/... (sauf /zen/api/... réservé aux routes API) est résolu vers le composant enregistré sous <segment>. Le module gère son routage interne.
API
import { registerPublicModulePage } from '@zen/core/public-pages';
registerPublicModulePage({
moduleName: 'billing',
Component: BillingRouter,
title: 'Facturation',
});
Le composant reçoit { params, segments } :
| Prop | Type | Description |
|---|---|---|
params |
object |
Paramètres Next.js résolus (incluant path). |
segments |
string[] |
Segments d'URL après /zen/<moduleName>/. Le module fait son propre routage. |
Exemple : /zen/billing/invoice/abc-123 → segments = ['invoice', 'abc-123'].
Câblage côté projet consommateur
Le scaffolder @zen/start génère automatiquement app/zen/[...path]/page.js qui ré-exporte le composant serveur. Aucune action manuelle requise.
Restrictions
- Le moduleName
apiest réservé et lève une exception à l'enregistrement. - Un seul composant par moduleName ; un appel ultérieur écrase le précédent.