{"version":3,"file":"manager.mjs","sources":["../../../src/lib/extensions/manager.ts"],"sourcesContent":["/**\n * @file Extension Manager\n * @description Manages enzyme extensions with priority-based execution and error isolation\n *\n * Key patterns implemented:\n * - Prisma: Extension composition and type safety\n * - axios: Interceptor execution order with priority\n * - socket.io: Middleware chains with async/await\n * - Express: Error handling middleware\n *\n * @module lib/extensions/manager\n */\n\nimport type {\n  EnzymeExtension,\n  IExtensionManager,\n  LifecycleHooks,\n  InitContext,\n  MountContext,\n  UnmountContext,\n  ErrorContext,\n  BeforeOperationContext,\n  AfterOperationContext,\n  IExtensionEventEmitter,\n  ExtensionEvent,\n  ExtensionEventHandler,\n} from './types.js';\n\n// ============================================================================\n// Extension Manager Implementation\n// ============================================================================\n\n/**\n * Extension manager with priority-based execution and error isolation\n *\n * @example\n * ```ts\n * const manager = new EnzymeExtensionManager();\n *\n * manager.register({\n *   name: 'logging',\n *   priority: ExtensionPriorities.HIGH,\n *   hooks: {\n *     beforeOperation: async (ctx) => {\n *       console.log(`[${ctx.operation}] Starting...`);\n *     },\n *   },\n * });\n *\n * await manager.executeHooks('beforeOperation', {\n *   operation: 'fetchUser',\n *   args: { userId: 123 },\n *   // ...\n * });\n * ```\n */\nexport class EnzymeExtensionManager implements IExtensionManager {\n  private extensions: Map<string, EnzymeExtension> = new Map();\n  private sortedExtensions: EnzymeExtension[] = [];\n  private eventEmitter: ExtensionEventEmitter;\n  private config: Record<string, unknown>;\n\n  constructor(config: Record<string, unknown> = {}) {\n    this.config = config;\n    this.eventEmitter = new ExtensionEventEmitter();\n  }\n\n  /**\n   * Get event emitter for inter-extension communication\n   */\n  get events(): IExtensionEventEmitter {\n    return this.eventEmitter;\n  }\n\n  /**\n   * Register an extension\n   * Extensions are automatically sorted by priority after registration\n   */\n  register(extension: EnzymeExtension): void {\n    if (!extension.name) {\n      throw new TypeError('Extension name is required');\n    }\n\n    if (this.extensions.has(extension.name)) {\n      console.warn(\n        `Extension \"${extension.name}\" is already registered. Replacing with new version.`\n      );\n    }\n\n    // Set default priority if not specified\n    const extensionWithDefaults: EnzymeExtension = {\n      priority: 0,\n      ...extension,\n    };\n\n    this.extensions.set(extension.name, extensionWithDefaults);\n    this.sortExtensionsByPriority();\n\n    // Execute onInit hook if present\n    if (extensionWithDefaults.hooks?.onInit) {\n      const initContext: InitContext = {\n        extensionName: extension.name,\n        config: this.config,\n        timestamp: Date.now(),\n      };\n\n      Promise.resolve(extensionWithDefaults.hooks.onInit(initContext)).catch((error) => {\n        console.error(`Extension \"${extension.name}\" onInit hook failed:`, error);\n        this.handleExtensionError(extension.name, 'onInit', error, async () => {\n          await extensionWithDefaults.hooks!.onInit!(initContext);\n        });\n      });\n    }\n\n    console.debug?.(\n      `Registered extension: ${extension.name}${extension.version ? `@${extension.version}` : ''} (priority: ${extensionWithDefaults.priority})`\n    );\n  }\n\n  /**\n   * Unregister an extension by name\n   */\n  unregister(name: string): boolean {\n    if (!this.extensions.has(name)) {\n      return false;\n    }\n\n    this.extensions.delete(name);\n    this.sortExtensionsByPriority();\n\n    console.debug?.(`Unregistered extension: ${name}`);\n    return true;\n  }\n\n  /**\n   * Get all registered extensions (sorted by priority)\n   */\n  getExtensions(): EnzymeExtension[] {\n    return [...this.sortedExtensions];\n  }\n\n  /**\n   * Get extension by name\n   */\n  getExtension(name: string): EnzymeExtension | undefined {\n    return this.extensions.get(name);\n  }\n\n  /**\n   * Check if extension is registered\n   */\n  hasExtension(name: string): boolean {\n    return this.extensions.has(name);\n  }\n\n  /**\n   * Get extension count\n   */\n  get count(): number {\n    return this.extensions.size;\n  }\n\n  /**\n   * List all extension names\n   */\n  list(): string[] {\n    return Array.from(this.extensions.keys());\n  }\n\n  /**\n   * Clear all extensions\n   */\n  clear(): void {\n    this.extensions.clear();\n    this.sortedExtensions = [];\n    console.debug?.('Cleared all extensions');\n  }\n\n  // ==========================================================================\n  // Hook Execution\n  // ==========================================================================\n\n  /**\n   * Execute lifecycle hooks with priority-based ordering\n   * Higher priority extensions execute first\n   * Errors are isolated per extension\n   */\n  async executeHooks<T = void>(\n    hookName: keyof LifecycleHooks,\n    context: unknown\n  ): Promise<T | void> {\n    const results: Array<T | void> = [];\n\n    for (const extension of this.sortedExtensions) {\n      const hook = extension.hooks?.[hookName];\n      if (!hook) continue;\n\n      try {\n        const result = await this.executeHookSafely(\n          extension.name,\n          hookName,\n          hook,\n          context\n        );\n        if (result !== undefined) {\n          results.push(result as T);\n        }\n      } catch (error) {\n        // Error already handled in executeHookSafely\n        // Continue with next extension\n        console.error(\n          `Extension \"${extension.name}\" ${hookName} hook failed (continuing with others):`,\n          error\n        );\n      }\n    }\n\n    // Return first non-undefined result\n    return results.find((r) => r !== undefined);\n  }\n\n  /**\n   * Execute mount hooks (React lifecycle)\n   */\n  async executeMountHooks(\n    component?: string,\n    data?: Record<string, unknown>\n  ): Promise<void> {\n    const context: MountContext = {\n      extensionName: '',\n      component,\n      data,\n      timestamp: Date.now(),\n    };\n\n    await this.executeHooks('onMount', context);\n  }\n\n  /**\n   * Execute unmount hooks (React lifecycle)\n   */\n  async executeUnmountHooks(\n    component?: string,\n    data?: Record<string, unknown>\n  ): Promise<void> {\n    const context: UnmountContext = {\n      extensionName: '',\n      component,\n      data,\n      timestamp: Date.now(),\n    };\n\n    await this.executeHooks('onUnmount', context);\n  }\n\n  /**\n   * Execute beforeOperation hooks with cancellation support\n   */\n  async executeBeforeOperationHooks<TArgs = unknown>(\n    operation: string,\n    args: TArgs,\n    metadata?: Record<string, unknown>\n  ): Promise<{ args: TArgs; cancelled: boolean }> {\n    let currentArgs = args;\n    let cancelled = false;\n\n    for (const extension of this.sortedExtensions) {\n      const hook = extension.hooks?.beforeOperation;\n      if (!hook) continue;\n\n      const context: BeforeOperationContext<TArgs> = {\n        extensionName: extension.name,\n        operation,\n        args: currentArgs,\n        modify: (changes) => {\n          currentArgs = { ...currentArgs, ...changes };\n        },\n        cancel: () => {\n          cancelled = true;\n        },\n        metadata,\n        timestamp: Date.now(),\n      };\n\n      try {\n        await this.executeHookSafely(extension.name, 'beforeOperation', hook, context);\n\n        if (cancelled) {\n          console.debug?.(`Operation \"${operation}\" cancelled by extension \"${extension.name}\"`);\n          break;\n        }\n      } catch (error) {\n        console.error(\n          `Extension \"${extension.name}\" beforeOperation hook failed:`,\n          error\n        );\n      }\n    }\n\n    return { args: currentArgs, cancelled };\n  }\n\n  /**\n   * Execute afterOperation hooks with result modification\n   */\n  async executeAfterOperationHooks<TArgs = unknown, TResult = unknown>(\n    operation: string,\n    args: TArgs,\n    result: TResult,\n    duration: number,\n    metadata?: Record<string, unknown>\n  ): Promise<TResult> {\n    let currentResult = result;\n\n    for (const extension of this.sortedExtensions) {\n      const hook = extension.hooks?.afterOperation;\n      if (!hook) continue;\n\n      const context: AfterOperationContext<TArgs, TResult> = {\n        extensionName: extension.name,\n        operation,\n        args,\n        result: currentResult,\n        modify: (changes) => {\n          if (typeof currentResult === 'object' && currentResult !== null) {\n            currentResult = { ...currentResult, ...changes };\n          }\n        },\n        duration,\n        metadata,\n        timestamp: Date.now(),\n      };\n\n      try {\n        await this.executeHookSafely(extension.name, 'afterOperation', hook, context);\n      } catch (error) {\n        console.error(\n          `Extension \"${extension.name}\" afterOperation hook failed:`,\n          error\n        );\n      }\n    }\n\n    return currentResult;\n  }\n\n  // ==========================================================================\n  // Extension Utilities\n  // ==========================================================================\n\n  /**\n   * Get all component enhancers from extensions\n   */\n  getComponentEnhancers(): Map<string, Array<{ name: string; enhancer: Function }>> {\n    const enhancers = new Map<string, Array<{ name: string; enhancer: Function }>>();\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.component?.enhancers) continue;\n\n      for (const [enhancerName, enhancer] of Object.entries(\n        extension.component.enhancers\n      )) {\n        if (!enhancers.has(enhancerName)) {\n          enhancers.set(enhancerName, []);\n        }\n        enhancers.get(enhancerName)!.push({\n          name: extension.name,\n          enhancer,\n        });\n      }\n    }\n\n    return enhancers;\n  }\n\n  /**\n   * Get all custom hooks from extensions\n   */\n  getComponentHooks(): Record<string, Function> {\n    const hooks: Record<string, Function> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.component?.hooks) continue;\n\n      Object.assign(hooks, extension.component.hooks);\n    }\n\n    return hooks;\n  }\n\n  /**\n   * Get all state selectors from extensions\n   */\n  getStateSelectors(): Record<string, Function> {\n    const selectors: Record<string, Function> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.state?.selectors) continue;\n\n      Object.assign(selectors, extension.state.selectors);\n    }\n\n    return selectors;\n  }\n\n  /**\n   * Get all state action creators from extensions\n   */\n  getStateActions(): Record<string, Function> {\n    const actions: Record<string, Function> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.state?.actions) continue;\n\n      Object.assign(actions, extension.state.actions);\n    }\n\n    return actions;\n  }\n\n  /**\n   * Get combined initial state from all extensions\n   */\n  getCombinedInitialState(): Record<string, unknown> {\n    const state: Record<string, unknown> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.state?.initialState) continue;\n\n      Object.assign(state, extension.state.initialState);\n    }\n\n    return state;\n  }\n\n  /**\n   * Get all API endpoints from extensions\n   */\n  getApiEndpoints(): Record<string, unknown> {\n    const endpoints: Record<string, unknown> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.api?.endpoints) continue;\n\n      Object.assign(endpoints, extension.api.endpoints);\n    }\n\n    return endpoints;\n  }\n\n  /**\n   * Get all API interceptors from extensions\n   */\n  getApiInterceptors(): Array<{ name: string; interceptor: unknown }> {\n    const interceptors: Array<{ name: string; interceptor: unknown }> = [];\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.api?.interceptors) continue;\n\n      for (const interceptor of extension.api.interceptors) {\n        interceptors.push({\n          name: extension.name,\n          interceptor,\n        });\n      }\n    }\n\n    return interceptors;\n  }\n\n  /**\n   * Get all client methods from extensions\n   */\n  getClientMethods(): Record<string, Function> {\n    const methods: Record<string, Function> = {};\n\n    for (const extension of this.sortedExtensions) {\n      if (!extension.client) continue;\n\n      Object.assign(methods, extension.client);\n    }\n\n    return methods;\n  }\n\n  // ==========================================================================\n  // Private Methods\n  // ==========================================================================\n\n  /**\n   * Sort extensions by priority (higher priority first)\n   */\n  private sortExtensionsByPriority(): void {\n    this.sortedExtensions = Array.from(this.extensions.values()).sort(\n      (a, b) => (b.priority ?? 0) - (a.priority ?? 0)\n    );\n  }\n\n  /**\n   * Execute a hook safely with error handling\n   */\n  private async executeHookSafely<T>(\n    extensionName: string,\n    hookName: string,\n    hook: Function,\n    context: unknown\n  ): Promise<T | void> {\n    try {\n      const result = await Promise.resolve(hook(context));\n      return result as T;\n    } catch (error) {\n      await this.handleExtensionError(\n        extensionName,\n        hookName,\n        error instanceof Error ? error : new Error(String(error)),\n        async () => {\n          await hook(context);\n        }\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Handle extension errors with error hook\n   */\n  private async handleExtensionError(\n    extensionName: string,\n    hookName: string,\n    error: Error,\n    retry: () => Promise<void>\n  ): Promise<void> {\n    const extension = this.extensions.get(extensionName);\n    if (!extension?.hooks?.onError) {\n      return;\n    }\n\n    const errorContext: ErrorContext = {\n      extensionName,\n      hookName,\n      error,\n      operation: hookName,\n      retry,\n      timestamp: Date.now(),\n    };\n\n    try {\n      await extension.hooks.onError(errorContext);\n    } catch (errorHandlerError) {\n      console.error(\n        `Extension \"${extensionName}\" error hook failed while handling error in ${hookName}:`,\n        errorHandlerError\n      );\n    }\n  }\n}\n\n// ============================================================================\n// Extension Event Emitter\n// ============================================================================\n\n/**\n * Event emitter for inter-extension communication\n */\nclass ExtensionEventEmitter implements IExtensionEventEmitter {\n  private handlers: Map<string, Set<ExtensionEventHandler>> = new Map();\n\n  /**\n   * Emit an event to all registered handlers\n   */\n  emit<T>(type: string, payload: T, metadata?: Record<string, unknown>): void {\n    const handlers = this.handlers.get(type);\n    if (!handlers || handlers.size === 0) {\n      return;\n    }\n\n    const event: ExtensionEvent<T> = {\n      type,\n      payload,\n      source: 'enzyme-core',\n      timestamp: Date.now(),\n      metadata,\n    };\n\n    for (const handler of handlers) {\n      Promise.resolve(handler(event)).catch((error) => {\n        console.error(`Event handler for \"${type}\" failed:`, error);\n      });\n    }\n  }\n\n  /**\n   * Subscribe to events\n   * Returns unsubscribe function\n   */\n  on<T>(type: string, handler: ExtensionEventHandler<T>): () => void {\n    if (!this.handlers.has(type)) {\n      this.handlers.set(type, new Set());\n    }\n\n    this.handlers.get(type)!.add(handler as ExtensionEventHandler);\n\n    return () => {\n      this.off(type, handler);\n    };\n  }\n\n  /**\n   * Subscribe to events (once)\n   * Handler is automatically removed after first execution\n   */\n  once<T>(type: string, handler: ExtensionEventHandler<T>): () => void {\n    const onceHandler: ExtensionEventHandler<T> = async (event) => {\n      this.off(type, onceHandler);\n      await handler(event);\n    };\n\n    return this.on(type, onceHandler);\n  }\n\n  /**\n   * Unsubscribe from events\n   */\n  off<T>(type: string, handler: ExtensionEventHandler<T>): void {\n    const handlers = this.handlers.get(type);\n    if (!handlers) {\n      return;\n    }\n\n    handlers.delete(handler as ExtensionEventHandler);\n\n    if (handlers.size === 0) {\n      this.handlers.delete(type);\n    }\n  }\n\n  /**\n   * Clear all handlers for a specific event type\n   */\n  clear(type?: string): void {\n    if (type) {\n      this.handlers.delete(type);\n    } else {\n      this.handlers.clear();\n    }\n  }\n\n  /**\n   * Get handler count for an event type\n   */\n  getHandlerCount(type: string): number {\n    return this.handlers.get(type)?.size ?? 0;\n  }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a new extension manager\n *\n * @example\n * ```ts\n * const manager = createExtensionManager({ debug: true });\n * ```\n */\nexport function createExtensionManager(\n  config?: Record<string, unknown>\n): EnzymeExtensionManager {\n  return new EnzymeExtensionManager(config);\n}\n\n/**\n * Create a pre-configured extension manager with common extensions\n */\nexport function createDefaultExtensionManager(\n  config?: Record<string, unknown>\n): EnzymeExtensionManager {\n  const manager = new EnzymeExtensionManager(config);\n\n  // Built-in extensions can be registered here\n  // Example: manager.register(loggingExtension);\n\n  return manager;\n}\n"],"names":["EnzymeExtensionManager","config","ExtensionEventEmitter","extension","extensionWithDefaults","initContext","error","name","hookName","context","results","hook","result","r","component","data","operation","args","metadata","currentArgs","cancelled","changes","duration","currentResult","enhancers","enhancerName","enhancer","hooks","selectors","actions","state","endpoints","interceptors","interceptor","methods","a","b","extensionName","retry","errorContext","errorHandlerError","type","payload","handlers","event","handler","onceHandler","createExtensionManager","createDefaultExtensionManager"],"mappings":"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"}