{"version":3,"sources":["../../src/bundle-analyzer/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview OrdoJS Dev Tools - Bundle Analyzer\n *\n * Bundle analyzer for analyzing bundle size, dependencies, and optimization opportunities.\n */\n\nimport { EventEmitter } from 'events';\nimport type { BundleAnalysis } from '../types/index.js';\n\n/**\n * Bundle analyzer for analyzing bundle size and dependencies\n */\nexport class BundleAnalyzer extends EventEmitter {\n  private analyses: Map<string, BundleAnalysis>;\n  private isRunning: boolean;\n  private port: number;\n\n  /**\n   * Create a new BundleAnalyzer instance\n   *\n   * @param port - WebSocket port for bundle analyzer\n   */\n  constructor(port: number = 24682) {\n    super();\n\n    this.analyses = new Map();\n    this.isRunning = false;\n    this.port = port;\n  }\n\n  /**\n   * Start the bundle analyzer\n   */\n  async start(): Promise<void> {\n    if (this.isRunning) {\n      console.warn('Bundle analyzer is already running');\n      return;\n    }\n\n    try {\n      // Start WebSocket server for bundle analyzer communication\n      await this.startWebSocketServer();\n\n      this.isRunning = true;\n      console.log(`Bundle analyzer started on port ${this.port}`);\n\n      this.emit('started');\n    } catch (error) {\n      console.error('Failed to start bundle analyzer:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Stop the bundle analyzer\n   */\n  async stop(): Promise<void> {\n    if (!this.isRunning) {\n      console.warn('Bundle analyzer is not running');\n      return;\n    }\n\n    try {\n      // Clean up WebSocket server\n      await this.stopWebSocketServer();\n\n      this.isRunning = false;\n      console.log('Bundle analyzer stopped');\n\n      this.emit('stopped');\n    } catch (error) {\n      console.error('Failed to stop bundle analyzer:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Analyze a bundle file\n   *\n   * @param bundlePath - Path to the bundle file\n   * @param bundleName - Name for the bundle analysis\n   * @returns Bundle analysis result\n   */\n  async analyzeBundle(bundlePath: string, bundleName: string): Promise<BundleAnalysis> {\n    try {\n      // This would integrate with actual bundle analysis tools\n      // For now, we'll create a placeholder analysis\n      const analysis: BundleAnalysis = {\n        size: 0,\n        gzippedSize: 0,\n        modules: [],\n        chunks: [],\n        dependencies: [],\n        warnings: [],\n        errors: []\n      };\n\n      // Simulate bundle analysis\n      await this.simulateBundleAnalysis(bundlePath, analysis);\n\n      this.analyses.set(bundleName, analysis);\n      this.emit('bundleAnalyzed', { bundleName, analysis });\n\n      return analysis;\n    } catch (error) {\n      console.error('Failed to analyze bundle:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get bundle analysis by name\n   *\n   * @param bundleName - Bundle name\n   * @returns Bundle analysis or undefined\n   */\n  getAnalysis(bundleName: string): BundleAnalysis | undefined {\n    return this.analyses.get(bundleName);\n  }\n\n  /**\n   * Get all bundle analyses\n   *\n   * @returns Array of all bundle analyses\n   */\n  getAllAnalyses(): BundleAnalysis[] {\n    return Array.from(this.analyses.values());\n  }\n\n  /**\n   * Compare two bundle analyses\n   *\n   * @param bundleName1 - First bundle name\n   * @param bundleName2 - Second bundle name\n   * @returns Comparison result\n   */\n  compareBundles(bundleName1: string, bundleName2: string): {\n    sizeDifference: number;\n    sizeDifferencePercent: number;\n    moduleCountDifference: number;\n    dependencyCountDifference: number;\n    newModules: string[];\n    removedModules: string[];\n    newDependencies: string[];\n    removedDependencies: string[];\n  } {\n    const analysis1 = this.analyses.get(bundleName1);\n    const analysis2 = this.analyses.get(bundleName2);\n\n    if (!analysis1 || !analysis2) {\n      throw new Error('One or both bundle analyses not found');\n    }\n\n    const sizeDifference = analysis2.size - analysis1.size;\n    const sizeDifferencePercent = (sizeDifference / analysis1.size) * 100;\n\n    const moduleCountDifference = analysis2.modules.length - analysis1.modules.length;\n    const dependencyCountDifference = analysis2.dependencies.length - analysis1.dependencies.length;\n\n    const modules1 = new Set(analysis1.modules.map(m => m.name));\n    const modules2 = new Set(analysis2.modules.map(m => m.name));\n    const newModules = analysis2.modules.filter(m => !modules1.has(m.name)).map(m => m.name);\n    const removedModules = analysis1.modules.filter(m => !modules2.has(m.name)).map(m => m.name);\n\n    const deps1 = new Set(analysis1.dependencies.map(d => d.name));\n    const deps2 = new Set(analysis2.dependencies.map(d => d.name));\n    const newDependencies = analysis2.dependencies.filter(d => !deps1.has(d.name)).map(d => d.name);\n    const removedDependencies = analysis1.dependencies.filter(d => !deps2.has(d.name)).map(d => d.name);\n\n    return {\n      sizeDifference,\n      sizeDifferencePercent,\n      moduleCountDifference,\n      dependencyCountDifference,\n      newModules,\n      removedModules,\n      newDependencies,\n      removedDependencies\n    };\n  }\n\n  /**\n   * Get bundle optimization suggestions\n   *\n   * @param bundleName - Bundle name\n   * @returns Optimization suggestions\n   */\n  getOptimizationSuggestions(bundleName: string): {\n    duplicateModules: string[];\n    largeModules: string[];\n    unusedDependencies: string[];\n    codeSplittingOpportunities: string[];\n    compressionOpportunities: string[];\n  } {\n    const analysis = this.analyses.get(bundleName);\n    if (!analysis) {\n      throw new Error('Bundle analysis not found');\n    }\n\n    // Find duplicate modules\n    const moduleCounts = new Map<string, number>();\n    for (const module of analysis.modules) {\n      moduleCounts.set(module.name, (moduleCounts.get(module.name) || 0) + 1);\n    }\n    const duplicateModules = Array.from(moduleCounts.entries())\n      .filter(([_, count]) => count > 1)\n      .map(([name, _]) => name);\n\n    // Find large modules (over 100KB)\n    const largeModules = analysis.modules\n      .filter(module => module.size > 100 * 1024)\n      .map(module => module.name);\n\n    // Find unused dependencies (this would require more sophisticated analysis)\n    const unusedDependencies: string[] = [];\n\n    // Code splitting opportunities (modules that could be lazy loaded)\n    const codeSplittingOpportunities = analysis.modules\n      .filter(module => module.size > 50 * 1024 && !module.name.includes('vendor'))\n      .map(module => module.name);\n\n    // Compression opportunities\n    const compressionOpportunities = analysis.modules\n      .filter(module => module.size > 10 * 1024)\n      .map(module => module.name);\n\n    return {\n      duplicateModules,\n      largeModules,\n      unusedDependencies,\n      codeSplittingOpportunities,\n      compressionOpportunities\n    };\n  }\n\n  /**\n   * Get bundle statistics\n   *\n   * @param bundleName - Bundle name\n   * @returns Bundle statistics\n   */\n  getBundleStats(bundleName: string): {\n    totalSize: number;\n    gzippedSize: number;\n    moduleCount: number;\n    dependencyCount: number;\n    averageModuleSize: number;\n    largestModule: string;\n    largestModuleSize: number;\n  } {\n    const analysis = this.analyses.get(bundleName);\n    if (!analysis) {\n      throw new Error('Bundle analysis not found');\n    }\n\n    const totalSize = analysis.size;\n    const gzippedSize = analysis.gzippedSize;\n    const moduleCount = analysis.modules.length;\n    const dependencyCount = analysis.dependencies.length;\n    const averageModuleSize = totalSize / moduleCount || 0;\n\n        const largestModule = analysis.modules.length > 0\n      ? analysis.modules.reduce((largest, current) =>\n          current.size > largest.size ? current : largest\n        )\n      : null;\n    const largestModuleSize = largestModule ? largestModule.size : 0;\n\n    return {\n      totalSize,\n      gzippedSize,\n      moduleCount,\n      dependencyCount,\n      averageModuleSize,\n      largestModule: largestModule ? largestModule.name : '',\n      largestModuleSize\n    };\n  }\n\n  /**\n   * Clear all bundle analyses\n   */\n  clearAnalyses(): void {\n    this.analyses.clear();\n    this.emit('analysesCleared');\n  }\n\n  /**\n   * Simulate bundle analysis (placeholder implementation)\n   *\n   * @param bundlePath - Path to bundle file\n   * @param analysis - Analysis object to populate\n   */\n  private async simulateBundleAnalysis(bundlePath: string, analysis: BundleAnalysis): Promise<void> {\n    // Simulate file reading and analysis\n    const fs = await import('fs/promises');\n\n    try {\n      const stats = await fs.stat(bundlePath);\n      analysis.size = stats.size;\n      analysis.gzippedSize = Math.round(analysis.size * 0.3); // Simulate 30% compression\n\n      // Simulate modules\n      analysis.modules = [\n        {\n          name: 'main.js',\n          size: Math.round(analysis.size * 0.6),\n          dependencies: ['react', 'react-dom'],\n          exports: ['App', 'main'],\n          path: bundlePath\n        },\n        {\n          name: 'vendor.js',\n          size: Math.round(analysis.size * 0.4),\n          dependencies: ['lodash', 'moment'],\n          exports: ['vendor'],\n          path: bundlePath\n        }\n      ];\n\n      // Simulate chunks\n      analysis.chunks = [\n        {\n          name: 'main',\n          size: analysis.modules[0]?.size || 0,\n          modules: ['main.js'],\n          entry: true\n        },\n        {\n          name: 'vendor',\n          size: analysis.modules[1]?.size || 0,\n          modules: ['vendor.js'],\n          entry: false\n        }\n      ];\n\n      // Simulate dependencies\n      analysis.dependencies = [\n        {\n          name: 'react',\n          version: '18.2.0',\n          size: 100 * 1024,\n          type: 'production'\n        },\n        {\n          name: 'react-dom',\n          version: '18.2.0',\n          size: 150 * 1024,\n          type: 'production'\n        },\n        {\n          name: 'lodash',\n          version: '4.17.21',\n          size: 70 * 1024,\n          type: 'production'\n        }\n      ];\n    } catch (error) {\n      analysis.errors.push(`Failed to analyze bundle: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  /**\n   * Start WebSocket server for bundle analyzer communication\n   */\n  private async startWebSocketServer(): Promise<void> {\n    // Implementation for WebSocket server\n    // This would handle communication with the browser extension\n    console.log('Starting WebSocket server for bundle analyzer...');\n  }\n\n  /**\n   * Stop WebSocket server\n   */\n  private async stopWebSocketServer(): Promise<void> {\n    // Implementation for stopping WebSocket server\n    console.log('Stopping WebSocket server for bundle analyzer...');\n  }\n}\n"]}