{"version":3,"file":"config-loader.mjs","sources":["../../../src/lib/config/config-loader.ts"],"sourcesContent":["/**\n * @fileoverview Configuration loader for multiple sources.\n *\n * Loads configuration from:\n * - Default values\n * - Environment variables\n * - Configuration files\n * - Remote endpoints\n *\n * @module config/config-loader\n *\n * @example\n * ```typescript\n * const loader = new ConfigLoader({\n *   envPrefix: 'REACT_APP_',\n *   debug: true,\n * });\n *\n * loader.addDefaultSource(defaultConfig);\n * loader.addEnvSource();\n *\n * const config = await loader.load();\n * ```\n */\n\nimport type {\n  ConfigRecord,\n  ConfigValue,\n  ConfigSource,\n  ConfigSourceType,\n  ConfigSchema,\n  ConfigLoaderOptions,\n  RemoteConfigOptions,\n  Environment,\n} from './types';\nimport { ConfigMerger, getValueAtPath } from './config-merger';\nimport { ConfigValidator } from './config-validator';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_ENV_PREFIX = 'APP_';\nconst DEFAULT_REMOTE_TIMEOUT = 10000;\n\n// ============================================================================\n// Config Loader\n// ============================================================================\n\n/**\n * Configuration loader that combines multiple sources.\n */\nexport class ConfigLoader {\n  private sources: ConfigSource[] = [];\n  private schema?: ConfigSchema;\n  private options: Required<ConfigLoaderOptions>;\n  private loaded = false;\n  private cachedConfig: ConfigRecord | null = null;\n\n  constructor(options: ConfigLoaderOptions = {}) {\n    this.options = {\n      basePath: options.basePath ?? '',\n      envPrefix: options.envPrefix ?? DEFAULT_ENV_PREFIX,\n      remoteUrl: options.remoteUrl ?? '',\n      watch: options.watch ?? false,\n      debug: options.debug ?? false,\n      detectEnvironment: options.detectEnvironment ?? this.defaultDetectEnvironment.bind(this),\n    };\n  }\n\n  /**\n   * Set the configuration schema for validation.\n   */\n  setSchema(schema: ConfigSchema): this {\n    this.schema = schema;\n    return this;\n  }\n\n  /**\n   * Add a source with default values.\n   */\n  addDefaultSource(config: ConfigRecord): this {\n    this.sources.push({\n      type: 'default',\n      name: 'default',\n      priority: 1000,\n      data: config,\n    });\n    return this;\n  }\n\n  /**\n   * Add environment variables as a source.\n   */\n  addEnvSource(prefix?: string): this {\n    const envPrefix = prefix ?? this.options.envPrefix;\n    const data = this.loadFromEnvironment(envPrefix);\n\n    this.sources.push({\n      type: 'environment',\n      name: 'env',\n      priority: 100,\n      data,\n    });\n\n    return this;\n  }\n\n  /**\n   * Add a static configuration source.\n   */\n  addSource(type: ConfigSourceType, name: string, data: ConfigRecord, priority?: number): this {\n    this.sources.push({\n      type,\n      name,\n      priority: priority ?? this.getDefaultPriority(type),\n      data,\n    });\n    return this;\n  }\n\n  /**\n   * Add a remote configuration source.\n   */\n  async addRemoteSource(options: RemoteConfigOptions): Promise<this> {\n    const data = await this.loadFromRemote(options);\n\n    this.sources.push({\n      type: 'remote',\n      name: `remote-${options.url}`,\n      priority: 50,\n      data,\n    });\n\n    return this;\n  }\n\n  /**\n   * Load and merge all configuration sources.\n   */\n  async load(): Promise<ConfigRecord> {\n    this.log('Loading configuration...');\n\n    // Sort sources by priority (lower = higher priority)\n    const sortedSources = [...this.sources].sort((a, b) => b.priority - a.priority);\n\n    // Merge in order (higher priority last so it overwrites)\n    const merger = new ConfigMerger({ strategy: 'deep' });\n    const config = merger.merge(...sortedSources.map((s) => s.data));\n\n    await Promise.resolve(); // Ensure async\n\n    // Apply schema defaults\n    if (this.schema) {\n      this.applyDefaults(config, this.schema);\n    }\n\n    // Validate if schema is set\n    if (this.schema) {\n      const validator = new ConfigValidator(this.schema);\n      const result = validator.validate(config);\n\n      if (!result.valid) {\n        const errorMessages = result.errors.map((e) => `${e.path}: ${e.message}`);\n        throw new Error(`Configuration validation failed:\\n${errorMessages.join('\\n')}`);\n      }\n\n      if (result.warnings.length > 0) {\n        result.warnings.forEach((w) => this.log(`Warning: ${w}`));\n      }\n    }\n\n    this.cachedConfig = config;\n    this.loaded = true;\n\n    this.log(`Configuration loaded from ${this.sources.length} sources`);\n    return config;\n  }\n\n  /**\n   * Get the current configuration.\n   */\n  getConfig(): ConfigRecord {\n    if (!this.loaded || !this.cachedConfig) {\n      throw new Error('Configuration not loaded. Call load() first.');\n    }\n    return this.cachedConfig;\n  }\n\n  /**\n   * Get a value from the configuration.\n   */\n  get<T = ConfigValue>(path: string, defaultValue?: T): T {\n    const config = this.getConfig();\n    return getValueAtPath<T>(config, path, defaultValue);\n  }\n\n  /**\n   * Get the current environment.\n   */\n  getEnvironment(): Environment {\n    return this.options.detectEnvironment();\n  }\n\n  /**\n   * Check if a source is loaded.\n   */\n  hasSource(name: string): boolean {\n    return this.sources.some((s) => s.name === name);\n  }\n\n  /**\n   * Get all loaded sources.\n   */\n  getSources(): readonly ConfigSource[] {\n    return [...this.sources];\n  }\n\n  /**\n   * Clear all sources.\n   */\n  clearSources(): void {\n    this.sources = [];\n    this.loaded = false;\n    this.cachedConfig = null;\n  }\n\n  // ==========================================================================\n  // Environment Variable Loading\n  // ==========================================================================\n\n  private loadFromEnvironment(prefix: string): ConfigRecord {\n    const config: ConfigRecord = {};\n\n    // In browser environment\n    if (typeof window !== 'undefined') {\n      // Try import.meta.env (Vite)\n      const importMetaEnv = import.meta?.env ?? {};\n\n      for (const [key, value] of Object.entries(importMetaEnv)) {\n        if (key.startsWith(prefix)) {\n          const configKey = this.envKeyToConfigKey(key, prefix);\n          config[configKey] = this.parseEnvValue(value as string);\n        }\n      }\n\n      // Try process.env (CRA, Next.js SSR)\n      if (typeof process !== 'undefined' && process.env != null) {\n        for (const [key, value] of Object.entries(process.env)) {\n          if (key.startsWith(prefix) && value !== undefined) {\n            const configKey = this.envKeyToConfigKey(key, prefix);\n            config[configKey] = this.parseEnvValue(value);\n          }\n        }\n      }\n    }\n\n    // In Node.js environment\n    if (typeof process !== 'undefined' && process.env != null) {\n      for (const [key, value] of Object.entries(process.env)) {\n        if (key.startsWith(prefix) && value !== undefined) {\n          const configKey = this.envKeyToConfigKey(key, prefix);\n          config[configKey] = this.parseEnvValue(value);\n        }\n      }\n    }\n\n    this.log(`Loaded ${Object.keys(config).length} env variables`);\n    return config;\n  }\n\n  private envKeyToConfigKey(envKey: string, prefix: string): string {\n    // Remove prefix and convert to camelCase\n    const withoutPrefix = envKey.substring(prefix.length);\n    return withoutPrefix\n      .toLowerCase()\n      .replace(/_([a-z])/g, (_: string, letter: string) => letter.toUpperCase());\n  }\n\n  private parseEnvValue(value: string): ConfigValue {\n    // Try to parse as JSON\n    try {\n      return JSON.parse(value) as ConfigValue;\n    } catch {\n      // Return as string\n      return value;\n    }\n  }\n\n  // ==========================================================================\n  // Remote Loading\n  // ==========================================================================\n\n  /**\n   * Load configuration from a remote URL.\n   *\n   * Note: This method intentionally uses raw fetch() rather than apiClient because:\n   * 1. Config loading happens before the apiClient may be fully initialized\n   * 2. Config endpoints may be on CDN or static hosting (not API servers)\n   * 3. The config loader should be independent of the API layer\n   *\n   * @see {@link @/lib/api/api-client} for the main API client\n   */\n  private async loadFromRemote(options: RemoteConfigOptions): Promise<ConfigRecord> {\n    const { url, apiKey, timeout = DEFAULT_REMOTE_TIMEOUT, headers = {} } = options;\n\n    this.log(`Loading remote config from ${url}`);\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n    try {\n      // Raw fetch is intentional - config loading must work before apiClient init\n      const response = await fetch(url, {\n        headers: {\n          'Content-Type': 'application/json',\n          ...(apiKey != null && apiKey !== '' ? { Authorization: `Bearer ${apiKey}` } : {}),\n          ...headers,\n        },\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = (await response.json()) as ConfigRecord;\n      this.log(`Loaded remote config: ${Object.keys(data as Record<string, unknown>).length} keys`);\n      return data;\n    } catch (error) {\n      clearTimeout(timeoutId);\n      this.log('Failed to load remote config:', error);\n      throw error;\n    }\n  }\n\n  // ==========================================================================\n  // Schema Defaults\n  // ==========================================================================\n\n  private applyDefaults(config: ConfigRecord, schema: ConfigSchema): void {\n    for (const [key, fieldSchema] of Object.entries(schema)) {\n      if (config[key] === undefined && fieldSchema.default !== undefined) {\n        config[key] = fieldSchema.default;\n      }\n\n      if (fieldSchema.properties && typeof config[key] === 'object' && config[key] !== null) {\n        this.applyDefaults(config[key] as ConfigRecord, fieldSchema.properties);\n      }\n    }\n  }\n\n  // ==========================================================================\n  // Utilities\n  // ==========================================================================\n\n  private defaultDetectEnvironment(): Environment {\n    // Try import.meta.env (Vite)\n    if (import.meta?.env?.MODE !== undefined) {\n      return import.meta.env.MODE as Environment;\n    }\n\n    // Try process.env (Node.js, CRA)\n    if (\n      typeof process !== 'undefined' &&\n      process.env?.NODE_ENV != null &&\n      process.env.NODE_ENV !== ''\n    ) {\n      return process.env.NODE_ENV as Environment;\n    }\n\n    return 'development';\n  }\n\n  private getDefaultPriority(type: ConfigSourceType): number {\n    switch (type) {\n      case 'default':\n        return 1000;\n      case 'file':\n        return 500;\n      case 'remote':\n        return 200;\n      case 'environment':\n        return 100;\n      case 'runtime':\n        return 10;\n      default:\n        return 500;\n    }\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.options.debug) {\n      console.info(`[ConfigLoader] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a configuration loader with common setup.\n */\nexport function createConfigLoader(options?: ConfigLoaderOptions): ConfigLoader {\n  return new ConfigLoader(options);\n}\n\n/**\n * Load configuration from multiple sources.\n */\nexport async function loadConfig(\n  defaults: ConfigRecord,\n  options?: ConfigLoaderOptions\n): Promise<ConfigRecord> {\n  const loader = new ConfigLoader(options);\n  loader.addDefaultSource(defaults);\n  loader.addEnvSource();\n  return loader.load();\n}\n"],"names":["DEFAULT_ENV_PREFIX","DEFAULT_REMOTE_TIMEOUT","ConfigLoader","options","schema","config","prefix","envPrefix","data","type","name","priority","sortedSources","a","b","ConfigMerger","s","result","ConfigValidator","errorMessages","e","w","path","defaultValue","getValueAtPath","importMetaEnv","__vite_import_meta_env__","key","value","configKey","envKey","_","letter","url","apiKey","timeout","headers","controller","timeoutId","response","error","fieldSchema","message","args","createConfigLoader","loadConfig","defaults","loader"],"mappings":"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"}