{"version":3,"file":"AppConfigBridge.mjs","sources":["../../../../../src/lib/core/config/integration/AppConfigBridge.ts"],"sourcesContent":["/**\n * @fileoverview Bridge between library configuration and application configuration.\n *\n * This module provides integration between the lib/core/config system and\n * the application-level @/config system, ensuring consistency and allowing\n * the library to inherit application-wide settings.\n *\n * @module core/config/integration/AppConfigBridge\n */\n\nimport type { LibraryConfig, DeepPartial, NetworkConfig, CacheConfig } from '../types';\n\nimport { getConfigRegistry } from '@/lib/core';\nimport { getEndpointRegistry } from '@/lib/core';\n\n// =============================================================================\n// App Config Types (from @/config)\n// =============================================================================\n\n/**\n * Expected shape of app-level environment config.\n *\n * This mirrors the EnvConfig from @/config/env.ts\n */\ninterface AppEnvConfig {\n  apiBaseUrl: string;\n  apiTimeout: number;\n  apiRetryCount: number;\n  apiRetryDelay: number;\n  wsUrl: string;\n  sseUrl: string;\n  wsReconnectInterval: number;\n  wsMaxReconnectAttempts: number;\n  isDev: boolean;\n  isProd: boolean;\n  isTest: boolean;\n  appEnv: string;\n}\n\n/**\n * Expected shape of app-level timing config.\n *\n * This mirrors TIMING from @/config/timing.constants.ts\n */\ninterface AppTimingConfig {\n  API: {\n    TIMEOUT: number;\n    TIMEOUT_LONG: number;\n    TIMEOUT_SHORT: number;\n    TIMEOUT_HEALTH: number;\n    RETRY_BASE_DELAY: number;\n    RETRY_MAX_DELAY: number;\n  };\n  QUERY: {\n    STALE: {\n      REALTIME: number;\n      SHORT: number;\n      MEDIUM: number;\n      LONG: number;\n      EXTENDED: number;\n      STATIC: number;\n    };\n    GC: {\n      SHORT: number;\n      MEDIUM: number;\n      LONG: number;\n    };\n  };\n  UI: {\n    DEBOUNCE: {\n      FAST: number;\n      INPUT: number;\n      FORM: number;\n      RESIZE: number;\n      SCROLL: number;\n    };\n    ANIMATION: {\n      FAST: number;\n      STANDARD: number;\n      SLOW: number;\n    };\n    TOAST: {\n      SHORT: number;\n      STANDARD: number;\n      LONG: number;\n    };\n    LOADING: {\n      SPINNER_DELAY: number;\n      MIN_DISPLAY: number;\n    };\n  };\n  RETRY: {\n    DEFAULT_ATTEMPTS: number;\n    API_ATTEMPTS: number;\n    AUTH_ATTEMPTS: number;\n  };\n}\n\n/**\n * Expected shape of app-level API config.\n *\n * This mirrors API_CONFIG from @/config/api.config.ts\n */\ninterface AppApiConfig {\n  BASE_URL: string;\n  TIMEOUT: {\n    DEFAULT: number;\n    LONG: number;\n    SHORT: number;\n    HEALTH: number;\n  };\n  RETRY: {\n    ATTEMPTS: number;\n    BASE_DELAY: number;\n    MAX_DELAY: number;\n  };\n  PAGINATION: {\n    DEFAULT_PAGE: number;\n    DEFAULT_PAGE_SIZE: number;\n    MAX_PAGE_SIZE: number;\n  };\n}\n\n// =============================================================================\n// Bridge Configuration\n// =============================================================================\n\ninterface BridgeConfig {\n  /** Whether to auto-sync on changes */\n  autoSync: boolean;\n\n  /** Whether to override lib defaults with app config */\n  overrideDefaults: boolean;\n\n  /** Log sync operations in development */\n  debug: boolean;\n}\n\nconst DEFAULT_BRIDGE_CONFIG: BridgeConfig = {\n  autoSync: true,\n  overrideDefaults: true,\n  debug: false,\n};\n\n// =============================================================================\n// AppConfigBridge Implementation\n// =============================================================================\n\n/**\n * Bridge between library configuration and application configuration.\n *\n * This class synchronizes settings from @/config to the lib/core/config system,\n * ensuring the library uses the same timeouts, base URLs, and settings as the\n * application.\n *\n * @example\n * ```typescript\n * import { env, TIMING, API_CONFIG } from '@/config';\n *\n * // Initialize bridge with app config\n * const bridge = AppConfigBridge.getInstance();\n * bridge.syncFromAppConfig({ env, TIMING, API_CONFIG });\n *\n * // Now library modules use app-level settings\n * ```\n */\nexport class AppConfigBridge {\n  private static instance: AppConfigBridge | null = null;\n\n  private config: BridgeConfig;\n  private initialized = false;\n\n  private constructor(config: Partial<BridgeConfig> = {}) {\n    this.config = { ...DEFAULT_BRIDGE_CONFIG, ...config };\n  }\n\n  /**\n   * Get the singleton instance.\n   */\n  static getInstance(config?: Partial<BridgeConfig>): AppConfigBridge {\n    AppConfigBridge.instance ??= new AppConfigBridge(config);\n    return AppConfigBridge.instance;\n  }\n\n  /**\n   * Reset the singleton instance (for testing).\n   */\n  static resetInstance(): void {\n    AppConfigBridge.instance = null;\n  }\n\n  // ===========================================================================\n  // Synchronization\n  // ===========================================================================\n\n  /**\n   * Synchronize library configuration from application configuration.\n   */\n  syncFromAppConfig(appConfig: {\n    env?: Partial<AppEnvConfig>;\n    TIMING?: Partial<AppTimingConfig>;\n    API_CONFIG?: Partial<AppApiConfig>;\n  }): void {\n    const { env, TIMING, API_CONFIG } = appConfig;\n    const registry = getConfigRegistry();\n    const endpointRegistry = getEndpointRegistry();\n\n    const overlay: Record<string, unknown> = {};\n\n    // Sync from env config\n    if (env !== undefined && env !== null) {\n      overlay.network = this.mapEnvToNetworkConfig(env);\n\n      // Set endpoint registry base URL\n      if (env.apiBaseUrl != null && env.apiBaseUrl !== '') {\n        endpointRegistry.setBaseUrl(env.apiBaseUrl);\n      }\n    }\n\n    // Sync from TIMING config\n    if (TIMING !== undefined && TIMING !== null) {\n      const networkFromTiming = this.mapTimingToNetworkConfig(TIMING);\n      const cacheFromTiming = this.mapTimingToCacheConfig(TIMING);\n      const uiFromTiming = this.mapTimingToUIConfig(TIMING);\n\n      overlay.network = { ...(overlay.network as Record<string, unknown>), ...networkFromTiming };\n      overlay.cache = cacheFromTiming;\n      overlay.ui = uiFromTiming;\n    }\n\n    // Sync from API_CONFIG\n    if (API_CONFIG !== undefined && API_CONFIG !== null) {\n      const networkFromApi = this.mapApiConfigToNetworkConfig(API_CONFIG);\n      overlay.network = { ...(overlay.network as Record<string, unknown>), ...networkFromApi };\n\n      // Set endpoint registry base URL\n      if (API_CONFIG.BASE_URL != null && API_CONFIG.BASE_URL !== '') {\n        endpointRegistry.setBaseUrl(API_CONFIG.BASE_URL);\n      }\n    }\n\n    // Apply overlay to registry\n    if (Object.keys(overlay).length > 0) {\n      registry.applyOverlay(overlay as DeepPartial<LibraryConfig>, 'environment');\n    }\n\n    this.initialized = true;\n\n    if (this.config.debug) {\n      console.info('[AppConfigBridge] Synced from app config:', overlay);\n    }\n  }\n\n  /**\n   * Synchronize a specific domain from app config.\n   */\n  syncDomain(domain: 'network' | 'cache' | 'ui', config: object): void {\n    const registry = getConfigRegistry();\n    const overlay: DeepPartial<LibraryConfig> = { [domain]: config };\n    registry.applyOverlay(overlay, 'environment');\n  }\n\n  /**\n   * Check if bridge has been initialized.\n   */\n  isInitialized(): boolean {\n    return this.initialized;\n  }\n\n  // ===========================================================================\n  // Mapping Functions\n  // ===========================================================================\n\n  private mapEnvToNetworkConfig(env: Partial<AppEnvConfig>): Partial<NetworkConfig> {\n    const config: Record<string, number | undefined> = {};\n\n    if (env.apiTimeout !== undefined) {\n      config.defaultTimeout = env.apiTimeout;\n    }\n\n    if (env.apiRetryCount !== undefined) {\n      config.maxRetryAttempts = env.apiRetryCount;\n    }\n\n    if (env.apiRetryDelay !== undefined) {\n      config.retryBaseDelay = env.apiRetryDelay;\n    }\n\n    if (env.wsReconnectInterval !== undefined) {\n      config.websocketReconnectDelay = env.wsReconnectInterval;\n    }\n\n    if (env.wsMaxReconnectAttempts !== undefined) {\n      config.websocketMaxReconnectAttempts = env.wsMaxReconnectAttempts;\n    }\n\n    return config as Partial<NetworkConfig>;\n  }\n\n  private mapTimingToNetworkConfig(timing: Partial<AppTimingConfig>): Partial<NetworkConfig> {\n    const config: Record<string, number | undefined> = {};\n    const api = timing.API;\n\n    if (api != null) {\n      if (api.TIMEOUT !== undefined) config.defaultTimeout = api.TIMEOUT;\n      if (api.TIMEOUT_LONG !== undefined) config.longTimeout = api.TIMEOUT_LONG;\n      if (api.TIMEOUT_SHORT !== undefined) config.shortTimeout = api.TIMEOUT_SHORT;\n      if (api.TIMEOUT_HEALTH !== undefined) config.healthCheckTimeout = api.TIMEOUT_HEALTH;\n      if (api.RETRY_BASE_DELAY !== undefined) config.retryBaseDelay = api.RETRY_BASE_DELAY;\n      if (api.RETRY_MAX_DELAY !== undefined) config.retryMaxDelay = api.RETRY_MAX_DELAY;\n    }\n\n    if (timing.RETRY?.API_ATTEMPTS !== undefined) {\n      config.maxRetryAttempts = timing.RETRY.API_ATTEMPTS;\n    }\n\n    return config as Partial<NetworkConfig>;\n  }\n\n  private mapTimingToCacheConfig(timing: Partial<AppTimingConfig>): Partial<CacheConfig> {\n    const config: Record<string, number | undefined> = {};\n    const stale = timing.QUERY?.STALE;\n    const gc = timing.QUERY?.GC;\n\n    if (stale != null) {\n      if (stale.SHORT !== undefined) config.shortTTL = stale.SHORT;\n      if (stale.MEDIUM !== undefined) config.defaultTTL = stale.MEDIUM;\n      if (stale.LONG !== undefined) config.longTTL = stale.LONG;\n      if (stale.EXTENDED !== undefined) config.extendedTTL = stale.EXTENDED;\n    }\n\n    if (gc != null) {\n      if (gc.MEDIUM !== undefined) config.gcInterval = gc.MEDIUM;\n    }\n\n    return config as Partial<CacheConfig>;\n  }\n\n  private mapTimingToUIConfig(\n    timing: Partial<AppTimingConfig>\n  ): Record<string, number | undefined> {\n    const config: Record<string, number | undefined> = {};\n    const debounce = timing.UI?.DEBOUNCE;\n    const animation = timing.UI?.ANIMATION;\n    const toast = timing.UI?.TOAST;\n    const loading = timing.UI?.LOADING;\n\n    if (debounce != null) {\n      if (debounce.INPUT !== undefined) config.inputDebounce = debounce.INPUT;\n      if (debounce.FORM !== undefined) config.formDebounce = debounce.FORM;\n      if (debounce.RESIZE !== undefined) config.resizeDebounce = debounce.RESIZE;\n      if (debounce.SCROLL !== undefined) config.scrollThrottle = debounce.SCROLL;\n    }\n\n    if (animation != null) {\n      if (animation.FAST !== undefined) config.animationFast = animation.FAST;\n      if (animation.STANDARD !== undefined) config.animationStandard = animation.STANDARD;\n      if (animation.SLOW !== undefined) config.animationSlow = animation.SLOW;\n    }\n\n    if (toast?.STANDARD !== undefined) {\n      config.toastDuration = toast.STANDARD;\n    }\n\n    if (loading != null) {\n      if (loading.SPINNER_DELAY !== undefined) config.spinnerDelay = loading.SPINNER_DELAY;\n      if (loading.MIN_DISPLAY !== undefined) config.skeletonMinDisplay = loading.MIN_DISPLAY;\n    }\n\n    return config;\n  }\n\n  private mapApiConfigToNetworkConfig(apiConfig: Partial<AppApiConfig>): Partial<NetworkConfig> {\n    const config: Record<string, number | undefined> = {};\n\n    if (apiConfig.TIMEOUT != null) {\n      if (apiConfig.TIMEOUT.DEFAULT !== undefined)\n        config.defaultTimeout = apiConfig.TIMEOUT.DEFAULT;\n      if (apiConfig.TIMEOUT.LONG !== undefined) config.longTimeout = apiConfig.TIMEOUT.LONG;\n      if (apiConfig.TIMEOUT.SHORT !== undefined) config.shortTimeout = apiConfig.TIMEOUT.SHORT;\n      if (apiConfig.TIMEOUT.HEALTH !== undefined)\n        config.healthCheckTimeout = apiConfig.TIMEOUT.HEALTH;\n    }\n\n    if (apiConfig.RETRY != null) {\n      if (apiConfig.RETRY.ATTEMPTS !== undefined)\n        config.maxRetryAttempts = apiConfig.RETRY.ATTEMPTS;\n      if (apiConfig.RETRY.BASE_DELAY !== undefined)\n        config.retryBaseDelay = apiConfig.RETRY.BASE_DELAY;\n      if (apiConfig.RETRY.MAX_DELAY !== undefined) config.retryMaxDelay = apiConfig.RETRY.MAX_DELAY;\n    }\n\n    return config as Partial<NetworkConfig>;\n  }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Get the AppConfigBridge singleton instance.\n */\nexport function getAppConfigBridge(): AppConfigBridge {\n  return AppConfigBridge.getInstance();\n}\n\n/**\n * Initialize the library config from app config.\n *\n * This is the main entry point for bridging app config to library config.\n *\n * @example\n * ```typescript\n * // In your app initialization\n * import { env, TIMING, API_CONFIG } from '@/config';\n * import { initLibConfigFromApp } from '@/lib/core/config';\n *\n * initLibConfigFromApp({ env, TIMING, API_CONFIG });\n * ```\n */\nexport function initLibConfigFromApp(appConfig: {\n  env?: Partial<AppEnvConfig>;\n  TIMING?: Partial<AppTimingConfig>;\n  API_CONFIG?: Partial<AppApiConfig>;\n}): void {\n  getAppConfigBridge().syncFromAppConfig(appConfig);\n}\n"],"names":["DEFAULT_BRIDGE_CONFIG","AppConfigBridge","config","appConfig","env","TIMING","API_CONFIG","registry","getConfigRegistry","endpointRegistry","getEndpointRegistry","overlay","networkFromTiming","cacheFromTiming","uiFromTiming","networkFromApi","domain","timing","api","stale","gc","debounce","animation","toast","loading","apiConfig","getAppConfigBridge","initLibConfigFromApp"],"mappings":"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"}