{"version":3,"file":"module-registry.mjs","sources":["../../../src/lib/vdom/module-registry.ts"],"sourcesContent":["/**\n * @file Module Registry\n * @module vdom/module-registry\n * @description Central module registration and dependency resolution system.\n * Provides module loading orchestration, HMR support, and module versioning.\n * Implements a directed acyclic graph for dependency management.\n *\n * @author Agent 5 - PhD Virtual DOM Expert\n * @version 1.0.0\n */\n\nimport type { ComponentType } from 'react';\nimport {\n  type ModuleId,\n  type ModuleBoundaryConfig,\n  type ModuleRegistryEntry,\n  type ModuleQueryOptions,\n  type ModuleDependency,\n  type ModuleSecurityConfig,\n  type HydrationConfig,\n  createModuleId,\n} from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * HMR update handler type.\n */\nexport type HMRUpdateHandler = (\n  moduleId: ModuleId,\n  newComponent: ComponentType<unknown>\n) => void;\n\n/**\n * Module registration options.\n */\nexport interface ModuleRegistrationOptions {\n  /** Dynamic import function for lazy loading */\n  loader?: () => Promise<{ default: ComponentType<unknown> }>;\n  /** Component if already loaded */\n  component?: ComponentType<unknown>;\n  /** Enable HMR support */\n  hmrEnabled?: boolean;\n  /** Module priority for loading */\n  priority?: number;\n  /** Prefetch hint */\n  prefetch?: boolean;\n}\n\n/**\n * Dependency resolution result.\n */\nexport interface DependencyResolutionResult {\n  /** Resolved modules in topological order */\n  resolved: ModuleId[];\n  /** Modules that failed to resolve */\n  failed: Array<{ moduleId: ModuleId; reason: string }>;\n  /** Circular dependency chains detected */\n  circularDependencies: ModuleId[][];\n}\n\n// ============================================================================\n// ModuleRegistry Class\n// ============================================================================\n\n/**\n * Central registry for module management.\n * Handles registration, dependency resolution, and HMR.\n *\n * @example\n * ```typescript\n * const registry = new ModuleRegistry();\n *\n * // Register a module\n * registry.register({\n *   id: createModuleId('my-module'),\n *   name: 'My Module',\n * }, {\n *   loader: () => import('./MyModule'),\n * });\n *\n * // Get module component\n * const component = await registry.getComponent(createModuleId('my-module'));\n * ```\n */\nexport class ModuleRegistry {\n  /** Registered modules */\n  private readonly modules: Map<ModuleId, ModuleRegistryEntry> = new Map();\n\n  /** HMR update handlers */\n  private readonly hmrHandlers: Set<HMRUpdateHandler> = new Set();\n\n  /** Dependency graph (moduleId -> dependsOn) */\n  private readonly dependencyGraph: Map<ModuleId, Set<ModuleId>> = new Map();\n\n  /** Reverse dependency graph (moduleId -> dependedOnBy) */\n  private readonly reverseDependencyGraph: Map<ModuleId, Set<ModuleId>> = new Map();\n\n  /** Module load promises for deduplication */\n  private readonly loadPromises: Map<ModuleId, Promise<ComponentType<unknown>>> =\n    new Map();\n\n  /** Module versions (for HMR) */\n  private readonly moduleVersions: Map<ModuleId, number> = new Map();\n\n  // ==========================================================================\n  // Registration\n  // ==========================================================================\n\n  /**\n   * Gets the count of registered modules.\n   */\n  get size(): number {\n    return this.modules.size;\n  }\n\n  /**\n   * Registers a module with the registry.\n   * @param config - Module configuration\n   * @param options - Registration options\n   * @returns Whether registration was successful\n   */\n  register(\n    config: ModuleBoundaryConfig,\n    options: ModuleRegistrationOptions = {}\n  ): boolean {\n    if (this.modules.has(config.id)) {\n      console.warn(`Module already registered: ${config.id}`);\n      return false;\n    }\n\n    const entry: ModuleRegistryEntry = {\n      config,\n      loader: options.loader\n        ? async () => {\n            if (!options.loader) {\n              throw new Error('Loader became undefined');\n            }\n            const module = await options.loader();\n            return module.default;\n          }\n        : undefined,\n      component: options.component ?? null,\n      loadingState: options.component ? 'loaded' : 'idle',\n      loadingError: null,\n      registeredAt: Date.now(),\n      lastAccessedAt: Date.now(),\n      accessCount: 0,\n      hmrEnabled: options.hmrEnabled ?? false,\n    };\n\n    this.modules.set(config.id, entry);\n    this.moduleVersions.set(config.id, 1);\n\n    // Build dependency graph\n    this.updateDependencyGraph(config);\n\n    return true;\n  }\n\n  /**\n   * Unregisters a module from the registry.\n   * @param moduleId - Module to unregister\n   * @returns Whether unregistration was successful\n   */\n  unregister(moduleId: ModuleId): boolean {\n    const entry = this.modules.get(moduleId);\n    if (!entry) {\n      return false;\n    }\n\n    // Remove from dependency graphs\n    this.dependencyGraph.delete(moduleId);\n    this.reverseDependencyGraph.delete(moduleId);\n\n    // Remove this module from other modules' dependency lists\n    for (const [, deps] of this.dependencyGraph) {\n      deps.delete(moduleId);\n    }\n    for (const [, deps] of this.reverseDependencyGraph) {\n      deps.delete(moduleId);\n    }\n\n    // Remove module\n    this.modules.delete(moduleId);\n    this.moduleVersions.delete(moduleId);\n    this.loadPromises.delete(moduleId);\n\n    return true;\n  }\n\n  /**\n   * Checks if a module is registered.\n   * @param moduleId - Module ID to check\n   */\n  has(moduleId: ModuleId): boolean {\n    return this.modules.has(moduleId);\n  }\n\n  /**\n   * Gets a module entry.\n   * @param moduleId - Module ID\n   * @returns Module entry or null\n   */\n  get(moduleId: ModuleId): ModuleRegistryEntry | null {\n    const entry = this.modules.get(moduleId);\n    if (entry) {\n      entry.lastAccessedAt = Date.now();\n      entry.accessCount++;\n    }\n    return entry ?? null;\n  }\n\n  // ==========================================================================\n  // Component Loading\n  // ==========================================================================\n\n  /**\n   * Gets module configuration.\n   * @param moduleId - Module ID\n   * @returns Module configuration or null\n   */\n  getConfig(moduleId: ModuleId): ModuleBoundaryConfig | null {\n    return this.get(moduleId)?.config ?? null;\n  }\n\n  /**\n   * Gets or loads a module's component.\n   * @param moduleId - Module ID\n   * @returns Component or null if not found\n   */\n  async getComponent(\n    moduleId: ModuleId\n  ): Promise<ComponentType<unknown> | null> {\n    const entry = this.get(moduleId);\n    if (!entry) {\n      return null;\n    }\n\n    // Already loaded\n    if (entry.component) {\n      return entry.component;\n    }\n\n    // No loader\n    if (!entry.loader) {\n      return null;\n    }\n\n    // Check for existing load promise (deduplication)\n    const existingPromise = this.loadPromises.get(moduleId);\n    if (existingPromise) {\n      return existingPromise;\n    }\n\n    // Start loading\n    entry.loadingState = 'loading';\n\n    const loadPromise = (async () => {\n      try {\n        if (!entry.loader) {\n          throw new Error(`No loader available for module: ${moduleId}`);\n        }\n        const component = await entry.loader();\n        entry.component = component;\n        entry.loadingState = 'loaded';\n        entry.loadingError = null;\n        return component;\n      } catch (error) {\n        entry.loadingState = 'error';\n        entry.loadingError =\n          error instanceof Error ? error : new Error(String(error));\n        throw entry.loadingError;\n      } finally {\n        this.loadPromises.delete(moduleId);\n      }\n    })();\n\n    this.loadPromises.set(moduleId, loadPromise);\n    return loadPromise;\n  }\n\n  /**\n   * Preloads a module's component.\n   * @param moduleId - Module ID\n   */\n  async preload(moduleId: ModuleId): Promise<void> {\n    await this.getComponent(moduleId);\n  }\n\n  // ==========================================================================\n  // Dependency Resolution\n  // ==========================================================================\n\n  /**\n   * Preloads multiple modules.\n   * @param moduleIds - Module IDs to preload\n   */\n  async preloadMany(moduleIds: ModuleId[]): Promise<void> {\n    await Promise.all(moduleIds.map(async (id) => await this.preload(id)));\n  }\n\n  /**\n   * Resolves dependencies for a module using topological sort.\n   * @param moduleId - Root module ID\n   * @param options - Resolution options\n   * @returns Resolution result\n   */\n  resolveDependencies(\n    moduleId: ModuleId,\n    options: { maxDepth?: number; includeOptional?: boolean } = {}\n  ): DependencyResolutionResult {\n    const { maxDepth = Infinity, includeOptional = true } = options;\n\n    const resolved: ModuleId[] = [];\n    const failed: Array<{ moduleId: ModuleId; reason: string }> = [];\n    const circularDependencies: ModuleId[][] = [];\n\n    const visited = new Set<ModuleId>();\n    const inProgress = new Set<ModuleId>();\n    const currentPath: ModuleId[] = [];\n\n    const visit = (id: ModuleId, depth: number): boolean => {\n      if (depth > maxDepth) {\n        return true;\n      }\n\n      if (visited.has(id)) {\n        return true;\n      }\n\n      if (inProgress.has(id)) {\n        // Circular dependency detected\n        const cycleStart = currentPath.indexOf(id);\n        const cycle = [...currentPath.slice(cycleStart), id];\n        circularDependencies.push(cycle);\n        return false;\n      }\n\n      const entry = this.modules.get(id);\n      if (!entry) {\n        failed.push({ moduleId: id, reason: 'Module not registered' });\n        return false;\n      }\n\n      inProgress.add(id);\n      currentPath.push(id);\n\n      // Visit dependencies\n      const deps = this.dependencyGraph.get(id);\n      if (deps) {\n        for (const depId of deps) {\n          const depConfig = entry.config.dependencies?.find(\n            (d) => d.moduleId === depId\n          );\n\n          // Skip optional dependencies if not including them\n          if (!includeOptional && depConfig && !depConfig.required) {\n            continue;\n          }\n\n          if (!visit(depId, depth + 1)) {\n            // If required dependency failed, propagate failure\n            if (depConfig?.required === true) {\n              failed.push({\n                moduleId: id,\n                reason: `Required dependency failed: ${depId}`,\n              });\n            }\n          }\n        }\n      }\n\n      currentPath.pop();\n      inProgress.delete(id);\n      visited.add(id);\n      resolved.push(id);\n\n      return true;\n    };\n\n    visit(moduleId, 0);\n\n    return { resolved, failed, circularDependencies };\n  }\n\n  /**\n   * Gets modules that depend on a given module.\n   * @param moduleId - Module ID\n   * @returns Array of dependent module IDs\n   */\n  getDependents(moduleId: ModuleId): ModuleId[] {\n    const dependents = this.reverseDependencyGraph.get(moduleId);\n    return dependents ? Array.from(dependents) : [];\n  }\n\n  /**\n   * Gets modules that a given module depends on.\n   * @param moduleId - Module ID\n   * @returns Array of dependency module IDs\n   */\n  getDependencies(moduleId: ModuleId): ModuleId[] {\n    const dependencies = this.dependencyGraph.get(moduleId);\n    return dependencies ? Array.from(dependencies) : [];\n  }\n\n  // ==========================================================================\n  // Hot Module Replacement\n  // ==========================================================================\n\n  /**\n   * Registers an HMR update handler.\n   * @param handler - Update handler\n   * @returns Unsubscribe function\n   */\n  onHMRUpdate(handler: HMRUpdateHandler): () => void {\n    this.hmrHandlers.add(handler);\n    return () => this.hmrHandlers.delete(handler);\n  }\n\n  /**\n   * Handles an HMR update for a module.\n   * @param moduleId - Module that was updated\n   * @param newComponent - New component\n   */\n  handleHMRUpdate(\n    moduleId: ModuleId,\n    newComponent: ComponentType<unknown>\n  ): void {\n    const entry = this.modules.get(moduleId);\n    if (entry?.hmrEnabled !== true) {\n      return;\n    }\n\n    // Update component\n    entry.component = newComponent;\n    entry.lastAccessedAt = Date.now();\n\n    // Increment version\n    const currentVersion = this.moduleVersions.get(moduleId) ?? 1;\n    this.moduleVersions.set(moduleId, currentVersion + 1);\n\n    // Notify handlers\n    for (const handler of this.hmrHandlers) {\n      try {\n        handler(moduleId, newComponent);\n      } catch (error) {\n        console.error('HMR update handler error:', error);\n      }\n    }\n\n    // Notify dependent modules\n    const dependents = this.getDependents(moduleId);\n    for (const depId of dependents) {\n      const depEntry = this.modules.get(depId);\n      if (depEntry?.hmrEnabled === true) {\n        // Trigger re-render of dependents\n        const depVersion = this.moduleVersions.get(depId) ?? 1;\n        this.moduleVersions.set(depId, depVersion + 1);\n      }\n    }\n  }\n\n  /**\n   * Gets the current version of a module.\n   * @param moduleId - Module ID\n   * @returns Version number\n   */\n  getVersion(moduleId: ModuleId): number {\n    return this.moduleVersions.get(moduleId) ?? 0;\n  }\n\n  // ==========================================================================\n  // Query\n  // ==========================================================================\n\n  /**\n   * Queries modules based on criteria.\n   * @param options - Query options\n   * @returns Matching module entries\n   */\n  query(options: ModuleQueryOptions = {}): ModuleRegistryEntry[] {\n    const results: ModuleRegistryEntry[] = [];\n\n    for (const entry of this.modules.values()) {\n      let matches = true;\n\n      // Filter by name pattern\n      if (options.namePattern && !options.namePattern.test(entry.config.name)) {\n        matches = false;\n      }\n\n      if (matches) {\n        results.push(entry);\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Gets all registered module IDs.\n   * @returns Array of module IDs\n   */\n  getAllModuleIds(): ModuleId[] {\n    return Array.from(this.modules.keys());\n  }\n\n  /**\n   * Clears all registered modules.\n   */\n  clear(): void {\n    this.modules.clear();\n    this.dependencyGraph.clear();\n    this.reverseDependencyGraph.clear();\n    this.loadPromises.clear();\n    this.moduleVersions.clear();\n    this.hmrHandlers.clear();\n  }\n\n  // ==========================================================================\n  // Utilities\n  // ==========================================================================\n\n  /**\n   * Exports registry state for debugging.\n   * @returns Registry state object\n   */\n  exportState(): {\n    modules: Array<{\n      id: ModuleId;\n      name: string;\n      loadingState: string;\n      accessCount: number;\n    }>;\n    dependencyGraph: Record<string, string[]>;\n  } {\n    const modules = Array.from(this.modules.entries()).map(([id, entry]) => ({\n      id,\n      name: entry.config.name,\n      loadingState: entry.loadingState,\n      accessCount: entry.accessCount,\n    }));\n\n    const dependencyGraph: Record<string, string[]> = {};\n    for (const [id, deps] of this.dependencyGraph) {\n      dependencyGraph[id] = Array.from(deps);\n    }\n\n    return { modules, dependencyGraph };\n  }\n\n  /**\n   * Updates the dependency graph for a module.\n   * @param config - Module configuration\n   */\n  private updateDependencyGraph(config: ModuleBoundaryConfig): void {\n    const dependencies = new Set<ModuleId>();\n\n    if (config.dependencies) {\n      for (const dep of config.dependencies) {\n        dependencies.add(dep.moduleId);\n\n        // Update reverse graph\n        if (!this.reverseDependencyGraph.has(dep.moduleId)) {\n          this.reverseDependencyGraph.set(dep.moduleId, new Set());\n        }\n        const reverseSet = this.reverseDependencyGraph.get(dep.moduleId);\n        if (reverseSet) {\n          reverseSet.add(config.id);\n        }\n      }\n    }\n\n    this.dependencyGraph.set(config.id, dependencies);\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\n/**\n * Default global module registry instance.\n */\nlet defaultRegistry: ModuleRegistry | null = null;\n\n/**\n * Gets the default global module registry.\n * @returns Default ModuleRegistry instance\n */\nexport function getDefaultRegistry(): ModuleRegistry {\n  defaultRegistry ??= new ModuleRegistry();\n  return defaultRegistry;\n}\n\n/**\n * Sets the default global module registry.\n * @param registry - Registry to set as default\n */\nexport function setDefaultRegistry(registry: ModuleRegistry): void {\n  defaultRegistry = registry;\n}\n\n/**\n * Resets the default global module registry.\n */\nexport function resetDefaultRegistry(): void {\n  if (defaultRegistry) {\n    defaultRegistry.clear();\n    defaultRegistry = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Registers a module with the default registry.\n * @param config - Module configuration\n * @param options - Registration options\n * @returns Whether registration was successful\n */\nexport function registerModule(\n  config: ModuleBoundaryConfig,\n  options?: ModuleRegistrationOptions\n): boolean {\n  return getDefaultRegistry().register(config, options);\n}\n\n/**\n * Gets a module component from the default registry.\n * @param moduleId - Module ID\n * @returns Component or null\n */\nexport async function getModuleComponent(\n  moduleId: ModuleId\n): Promise<ComponentType<unknown> | null> {\n  return getDefaultRegistry().getComponent(moduleId);\n}\n\n/**\n * Creates a module registration helper with builder pattern.\n *\n * @example\n * ```typescript\n * const registration = createModuleRegistration('my-module', 'My Module')\n *   .withLoader(() => import('./MyModule'))\n *   .withDependency('other-module')\n *   .withHMR()\n *   .register();\n * ```\n */\ntype ModuleRegistrationBuilder = {\n  withLoader: (loader: () => Promise<{ default: ComponentType<unknown> }>) => ModuleRegistrationBuilder;\n  withComponent: (component: ComponentType<unknown>) => ModuleRegistrationBuilder;\n  withDependency: (moduleId: ModuleId, required?: boolean) => ModuleRegistrationBuilder;\n  withSecurity: (security: Partial<ModuleSecurityConfig>) => ModuleRegistrationBuilder;\n  withHydration: (hydration: Partial<HydrationConfig>) => ModuleRegistrationBuilder;\n  withHMR: (enabled?: boolean) => ModuleRegistrationBuilder;\n  withVersion: (version: string) => ModuleRegistrationBuilder;\n  register: (registry?: ModuleRegistry) => boolean;\n};\n\nexport function createModuleRegistration(id: string, name: string): ModuleRegistrationBuilder {\n  const moduleId = createModuleId(id);\n  const config: {\n    id: ModuleId;\n    name: string;\n    security?: Partial<ModuleSecurityConfig>;\n    hydration?: Partial<HydrationConfig>;\n    dependencies?: ModuleDependency[];\n    [key: string]: unknown;\n  } = { id: moduleId, name };\n  const options: ModuleRegistrationOptions = {};\n  const dependencies: ModuleDependency[] = [];\n\n  return {\n    withLoader(loader: () => Promise<{ default: ComponentType<unknown> }>) {\n      options.loader = loader;\n      return this;\n    },\n\n    withComponent(component: ComponentType<unknown>) {\n      options.component = component;\n      return this;\n    },\n\n    withDependency(depId: string, required = true, lazy = false) {\n      dependencies.push({\n        moduleId: createModuleId(depId),\n        required,\n        lazy,\n      });\n      return this;\n    },\n\n    withSecurity(security: Partial<ModuleSecurityConfig>) {\n      config.security = { ...config.security, ...security };\n      return this;\n    },\n\n    withHydration(hydration: Partial<HydrationConfig>) {\n      config.hydration = { ...config.hydration, ...hydration };\n      return this;\n    },\n\n    withHMR(enabled = true) {\n      options.hmrEnabled = enabled;\n      return this;\n    },\n\n    withVersion(version: string) {\n      (config as unknown as { version: string }).version = version;\n      return this;\n    },\n\n    register(registry?: ModuleRegistry) {\n      const finalConfig: ModuleBoundaryConfig = {\n        ...config,\n        dependencies: dependencies.length > 0 ? dependencies : undefined,\n      } as ModuleBoundaryConfig;\n\n      const reg = registry ?? getDefaultRegistry();\n      return reg.register(finalConfig, options);\n    },\n  };\n}\n"],"names":["ModuleRegistry","config","options","entry","moduleId","deps","existingPromise","loadPromise","component","error","moduleIds","id","maxDepth","includeOptional","resolved","failed","circularDependencies","visited","inProgress","currentPath","visit","depth","cycleStart","cycle","depId","depConfig","d","dependents","dependencies","handler","newComponent","currentVersion","depVersion","results","matches","modules","dependencyGraph","dep","reverseSet","defaultRegistry","getDefaultRegistry","setDefaultRegistry","registry","resetDefaultRegistry","registerModule","getModuleComponent","createModuleRegistration","name","createModuleId","loader","required","lazy","security","hydration","enabled","version","finalConfig"],"mappings":"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"}