{"version":3,"file":"route-registry.mjs","sources":["../../../src/lib/routing/route-registry.ts"],"sourcesContent":["/**\n * @file Unified Route Registry\n * @description Centralized route management with type-safe navigation, prefetching, and analytics\n */\n\nimport type { ComponentType, LazyExoticComponent } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n  DiscoveredRoute,\n  NavigationResult,\n  RouteAccessConfig,\n  RouteAnalyticsEvent,\n  RouteMetadata,\n  RouteParams,\n  RoutePrefetchConfig,\n  TypedNavigationOptions,\n} from './types';\nimport { extractParamNames, generateRouteId } from './scanner';\nimport { buildRoutePath } from './route-builder';\nimport { parsePathParams as coreParsePathParams } from './core/path-utils';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\n// =============================================================================\n// Registry Types\n// =============================================================================\n\n/**\n * Registered route entry with all metadata\n */\nexport interface RegisteredRoute<TPath extends string = string> {\n  /** Unique route ID */\n  readonly id: string;\n  /** URL path pattern */\n  readonly path: TPath;\n  /** Display name for UI */\n  readonly displayName: string;\n  /** Source file path */\n  readonly sourceFile: string;\n  /** Route metadata */\n  readonly meta: RouteMetadata;\n  /** Access control */\n  readonly access: RouteAccessConfig;\n  /** Prefetch configuration */\n  readonly prefetch: RoutePrefetchConfig;\n  /** Parameter names */\n  readonly paramNames: readonly string[];\n  /** Lazy component */\n  readonly component?: LazyExoticComponent<ComponentType<unknown>>;\n  /** Preload function */\n  readonly preload?: () => Promise<unknown>;\n  /** Data loader keys for prefetching */\n  readonly dataLoaderKeys?: readonly unknown[][];\n}\n\n/**\n * Route registry state\n */\ninterface RegistryState {\n  routes: Map<string, RegisteredRoute>;\n  routesByPath: Map<string, RegisteredRoute>;\n  prefetchQueue: Set<string>;\n  prefetchedRoutes: Set<string>;\n  analytics: RouteAnalyticsEvent[];\n  listeners: Set<RegistryListener>;\n}\n\n/**\n * Registry listener for route changes\n */\nexport type RegistryListener = (event: RegistryEvent) => void;\n\n/**\n * Registry event types\n */\nexport type RegistryEvent =\n  | { type: 'route_registered'; route: RegisteredRoute }\n  | { type: 'route_unregistered'; routeId: string }\n  | { type: 'prefetch_started'; routeId: string }\n  | { type: 'prefetch_completed'; routeId: string }\n  | { type: 'navigation'; path: string; params?: Record<string, string> };\n\n// =============================================================================\n// Route Registry Class\n// =============================================================================\n\n/**\n * Unified route registry for the application\n */\nclass RouteRegistry {\n  private state: RegistryState = {\n    routes: new Map(),\n    routesByPath: new Map(),\n    prefetchQueue: new Set(),\n    prefetchedRoutes: new Set(),\n    analytics: [],\n    listeners: new Set(),\n  };\n\n  // =========================================================================\n  // Registration\n  // =========================================================================\n\n  /**\n   * Register a route in the registry\n   */\n  register<TPath extends string>(\n    route: Omit<RegisteredRoute<TPath>, 'id' | 'prefetch'> & { id?: string; prefetch?: RoutePrefetchConfig }\n  ): RegisteredRoute<TPath> {\n    const id = route.id ?? this.generateId(route.path);\n\n    const registeredRoute: RegisteredRoute<TPath> = {\n      ...route,\n      id,\n      prefetch: route.prefetch ?? {\n        strategy: 'hover',\n        priority: 'medium',\n        delay: 100,\n        includeData: false,\n        networkConditions: {\n          minQuality: '3g',\n          respectDataSaver: true,\n        },\n      },\n    };\n\n    this.state.routes.set(id, registeredRoute as RegisteredRoute);\n    this.state.routesByPath.set(route.path, registeredRoute as RegisteredRoute);\n\n    this.emit({ type: 'route_registered', route: registeredRoute as RegisteredRoute });\n\n    return registeredRoute;\n  }\n\n  /**\n   * Register multiple routes from discovered routes\n   */\n  registerFromDiscovery(\n    routes: DiscoveredRoute[],\n    componentMap: Map<string, LazyExoticComponent<ComponentType<unknown>>>,\n    preloadMap?: Map<string, () => Promise<unknown>>\n  ): RegisteredRoute[] {\n    const registered: RegisteredRoute[] = [];\n\n    for (const route of routes) {\n      if (route.isLayout) continue;\n\n      const id = generateRouteId(route);\n      const component = componentMap.get(route.filePath);\n      const preload = preloadMap?.get(route.filePath);\n\n      const registeredRoute = this.register({\n        id,\n        path: route.urlPath,\n        displayName: this.generateDisplayName(route),\n        sourceFile: route.filePath,\n        meta: {},\n        access: { isPublic: true },\n        prefetch: {\n          strategy: 'hover',\n          priority: this.inferPriority(route),\n          delay: 100,\n          includeData: false,\n        },\n        paramNames: extractParamNames(route.urlPath),\n        component,\n        preload,\n      });\n\n      registered.push(registeredRoute);\n    }\n\n    return registered;\n  }\n\n  /**\n   * Unregister a route\n   */\n  unregister(routeId: string): boolean {\n    const route = this.state.routes.get(routeId);\n    if (!route) return false;\n\n    this.state.routes.delete(routeId);\n    this.state.routesByPath.delete(route.path);\n    this.state.prefetchQueue.delete(routeId);\n    this.state.prefetchedRoutes.delete(routeId);\n\n    this.emit({ type: 'route_unregistered', routeId });\n\n    return true;\n  }\n\n  /**\n   * Clear all registered routes\n   */\n  clear(): void {\n    const routeIds = Array.from(this.state.routes.keys());\n    for (const id of routeIds) {\n      this.unregister(id);\n    }\n  }\n\n  // =========================================================================\n  // Lookup\n  // =========================================================================\n\n  /**\n   * Get a route by ID\n   */\n  getById(routeId: string): RegisteredRoute | undefined {\n    return this.state.routes.get(routeId);\n  }\n\n  /**\n   * Get a route by path\n   */\n  getByPath(path: string): RegisteredRoute | undefined {\n    return this.state.routesByPath.get(path);\n  }\n\n  /**\n   * Get all registered routes\n   */\n  getAll(): RegisteredRoute[] {\n    return Array.from(this.state.routes.values());\n  }\n\n  /**\n   * Get routes matching a filter\n   */\n  filter(predicate: (route: RegisteredRoute) => boolean): RegisteredRoute[] {\n    return this.getAll().filter(predicate);\n  }\n\n  /**\n   * Find routes by feature\n   */\n  getByFeature(feature: string): RegisteredRoute[] {\n    return this.filter((r) => r.sourceFile.includes(`features/${feature}`));\n  }\n\n  /**\n   * Get public routes\n   */\n  getPublicRoutes(): RegisteredRoute[] {\n    return this.filter((r) => r.access.isPublic);\n  }\n\n  /**\n   * Get protected routes\n   */\n  getProtectedRoutes(): RegisteredRoute[] {\n    return this.filter((r) => !r.access.isPublic);\n  }\n\n  // =========================================================================\n  // Path Building\n  // =========================================================================\n\n  /**\n   * Build a path with type-safe parameters\n   *\n   * Delegates to the canonical `buildRoutePath` from `./route-builder`\n   * to ensure consistent path building across the application.\n   */\n  buildPath<TPath extends string>(\n    path: TPath,\n    params?: RouteParams<TPath>,\n    query?: Record<string, string | undefined>\n  ): string {\n    return buildRoutePath(path, params as Record<string, string>, query);\n  }\n\n  /**\n   * Match a path against registered routes\n   */\n  matchPath(pathname: string): {\n    route: RegisteredRoute | null;\n    params: Record<string, string>;\n  } {\n    for (const route of this.state.routes.values()) {\n      const params = this.extractParams(route.path, pathname);\n      if (params !== null) {\n        return { route, params };\n      }\n    }\n    return { route: null, params: {} };\n  }\n\n  // =========================================================================\n  // Prefetching\n  // =========================================================================\n\n  /**\n   * Queue a route for prefetching\n   */\n  queuePrefetch(routeId: string): void {\n    if (this.state.prefetchedRoutes.has(routeId)) return;\n    if (this.state.prefetchQueue.has(routeId)) return;\n\n    this.state.prefetchQueue.add(routeId);\n  }\n\n  /**\n   * Execute prefetch for a route\n   */\n  async prefetch(routeId: string): Promise<void> {\n    const route = this.state.routes.get(routeId);\n    if (!route) return;\n    if (this.state.prefetchedRoutes.has(routeId)) return;\n\n    this.emit({ type: 'prefetch_started', routeId });\n\n    try {\n      // Prefetch component code\n      if (route.preload) {\n        await route.preload();\n      }\n\n      this.state.prefetchedRoutes.add(routeId);\n      this.state.prefetchQueue.delete(routeId);\n\n      this.emit({ type: 'prefetch_completed', routeId });\n    } catch (error) {\n      console.info(`[RouteRegistry] Prefetch failed for ${routeId}:`, error);\n    }\n  }\n\n  /**\n   * Prefetch by path\n   */\n  async prefetchByPath(path: string): Promise<void> {\n    const route = this.state.routesByPath.get(path);\n    if (route) {\n      await this.prefetch(route.id);\n    }\n  }\n\n  /**\n   * Process prefetch queue\n   */\n  async processQueue(maxConcurrent: number = 2): Promise<void> {\n    const queue = Array.from(this.state.prefetchQueue);\n    const chunks = this.chunkArray(queue, maxConcurrent);\n\n    for (const chunk of chunks) {\n      await Promise.all(chunk.map(async (id) => this.prefetch(id)));\n    }\n  }\n\n  /**\n   * Get prefetch status for a route\n   */\n  isPrefetched(routeId: string): boolean {\n    return this.state.prefetchedRoutes.has(routeId);\n  }\n\n  /**\n   * Clear prefetch cache\n   */\n  clearPrefetchCache(): void {\n    this.state.prefetchedRoutes.clear();\n    this.state.prefetchQueue.clear();\n  }\n\n  // =========================================================================\n  // Analytics\n  // =========================================================================\n\n  /**\n   * Track a navigation event\n   */\n  trackNavigation(\n    path: string,\n    params?: Record<string, string>,\n    metadata?: Record<string, unknown>\n  ): void {\n    const event: RouteAnalyticsEvent = {\n      eventType: 'navigation',\n      path,\n      timestamp: Date.now(),\n      metadata: { ...metadata, params },\n    };\n\n    this.state.analytics.push(event);\n    this.emit({ type: 'navigation', path, params });\n\n    // Trim analytics if too large\n    if (this.state.analytics.length > 1000) {\n      this.state.analytics = this.state.analytics.slice(-500);\n    }\n  }\n\n  /**\n   * Get navigation analytics\n   */\n  getAnalytics(): readonly RouteAnalyticsEvent[] {\n    return this.state.analytics;\n  }\n\n  /**\n   * Get navigation history\n   */\n  getNavigationHistory(limit: number = 50): readonly RouteAnalyticsEvent[] {\n    return this.state.analytics\n      .filter((e) => e.eventType === 'navigation')\n      .slice(-limit);\n  }\n\n  /**\n   * Get most visited routes\n   */\n  getMostVisited(limit: number = 10): Array<{ path: string; count: number }> {\n    const counts = new Map<string, number>();\n\n    for (const event of this.state.analytics) {\n      if (event.eventType === 'navigation') {\n        counts.set(event.path, (counts.get(event.path) ?? 0) + 1);\n      }\n    }\n\n    return Array.from(counts.entries())\n      .map(([path, count]) => ({ path, count }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, limit);\n  }\n\n  // =========================================================================\n  // Event System\n  // =========================================================================\n\n  /**\n   * Subscribe to registry events\n   */\n  subscribe(listener: RegistryListener): () => void {\n    this.state.listeners.add(listener);\n    return () => this.state.listeners.delete(listener);\n  }\n\n  /**\n   * Emit an event to all listeners\n   */\n  private emit(event: RegistryEvent): void {\n    for (const listener of this.state.listeners) {\n      try {\n        listener(event);\n      } catch (error) {\n        console.error('[RouteRegistry] Listener error:', error);\n      }\n    }\n  }\n\n  // =========================================================================\n  // Helpers\n  // =========================================================================\n\n  /**\n   * Generate a route ID from path\n   */\n  private generateId(path: string): string {\n    if (path === '/') return 'INDEX';\n\n    return path\n      .replace(/^\\//, '')\n      .replace(/\\//g, '_')\n      .replace(/:/g, 'BY_')\n      .replace(/\\?/g, '_OPT')\n      .replace(/\\*/g, 'CATCH_ALL')\n      .toUpperCase();\n  }\n\n  /**\n   * Generate display name from route\n   */\n  private generateDisplayName(route: DiscoveredRoute): string {\n    const lastSegment = route.segments[route.segments.length - 1];\n\n    if (!lastSegment) return 'Unknown';\n\n    if (lastSegment.type === 'index') {\n      const parentSegment = route.segments[route.segments.length - 2];\n      if (parentSegment) {\n        return this.capitalize(parentSegment.name || 'Home');\n      }\n      return 'Home';\n    }\n\n    if (lastSegment.type === 'dynamic') {\n      return `${this.capitalize(lastSegment.paramName ?? 'Detail')} Detail`;\n    }\n\n    if (lastSegment.type === 'catchAll') {\n      return 'Catch All';\n    }\n\n    return this.capitalize(lastSegment.name);\n  }\n\n  /**\n   * Infer prefetch priority from route\n   */\n  private inferPriority(route: DiscoveredRoute): 'low' | 'medium' | 'high' {\n    // Shallow routes are higher priority\n    if (route.depth <= 2) return 'high';\n    if (route.depth <= 4) return 'medium';\n    return 'low';\n  }\n\n  /**\n   * Capitalize a string\n   */\n  private capitalize(str: string): string {\n    return str.charAt(0).toUpperCase() + str.slice(1).replace(/-/g, ' ');\n  }\n\n  /**\n   * Extract params from pathname\n   *\n   * Delegates to core path utilities.\n   */\n  private extractParams(\n    pattern: string,\n    pathname: string\n  ): Record<string, string> | null {\n    // Delegate to core path utilities\n    return coreParsePathParams(pattern, pathname);\n  }\n\n  /**\n   * Chunk array for batch processing\n   */\n  private chunkArray<T>(array: T[], size: number): T[][] {\n    const chunks: T[][] = [];\n    for (let i = 0; i < array.length; i += size) {\n      chunks.push(array.slice(i, i + size));\n    }\n    return chunks;\n  }\n}\n\n// =============================================================================\n// Singleton Instance\n// =============================================================================\n\n/**\n * Global route registry instance\n */\nexport const routeRegistry = new RouteRegistry();\n\n// =============================================================================\n// React Integration Hooks\n// =============================================================================\n\n/**\n * Hook for accessing the route registry\n */\nexport function useRouteRegistry(): RouteRegistry {\n  const [, forceUpdate] = useState({});\n\n  useEffect(() => {\n    return routeRegistry.subscribe(() => forceUpdate({}));\n  }, []);\n\n  return routeRegistry;\n}\n\n/**\n * Hook for type-safe navigation with prefetching\n */\nexport function useTypedNavigate(): {\n  navigateTo: <TPath extends string>(\n    path: TPath,\n    params?: RouteParams<TPath>,\n    options?: TypedNavigationOptions & { query?: Record<string, string | undefined> }\n  ) => NavigationResult;\n  prefetchRoute: (path: string) => void;\n  currentPath: string;\n  isActive: (path: string) => boolean;\n  isActivePrefix: (prefix: string) => boolean;\n} {\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  const navigateTo = useCallback(\n    <TPath extends string>(\n      path: TPath,\n      params?: RouteParams<TPath>,\n      options?: TypedNavigationOptions & { query?: Record<string, string | undefined> }\n    ): NavigationResult => {\n      try {\n        const fullPath = routeRegistry.buildPath(path, params, options?.query);\n\n        void navigate(fullPath, {\n          replace: options?.replace,\n          state: options?.state,\n          preventScrollReset: options?.preventScrollReset,\n        });\n\n        void routeRegistry.trackNavigation(fullPath, params as Record<string, string>);\n\n        return { success: true, path: fullPath };\n      } catch (error) {\n        return {\n          success: false,\n          path,\n          error: error instanceof Error ? error : new Error(String(error)),\n        };\n      }\n    },\n    [navigate]\n  );\n\n  const prefetchRoute = useCallback((path: string): void => {\n    void routeRegistry.prefetchByPath(path);\n  }, []);\n\n  return {\n    navigateTo,\n    prefetchRoute,\n    currentPath: location.pathname,\n    isActive: (path: string) => location.pathname === path,\n    isActivePrefix: (prefix: string) => location.pathname.startsWith(prefix),\n  };\n}\n\n/**\n * Hook for prefetching routes on hover/focus\n */\nexport function usePrefetchHandlers(path: string): {\n  onMouseEnter: () => void;\n  onMouseLeave: () => void;\n  onFocus: () => void;\n} {\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\n  \n\n  return useMemo(\n    () => ({\n      onMouseEnter: () => {\n        timeoutRef.current = setTimeout(() => {\n          void routeRegistry.prefetchByPath(path);\n        }, 100);\n      },\n      onMouseLeave: () => {\n        if (timeoutRef.current) {\n          clearTimeout(timeoutRef.current);\n          timeoutRef.current = null;\n        }\n      },\n      onFocus: () => {\n        void routeRegistry.prefetchByPath(path);\n      },\n    }),\n    [path]\n  );\n}\n\n/**\n * Hook for getting route metadata\n */\nexport function useRouteMetadata(path: string): RouteMetadata | undefined {\n  const registry = useRouteRegistry();\n  const route = registry.getByPath(path);\n  return route?.meta;\n}\n\n/**\n * Hook for getting navigation analytics\n */\nexport function useNavigationAnalytics(): {\n  history: readonly RouteAnalyticsEvent[];\n  mostVisited: Array<{ path: string; count: number }>;\n  allEvents: readonly RouteAnalyticsEvent[];\n} {\n  const registry = useRouteRegistry();\n\n  return {\n    history: registry.getNavigationHistory(),\n    mostVisited: registry.getMostVisited(),\n    allEvents: registry.getAnalytics(),\n  };\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { RouteRegistry };\n// Exports moved to avoid conflicts within routing module\n"],"names":["RouteRegistry","route","id","registeredRoute","routes","componentMap","preloadMap","registered","generateRouteId","component","preload","extractParamNames","routeId","routeIds","path","predicate","feature","r","params","query","buildRoutePath","pathname","error","maxConcurrent","queue","chunks","chunk","metadata","event","limit","e","counts","count","a","b","listener","lastSegment","parentSegment","str","pattern","coreParsePathParams","array","size","i","routeRegistry","useRouteRegistry","forceUpdate","useState","useEffect","useTypedNavigate","navigate","useNavigate","location","useLocation","navigateTo","useCallback","options","fullPath","prefetchRoute","prefix","usePrefetchHandlers","timeoutRef","useRef","useMemo","useRouteMetadata","useNavigationAnalytics","registry"],"mappings":"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"}