From f0d2a28a3d695d223f79e0340fa6ccba6c41c711 Mon Sep 17 00:00:00 2001 From: th0r Date: Sun, 20 May 2018 20:08:34 +0300 Subject: [PATCH 1/2] Loosen bundle parsing logic --- client/components/ModulesTreemap.jsx | 55 +- client/components/Treemap.jsx | 49 +- client/utils.js | 3 + client/viewer.jsx | 2 +- src/analyzer.js | 40 +- src/parseUtils.js | 14 +- src/tree/BaseFolder.js | 5 +- src/tree/Folder.js | 4 +- test/analyzer.js | 40 +- test/bundles/invalidBundle.js | 1 + test/parseUtils.js | 13 +- .../stats/with-invalid-chunk/invalid-chunk.js | 1 + test/stats/with-invalid-chunk/stats.json | 507 ++++++++++++++++++ test/stats/with-invalid-chunk/valid-chunk.js | 1 + test/stats/with-missing-chunk/stats.json | 507 ++++++++++++++++++ test/stats/with-missing-chunk/valid-chunk.js | 1 + .../with-module-concatenation-info/stats.json | 2 +- .../expected-chart-data.js | 2 +- 18 files changed, 1165 insertions(+), 82 deletions(-) create mode 100644 client/utils.js create mode 100644 test/bundles/invalidBundle.js create mode 100644 test/stats/with-invalid-chunk/invalid-chunk.js create mode 100644 test/stats/with-invalid-chunk/stats.json create mode 100644 test/stats/with-invalid-chunk/valid-chunk.js create mode 100644 test/stats/with-missing-chunk/stats.json create mode 100644 test/stats/with-missing-chunk/valid-chunk.js diff --git a/client/components/ModulesTreemap.jsx b/client/components/ModulesTreemap.jsx index e4ec0128..a767b275 100644 --- a/client/components/ModulesTreemap.jsx +++ b/client/components/ModulesTreemap.jsx @@ -2,6 +2,7 @@ import { h, Component } from 'preact'; import filesize from 'filesize'; +import { isChunkParsed } from '../utils'; import Treemap from './Treemap'; import Tooltip from './Tooltip'; import Switcher from './Switcher'; @@ -20,17 +21,17 @@ export default class ModulesTreemap extends Component { constructor(props) { super(props); - this.setData(props.data, true); + this.updateChunks(props.chunks, { initial: true }); } componentWillReceiveProps(newProps) { - if (newProps.data !== this.props.data) { - this.setData(newProps.data); + if (newProps.chunks !== this.props.chunks) { + this.updateChunks(newProps.chunks); } } render() { - const { data, showTooltip, tooltipContent, activeSizeItem } = this.state; + const { visibleChunks, showTooltip, tooltipContent, activeSizeItem } = this.state; return (
@@ -52,7 +53,7 @@ export default class ModulesTreemap extends Component { } @@ -88,12 +89,12 @@ export default class ModulesTreemap extends Component { }; handleSizeSwitch = sizeSwitchItem => { - this.setState({ activeSizeItem: sizeSwitchItem }); + this.updateChunks(this.chunks, { activeSizeItem: sizeSwitchItem }); }; handleVisibleChunksChange = visibleChunkItems => { this.visibleChunkItems = visibleChunkItems; - this.setState({ data: this.getVisibleChunksData() }); + this.updateVisibleChunks(); }; handleMouseLeaveTreemap = () => { @@ -115,36 +116,50 @@ export default class ModulesTreemap extends Component { get totalChunksSize() { const sizeProp = this.state.activeSizeItem.prop; - return this.props.data.reduce((totalSize, chunk) => totalSize + chunk[sizeProp], 0); + return this.chunks.reduce((totalSize, chunk) => + totalSize + (chunk[sizeProp] || 0), + 0); } - setData(data, initial) { - const hasParsedSizes = (typeof data[0].parsedSize === 'number'); + updateChunks(chunks, { initial, activeSizeItem } = {}) { + this.chunks = chunks; + + const hasParsedSizes = chunks.some(isChunkParsed); this.sizeSwitchItems = hasParsedSizes ? SIZE_SWITCH_ITEMS : SIZE_SWITCH_ITEMS.slice(0, 1); - const activeSizeItemProp = initial ? `${this.props.defaultSizes}Size` : this.state.activeSizeItem.prop; - let activeSizeItem = this.sizeSwitchItems.find(item => item.prop === activeSizeItemProp); - if (!activeSizeItem) activeSizeItem = this.sizeSwitchItems[0]; - const chunkItems = [...data] - .sort((chunk1, chunk2) => chunk2[activeSizeItem.prop] - chunk1[activeSizeItem.prop]); + if (!activeSizeItem) { + const activeSizeItemProp = initial ? `${this.props.defaultSizes}Size` : this.state.activeSizeItem.prop; + activeSizeItem = this.sizeSwitchItems.find(item => item.prop === activeSizeItemProp); + if (!activeSizeItem) activeSizeItem = this.sizeSwitchItems[0]; + } + + let chunkItems = [...chunks]; + + if (activeSizeItem.prop !== 'statSize') { + chunkItems = chunkItems.filter(isChunkParsed); + } + + chunkItems.sort((chunk1, chunk2) => chunk2[activeSizeItem.prop] - chunk1[activeSizeItem.prop]); if (initial) { this.visibleChunkItems = chunkItems; } this.setState({ - data: this.getVisibleChunksData(), showTooltip: false, tooltipContent: null, activeSizeItem, chunkItems }); + this.updateVisibleChunks(); } - getVisibleChunksData() { - return this.props.data.filter(chunk => - this.visibleChunkItems.find(item => item.label === chunk.label) - ); + updateVisibleChunks() { + this.setState({ + visibleChunks: this.chunks.filter(chunk => + this.visibleChunkItems.find(visibleChunk => chunk.label === visibleChunk.label) + ) + }); } getTooltipContent(module) { diff --git a/client/components/Treemap.jsx b/client/components/Treemap.jsx index be4a8dac..e334ae45 100644 --- a/client/components/Treemap.jsx +++ b/client/components/Treemap.jsx @@ -11,20 +11,18 @@ export default class Treemap extends Component { } componentDidMount() { - this.setWeightProp(this.props.weightProp); + this.updateData(this.props.weightProp); this.treemap = this.createTreemap(); - window.addEventListener('resize', this.treemap.resize, false); + window.addEventListener('resize', this.treemap.resize); } componentWillReceiveProps(nextProps) { - if (nextProps.data !== this.props.data) { - this.setWeightProp(nextProps.weightProp, nextProps.data); - this.treemap.set({ - dataObject: { groups: nextProps.data } - }); - } else if (nextProps.weightProp !== this.props.weightProp) { - this.setWeightProp(nextProps.weightProp); - this.update(); + if ( + nextProps.data !== this.props.data || + nextProps.weightProp !== this.props.weightProp + ) { + this.updateData(nextProps.weightProp, nextProps.data); + this.treemap.set({ dataObject: this.treemapDataObject }); } } @@ -45,6 +43,10 @@ export default class Treemap extends Component { saveNode = node => (this.node = node); + get treemapDataObject() { + return { groups: this.data }; + } + createTreemap() { const component = this; const { props } = this; @@ -63,9 +65,7 @@ export default class Treemap extends Component { fadeDuration: 0, zoomMouseWheelDuration: 300, openCloseDuration: 200, - dataObject: { - groups: this.props.data - }, + dataObject: this.treemapDataObject, titleBarDecorator(opts, props, vars) { vars.titleBarShown = false; }, @@ -106,20 +106,29 @@ export default class Treemap extends Component { this.treemap.update(); } - setWeightProp(prop, data) { + updateData(sizeProp, data) { data = data || this.props.data; + this.data = getDataForSize(data, sizeProp); + } - data.forEach(setProp); - - function setProp(group) { - group.weight = group[prop]; +} +function getDataForSize(data, sizeProp) { + return data.reduce((filteredData, group) => { + if (group[sizeProp]) { if (group.groups) { - group.groups.forEach(setProp); + group = { + ...group, + groups: getDataForSize(group.groups, sizeProp) + }; } + + group.weight = group[sizeProp]; + filteredData.push(group); } - } + return filteredData; + }, []); } function preventDefault(event) { diff --git a/client/utils.js b/client/utils.js new file mode 100644 index 00000000..faf92952 --- /dev/null +++ b/client/utils.js @@ -0,0 +1,3 @@ +export function isChunkParsed(chunk) { + return (typeof chunk.parsedSize === 'number'); +} diff --git a/client/viewer.jsx b/client/viewer.jsx index 9883c74e..391c92a5 100644 --- a/client/viewer.jsx +++ b/client/viewer.jsx @@ -32,7 +32,7 @@ window.addEventListener('load', () => { let app; function renderApp(chartData, initialRender) { app = render( - , + , document.getElementById('app'), app ); diff --git a/src/analyzer.js b/src/analyzer.js index 001c19df..e08b416b 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -53,36 +53,34 @@ function getViewerData(bundleStats, bundleDir, opts) { try { bundleInfo = parseBundle(assetFile); } catch (err) { - bundleInfo = null; - } - - if (!bundleInfo) { - logger.warn( - `\nCouldn't parse bundle asset "${assetFile}".\n` + - 'Analyzer will use module sizes from stats file.\n' - ); - parsedModules = null; - bundlesSources = null; - break; + const msg = (err.code === 'ENOENT') ? 'no such file' : err.message; + logger.warn(`Error parsing bundle asset "${assetFile}": ${msg}`); + continue; } bundlesSources[statAsset.name] = bundleInfo.src; _.assign(parsedModules, bundleInfo.modules); } + + if (_.isEmpty(bundlesSources)) { + bundlesSources = null; + parsedModules = null; + logger.warn('\nNo bundles were parsed. Analyzer will show only original module sizes from stats file.\n'); + } } const modules = getBundleModules(bundleStats); const assets = _.transform(bundleStats.assets, (result, statAsset) => { const asset = result[statAsset.name] = _.pick(statAsset, 'size'); - if (bundlesSources) { + if (bundlesSources && _.has(bundlesSources, statAsset.name)) { asset.parsedSize = bundlesSources[statAsset.name].length; asset.gzipSize = gzipSize.sync(bundlesSources[statAsset.name]); } // Picking modules from current bundle script asset.modules = _(modules) - .filter(statModule => assetHasModule(statAsset, statModule, parsedModules)) + .filter(statModule => assetHasModule(statAsset, statModule)) .each(statModule => { if (parsedModules) { statModule.parsedSrc = parsedModules[statModule.id]; @@ -98,7 +96,8 @@ function getViewerData(bundleStats, bundleDir, opts) { // Not using `asset.size` here provided by Webpack because it can be very confusing when `UglifyJsPlugin` is used. // In this case all module sizes from stats file will represent unminified module sizes, but `asset.size` will // be the size of minified bundle. - statSize: asset.tree.size, + // Using `asset.size` only if current asset doesn't contain any modules (resulting size equals 0) + statSize: asset.tree.size || asset.size, parsedSize: asset.parsedSize, gzipSize: asset.gzipSize, groups: _.invokeMap(asset.tree.children, 'toChartData') @@ -122,20 +121,11 @@ function getBundleModules(bundleStats) { .value(); } -function assetHasModule(statAsset, statModule, parsedModules) { +function assetHasModule(statAsset, statModule) { // Checking if this module is the part of asset chunks - const moduleIsInsideAsset = _.some(statModule.chunks, moduleChunk => + return _.some(statModule.chunks, moduleChunk => _.includes(statAsset.chunks, moduleChunk) ); - - return ( - moduleIsInsideAsset && - // ...and that we have found it during parsing - ( - !parsedModules || - _.has(parsedModules, statModule.id) - ) - ); } function createModulesTree(modules) { diff --git a/src/parseUtils.js b/src/parseUtils.js index 0f43092a..e2450fc8 100644 --- a/src/parseUtils.js +++ b/src/parseUtils.js @@ -89,15 +89,19 @@ function parseBundle(bundlePath) { } ); - if (!walkState.locations) { - return null; + let modules; + + if (walkState.locations) { + modules = _.mapValues(walkState.locations, + loc => content.slice(loc.start, loc.end) + ); + } else { + modules = {}; } return { src: content, - modules: _.mapValues(walkState.locations, - loc => content.slice(loc.start, loc.end) - ) + modules }; } diff --git a/src/tree/BaseFolder.js b/src/tree/BaseFolder.js index 8121a29e..3ef773c1 100644 --- a/src/tree/BaseFolder.js +++ b/src/tree/BaseFolder.js @@ -11,10 +11,7 @@ export default class BaseFolder extends Node { get src() { if (!_.has(this, '_src')) { - this._src = this.walk((node, src, stop) => { - if (node.src === undefined) return stop(undefined); - return (src += node.src); - }, '', false); + this._src = this.walk((node, src) => (src += node.src || ''), '', false); } return this._src; diff --git a/src/tree/Folder.js b/src/tree/Folder.js index 330e80be..87ebca19 100644 --- a/src/tree/Folder.js +++ b/src/tree/Folder.js @@ -9,12 +9,12 @@ import { getModulePathParts } from './utils'; export default class Folder extends BaseFolder { get parsedSize() { - return this.src ? this.src.length : undefined; + return this.src ? this.src.length : 0; } get gzipSize() { if (!_.has(this, '_gzipSize')) { - this._gzipSize = this.src ? gzipSize.sync(this.src) : undefined; + this._gzipSize = this.src ? gzipSize.sync(this.src) : 0; } return this._gzipSize; diff --git a/test/analyzer.js b/test/analyzer.js index 97b77ef5..03bf1b1f 100644 --- a/test/analyzer.js +++ b/test/analyzer.js @@ -1,3 +1,4 @@ +const _ = require('lodash'); const fs = require('fs'); const del = require('del'); const childProcess = require('child_process'); @@ -55,10 +56,47 @@ describe('Analyzer', function () { ); }); - it("should filter out modules that we could't find during parsing", async function () { + it("should not filter out modules that we could't find during parsing", async function () { generateReportFrom('with-missing-parsed-module/stats.json'); const chartData = await getChartData(); + let unparsedModules = 0; forEachChartItem(chartData, item => { + if (typeof item.parsedSize !== 'number') { + unparsedModules++; + } + }); + expect(unparsedModules).to.equal(1); + }); + + it('should gracefully parse invalid chunks', async function () { + generateReportFrom('with-invalid-chunk/stats.json'); + const chartData = await getChartData(); + const invalidChunk = _.find(chartData, { label: 'invalid-chunk.js' }); + expect(invalidChunk.groups).to.deep.equal([ + { + id: 1, + label: 'invalid.js', + path: './invalid.js', + statSize: 24 + } + ]); + expect(invalidChunk.statSize).to.equal(24); + expect(invalidChunk.parsedSize).to.equal(30); + }); + + it('should gracefully process missing chunks', async function () { + generateReportFrom('with-missing-chunk/stats.json'); + const chartData = await getChartData(); + const invalidChunk = _.find(chartData, { label: 'invalid-chunk.js' }); + expect(invalidChunk).to.exist; + expect(invalidChunk.statSize).to.equal(24); + forEachChartItem([invalidChunk], item => { + expect(typeof item.statSize).to.equal('number'); + expect(item.parsedSize).to.be.undefined; + }); + const validChunk = _.find(chartData, { label: 'valid-chunk.js' }); + forEachChartItem([validChunk], item => { + expect(typeof item.statSize).to.equal('number'); expect(typeof item.parsedSize).to.equal('number'); }); }); diff --git a/test/bundles/invalidBundle.js b/test/bundles/invalidBundle.js new file mode 100644 index 00000000..55a030e5 --- /dev/null +++ b/test/bundles/invalidBundle.js @@ -0,0 +1 @@ +module.exports = 'invalid bundle'; diff --git a/test/parseUtils.js b/test/parseUtils.js index f6288254..265738b9 100644 --- a/test/parseUtils.js +++ b/test/parseUtils.js @@ -15,10 +15,19 @@ describe('parseBundle', function () { .filter(bundleName => bundleName.startsWith('valid')) .forEach(bundleName => { it(`should parse ${_.lowerCase(bundleName)}`, function () { - const modules = parseBundle(`${BUNDLES_DIR}/${bundleName}.js`); + const bundleFile = `${BUNDLES_DIR}/${bundleName}.js`; + const bundle = parseBundle(bundleFile); const expectedModules = JSON.parse(fs.readFileSync(`${BUNDLES_DIR}/${bundleName}.modules.json`)); - expect(_.omit(modules, 'src')).to.deep.equal(expectedModules); + expect(bundle.src).to.equal(fs.readFileSync(bundleFile, 'utf8')); + expect(bundle.modules).to.deep.equal(expectedModules.modules); }); }); + + it("should parse invalid bundle and return it's content and empty modules hash", function () { + const bundleFile = `${BUNDLES_DIR}/invalidBundle.js`; + const bundle = parseBundle(bundleFile); + expect(bundle.src).to.equal(fs.readFileSync(bundleFile, 'utf8')); + expect(bundle.modules).to.deep.equal({}); + }); }); diff --git a/test/stats/with-invalid-chunk/invalid-chunk.js b/test/stats/with-invalid-chunk/invalid-chunk.js new file mode 100644 index 00000000..9bd1ccb3 --- /dev/null +++ b/test/stats/with-invalid-chunk/invalid-chunk.js @@ -0,0 +1 @@ +console.log('invalid chunk'); diff --git a/test/stats/with-invalid-chunk/stats.json b/test/stats/with-invalid-chunk/stats.json new file mode 100644 index 00000000..4d4acbce --- /dev/null +++ b/test/stats/with-invalid-chunk/stats.json @@ -0,0 +1,507 @@ +{ + "errors": [], + "warnings": [], + "version": "4.8.3", + "hash": "9deae6a8259cab8aa857", + "time": 563, + "builtAt": 1526827103238, + "publicPath": "", + "outputPath": "/Volumes/Work/webpack-bundle-analyzer/test/output", + "assetsByChunkName": { + "invalid": "invalid-chunk.js", + "valid": "valid-chunk.js" + }, + "assets": [ + { + "name": "invalid-chunk.js", + "size": 568, + "chunks": [ + 0 + ], + "chunkNames": [ + "invalid" + ], + "emitted": true + }, + { + "name": "valid-chunk.js", + "size": 590, + "chunks": [ + 1 + ], + "chunkNames": [ + "valid" + ], + "emitted": true + } + ], + "filteredAssets": 0, + "entrypoints": { + "valid": { + "chunks": [ + 1 + ], + "assets": [ + "valid-chunk.js" + ], + "children": {}, + "childAssets": {} + }, + "invalid": { + "chunks": [ + 0 + ], + "assets": [ + "invalid-chunk.js" + ], + "children": {}, + "childAssets": {} + } + }, + "namedChunkGroups": { + "valid": { + "chunks": [ + 1 + ], + "assets": [ + "valid-chunk.js" + ], + "children": {}, + "childAssets": {} + }, + "invalid": { + "chunks": [ + 0 + ], + "assets": [ + "invalid-chunk.js" + ], + "children": {}, + "childAssets": {} + } + }, + "chunks": [ + { + "id": 0, + "rendered": true, + "initial": true, + "entry": true, + "size": 24, + "names": [ + "invalid" + ], + "files": [ + "invalid-chunk.js" + ], + "hash": "8582161dc498aae7630a", + "siblings": [], + "parents": [], + "children": [], + "childrenByOrder": {}, + "modules": [ + { + "id": 1, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/invalid.js", + "name": "./invalid.js", + "index": 2, + "index2": 2, + "size": 24, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 0 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./invalid.js", + "loc": "invalid" + } + ], + "usedExports": true, + "providedExports": null, + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is not an ECMAScript module" + ], + "depth": 0, + "source": "console.log('invalid');\n", + "parsedSrc": "function(e,n){console.log(\"invalid\")}" + } + ], + "filteredModules": 0, + "origins": [ + { + "module": "", + "moduleIdentifier": "", + "moduleName": "", + "loc": "invalid", + "request": "./invalid.js", + "reasons": [] + } + ] + }, + { + "id": 1, + "rendered": true, + "initial": true, + "entry": true, + "size": 70, + "names": [ + "valid" + ], + "files": [ + "valid-chunk.js" + ], + "hash": "7c1fb8000ed732072651", + "siblings": [], + "parents": [], + "children": [], + "childrenByOrder": {}, + "modules": [ + { + "id": 0, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js d378c6a2195fc2426055093c3fdde76c", + "name": "./valid.js + 1 modules", + "index": 0, + "index2": 1, + "size": 70, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 1 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [], + "depth": 0, + "modules": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js", + "index": 0, + "index2": 1, + "size": 41, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is an entry point" + ], + "depth": 0, + "source": "import { a } from './a';\nconsole.log(a);\n" + }, + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/a.js", + "name": "./a.js", + "index": 1, + "index2": 0, + "size": 29, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "issuerId": null, + "issuerName": "./valid.js", + "issuerPath": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js" + } + ], + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony side effect evaluation", + "userRequest": "./a", + "loc": "1:0-24" + }, + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony import specifier", + "userRequest": "./a", + "loc": "2:12-13" + } + ], + "usedExports": [ + "a" + ], + "providedExports": [ + "a" + ], + "optimizationBailout": [], + "depth": 1, + "source": "export const a = 'module a';\n" + } + ], + "filteredModules": 0, + "parsedSrc": "function(e,r,t){\"use strict\";t.r(r);console.log(\"module a\")}" + } + ], + "filteredModules": 0, + "origins": [ + { + "module": "", + "moduleIdentifier": "", + "moduleName": "", + "loc": "valid", + "request": "./valid.js", + "reasons": [] + } + ] + } + ], + "modules": [ + { + "id": 0, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js d378c6a2195fc2426055093c3fdde76c", + "name": "./valid.js + 1 modules", + "index": 0, + "index2": 1, + "size": 70, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 1 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [], + "depth": 0, + "modules": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js", + "index": 0, + "index2": 1, + "size": 41, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is an entry point" + ], + "depth": 0, + "source": "import { a } from './a';\nconsole.log(a);\n" + }, + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/a.js", + "name": "./a.js", + "index": 1, + "index2": 0, + "size": 29, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "issuerId": null, + "issuerName": "./valid.js", + "issuerPath": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js" + } + ], + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony side effect evaluation", + "userRequest": "./a", + "loc": "1:0-24" + }, + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony import specifier", + "userRequest": "./a", + "loc": "2:12-13" + } + ], + "usedExports": [ + "a" + ], + "providedExports": [ + "a" + ], + "optimizationBailout": [], + "depth": 1, + "source": "export const a = 'module a';\n" + } + ], + "filteredModules": 0 + }, + { + "id": 1, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/invalid.js", + "name": "./invalid.js", + "index": 2, + "index2": 2, + "size": 24, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 0 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./invalid.js", + "loc": "invalid" + } + ], + "usedExports": true, + "providedExports": null, + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is not an ECMAScript module" + ], + "depth": 0, + "source": "console.log('invalid');\n" + } + ], + "filteredModules": 0, + "children": [] +} diff --git a/test/stats/with-invalid-chunk/valid-chunk.js b/test/stats/with-invalid-chunk/valid-chunk.js new file mode 100644 index 00000000..cbb31239 --- /dev/null +++ b/test/stats/with-invalid-chunk/valid-chunk.js @@ -0,0 +1 @@ +!function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){"use strict";t.r(r);console.log("module a")}]); \ No newline at end of file diff --git a/test/stats/with-missing-chunk/stats.json b/test/stats/with-missing-chunk/stats.json new file mode 100644 index 00000000..4d4acbce --- /dev/null +++ b/test/stats/with-missing-chunk/stats.json @@ -0,0 +1,507 @@ +{ + "errors": [], + "warnings": [], + "version": "4.8.3", + "hash": "9deae6a8259cab8aa857", + "time": 563, + "builtAt": 1526827103238, + "publicPath": "", + "outputPath": "/Volumes/Work/webpack-bundle-analyzer/test/output", + "assetsByChunkName": { + "invalid": "invalid-chunk.js", + "valid": "valid-chunk.js" + }, + "assets": [ + { + "name": "invalid-chunk.js", + "size": 568, + "chunks": [ + 0 + ], + "chunkNames": [ + "invalid" + ], + "emitted": true + }, + { + "name": "valid-chunk.js", + "size": 590, + "chunks": [ + 1 + ], + "chunkNames": [ + "valid" + ], + "emitted": true + } + ], + "filteredAssets": 0, + "entrypoints": { + "valid": { + "chunks": [ + 1 + ], + "assets": [ + "valid-chunk.js" + ], + "children": {}, + "childAssets": {} + }, + "invalid": { + "chunks": [ + 0 + ], + "assets": [ + "invalid-chunk.js" + ], + "children": {}, + "childAssets": {} + } + }, + "namedChunkGroups": { + "valid": { + "chunks": [ + 1 + ], + "assets": [ + "valid-chunk.js" + ], + "children": {}, + "childAssets": {} + }, + "invalid": { + "chunks": [ + 0 + ], + "assets": [ + "invalid-chunk.js" + ], + "children": {}, + "childAssets": {} + } + }, + "chunks": [ + { + "id": 0, + "rendered": true, + "initial": true, + "entry": true, + "size": 24, + "names": [ + "invalid" + ], + "files": [ + "invalid-chunk.js" + ], + "hash": "8582161dc498aae7630a", + "siblings": [], + "parents": [], + "children": [], + "childrenByOrder": {}, + "modules": [ + { + "id": 1, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/invalid.js", + "name": "./invalid.js", + "index": 2, + "index2": 2, + "size": 24, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 0 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./invalid.js", + "loc": "invalid" + } + ], + "usedExports": true, + "providedExports": null, + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is not an ECMAScript module" + ], + "depth": 0, + "source": "console.log('invalid');\n", + "parsedSrc": "function(e,n){console.log(\"invalid\")}" + } + ], + "filteredModules": 0, + "origins": [ + { + "module": "", + "moduleIdentifier": "", + "moduleName": "", + "loc": "invalid", + "request": "./invalid.js", + "reasons": [] + } + ] + }, + { + "id": 1, + "rendered": true, + "initial": true, + "entry": true, + "size": 70, + "names": [ + "valid" + ], + "files": [ + "valid-chunk.js" + ], + "hash": "7c1fb8000ed732072651", + "siblings": [], + "parents": [], + "children": [], + "childrenByOrder": {}, + "modules": [ + { + "id": 0, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js d378c6a2195fc2426055093c3fdde76c", + "name": "./valid.js + 1 modules", + "index": 0, + "index2": 1, + "size": 70, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 1 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [], + "depth": 0, + "modules": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js", + "index": 0, + "index2": 1, + "size": 41, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is an entry point" + ], + "depth": 0, + "source": "import { a } from './a';\nconsole.log(a);\n" + }, + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/a.js", + "name": "./a.js", + "index": 1, + "index2": 0, + "size": 29, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "issuerId": null, + "issuerName": "./valid.js", + "issuerPath": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js" + } + ], + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony side effect evaluation", + "userRequest": "./a", + "loc": "1:0-24" + }, + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony import specifier", + "userRequest": "./a", + "loc": "2:12-13" + } + ], + "usedExports": [ + "a" + ], + "providedExports": [ + "a" + ], + "optimizationBailout": [], + "depth": 1, + "source": "export const a = 'module a';\n" + } + ], + "filteredModules": 0, + "parsedSrc": "function(e,r,t){\"use strict\";t.r(r);console.log(\"module a\")}" + } + ], + "filteredModules": 0, + "origins": [ + { + "module": "", + "moduleIdentifier": "", + "moduleName": "", + "loc": "valid", + "request": "./valid.js", + "reasons": [] + } + ] + } + ], + "modules": [ + { + "id": 0, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js d378c6a2195fc2426055093c3fdde76c", + "name": "./valid.js + 1 modules", + "index": 0, + "index2": 1, + "size": 70, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 1 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [], + "depth": 0, + "modules": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js", + "index": 0, + "index2": 1, + "size": 41, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./valid.js", + "loc": "valid" + } + ], + "usedExports": true, + "providedExports": [], + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is an entry point" + ], + "depth": 0, + "source": "import { a } from './a';\nconsole.log(a);\n" + }, + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/a.js", + "name": "./a.js", + "index": 1, + "index2": 0, + "size": 29, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [], + "issuer": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "issuerId": null, + "issuerName": "./valid.js", + "issuerPath": [ + { + "id": null, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "name": "./valid.js" + } + ], + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony side effect evaluation", + "userRequest": "./a", + "loc": "1:0-24" + }, + { + "moduleId": null, + "moduleIdentifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/valid.js", + "module": "./valid.js", + "moduleName": "./valid.js", + "type": "harmony import specifier", + "userRequest": "./a", + "loc": "2:12-13" + } + ], + "usedExports": [ + "a" + ], + "providedExports": [ + "a" + ], + "optimizationBailout": [], + "depth": 1, + "source": "export const a = 'module a';\n" + } + ], + "filteredModules": 0 + }, + { + "id": 1, + "identifier": "/Volumes/Work/webpack-bundle-analyzer/test/invalid-chunk/invalid.js", + "name": "./invalid.js", + "index": 2, + "index2": 2, + "size": 24, + "cacheable": true, + "built": true, + "optional": false, + "prefetched": false, + "chunks": [ + 0 + ], + "issuer": null, + "issuerId": null, + "issuerName": null, + "issuerPath": null, + "failed": false, + "errors": 0, + "warnings": 0, + "assets": [], + "reasons": [ + { + "moduleId": null, + "moduleIdentifier": null, + "module": null, + "moduleName": null, + "type": "single entry", + "userRequest": "./invalid.js", + "loc": "invalid" + } + ], + "usedExports": true, + "providedExports": null, + "optimizationBailout": [ + "ModuleConcatenation bailout: Module is not an ECMAScript module" + ], + "depth": 0, + "source": "console.log('invalid');\n" + } + ], + "filteredModules": 0, + "children": [] +} diff --git a/test/stats/with-missing-chunk/valid-chunk.js b/test/stats/with-missing-chunk/valid-chunk.js new file mode 100644 index 00000000..cbb31239 --- /dev/null +++ b/test/stats/with-missing-chunk/valid-chunk.js @@ -0,0 +1 @@ +!function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){"use strict";t.r(r);console.log("module a")}]); \ No newline at end of file diff --git a/test/stats/with-module-concatenation-info/stats.json b/test/stats/with-module-concatenation-info/stats.json index 32238bcb..f59b726b 100644 --- a/test/stats/with-module-concatenation-info/stats.json +++ b/test/stats/with-module-concatenation-info/stats.json @@ -1 +1 @@ -{"errors":[],"warnings":[],"version":"4.0.0","hash":"d8c858adcd390ee63793","time":1129,"builtAt":1519570526379,"publicPath":"","outputPath":"/Volumes/Work/webpack-bundle-analyzer/test/output","assetsByChunkName":{"main":"bundle.js"},"assets":[{"name":"bundle.js","size":600,"chunks":[0],"chunkNames":["main"],"emitted":true}],"filteredAssets":0,"entrypoints":{"main":{"chunks":[0],"assets":["bundle.js"]}},"chunks":[{"id":0,"rendered":true,"initial":true,"entry":true,"size":332,"names":["main"],"files":["bundle.js"],"hash":"007330edb8c53027cbbc","siblings":[],"parents":[],"children":[],"modules":[{"id":0,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js e28de86a36ac92369ef12de880629ef9","name":"./index.js + 5 modules","index":0,"index2":5,"size":332,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[0],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":[],"depth":0,"modules":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js","index":0,"index2":5,"size":196,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module","ModuleConcatenation bailout: Module is an entry point"],"depth":0,"source":"import { a1 } from './a';\nimport { b } from './modules-1/b';\nimport { c } from './modules-1/c';\nimport { d } from './modules-2/d';\nimport { e } from './modules-2/e';\n\nconsole.log(a1, b, c, d, e);\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/a.js","name":"./a.js","index":1,"index2":0,"size":48,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./a","loc":"1:0-25"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./a","loc":"7:12-14"}],"usedExports":["a1"],"providedExports":["a1","a2"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const a1 = 'a1';\nexport const a2 = 'a2';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-1/b.js","name":"./modules-1/b.js","index":2,"index2":1,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/b","loc":"2:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/b","loc":"7:16-17"}],"usedExports":["b"],"providedExports":["b"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const b = 'b';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-1/c.js","name":"./modules-1/c.js","index":3,"index2":2,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/c","loc":"3:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/c","loc":"7:19-20"}],"usedExports":["c"],"providedExports":["c"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const c = 'c';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-2/d.js","name":"./modules-2/d.js","index":4,"index2":3,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/d","loc":"4:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/d","loc":"7:22-23"}],"usedExports":["d"],"providedExports":["d"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const d = 'd';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-2/e.js","name":"./modules-2/e.js","index":5,"index2":4,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/e","loc":"5:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/e","loc":"7:25-26"}],"usedExports":["e"],"providedExports":["e"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const e = 'e';\n"}],"filteredModules":0}],"filteredModules":0,"origins":[{"module":"","moduleIdentifier":"","moduleName":"","loc":"main","request":"./index.js","reasons":[]}]}],"modules":[{"id":0,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js e28de86a36ac92369ef12de880629ef9","name":"./index.js + 5 modules","index":0,"index2":5,"size":332,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[0],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":[],"depth":0,"modules":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js","index":0,"index2":5,"size":196,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module","ModuleConcatenation bailout: Module is an entry point"],"depth":0,"source":"import { a1 } from './a';\nimport { b } from './modules-1/b';\nimport { c } from './modules-1/c';\nimport { d } from './modules-2/d';\nimport { e } from './modules-2/e';\n\nconsole.log(a1, b, c, d, e);\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/a.js","name":"./a.js","index":1,"index2":0,"size":48,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./a","loc":"1:0-25"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./a","loc":"7:12-14"}],"usedExports":["a1"],"providedExports":["a1","a2"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const a1 = 'a1';\nexport const a2 = 'a2';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-1/b.js","name":"./modules-1/b.js","index":2,"index2":1,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/b","loc":"2:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/b","loc":"7:16-17"}],"usedExports":["b"],"providedExports":["b"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const b = 'b';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-1/c.js","name":"./modules-1/c.js","index":3,"index2":2,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/c","loc":"3:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/c","loc":"7:19-20"}],"usedExports":["c"],"providedExports":["c"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const c = 'c';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-2/d.js","name":"./modules-2/d.js","index":4,"index2":3,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/d","loc":"4:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/d","loc":"7:22-23"}],"usedExports":["d"],"providedExports":["d"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const d = 'd';\n"},{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/modules-2/e.js","name":"./modules-2/e.js","index":5,"index2":4,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/e","loc":"5:0-34"},{"moduleId":null,"moduleIdentifier":"/Volumes/Work/webpack-bundle-analyzer/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/e","loc":"7:25-26"}],"usedExports":["e"],"providedExports":["e"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const e = 'e';\n"}],"filteredModules":0,"parsedSrc":"function(e,r,t){\"use strict\";t.r(r);console.log(\"a1\",\"b\",\"c\",\"d\",\"e\")}"}],"filteredModules":0,"children":[]} \ No newline at end of file +{"errors":[],"warnings":[],"version":"4.0.0","hash":"d8c858adcd390ee63793","time":1129,"builtAt":1519570526379,"publicPath":"","outputPath":"/Volumes/Work/webpack-bundle-analyzer/test/output","assetsByChunkName":{"main":"bundle.js"},"assets":[{"name":"bundle.js","size":600,"chunks":[0],"chunkNames":["main"],"emitted":true}],"filteredAssets":0,"entrypoints":{"main":{"chunks":[0],"assets":["bundle.js"]}},"chunks":[{"id":0,"rendered":true,"initial":true,"entry":true,"size":332,"names":["main"],"files":["bundle.js"],"hash":"007330edb8c53027cbbc","siblings":[],"parents":[],"children":[],"modules":[{"id":0,"identifier":"/test/wp4/index.js e28de86a36ac92369ef12de880629ef9","name":"./index.js + 5 modules","index":0,"index2":5,"size":332,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[0],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":[],"depth":0,"modules":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js","index":0,"index2":5,"size":196,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module","ModuleConcatenation bailout: Module is an entry point"],"depth":0,"source":"import { a1 } from './a';\nimport { b } from './modules-1/b';\nimport { c } from './modules-1/c';\nimport { d } from './modules-2/d';\nimport { e } from './modules-2/e';\n\nconsole.log(a1, b, c, d, e);\n"},{"id":null,"identifier":"/test/wp4/a.js","name":"./a.js","index":1,"index2":0,"size":48,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./a","loc":"1:0-25"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./a","loc":"7:12-14"}],"usedExports":["a1"],"providedExports":["a1","a2"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const a1 = 'a1';\nexport const a2 = 'a2';\n"},{"id":null,"identifier":"/test/wp4/modules-1/b.js","name":"./modules-1/b.js","index":2,"index2":1,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/b","loc":"2:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/b","loc":"7:16-17"}],"usedExports":["b"],"providedExports":["b"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const b = 'b';\n"},{"id":null,"identifier":"/test/wp4/modules-1/c.js","name":"./modules-1/c.js","index":3,"index2":2,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/c","loc":"3:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/c","loc":"7:19-20"}],"usedExports":["c"],"providedExports":["c"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const c = 'c';\n"},{"id":null,"identifier":"/test/wp4/modules-2/d.js","name":"./modules-2/d.js","index":4,"index2":3,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/d","loc":"4:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/d","loc":"7:22-23"}],"usedExports":["d"],"providedExports":["d"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const d = 'd';\n"},{"id":null,"identifier":"/test/wp4/modules-2/e.js","name":"./modules-2/e.js","index":5,"index2":4,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/e","loc":"5:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/e","loc":"7:25-26"}],"usedExports":["e"],"providedExports":["e"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const e = 'e';\n"}],"filteredModules":0}],"filteredModules":0,"origins":[{"module":"","moduleIdentifier":"","moduleName":"","loc":"main","request":"./index.js","reasons":[]}]}],"modules":[{"id":0,"identifier":"/test/wp4/index.js e28de86a36ac92369ef12de880629ef9","name":"./index.js + 5 modules","index":0,"index2":5,"size":332,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[0],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":[],"depth":0,"modules":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js","index":0,"index2":5,"size":196,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":null,"issuerId":null,"issuerName":null,"issuerPath":null,"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":null,"module":null,"moduleName":null,"type":"single entry","userRequest":"./index.js","loc":"main"}],"usedExports":true,"providedExports":[],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module","ModuleConcatenation bailout: Module is an entry point"],"depth":0,"source":"import { a1 } from './a';\nimport { b } from './modules-1/b';\nimport { c } from './modules-1/c';\nimport { d } from './modules-2/d';\nimport { e } from './modules-2/e';\n\nconsole.log(a1, b, c, d, e);\n"},{"id":null,"identifier":"/test/wp4/a.js","name":"./a.js","index":1,"index2":0,"size":48,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./a","loc":"1:0-25"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./a","loc":"7:12-14"}],"usedExports":["a1"],"providedExports":["a1","a2"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const a1 = 'a1';\nexport const a2 = 'a2';\n"},{"id":null,"identifier":"/test/wp4/modules-1/b.js","name":"./modules-1/b.js","index":2,"index2":1,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/b","loc":"2:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/b","loc":"7:16-17"}],"usedExports":["b"],"providedExports":["b"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const b = 'b';\n"},{"id":null,"identifier":"/test/wp4/modules-1/c.js","name":"./modules-1/c.js","index":3,"index2":2,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-1/c","loc":"3:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-1/c","loc":"7:19-20"}],"usedExports":["c"],"providedExports":["c"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const c = 'c';\n"},{"id":null,"identifier":"/test/wp4/modules-2/d.js","name":"./modules-2/d.js","index":4,"index2":3,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/d","loc":"4:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/d","loc":"7:22-23"}],"usedExports":["d"],"providedExports":["d"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const d = 'd';\n"},{"id":null,"identifier":"/test/wp4/modules-2/e.js","name":"./modules-2/e.js","index":5,"index2":4,"size":22,"cacheable":true,"built":true,"optional":false,"prefetched":false,"chunks":[],"assets":[],"issuer":"/test/wp4/index.js","issuerId":null,"issuerName":"./index.js","issuerPath":[{"id":null,"identifier":"/test/wp4/index.js","name":"./index.js"}],"failed":false,"errors":0,"warnings":0,"reasons":[{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony side effect evaluation","userRequest":"./modules-2/e","loc":"5:0-34"},{"moduleId":null,"moduleIdentifier":"/test/wp4/index.js","module":"./index.js","moduleName":"./index.js","type":"harmony import specifier","userRequest":"./modules-2/e","loc":"7:25-26"}],"usedExports":["e"],"providedExports":["e"],"optimizationBailout":["ModuleConcatenation bailout: Module is not an ECMAScript module"],"depth":1,"source":"export const e = 'e';\n"}],"filteredModules":0,"parsedSrc":"function(e,r,t){\"use strict\";t.r(r);console.log(\"a1\",\"b\",\"c\",\"d\",\"e\")}"}],"filteredModules":0,"children":[]} diff --git a/test/stats/with-modules-in-chunks/expected-chart-data.js b/test/stats/with-modules-in-chunks/expected-chart-data.js index 4e09f3a9..ed890ed9 100644 --- a/test/stats/with-modules-in-chunks/expected-chart-data.js +++ b/test/stats/with-modules-in-chunks/expected-chart-data.js @@ -1,7 +1,7 @@ module.exports = [ { 'label': 'runtime.6afe30102d8fe7337431.js', - 'statSize': 0, + 'statSize': 1053, 'groups': [] }, { From 4944a5bdb1c469da49e7ebb9b82145343850aed0 Mon Sep 17 00:00:00 2001 From: th0r Date: Mon, 21 May 2018 11:04:55 +0300 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8bdd17..699b206c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ _Note: Gaps between patch versions are faulty, broken or test releases._ + * **Improvement** + * Loosen bundle parsing logic ([#181](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/181)). Now analyzer will still show parsed sizes even if: + * It can't parse some bundle chunks. Those chunks just won't have content in the report. Fixes issues like [#160](https://github.com/webpack-contrib/webpack-bundle-analyzer/issues/160). + * Some bundle chunks are missing (it couldn't find files to parse). Those chunks just won't be visible in the report for parsed/gzipped sizes. + ## 2.12.0 * **New Feature**