UNPKG

@ordojs/dev-tools

Version:

Advanced developer tools for OrdoJS with component inspector, AST explorer, and performance profiling

1 lines 19.3 kB
{"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"]}