{"version":3,"file":"bundle-optimizer.mjs","sources":["../../../src/lib/performance/bundle-optimizer.ts"],"sourcesContent":["/**\n * @file Runtime Bundle Optimizer\n * @description PhD-level runtime bundle optimization with device capability detection,\n * network-aware chunk loading, and dynamic import prioritization.\n *\n * Features:\n * - Device capability detection (CPU cores, memory, GPU)\n * - Network-aware chunk sizes\n * - Conditional polyfill loading\n * - Dynamic import prioritization\n * - Module replacement for lighter alternatives\n * - Resource timing analysis\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Device capability tier\n */\nexport type DeviceTier = 'high-end' | 'mid-range' | 'low-end';\n\n/**\n * Device capabilities\n */\nexport interface DeviceCapabilities {\n  /** Number of logical CPU cores */\n  cpuCores: number;\n  /** Device memory in GB (if available) */\n  deviceMemory: number | null;\n  /** Hardware concurrency level */\n  hardwareConcurrency: number;\n  /** GPU info (if available) */\n  gpu: string | null;\n  /** Is touch device */\n  isTouch: boolean;\n  /** Max texture size (WebGL) */\n  maxTextureSize: number | null;\n  /** Supports WebGL */\n  supportsWebGL: boolean;\n  /** Supports WebGL2 */\n  supportsWebGL2: boolean;\n  /** Device tier classification */\n  tier: DeviceTier;\n}\n\n/**\n * Network conditions\n */\nexport interface NetworkConditions {\n  /** Effective connection type */\n  effectiveType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';\n  /** Downlink speed in Mbps */\n  downlink: number | null;\n  /** Round-trip time in ms */\n  rtt: number | null;\n  /** Data saver enabled */\n  saveData: boolean;\n  /** Online status */\n  online: boolean;\n}\n\n/**\n * Bundle loading strategy\n */\nexport interface LoadingStrategy {\n  /** Maximum chunk size in bytes */\n  maxChunkSize: number;\n  /** Enable preloading */\n  preload: boolean;\n  /** Preload distance (number of routes ahead) */\n  preloadDistance: number;\n  /** Enable compression hints */\n  useCompression: boolean;\n  /** Priority boost for critical chunks */\n  priorityBoost: boolean;\n  /** Defer non-critical chunks */\n  deferNonCritical: boolean;\n  /** Use service worker caching */\n  useServiceWorker: boolean;\n}\n\n/**\n * Polyfill configuration\n */\nexport interface PolyfillConfig {\n  /** Feature name */\n  feature: string;\n  /** Detection function */\n  detect: () => boolean;\n  /** Polyfill loader */\n  load: () => Promise<void>;\n  /** Size in bytes */\n  size: number;\n}\n\n/**\n * Module alternative\n */\nexport interface ModuleAlternative {\n  /** Original module name */\n  original: string;\n  /** Lightweight alternative */\n  alternative: string;\n  /** Condition for using alternative */\n  useAlternativeWhen: (capabilities: DeviceCapabilities, network: NetworkConditions) => boolean;\n  /** Size difference (positive = savings) */\n  sizeDifference: number;\n}\n\n/**\n * Bundle optimizer configuration\n */\nexport interface BundleOptimizerConfig {\n  /** Enable device detection */\n  detectDevice?: boolean;\n  /** Enable network monitoring */\n  monitorNetwork?: boolean;\n  /** Custom polyfills */\n  polyfills?: PolyfillConfig[];\n  /** Module alternatives */\n  alternatives?: ModuleAlternative[];\n  /** Enable debug logging */\n  debug?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst CHUNK_SIZE_LIMITS: Record<DeviceTier, Record<NetworkConditions['effectiveType'], number>> = {\n  'high-end': {\n    '4g': 500 * 1024,      // 500KB\n    '3g': 200 * 1024,      // 200KB\n    '2g': 100 * 1024,      // 100KB\n    'slow-2g': 50 * 1024,  // 50KB\n    'unknown': 200 * 1024, // 200KB default\n  },\n  'mid-range': {\n    '4g': 300 * 1024,\n    '3g': 150 * 1024,\n    '2g': 75 * 1024,\n    'slow-2g': 30 * 1024,\n    'unknown': 150 * 1024,\n  },\n  'low-end': {\n    '4g': 150 * 1024,\n    '3g': 75 * 1024,\n    '2g': 50 * 1024,\n    'slow-2g': 25 * 1024,\n    'unknown': 75 * 1024,\n  },\n};\n\n// Common polyfills\nconst COMMON_POLYFILLS: PolyfillConfig[] = [\n  {\n    feature: 'IntersectionObserver',\n    detect: () => 'IntersectionObserver' in window,\n    load: async () => Promise.resolve().then(() => {}), // Polyfill loaded via script\n    size: 7 * 1024,\n  },\n  // NOTE: ResizeObserver polyfill commented out - module not available\n  // {\n  //   feature: 'ResizeObserver',\n  //   detect: () => 'ResizeObserver' in window,\n  //   load: () => import('@juggle/resize-observer').then((m) => {\n  //     if (!('ResizeObserver' in window)) {\n  //       (window as Window & { ResizeObserver: typeof ResizeObserver }).ResizeObserver = m.ResizeObserver;\n  //     }\n  //   }),\n  //   size: 3 * 1024,\n  // },\n  {\n    feature: 'requestIdleCallback',\n    detect: () => 'requestIdleCallback' in window,\n    load: async () => Promise.resolve().then(() => {\n      if (!('requestIdleCallback' in window)) {\n        (window as Window & { requestIdleCallback: typeof requestIdleCallback }).requestIdleCallback = (cb) =>\n          setTimeout(() => cb({ didTimeout: false, timeRemaining: () => 50 }), 1) as unknown as number;\n        (window as Window & { cancelIdleCallback: typeof cancelIdleCallback }).cancelIdleCallback = clearTimeout;\n      }\n    }),\n    size: 500,\n  },\n];\n\n// ============================================================================\n// Device Detection\n// ============================================================================\n\n/**\n * Detect device capabilities\n */\nexport function detectDeviceCapabilities(): DeviceCapabilities {\n  const nav = navigator as Navigator & {\n    deviceMemory?: number;\n    hardwareConcurrency?: number;\n  };\n\n  const cpuCores = nav.hardwareConcurrency ?? 2;\n  const deviceMemory = nav.deviceMemory ?? null;\n  const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\n  // WebGL detection\n  let gpu: string | null = null;\n  let maxTextureSize: number | null = null;\n  let supportsWebGL = false;\n  let supportsWebGL2 = false;\n\n  try {\n    const canvas = document.createElement('canvas');\n    const gl2 = canvas.getContext('webgl2');\n    const gl = gl2 ?? canvas.getContext('webgl');\n\n    if (gl != null) {\n      supportsWebGL = true;\n      supportsWebGL2 = gl2 != null;\n\n      const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n      if (debugInfo != null) {\n        gpu = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string | null;\n      }\n\n      maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null;\n    }\n  } catch {\n    // WebGL not available\n  }\n\n  // Determine tier\n  let tier: DeviceTier = 'mid-range';\n\n  if (cpuCores >= 8 && (deviceMemory === null || deviceMemory >= 8)) {\n    tier = 'high-end';\n  } else if (cpuCores <= 2 || (deviceMemory !== null && deviceMemory <= 2)) {\n    tier = 'low-end';\n  }\n\n  return {\n    cpuCores,\n    deviceMemory,\n    hardwareConcurrency: cpuCores,\n    gpu,\n    isTouch,\n    maxTextureSize,\n    supportsWebGL,\n    supportsWebGL2,\n    tier,\n  };\n}\n\n/**\n * Detect network conditions\n */\nexport function detectNetworkConditions(): NetworkConditions {\n  const {connection} = (navigator as Navigator & {\n    connection?: {\n      effectiveType?: string;\n      downlink?: number;\n      rtt?: number;\n      saveData?: boolean;\n    };\n  });\n\n  return {\n    effectiveType: (connection?.effectiveType as NetworkConditions['effectiveType']) ?? 'unknown',\n    downlink: connection?.downlink ?? null,\n    rtt: connection?.rtt ?? null,\n    saveData: connection?.saveData ?? false,\n    online: navigator.onLine,\n  };\n}\n\n// ============================================================================\n// Bundle Optimizer Class\n// ============================================================================\n\n/**\n * Runtime bundle optimizer\n */\nexport class BundleOptimizer {\n  private static instance: BundleOptimizer;\n  private config: Required<BundleOptimizerConfig>;\n  private readonly deviceCapabilities: DeviceCapabilities;\n  private networkConditions: NetworkConditions;\n  private loadedPolyfills: Set<string> = new Set();\n  private loadingStrategy: LoadingStrategy;\n  private importQueue: Map<string, Promise<unknown>> = new Map();\n  private networkChangeCallbacks: Set<(conditions: NetworkConditions) => void> = new Set();\n\n  constructor(config: BundleOptimizerConfig = {}) {\n    this.config = {\n      detectDevice: config.detectDevice ?? true,\n      monitorNetwork: config.monitorNetwork ?? true,\n      polyfills: [...COMMON_POLYFILLS, ...(config.polyfills ?? [])],\n      alternatives: config.alternatives ?? [],\n      debug: config.debug ?? false,\n    };\n\n    this.deviceCapabilities = this.config.detectDevice\n      ? detectDeviceCapabilities()\n      : this.getDefaultCapabilities();\n\n    this.networkConditions = detectNetworkConditions();\n    this.loadingStrategy = this.calculateLoadingStrategy();\n\n    if (this.config.monitorNetwork) {\n      this.startNetworkMonitoring();\n    }\n  }\n\n  /**\n   * Get singleton instance\n   */\n  static getInstance(config?: BundleOptimizerConfig): BundleOptimizer {\n    BundleOptimizer.instance ??= new BundleOptimizer(config);\n    return BundleOptimizer.instance;\n  }\n\n  /**\n   * Reset singleton (for testing)\n   */\n  static reset(): void {\n    BundleOptimizer.instance = null as unknown as BundleOptimizer;\n  }\n\n  /**\n   * Subscribe to network changes\n   */\n  onNetworkChange(callback: (conditions: NetworkConditions) => void): () => void {\n    this.networkChangeCallbacks.add(callback);\n    return () => this.networkChangeCallbacks.delete(callback);\n  }\n\n  /**\n   * Load required polyfills\n   */\n  async loadPolyfills(): Promise<void> {\n    const neededPolyfills = this.config.polyfills.filter(\n      (p) => !p.detect() && !this.loadedPolyfills.has(p.feature)\n    );\n\n    this.log(`Loading ${neededPolyfills.length} polyfills`);\n\n    await Promise.all(\n      neededPolyfills.map(async (polyfill) => {\n        try {\n          await polyfill.load();\n          this.loadedPolyfills.add(polyfill.feature);\n          this.log(`Loaded polyfill: ${polyfill.feature}`);\n        } catch (error) {\n          console.error(`Failed to load polyfill: ${polyfill.feature}`, error);\n        }\n      })\n    );\n  }\n\n  /**\n   * Check if polyfill is needed\n   */\n  needsPolyfill(feature: string): boolean {\n    const polyfill = this.config.polyfills.find((p) => p.feature === feature);\n    return polyfill ? !polyfill.detect() : false;\n  }\n\n  /**\n   * Get optimal module for current conditions\n   */\n  getOptimalModule(moduleName: string): string {\n    const alternative = this.config.alternatives.find(\n      (a) => a.original === moduleName &&\n        a.useAlternativeWhen(this.deviceCapabilities, this.networkConditions)\n    );\n\n    if (alternative) {\n      this.log(`Using alternative for ${moduleName}: ${alternative.alternative}`);\n      return alternative.alternative;\n    }\n\n    return moduleName;\n  }\n\n  /**\n   * Priority-based dynamic import\n   */\n  async importWithPriority<T>(\n    importFn: () => Promise<T>,\n    options: {\n      priority?: 'critical' | 'high' | 'normal' | 'low';\n      moduleId?: string;\n      timeout?: number;\n    } = {}\n  ): Promise<T> {\n    const { priority = 'normal', moduleId, timeout = 30000 } = options;\n\n    // Check if already loading\n    if (moduleId != null && moduleId !== '' && this.importQueue.has(moduleId)) {\n      return this.importQueue.get(moduleId) as Promise<T>;\n    }\n\n    // Defer low priority imports on constrained connections\n    if (priority === 'low' && this.loadingStrategy.deferNonCritical) {\n      await new Promise((resolve) => {\n        if (typeof requestIdleCallback !== 'undefined') {\n          requestIdleCallback(() => resolve(undefined));\n        } else {\n          setTimeout(resolve, 100);\n        }\n      });\n    }\n\n    const importPromise = Promise.race([\n      importFn(),\n      new Promise<never>((_, reject) =>\n        setTimeout(() => reject(new Error('Import timeout')), timeout)\n      ),\n    ]);\n\n    if (moduleId != null && moduleId !== '') {\n      this.importQueue.set(moduleId, importPromise);\n    }\n\n    try {\n\n      return await importPromise;\n    } finally {\n      if (moduleId != null && moduleId !== '') {\n        this.importQueue.delete(moduleId);\n      }\n    }\n  }\n\n  // ============================================================================\n  // Polyfill Management\n  // ============================================================================\n\n  /**\n   * Preload modules based on route prediction\n   */\n  preloadModules(modules: Array<() => Promise<unknown>>): void {\n    if (!this.loadingStrategy.preload) {\n      this.log('Preloading disabled due to network/device constraints');\n      return;\n    }\n\n    const preloadCount = Math.min(modules.length, this.loadingStrategy.preloadDistance);\n\n    for (let i = 0; i < preloadCount; i++) {\n      // Use idle callback for preloading\n      if (typeof requestIdleCallback !== 'undefined') {\n        requestIdleCallback(() => {\n          const moduleLoader = modules[i];\n          if (moduleLoader) {\n            moduleLoader().catch(() => {\n              // Silently fail preloads\n            });\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * Analyze loaded resources\n   */\n  analyzeLoadedResources(): {\n    totalSize: number;\n    jsSize: number;\n    cssSize: number;\n    imageSize: number;\n    largestResources: Array<{ name: string; size: number; type: string }>;\n    slowestResources: Array<{ name: string; duration: number; type: string }>;\n  } {\n    const entries = performance.getEntriesByType('resource');\n\n    let totalSize = 0;\n    let jsSize = 0;\n    let cssSize = 0;\n    let imageSize = 0;\n    const resources: Array<{ name: string; size: number; duration: number; type: string }> = [];\n\n    entries.forEach((entry) => {\n      const size = entry.transferSize || 0;\n      totalSize += size;\n\n      let type = 'other';\n      if (entry.name.endsWith('.js') || entry.initiatorType === 'script') {\n        type = 'js';\n        jsSize += size;\n      } else if (entry.name.endsWith('.css') || entry.initiatorType === 'css') {\n        type = 'css';\n        cssSize += size;\n      } else if (entry.initiatorType === 'img' || /\\.(jpg|jpeg|png|gif|webp|avif|svg)$/i.test(entry.name)) {\n        type = 'image';\n        imageSize += size;\n      }\n\n      resources.push({\n        name: entry.name,\n        size,\n        duration: entry.duration,\n        type,\n      });\n    });\n\n    // Sort for largest and slowest\n    const sortedBySize = [...resources].sort((a, b) => b.size - a.size);\n    const sortedByDuration = [...resources].sort((a, b) => b.duration - a.duration);\n\n    return {\n      totalSize,\n      jsSize,\n      cssSize,\n      imageSize,\n      largestResources: sortedBySize.slice(0, 10).map(({ name, size, type }) => ({ name, size, type })),\n      slowestResources: sortedByDuration.slice(0, 10).map(({ name, duration, type }) => ({ name, duration, type })),\n    };\n  }\n\n  // ============================================================================\n  // Module Management\n  // ============================================================================\n\n  /**\n   * Get device capabilities\n   */\n  getDeviceCapabilities(): DeviceCapabilities {\n    return { ...this.deviceCapabilities };\n  }\n\n  /**\n   * Get network conditions\n   */\n  getNetworkConditions(): NetworkConditions {\n    return { ...this.networkConditions };\n  }\n\n  /**\n   * Get loading strategy\n   */\n  getLoadingStrategy(): LoadingStrategy {\n    return { ...this.loadingStrategy };\n  }\n\n  // ============================================================================\n  // Resource Analysis\n  // ============================================================================\n\n  /**\n   * Get default capabilities\n   */\n  private getDefaultCapabilities(): DeviceCapabilities {\n    return {\n      cpuCores: 4,\n      deviceMemory: 4,\n      hardwareConcurrency: 4,\n      gpu: null,\n      isTouch: false,\n      maxTextureSize: 4096,\n      supportsWebGL: true,\n      supportsWebGL2: true,\n      tier: 'mid-range',\n    };\n  }\n\n  // ============================================================================\n  // Getters\n  // ============================================================================\n\n  /**\n   * Calculate optimal loading strategy\n   */\n  private calculateLoadingStrategy(): LoadingStrategy {\n    const {tier} = this.deviceCapabilities;\n    const {effectiveType} = this.networkConditions;\n\n    const maxChunkSize = CHUNK_SIZE_LIMITS[tier][effectiveType];\n\n    let preloadDistance = 1;\n    if (tier === 'high-end') {\n      preloadDistance = 3;\n    } else if (tier === 'mid-range') {\n      preloadDistance = 2;\n    }\n\n    return {\n      maxChunkSize,\n      preload: !this.networkConditions.saveData && effectiveType !== 'slow-2g',\n      preloadDistance,\n      useCompression: true,\n      priorityBoost: tier !== 'low-end',\n      deferNonCritical: tier === 'low-end' || effectiveType === '2g' || effectiveType === 'slow-2g',\n      useServiceWorker: 'serviceWorker' in navigator,\n    };\n  }\n\n  /**\n   * Start network monitoring\n   */\n  private startNetworkMonitoring(): void {\n    const {connection} = (navigator as Navigator & {\n      connection?: EventTarget & { addEventListener: (type: string, handler: () => void) => void };\n    });\n\n    if (connection != null) {\n      connection.addEventListener('change', () => {\n        this.networkConditions = detectNetworkConditions();\n        this.loadingStrategy = this.calculateLoadingStrategy();\n        this.notifyNetworkChange();\n      });\n    }\n\n    window.addEventListener('online', () => {\n      this.networkConditions.online = true;\n      this.notifyNetworkChange();\n    });\n\n    window.addEventListener('offline', () => {\n      this.networkConditions.online = false;\n      this.notifyNetworkChange();\n    });\n  }\n\n  /**\n   * Notify network change listeners\n   */\n  private notifyNetworkChange(): void {\n    this.networkChangeCallbacks.forEach((cb) => cb(this.networkConditions));\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console\n      console.log(`[BundleOptimizer] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook for bundle optimization awareness\n */\nexport function useBundleOptimizer(): {\n  deviceCapabilities: DeviceCapabilities;\n  networkConditions: NetworkConditions;\n  loadingStrategy: LoadingStrategy;\n  shouldLoadFeature: (featureSize: number, priority?: 'critical' | 'high' | 'normal' | 'low') => boolean;\n} {\n  const optimizer = useMemo(() => BundleOptimizer.getInstance(), []);\n  const [networkConditions, setNetworkConditions] = useState(optimizer.getNetworkConditions());\n\n  useEffect(() => {\n    return optimizer.onNetworkChange(setNetworkConditions);\n  }, [optimizer]);\n\n  const shouldLoadFeature = useCallback(\n    (featureSize: number, priority: 'critical' | 'high' | 'normal' | 'low' = 'normal') => {\n      if (priority === 'critical') return true;\n\n      const strategy = optimizer.getLoadingStrategy();\n\n      // Don't load large features on constrained connections\n      if (featureSize > strategy.maxChunkSize) {\n        return priority === 'high' && !networkConditions.saveData;\n      }\n\n      return true;\n    },\n    [optimizer, networkConditions.saveData]\n  );\n\n  return {\n    deviceCapabilities: optimizer.getDeviceCapabilities(),\n    networkConditions,\n    loadingStrategy: optimizer.getLoadingStrategy(),\n    shouldLoadFeature,\n  };\n}\n\n/**\n * Hook for conditional feature loading\n */\nexport function useConditionalLoad<T>(\n  loader: () => Promise<T>,\n  options: {\n    condition?: boolean;\n    priority?: 'critical' | 'high' | 'normal' | 'low';\n    fallback?: T;\n    onError?: (error: Error) => void;\n  } = {}\n): { data: T | undefined; loading: boolean; error: Error | null } {\n  const { condition = true, priority = 'normal', fallback, onError } = options;\n  const optimizer = useRef(BundleOptimizer.getInstance());\n  const [data, setData] = useState<T | undefined>(fallback);\n  const [loading, setLoading] = useState(condition);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    if (!condition) {\n      return;\n    }\n\n    let cancelled = false;\n\n    optimizer.current\n      .importWithPriority(loader, { priority })\n      .then((result) => {\n        if (!cancelled) {\n          setData(result);\n          setLoading(false);\n        }\n      })\n      .catch((err: unknown) => {\n        if (!cancelled) {\n          const error = err instanceof Error ? err : new Error(String(err));\n          setError(error);\n          onError?.(error);\n          if (fallback !== undefined) setData(fallback);\n          setLoading(false);\n        }\n      });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [condition, loader, priority, fallback, onError]);\n\n  return { data, loading, error };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the global bundle optimizer instance\n */\nexport function getBundleOptimizer(config?: BundleOptimizerConfig): BundleOptimizer {\n  return BundleOptimizer.getInstance(config);\n}\n\n/**\n * Reset the global optimizer (for testing)\n */\nexport function resetBundleOptimizer(): void {\n  BundleOptimizer.reset();\n}\n\n/**\n * Load polyfills\n */\nexport async function loadPolyfills(): Promise<void> {\n  return BundleOptimizer.getInstance().loadPolyfills();\n}\n\n/**\n * Get optimal module name\n */\nexport function getOptimalModule(moduleName: string): string {\n  return BundleOptimizer.getInstance().getOptimalModule(moduleName);\n}\n\n/**\n * Format bytes helper\n */\nexport function formatBundleSize(bytes: number): string {\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default {\n  BundleOptimizer,\n  getBundleOptimizer,\n  resetBundleOptimizer,\n  detectDeviceCapabilities,\n  detectNetworkConditions,\n  loadPolyfills,\n  getOptimalModule,\n  formatBundleSize,\n  useBundleOptimizer,\n  useConditionalLoad,\n};\n"],"names":["CHUNK_SIZE_LIMITS","COMMON_POLYFILLS","cb","detectDeviceCapabilities","nav","cpuCores","deviceMemory","isTouch","gpu","maxTextureSize","supportsWebGL","supportsWebGL2","canvas","gl2","gl","debugInfo","tier","detectNetworkConditions","connection","BundleOptimizer","config","callback","neededPolyfills","p","polyfill","error","feature","moduleName","alternative","a","importFn","options","priority","moduleId","timeout","resolve","importPromise","_","reject","modules","preloadCount","i","moduleLoader","entries","totalSize","jsSize","cssSize","imageSize","resources","entry","size","type","sortedBySize","b","sortedByDuration","name","duration","effectiveType","maxChunkSize","preloadDistance","message","args","useBundleOptimizer","optimizer","useMemo","networkConditions","setNetworkConditions","useState","useEffect","shouldLoadFeature","useCallback","featureSize","strategy","useConditionalLoad","loader","condition","fallback","onError","useRef","data","setData","loading","setLoading","setError","cancelled","result","err","getBundleOptimizer","resetBundleOptimizer","loadPolyfills","getOptimalModule","formatBundleSize","bytes"],"mappings":"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"}