{"version":3,"file":"featureDI.mjs","sources":["../../../src/lib/feature/featureDI.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\n/* @refresh reset */\n/**\n * @file Feature Dependency Injection\n * @description Enables loose coupling between features via service contracts\n */\n\nimport React, { createContext, type ReactNode, useContext, useEffect, useMemo } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Service contract definition\n * Defines a typed interface for a service that can be resolved at runtime\n */\nexport interface ServiceContract<T> {\n  readonly id: symbol;\n  readonly name: string;\n  readonly defaultValue?: T;\n}\n\n/**\n * Service registration options\n */\nexport interface ServiceRegistrationOptions {\n  /** Scope of the service instance */\n  scope?: 'singleton' | 'transient';\n  /** Tags for service discovery */\n  tags?: string[];\n}\n\n/**\n * Internal service registration\n */\ninterface ServiceRegistration<T = unknown> {\n  contract: ServiceContract<T>;\n  implementation: T;\n  scope: 'singleton' | 'transient';\n  tags: string[];\n}\n\n// ============================================================================\n// Feature DI Container\n// ============================================================================\n\n/**\n * Feature dependency injection container\n * Manages service registrations and resolution\n */\nexport class FeatureDIContainer {\n  private services = new Map<symbol, ServiceRegistration>();\n  private singletons = new Map<symbol, unknown>();\n  private factoryFunctions = new Map<symbol, () => unknown>();\n\n  /**\n   * Register a service implementation\n   */\n  register<T>(\n    contract: ServiceContract<T>,\n    implementation: T,\n    options: ServiceRegistrationOptions = {}\n  ): this {\n    const { scope = 'singleton', tags = [] } = options;\n\n    this.services.set(contract.id, {\n      contract: contract as ServiceContract<unknown>,\n      implementation,\n      scope,\n      tags,\n    });\n\n    // Clear any existing singleton when re-registering\n    this.singletons.delete(contract.id);\n\n    return this;\n  }\n\n  /**\n   * Register a factory function for lazy instantiation\n   */\n  registerFactory<T>(\n    contract: ServiceContract<T>,\n    factory: () => T,\n    options: ServiceRegistrationOptions = {}\n  ): this {\n    this.factoryFunctions.set(contract.id, factory);\n    return this.register(contract, undefined as T, options);\n  }\n\n  /**\n   * Resolve a service\n   */\n  resolve<T>(contract: ServiceContract<T>): T {\n    // Check for singleton first\n    if (this.singletons.has(contract.id)) {\n      return this.singletons.get(contract.id) as T;\n    }\n\n    const registration = this.services.get(contract.id);\n\n    // Not registered - check for default value\n    if (registration === undefined) {\n      if (contract.defaultValue !== undefined) {\n        return contract.defaultValue;\n      }\n      throw new Error(`Service not registered: ${contract.name} (${String(contract.id)})`);\n    }\n\n    // Get or create instance\n    let instance: T;\n\n    // Check for factory function\n    const factory = this.factoryFunctions.get(contract.id);\n    if (factory !== undefined && registration.implementation === undefined) {\n      instance = factory() as T;\n      // Update registration with created instance\n      registration.implementation = instance;\n    } else {\n      instance = registration.implementation as T;\n    }\n\n    // Cache singleton\n    if (registration.scope === 'singleton') {\n      this.singletons.set(contract.id, instance);\n    }\n\n    return instance;\n  }\n\n  /**\n   * Try to resolve a service, returning undefined if not found\n   */\n  tryResolve<T>(contract: ServiceContract<T>): T | undefined {\n    try {\n      return this.resolve(contract);\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Check if a service is registered\n   */\n  has<T>(contract: ServiceContract<T>): boolean {\n    return this.services.has(contract.id) || contract.defaultValue !== undefined;\n  }\n\n  /**\n   * Unregister a service\n   */\n  unregister<T>(contract: ServiceContract<T>): boolean {\n    this.singletons.delete(contract.id);\n    this.factoryFunctions.delete(contract.id);\n    return this.services.delete(contract.id);\n  }\n\n  /**\n   * Clear all registrations\n   */\n  clear(): void {\n    this.services.clear();\n    this.singletons.clear();\n    this.factoryFunctions.clear();\n  }\n\n  /**\n   * Get all services with a specific tag\n   */\n  getByTag(tag: string): ServiceRegistration[] {\n    return Array.from(this.services.values()).filter((reg) => reg.tags.includes(tag));\n  }\n\n  /**\n   * Get all registered service contracts\n   */\n  getRegisteredContracts(): ServiceContract<unknown>[] {\n    return Array.from(this.services.values()).map((reg) => reg.contract);\n  }\n\n  /**\n   * Create a child container that inherits from this container\n   */\n  createChild(): FeatureDIContainer {\n    const child = new FeatureDIContainer();\n\n    // Copy registrations (but not singletons - child gets fresh instances)\n    for (const [id, registration] of this.services) {\n      child.services.set(id, { ...registration });\n    }\n\n    // Copy factory functions\n    for (const [id, factory] of this.factoryFunctions) {\n      child.factoryFunctions.set(id, factory);\n    }\n\n    return child;\n  }\n}\n\n// ============================================================================\n// Global Container\n// ============================================================================\n\nconst globalContainer = new FeatureDIContainer();\n\n/**\n * Get the global DI container\n */\nexport function getContainer(): FeatureDIContainer {\n  return globalContainer;\n}\n\n/**\n * Register a service in the global container\n */\nexport function registerService<T>(\n  contract: ServiceContract<T>,\n  implementation: T,\n  options?: ServiceRegistrationOptions\n): void {\n  globalContainer.register(contract, implementation, options);\n}\n\n// ============================================================================\n// Service Contract Factory\n// ============================================================================\n\n/**\n * Create a typed service contract\n */\nexport function createServiceContract<T>(name: string, defaultValue?: T): ServiceContract<T> {\n  return {\n    id: Symbol.for(`feature-service:${name}`),\n    name,\n    defaultValue,\n  };\n}\n\n// ============================================================================\n// React Integration\n// ============================================================================\n\nconst DIContext = createContext<FeatureDIContainer>(globalContainer);\n\n/**\n * DI Provider component\n */\nexport function FeatureDIProvider({\n  container = globalContainer,\n  children,\n}: {\n  container?: FeatureDIContainer;\n  children: ReactNode;\n}): React.ReactElement {\n  return <DIContext.Provider value={container}>{children}</DIContext.Provider>;\n}\n\n/**\n * Hook to get the DI container\n */\nexport function useDIContainer(): FeatureDIContainer {\n  return useContext(DIContext);\n}\n\n/**\n * Hook to resolve a service\n */\nexport function useService<T>(contract: ServiceContract<T>): T {\n  const container = useDIContainer();\n  return useMemo(() => container.resolve(contract), [container, contract]);\n}\n\n/**\n * Hook to try to resolve a service (returns undefined if not found)\n */\nexport function useTryService<T>(contract: ServiceContract<T>): T | undefined {\n  const container = useDIContainer();\n  return useMemo(() => container.tryResolve(contract), [container, contract]);\n}\n\n/**\n * Hook to check if a service exists\n */\nexport function useHasService<T>(contract: ServiceContract<T>): boolean {\n  const container = useDIContainer();\n  return container.has(contract);\n}\n\n/**\n * Hook to get all services with a specific tag\n */\nexport function useServicesByTag<T>(tag: string): T[] {\n  const container = useDIContainer();\n  return useMemo(() => {\n    const registrations = container.getByTag(tag);\n    return registrations.map((reg) => container.resolve(reg.contract) as T);\n  }, [container, tag]);\n}\n\n// ============================================================================\n// Common Service Contracts\n// ============================================================================\n\n/**\n * Analytics service contract\n */\nexport interface AnalyticsService {\n  track(event: string, properties?: Record<string, unknown>): void;\n  identify(userId: string, traits?: Record<string, unknown>): void;\n  page(name: string, properties?: Record<string, unknown>): void;\n  reset(): void;\n}\n\nexport const AnalyticsContract = createServiceContract<AnalyticsService>('analytics', {\n  track: () => {},\n  identify: () => {},\n  page: () => {},\n  reset: () => {},\n});\n\n/**\n * Notification service contract\n */\nexport interface NotificationService {\n  success(message: string, options?: NotificationOptions): void;\n  error(message: string, options?: NotificationOptions): void;\n  warning(message: string, options?: NotificationOptions): void;\n  info(message: string, options?: NotificationOptions): void;\n  dismiss(id?: string): void;\n}\n\ninterface NotificationOptions {\n  duration?: number;\n  title?: string;\n  action?: { label: string; onClick: () => void };\n}\n\nexport const NotificationContract = createServiceContract<NotificationService>('notification', {\n  success: (msg) => console.info('[Success]', msg),\n  error: (msg) => console.error('[Error]', msg),\n  warning: (msg) => console.warn('[Warning]', msg),\n  info: (msg) => console.info('[Info]', msg),\n  dismiss: () => {},\n});\n\n/**\n * Navigation service contract\n */\nexport interface NavigationService {\n  navigate(path: string, options?: { replace?: boolean }): void;\n  goBack(): void;\n  goForward(): void;\n  replace(path: string): void;\n  getCurrentPath(): string;\n}\n\nexport const NavigationContract = createServiceContract<NavigationService>('navigation');\n\n/**\n * Storage service contract\n */\nexport interface StorageService {\n  get<T>(key: string): T | null;\n  set<T>(key: string, value: T): void;\n  remove(key: string): void;\n  clear(): void;\n}\n\nexport const StorageContract = createServiceContract<StorageService>('storage', {\n  get: <T,>(key: string): T | null => {\n    try {\n      const item = localStorage.getItem(key);\n      return item !== null ? (JSON.parse(item) as T) : null;\n    } catch {\n      return null;\n    }\n  },\n  set: (key, value) => {\n    localStorage.setItem(key, JSON.stringify(value));\n  },\n  remove: (key) => {\n    localStorage.removeItem(key);\n  },\n  clear: () => {\n    localStorage.clear();\n  },\n});\n\n// ============================================================================\n// Feature-to-Feature Communication\n// ============================================================================\n\n/**\n * Event handler type\n */\ntype EventHandler<T = unknown> = (payload: T) => void;\n\n/**\n * Cross-feature event bus contract\n */\nexport interface FeatureEventBus {\n  emit<T>(event: string, payload?: T): void;\n  on<T>(event: string, handler: EventHandler<T>): () => void;\n  once<T>(event: string, handler: EventHandler<T>): () => void;\n  off(event: string, handler: EventHandler): void;\n  offAll(event?: string): void;\n}\n\nexport const FeatureEventBusContract = createServiceContract<FeatureEventBus>('featureEventBus');\n\n/**\n * Simple event bus implementation\n */\nexport class SimpleFeatureEventBus implements FeatureEventBus {\n  private listeners = new Map<string, Set<EventHandler>>();\n  private onceListeners = new Map<string, Set<EventHandler>>();\n\n  emit<T>(event: string, payload?: T): void {\n    // Regular listeners\n    const handlers = this.listeners.get(event);\n    if (handlers !== undefined) {\n      handlers.forEach((handler) => handler(payload));\n    }\n\n    // Once listeners\n    const onceHandlers = this.onceListeners.get(event);\n    if (onceHandlers !== undefined) {\n      onceHandlers.forEach((handler) => {\n        handler(payload);\n        this.off(event, handler);\n      });\n      this.onceListeners.delete(event);\n    }\n  }\n\n  on<T>(event: string, handler: EventHandler<T>): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    const handlers = this.listeners.get(event);\n    if (handlers !== undefined) {\n      handlers.add(handler as EventHandler);\n    }\n\n    // Return unsubscribe function\n    return () => this.off(event, handler as EventHandler);\n  }\n\n  once<T>(event: string, handler: EventHandler<T>): () => void {\n    if (!this.onceListeners.has(event)) {\n      this.onceListeners.set(event, new Set());\n    }\n    const handlers = this.onceListeners.get(event);\n    if (handlers !== undefined) {\n      handlers.add(handler as EventHandler);\n    }\n\n    return () => {\n      const onceHandlers = this.onceListeners.get(event);\n      if (onceHandlers !== undefined) {\n        onceHandlers.delete(handler as EventHandler);\n      }\n    };\n  }\n\n  off(event: string, handler: EventHandler): void {\n    const handlers = this.listeners.get(event);\n    if (handlers !== undefined) {\n      handlers.delete(handler);\n    }\n  }\n\n  offAll(event?: string): void {\n    if (event !== undefined) {\n      this.listeners.delete(event);\n      this.onceListeners.delete(event);\n    } else {\n      this.listeners.clear();\n      this.onceListeners.clear();\n    }\n  }\n}\n\n/**\n * Hook to use the feature event bus\n */\nexport function useFeatureEventBus(): FeatureEventBus {\n  return useService(FeatureEventBusContract);\n}\n\n/**\n * Hook to subscribe to feature events\n * Automatically unsubscribes on unmount\n */\nexport function useFeatureEvent<T>(event: string, handler: EventHandler<T>): void {\n  const eventBus = useFeatureEventBus();\n\n  useEffect(() => {\n\n    return eventBus.on(event, handler);\n  }, [eventBus, event, handler]);\n}\n\n// ============================================================================\n// Default Event Bus Registration\n// ============================================================================\n\n// Register the default event bus\nregisterService(FeatureEventBusContract, new SimpleFeatureEventBus());\n"],"names":["FeatureDIContainer","contract","implementation","options","scope","tags","factory","registration","instance","tag","reg","child","id","globalContainer","getContainer","registerService","createServiceContract","name","defaultValue","DIContext","createContext","FeatureDIProvider","container","children","useDIContainer","useContext","useService","useMemo","useTryService","useHasService","useServicesByTag","AnalyticsContract","NotificationContract","msg","NavigationContract","StorageContract","key","item","value","FeatureEventBusContract","SimpleFeatureEventBus","event","payload","handlers","handler","onceHandlers","useFeatureEventBus","useFeatureEvent","eventBus","useEffect"],"mappings":"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"}