{"version":3,"file":"useLibConfig.mjs","sources":["../../../../../src/lib/core/config/hooks/useLibConfig.ts"],"sourcesContent":["/**\n * @fileoverview React hooks for the centralized library configuration system.\n *\n * These hooks provide easy access to library configuration with:\n * - Automatic re-rendering on configuration changes\n * - Type-safe configuration access\n * - Memoization for performance\n *\n * @module core/config/hooks\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n  AuthConfig,\n  CacheConfig,\n  ConfigChangeEvent,\n  ConfigPath,\n  DeepReadonly,\n  FeatureFlagsConfig,\n  LayoutsConfig,\n  LibraryConfig,\n  MonitoringConfig,\n  NetworkConfig,\n  UIConfig,\n  VDOMConfig,\n} from '../types';\n\nimport {\n  getConfigRegistry,\n  getLibConfig,\n  getLibConfigValue,\n  setLibConfigValue,\n  subscribeToLibConfig,\n} from '../registry/ConfigRegistry';\n\nimport { getRuntimeConfigManager } from '../runtime/RuntimeConfigManager';\n\n// =============================================================================\n// Core Configuration Hook\n// =============================================================================\n\n/**\n * Hook to access the complete library configuration.\n *\n * Re-renders when any configuration value changes.\n *\n * @returns The complete library configuration object\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const config = useLibConfig();\n *   return <div>Timeout: {config.network.defaultTimeout}ms</div>;\n * }\n * ```\n */\nexport function useLibConfig(): DeepReadonly<LibraryConfig> {\n  const [config, setConfig] = useState(() => getLibConfig());\n\n  useEffect(() => {\n\n\n    return subscribeToLibConfig(() => {\n      setConfig(getLibConfig());\n    });\n  }, []);\n\n  return config;\n}\n\n// =============================================================================\n// Typed Domain Hooks\n// =============================================================================\n\n/**\n * Hook to access network configuration.\n */\nexport function useNetworkConfig(): DeepReadonly<NetworkConfig> {\n  const config = useLibConfig();\n  return config.network;\n}\n\n/**\n * Hook to access cache configuration.\n */\nexport function useCacheConfig(): DeepReadonly<CacheConfig> {\n  const config = useLibConfig();\n  return config.cache;\n}\n\n/**\n * Hook to access feature flags configuration.\n */\nexport function useFlagsConfig(): DeepReadonly<FeatureFlagsConfig> {\n  const config = useLibConfig();\n  return config.flags;\n}\n\n/**\n * Hook to access authentication configuration.\n */\nexport function useAuthConfig(): DeepReadonly<AuthConfig> {\n  const config = useLibConfig();\n  return config.auth;\n}\n\n/**\n * Hook to access layouts configuration.\n */\nexport function useLayoutsConfig(): DeepReadonly<LayoutsConfig> {\n  const config = useLibConfig();\n  return config.layouts;\n}\n\n/**\n * Hook to access VDOM configuration.\n */\nexport function useVDOMConfig(): DeepReadonly<VDOMConfig> {\n  const config = useLibConfig();\n  return config.vdom;\n}\n\n/**\n * Hook to access UI configuration.\n */\nexport function useUIConfig(): DeepReadonly<UIConfig> {\n  const config = useLibConfig();\n  return config.ui;\n}\n\n/**\n * Hook to access monitoring configuration.\n */\nexport function useMonitoringConfig(): DeepReadonly<MonitoringConfig> {\n  const config = useLibConfig();\n  return config.monitoring;\n}\n\n// =============================================================================\n// Path-Based Hooks\n// =============================================================================\n\n/**\n * Hook to access a specific configuration value by path.\n *\n * Only re-renders when the specific path changes.\n *\n * @param path - Dot-notation path to the config value\n * @param defaultValue - Default value if path doesn't exist\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const timeout = useLibConfigValue('network.defaultTimeout', 30000);\n *   return <div>Timeout: {timeout}ms</div>;\n * }\n * ```\n */\nexport function useLibConfigValue<T>(path: ConfigPath, defaultValue?: T): T {\n  const [value, setValue] = useState(() => getLibConfigValue(path, defaultValue));\n\n  useEffect(() => {\n    const registry = getConfigRegistry();\n\n\n    return registry.subscribeToPath(path, () => {\n      setValue(getLibConfigValue(path, defaultValue));\n    });\n  }, [path, defaultValue]);\n\n  return value;\n}\n\n/**\n * Hook to access and set a configuration value.\n *\n * Returns a tuple of [value, setValue].\n *\n * @param path - Dot-notation path to the config value\n * @param defaultValue - Default value if path doesn't exist\n *\n * @example\n * ```tsx\n * function SettingsPanel() {\n *   const [timeout, setTimeout] = useLibConfigState('network.defaultTimeout', 30000);\n *\n *   return (\n *     <input\n *       type=\"number\"\n *       value={timeout}\n *       onChange={(e) => setTimeout(Number(e.target.value))}\n *     />\n *   );\n * }\n * ```\n */\nexport function useLibConfigState<T>(path: ConfigPath, defaultValue?: T): [T, (value: T) => void] {\n  const value = useLibConfigValue(path, defaultValue);\n\n  const setValue = useCallback(\n    (newValue: T) => {\n      setLibConfigValue(path, newValue);\n    },\n    [path]\n  );\n\n  return [value, setValue];\n}\n\n// =============================================================================\n// Runtime Configuration Hooks\n// =============================================================================\n\n/**\n * Hook to access runtime configuration manager.\n *\n * @example\n * ```tsx\n * function ConfigManager() {\n *   const runtime = useRuntimeConfig();\n *\n *   const handleRollback = () => {\n *     runtime.rollback();\n *   };\n *\n *   return <button onClick={handleRollback}>Rollback</button>;\n * }\n * ```\n */\nexport function useRuntimeConfig(): {\n  manager: ReturnType<typeof getRuntimeConfigManager>;\n  set: (path: ConfigPath, value: unknown) => void;\n  rollback: () => boolean;\n  createSnapshot: (reason?: string) => void;\n  enablePersistence: (storageKey?: string) => void;\n  disablePersistence: () => void;\n} {\n  const manager = useMemo(() => getRuntimeConfigManager(), []);\n\n  const set = useCallback(\n    (path: ConfigPath, value: unknown) => {\n      manager.set(path, value);\n    },\n    [manager]\n  );\n\n  const rollback = useCallback(() => {\n    return manager.rollback();\n  }, [manager]);\n\n  const createSnapshot = useCallback(\n    (reason?: string) => {\n      manager.createSnapshot(reason);\n    },\n    [manager]\n  );\n\n  const enablePersistence = useCallback(\n    (storageKey?: string) => {\n      manager.enablePersistence(storageKey);\n    },\n    [manager]\n  );\n\n  const disablePersistence = useCallback(() => {\n    manager.disablePersistence();\n  }, [manager]);\n\n  return {\n    manager,\n    set,\n    rollback,\n    createSnapshot,\n    enablePersistence,\n    disablePersistence,\n  };\n}\n\n// =============================================================================\n// Change Tracking Hooks\n// =============================================================================\n\n/**\n * Hook to track configuration changes.\n *\n * @param onChangeCallback - Callback to invoke when config changes\n *\n * @example\n * ```tsx\n * function ConfigWatcher() {\n *   useConfigChangeTracking((event) => {\n *     console.log(`${event.path} changed from ${event.previousValue} to ${event.newValue}`);\n *   });\n *\n *   return null;\n * }\n * ```\n */\nexport function useConfigChangeTracking(\n  onChangeCallback: (event: ConfigChangeEvent) => void\n): void {\n  useEffect(() => {\n\n    return subscribeToLibConfig(onChangeCallback);\n  }, [onChangeCallback]);\n}\n\n/**\n * Hook to get the last configuration change.\n */\nexport function useLastConfigChange(): ConfigChangeEvent | null {\n  const [lastChange, setLastChange] = useState<ConfigChangeEvent | null>(null);\n\n  useEffect(() => {\n\n\n    return subscribeToLibConfig((event) => {\n      setLastChange(event);\n    });\n  }, []);\n\n  return lastChange;\n}\n\n// =============================================================================\n// Selector Hooks\n// =============================================================================\n\n/**\n * Hook to select and transform configuration values.\n *\n * @param selector - Function to select/transform config\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const timeouts = useLibConfigSelector((config) => ({\n *     default: config.network.defaultTimeout,\n *     long: config.network.longTimeout,\n *     short: config.network.shortTimeout,\n *   }));\n *\n *   return <div>Default timeout: {timeouts.default}ms</div>;\n * }\n * ```\n */\nexport function useLibConfigSelector<T>(selector: (config: DeepReadonly<LibraryConfig>) => T): T {\n  const config = useLibConfig();\n  return useMemo(() => selector(config), [config, selector]);\n}\n\n// =============================================================================\n// Utility Hooks\n// =============================================================================\n\n/**\n * Hook to check if a configuration path exists.\n */\nexport function useLibConfigExists(path: ConfigPath): boolean {\n  const [exists, setExists] = useState(() => getConfigRegistry().has(path));\n\n  useEffect(() => {\n\n\n    return subscribeToLibConfig(() => {\n      setExists(getConfigRegistry().has(path));\n    });\n  }, [path]);\n\n  return exists;\n}\n\n/**\n * Hook to get all configuration paths.\n */\nexport function useLibConfigPaths(): string[] {\n  const [paths, setPaths] = useState<string[]>(() => getConfigRegistry().getAllPaths());\n\n  useEffect(() => {\n\n\n    return subscribeToLibConfig(() => {\n      setPaths(getConfigRegistry().getAllPaths());\n    });\n  }, []);\n\n  return paths;\n}\n\n/**\n * Hook to get the configuration environment.\n */\nexport function useLibConfigEnvironment(): string {\n  const [env, setEnv] = useState(() => getConfigRegistry().getEnvironment());\n  const initializedRef = useRef(false);\n\n  useEffect(() => {\n    if (!initializedRef.current) {\n      queueMicrotask(() => {\n        initializedRef.current = true;\n        const currentEnv = getConfigRegistry().getEnvironment();\n        if (currentEnv !== env) {\n          setEnv(currentEnv);\n        }\n      });\n    }\n  }, [env]);\n\n  return env;\n}\n"],"names":["useLibConfig","config","setConfig","useState","getLibConfig","useEffect","subscribeToLibConfig","useNetworkConfig","useCacheConfig","useFlagsConfig","useAuthConfig","useLayoutsConfig","useVDOMConfig","useUIConfig","useMonitoringConfig","useLibConfigValue","path","defaultValue","value","setValue","getLibConfigValue","getConfigRegistry","useLibConfigState","useCallback","newValue","setLibConfigValue","useRuntimeConfig","manager","useMemo","getRuntimeConfigManager","set","rollback","createSnapshot","reason","enablePersistence","storageKey","disablePersistence","useConfigChangeTracking","onChangeCallback","useLastConfigChange","lastChange","setLastChange","event","useLibConfigSelector","selector","useLibConfigExists","exists","setExists","useLibConfigPaths","paths","setPaths","useLibConfigEnvironment","env","setEnv","initializedRef","useRef","currentEnv"],"mappings":"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"}