Files
core/src/core/modules/README.md
T
hykocx 94ab6c36cb docs(modules): update module discovery architecture to static manifest approach
- 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
2026-04-25 14:24:56 -04:00

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é.