feat(modules): add external module registration and defineModule support

- Add `./modules/define` export path pointing to `defineModule.js`
- Implement `registerExternalModules()` to handle modules passed via `zen.config.js`, with env var gating (`ZEN_MODULE_<NAME>=true`)
- Extract `buildAdminConfig()` helper to consolidate admin navigation/page config building
- Refactor `loadModuleConfig()` to use `buildAdminConfig()` and simplify public routes check
- Improve `initializeModuleTables()` to gracefully skip modules without `db.js` instead of erroring
- Update module discovery JSDoc to reflect external module registration support
This commit is contained in:
2026-04-12 13:39:56 -04:00
parent 4983a24325
commit 99a56d2c39
13 changed files with 871 additions and 146 deletions
+18 -19
View File
@@ -1,37 +1,36 @@
/**
* Module Actions Registry (Server-Side)
*
* Import server actions for public pages (/zen/*) and dashboard.
* Admin pages import actions directly from modules.
* See modules.registry.js for full module creation guide.
*
* Usage in consuming Next.js app:
* ```
* import { MODULE_ACTIONS, MODULE_DASHBOARD_ACTIONS } from '@hykocx/zen/modules/actions';
*
* // Access module actions
* const { getInvoiceByTokenAction } = MODULE_ACTIONS.invoice;
*
* // Get dashboard stats
* const stats = await MODULE_DASHBOARD_ACTIONS.invoice();
* ```
*
* Static registry for internal module server actions.
* External modules registered via zen.config.js are resolved through the runtime registry.
*
* Usage:
* import { getModuleActions } from '@hykocx/zen/modules/actions';
* const { getInvoiceByToken } = getModuleActions('invoice');
*/
// Register module actions (for public pages)
import { getModule } from '../core/modules/registry.js';
// Static actions for internal modules (add entries here for new internal modules)
export const MODULE_ACTIONS = {
posts: {},
};
// Register dashboard stats actions (for admin dashboard)
// Static dashboard stats actions for internal modules
export const MODULE_DASHBOARD_ACTIONS = {};
/**
* Get actions for a specific module
* Get actions for a specific module.
* Checks the static registry first, then the runtime registry for external modules.
*
* @param {string} moduleName - Module name
* @returns {Object} Module actions object or empty object
*/
export function getModuleActions(moduleName) {
return MODULE_ACTIONS[moduleName] || {};
if (MODULE_ACTIONS[moduleName]) return MODULE_ACTIONS[moduleName];
// External modules declare their actions in their defineModule() config
return getModule(moduleName)?.actions ?? {};
}
/**