@newcms/core 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1254 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +697 -0
- package/dist/index.d.ts +697 -6
- package/dist/index.js +1211 -4
- package/dist/index.js.map +1 -1
- package/package.json +8 -4
- package/dist/hook-engine.d.ts +0 -134
- package/dist/hook-engine.d.ts.map +0 -1
- package/dist/hook-engine.js +0 -370
- package/dist/hook-engine.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/post-type-registry.d.ts +0 -50
- package/dist/post-type-registry.d.ts.map +0 -1
- package/dist/post-type-registry.js +0 -159
- package/dist/post-type-registry.js.map +0 -1
- package/dist/taxonomy-registry.d.ts +0 -20
- package/dist/taxonomy-registry.d.ts.map +0 -1
- package/dist/taxonomy-registry.js +0 -71
- package/dist/taxonomy-registry.js.map +0 -1
- package/dist/types.d.ts +0 -124
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -34
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/hook-engine.ts","../src/post-type-registry.ts","../src/taxonomy-registry.ts","../src/extension-registry.ts","../src/theme-registry.ts","../src/bootstrap.ts","../src/types.ts","../src/shortcode.ts","../src/menu-registry.ts","../src/url-rewrite.ts"],"sourcesContent":["export { HookEngine } from './hook-engine';\nexport { PostTypeRegistry, BUILTIN_POST_TYPES } from './post-type-registry';\nexport { TaxonomyRegistry, BUILTIN_TAXONOMIES } from './taxonomy-registry';\nexport { ExtensionRegistry } from './extension-registry';\nexport type {\n\tExtensionManifest,\n\tExtensionStatus,\n\tExtensionEntry,\n} from './extension-registry';\nexport { ThemeRegistry, resolveTemplateHierarchy } from './theme-registry';\nexport type {\n\tThemeManifest,\n\tThemeSupports,\n\tThemeEntry,\n\tTemplateContext,\n} from './theme-registry';\nexport { BootstrapManager, BOOTSTRAP_PHASES } from './bootstrap';\nexport type { BootstrapPhase, PhaseHandler } from './bootstrap';\nexport type {\n\tHookCallback,\n\tHookHandler,\n\tHookStackEntry,\n\tAddHookOptions,\n\tHasHookResult,\n\tPostTypeDefinition,\n\tTaxonomyDefinition,\n\tCapabilityContext,\n} from './types';\nexport { POST_STATUS, USER_ROLES, HOOK_PRIORITY } from './types';\nexport { ShortcodeRegistry } from './shortcode';\nexport type { ShortcodeCallback } from './shortcode';\nexport { MenuRegistry } from './menu-registry';\nexport type { MenuLocation, MenuItem } from './menu-registry';\nexport { UrlRewriter } from './url-rewrite';\nexport type { RewriteRule, RewriteResult } from './url-rewrite';\n","import type {\n\tHookCallback,\n\tHookHandler,\n\tHookStackEntry,\n\tAddHookOptions,\n\tHasHookResult,\n} from './types';\n\n/**\n * Generates a unique identifier for a hook callback.\n *\n * For named functions, uses the function name + priority.\n * For anonymous/arrow functions, uses a counter-based ID.\n */\nlet anonymousCounter = 0;\n\nfunction generateCallbackId(callback: HookCallback, priority: number): string {\n\tif (callback.name && callback.name !== '') {\n\t\treturn `${callback.name}::${priority}`;\n\t}\n\tanonymousCounter++;\n\treturn `__anonymous_${anonymousCounter}::${priority}`;\n}\n\n/**\n * HookEngine — the backbone of the CMS extensibility system.\n *\n * Implements a WordPress-compatible hook system with actions and filters.\n * Actions are hooks that perform side effects. Filters are hooks that\n * transform a value through a pipeline of callbacks.\n *\n * Features:\n * - Priority-based execution (lower number = earlier execution)\n * - Recursive hook execution support\n * - Universal \"all\" hook that fires for every hook\n * - Execution stack tracking\n * - Fire counters per hook\n * - Precise removal by callback + priority\n */\nexport class HookEngine {\n\t/**\n\t * Map of hook name → array of handlers, kept sorted by priority.\n\t */\n\tprivate hooks: Map<string, HookHandler[]> = new Map();\n\n\t/**\n\t * Stack of hooks currently being executed (supports recursion).\n\t */\n\tprivate currentStack: HookStackEntry[] = [];\n\n\t/**\n\t * Counter of how many times each hook has been fired.\n\t */\n\tprivate fireCount: Map<string, number> = new Map();\n\n\t/**\n\t * Register a callback for a hook.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param callback - The function to execute\n\t * @param options - Priority and accepted args configuration\n\t * @returns The generated handler ID\n\t */\n\taddHook(hookName: string, callback: HookCallback, options: AddHookOptions = {}): string {\n\t\tconst priority = options.priority ?? 10;\n\t\tconst acceptedArgs = options.acceptedArgs ?? 1;\n\t\tconst id = generateCallbackId(callback, priority);\n\n\t\tconst handler: HookHandler = {\n\t\t\tcallback,\n\t\t\tpriority,\n\t\t\tacceptedArgs,\n\t\t\tid,\n\t\t};\n\n\t\tconst existing = this.hooks.get(hookName) ?? [];\n\t\texisting.push(handler);\n\t\t// Stable sort by priority (preserves insertion order for same priority)\n\t\texisting.sort((a, b) => a.priority - b.priority);\n\t\tthis.hooks.set(hookName, existing);\n\n\t\treturn id;\n\t}\n\n\t/**\n\t * Remove a specific callback from a hook.\n\t *\n\t * Both the callback reference AND priority must match for removal.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param callback - The callback to remove\n\t * @param priority - The priority it was registered with (default: 10)\n\t * @returns true if a handler was removed\n\t */\n\tremoveHook(hookName: string, callback: HookCallback, priority: number = 10): boolean {\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tif (!handlers) return false;\n\n\t\tconst initialLength = handlers.length;\n\t\tconst filtered = handlers.filter(\n\t\t\t(h) => !(h.callback === callback && h.priority === priority),\n\t\t);\n\n\t\tif (filtered.length === initialLength) return false;\n\n\t\tif (filtered.length === 0) {\n\t\t\tthis.hooks.delete(hookName);\n\t\t} else {\n\t\t\tthis.hooks.set(hookName, filtered);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Remove all callbacks from a hook, optionally only for a specific priority.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param priority - If provided, only remove handlers at this priority\n\t * @returns true if any handlers were removed\n\t */\n\tremoveAllHooks(hookName: string, priority?: number): boolean {\n\t\tif (priority === undefined) {\n\t\t\treturn this.hooks.delete(hookName);\n\t\t}\n\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tif (!handlers) return false;\n\n\t\tconst filtered = handlers.filter((h) => h.priority !== priority);\n\t\tif (filtered.length === handlers.length) return false;\n\n\t\tif (filtered.length === 0) {\n\t\t\tthis.hooks.delete(hookName);\n\t\t} else {\n\t\t\tthis.hooks.set(hookName, filtered);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if a hook has registered handlers.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param callback - If provided, check for this specific callback\n\t * @returns false if no handlers, or the priority of the matching handler\n\t */\n\thasHook(hookName: string, callback?: HookCallback): HasHookResult {\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tif (!handlers || handlers.length === 0) return false;\n\n\t\tif (callback === undefined) {\n\t\t\t// Return the lowest priority (first handler)\n\t\t\treturn handlers[0].priority;\n\t\t}\n\n\t\tconst found = handlers.find((h) => h.callback === callback);\n\t\treturn found ? found.priority : false;\n\t}\n\n\t/**\n\t * Execute an action hook. All registered callbacks are called in priority order.\n\t * The \"all\" universal hook fires before the specific hook.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param args - Arguments to pass to callbacks\n\t */\n\tasync doAction(hookName: string, ...args: unknown[]): Promise<void> {\n\t\t// Fire the universal \"all\" hook first (if we're not already in \"all\")\n\t\tif (hookName !== 'all') {\n\t\t\tawait this.fireUniversalHook(hookName, args);\n\t\t}\n\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tthis.incrementFireCount(hookName);\n\n\t\tif (!handlers || handlers.length === 0) return;\n\n\t\t// Push onto execution stack\n\t\tconst stackEntry: HookStackEntry = { name: hookName, currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < handlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = handlers[i];\n\t\t\t\tconst slicedArgs = args.slice(0, handler.acceptedArgs);\n\t\t\t\tawait handler.callback(...slicedArgs);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\t}\n\n\t/**\n\t * Execute an action hook synchronously.\n\t */\n\tdoActionSync(hookName: string, ...args: unknown[]): void {\n\t\tif (hookName !== 'all') {\n\t\t\tthis.fireUniversalHookSync(hookName, args);\n\t\t}\n\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tthis.incrementFireCount(hookName);\n\n\t\tif (!handlers || handlers.length === 0) return;\n\n\t\tconst stackEntry: HookStackEntry = { name: hookName, currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < handlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = handlers[i];\n\t\t\t\tconst slicedArgs = args.slice(0, handler.acceptedArgs);\n\t\t\t\thandler.callback(...slicedArgs);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\t}\n\n\t/**\n\t * Execute a filter hook. The first argument is the value being filtered.\n\t * Each callback receives the (possibly modified) value and returns a new value.\n\t * The \"all\" universal hook fires before the specific hook.\n\t *\n\t * @param hookName - The hook identifier\n\t * @param value - The initial value to filter\n\t * @param args - Additional arguments passed to each callback\n\t * @returns The filtered value after all callbacks have processed it\n\t */\n\tasync applyFilters(hookName: string, value: unknown, ...args: unknown[]): Promise<unknown> {\n\t\t// Fire the universal \"all\" hook first\n\t\tif (hookName !== 'all') {\n\t\t\tawait this.fireUniversalHook(hookName, [value, ...args]);\n\t\t}\n\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tthis.incrementFireCount(hookName);\n\n\t\tif (!handlers || handlers.length === 0) return value;\n\n\t\tconst stackEntry: HookStackEntry = { name: hookName, currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\tlet filteredValue = value;\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < handlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = handlers[i];\n\t\t\t\tconst callArgs = [filteredValue, ...args].slice(0, handler.acceptedArgs);\n\t\t\t\tfilteredValue = await handler.callback(filteredValue, ...callArgs.slice(1));\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\n\t\treturn filteredValue;\n\t}\n\n\t/**\n\t * Execute a filter hook synchronously.\n\t */\n\tapplyFiltersSync(hookName: string, value: unknown, ...args: unknown[]): unknown {\n\t\tif (hookName !== 'all') {\n\t\t\tthis.fireUniversalHookSync(hookName, [value, ...args]);\n\t\t}\n\n\t\tconst handlers = this.hooks.get(hookName);\n\t\tthis.incrementFireCount(hookName);\n\n\t\tif (!handlers || handlers.length === 0) return value;\n\n\t\tconst stackEntry: HookStackEntry = { name: hookName, currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\tlet filteredValue = value;\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < handlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = handlers[i];\n\t\t\t\tconst callArgs = [filteredValue, ...args].slice(0, handler.acceptedArgs);\n\t\t\t\tfilteredValue = handler.callback(filteredValue, ...callArgs.slice(1));\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\n\t\treturn filteredValue;\n\t}\n\n\t/**\n\t * Get how many times a hook has been fired.\n\t */\n\tgetFireCount(hookName: string): number {\n\t\treturn this.fireCount.get(hookName) ?? 0;\n\t}\n\n\t/**\n\t * Check if a specific hook is currently being executed.\n\t */\n\tisDoingHook(hookName?: string): boolean {\n\t\tif (hookName === undefined) {\n\t\t\treturn this.currentStack.length > 0;\n\t\t}\n\t\treturn this.currentStack.some((entry) => entry.name === hookName);\n\t}\n\n\t/**\n\t * Get the name of the hook currently being executed (top of stack).\n\t * Returns undefined if no hook is executing.\n\t */\n\tcurrentHook(): string | undefined {\n\t\tif (this.currentStack.length === 0) return undefined;\n\t\treturn this.currentStack[this.currentStack.length - 1].name;\n\t}\n\n\t/**\n\t * Get a snapshot of the current execution stack.\n\t */\n\tgetExecutionStack(): readonly HookStackEntry[] {\n\t\treturn [...this.currentStack];\n\t}\n\n\t/**\n\t * Check if a hook has ever been fired (fire count > 0).\n\t */\n\tdidHook(hookName: string): boolean {\n\t\treturn this.getFireCount(hookName) > 0;\n\t}\n\n\t/**\n\t * Get the number of handlers registered for a hook.\n\t */\n\tgetHandlerCount(hookName: string): number {\n\t\treturn this.hooks.get(hookName)?.length ?? 0;\n\t}\n\n\t/**\n\t * Reset the engine — useful for testing.\n\t */\n\treset(): void {\n\t\tthis.hooks.clear();\n\t\tthis.currentStack = [];\n\t\tthis.fireCount.clear();\n\t\tanonymousCounter = 0;\n\t}\n\n\t// --- Convenience aliases matching WordPress API names ---\n\n\taddAction(hookName: string, callback: HookCallback, options?: AddHookOptions): string {\n\t\treturn this.addHook(hookName, callback, options);\n\t}\n\n\taddFilter(hookName: string, callback: HookCallback, options?: AddHookOptions): string {\n\t\treturn this.addHook(hookName, callback, options);\n\t}\n\n\tremoveAction(hookName: string, callback: HookCallback, priority?: number): boolean {\n\t\treturn this.removeHook(hookName, callback, priority);\n\t}\n\n\tremoveFilter(hookName: string, callback: HookCallback, priority?: number): boolean {\n\t\treturn this.removeHook(hookName, callback, priority);\n\t}\n\n\thasAction(hookName: string, callback?: HookCallback): HasHookResult {\n\t\treturn this.hasHook(hookName, callback);\n\t}\n\n\thasFilter(hookName: string, callback?: HookCallback): HasHookResult {\n\t\treturn this.hasHook(hookName, callback);\n\t}\n\n\tdidAction(hookName: string): boolean {\n\t\treturn this.didHook(hookName);\n\t}\n\n\tdidFilter(hookName: string): boolean {\n\t\treturn this.didHook(hookName);\n\t}\n\n\t// --- Private helpers ---\n\n\tprivate incrementFireCount(hookName: string): void {\n\t\tthis.fireCount.set(hookName, (this.fireCount.get(hookName) ?? 0) + 1);\n\t}\n\n\tprivate async fireUniversalHook(hookName: string, args: unknown[]): Promise<void> {\n\t\tconst allHandlers = this.hooks.get('all');\n\t\tif (!allHandlers || allHandlers.length === 0) return;\n\n\t\tconst stackEntry: HookStackEntry = { name: 'all', currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < allHandlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = allHandlers[i];\n\t\t\t\tawait handler.callback(hookName, ...args);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\t}\n\n\tprivate fireUniversalHookSync(hookName: string, args: unknown[]): void {\n\t\tconst allHandlers = this.hooks.get('all');\n\t\tif (!allHandlers || allHandlers.length === 0) return;\n\n\t\tconst stackEntry: HookStackEntry = { name: 'all', currentIndex: 0 };\n\t\tthis.currentStack.push(stackEntry);\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < allHandlers.length; i++) {\n\t\t\t\tstackEntry.currentIndex = i;\n\t\t\t\tconst handler = allHandlers[i];\n\t\t\t\thandler.callback(hookName, ...args);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.currentStack.pop();\n\t\t}\n\t}\n}\n","import type { PostTypeDefinition } from './types';\n\n/**\n * Registry for content types (post types).\n *\n * Manages registration and lookup of all content types in the system.\n * Built-in types (post, page, attachment, revision, nav_menu_item) are\n * registered during bootstrap; custom types are registered by extensions.\n */\nexport class PostTypeRegistry {\n\tprivate types: Map<string, PostTypeDefinition> = new Map();\n\n\t/**\n\t * Register a new post type.\n\t *\n\t * @throws If a type with the same name is already registered\n\t */\n\tregister(definition: PostTypeDefinition): void {\n\t\tif (this.types.has(definition.name)) {\n\t\t\tthrow new Error(`Post type \"${definition.name}\" is already registered.`);\n\t\t}\n\t\tthis.types.set(definition.name, definition);\n\t}\n\n\t/**\n\t * Get a post type definition by name.\n\t */\n\tget(name: string): PostTypeDefinition | undefined {\n\t\treturn this.types.get(name);\n\t}\n\n\t/**\n\t * Check if a post type is registered.\n\t */\n\thas(name: string): boolean {\n\t\treturn this.types.has(name);\n\t}\n\n\t/**\n\t * Get all registered post types.\n\t */\n\tgetAll(): PostTypeDefinition[] {\n\t\treturn [...this.types.values()];\n\t}\n\n\t/**\n\t * Get only public post types (for REST API, search, etc).\n\t */\n\tgetPublic(): PostTypeDefinition[] {\n\t\treturn this.getAll().filter((t) => t.public !== false);\n\t}\n\n\t/**\n\t * Get post types that are exposed via REST API.\n\t */\n\tgetRestVisible(): PostTypeDefinition[] {\n\t\treturn this.getAll().filter((t) => t.showInRest === true);\n\t}\n\n\t/**\n\t * Unregister a post type. Only custom types can be unregistered.\n\t */\n\tunregister(name: string): boolean {\n\t\treturn this.types.delete(name);\n\t}\n\n\t/**\n\t * Reset registry — for testing only.\n\t */\n\treset(): void {\n\t\tthis.types.clear();\n\t}\n}\n\n/**\n * Built-in post type definitions, registered during bootstrap.\n */\nexport const BUILTIN_POST_TYPES: PostTypeDefinition[] = [\n\t{\n\t\tname: 'post',\n\t\tlabel: 'Posts',\n\t\tlabels: { singular: 'Post', plural: 'Posts' },\n\t\tpublic: true,\n\t\thierarchical: false,\n\t\tshowInRest: true,\n\t\trestBase: 'posts',\n\t\tsupports: [\n\t\t\t'title',\n\t\t\t'editor',\n\t\t\t'author',\n\t\t\t'thumbnail',\n\t\t\t'excerpt',\n\t\t\t'trackbacks',\n\t\t\t'custom-fields',\n\t\t\t'comments',\n\t\t\t'revisions',\n\t\t\t'post-formats',\n\t\t],\n\t\ttaxonomies: ['category', 'post_tag'],\n\t\thasArchive: true,\n\t\trewrite: { slug: '', withFront: true },\n\t\tmenuPosition: 5,\n\t\tcapability_type: 'post',\n\t},\n\t{\n\t\tname: 'page',\n\t\tlabel: 'Pages',\n\t\tlabels: { singular: 'Page', plural: 'Pages' },\n\t\tpublic: true,\n\t\thierarchical: true,\n\t\tshowInRest: true,\n\t\trestBase: 'pages',\n\t\tsupports: [\n\t\t\t'title',\n\t\t\t'editor',\n\t\t\t'author',\n\t\t\t'thumbnail',\n\t\t\t'page-attributes',\n\t\t\t'custom-fields',\n\t\t\t'comments',\n\t\t\t'revisions',\n\t\t],\n\t\ttaxonomies: [],\n\t\thasArchive: false,\n\t\trewrite: { slug: '', withFront: false },\n\t\tmenuPosition: 20,\n\t\tcapability_type: 'page',\n\t},\n\t{\n\t\tname: 'attachment',\n\t\tlabel: 'Media',\n\t\tlabels: { singular: 'Media', plural: 'Media' },\n\t\tpublic: true,\n\t\thierarchical: false,\n\t\tshowInRest: true,\n\t\trestBase: 'media',\n\t\tsupports: ['title', 'author', 'comments'],\n\t\ttaxonomies: [],\n\t\thasArchive: false,\n\t\trewrite: false,\n\t\tcapability_type: 'post',\n\t},\n\t{\n\t\tname: 'revision',\n\t\tlabel: 'Revisions',\n\t\tlabels: { singular: 'Revision', plural: 'Revisions' },\n\t\tpublic: false,\n\t\thierarchical: false,\n\t\tshowInRest: false,\n\t\tsupports: ['author'],\n\t\ttaxonomies: [],\n\t\thasArchive: false,\n\t\trewrite: false,\n\t\tcapability_type: 'post',\n\t},\n\t{\n\t\tname: 'nav_menu_item',\n\t\tlabel: 'Navigation Menu Items',\n\t\tlabels: { singular: 'Navigation Menu Item', plural: 'Navigation Menu Items' },\n\t\tpublic: false,\n\t\thierarchical: false,\n\t\tshowInRest: false,\n\t\tsupports: [],\n\t\ttaxonomies: ['nav_menu'],\n\t\thasArchive: false,\n\t\trewrite: false,\n\t\tcapability_type: 'post',\n\t},\n];\n","import type { TaxonomyDefinition } from './types';\n\n/**\n * Registry for taxonomies (categories, tags, custom taxonomies).\n */\nexport class TaxonomyRegistry {\n\tprivate taxonomies: Map<string, TaxonomyDefinition> = new Map();\n\n\tregister(definition: TaxonomyDefinition): void {\n\t\tif (this.taxonomies.has(definition.name)) {\n\t\t\tthrow new Error(`Taxonomy \"${definition.name}\" is already registered.`);\n\t\t}\n\t\tthis.taxonomies.set(definition.name, definition);\n\t}\n\n\tget(name: string): TaxonomyDefinition | undefined {\n\t\treturn this.taxonomies.get(name);\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.taxonomies.has(name);\n\t}\n\n\tgetAll(): TaxonomyDefinition[] {\n\t\treturn [...this.taxonomies.values()];\n\t}\n\n\t/**\n\t * Get taxonomies assigned to a specific object type (e.g., 'post').\n\t */\n\tgetForObjectType(objectType: string): TaxonomyDefinition[] {\n\t\treturn this.getAll().filter((t) => t.objectTypes.includes(objectType));\n\t}\n\n\tgetRestVisible(): TaxonomyDefinition[] {\n\t\treturn this.getAll().filter((t) => t.showInRest === true);\n\t}\n\n\tunregister(name: string): boolean {\n\t\treturn this.taxonomies.delete(name);\n\t}\n\n\treset(): void {\n\t\tthis.taxonomies.clear();\n\t}\n}\n\nexport const BUILTIN_TAXONOMIES: TaxonomyDefinition[] = [\n\t{\n\t\tname: 'category',\n\t\tobjectTypes: ['post'],\n\t\tlabel: 'Categories',\n\t\tlabels: { singular: 'Category', plural: 'Categories' },\n\t\tpublic: true,\n\t\thierarchical: true,\n\t\tshowInRest: true,\n\t\trestBase: 'categories',\n\t\trewrite: { slug: 'category', withFront: true, hierarchical: true },\n\t},\n\t{\n\t\tname: 'post_tag',\n\t\tobjectTypes: ['post'],\n\t\tlabel: 'Tags',\n\t\tlabels: { singular: 'Tag', plural: 'Tags' },\n\t\tpublic: true,\n\t\thierarchical: false,\n\t\tshowInRest: true,\n\t\trestBase: 'tags',\n\t\trewrite: { slug: 'tag', withFront: true },\n\t},\n\t{\n\t\tname: 'nav_menu',\n\t\tobjectTypes: ['nav_menu_item'],\n\t\tlabel: 'Navigation Menus',\n\t\tlabels: { singular: 'Navigation Menu', plural: 'Navigation Menus' },\n\t\tpublic: false,\n\t\thierarchical: false,\n\t\tshowInRest: false,\n\t\trewrite: false,\n\t},\n];\n","/**\n * Extension manifest — equivalent to plugin headers in the spec.\n * Found in the extension's manifest.json file.\n */\nexport interface ExtensionManifest {\n\t/** Unique slug identifier */\n\tslug: string;\n\t/** Display name */\n\tname: string;\n\t/** Semantic version */\n\tversion: string;\n\t/** Short description */\n\tdescription?: string;\n\t/** Author name */\n\tauthor?: string;\n\t/** Author URL */\n\tauthorUri?: string;\n\t/** Minimum CMS version required */\n\tminCmsVersion?: string;\n\t/** Minimum Node.js version required */\n\tminNodeVersion?: string;\n\t/** Dependencies (slugs of other extensions) */\n\tdependencies?: string[];\n\t/** Text domain for i18n */\n\ttextDomain?: string;\n\t/** Whether this is a network-wide extension (multisite) */\n\tnetwork?: boolean;\n\t/** Entry point file (relative to extension dir). Default: index.ts */\n\tmain?: string;\n}\n\nexport type ExtensionStatus = 'active' | 'inactive' | 'paused' | 'must-use';\n\nexport interface ExtensionEntry {\n\tmanifest: ExtensionManifest;\n\tstatus: ExtensionStatus;\n\t/** Absolute path to the extension directory */\n\tpath: string;\n\t/** Error that caused the extension to be paused */\n\tpauseReason?: string;\n\t/** When the extension was activated */\n\tactivatedAt?: Date;\n}\n\n/**\n * Registry that tracks all discovered and active extensions.\n *\n * Extensions go through these states:\n * discovered → activated → loaded → running\n * activated → paused (on fatal error, via recovery mode)\n * running → deactivated → inactive\n */\nexport class ExtensionRegistry {\n\tprivate extensions: Map<string, ExtensionEntry> = new Map();\n\n\t/**\n\t * Register an extension manifest (discovery phase).\n\t */\n\tregister(manifest: ExtensionManifest, path: string, status: ExtensionStatus): void {\n\t\tthis.extensions.set(manifest.slug, {\n\t\t\tmanifest,\n\t\t\tstatus,\n\t\t\tpath,\n\t\t\tactivatedAt: status === 'active' ? new Date() : undefined,\n\t\t});\n\t}\n\n\tget(slug: string): ExtensionEntry | undefined {\n\t\treturn this.extensions.get(slug);\n\t}\n\n\thas(slug: string): boolean {\n\t\treturn this.extensions.has(slug);\n\t}\n\n\t/**\n\t * Get all extensions by status.\n\t */\n\tgetByStatus(status: ExtensionStatus): ExtensionEntry[] {\n\t\treturn [...this.extensions.values()].filter((e) => e.status === status);\n\t}\n\n\tgetAll(): ExtensionEntry[] {\n\t\treturn [...this.extensions.values()];\n\t}\n\n\tgetActive(): ExtensionEntry[] {\n\t\treturn this.getByStatus('active');\n\t}\n\n\tgetMustUse(): ExtensionEntry[] {\n\t\treturn this.getByStatus('must-use');\n\t}\n\n\tgetPaused(): ExtensionEntry[] {\n\t\treturn this.getByStatus('paused');\n\t}\n\n\t/**\n\t * Activate an extension. Checks dependencies first.\n\t *\n\t * @throws If dependencies are not met\n\t */\n\tactivate(slug: string): void {\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry) throw new Error(`Extension \"${slug}\" not found`);\n\t\tif (entry.status === 'active') return;\n\n\t\t// Check dependencies\n\t\tconst unmet = this.getUnmetDependencies(slug);\n\t\tif (unmet.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot activate \"${slug}\": missing dependencies: ${unmet.join(', ')}`,\n\t\t\t);\n\t\t}\n\n\t\tentry.status = 'active';\n\t\tentry.activatedAt = new Date();\n\t\tentry.pauseReason = undefined;\n\t}\n\n\t/**\n\t * Deactivate an extension. Checks if other extensions depend on it.\n\t *\n\t * @throws If other active extensions depend on this one\n\t */\n\tdeactivate(slug: string): void {\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry) throw new Error(`Extension \"${slug}\" not found`);\n\t\tif (entry.status === 'inactive') return;\n\t\tif (entry.status === 'must-use') {\n\t\t\tthrow new Error(`Cannot deactivate must-use extension \"${slug}\"`);\n\t\t}\n\n\t\t// Check if other active extensions depend on this one\n\t\tconst dependents = this.getDependents(slug);\n\t\tif (dependents.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot deactivate \"${slug}\": required by: ${dependents.map((d) => d.manifest.slug).join(', ')}`,\n\t\t\t);\n\t\t}\n\n\t\tentry.status = 'inactive';\n\t\tentry.activatedAt = undefined;\n\t}\n\n\t/**\n\t * Pause an extension due to a fatal error (recovery mode).\n\t */\n\tpause(slug: string, reason: string): void {\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry) return;\n\t\tentry.status = 'paused';\n\t\tentry.pauseReason = reason;\n\t}\n\n\t/**\n\t * Unpause an extension (resume from recovery mode).\n\t */\n\tunpause(slug: string): void {\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry || entry.status !== 'paused') return;\n\t\tentry.status = 'active';\n\t\tentry.pauseReason = undefined;\n\t}\n\n\t/**\n\t * Remove an extension from the registry entirely.\n\t */\n\tunregister(slug: string): boolean {\n\t\treturn this.extensions.delete(slug);\n\t}\n\n\t/**\n\t * Get dependencies that are not active.\n\t */\n\tgetUnmetDependencies(slug: string): string[] {\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry) return [];\n\t\tconst deps = entry.manifest.dependencies ?? [];\n\t\treturn deps.filter((dep) => {\n\t\t\tconst depEntry = this.extensions.get(dep);\n\t\t\treturn !depEntry || (depEntry.status !== 'active' && depEntry.status !== 'must-use');\n\t\t});\n\t}\n\n\t/**\n\t * Get active extensions that depend on the given extension.\n\t */\n\tgetDependents(slug: string): ExtensionEntry[] {\n\t\treturn this.getActive().filter((entry) =>\n\t\t\tentry.manifest.dependencies?.includes(slug),\n\t\t);\n\t}\n\n\t/**\n\t * Check for circular dependencies starting from a slug.\n\t */\n\thasCircularDependency(slug: string, visited: Set<string> = new Set()): boolean {\n\t\tif (visited.has(slug)) return true;\n\t\tvisited.add(slug);\n\n\t\tconst entry = this.extensions.get(slug);\n\t\tif (!entry) return false;\n\n\t\tfor (const dep of entry.manifest.dependencies ?? []) {\n\t\t\tif (this.hasCircularDependency(dep, new Set(visited))) return true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\treset(): void {\n\t\tthis.extensions.clear();\n\t}\n}\n","/**\n * Theme manifest — found in the theme's theme.json file.\n */\nexport interface ThemeManifest {\n\tslug: string;\n\tname: string;\n\tversion: string;\n\tdescription?: string;\n\tauthor?: string;\n\tauthorUri?: string;\n\t/** Parent theme slug (for child themes) */\n\tparent?: string;\n\t/** Supported features */\n\tsupports?: ThemeSupports;\n\t/** Menu locations */\n\tmenuLocations?: Record<string, string>;\n\t/** Design tokens / settings */\n\tsettings?: Record<string, unknown>;\n}\n\nexport interface ThemeSupports {\n\tthumbnails?: boolean;\n\tpostFormats?: string[];\n\thtml5?: string[];\n\tcustomLogo?: { width?: number; height?: number; flexWidth?: boolean; flexHeight?: boolean };\n\tcustomHeader?: { width?: number; height?: number; flexWidth?: boolean; flexHeight?: boolean };\n\tcustomBackground?: boolean;\n\tmenus?: boolean;\n\tfeedLinks?: boolean;\n\tresponsiveEmbeds?: boolean;\n\tblockTemplates?: boolean;\n}\n\nexport interface ThemeEntry {\n\tmanifest: ThemeManifest;\n\tpath: string;\n\tactive: boolean;\n\tparentTheme?: ThemeEntry;\n}\n\n/**\n * Registry for installed themes.\n */\nexport class ThemeRegistry {\n\tprivate themes: Map<string, ThemeEntry> = new Map();\n\tprivate activeSlug: string | null = null;\n\n\tregister(manifest: ThemeManifest, path: string): void {\n\t\tthis.themes.set(manifest.slug, { manifest, path, active: false });\n\t}\n\n\tget(slug: string): ThemeEntry | undefined {\n\t\treturn this.themes.get(slug);\n\t}\n\n\tgetAll(): ThemeEntry[] {\n\t\treturn [...this.themes.values()];\n\t}\n\n\tgetActive(): ThemeEntry | undefined {\n\t\tif (!this.activeSlug) return undefined;\n\t\treturn this.themes.get(this.activeSlug);\n\t}\n\n\t/**\n\t * Activate a theme. Resolves parent theme for child themes.\n\t */\n\tactivate(slug: string): void {\n\t\tconst theme = this.themes.get(slug);\n\t\tif (!theme) throw new Error(`Theme \"${slug}\" not found`);\n\n\t\t// Deactivate current\n\t\tif (this.activeSlug) {\n\t\t\tconst current = this.themes.get(this.activeSlug);\n\t\t\tif (current) current.active = false;\n\t\t}\n\n\t\t// Resolve parent for child themes\n\t\tif (theme.manifest.parent) {\n\t\t\tconst parent = this.themes.get(theme.manifest.parent);\n\t\t\tif (!parent) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Parent theme \"${theme.manifest.parent}\" not found for child theme \"${slug}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\ttheme.parentTheme = parent;\n\t\t}\n\n\t\ttheme.active = true;\n\t\tthis.activeSlug = slug;\n\t}\n\n\t/**\n\t * Check if the active theme supports a feature.\n\t */\n\tsupports(feature: keyof ThemeSupports): boolean {\n\t\tconst active = this.getActive();\n\t\tif (!active) return false;\n\n\t\tconst supports = active.manifest.supports;\n\t\tif (!supports) return false;\n\n\t\tconst value = supports[feature];\n\t\tif (value === undefined || value === false) return false;\n\t\treturn true;\n\t}\n\n\treset(): void {\n\t\tthis.themes.clear();\n\t\tthis.activeSlug = null;\n\t}\n}\n\n/**\n * Template hierarchy resolver.\n *\n * Given query flags and context, returns an ordered list of template\n * names to search for (most specific first).\n */\nexport interface TemplateContext {\n\ttype: 'single' | 'page' | 'category' | 'tag' | 'taxonomy' | 'author' | 'date' | 'search' | '404' | 'home' | 'archive' | 'attachment';\n\tslug?: string;\n\tid?: number;\n\tpostType?: string;\n\ttaxonomy?: string;\n\tterm?: string;\n\tmimeType?: string;\n\tmimeSubtype?: string;\n\tnicename?: string;\n\tcustomTemplate?: string;\n}\n\nexport function resolveTemplateHierarchy(ctx: TemplateContext): string[] {\n\tswitch (ctx.type) {\n\t\tcase 'single':\n\t\t\treturn [\n\t\t\t\tctx.postType && ctx.slug ? `${ctx.postType}-${ctx.slug}` : null,\n\t\t\t\tctx.postType ?? null,\n\t\t\t\t'singular',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'page':\n\t\t\treturn [\n\t\t\t\tctx.customTemplate ?? null,\n\t\t\t\tctx.slug ? `page-${ctx.slug}` : null,\n\t\t\t\tctx.id ? `page-${ctx.id}` : null,\n\t\t\t\t'page',\n\t\t\t\t'singular',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'category':\n\t\t\treturn [\n\t\t\t\tctx.slug ? `category-${ctx.slug}` : null,\n\t\t\t\tctx.id ? `category-${ctx.id}` : null,\n\t\t\t\t'category',\n\t\t\t\t'archive',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'tag':\n\t\t\treturn [\n\t\t\t\tctx.slug ? `tag-${ctx.slug}` : null,\n\t\t\t\tctx.id ? `tag-${ctx.id}` : null,\n\t\t\t\t'tag',\n\t\t\t\t'archive',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'taxonomy':\n\t\t\treturn [\n\t\t\t\tctx.taxonomy && ctx.term ? `taxonomy-${ctx.taxonomy}-${ctx.term}` : null,\n\t\t\t\tctx.taxonomy && ctx.id ? `taxonomy-${ctx.taxonomy}-${ctx.id}` : null,\n\t\t\t\tctx.taxonomy ? `taxonomy-${ctx.taxonomy}` : null,\n\t\t\t\t'taxonomy',\n\t\t\t\t'archive',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'author':\n\t\t\treturn [\n\t\t\t\tctx.nicename ? `author-${ctx.nicename}` : null,\n\t\t\t\tctx.id ? `author-${ctx.id}` : null,\n\t\t\t\t'author',\n\t\t\t\t'archive',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tcase 'date':\n\t\t\treturn ['date', 'archive', 'index'];\n\n\t\tcase 'search':\n\t\t\treturn ['search', 'index'];\n\n\t\tcase '404':\n\t\t\treturn ['404', 'index'];\n\n\t\tcase 'home':\n\t\t\treturn ['front-page', 'home', 'index'];\n\n\t\tcase 'archive':\n\t\t\treturn ['archive', 'index'];\n\n\t\tcase 'attachment':\n\t\t\treturn [\n\t\t\t\tctx.mimeType && ctx.mimeSubtype\n\t\t\t\t\t? `${ctx.mimeType}-${ctx.mimeSubtype}`\n\t\t\t\t\t: null,\n\t\t\t\tctx.mimeSubtype ?? null,\n\t\t\t\tctx.mimeType ?? null,\n\t\t\t\t'attachment',\n\t\t\t\t'single',\n\t\t\t\t'index',\n\t\t\t].filter(Boolean) as string[];\n\n\t\tdefault:\n\t\t\treturn ['index'];\n\t}\n}\n","import type { HookEngine } from './hook-engine';\n\n/**\n * The 17 bootstrap phases as defined in the spec.\n * Each phase is a named step executed in strict order during startup.\n */\nexport const BOOTSTRAP_PHASES = [\n\t'entry_point', // 1. HTTP request received\n\t'configuration', // 2. Load config (DB, keys, flags)\n\t'initial_constants', // 3. Define constants, memory limits\n\t'environment_check', // 4. Validate runtime versions\n\t'error_handling', // 5. Register fatal error handler + recovery mode\n\t'core_functions', // 6. Load core utility modules\n\t'database_connect', // 7. Connect to database (+ drop-in check)\n\t'object_cache', // 8. Initialize cache system (+ drop-in check)\n\t'default_filters', // 9. Register all core hooks/filters\n\t'must_use_extensions', // 10. Load must-use extensions (alphabetical)\n\t'regular_extensions', // 11. Load active extensions (skip paused)\n\t'overridable_functions', // 12. Load auth/hash/nonce functions (skip if overridden)\n\t'extensions_loaded', // 13. Fire \"extensions_loaded\" hook\n\t'global_objects', // 14. Create query engine, rewrite, widgets, roles\n\t'theme', // 15. Load active theme (child → parent)\n\t'init', // 16. Fire \"init\" hook (register types, taxonomies, etc.)\n\t'system_loaded', // 17. Fire \"cms_loaded\" hook\n] as const;\n\nexport type BootstrapPhase = (typeof BOOTSTRAP_PHASES)[number];\n\n/**\n * Callback for a bootstrap phase.\n */\nexport type PhaseHandler = () => void | Promise<void>;\n\n/**\n * Orchestrates the CMS bootstrap process through 17 ordered phases.\n *\n * Each phase can have multiple handlers registered. Handlers within a phase\n * run in registration order. Phases are always executed in the order defined\n * by BOOTSTRAP_PHASES.\n *\n * The HookEngine fires a hook for each phase, allowing extensions to tap in.\n */\nexport class BootstrapManager {\n\tprivate phaseHandlers: Map<BootstrapPhase, PhaseHandler[]> = new Map();\n\tprivate completedPhases: Set<BootstrapPhase> = new Set();\n\tprivate currentPhase: BootstrapPhase | null = null;\n\n\tconstructor(private hooks: HookEngine) {\n\t\tfor (const phase of BOOTSTRAP_PHASES) {\n\t\t\tthis.phaseHandlers.set(phase, []);\n\t\t}\n\t}\n\n\t/**\n\t * Register a handler for a bootstrap phase.\n\t */\n\ton(phase: BootstrapPhase, handler: PhaseHandler): void {\n\t\tconst handlers = this.phaseHandlers.get(phase);\n\t\tif (!handlers) throw new Error(`Unknown bootstrap phase: \"${phase}\"`);\n\t\thandlers.push(handler);\n\t}\n\n\t/**\n\t * Execute all 17 bootstrap phases in order.\n\t * For short-init mode, pass a phase to stop at.\n\t */\n\tasync run(stopAfter?: BootstrapPhase): Promise<void> {\n\t\tfor (const phase of BOOTSTRAP_PHASES) {\n\t\t\tthis.currentPhase = phase;\n\n\t\t\t// Execute registered handlers for this phase\n\t\t\tconst handlers = this.phaseHandlers.get(phase) ?? [];\n\t\t\tfor (const handler of handlers) {\n\t\t\t\tawait handler();\n\t\t\t}\n\n\t\t\t// Fire the hook for this phase\n\t\t\tawait this.hooks.doAction(`bootstrap:${phase}`);\n\n\t\t\tthis.completedPhases.add(phase);\n\t\t\tthis.currentPhase = null;\n\n\t\t\t// Short-init: stop early if requested\n\t\t\tif (stopAfter === phase) break;\n\t\t}\n\n\t\t// Fire the final \"system loaded\" action if we completed all phases\n\t\tif (!stopAfter || stopAfter === 'system_loaded') {\n\t\t\tawait this.hooks.doAction('cms_loaded');\n\t\t}\n\t}\n\n\t/**\n\t * Check if a phase has been completed.\n\t */\n\tisPhaseComplete(phase: BootstrapPhase): boolean {\n\t\treturn this.completedPhases.has(phase);\n\t}\n\n\t/**\n\t * Get the phase currently being executed.\n\t */\n\tgetCurrentPhase(): BootstrapPhase | null {\n\t\treturn this.currentPhase;\n\t}\n\n\t/**\n\t * Get all completed phases.\n\t */\n\tgetCompletedPhases(): BootstrapPhase[] {\n\t\treturn [...this.completedPhases];\n\t}\n\n\t/**\n\t * Reset — for testing.\n\t */\n\treset(): void {\n\t\tthis.completedPhases.clear();\n\t\tthis.currentPhase = null;\n\t\tfor (const phase of BOOTSTRAP_PHASES) {\n\t\t\tthis.phaseHandlers.set(phase, []);\n\t\t}\n\t}\n}\n","/**\n * Generic hook callback. Used for both actions and filters.\n * Actions ignore the return value; filters chain it.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type HookCallback = (...args: any[]) => any;\n\n/**\n * A registered hook handler with its metadata.\n */\nexport interface HookHandler {\n\t/** The callback function */\n\tcallback: HookCallback;\n\t/** Execution priority (lower = earlier). Default: 10 */\n\tpriority: number;\n\t/** Number of arguments the callback accepts */\n\tacceptedArgs: number;\n\t/** Unique identifier for this handler */\n\tid: string;\n}\n\n/**\n * Represents a hook currently being executed in the stack.\n */\nexport interface HookStackEntry {\n\t/** The hook name being executed */\n\tname: string;\n\t/** Current iteration index within the priority groups */\n\tcurrentIndex: number;\n}\n\n/**\n * Options for adding a hook.\n */\nexport interface AddHookOptions {\n\t/** Execution priority. Default: 10 */\n\tpriority?: number;\n\t/** Number of arguments the callback accepts. Default: 1 */\n\tacceptedArgs?: number;\n}\n\n/**\n * Result of checking if a hook has handlers.\n * Returns false if no handlers, or the priority of the first matching handler.\n */\nexport type HasHookResult = false | number;\n\n/**\n * Registered post type definition.\n */\nexport interface PostTypeDefinition {\n\tname: string;\n\tlabel: string;\n\tlabels?: Record<string, string>;\n\tpublic?: boolean;\n\thierarchical?: boolean;\n\tshowInRest?: boolean;\n\trestBase?: string;\n\tsupports?: string[];\n\ttaxonomies?: string[];\n\thasArchive?: boolean;\n\trewrite?: { slug: string; withFront?: boolean } | false;\n\tmenuPosition?: number;\n\tmenuIcon?: string;\n\tcapability_type?: string;\n\tcapabilities?: Record<string, string>;\n}\n\n/**\n * Registered taxonomy definition.\n */\nexport interface TaxonomyDefinition {\n\tname: string;\n\tobjectTypes: string[];\n\tlabel: string;\n\tlabels?: Record<string, string>;\n\tpublic?: boolean;\n\thierarchical?: boolean;\n\tshowInRest?: boolean;\n\trestBase?: string;\n\trewrite?: { slug: string; withFront?: boolean; hierarchical?: boolean } | false;\n}\n\n/**\n * User capability check context.\n */\nexport interface CapabilityContext {\n\tuserId: number;\n\tcapability: string;\n\tobjectId?: number;\n}\n\n/**\n * Standard post statuses.\n */\nexport const POST_STATUS = {\n\tPUBLISH: 'publish',\n\tDRAFT: 'draft',\n\tPENDING: 'pending',\n\tPRIVATE: 'private',\n\tTRASH: 'trash',\n\tAUTO_DRAFT: 'auto-draft',\n\tINHERIT: 'inherit',\n\tFUTURE: 'future',\n} as const;\n\n/**\n * Default user roles.\n */\nexport const USER_ROLES = {\n\tADMINISTRATOR: 'administrator',\n\tEDITOR: 'editor',\n\tAUTHOR: 'author',\n\tCONTRIBUTOR: 'contributor',\n\tSUBSCRIBER: 'subscriber',\n} as const;\n\n/**\n * Default hook priorities.\n */\nexport const HOOK_PRIORITY = {\n\tEARLIEST: 1,\n\tEARLY: 5,\n\tDEFAULT: 10,\n\tLATE: 15,\n\tLATEST: 20,\n} as const;\n","/**\n * Shortcode system — register named patterns with callbacks,\n * then process content to replace shortcodes with rendered output.\n *\n * Syntax: [name attr=\"value\"]content[/name] or [name attr=\"value\" /]\n */\n\nexport type ShortcodeCallback = (\n\tattributes: Record<string, string>,\n\tcontent: string,\n\ttag: string,\n) => string;\n\nexport class ShortcodeRegistry {\n\tprivate handlers: Map<string, ShortcodeCallback> = new Map();\n\n\tregister(tag: string, callback: ShortcodeCallback): void {\n\t\tthis.handlers.set(tag, callback);\n\t}\n\n\tunregister(tag: string): boolean {\n\t\treturn this.handlers.delete(tag);\n\t}\n\n\thas(tag: string): boolean {\n\t\treturn this.handlers.has(tag);\n\t}\n\n\t/**\n\t * Process a string, replacing all registered shortcodes with their output.\n\t * Supports nesting: inner shortcodes are processed first.\n\t */\n\tprocess(content: string): string {\n\t\tif (this.handlers.size === 0) return content;\n\n\t\tconst tagPattern = [...this.handlers.keys()].map(escRegex).join('|');\n\n\t\t// Self-closing: [tag attr=\"val\" /]\n\t\tconst selfClosingRe = new RegExp(\n\t\t\t`\\\\[(${tagPattern})(\\\\s[^\\\\]]*?)?\\\\s*\\\\/\\\\]`,\n\t\t\t'g',\n\t\t);\n\n\t\t// Enclosing: [tag attr=\"val\"]content[/tag]\n\t\tconst enclosingRe = new RegExp(\n\t\t\t`\\\\[(${tagPattern})(\\\\s[^\\\\]]*?)?\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/\\\\1\\\\]`,\n\t\t\t'g',\n\t\t);\n\n\t\tlet result = content;\n\n\t\t// Process enclosing first (inner to outer via iteration)\n\t\tlet prevResult = '';\n\t\tlet iterations = 0;\n\t\twhile (result !== prevResult && iterations < 10) {\n\t\t\tprevResult = result;\n\t\t\tresult = result.replace(enclosingRe, (full, tag: string, attrStr: string, inner: string) => {\n\t\t\t\tconst handler = this.handlers.get(tag);\n\t\t\t\tif (!handler) return full;\n\t\t\t\tconst attrs = parseShortcodeAttributes(attrStr?.trim() ?? '');\n\t\t\t\treturn handler(attrs, inner, tag);\n\t\t\t});\n\t\t\titerations++;\n\t\t}\n\n\t\t// Process self-closing\n\t\tresult = result.replace(selfClosingRe, (full, tag: string, attrStr: string) => {\n\t\t\tconst handler = this.handlers.get(tag);\n\t\t\tif (!handler) return full;\n\t\t\tconst attrs = parseShortcodeAttributes(attrStr?.trim() ?? '');\n\t\t\treturn handler(attrs, '', tag);\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Strip all shortcodes from content (remove tags, keep content).\n\t */\n\tstrip(content: string): string {\n\t\tconst tagPattern = [...this.handlers.keys()].map(escRegex).join('|');\n\t\tif (!tagPattern) return content;\n\n\t\tlet result = content;\n\t\tresult = result.replace(\n\t\t\tnew RegExp(`\\\\[(${tagPattern})(\\\\s[^\\\\]]*?)?\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/\\\\1\\\\]`, 'g'),\n\t\t\t'$3',\n\t\t);\n\t\tresult = result.replace(\n\t\t\tnew RegExp(`\\\\[(${tagPattern})(\\\\s[^\\\\]]*?)?\\\\s*\\\\/\\\\]`, 'g'),\n\t\t\t'',\n\t\t);\n\t\treturn result;\n\t}\n\n\tgetAll(): string[] {\n\t\treturn [...this.handlers.keys()];\n\t}\n\n\treset(): void {\n\t\tthis.handlers.clear();\n\t}\n}\n\nfunction parseShortcodeAttributes(attrStr: string): Record<string, string> {\n\tconst attrs: Record<string, string> = {};\n\tif (!attrStr) return attrs;\n\n\tconst re = /([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))|([a-zA-Z_][-a-zA-Z0-9_]*)/g;\n\tlet match;\n\twhile ((match = re.exec(attrStr)) !== null) {\n\t\tif (match[1]) {\n\t\t\tattrs[match[1]] = match[2] ?? match[3] ?? match[4] ?? '';\n\t\t} else if (match[5]) {\n\t\t\tattrs[match[5]] = '';\n\t\t}\n\t}\n\treturn attrs;\n}\n\nfunction escRegex(s: string): string {\n\treturn s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * Menu navigation system — register menu locations and manage menu items.\n */\n\nexport interface MenuLocation {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface MenuItem {\n\tid: number;\n\ttitle: string;\n\turl: string;\n\ttarget?: string;\n\tcssClasses?: string[];\n\tdescription?: string;\n\t/** Type: custom, post_type, taxonomy */\n\ttype: 'custom' | 'post_type' | 'taxonomy';\n\t/** Object ID (post ID or term ID) for non-custom items */\n\tobjectId?: number;\n\t/** Post type or taxonomy name */\n\tobjectType?: string;\n\t/** Parent item ID (0 for top-level) */\n\tparentId: number;\n\t/** Sort order */\n\tmenuOrder: number;\n\t/** Children (built client-side from parentId) */\n\tchildren?: MenuItem[];\n}\n\nexport class MenuRegistry {\n\tprivate locations: Map<string, MenuLocation> = new Map();\n\n\t/**\n\t * Register a menu location (e.g., \"primary\", \"footer\").\n\t */\n\tregisterLocation(name: string, description: string): void {\n\t\tthis.locations.set(name, { name, description });\n\t}\n\n\t/**\n\t * Unregister a menu location.\n\t */\n\tunregisterLocation(name: string): boolean {\n\t\treturn this.locations.delete(name);\n\t}\n\n\t/**\n\t * Get all registered locations.\n\t */\n\tgetLocations(): MenuLocation[] {\n\t\treturn [...this.locations.values()];\n\t}\n\n\t/**\n\t * Check if a location is registered.\n\t */\n\thasLocation(name: string): boolean {\n\t\treturn this.locations.has(name);\n\t}\n\n\t/**\n\t * Build a tree from a flat list of menu items using parentId.\n\t */\n\tstatic buildTree(items: MenuItem[]): MenuItem[] {\n\t\tconst map = new Map<number, MenuItem>();\n\t\tconst roots: MenuItem[] = [];\n\n\t\t// Sort by menuOrder\n\t\tconst sorted = [...items].sort((a, b) => a.menuOrder - b.menuOrder);\n\n\t\tfor (const item of sorted) {\n\t\t\tmap.set(item.id, { ...item, children: [] });\n\t\t}\n\n\t\tfor (const item of sorted) {\n\t\t\tconst node = map.get(item.id)!;\n\t\t\tif (item.parentId === 0) {\n\t\t\t\troots.push(node);\n\t\t\t} else {\n\t\t\t\tconst parent = map.get(item.parentId);\n\t\t\t\tif (parent) {\n\t\t\t\t\tparent.children = parent.children ?? [];\n\t\t\t\t\tparent.children.push(node);\n\t\t\t\t} else {\n\t\t\t\t\troots.push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn roots;\n\t}\n\n\treset(): void {\n\t\tthis.locations.clear();\n\t}\n}\n","/**\n * URL Rewrite system — maps URL patterns to query variables.\n *\n * Permalink structures use tags like %year%, %monthnum%, %postname%.\n * The rewriter converts these to regex patterns that capture named groups,\n * then resolves a URL path into query parameters.\n */\n\nexport interface RewriteRule {\n\t/** Regex pattern to match against the URL path */\n\tpattern: RegExp;\n\t/** Named query variables extracted from the match */\n\tqueryVars: string[];\n\t/** Source (e.g., \"post_permalink\", \"category\", \"custom\") */\n\tsource: string;\n\t/** Priority for ordering (lower = earlier) */\n\tpriority: number;\n}\n\nexport interface RewriteResult {\n\tmatched: boolean;\n\trule?: RewriteRule;\n\tqueryVars: Record<string, string>;\n}\n\n/**\n * Permalink structure tags and their regex equivalents.\n */\nconst STRUCTURE_TAGS: Record<string, { regex: string; queryVar: string }> = {\n\t'%year%': { regex: '(?<year>\\\\d{4})', queryVar: 'year' },\n\t'%monthnum%': { regex: '(?<monthnum>\\\\d{2})', queryVar: 'monthnum' },\n\t'%day%': { regex: '(?<day>\\\\d{2})', queryVar: 'day' },\n\t'%hour%': { regex: '(?<hour>\\\\d{2})', queryVar: 'hour' },\n\t'%minute%': { regex: '(?<minute>\\\\d{2})', queryVar: 'minute' },\n\t'%second%': { regex: '(?<second>\\\\d{2})', queryVar: 'second' },\n\t'%postname%': { regex: '(?<postname>[^/]+)', queryVar: 'name' },\n\t'%post_id%': { regex: '(?<post_id>\\\\d+)', queryVar: 'p' },\n\t'%category%': { regex: '(?<category>[^/]+)', queryVar: 'category_name' },\n\t'%tag%': { regex: '(?<tag>[^/]+)', queryVar: 'tag' },\n\t'%author%': { regex: '(?<author>[^/]+)', queryVar: 'author_name' },\n\t'%pagename%': { regex: '(?<pagename>[^/]+)', queryVar: 'pagename' },\n};\n\nexport class UrlRewriter {\n\tprivate rules: RewriteRule[] = [];\n\n\t/**\n\t * Add a rewrite rule.\n\t */\n\taddRule(pattern: RegExp, queryVars: string[], source: string, priority: number = 10): void {\n\t\tthis.rules.push({ pattern, queryVars, source, priority });\n\t\tthis.rules.sort((a, b) => a.priority - b.priority);\n\t}\n\n\t/**\n\t * Generate rules from a permalink structure string.\n\t * E.g., \"/%year%/%monthnum%/%postname%/\"\n\t */\n\taddPermalinkStructure(structure: string, source: string = 'post_permalink'): void {\n\t\tlet regexStr = structure;\n\t\tconst queryVars: string[] = [];\n\n\t\tfor (const [tag, def] of Object.entries(STRUCTURE_TAGS)) {\n\t\t\tif (regexStr.includes(tag)) {\n\t\t\t\tregexStr = regexStr.replace(tag, def.regex);\n\t\t\t\tqueryVars.push(def.queryVar);\n\t\t\t}\n\t\t}\n\n\t\t// Clean up leading/trailing slashes for matching\n\t\tregexStr = regexStr.replace(/^\\//, '').replace(/\\/$/, '');\n\t\tconst pattern = new RegExp(`^${regexStr}/?$`);\n\n\t\tthis.addRule(pattern, queryVars, source, 5);\n\t}\n\n\t/**\n\t * Add default rules for categories, tags, authors, search, pages, feeds.\n\t */\n\taddDefaultRules(): void {\n\t\tthis.addRule(/^category\\/(?<category>[^/]+)\\/?$/, ['category_name'], 'category', 10);\n\t\tthis.addRule(/^tag\\/(?<tag>[^/]+)\\/?$/, ['tag'], 'tag', 10);\n\t\tthis.addRule(/^author\\/(?<author>[^/]+)\\/?$/, ['author_name'], 'author', 10);\n\t\tthis.addRule(/^search\\/(?<s>.+)\\/?$/, ['s'], 'search', 10);\n\t\tthis.addRule(/^page\\/(?<paged>\\d+)\\/?$/, ['paged'], 'paging', 10);\n\t\tthis.addRule(/^feed\\/?(?<feed>rss2?|atom|rdf)?\\/?$/, ['feed'], 'feed', 10);\n\t\t// Catch-all for pages (lowest priority)\n\t\tthis.addRule(/^(?<pagename>[^/]+)\\/?$/, ['pagename'], 'page', 99);\n\t}\n\n\t/**\n\t * Resolve a URL path to query variables.\n\t */\n\tresolve(path: string): RewriteResult {\n\t\t// Normalize: strip leading/trailing slashes\n\t\tconst cleanPath = path.replace(/^\\//, '').replace(/\\/$/, '');\n\n\t\tfor (const rule of this.rules) {\n\t\t\tconst match = cleanPath.match(rule.pattern);\n\t\t\tif (match?.groups) {\n\t\t\t\tconst queryVars: Record<string, string> = {};\n\t\t\t\tfor (const [key, value] of Object.entries(match.groups)) {\n\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t// Map regex group name to query var name\n\t\t\t\t\t\tconst tag = Object.entries(STRUCTURE_TAGS).find(([_, def]) =>\n\t\t\t\t\t\t\tdef.regex.includes(`<${key}>`),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tqueryVars[tag ? tag[1].queryVar : key] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { matched: true, rule, queryVars };\n\t\t\t}\n\t\t}\n\n\t\treturn { matched: false, queryVars: {} };\n\t}\n\n\t/**\n\t * Build a permalink URL from a structure and values.\n\t * E.g., buildPermalink(\"/%year%/%monthnum%/%postname%/\", { year: \"2026\", monthnum: \"04\", postname: \"hello\" })\n\t * → \"/2026/04/hello/\"\n\t */\n\tstatic buildPermalink(structure: string, values: Record<string, string>): string {\n\t\tlet result = structure;\n\t\tfor (const [tag, def] of Object.entries(STRUCTURE_TAGS)) {\n\t\t\tif (result.includes(tag) && values[def.queryVar]) {\n\t\t\t\tresult = result.replace(tag, values[def.queryVar]);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tgetRules(): RewriteRule[] {\n\t\treturn [...this.rules];\n\t}\n\n\treset(): void {\n\t\tthis.rules = [];\n\t}\n}\n"],"mappings":"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","names":[]}
|