{"version":3,"file":"config-merger.mjs","sources":["../../../src/lib/config/config-merger.ts"],"sourcesContent":["/**\n * @fileoverview Configuration merging utilities.\n *\n * Provides flexible merging strategies:\n * - Deep merge for nested objects\n * - Shallow merge for top-level properties\n * - Replace strategy for complete override\n * - Array handling options\n *\n * @module config/config-merger\n *\n * @example\n * ```typescript\n * const merger = new ConfigMerger({ strategy: 'deep' });\n * const merged = merger.merge(baseConfig, overrides);\n * ```\n */\n\nimport type { ConfigRecord, ConfigValue, MergeOptions } from './types';\n\n// ============================================================================\n// Config Merger\n// ============================================================================\n\n/**\n * Configuration merger with multiple strategies.\n */\nexport class ConfigMerger {\n  private options: Required<MergeOptions>;\n\n  constructor(options: MergeOptions = {}) {\n    this.options = {\n      strategy: options.strategy ?? 'deep',\n      arrayMerge: options.arrayMerge ?? 'replace',\n      nullHandling: options.nullHandling ?? 'keep',\n    };\n  }\n\n  /**\n   * Merge multiple configurations.\n   */\n  merge(...configs: ConfigRecord[]): ConfigRecord {\n    if (configs.length === 0) {\n      return {};\n    }\n\n    if (configs.length === 1) {\n      return { ...configs[0] };\n    }\n\n    return configs.reduce((acc, config) => this.mergeTwo(acc, config), {});\n  }\n\n  /**\n   * Merge two configurations.\n   */\n  mergeTwo(target: ConfigRecord, source: ConfigRecord): ConfigRecord {\n    switch (this.options.strategy) {\n      case 'replace':\n        return { ...source };\n      case 'shallow':\n        return this.shallowMerge(target, source);\n      case 'deep':\n      default:\n        return this.deepMerge(target, source);\n    }\n  }\n\n  private shallowMerge(target: ConfigRecord, source: ConfigRecord): ConfigRecord {\n    const result = { ...target };\n\n    for (const [key, value] of Object.entries(source)) {\n      if (this.shouldIncludeValue(value)) {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  private deepMerge(target: ConfigRecord, source: ConfigRecord): ConfigRecord {\n    const result = { ...target };\n\n    for (const [key, sourceValue] of Object.entries(source)) {\n      if (!this.shouldIncludeValue(sourceValue)) {\n        continue;\n      }\n\n      const targetValue = result[key];\n\n      // Handle arrays\n      if (Array.isArray(sourceValue)) {\n        result[key] = this.mergeArrays(Array.isArray(targetValue) ? targetValue : [], sourceValue);\n        continue;\n      }\n\n      // Handle objects\n      if (this.isPlainObject(sourceValue) && this.isPlainObject(targetValue)) {\n        result[key] = this.deepMerge(targetValue as ConfigRecord, sourceValue as ConfigRecord);\n        continue;\n      }\n\n      // Simple value replacement\n      result[key] = sourceValue;\n    }\n\n    return result;\n  }\n\n  private mergeArrays(target: ConfigValue[], source: ConfigValue[]): ConfigValue[] {\n    switch (this.options.arrayMerge) {\n      case 'concat':\n        return [...target, ...source];\n      case 'unique':\n        return [...new Set([...target, ...source])];\n      case 'replace':\n      default:\n        return [...source];\n    }\n  }\n\n  private shouldIncludeValue(value: unknown): boolean {\n    if (value === null) {\n      return this.options.nullHandling !== 'remove';\n    }\n    return true;\n  }\n\n  private isPlainObject(value: unknown): value is Record<string, unknown> {\n    return (\n      typeof value === 'object' &&\n      value !== null &&\n      !Array.isArray(value) &&\n      Object.getPrototypeOf(value) === Object.prototype\n    );\n  }\n}\n\n// ============================================================================\n// Merge Functions\n// ============================================================================\n\n/**\n * Deep merge configurations.\n */\nexport function deepMerge(...configs: ConfigRecord[]): ConfigRecord {\n  const merger = new ConfigMerger({ strategy: 'deep' });\n  return merger.merge(...configs);\n}\n\n/**\n * Shallow merge configurations.\n */\nexport function shallowMerge(...configs: ConfigRecord[]): ConfigRecord {\n  const merger = new ConfigMerger({ strategy: 'shallow' });\n  return merger.merge(...configs);\n}\n\n/**\n * Replace merge (last config wins).\n */\nexport function replaceMerge(...configs: ConfigRecord[]): ConfigRecord {\n  const merger = new ConfigMerger({ strategy: 'replace' });\n  return merger.merge(...configs);\n}\n\n// ============================================================================\n// Path-based Operations\n// ============================================================================\n\n/**\n * Get a value at a path.\n */\nexport function getValueAtPath<T = ConfigValue>(\n  config: ConfigRecord,\n  path: string,\n  defaultValue?: T\n): T {\n  const parts = path.split('.');\n  let current: unknown = config;\n\n  for (const part of parts) {\n    if (current === null || current === undefined) {\n      return defaultValue as T;\n    }\n\n    if (typeof current !== 'object') {\n      return defaultValue as T;\n    }\n\n    // Handle array indexing\n    const arrayMatch = part.match(/^(\\w+)\\[(\\d+)\\]$/);\n    if (arrayMatch != null) {\n      const [, key, index] = arrayMatch;\n      if (key == null || index == null) {\n        return defaultValue as T;\n      }\n      const obj = current as Record<string, unknown>;\n      const arr = obj[key];\n      if (!Array.isArray(arr)) {\n        return defaultValue as T;\n      }\n      current = arr[parseInt(index, 10)];\n    } else {\n      current = (current as Record<string, unknown>)[part];\n    }\n  }\n\n  return (current as T) ?? (defaultValue as T);\n}\n\n/**\n * Set a value at a path.\n */\nexport function setValueAtPath(\n  config: ConfigRecord,\n  path: string,\n  value: ConfigValue\n): ConfigRecord {\n  const parts = path.split('.');\n  const result = { ...config };\n  let current: Record<string, unknown> = result;\n\n  for (let i = 0; i < parts.length - 1; i++) {\n    const part = parts[i];\n    if (part == null || part === '') continue;\n\n    // Handle array indexing\n    const arrayMatch = part.match(/^(\\w+)\\[(\\d+)\\]$/);\n    if (arrayMatch != null) {\n      const [, key, index] = arrayMatch;\n      if (key == null || key === '' || index == null || index === '') {\n        continue;\n      }\n      if (!Array.isArray(current[key])) {\n        current[key] = [];\n      }\n      const arr = [...(current[key] as unknown[])];\n      current[key] = arr;\n      const idx = parseInt(index, 10);\n      if (typeof arr[idx] !== 'object') {\n        arr[idx] = {};\n      }\n      current = arr[idx] as Record<string, unknown>;\n    } else {\n      if (typeof current[part] !== 'object' || current[part] === null) {\n        current[part] = {};\n      } else {\n        current[part] = { ...current[part] };\n      }\n      current = current[part] as Record<string, unknown>;\n    }\n  }\n\n  const lastPart = parts[parts.length - 1];\n  if (lastPart == null || lastPart === '') return result;\n\n  const arrayMatch = lastPart.match(/^(\\w+)\\[(\\d+)\\]$/);\n  if (arrayMatch != null) {\n    const [, key, index] = arrayMatch;\n    if (key == null || key === '' || index == null || index === '') {\n      return result;\n    }\n    if (!Array.isArray(current[key])) {\n      current[key] = [];\n    }\n    const arr = [...(current[key] as unknown[])];\n    arr[parseInt(index, 10)] = value;\n    current[key] = arr;\n  } else {\n    current[lastPart] = value;\n  }\n\n  return result;\n}\n\n/**\n * Delete a value at a path.\n */\nexport function deleteValueAtPath(config: ConfigRecord, path: string): ConfigRecord {\n  const parts = path.split('.');\n  const result = { ...config };\n\n  if (parts.length === 1) {\n    const [firstPart] = parts;\n    if (firstPart !== undefined) {\n      delete result[firstPart];\n    }\n    return result;\n  }\n\n  let current: Record<string, unknown> = result;\n\n  for (let i = 0; i < parts.length - 1; i++) {\n    const part = parts[i];\n    if (part === undefined) continue;\n    if (typeof current[part] !== 'object' || current[part] === null) {\n      return result; // Path doesn't exist\n    }\n    current[part] = { ...current[part] };\n    current = current[part] as Record<string, unknown>;\n  }\n\n  const lastPart = parts[parts.length - 1];\n  if (lastPart !== undefined) {\n    delete current[lastPart];\n  }\n  return result;\n}\n\n/**\n * Check if a path exists.\n */\nexport function hasPath(config: ConfigRecord, path: string): boolean {\n  const parts = path.split('.');\n  let current: unknown = config;\n\n  for (const part of parts) {\n    if (current === null || current === undefined) {\n      return false;\n    }\n\n    if (typeof current !== 'object') {\n      return false;\n    }\n\n    if (!(part in (current as Record<string, unknown>))) {\n      return false;\n    }\n\n    current = (current as Record<string, unknown>)[part];\n  }\n\n  return true;\n}\n\n/**\n * Get all paths in a configuration.\n */\nexport function getAllPaths(config: ConfigRecord, prefix = ''): string[] {\n  const paths: string[] = [];\n\n  for (const [key, value] of Object.entries(config)) {\n    const path = prefix ? `${prefix}.${key}` : key;\n    paths.push(path);\n\n    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n      paths.push(...getAllPaths(value as ConfigRecord, path));\n    }\n  }\n\n  return paths;\n}\n\n// ============================================================================\n// Diff Operations\n// ============================================================================\n\n/**\n * Configuration difference.\n */\nexport interface ConfigDiff {\n  readonly added: Record<string, ConfigValue>;\n  readonly removed: string[];\n  readonly changed: Array<{\n    path: string;\n    oldValue: ConfigValue;\n    newValue: ConfigValue;\n  }>;\n}\n\n/**\n * Calculate the difference between two configurations.\n */\nexport function diffConfigs(oldConfig: ConfigRecord, newConfig: ConfigRecord): ConfigDiff {\n  const added: Record<string, ConfigValue> = {};\n  const removed: string[] = [];\n  const changed: Array<{\n    path: string;\n    oldValue: ConfigValue;\n    newValue: ConfigValue;\n  }> = [];\n\n  const oldPaths = new Set(getAllPaths(oldConfig));\n  const newPaths = new Set(getAllPaths(newConfig));\n\n  // Find added paths\n  for (const path of newPaths) {\n    if (!oldPaths.has(path)) {\n      added[path] = getValueAtPath(newConfig, path);\n    }\n  }\n\n  // Find removed paths\n  for (const path of oldPaths) {\n    if (!newPaths.has(path)) {\n      removed.push(path);\n    }\n  }\n\n  // Find changed values\n  for (const path of oldPaths) {\n    if (newPaths.has(path)) {\n      const oldValue = getValueAtPath(oldConfig, path);\n      const newValue = getValueAtPath(newConfig, path);\n\n      if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n        changed.push({ path, oldValue, newValue });\n      }\n    }\n  }\n\n  return { added, removed, changed };\n}\n\n// ============================================================================\n// Flatten/Unflatten\n// ============================================================================\n\n/**\n * Flatten a nested configuration to dot-notation paths.\n */\nexport function flattenConfig(config: ConfigRecord, prefix = ''): Record<string, ConfigValue> {\n  const result: Record<string, ConfigValue> = {};\n\n  for (const [key, value] of Object.entries(config)) {\n    const path = prefix ? `${prefix}.${key}` : key;\n\n    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n      Object.assign(result, flattenConfig(value as ConfigRecord, path));\n    } else {\n      result[path] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Unflatten a dot-notation configuration to nested structure.\n */\nexport function unflattenConfig(flat: Record<string, ConfigValue>): ConfigRecord {\n  let result: ConfigRecord = {};\n\n  for (const [path, value] of Object.entries(flat)) {\n    result = setValueAtPath(result, path, value);\n  }\n\n  return result;\n}\n"],"names":["ConfigMerger","options","configs","acc","config","target","source","result","key","value","sourceValue","targetValue","deepMerge","shallowMerge","replaceMerge","getValueAtPath","path","defaultValue","parts","current","part","arrayMatch","index","arr","setValueAtPath","i","idx","lastPart","deleteValueAtPath","firstPart","hasPath","getAllPaths","prefix","paths","diffConfigs","oldConfig","newConfig","added","removed","changed","oldPaths","newPaths","oldValue","newValue","flattenConfig","unflattenConfig","flat"],"mappings":"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"}