1- import { BarChart , Bar , XAxis , YAxis , CartesianGrid , Tooltip , Legend , ResponsiveContainer } from 'recharts'
1+ import { BarChart , Bar , XAxis , YAxis , CartesianGrid , Tooltip , ResponsiveContainer } from 'recharts'
22import { Zap , Gauge } from 'lucide-react'
33import minificationData from '../../../minification-benchmarks-data.json'
44
55// Transform minification data for charts
66// Get popular minifiers for comparison
77const popularMinifiers = [ 'terser' , 'esbuild' , '@swc/core' , 'uglify-js' , 'oxc-minify' ]
88
9- // Transform minification time data across libraries for popular minifiers
9+ // Get library names from the data
10+ const libraries = Object . keys ( minificationData )
11+
12+ // Transform minification data for individual library charts
13+ const getLibraryData = ( library : string , metric : 'time' | 'compression' ) => {
14+ const libraryData = ( minificationData as any ) [ library ]
15+ const data : any [ ] = [ ]
16+
17+ popularMinifiers . forEach ( minifier => {
18+ const minifierData = libraryData . minified ?. [ minifier ]
19+ if ( minifierData ?. result ?. data ) {
20+ let value : number
21+ if ( metric === 'time' ) {
22+ value = Math . round ( minifierData . result . data . time || 0 )
23+ } else {
24+ // compression ratio
25+ const originalSize = libraryData . size
26+ const minifiedBytes = minifierData . result . data . minifiedBytes || 0
27+ value = Math . round ( ( ( originalSize - minifiedBytes ) / originalSize ) * 100 * 10 ) / 10
28+ }
29+
30+ data . push ( {
31+ name : minifier === '@swc/core' ? 'SWC' :
32+ minifier === 'uglify-js' ? 'UglifyJS' :
33+ minifier === 'oxc-minify' ? 'OXC' :
34+ minifier === 'esbuild' ? 'ESBuild' :
35+ minifier === 'terser' ? 'Terser' : minifier ,
36+ value,
37+ fill : minifier === 'terser' ? '#8b5cf6' :
38+ minifier === 'esbuild' ? '#059669' :
39+ minifier === '@swc/core' ? '#0ea5e9' :
40+ minifier === 'uglify-js' ? '#dc2626' :
41+ minifier === 'oxc-minify' ? '#f59e0b' : '#6b7280'
42+ } )
43+ }
44+ } )
45+
46+ return data
47+ }
48+
49+ // Transform minification time data across libraries for popular minifiers (for overview stats)
1050const minificationTimeData = Object . keys ( minificationData ) . map ( library => {
1151 const libraryData = ( minificationData as any ) [ library ]
1252 const result : any = { name : library }
@@ -51,6 +91,8 @@ function MinificationBenchmarks({ selectedMetric, setSelectedMetric }: Minificat
5191 ]
5292
5393 const currentMetric = minificationMetrics . find ( m => m . id === selectedMetric ) || minificationMetrics [ 0 ]
94+ const metricType = selectedMetric === 'minTime' ? 'time' : 'compression'
95+ const unit = selectedMetric === 'minTime' ? 'ms' : '%'
5496
5597 return (
5698 < >
@@ -74,40 +116,47 @@ function MinificationBenchmarks({ selectedMetric, setSelectedMetric }: Minificat
74116 </ nav >
75117
76118 < main className = "dashboard-main" >
77- < div className = "chart-container" >
78- < h2 > { currentMetric . name } </ h2 >
79- < ResponsiveContainer width = "100%" height = { 400 } >
80- { /* Minification charts - multi-bar charts for comparing minifiers */ }
81- < BarChart data = { currentMetric . data } >
82- < CartesianGrid strokeDasharray = "3 3" stroke = "#e5e7eb" />
83- < XAxis
84- dataKey = "name"
85- tick = { { fill : '#374151' , fontSize : 12 } }
86- axisLine = { { stroke : '#d1d5db' } }
87- tickLine = { { stroke : '#d1d5db' } }
88- />
89- < YAxis
90- tick = { { fill : '#374151' , fontSize : 12 } }
91- axisLine = { { stroke : '#d1d5db' } }
92- tickLine = { { stroke : '#d1d5db' } }
93- />
94- < Tooltip
95- contentStyle = { {
96- backgroundColor : 'white' ,
97- border : '1px solid #d1d5db' ,
98- borderRadius : '0.5rem' ,
99- color : '#111827' ,
100- boxShadow : '0 4px 8px rgba(0, 0, 0, 0.1)'
101- } }
102- />
103- < Legend wrapperStyle = { { color : '#374151' } } />
104- < Bar dataKey = "terser" fill = "#8b5cf6" name = "Terser" />
105- < Bar dataKey = "esbuild" fill = "#059669" name = "ESBuild" />
106- < Bar dataKey = "@swc/core" fill = "#0ea5e9" name = "SWC" />
107- < Bar dataKey = "uglify-js" fill = "#dc2626" name = "UglifyJS" />
108- < Bar dataKey = "oxc-minify" fill = "#f59e0b" name = "OXC" />
109- </ BarChart >
110- </ ResponsiveContainer >
119+ { /* Individual Charts for Each Library */ }
120+ < div className = "library-charts-grid" >
121+ { libraries . map ( library => {
122+ const libraryData = getLibraryData ( library , metricType )
123+
124+ return (
125+ < div key = { library } className = "library-chart-container" >
126+ < h3 className = "library-title" > { library } </ h3 >
127+ < ResponsiveContainer width = "100%" height = { 300 } >
128+ < BarChart data = { libraryData } margin = { { top : 20 , right : 30 , left : 20 , bottom : 5 } } >
129+ < CartesianGrid strokeDasharray = "3 3" stroke = "#e5e7eb" />
130+ < XAxis
131+ dataKey = "name"
132+ tick = { { fill : '#374151' , fontSize : 11 } }
133+ axisLine = { { stroke : '#d1d5db' } }
134+ tickLine = { { stroke : '#d1d5db' } }
135+ angle = { - 45 }
136+ textAnchor = "end"
137+ height = { 60 }
138+ />
139+ < YAxis
140+ tick = { { fill : '#374151' , fontSize : 11 } }
141+ axisLine = { { stroke : '#d1d5db' } }
142+ tickLine = { { stroke : '#d1d5db' } }
143+ />
144+ < Tooltip
145+ contentStyle = { {
146+ backgroundColor : 'white' ,
147+ border : '1px solid #d1d5db' ,
148+ borderRadius : '0.5rem' ,
149+ color : '#111827' ,
150+ boxShadow : '0 4px 8px rgba(0, 0, 0, 0.1)'
151+ } }
152+ formatter = { ( value : any ) => [ `${ value } ${ unit } ` , currentMetric . name ] }
153+ />
154+ < Bar dataKey = "value" />
155+ </ BarChart >
156+ </ ResponsiveContainer >
157+ </ div >
158+ )
159+ } ) }
111160 </ div >
112161
113162 < div className = "stats-grid" >
0 commit comments