{"version":3,"file":"bundle-analyzer.mjs","sources":["../../../../src/lib/performance/advanced/bundle-analyzer.ts"],"sourcesContent":["/**\n * @file Runtime Bundle Analysis\n * @description Runtime utilities for analyzing bundle composition, chunk loading,\n * and module dependencies. Helps identify optimization opportunities.\n *\n * Features:\n * - Chunk loading analysis\n * - Module dependency tracking\n * - Bundle size estimation\n * - Dynamic import monitoring\n * - Resource timing analysis\n * - Code splitting recommendations\n */\n\nimport { isProd } from '@/lib/core/config/env-helper';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Bundle chunk information\n */\nexport interface ChunkInfo {\n  id: string;\n  name: string;\n  size: number;\n  loadTime: number;\n  dependencies: string[];\n  isAsync: boolean;\n  isEntry: boolean;\n  loadedAt: number;\n  modules: ModuleInfo[];\n}\n\n/**\n * Module information\n */\nexport interface ModuleInfo {\n  id: string;\n  name: string;\n  size: number;\n  importedBy: string[];\n  imports: string[];\n  isExternal: boolean;\n}\n\n/**\n * Bundle analysis report\n */\nexport interface BundleAnalysisReport {\n  totalSize: number;\n  chunks: ChunkInfo[];\n  largestChunks: ChunkInfo[];\n  slowestChunks: ChunkInfo[];\n  duplicateModules: string[];\n  recommendations: BundleRecommendation[];\n  timestamp: number;\n}\n\n/**\n * Bundle optimization recommendation\n */\nexport interface BundleRecommendation {\n  type: 'split' | 'combine' | 'lazy' | 'preload' | 'remove' | 'dedupe';\n  priority: 'high' | 'medium' | 'low';\n  target: string;\n  message: string;\n  estimatedSavings?: number;\n}\n\n/**\n * Resource timing entry\n */\nexport interface ResourceTimingEntry {\n  name: string;\n  entryType: string;\n  startTime: number;\n  duration: number;\n  transferSize: number;\n  encodedBodySize: number;\n  decodedBodySize: number;\n  initiatorType: string;\n  cached: boolean;\n}\n\n/**\n * Dynamic import tracking entry\n */\nexport interface DynamicImportEntry {\n  modulePath: string;\n  chunkName: string | null;\n  startTime: number;\n  endTime: number;\n  duration: number;\n  success: boolean;\n  error?: string;\n}\n\n/**\n * Bundle analyzer configuration\n */\nexport interface BundleAnalyzerConfig {\n  /** Enable analysis */\n  enabled: boolean;\n  /** Track dynamic imports */\n  trackDynamicImports: boolean;\n  /** Track resource timing */\n  trackResourceTiming: boolean;\n  /** Large chunk threshold in bytes */\n  largeChunkThreshold: number;\n  /** Slow chunk threshold in ms */\n  slowChunkThreshold: number;\n  /** Enable recommendations */\n  generateRecommendations: boolean;\n  /** Debug mode */\n  debug: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: BundleAnalyzerConfig = {\n  enabled: !isProd(),\n  trackDynamicImports: true,\n  trackResourceTiming: true,\n  largeChunkThreshold: 250 * 1024, // 250KB\n  slowChunkThreshold: 1000, // 1 second\n  generateRecommendations: true,\n  debug: false,\n};\n\n// ============================================================================\n// Bundle Analyzer\n// ============================================================================\n\n/**\n * Runtime bundle analyzer\n */\nexport class BundleAnalyzer {\n  private config: BundleAnalyzerConfig;\n  private chunks: Map<string, ChunkInfo> = new Map();\n  private dynamicImports: DynamicImportEntry[] = [];\n  private resourceObserver: PerformanceObserver | null = null;\n\n  constructor(config: Partial<BundleAnalyzerConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  /**\n   * Start analyzing bundles\n   */\n  start(): void {\n    if (!this.config.enabled) {\n      return;\n    }\n\n    this.log('Starting bundle analyzer');\n\n    if (this.config.trackResourceTiming) {\n      this.startResourceTracking();\n    }\n\n    // Analyze initial bundles\n    this.analyzeInitialBundles();\n  }\n\n  /**\n   * Stop analyzing\n   */\n  stop(): void {\n    if (this.resourceObserver !== null) {\n      this.resourceObserver.disconnect();\n      this.resourceObserver = null;\n    }\n  }\n\n  /**\n   * Track a dynamic import\n   */\n  async trackDynamicImport(modulePath: string, importPromise: Promise<unknown>): Promise<unknown> {\n    if (!this.config.enabled || !this.config.trackDynamicImports) {\n      return importPromise;\n    }\n\n    const startTime = performance.now();\n    const chunkName = this.extractChunkName(modulePath);\n\n    return importPromise\n      .then((result) => {\n        const endTime = performance.now();\n        this.dynamicImports.push({\n          modulePath,\n          chunkName,\n          startTime,\n          endTime,\n          duration: endTime - startTime,\n          success: true,\n        });\n        this.log(`Dynamic import success: ${modulePath} (${(endTime - startTime).toFixed(2)}ms)`);\n        return result;\n      })\n      .catch((error: unknown) => {\n        const endTime = performance.now();\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        this.dynamicImports.push({\n          modulePath,\n          chunkName,\n          startTime,\n          endTime,\n          duration: endTime - startTime,\n          success: false,\n          error: errorMessage,\n        });\n        this.log(`Dynamic import failed: ${modulePath}`, error);\n        throw error;\n      });\n  }\n\n  /**\n   * Get bundle analysis report\n   */\n  getReport(): BundleAnalysisReport {\n    const chunks = Array.from(this.chunks.values());\n    const totalSize = chunks.reduce((sum, c) => sum + c.size, 0);\n\n    const largestChunks = [...chunks].sort((a, b) => b.size - a.size).slice(0, 10);\n\n    const slowestChunks = [...chunks].sort((a, b) => b.loadTime - a.loadTime).slice(0, 10);\n\n    const duplicateModules = this.findDuplicateModules();\n    const recommendations = this.config.generateRecommendations\n      ? this.generateRecommendations(chunks, duplicateModules)\n      : [];\n\n    return {\n      totalSize,\n      chunks,\n      largestChunks,\n      slowestChunks,\n      duplicateModules,\n      recommendations,\n      timestamp: Date.now(),\n    };\n  }\n\n  /**\n   * Get resource timing data\n   */\n  getResourceTiming(): ResourceTimingEntry[] {\n    return performance\n      .getEntriesByType('resource')\n      .filter((entry) => this.isJavaScriptResource(entry.name))\n      .map((entry) => {\n        const resourceEntry = entry;\n        return {\n          name: resourceEntry.name,\n          entryType: resourceEntry.entryType,\n          startTime: resourceEntry.startTime,\n          duration: resourceEntry.duration,\n          transferSize: resourceEntry.transferSize,\n          encodedBodySize: resourceEntry.encodedBodySize,\n          decodedBodySize: resourceEntry.decodedBodySize,\n          initiatorType: resourceEntry.initiatorType,\n          cached: resourceEntry.transferSize === 0 && resourceEntry.decodedBodySize > 0,\n        };\n      });\n  }\n\n  /**\n   * Get dynamic import history\n   */\n  getDynamicImports(): DynamicImportEntry[] {\n    return [...this.dynamicImports];\n  }\n\n  /**\n   * Clear analysis data\n   */\n  clear(): void {\n    this.chunks.clear();\n    this.dynamicImports = [];\n    performance.clearResourceTimings();\n  }\n\n  /**\n   * Analyze a specific chunk\n   */\n  analyzeChunk(chunkId: string, options: Partial<ChunkInfo> = {}): ChunkInfo {\n    const existing = this.chunks.get(chunkId);\n    if (existing) {\n      return { ...existing, ...options };\n    }\n\n    const chunkInfo: ChunkInfo = {\n      id: chunkId,\n      name: options.name ?? chunkId,\n      size: options.size ?? 0,\n      loadTime: options.loadTime ?? 0,\n      dependencies: options.dependencies ?? [],\n      isAsync: options.isAsync ?? true,\n      isEntry: options.isEntry ?? false,\n      loadedAt: options.loadedAt ?? Date.now(),\n      modules: options.modules ?? [],\n    };\n\n    this.chunks.set(chunkId, chunkInfo);\n    return chunkInfo;\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private startResourceTracking(): void {\n    if (typeof PerformanceObserver === 'undefined') {\n      return;\n    }\n\n    try {\n      this.resourceObserver = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          if (this.isJavaScriptResource(entry.name)) {\n            this.processResourceEntry(entry as PerformanceResourceTiming);\n          }\n        }\n      });\n\n      this.resourceObserver.observe({ type: 'resource', buffered: true });\n    } catch (error) {\n      this.log('Failed to start resource tracking:', error);\n    }\n  }\n\n  private analyzeInitialBundles(): void {\n    // Analyze already loaded scripts\n    const resources = this.getResourceTiming();\n\n    for (const resource of resources) {\n      const chunkId = this.extractChunkId(resource.name);\n      this.analyzeChunk(chunkId, {\n        name: resource.name,\n        size: resource.decodedBodySize,\n        loadTime: resource.duration,\n        isEntry: resource.initiatorType === 'script',\n        isAsync: resource.initiatorType !== 'script',\n        loadedAt: Date.now() - resource.duration,\n      });\n    }\n  }\n\n  private processResourceEntry(entry: PerformanceResourceTiming): void {\n    if (!this.isJavaScriptResource(entry.name)) {\n      return;\n    }\n\n    const chunkId = this.extractChunkId(entry.name);\n    this.analyzeChunk(chunkId, {\n      name: entry.name,\n      size: entry.decodedBodySize,\n      loadTime: entry.duration,\n      isAsync: entry.initiatorType !== 'script',\n      loadedAt: Date.now(),\n    });\n\n    // Check for slow chunk\n    if (entry.duration > this.config.slowChunkThreshold) {\n      this.log(`Slow chunk detected: ${entry.name} (${entry.duration.toFixed(2)}ms)`);\n    }\n\n    // Check for large chunk\n    if (entry.decodedBodySize > this.config.largeChunkThreshold) {\n      this.log(\n        `Large chunk detected: ${entry.name} (${(entry.decodedBodySize / 1024).toFixed(2)}KB)`\n      );\n    }\n  }\n\n  private isJavaScriptResource(name: string): boolean {\n    return /\\.js($|\\?)/.test(name);\n  }\n\n  private extractChunkId(url: string): string {\n    try {\n      const { pathname } = new URL(url);\n      const filename = pathname.split('/').pop() ?? url;\n      // Remove hash and extension\n      return filename.replace(/\\.[a-f0-9]+\\.js$/, '.js').replace(/\\.js$/, '');\n    } catch {\n      return url;\n    }\n  }\n\n  private extractChunkName(modulePath: string): string | null {\n    // Check for webpack magic comment chunk name\n    const chunkNameMatch = modulePath.match(/webpackChunkName:\\s*[\"']([^\"']+)[\"']/);\n    return chunkNameMatch ? (chunkNameMatch[1] ?? null) : null;\n  }\n\n  private findDuplicateModules(): string[] {\n    const moduleCounts = new Map<string, number>();\n\n    for (const chunk of this.chunks.values()) {\n      for (const module of chunk.modules) {\n        const count = moduleCounts.get(module.name) ?? 0;\n        moduleCounts.set(module.name, count + 1);\n      }\n    }\n\n    return Array.from(moduleCounts.entries())\n      .filter(([, count]) => count > 1)\n      .map(([name]) => name);\n  }\n\n  private generateRecommendations(\n    chunks: ChunkInfo[],\n    duplicates: string[]\n  ): BundleRecommendation[] {\n    const recommendations: BundleRecommendation[] = [];\n\n    // Large chunk recommendations\n    for (const chunk of chunks) {\n      if (chunk.size > this.config.largeChunkThreshold * 2) {\n        recommendations.push({\n          type: 'split',\n          priority: 'high',\n          target: chunk.name,\n          message: `Consider splitting ${chunk.name} (${(chunk.size / 1024).toFixed(2)}KB)`,\n          estimatedSavings: chunk.size * 0.3, // Estimate 30% reduction\n        });\n      }\n    }\n\n    // Slow chunk recommendations\n    for (const chunk of chunks) {\n      if (chunk.loadTime > this.config.slowChunkThreshold * 2 && !chunk.isEntry) {\n        recommendations.push({\n          type: 'preload',\n          priority: 'medium',\n          target: chunk.name,\n          message: `Consider preloading ${chunk.name} (${chunk.loadTime.toFixed(0)}ms load time)`,\n        });\n      }\n    }\n\n    // Duplicate module recommendations\n    for (const duplicate of duplicates) {\n      recommendations.push({\n        type: 'dedupe',\n        priority: 'medium',\n        target: duplicate,\n        message: `Module \"${duplicate}\" is duplicated across chunks`,\n      });\n    }\n\n    // Lazy loading recommendations\n    for (const chunk of chunks) {\n      if (chunk.isEntry && chunk.size > this.config.largeChunkThreshold) {\n        recommendations.push({\n          type: 'lazy',\n          priority: 'low',\n          target: chunk.name,\n          message: `Consider lazy-loading non-critical parts of ${chunk.name}`,\n        });\n      }\n    }\n\n    return recommendations.sort((a, b) => {\n      const priorityOrder = { high: 0, medium: 1, low: 2 };\n      return priorityOrder[a.priority] - priorityOrder[b.priority];\n    });\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console\n      console.log(`[BundleAnalyzer] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Dynamic Import Wrapper\n// ============================================================================\n\n/**\n * Create a tracked dynamic import function\n */\nexport function createTrackedImport(\n  analyzer: BundleAnalyzer\n): <T>(importFn: () => Promise<T>, modulePath: string) => Promise<T> {\n  return async <T>(importFn: () => Promise<T>, modulePath: string): Promise<T> => {\n    return (await analyzer.trackDynamicImport(modulePath, importFn())) as Promise<T>;\n  };\n}\n\n// ============================================================================\n// Bundle Size Utilities\n// ============================================================================\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n  if (bytes === 0) return '0 B';\n\n  const k = 1024;\n  const sizes = ['B', 'KB', 'MB', 'GB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  const size = sizes[i] ?? 'GB';\n\n  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${size}`;\n}\n\n/**\n * Calculate bundle budget status\n */\nexport function checkBundleBudget(\n  size: number,\n  budget: number\n): { status: 'ok' | 'warning' | 'exceeded'; percent: number } {\n  const percent = (size / budget) * 100;\n\n  if (percent <= 80) {\n    return { status: 'ok', percent };\n  } else if (percent <= 100) {\n    return { status: 'warning', percent };\n  } else {\n    return { status: 'exceeded', percent };\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet analyzerInstance: BundleAnalyzer | null = null;\n\n/**\n * Get or create the global bundle analyzer instance\n */\nexport function getBundleAnalyzer(config?: Partial<BundleAnalyzerConfig>): BundleAnalyzer {\n  analyzerInstance ??= new BundleAnalyzer(config);\n  return analyzerInstance;\n}\n\n/**\n * Reset the analyzer instance\n */\nexport function resetBundleAnalyzer(): void {\n  if (analyzerInstance !== null) {\n    analyzerInstance.stop();\n    analyzerInstance = null;\n  }\n}\n"],"names":["DEFAULT_CONFIG","isProd","BundleAnalyzer","config","modulePath","importPromise","startTime","chunkName","result","endTime","error","errorMessage","chunks","totalSize","sum","largestChunks","a","b","slowestChunks","duplicateModules","recommendations","entry","resourceEntry","chunkId","options","existing","chunkInfo","list","resources","resource","name","url","pathname","chunkNameMatch","moduleCounts","chunk","module","count","duplicates","duplicate","priorityOrder","message","args","createTrackedImport","analyzer","importFn","checkBundleBudget","size","budget","percent","analyzerInstance","getBundleAnalyzer","resetBundleAnalyzer"],"mappings":"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"}