Add module loader & registry (task 04)
Implements the extensibility foundation: ModuleManifest/DashboardWidget/EntityTypeRegistration types in _core/module.ts, a plain-Map registry singleton with registerModule/getRegistry/getEntityType/getWidget, and stub manifests for calendar/lists/notes. Root layout imports src/modules/index.ts for side-effect registration; AppNav reads the registry to render nav links. /debug/registry dumps the full registry JSON in dev using zod v4 + z.toJSONSchema(). Adding a fourth module requires one folder + one line in index.ts. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
37977568ed
commit
e237fe8449
@@ -0,0 +1,31 @@
|
||||
import type { ModuleManifest, EntityTypeRegistration, DashboardWidget } from "./module";
|
||||
|
||||
const modules = new Map<string, ModuleManifest>();
|
||||
const entityTypes = new Map<string, EntityTypeRegistration>();
|
||||
const widgets = new Map<string, DashboardWidget>();
|
||||
|
||||
export function registerModule(manifest: ModuleManifest): void {
|
||||
modules.set(manifest.id, manifest);
|
||||
for (const entity of manifest.entities) {
|
||||
entityTypes.set(entity.type, entity);
|
||||
}
|
||||
for (const widget of manifest.dashboardWidgets ?? []) {
|
||||
widgets.set(widget.id, widget);
|
||||
}
|
||||
}
|
||||
|
||||
export function getRegistry() {
|
||||
return Object.freeze({
|
||||
modules: Object.freeze([...modules.values()]),
|
||||
entityTypes: Object.freeze([...entityTypes.values()]),
|
||||
widgets: Object.freeze([...widgets.values()]),
|
||||
});
|
||||
}
|
||||
|
||||
export function getEntityType(type: string): EntityTypeRegistration | undefined {
|
||||
return entityTypes.get(type);
|
||||
}
|
||||
|
||||
export function getWidget(id: string): DashboardWidget | undefined {
|
||||
return widgets.get(id);
|
||||
}
|
||||
Reference in New Issue
Block a user