33const buf = ' ' ;
44const tab = ' ' ;
55const borderX = `${ Array ( 30 ) . join ( '-' ) } \n` ;
6+
67const formatBytes = ( bytes ) => {
78 if ( bytes === 0 ) return '0 Byte'
89 const k = 1000 ;
@@ -11,9 +12,25 @@ const formatBytes = (bytes) => {
1112 const i = Math . floor ( Math . log ( bytes ) / Math . log ( k ) ) ;
1213 return parseFloat ( ( bytes / Math . pow ( k , i ) ) . toFixed ( dm ) ) + ' ' + sizes [ i ]
1314} ;
14- const shakenPct = ( n , o ) => Math . max ( ( 100 - ( ( n / o ) * 100 ) ) . toFixed ( 2 ) , 0 ) ;
15+
16+ const shakenPct = ( n = 0 , o = 0 ) => {
17+ const pct = Math . max ( ( 100 - ( ( n / o ) * 100 ) ) . toFixed ( 2 ) , 0 ) ;
18+ return Number . isNaN ( pct ) ? 0 : pct
19+ } ;
20+
1521const match = ( str , check ) => str . indexOf ( check ) !== - 1 ;
1622
23+ const sizeOrCodeSize = ( size , code ) => {
24+ if ( size || size === 0 ) return size
25+ return code ? Buffer . byteLength ( code , 'utf8' ) : 0
26+ } ;
27+
28+ const filterByType = {
29+ function : ( filter , m ) => filter ( m ) ,
30+ array : ( filter , m ) => filter . some ( ( f ) => match ( m . id , f ) ) ,
31+ string : ( filter , m ) => match ( m . id , filter )
32+ } ;
33+
1734const reporter = ( analysis , opts ) => {
1835 const { hideDeps, root, showExports, summaryOnly } = opts || { } ;
1936
@@ -72,57 +89,67 @@ const reporter = (analysis, opts) => {
7289} ;
7390
7491const analyzer = ( bundle , opts = { } ) => {
75- const { limit, filter } = opts ;
76- let { root, transformModuleId } = opts ;
77- root = root || ( process && process . cwd ? process . cwd ( ) : null ) ;
78- if ( typeof transformModuleId !== 'function' ) transformModuleId = undefined ;
79-
80- const deps = { } ;
92+ const { limit, filter, transformModuleId, filterSummary } = opts ;
93+ const root = opts . root || ( process && process . cwd ? process . cwd ( ) : null ) ;
94+ const idMod = typeof transformModuleId === 'function' && transformModuleId ;
95+ const filterType = Array . isArray ( filter ) ? 'array' : typeof filter ;
96+ const applyFilter = filterByType [ filterType ] ;
8197 const bundleModules = bundle . modules || ( bundle . cache || { } ) . modules || [ ] ;
82- const moduleCount = bundleModules . length ;
98+ const deps = { } ;
8399
100+ let tmpBdlSize = 0 ;
84101 let bundleSize = 0 ;
85102 let bundleOrigSize = 0 ;
86103
87104 let modules = bundleModules . map ( ( m , i ) => {
105+ const id = idMod ? idMod ( m . id . replace ( root , '' ) ) : m . id . replace ( root , '' ) ;
88106 const {
89- originalLength : origSize ,
107+ originalLength,
90108 renderedLength,
91- code,
92109 renderedExports,
93- removedExports
110+ removedExports,
111+ originalCode,
112+ code
94113 } = m ;
95- let { id } = m ;
96- id = id . replace ( root , '' ) ;
97- if ( transformModuleId ) id = transformModuleId ( id ) ;
98- let size = renderedLength ;
99- if ( ! size && size !== 0 ) size = code ? Buffer . byteLength ( code , 'utf8' ) : 0 ;
100- bundleSize += size ;
101- bundleOrigSize += origSize ;
102114
103- if ( Array . isArray ( filter ) && ! filter . some ( ( f ) => match ( id , f ) ) ) return null
104- if ( typeof filter === 'string' && ! match ( id , filter ) ) return null
115+ const size = sizeOrCodeSize ( renderedLength , code ) ;
116+ const origSize = sizeOrCodeSize ( originalLength , originalCode ) ;
117+
118+ tmpBdlSize += size ;
105119
106120 m . dependencies . forEach ( ( d ) => {
107- d = d . replace ( root , '' ) ;
108- if ( transformModuleId ) d = transformModuleId ( d ) ;
121+ d = idMod ? idMod ( d . replace ( root , '' ) ) : d . replace ( root , '' ) ;
109122 deps [ d ] = deps [ d ] || [ ] ;
110123 deps [ d ] . push ( id ) ;
111124 } ) ;
112125
113126 return { id, size, origSize, renderedExports, removedExports }
114- } ) . filter ( ( m ) => m ) ;
127+ } ) . filter ( ( m ) => m ) . sort ( ( a , b ) => b . size - a . size ) ;
115128
116- modules . sort ( ( a , b ) => b . size - a . size ) ;
117129 if ( limit || limit === 0 ) modules = modules . slice ( 0 , limit ) ;
118- modules . forEach ( ( m ) => {
130+
131+ modules = modules . map ( ( m ) => {
119132 m . dependents = deps [ m . id ] || [ ] ;
120- m . percent = Math . min ( ( ( m . size / bundleSize ) * 100 ) . toFixed ( 2 ) , 100 ) ;
133+ m . percent = Math . min ( ( ( m . size / tmpBdlSize ) * 100 ) . toFixed ( 2 ) , 100 ) ;
121134 m . reduction = shakenPct ( m . size , m . origSize ) ;
122- } ) ;
123- if ( typeof filter === 'function' ) modules = modules . filter ( filter ) ;
135+
136+ const filtered = applyFilter && ! applyFilter ( filter , m ) ;
137+ if ( filtered && filterSummary ) return null
138+
139+ bundleSize += m . size ;
140+ bundleOrigSize += m . origSize ;
141+
142+ return filtered ? null : m
143+ } ) . filter ( ( m ) => m ) ;
144+
145+ if ( filterSummary ) {
146+ modules . forEach ( ( m ) => {
147+ m . percent = Math . min ( ( ( m . size / bundleSize ) * 100 ) . toFixed ( 2 ) , 100 ) ;
148+ } ) ;
149+ }
124150
125151 const bundleReduction = shakenPct ( bundleSize , bundleOrigSize ) ;
152+ const moduleCount = ( filterSummary ? modules : bundleModules ) . length ;
126153
127154 return { bundleSize, bundleOrigSize, bundleReduction, modules, moduleCount }
128155} ;
0 commit comments