import type { PageDefinition, PageEntry } from "#types/page.types"; import { createRegistry } from "#domain/registries/base.registry"; const pages = createRegistry(); const loaded = new Map(); const pending = new Map>(); export const registerPage = function registerPage(page: PageEntry): void { pages.register(page); }; export const getPage = function getPage(id: string): PageEntry | undefined { return pages.byId(id); }; export const listPages = function listPages(): readonly PageEntry[] { return pages .all() .filter((page) => page.listed) .toSorted((a, b) => a.order - b.order); }; export const loadedPage = function loadedPage(id: string): PageDefinition | undefined { return loaded.get(id); }; export const loadPage = async function loadPage(id: string): Promise { const held = loaded.get(id); if (held !== undefined) { return held; } const entry = pages.byId(id); if (entry === undefined) { return undefined; } const inFlight = pending.get(id); if (inFlight !== undefined) { return inFlight; } const loading = entry.load().then((definition) => { loaded.set(id, definition); pending.delete(id); return definition; }); pending.set(id, loading); return loading; };