{"version":3,"file":"flag-driven-loading.mjs","sources":["../../../../src/lib/flags/integration/flag-driven-loading.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport React from 'react';\n/**\n * @fileoverview Flag-driven module loading for conditional imports.\n *\n * This module provides mechanisms for conditionally loading modules based on\n * feature flag states. It supports lazy loading, Suspense integration, and\n * code splitting based on feature flags.\n *\n * @module flags/integration/flag-driven-loading\n *\n * @example\n * ```typescript\n * import {\n *   useFeatureFlaggedModule,\n *   createFlaggedComponent,\n *   FlaggedModuleLoader,\n * } from '@/lib/flags/integration/flag-driven-loading';\n *\n * // Use the hook\n * function Dashboard() {\n *   const { module: AnalyticsV2, isLoading, error } = useFeatureFlaggedModule({\n *     flagKey: 'analytics-v2',\n *     enabledModule: () => import('./AnalyticsV2'),\n *     fallbackModule: () => import('./AnalyticsV1'),\n *   });\n *\n *   if (isLoading) return <Spinner />;\n *   if (error) return <Error error={error} />;\n *   return <AnalyticsV2 />;\n * }\n *\n * // Use the component\n * function App() {\n *   return (\n *     <FlaggedModuleLoader\n *       flagKey=\"new-feature\"\n *       enabledModule={() => import('./NewFeature')}\n *       fallback={<OldFeature />}\n *       loadingFallback={<Spinner />}\n *     />\n *   );\n * }\n * ```\n */\n\nimport {\n  useState,\n  useEffect,\n  useCallback,\n  useMemo,\n  lazy,\n  Suspense,\n  type ComponentType,\n  type ReactNode,\n  type LazyExoticComponent,\n} from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Module loader function type\n */\nexport type ModuleLoader<T = unknown> = () => Promise<{ default: T } | T>;\n\n/**\n * Component module loader\n */\nexport type ComponentLoader<P = unknown> = () => Promise<{\n  default: ComponentType<P>;\n}>;\n\n/**\n * Module load result\n */\nexport interface ModuleLoadResult<T> {\n  /** Loaded module or component */\n  readonly module: T | null;\n  /** Whether module is loading */\n  readonly isLoading: boolean;\n  /** Load error if any */\n  readonly error: Error | null;\n  /** Whether the flag-enabled module was loaded */\n  readonly isEnabledVariant: boolean;\n  /** Reload the module */\n  reload(): void;\n}\n\n/**\n * Flagged module configuration\n */\nexport interface FlaggedModuleConfig<T> {\n  /** Feature flag key */\n  readonly flagKey: string;\n  /** Module to load when flag is enabled */\n  readonly enabledModule: ModuleLoader<T>;\n  /** Module to load when flag is disabled (optional) */\n  readonly fallbackModule?: ModuleLoader<T>;\n  /** Default value if no fallback */\n  readonly defaultValue?: T;\n  /** Timeout for module loading (ms) */\n  readonly timeout?: number;\n  /** Retry configuration */\n  readonly retry?: {\n    attempts: number;\n    delay: number;\n  };\n  /** Flag value getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n  /** Preload on mount even if flag is disabled */\n  readonly preload?: boolean;\n  /** Cache loaded modules */\n  readonly cache?: boolean;\n}\n\n/**\n * Flagged component props\n */\nexport interface FlaggedComponentProps<P = Record<string, unknown>> {\n  /** Feature flag key */\n  readonly flagKey: string;\n  /** Component to load when flag is enabled */\n  readonly enabledComponent: ComponentLoader<P>;\n  /** Component to render when flag is disabled */\n  readonly fallbackComponent?: ComponentType<P>;\n  /** Props to pass to the component */\n  readonly componentProps?: P;\n  /** Loading fallback */\n  readonly loadingFallback?: ReactNode;\n  /** Error fallback */\n  readonly errorFallback?: ReactNode | ((error: Error) => ReactNode);\n  /** Flag value getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n}\n\n/**\n * Module preload configuration\n */\nexport interface ModulePreloadConfig {\n  /** Module to preload */\n  readonly module: ModuleLoader;\n  /** Associated flag key */\n  readonly flagKey?: string;\n  /** Preload priority */\n  readonly priority?: 'high' | 'low' | 'idle';\n  /** Delay before preloading (ms) */\n  readonly delay?: number;\n}\n\n/**\n * Module cache entry\n */\ninterface ModuleCacheEntry<T> {\n  module: T;\n  loadedAt: number;\n  flagEnabled: boolean;\n}\n\n// =============================================================================\n// Module Cache\n// =============================================================================\n\nconst moduleCache = new Map<string, ModuleCacheEntry<unknown>>();\n\n/**\n * Get cached module\n */\nfunction getCachedModule<T>(key: string): T | undefined {\n  const entry = moduleCache.get(key);\n  return entry?.module as T | undefined;\n}\n\n/**\n * Set cached module\n */\nfunction setCachedModule<T>(key: string, module: T, flagEnabled: boolean): void {\n  moduleCache.set(key, {\n    module,\n    loadedAt: Date.now(),\n    flagEnabled,\n  });\n}\n\n/**\n * Clear module cache\n */\nexport function clearModuleCache(): void {\n  moduleCache.clear();\n}\n\n/**\n * Get module cache stats\n */\nexport function getModuleCacheStats(): {\n  size: number;\n  entries: { key: string; loadedAt: number; flagEnabled: boolean }[];\n} {\n  const entries: { key: string; loadedAt: number; flagEnabled: boolean }[] = [];\n\n  moduleCache.forEach((entry, key) => {\n    entries.push({\n      key,\n      loadedAt: entry.loadedAt,\n      flagEnabled: entry.flagEnabled,\n    });\n  });\n\n  return {\n    size: moduleCache.size,\n    entries,\n  };\n}\n\n// =============================================================================\n// Core Implementation\n// =============================================================================\n\n/**\n * Load a module with retry logic\n */\nasync function loadModuleWithRetry<T>(\n  loader: ModuleLoader<T>,\n  options: { attempts: number; delay: number; timeout?: number }\n): Promise<T> {\n  const { attempts, delay, timeout } = options;\n  let lastError: Error | null = null;\n\n  for (let i = 0; i < attempts; i++) {\n    try {\n      const loadPromise = loader();\n\n      const result =\n        timeout != null && timeout !== 0\n          ? await Promise.race([\n              loadPromise,\n              new Promise<never>((_, reject) =>\n                setTimeout(() => reject(new Error('Module load timeout')), timeout)\n              ),\n            ])\n          : await loadPromise;\n\n      // Handle both { default: T } and T\n      if (result != null && typeof result === 'object' && 'default' in result) {\n        return (result as { default: T }).default;\n      }\n      return result as T;\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n\n      if (i < attempts - 1) {\n        await new Promise((resolve) => setTimeout(resolve, delay * (i + 1)));\n      }\n    }\n  }\n\n  throw lastError ?? new Error('Failed to load module');\n}\n\n/**\n * Create a cache key for a flagged module\n */\nfunction createCacheKey(flagKey: string, isEnabled: boolean): string {\n  return `${flagKey}:${isEnabled ? 'enabled' : 'disabled'}`;\n}\n\n// =============================================================================\n// React Hooks\n// =============================================================================\n\n/**\n * Hook to load a module based on feature flag state\n *\n * @example\n * ```typescript\n * const { module: Chart, isLoading } = useFeatureFlaggedModule({\n *   flagKey: 'new-charts',\n *   enabledModule: () => import('./charts/NewChart'),\n *   fallbackModule: () => import('./charts/OldChart'),\n * });\n * ```\n */\nexport function useFeatureFlaggedModule<T>(config: FlaggedModuleConfig<T>): ModuleLoadResult<T> {\n  const {\n    flagKey,\n    enabledModule,\n    fallbackModule,\n    defaultValue,\n    timeout,\n    retry = { attempts: 3, delay: 1000 },\n    getFlag,\n    preload = false,\n    cache = true,\n  } = config;\n\n  const [module, setModule] = useState<T | null>(null);\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n  const [isEnabledVariant, setIsEnabledVariant] = useState(false);\n  const [_loadCount, setLoadCount] = useState(0);\n\n  // Get flag value - try context first, then fallback to provided getter\n  const flagEnabled = useMemo(() => {\n    if (getFlag) {\n      return getFlag(flagKey);\n    }\n    // Default to false if no getter provided\n    return false;\n  }, [flagKey, getFlag]);\n\n  const load = useCallback(async () => {\n    setIsLoading(true);\n    setError(null);\n\n    const cacheKey = createCacheKey(flagKey, flagEnabled);\n\n    // Check cache\n    if (cache) {\n      const cached = getCachedModule<T>(cacheKey);\n      if (cached !== undefined) {\n        setModule(cached);\n        setIsEnabledVariant(flagEnabled);\n        setIsLoading(false);\n        return;\n      }\n    }\n\n    // Determine which module to load\n    const loader = flagEnabled\n      ? enabledModule\n      : (fallbackModule ??\n        (defaultValue !== undefined ? async () => Promise.resolve(defaultValue) : null));\n\n    if (!loader) {\n      setModule(null);\n      setIsLoading(false);\n      return;\n    }\n\n    try {\n      const loadedModule = await loadModuleWithRetry(loader, {\n        attempts: retry.attempts,\n        delay: retry.delay,\n        timeout,\n      });\n\n      setModule(loadedModule);\n      setIsEnabledVariant(flagEnabled);\n\n      if (cache) {\n        setCachedModule(cacheKey, loadedModule, flagEnabled);\n      }\n    } catch (err) {\n      setError(err instanceof Error ? err : new Error(String(err)));\n      setModule(defaultValue ?? null);\n    } finally {\n      setIsLoading(false);\n    }\n  }, [flagKey, flagEnabled, enabledModule, fallbackModule, defaultValue, timeout, retry, cache]);\n\n  // Load on mount and flag change\n  useEffect(() => {\n    void load();\n  }, [load]);\n\n  // Preload the other variant if configured\n  useEffect(() => {\n    if (!preload || !cache) return;\n\n    const preloadLoader = flagEnabled ? fallbackModule : enabledModule;\n    if (!preloadLoader) return;\n\n    const preloadCacheKey = createCacheKey(flagKey, !flagEnabled);\n    if (getCachedModule(preloadCacheKey) !== undefined) return;\n\n    // Preload in idle time\n    if ('requestIdleCallback' in window) {\n      const id = (\n        window as Window & { requestIdleCallback: (cb: () => void) => number }\n      ).requestIdleCallback(() => {\n        void loadModuleWithRetry(preloadLoader, { attempts: 1, delay: 0 })\n          .then((mod) => {\n            setCachedModule(preloadCacheKey, mod, !flagEnabled);\n          })\n          .catch(() => {\n            // Silently fail preload\n          });\n      });\n      return () =>\n        (window as Window & { cancelIdleCallback: (id: number) => void }).cancelIdleCallback(id);\n    }\n\n    return undefined;\n  }, [flagKey, flagEnabled, enabledModule, fallbackModule, preload, cache]);\n\n  const reload = useCallback(() => {\n    setLoadCount((c) => c + 1);\n  }, []);\n\n  return {\n    module,\n    isLoading,\n    error,\n    isEnabledVariant,\n    reload,\n  };\n}\n\n/**\n * Hook to create a lazy component based on feature flag\n */\nexport function useFlaggedLazyComponent<P = Record<string, unknown>>(\n  config: Omit<FlaggedModuleConfig<ComponentType<P>>, 'defaultValue'>\n): {\n  Component: LazyExoticComponent<ComponentType<P>> | null;\n  isEnabledVariant: boolean;\n} {\n  const { flagKey, enabledModule, fallbackModule, getFlag } = config;\n\n  const flagEnabled = useMemo(() => {\n    return getFlag ? getFlag(flagKey) : false;\n  }, [flagKey, getFlag]);\n\n  const Component = useMemo(() => {\n    const loader = flagEnabled ? enabledModule : fallbackModule;\n    if (!loader) return null;\n\n    // Normalize loader to always return { default: T } for React.lazy\n    const normalizedLoader = async (): Promise<{ default: ComponentType<P> }> =>\n      loader().then((mod) => {\n        if (mod !== null && mod !== undefined && typeof mod === 'object' && 'default' in mod) {\n          return mod as { default: ComponentType<P> };\n        }\n        return { default: mod };\n      });\n\n    return lazy(normalizedLoader);\n  }, [flagEnabled, enabledModule, fallbackModule]);\n\n  return {\n    Component,\n    isEnabledVariant: flagEnabled,\n  };\n}\n\n// =============================================================================\n// React Components\n// =============================================================================\n\n/**\n * Component that loads and renders a flagged module\n */\nexport function FlaggedModuleLoader<P extends Record<string, unknown> = Record<string, unknown>>({\n  flagKey,\n  enabledComponent,\n  fallbackComponent: FallbackComponent,\n  componentProps,\n  loadingFallback = null,\n  errorFallback,\n  getFlag,\n}: FlaggedComponentProps<P>): React.JSX.Element | null {\n  const {\n    module: LoadedComponent,\n    isLoading,\n    error,\n  } = useFeatureFlaggedModule<ComponentType<P>>({\n    flagKey,\n    enabledModule: enabledComponent,\n    fallbackModule: FallbackComponent\n      ? async () => Promise.resolve({ default: FallbackComponent })\n      : undefined,\n    getFlag,\n  });\n\n  if (isLoading) {\n    return <>{loadingFallback}</>;\n  }\n\n  if (error) {\n    if (typeof errorFallback === 'function') {\n      return <>{errorFallback(error)}</>;\n    }\n    return <>{errorFallback ?? null}</>;\n  }\n\n  if (!LoadedComponent) {\n    return null;\n  }\n\n  return <LoadedComponent {...((componentProps ?? {}) as P)} />;\n}\n\n/**\n * Suspense-enabled flagged component loader\n */\nexport function SuspenseFlaggedLoader<P extends Record<string, unknown> = Record<string, unknown>>({\n  flagKey,\n  enabledComponent,\n  fallbackComponent,\n  componentProps,\n  loadingFallback = null,\n  getFlag,\n}: Omit<FlaggedComponentProps<P>, 'errorFallback'>): React.JSX.Element {\n  const { Component } = useFlaggedLazyComponent<P>({\n    flagKey,\n    enabledModule: enabledComponent,\n    fallbackModule: fallbackComponent\n      ? async () => Promise.resolve({ default: fallbackComponent })\n      : undefined,\n    getFlag,\n  });\n\n  if (!Component) {\n    return <>{loadingFallback}</>;\n  }\n\n  return (\n    <Suspense fallback={loadingFallback}>\n      <Component {...((componentProps ?? {}) as P)} />\n    </Suspense>\n  );\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a flagged component that auto-loads based on flag state\n */\nexport function createFlaggedComponent<\n  P extends Record<string, unknown> = Record<string, unknown>,\n>(config: {\n  flagKey: string;\n  enabledComponent: ComponentLoader<P>;\n  fallbackComponent?: ComponentType<P>;\n  loadingFallback?: ReactNode;\n  getFlag?: (flagKey: string) => boolean;\n}): ComponentType<P> {\n  const { flagKey, enabledComponent, fallbackComponent, loadingFallback, getFlag } = config;\n\n  function FlaggedComponent(props: P): React.JSX.Element {\n    return (\n      <FlaggedModuleLoader<P>\n        flagKey={flagKey}\n        enabledComponent={enabledComponent}\n        fallbackComponent={fallbackComponent}\n        componentProps={props}\n        loadingFallback={loadingFallback}\n        getFlag={getFlag}\n      />\n    );\n  }\n\n  FlaggedComponent.displayName = `FlaggedComponent(${flagKey})`;\n\n  return FlaggedComponent;\n}\n\n/**\n * Create multiple flagged components from a configuration object\n */\nexport function createFlaggedComponents<\n  TComponents extends Record<string, ComponentLoader>,\n>(config: {\n  components: TComponents;\n  fallbacks?: Partial<Record<keyof TComponents, ComponentType>>;\n  loadingFallback?: ReactNode;\n  getFlag?: (flagKey: string) => boolean;\n}): {\n  [K in keyof TComponents]: ComponentType;\n} {\n  const result: Record<string, ComponentType> = {};\n\n  for (const [key, loader] of Object.entries(config.components)) {\n    result[key] = createFlaggedComponent({\n      flagKey: key,\n      enabledComponent: loader,\n      fallbackComponent: config.fallbacks?.[key as keyof typeof config.fallbacks] as unknown as\n        | ComponentType<unknown>\n        | undefined,\n      loadingFallback: config.loadingFallback,\n      getFlag: config.getFlag,\n    });\n  }\n\n  return result as { [K in keyof TComponents]: ComponentType };\n}\n\n// =============================================================================\n// Preloading Utilities\n// =============================================================================\n\n/**\n * Preload a module in idle time\n */\nexport function preloadModule(config: ModulePreloadConfig): () => void {\n  const { module, priority = 'idle', delay = 0 } = config;\n  let cancelled = false;\n\n  const doPreload = async (): Promise<void> => {\n    if (cancelled) return;\n\n    try {\n      await module();\n    } catch {\n      // Silently fail preload\n    }\n  };\n\n  const schedulePreload = (): void => {\n    if (priority === 'high') {\n      void doPreload();\n      return;\n    }\n\n    if (priority === 'idle' && 'requestIdleCallback' in window) {\n      setTimeout(() => {\n        if (cancelled) return;\n        (\n          window as Window & { requestIdleCallback: (cb: () => void) => number }\n        ).requestIdleCallback(() => {\n          void doPreload();\n        });\n      }, delay);\n    } else {\n      setTimeout(() => {\n        void doPreload();\n      }, delay + 100);\n    }\n  };\n\n  schedulePreload();\n\n  return () => {\n    cancelled = true;\n  };\n}\n\n/**\n * Preload multiple modules\n */\nexport function preloadModules(configs: ModulePreloadConfig[]): () => void {\n  const cancellers = configs.map((config) => preloadModule(config));\n\n  return () => {\n    for (const cancel of cancellers) {\n      cancel();\n    }\n  };\n}\n\n/**\n * Create a preload link for a module\n */\nexport function createModulePreloadLink(moduleUrl: string): HTMLLinkElement {\n  const link = document.createElement('link');\n  link.rel = 'modulepreload';\n  link.href = moduleUrl;\n  document.head.appendChild(link);\n  return link;\n}\n\n// =============================================================================\n// Route-Based Loading\n// =============================================================================\n\n/**\n * Configuration for route-based flagged loading\n */\nexport interface FlaggedRouteModuleConfig<T> {\n  /** Route path pattern */\n  readonly path: string;\n  /** Feature flag key */\n  readonly flagKey: string;\n  /** Module to load when flag is enabled */\n  readonly enabledModule: ModuleLoader<T>;\n  /** Module to load when flag is disabled */\n  readonly fallbackModule: ModuleLoader<T>;\n}\n\n/**\n * Create route loaders that respect feature flags\n */\nexport function createFlaggedRouteLoaders<T>(\n  routes: FlaggedRouteModuleConfig<T>[],\n  getFlag: (flagKey: string) => boolean\n): Map<string, () => Promise<T>> {\n  const loaders = new Map<string, () => Promise<T>>();\n\n  for (const route of routes) {\n    loaders.set(route.path, async () => {\n      const flagEnabled = getFlag(route.flagKey);\n      const loader = flagEnabled ? route.enabledModule : route.fallbackModule;\n\n      const result = await loader();\n      if (\n        result !== null &&\n        result !== undefined &&\n        typeof result === 'object' &&\n        'default' in result\n      ) {\n        return (result as { default: T }).default;\n      }\n      return result as T;\n    });\n  }\n\n  return loaders;\n}\n"],"names":["moduleCache","getCachedModule","key","setCachedModule","module","flagEnabled","clearModuleCache","getModuleCacheStats","entries","entry","loadModuleWithRetry","loader","options","attempts","delay","timeout","lastError","i","loadPromise","result","_","reject","error","resolve","createCacheKey","flagKey","isEnabled","useFeatureFlaggedModule","config","enabledModule","fallbackModule","defaultValue","retry","getFlag","preload","cache","setModule","useState","isLoading","setIsLoading","setError","isEnabledVariant","setIsEnabledVariant","_loadCount","setLoadCount","useMemo","load","useCallback","cacheKey","cached","loadedModule","err","useEffect","preloadLoader","preloadCacheKey","id","mod","reload","c","useFlaggedLazyComponent","lazy","FlaggedModuleLoader","enabledComponent","FallbackComponent","componentProps","loadingFallback","errorFallback","LoadedComponent","jsx","Fragment","SuspenseFlaggedLoader","fallbackComponent","Component","Suspense","createFlaggedComponent","FlaggedComponent","props","createFlaggedComponents","preloadModule","priority","cancelled","doPreload","preloadModules","configs","cancellers","cancel","createModulePreloadLink","moduleUrl","link","createFlaggedRouteLoaders","routes","loaders","route"],"mappings":"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"}