11const fs = require ( 'fs' ) ;
22const path = require ( 'path' ) ;
33
4- const pullAll = require ( 'lodash.pullall' ) ;
5- const invokeMap = require ( 'lodash.invokemap' ) ;
6- const uniqBy = require ( 'lodash.uniqby' ) ;
7- const flatten = require ( 'lodash.flatten' ) ;
8-
94const gzipSize = require ( 'gzip-size' ) ;
105const { parseChunked} = require ( '@discoveryjs/json-ext' ) ;
116
@@ -119,7 +114,7 @@ function getViewerData(bundleStats, bundleDir, opts) {
119114 }
120115
121116 // Picking modules from current bundle script
122- const assetModules = modules . filter ( statModule => assetHasModule ( statAsset , statModule ) ) ;
117+ let assetModules = modules . filter ( statModule => assetHasModule ( statAsset , statModule ) ) ;
123118
124119 // Adding parsed sources
125120 if ( parsedModules ) {
@@ -143,7 +138,7 @@ function getViewerData(bundleStats, bundleDir, opts) {
143138 unparsedEntryModules [ 0 ] . parsedSrc = assetSources . runtimeSrc ;
144139 } else {
145140 // If there are multiple entry points we move all of them under synthetic concatenated module.
146- pullAll ( assetModules , unparsedEntryModules ) ;
141+ assetModules = assetModules . filter ( mod => ! unparsedEntryModules . includes ( mod ) ) ;
147142 assetModules . unshift ( {
148143 identifier : './entry modules' ,
149144 name : './entry modules' ,
@@ -171,7 +166,7 @@ function getViewerData(bundleStats, bundleDir, opts) {
171166 statSize : asset . tree . size || asset . size ,
172167 parsedSize : asset . parsedSize ,
173168 gzipSize : asset . gzipSize ,
174- groups : invokeMap ( asset . tree . children , ' toChartData' ) ,
169+ groups : Object . values ( asset . tree . children ) . map ( i => i . toChartData ( ) ) ,
175170 isInitialByEntrypoint : chunkToInitialByEntrypoint [ filename ] ?? { }
176171 } ) ) ;
177172}
@@ -191,15 +186,23 @@ function getChildAssetBundles(bundleStats, assetName) {
191186}
192187
193188function getBundleModules ( bundleStats ) {
194- return uniqBy (
195- flatten (
196- ( ( bundleStats . chunks ?. map ( chunk => chunk . modules ) ) || [ ] )
197- . concat ( bundleStats . modules )
198- . filter ( Boolean )
199- ) ,
200- 'id'
201- // Filtering out Webpack's runtime modules as they don't have ids and can't be parsed (introduced in Webpack 5)
202- ) . filter ( m => ! isRuntimeModule ( m ) ) ;
189+ const seenIds = new Set ( ) ;
190+
191+ return flatten (
192+ ( ( bundleStats . chunks ?. map ( chunk => chunk . modules ) ) || [ ] )
193+ . concat ( bundleStats . modules )
194+ . filter ( Boolean )
195+ ) . filter ( mod => {
196+ // Filtering out Webpack's runtime modules as they don't have ids and can't be parsed (introduced in Webpack 5)
197+ if ( isRuntimeModule ( mod ) ) {
198+ return false ;
199+ }
200+ if ( seenIds . has ( mod . id ) ) {
201+ return false ;
202+ }
203+ seenIds . add ( mod . id ) ;
204+ return true ;
205+ } ) ;
203206}
204207
205208function assetHasModule ( statAsset , statModule ) {
@@ -239,3 +242,34 @@ function getChunkToInitialByEntrypoint(bundleStats) {
239242 } ) ;
240243 return chunkToEntrypointInititalMap ;
241244} ;
245+
246+ /**
247+ * arr-flatten <https://github.com/jonschlinkert/arr-flatten>
248+ *
249+ * Copyright (c) 2014-2017, Jon Schlinkert.
250+ * Released under the MIT License.
251+ *
252+ * Modified by Sukka <https://skk.moe>
253+ *
254+ * Replace recursively flatten with one-level deep flatten to match lodash.flatten
255+ *
256+ * TODO: replace with Array.prototype.flat once Node.js 10 support is dropped
257+ */
258+ function flatten ( arr ) {
259+ if ( ! arr ) return [ ] ;
260+ const len = arr . length ;
261+ if ( ! len ) return [ ] ;
262+
263+ let cur ;
264+
265+ const res = [ ] ;
266+ for ( let i = 0 ; i < len ; i ++ ) {
267+ cur = arr [ i ] ;
268+ if ( Array . isArray ( cur ) ) {
269+ res . push ( ...cur ) ;
270+ } else {
271+ res . push ( cur ) ;
272+ }
273+ }
274+ return res ;
275+ }
0 commit comments