{"version":3,"file":"useConfig.mjs","sources":["../../../src/lib/config/useConfig.ts"],"sourcesContent":["/**\n * @fileoverview React hooks for configuration access.\n *\n * Provides convenient hooks for:\n * - Accessing configuration values\n * - Subscribing to changes\n * - Type-safe configuration access\n *\n * @module config/useConfig\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   // Get entire config\n *   const config = useConfig();\n *\n *   // Get specific value\n *   const apiUrl = useConfigValue('api.baseUrl');\n *\n *   // Get with default\n *   const timeout = useConfigValue('api.timeout', 10000);\n *\n *   // Subscribe to changes\n *   useConfigChange('feature.enabled', (value) => {\n *     console.log('Feature enabled changed:', value);\n *   });\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { ConfigRecord, ConfigValue } from './types';\nimport type { ConfigChangeEvent, ConfigChange } from '../contexts/ConfigContext';\nimport { useConfigContext } from './ConfigProvider';\n\n// ============================================================================\n// Basic Hooks\n// ============================================================================\n\n/**\n * Hook to get the entire configuration.\n */\nexport function useConfig<T extends ConfigRecord = ConfigRecord>(): T {\n  const { config } = useConfigContext<T>();\n  return config;\n}\n\n/**\n * Hook to get a specific configuration value.\n */\nexport function useConfigValue<T = ConfigValue>(path: string, defaultValue?: T): T {\n  const { get } = useConfigContext();\n  return useMemo(() => get<T>(path, defaultValue), [get, path, defaultValue]);\n}\n\n/**\n * Hook to check if a configuration path exists.\n */\nexport function useHasConfig(path: string): boolean {\n  const { has } = useConfigContext();\n  return useMemo(() => has(path), [has, path]);\n}\n\n/**\n * Hook to get configuration loading state.\n */\nexport function useConfigLoading(): boolean {\n  const { isLoading } = useConfigContext();\n  return isLoading;\n}\n\n/**\n * Hook to get configuration error.\n */\nexport function useConfigError(): Error | null {\n  const { error } = useConfigContext();\n  return error;\n}\n\n// ============================================================================\n// Mutation Hooks\n// ============================================================================\n\n/**\n * Hook to get a function to update configuration.\n */\nexport function useSetConfig(): (path: string, value: ConfigValue) => void {\n  const { set } = useConfigContext();\n  return set;\n}\n\n/**\n * Hook to get a function to reset configuration.\n */\nexport function useResetConfig(): () => void {\n  const { reset } = useConfigContext();\n  return reset;\n}\n\n/**\n * Hook to get a function to reload configuration.\n */\nexport function useReloadConfig(): () => Promise<void> {\n  const { reload } = useConfigContext();\n  return reload;\n}\n\n/**\n * Hook to get a config value with setter.\n */\nexport function useConfigState<T = ConfigValue>(\n  path: string,\n  defaultValue?: T\n): [T, (value: T) => void] {\n  const { get, set } = useConfigContext();\n\n  const value = useMemo(() => get<T>(path, defaultValue), [get, path, defaultValue]);\n\n  const setValue = useCallback(\n    (newValue: T) => {\n      set(path, newValue as ConfigValue);\n    },\n    [set, path]\n  );\n\n  return [value, setValue];\n}\n\n// ============================================================================\n// Subscription Hooks\n// ============================================================================\n\n/**\n * Hook to subscribe to configuration changes.\n */\nexport function useConfigChange(\n  path: string,\n  callback: (value: ConfigValue, change: ConfigChange) => void\n): void {\n  const { subscribe, get } = useConfigContext();\n\n  useEffect(() => {\n    return subscribe((event: ConfigChangeEvent) => {\n      if (event.type !== 'change' || !event.changes) {\n        return;\n      }\n\n      for (const change of event.changes) {\n        if (change.path === path || change.path.startsWith(`${path}.`)) {\n          callback(get(path), change);\n        }\n      }\n    });\n  }, [subscribe, get, path, callback]);\n}\n\n/**\n * Hook to watch a config value and re-render on change.\n */\nexport function useWatchConfig<T = ConfigValue>(path: string, defaultValue?: T): T {\n  const { get, subscribe } = useConfigContext();\n  const [value, setValue] = useState<T>(() => get<T>(path, defaultValue));\n\n  useEffect(() => {\n    // Update initial value\n    queueMicrotask(() => {\n      setValue(get<T>(path, defaultValue));\n    });\n\n    // Subscribe to changes\n    return subscribe((event: ConfigChangeEvent) => {\n      if (event.type !== 'change' || !event.changes) {\n        return;\n      }\n\n      for (const change of event.changes) {\n        if (change.path === path || change.path.startsWith(`${path}.`)) {\n          setValue(get<T>(path, defaultValue));\n          break;\n        }\n      }\n    });\n  }, [subscribe, get, path, defaultValue]);\n\n  return value;\n}\n\n// ============================================================================\n// Feature Flag Integration Hooks\n// ============================================================================\n\n/**\n * Hook to check if a feature is enabled via config.\n */\nexport function useFeatureConfig(featureName: string): boolean {\n  return useConfigValue<boolean>(`features.${featureName}`, false);\n}\n\n/**\n * Hook to get feature-specific configuration.\n */\nexport function useFeatureSettings<T = ConfigRecord>(featureName: string, defaultSettings?: T): T {\n  return useConfigValue<T>(`features.${featureName}.settings`, defaultSettings as T);\n}\n\n// ============================================================================\n// Environment Hooks\n// ============================================================================\n\n/**\n * Hook to get the current environment.\n */\nexport function useEnvironment(): string {\n  return useConfigValue<string>('app.environment', 'development');\n}\n\n/**\n * Hook to check if running in development.\n */\nexport function useIsDevelopment(): boolean {\n  const env = useEnvironment();\n  return env === 'development';\n}\n\n/**\n * Hook to check if running in production.\n */\nexport function useIsProduction(): boolean {\n  const env = useEnvironment();\n  return env === 'production';\n}\n\n// ============================================================================\n// Selector Hooks\n// ============================================================================\n\n/**\n * Hook to select multiple config values.\n */\nexport function useConfigSelector<T extends Record<string, ConfigValue>>(\n  selector: (config: ConfigRecord) => T\n): T {\n  const { config } = useConfigContext();\n  return useMemo(() => selector(config), [config, selector]);\n}\n\n/**\n * Hook to create a derived config value.\n */\nexport function useConfigDerived<T>(paths: string[], derive: (...values: ConfigValue[]) => T): T {\n  const { get } = useConfigContext();\n\n  return useMemo(() => {\n    const values = paths.map((path) => get(path));\n    return derive(...values);\n  }, [get, paths, derive]);\n}\n\n// ============================================================================\n// Type-Safe Hooks\n// ============================================================================\n\n/**\n * Create a typed config hook for a specific section.\n */\nexport function createTypedConfigHook<T extends ConfigRecord>(basePath: string): () => T {\n  return function useTypedConfig(): T {\n    const { get } = useConfigContext();\n    return get<T>(basePath, {} as T);\n  };\n}\n\n/**\n * Create a typed config value hook for a specific section.\n */\nexport function createTypedValueHook<T>(path: string, defaultValue: T): () => T {\n  return function useTypedValue(): T {\n    return useConfigValue<T>(path, defaultValue);\n  };\n}\n\n// ============================================================================\n// Debug Hooks\n// ============================================================================\n\n/**\n * Hook to get all configuration paths.\n */\nexport function useConfigPaths(): string[] {\n  const { config } = useConfigContext();\n\n  return useMemo(() => {\n    const paths: string[] = [];\n\n    const traverse = (obj: ConfigRecord, prefix = ''): void => {\n      for (const [key, value] of Object.entries(obj)) {\n        const path = prefix ? `${prefix}.${key}` : key;\n        paths.push(path);\n\n        if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n          traverse(value as ConfigRecord, path);\n        }\n      }\n    };\n\n    traverse(config);\n    return paths;\n  }, [config]);\n}\n\n/**\n * Hook to get configuration statistics.\n */\nexport function useConfigStats(): {\n  totalPaths: number;\n  sections: string[];\n  isLoading: boolean;\n  hasError: boolean;\n} {\n  const { config, isLoading, error } = useConfigContext();\n\n  return useMemo(() => {\n    const sections = Object.keys(config);\n    let totalPaths = 0;\n\n    const countPaths = (obj: ConfigRecord): void => {\n      for (const value of Object.values(obj)) {\n        totalPaths++;\n        if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n          countPaths(value as ConfigRecord);\n        }\n      }\n    };\n\n    countPaths(config);\n\n    return {\n      totalPaths,\n      sections,\n      isLoading,\n      hasError: error !== null,\n    };\n  }, [config, isLoading, error]);\n}\n"],"names":["useConfig","config","useConfigContext","useConfigValue","path","defaultValue","get","useMemo","useHasConfig","has","useConfigLoading","isLoading","useConfigError","error","useSetConfig","set","useResetConfig","reset","useReloadConfig","reload","useConfigState","value","setValue","useCallback","newValue","useConfigChange","callback","subscribe","useEffect","event","change","useWatchConfig","useState","useFeatureConfig","featureName","useFeatureSettings","defaultSettings","useEnvironment","useIsDevelopment","useIsProduction","useConfigSelector","selector","useConfigDerived","paths","derive","values","createTypedConfigHook","basePath","createTypedValueHook","useConfigPaths","traverse","obj","prefix","key","useConfigStats","sections","totalPaths","countPaths"],"mappings":"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"}