- replace dynamic import strategy with static manifest generated by `zen-modules sync` cli - add `zen-modules` binary entry point in `package.json` - add `cli.js` implementing the `zen-modules sync` command - update `discover.server.js` to consume static manifest instead of scanning at runtime - update `index.js` to reflect new module registration flow - update `init.js` to accept pre-resolved modules from manifest - revise docs to document manifest format, sync triggers, and build requirements
2.2 KiB
Modules
Registre runtime des modules @zen/module-* activés dans le projet consommateur. Voir docs/MODULES.md pour le guide complet de création d'un module.
Architecture
Les modules sont activés via un manifeste statique généré dans le projet consommateur (app/.zen/modules.generated.js). Le manifeste fait des import * as ... statiques pour chaque package et appelle register() au top level. Importé par instrumentation.js (serveur) et app/layout.js (client), il rend l'arbre d'imports du module visible aux deux bundles Next.js — Turbopack et Webpack le bundlent comme n'importe quel autre fichier source.
Le manifeste est régénéré par npx zen-modules sync (typiquement depuis le postinstall + les scripts dev / build du projet).
API
import {
registerModules,
registerModule,
getRegisteredModules,
getRegisteredModule,
findInstalledModuleNames,
validateModuleEnvVars,
} from '@zen/core/modules';
| Fonction | Usage |
|---|---|
registerModules(modules) |
Appelée par initializeZen({ modules }). Peuple le registre interne à partir du manifeste. |
registerModule(mod) |
Bas niveau — utilisé par registerModules. |
getRegisteredModules() |
Retourne tous les modules connus (utilisé par zen-db init et l'env validation). |
findInstalledModuleNames({ cwd }) |
Scan readonly du package.json du projet — utilisé par le CLI zen-modules sync. |
validateModuleEnvVars(modules) |
Logge un warning par variable d'env requise absente. |
Forme attendue d'un module
Le point d'entrée d'un package @zen/module-X doit exporter :
| Export | Type | Obligatoire |
|---|---|---|
manifest |
{ name, version, permissions?, envVars? } |
oui |
register |
() => void | Promise<void> |
oui |
createTables |
async () => { created?, skipped? } |
si le module a des tables |
dropTables |
async () => void |
si le module a des tables |
Le code du module doit être pré-compilé avant publication (transformation JSX, voir docs/MODULES.md).
CLI
npx zen-modules sync — régénère app/.zen/modules.generated.js. Idempotent : pas d'écriture si le contenu est inchangé.