docs/refactor: rename getModuleMetadata and update route auth format

- Rename `getModuleMetadata` to `getModuleMetadataGenerator` in registry,
  index, and client exports to clarify its purpose (returns a generator
  function, not a metadata object)
- Add new `getModuleMetadata` and `getMetadataGenerator` exports from
  `modules.metadata.js` for server-side metadata object retrieval
- Update route auth format in docs from `requireAuth`/`requireAdmin`
  flags to a single `auth` field with values: `'admin'`, `'user'`,
  or `'public'`
- Fix `isModuleEnabledInEnv` to replace hyphens with underscores in
  env var names (e.g. `my-module` → `ZEN_MODULE_MY_MODULE`)
- Replace `useState` initializer in `ZenProvider` with `useRef` guard
  to avoid React strict mode double-invocation issues
This commit is contained in:
2026-04-12 18:58:01 -04:00
parent c806c8d8d4
commit 3e633e981a
11 changed files with 68 additions and 38 deletions
+8 -5
View File
@@ -1,6 +1,6 @@
'use client';
import { useState } from 'react';
import { useEffect, useRef } from 'react';
import { ToastProvider, ToastContainer } from '@zen/core/toast';
import { registerExternalModulePages } from '../../modules/modules.pages.js';
@@ -15,13 +15,16 @@ import { registerExternalModulePages } from '../../modules/modules.pages.js';
* @param {ReactNode} props.children
*/
export function ZenProvider({ modules = [], children }) {
// Register external module pages once, synchronously, before first render.
// useState initializer runs exactly once and does not cause a re-render.
useState(() => {
const registered = useRef(false);
if (!registered.current) {
// Register synchronously on first render so pages are available
// before any child component resolves a module route.
if (modules.length > 0) {
registerExternalModulePages(modules);
}
});
registered.current = true;
}
return (
<ToastProvider>