{"version":3,"file":"route-prefetch.mjs","sources":["../../../../src/lib/performance/prefetch/route-prefetch.ts"],"sourcesContent":["/**\n * @file Route Prefetching\n * @description Route-based prefetching for React Router and similar routers.\n * Prefetches route components, data, and assets ahead of navigation.\n *\n * Features:\n * - Route component prefetching\n * - Route data prefetching\n * - Link hover prefetching\n * - Viewport-based route prefetching\n * - Route priority configuration\n * - Navigation prediction\n */\n\nimport {\n  getIntelligentPrefetchEngine,\n  type IntelligentPrefetchEngine,\n} from './intelligent-prefetch';\nimport { getPrefetchQueue, type PrefetchQueue, type PrefetchPriority } from './prefetch-queue';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Route definition for prefetching\n */\nexport interface PrefetchableRoute {\n  path: string;\n  component?: () => Promise<unknown>;\n  dataLoader?: () => Promise<unknown>;\n  assets?: string[];\n  priority?: PrefetchPriority;\n  prefetchOn?: ('viewport' | 'hover' | 'idle' | 'immediate')[];\n  minProbability?: number;\n}\n\n/**\n * Route prefetch configuration\n */\nexport interface RoutePrefetchConfig {\n  /** Enable route prefetching */\n  enabled: boolean;\n  /** Default prefetch triggers */\n  defaultTriggers: ('viewport' | 'hover' | 'idle' | 'immediate')[];\n  /** Hover delay before prefetch (ms) */\n  hoverDelay: number;\n  /** Viewport root margin */\n  viewportMargin: string;\n  /** Enable intelligent prediction */\n  intelligentPrefetch: boolean;\n  /** Minimum prediction probability */\n  minProbability: number;\n  /** Maximum concurrent route prefetches */\n  maxConcurrent: number;\n  /** Cache prefetched components */\n  cacheComponents: boolean;\n  /** Component cache TTL in ms */\n  cacheTTL: number;\n  /** Debug mode */\n  debug: boolean;\n}\n\n/**\n * Route prefetch result\n */\nexport interface RoutePrefetchResult {\n  path: string;\n  component: boolean;\n  data: boolean;\n  assets: string[];\n  duration: number;\n  cached: boolean;\n}\n\n/**\n * Link prefetch handlers\n */\nexport interface LinkPrefetchHandlers {\n  onMouseEnter: () => void;\n  onMouseLeave: () => void;\n  onFocus: () => void;\n  onBlur: () => void;\n  onTouchStart: () => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: RoutePrefetchConfig = {\n  enabled: true,\n  defaultTriggers: ['hover', 'viewport'],\n  hoverDelay: 100,\n  viewportMargin: '200px',\n  intelligentPrefetch: true,\n  minProbability: 0.5,\n  maxConcurrent: 3,\n  cacheComponents: true,\n  cacheTTL: 5 * 60 * 1000, // 5 minutes\n  debug: false,\n};\n\n// ============================================================================\n// Route Prefetch Manager\n// ============================================================================\n\n/**\n * Manages route-based prefetching\n */\nexport class RoutePrefetchManager {\n  private config: RoutePrefetchConfig;\n  private routes: Map<string, PrefetchableRoute> = new Map();\n  private componentCache: Map<string, { module: unknown; timestamp: number }> = new Map();\n  private dataCache: Map<string, { data: unknown; timestamp: number }> = new Map();\n  private prefetchedRoutes: Set<string> = new Set();\n  private hoverTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n  private viewportObserver: IntersectionObserver | null = null;\n  private observedLinks: Map<Element, string> = new Map();\n  private readonly engine: IntelligentPrefetchEngine | null = null;\n  private queue: PrefetchQueue;\n  private currentPath: string = '';\n\n  constructor(config: Partial<RoutePrefetchConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.queue = getPrefetchQueue({ maxConcurrent: this.config.maxConcurrent });\n\n    if (this.config.intelligentPrefetch) {\n      this.engine = getIntelligentPrefetchEngine();\n    }\n\n    this.initViewportObserver();\n  }\n\n  /**\n   * Register routes for prefetching\n   */\n  registerRoutes(routes: PrefetchableRoute[]): void {\n    for (const route of routes) {\n      this.routes.set(route.path, {\n        ...route,\n        prefetchOn: route.prefetchOn ?? this.config.defaultTriggers,\n      });\n    }\n    this.log(`Registered ${routes.length} routes`);\n  }\n\n  /**\n   * Register a single route\n   */\n  registerRoute(route: PrefetchableRoute): void {\n    this.routes.set(route.path, {\n      ...route,\n      prefetchOn: route.prefetchOn ?? this.config.defaultTriggers,\n    });\n  }\n\n  /**\n   * Unregister a route\n   */\n  unregisterRoute(path: string): boolean {\n    return this.routes.delete(path);\n  }\n\n  /**\n   * Set current path (for prediction)\n   */\n  setCurrentPath(path: string): void {\n    const previousPath = this.currentPath;\n    this.currentPath = path;\n\n    if (this.engine && previousPath) {\n      this.engine.recordNavigation({\n        from: previousPath,\n        to: path,\n        duration: 0,\n        interactionType: 'programmatic',\n      });\n    }\n\n    // Trigger prediction-based prefetch\n    if (this.config.intelligentPrefetch) {\n      this.prefetchPredicted();\n    }\n  }\n\n  /**\n   * Prefetch a specific route\n   */\n  async prefetchRoute(path: string): Promise<RoutePrefetchResult> {\n    const startTime = performance.now();\n    const route = this.routes.get(path);\n\n    if (route === undefined) {\n      return {\n        path,\n        component: false,\n        data: false,\n        assets: [],\n        duration: 0,\n        cached: false,\n      };\n    }\n\n    // Check if already prefetched\n    if (this.prefetchedRoutes.has(path)) {\n      return {\n        path,\n        component: true,\n        data: true,\n        assets: route.assets ?? [],\n        duration: 0,\n        cached: true,\n      };\n    }\n\n    this.log(`Prefetching route: ${path}`);\n\n    const results = await Promise.allSettled([\n      route.component !== undefined\n        ? this.prefetchComponent(path, route.component)\n        : Promise.resolve(null),\n      route.dataLoader !== undefined\n        ? this.prefetchData(path, route.dataLoader)\n        : Promise.resolve(null),\n      route.assets !== undefined\n        ? Promise.resolve(this.prefetchAssets(route.assets))\n        : Promise.resolve(null),\n    ]);\n\n    const componentSuccess = results[0]?.status === 'fulfilled';\n    const dataSuccess = results[1]?.status === 'fulfilled';\n    const assetsPrefetched = route.assets ?? [];\n\n    this.prefetchedRoutes.add(path);\n\n    const duration = performance.now() - startTime;\n    this.log(`Route prefetched: ${path} in ${duration.toFixed(2)}ms`);\n\n    return {\n      path,\n      component: componentSuccess,\n      data: dataSuccess,\n      assets: assetsPrefetched,\n      duration,\n      cached: false,\n    };\n  }\n\n  /**\n   * Get cached component for a route\n   */\n  getCachedComponent(path: string): unknown | null {\n    const cached = this.componentCache.get(path);\n    if (cached === undefined) return null;\n\n    // Check TTL\n    if (Date.now() - cached.timestamp > this.config.cacheTTL) {\n      this.componentCache.delete(path);\n      return null;\n    }\n\n    return cached.module;\n  }\n\n  /**\n   * Get cached data for a route\n   */\n  getCachedData(path: string): unknown | null {\n    const cached = this.dataCache.get(path);\n    if (cached === undefined) return null;\n\n    // Check TTL\n    if (Date.now() - cached.timestamp > this.config.cacheTTL) {\n      this.dataCache.delete(path);\n      return null;\n    }\n\n    return cached.data;\n  }\n\n  /**\n   * Create prefetch handlers for a link\n   */\n  createLinkHandlers(path: string): LinkPrefetchHandlers {\n    const route = this.routes.get(path);\n    const triggers = route?.prefetchOn ?? this.config.defaultTriggers;\n\n    const shouldPrefetchOnHover = triggers.includes('hover');\n\n    return {\n      onMouseEnter: () => {\n        if (shouldPrefetchOnHover) {\n          this.handleHoverStart(path);\n        }\n        // Record hover for prediction\n        this.engine?.recordHover(path);\n      },\n      onMouseLeave: () => {\n        if (shouldPrefetchOnHover) {\n          this.handleHoverEnd(path);\n        }\n      },\n      onFocus: () => {\n        if (shouldPrefetchOnHover) {\n          this.handleHoverStart(path);\n        }\n      },\n      onBlur: () => {\n        if (shouldPrefetchOnHover) {\n          this.handleHoverEnd(path);\n        }\n      },\n      onTouchStart: () => {\n        if (shouldPrefetchOnHover) {\n          // Prefetch immediately on touch\n          void this.prefetchRoute(path);\n        }\n      },\n    };\n  }\n\n  /**\n   * Observe a link element for viewport-based prefetching\n   */\n  observeLink(element: Element, path: string): () => void {\n    const route = this.routes.get(path);\n    const triggers = route?.prefetchOn ?? this.config.defaultTriggers;\n\n    if (!triggers.includes('viewport')) {\n      return () => {};\n    }\n\n    this.observedLinks.set(element, path);\n    this.viewportObserver?.observe(element);\n\n    return () => {\n      this.observedLinks.delete(element);\n      this.viewportObserver?.unobserve(element);\n    };\n  }\n\n  /**\n   * Prefetch all immediate routes\n   */\n  prefetchImmediateRoutes(): void {\n    for (const [path, route] of this.routes.entries()) {\n      if (route.prefetchOn?.includes('immediate') === true) {\n        void this.prefetchRoute(path);\n      }\n    }\n  }\n\n  /**\n   * Prefetch predicted routes\n   */\n  prefetchPredicted(): void {\n    if (this.engine == null || this.currentPath == null || this.currentPath === '') {\n      return;\n    }\n\n    const availablePaths = Array.from(this.routes.keys()).filter(\n      (path) => path !== this.currentPath && !this.prefetchedRoutes.has(path)\n    );\n\n    const prediction = this.engine.predict(this.currentPath, availablePaths);\n\n    for (const candidate of prediction.candidates) {\n      const route = this.routes.get(candidate.url);\n      const minProbability = route?.minProbability ?? this.config.minProbability;\n\n      if (candidate.probability >= minProbability) {\n        this.log(\n          `Predicted route: ${candidate.url} (probability: ${(candidate.probability * 100).toFixed(1)}%)`\n        );\n        void this.prefetchRoute(candidate.url);\n      }\n    }\n  }\n\n  /**\n   * Get prefetch statistics\n   */\n  getStats(): {\n    registeredRoutes: number;\n    prefetchedRoutes: number;\n    cachedComponents: number;\n    cachedData: number;\n  } {\n    return {\n      registeredRoutes: this.routes.size,\n      prefetchedRoutes: this.prefetchedRoutes.size,\n      cachedComponents: this.componentCache.size,\n      cachedData: this.dataCache.size,\n    };\n  }\n\n  /**\n   * Clear all caches\n   */\n  clearCache(): void {\n    this.componentCache.clear();\n    this.dataCache.clear();\n    this.prefetchedRoutes.clear();\n    this.log('Caches cleared');\n  }\n\n  /**\n   * Destroy the manager\n   */\n  destroy(): void {\n    this.clearCache();\n    this.viewportObserver?.disconnect();\n    this.viewportObserver = null;\n    this.observedLinks.clear();\n\n    for (const timer of this.hoverTimers.values()) {\n      clearTimeout(timer);\n    }\n    this.hoverTimers.clear();\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private async prefetchComponent(path: string, loader: () => Promise<unknown>): Promise<unknown> {\n    // Check cache first\n    const cached = this.getCachedComponent(path);\n    if (cached != null) {\n      return cached;\n    }\n\n    const module = await loader();\n\n    if (this.config.cacheComponents) {\n      this.componentCache.set(path, {\n        module,\n        timestamp: Date.now(),\n      });\n    }\n\n    return module;\n  }\n\n  private async prefetchData(path: string, loader: () => Promise<unknown>): Promise<unknown> {\n    // Check cache first\n    const cached = this.getCachedData(path);\n    if (cached !== null) {\n      return cached;\n    }\n\n    const data = await loader();\n\n    this.dataCache.set(path, {\n      data,\n      timestamp: Date.now(),\n    });\n\n    return data;\n  }\n\n  private prefetchAssets(assets: string[]): void {\n    for (const asset of assets) {\n      const type = this.inferAssetType(asset);\n      this.queue.enqueue(asset, { type, priority: 'low' });\n    }\n  }\n\n  private inferAssetType(url: string): 'script' | 'style' | 'image' | 'font' | 'fetch' {\n    if (url.match(/\\.js(\\?|$)/)) return 'script';\n    if (url.match(/\\.css(\\?|$)/)) return 'style';\n    if (url.match(/\\.(png|jpg|jpeg|gif|webp|svg|ico)(\\?|$)/)) return 'image';\n    if (url.match(/\\.(woff|woff2|ttf|otf|eot)(\\?|$)/)) return 'font';\n    return 'fetch';\n  }\n\n  private handleHoverStart(path: string): void {\n    if (this.prefetchedRoutes.has(path)) {\n      return;\n    }\n\n    // Cancel any existing timer\n    const existingTimer = this.hoverTimers.get(path);\n    if (existingTimer !== undefined) {\n      clearTimeout(existingTimer);\n    }\n\n    const timer = setTimeout(() => {\n      void this.prefetchRoute(path);\n      this.hoverTimers.delete(path);\n    }, this.config.hoverDelay);\n\n    this.hoverTimers.set(path, timer);\n  }\n\n  private handleHoverEnd(path: string): void {\n    const timer = this.hoverTimers.get(path);\n    if (timer !== undefined) {\n      clearTimeout(timer);\n      this.hoverTimers.delete(path);\n    }\n  }\n\n  private initViewportObserver(): void {\n    if (typeof IntersectionObserver === 'undefined') {\n      return;\n    }\n\n    this.viewportObserver = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            const path = this.observedLinks.get(entry.target);\n            if (path !== undefined && !this.prefetchedRoutes.has(path)) {\n              void this.prefetchRoute(path);\n            }\n          }\n        });\n      },\n      {\n        rootMargin: this.config.viewportMargin,\n      }\n    );\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[RoutePrefetch] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet managerInstance: RoutePrefetchManager | null = null;\n\n/**\n * Get or create the global route prefetch manager\n */\nexport function getRoutePrefetchManager(\n  config?: Partial<RoutePrefetchConfig>\n): RoutePrefetchManager {\n  managerInstance ??= new RoutePrefetchManager(config);\n  return managerInstance;\n}\n\n/**\n * Reset the manager instance\n */\nexport function resetRoutePrefetchManager(): void {\n  if (managerInstance !== null) {\n    managerInstance.destroy();\n    managerInstance = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Prefetch a route by path\n */\nexport async function prefetchRoute(path: string): Promise<RoutePrefetchResult> {\n  return getRoutePrefetchManager().prefetchRoute(path);\n}\n\n/**\n * Register routes for prefetching\n */\nexport function registerPrefetchRoutes(routes: PrefetchableRoute[]): void {\n  getRoutePrefetchManager().registerRoutes(routes);\n}\n\n/**\n * Create link prefetch handlers\n */\nexport function createRouteLinkHandlers(path: string): LinkPrefetchHandlers {\n  return getRoutePrefetchManager().createLinkHandlers(path);\n}\n"],"names":["DEFAULT_CONFIG","RoutePrefetchManager","config","getPrefetchQueue","getIntelligentPrefetchEngine","routes","route","path","previousPath","startTime","results","componentSuccess","dataSuccess","assetsPrefetched","duration","cached","shouldPrefetchOnHover","element","availablePaths","prediction","candidate","minProbability","timer","loader","module","data","assets","asset","type","url","existingTimer","entries","entry","message","args","managerInstance","getRoutePrefetchManager","resetRoutePrefetchManager","prefetchRoute","registerPrefetchRoutes","createRouteLinkHandlers"],"mappings":"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"}