From 1a504483b82e2e80ed1f0442af105cb14106d435 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Thu, 2 Dec 2021 18:47:49 +0300 Subject: [PATCH 1/3] fix/refactor spaceLimited - optimize - respect max arg when there is no groups and max > items.length --- lib/stats/DefaultStatsFactoryPlugin.js | 152 +++++++++++------- .../StatsTestCases.basictest.js.snap | 84 ++++++++-- 2 files changed, 162 insertions(+), 74 deletions(-) diff --git a/lib/stats/DefaultStatsFactoryPlugin.js b/lib/stats/DefaultStatsFactoryPlugin.js index 1adc8dc14..447daa9a8 100644 --- a/lib/stats/DefaultStatsFactoryPlugin.js +++ b/lib/stats/DefaultStatsFactoryPlugin.js @@ -1658,84 +1658,114 @@ const collapse = children => { return newChildren; }; -const spaceLimited = (itemsAndGroups, max) => { +const spaceLimited = (itemsAndGroups, max, innerSpace = false) => { + if (max < 1) { + return { + children: undefined, + filteredChildren: getTotalItems(itemsAndGroups) + }; + } /** @type {any[] | undefined} */ let children = undefined; /** @type {number | undefined} */ let filteredChildren = undefined; // This are the groups, which take 1+ lines each - const groups = itemsAndGroups.filter(c => c.children || c.filteredChildren); + const groups = []; // The sizes of the groups are stored in groupSizes - const groupSizes = groups.map(g => getItemSize(g)); + const groupSizes = []; // This are the items, which take 1 line each - const items = itemsAndGroups.filter(c => !c.children && !c.filteredChildren); + const items = []; // The total of group sizes - let groupsSize = groupSizes.reduce((a, b) => a + b, 0); + let groupsSize = 0; + + for (const itemOrGroup of itemsAndGroups) { + // is item + if (!itemOrGroup.children && !itemOrGroup.filteredChildren) { + items.push(itemOrGroup); + } else { + groups.push(itemOrGroup); + const size = getItemSize(itemOrGroup); + groupSizes.push(size); + groupsSize += size; + } + } + if (groupsSize + items.length <= max) { // The total size in the current state fits into the max // keep all - children = groups.concat(items); - } else if ( - groups.length > 0 && - groups.length + Math.min(1, items.length) < max - ) { - // If each group would take 1 line the total would be below the maximum - // collapse some groups, keep items - while (groupsSize + items.length + (filteredChildren ? 1 : 0) > max) { + children = groups.length > 0 ? groups.concat(items) : items; + } else if (groups.length === 0) { + // slice items to max + // inner space marks that lines for filteredChildren already reserved + const limit = max - (innerSpace ? 0 : 1); + filteredChildren = items.length - limit; + items.length = limit; + children = items; + } else { + const limit = groups.length + (innerSpace ? 0 : Math.min(1, items.length)); + if (limit < max) { // calculate how much we are over the size limit // this allows to approach the limit faster - // it's always > 1 - const oversize = - items.length + groupsSize + (filteredChildren ? 1 : 0) - max; - // Find the maximum group and process only this one - const maxGroupSize = Math.max(...groupSizes); - if (maxGroupSize < items.length) { - filteredChildren = items.length; - items.length = 0; - continue; - } - for (let i = 0; i < groups.length; i++) { - if (groupSizes[i] === maxGroupSize) { - const group = groups[i]; - // run this algorithm recursively and limit the size of the children to - // current size - oversize / number of groups - // So it should always end up being smaller - const headerSize = !group.children - ? 0 - : group.filteredChildren - ? 2 - : 1; - const limited = spaceLimited( - group.children, - groupSizes[i] - headerSize - oversize / groups.length - ); - groups[i] = { - ...group, - children: limited.children, - filteredChildren: - (group.filteredChildren || 0) + limited.filteredChildren - }; - const newSize = getItemSize(groups[i]); - groupsSize -= groupSizes[i] - newSize; - groupSizes[i] = newSize; - break; + let oversize; + // If each group would take 1 line the total would be below the maximum + // collapse some groups, keep items + while ( + (oversize = + groupsSize + + items.length + + (filteredChildren && !innerSpace ? 1 : 0) - + max) > 0 + ) { + // Find the maximum group and process only this one + const maxGroupSize = Math.max(...groupSizes); + if (maxGroupSize < items.length) { + filteredChildren = items.length; + items.length = 0; + continue; + } + for (let i = 0; i < groups.length; i++) { + if (groupSizes[i] === maxGroupSize) { + const group = groups[i]; + // run this algorithm recursively and limit the size of the children to + // current size - oversize / number of groups + // So it should always end up being smaller + const headerSize = group.filteredChildren ? 2 : 1; + const limited = spaceLimited( + group.children, + maxGroupSize - + // we should use ceil to always feet in max + Math.ceil(oversize / groups.length) - + // we substitute size of group head + headerSize, + true + ); + groups[i] = { + ...group, + children: limited.children, + filteredChildren: limited.filteredChildren + ? (group.filteredChildren || 0) + limited.filteredChildren + : group.filteredChildren + }; + const newSize = getItemSize(groups[i]); + groupsSize -= maxGroupSize - newSize; + groupSizes[i] = newSize; + break; + } } } + children = groups.concat(items); + } else if (limit === max) { + // If we have only enough space to show one line per group and one line for the filtered items + // collapse all groups and items + children = collapse(groups); + filteredChildren = items.length; + } else { + // If we have no space + // collapse complete group + filteredChildren = getTotalItems(itemsAndGroups); } - children = groups.concat(items); - } else if ( - groups.length > 0 && - groups.length + Math.min(1, items.length) <= max - ) { - // If we have only enough space to show one line per group and one line for the filtered items - // collapse all groups and items - children = groups.length ? collapse(groups) : undefined; - filteredChildren = items.length; - } else { - // If we have no space - // collapse complete group - filteredChildren = getTotalItems(itemsAndGroups); } + return { children, filteredChildren diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index 6cfe46048..aa8f8b5f9 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -1326,13 +1326,46 @@ webpack x.x.x compiled successfully in X ms" exports[`StatsTestCases should print correct stats for max-modules 1`] = ` "asset main.js 5.47 KiB [emitted] (name: main) -31 modules +./index.js 181 bytes [built] [code generated] +./a.js?1 33 bytes [built] [code generated] +./a.js?2 33 bytes [built] [code generated] +./a.js?3 33 bytes [built] [code generated] +./a.js?4 33 bytes [built] [code generated] +./a.js?5 33 bytes [built] [code generated] +./a.js?6 33 bytes [built] [code generated] +./a.js?7 33 bytes [built] [code generated] +./a.js?8 33 bytes [built] [code generated] +./a.js?9 33 bytes [built] [code generated] +./a.js?10 33 bytes [built] [code generated] +./c.js?1 33 bytes [built] [code generated] +./c.js?2 33 bytes [built] [code generated] +./c.js?3 33 bytes [built] [code generated] +./c.js?4 33 bytes [built] [code generated] +./c.js?5 33 bytes [built] [code generated] +./c.js?6 33 bytes [built] [code generated] +./c.js?7 33 bytes [built] [code generated] +./c.js?8 33 bytes [built] [code generated] +12 modules webpack x.x.x compiled successfully in X ms" `; exports[`StatsTestCases should print correct stats for max-modules-default 1`] = ` "asset main.js 5.47 KiB [emitted] (name: main) -31 modules +./index.js 181 bytes [built] [code generated] +./a.js?1 33 bytes [built] [code generated] +./a.js?2 33 bytes [built] [code generated] +./a.js?3 33 bytes [built] [code generated] +./a.js?4 33 bytes [built] [code generated] +./a.js?5 33 bytes [built] [code generated] +./a.js?6 33 bytes [built] [code generated] +./a.js?7 33 bytes [built] [code generated] +./a.js?8 33 bytes [built] [code generated] +./a.js?9 33 bytes [built] [code generated] +./a.js?10 33 bytes [built] [code generated] +./c.js?1 33 bytes [built] [code generated] +./c.js?2 33 bytes [built] [code generated] +./c.js?3 33 bytes [built] [code generated] +17 modules webpack x.x.x compiled successfully in X ms" `; @@ -3052,7 +3085,23 @@ exports[`StatsTestCases should print correct stats for scope-hoisting-bailouts 1 "runtime modules 6.83 KiB 10 modules built modules 615 bytes [built] code generated modules 530 bytes [code generated] - modules by path ./*.js 377 bytes 7 modules + modules by path ./*.js 377 bytes + ./index.js 150 bytes [built] [code generated] + Statement (ExpressionStatement) with side effects in source code at 7:0-25 + ModuleConcatenation bailout: Cannot concat with ./cjs.js: Module is not an ECMAScript module + ModuleConcatenation bailout: Cannot concat with ./eval.js: Module uses eval() + ModuleConcatenation bailout: Cannot concat with ./module-id.js: Module uses module.id + ModuleConcatenation bailout: Cannot concat with ./module-loaded.js: Module uses module.loaded + ./entry.js 32 bytes [built] [code generated] + ./cjs.js 59 bytes [built] [code generated] + CommonJS bailout: module.exports is used directly at 3:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-26 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./ref-from-cjs.js 45 bytes [built] [code generated] + ./eval.js 35 bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-34 + ModuleConcatenation bailout: Module uses eval() + 2 modules ./concatenated.js + 2 modules 111 bytes [built] [code generated] ModuleConcatenation bailout: Cannot concat with external \\"external\\": Module external \\"external\\" is not in the same chunk(s) (expected in chunk(s) unnamed chunk(s), module is in chunk(s) index) external \\"external\\" 42 bytes [built] [code generated] @@ -3087,12 +3136,13 @@ Entrypoint second 13.5 KiB = b-vendor.js 419 bytes b-second.js 13.1 KiB runtime modules 15.1 KiB 20 modules cacheable modules 975 bytes code generated modules 857 bytes [code generated] - modules by path ./*.js + 1 modules 459 bytes 3 modules + modules by path ./*.js + 1 modules 459 bytes + ./second.js + 1 modules 227 bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) second, module is in chunk(s) vendor) + 2 modules modules by path ./*.js 106 bytes ./vendor.js 25 bytes [built] [code generated] - ./lazy_shared.js 56 bytes [built] [code generated] - ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_first.js, ./lazy_second.js - ./common_lazy_shared.js 25 bytes [built] [code generated] + 2 modules ./first.js + 2 modules 292 bytes [built] [code generated] ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) first, module is in chunk(s) vendor) orphan modules 118 bytes [orphan] @@ -4073,8 +4123,16 @@ switched: ./index.js 1.19 KiB [built] [code generated] chunk (runtime: main) switched-main-879072e3.js (main-879072e3) 1.68 KiB ={1}= ={59}= ={318}= ={410}= ={520}= ={663}= ={869}= ={997}= [initial] [rendered] > ./ main - modules by path ./subfolder/*.js 1.1 KiB 11 modules - modules by path ./*.js 594 bytes 9 modules + modules by path ./subfolder/*.js 1.1 KiB + ./subfolder/big.js?1 267 bytes [built] [code generated] + ./subfolder/big.js?2 267 bytes [built] [code generated] + ./subfolder/small.js?1 66 bytes [built] [code generated] + 8 modules + modules by path ./*.js 594 bytes + ./small.js?1 66 bytes [built] [code generated] + ./small.js?2 66 bytes [built] [code generated] + ./small.js?3 66 bytes [built] [code generated] + 6 modules chunk (runtime: main) switched-main-12217e1d.js (main-12217e1d) 1.57 KiB (javascript) 3.02 KiB (runtime) ={1}= ={59}= ={318}= ={410}= ={520}= ={581}= ={869}= ={997}= [entry] [rendered] > ./ main runtime modules 3.02 KiB 5 modules @@ -4086,13 +4144,13 @@ switched: ./node_modules/small.js?2 66 bytes [built] [code generated] chunk (runtime: main) switched-main-7aeafcb2.js (main-7aeafcb2) 1.62 KiB ={1}= ={59}= ={318}= ={410}= ={520}= ={581}= ={663}= ={869}= [initial] [rendered] > ./ main - modules by path ./inner-module/*.js 594 bytes 9 modules + modules by path ./inner-module/*.js 594 bytes + ./inner-module/small.js?1 66 bytes [built] [code generated] + 8 modules modules by path ./in-some-directory/*.js 531 bytes ./in-some-directory/big.js?1 267 bytes [built] [code generated] ./in-some-directory/small.js?1 66 bytes [built] [code generated] - ./in-some-directory/small.js?2 66 bytes [built] [code generated] - ./in-some-directory/small.js?3 66 bytes [built] [code generated] - ./in-some-directory/small.js?4 66 bytes [built] [code generated] + 3 modules modules by path ./*.js 534 bytes ./big.js?1 267 bytes [built] [code generated] ./big.js?2 267 bytes [built] [code generated] From eae11dd27ed31119e6bd3568a4a4ec563c57b7a9 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Thu, 2 Dec 2021 19:30:28 +0300 Subject: [PATCH 2/3] renaming --- lib/stats/DefaultStatsFactoryPlugin.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/stats/DefaultStatsFactoryPlugin.js b/lib/stats/DefaultStatsFactoryPlugin.js index 447daa9a8..81eb2a112 100644 --- a/lib/stats/DefaultStatsFactoryPlugin.js +++ b/lib/stats/DefaultStatsFactoryPlugin.js @@ -1658,7 +1658,11 @@ const collapse = children => { return newChildren; }; -const spaceLimited = (itemsAndGroups, max, innerSpace = false) => { +const spaceLimited = ( + itemsAndGroups, + max, + filteredChildrenLineReserved = false +) => { if (max < 1) { return { children: undefined, @@ -1697,12 +1701,14 @@ const spaceLimited = (itemsAndGroups, max, innerSpace = false) => { } else if (groups.length === 0) { // slice items to max // inner space marks that lines for filteredChildren already reserved - const limit = max - (innerSpace ? 0 : 1); + const limit = max - (filteredChildrenLineReserved ? 0 : 1); filteredChildren = items.length - limit; items.length = limit; children = items; } else { - const limit = groups.length + (innerSpace ? 0 : Math.min(1, items.length)); + const limit = + groups.length + + (filteredChildrenLineReserved ? 0 : Math.min(1, items.length)); if (limit < max) { // calculate how much we are over the size limit // this allows to approach the limit faster @@ -1713,7 +1719,7 @@ const spaceLimited = (itemsAndGroups, max, innerSpace = false) => { (oversize = groupsSize + items.length + - (filteredChildren && !innerSpace ? 1 : 0) - + (filteredChildren && !filteredChildrenLineReserved ? 1 : 0) - max) > 0 ) { // Find the maximum group and process only this one @@ -1737,7 +1743,7 @@ const spaceLimited = (itemsAndGroups, max, innerSpace = false) => { Math.ceil(oversize / groups.length) - // we substitute size of group head headerSize, - true + headerSize === 2 ); groups[i] = { ...group, From 616251c0699c814c01c2a3ed7b614fdc510e6c62 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Fri, 14 Jan 2022 15:27:30 +0100 Subject: [PATCH 3/3] add a plus before count handle extension extraction for concatenated modules correctly --- lib/stats/DefaultStatsFactoryPlugin.js | 14 +- lib/stats/DefaultStatsPrinterPlugin.js | 85 +++++++++--- .../StatsTestCases.basictest.js.snap | 123 +++++++++--------- 3 files changed, 135 insertions(+), 87 deletions(-) diff --git a/lib/stats/DefaultStatsFactoryPlugin.js b/lib/stats/DefaultStatsFactoryPlugin.js index 81eb2a112..20c899627 100644 --- a/lib/stats/DefaultStatsFactoryPlugin.js +++ b/lib/stats/DefaultStatsFactoryPlugin.js @@ -1706,9 +1706,10 @@ const spaceLimited = ( items.length = limit; children = items; } else { + // limit is the size when all groups are collapsed const limit = groups.length + - (filteredChildrenLineReserved ? 0 : Math.min(1, items.length)); + (filteredChildrenLineReserved || items.length === 0 ? 0 : 1); if (limit < max) { // calculate how much we are over the size limit // this allows to approach the limit faster @@ -1813,6 +1814,9 @@ const reasonGroup = (children, reasons) => { }; }; +const GROUP_EXTENSION_REGEXP = /(\.[^.]+?)(?:\?|(?: \+ \d+ modules?)?$)/; +const GROUP_PATH_REGEXP = /(.+)[/\\][^/\\]+?(?:\?|(?: \+ \d+ modules?)?$)/; + /** @type {Record void>} */ const ASSETS_GROUPERS = { _: (groupConfigs, context, options) => { @@ -1861,10 +1865,10 @@ const ASSETS_GROUPERS = { groupConfigs.push({ getKeys: asset => { const extensionMatch = - groupAssetsByExtension && /(\.[^.]+)(?:\?.*|$)/.exec(asset.name); + groupAssetsByExtension && GROUP_EXTENSION_REGEXP.exec(asset.name); const extension = extensionMatch ? extensionMatch[1] : ""; const pathMatch = - groupAssetsByPath && /(.+)[/\\][^/\\]+(?:\?.*|$)/.exec(asset.name); + groupAssetsByPath && GROUP_PATH_REGEXP.exec(asset.name); const path = pathMatch ? pathMatch[1].split(/[/\\]/) : []; const keys = []; if (groupAssetsByPath) { @@ -2059,10 +2063,10 @@ const MODULES_GROUPERS = type => ({ if (!module.name) return; const resource = parseResource(module.name.split("!").pop()).path; const extensionMatch = - groupModulesByExtension && /(\.[^.]+)(?:\?.*|$)/.exec(resource); + groupModulesByExtension && GROUP_EXTENSION_REGEXP.exec(resource); const extension = extensionMatch ? extensionMatch[1] : ""; const pathMatch = - groupModulesByPath && /(.+)[/\\][^/\\]+(?:\?.*|$)/.exec(resource); + groupModulesByPath && GROUP_PATH_REGEXP.exec(resource); const path = pathMatch ? pathMatch[1].split(/[/\\]/) : []; const keys = []; if (groupModulesByPath) { diff --git a/lib/stats/DefaultStatsPrinterPlugin.js b/lib/stats/DefaultStatsPrinterPlugin.js index ec917faaf..1ab78dd52 100644 --- a/lib/stats/DefaultStatsPrinterPlugin.js +++ b/lib/stats/DefaultStatsPrinterPlugin.js @@ -38,6 +38,10 @@ const isValidId = id => { return typeof id === "number" || id; }; +const moreCount = (list, count) => { + return list && list.length > 0 ? `+ ${count}` : `${count}`; +}; + /** @type {Record string | void>} */ const SIMPLE_PRINTERS = { "compilation.summary!": ( @@ -163,13 +167,24 @@ const SIMPLE_PRINTERS = { }, "compilation.assetsByChunkName": () => "", - "compilation.filteredModules": filteredModules => + "compilation.filteredModules": ( + filteredModules, + { compilation: { modules } } + ) => filteredModules > 0 - ? `${filteredModules} ${plural(filteredModules, "module", "modules")}` + ? `${moreCount(modules, filteredModules)} ${plural( + filteredModules, + "module", + "modules" + )}` : undefined, "compilation.filteredAssets": (filteredAssets, { compilation: { assets } }) => filteredAssets > 0 - ? `${filteredAssets} ${plural(filteredAssets, "asset", "assets")}` + ? `${moreCount(assets, filteredAssets)} ${plural( + filteredAssets, + "asset", + "assets" + )}` : undefined, "compilation.logging": (logging, context, printer) => Array.isArray(logging) @@ -262,15 +277,19 @@ const SIMPLE_PRINTERS = { "asset.separator!": () => "\n", "asset.filteredRelated": (filteredRelated, { asset: { related } }) => filteredRelated > 0 - ? `${filteredRelated} related ${plural( + ? `${moreCount(related, filteredRelated)} related ${plural( filteredRelated, "asset", "assets" )}` : undefined, - "asset.filteredChildren": filteredChildren => + "asset.filteredChildren": (filteredChildren, { asset: { children } }) => filteredChildren > 0 - ? `${filteredChildren} ${plural(filteredChildren, "asset", "assets")}` + ? `${moreCount(children, filteredChildren)} ${plural( + filteredChildren, + "asset", + "assets" + )}` : undefined, assetChunk: (id, { formatChunkId }) => formatChunkId(id), @@ -366,21 +385,29 @@ const SIMPLE_PRINTERS = { "module.issuerPath": (issuerPath, { module }) => module.profile ? undefined : "", "module.profile": profile => undefined, - "module.filteredModules": filteredModules => + "module.filteredModules": (filteredModules, { module: { modules } }) => filteredModules > 0 - ? `${filteredModules} nested ${plural( + ? `${moreCount(modules, filteredModules)} nested ${plural( filteredModules, "module", "modules" )}` : undefined, - "module.filteredReasons": filteredReasons => + "module.filteredReasons": (filteredReasons, { module: { reasons } }) => filteredReasons > 0 - ? `${filteredReasons} ${plural(filteredReasons, "reason", "reasons")}` + ? `${moreCount(reasons, filteredReasons)} ${plural( + filteredReasons, + "reason", + "reasons" + )}` : undefined, - "module.filteredChildren": filteredChildren => + "module.filteredChildren": (filteredChildren, { module: { children } }) => filteredChildren > 0 - ? `${filteredChildren} ${plural(filteredChildren, "module", "modules")}` + ? `${moreCount(children, filteredChildren)} ${plural( + filteredChildren, + "module", + "modules" + )}` : undefined, "module.separator!": () => "\n", @@ -397,9 +424,16 @@ const SIMPLE_PRINTERS = { "moduleReason.active": (active, { formatFlag }) => active ? undefined : formatFlag("inactive"), "moduleReason.resolvedModule": (module, { magenta }) => magenta(module), - "moduleReason.filteredChildren": filteredChildren => + "moduleReason.filteredChildren": ( + filteredChildren, + { moduleReason: { children } } + ) => filteredChildren > 0 - ? `${filteredChildren} ${plural(filteredChildren, "reason", "reasons")}` + ? `${moreCount(children, filteredChildren)} ${plural( + filteredChildren, + "reason", + "reasons" + )}` : undefined, "module.profile.total": (value, { formatTime }) => formatTime(value), @@ -427,10 +461,21 @@ const SIMPLE_PRINTERS = { size ? formatSize(size) : undefined, "chunkGroup.auxiliaryAssetsSize": (size, { formatSize }) => size ? `(${formatSize(size)})` : undefined, - "chunkGroup.filteredAssets": n => - n > 0 ? `${n} ${plural(n, "asset", "assets")}` : undefined, - "chunkGroup.filteredAuxiliaryAssets": n => - n > 0 ? `${n} auxiliary ${plural(n, "asset", "assets")}` : undefined, + "chunkGroup.filteredAssets": (n, { chunkGroup: { assets } }) => + n > 0 + ? `${moreCount(assets, n)} ${plural(n, "asset", "assets")}` + : undefined, + "chunkGroup.filteredAuxiliaryAssets": ( + n, + { chunkGroup: { auxiliaryAssets } } + ) => + n > 0 + ? `${moreCount(auxiliaryAssets, n)} auxiliary ${plural( + n, + "asset", + "assets" + )}` + : undefined, "chunkGroup.is!": () => "=", "chunkGroupAsset.name": (asset, { green }) => green(asset), "chunkGroupAsset.size": (size, { formatSize, chunkGroup }) => @@ -490,9 +535,9 @@ const SIMPLE_PRINTERS = { "chunk.recorded": (recorded, { formatFlag, green }) => recorded ? green(formatFlag("recorded")) : undefined, "chunk.reason": (reason, { yellow }) => (reason ? yellow(reason) : undefined), - "chunk.filteredModules": filteredModules => + "chunk.filteredModules": (filteredModules, { chunk: { modules } }) => filteredModules > 0 - ? `${filteredModules} chunk ${plural( + ? `${moreCount(modules, filteredModules)} chunk ${plural( filteredModules, "module", "modules" diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index aa8f8b5f9..3a1cac748 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -1345,7 +1345,7 @@ exports[`StatsTestCases should print correct stats for max-modules 1`] = ` ./c.js?6 33 bytes [built] [code generated] ./c.js?7 33 bytes [built] [code generated] ./c.js?8 33 bytes [built] [code generated] -12 modules ++ 12 modules webpack x.x.x compiled successfully in X ms" `; @@ -1365,7 +1365,7 @@ exports[`StatsTestCases should print correct stats for max-modules-default 1`] = ./c.js?1 33 bytes [built] [code generated] ./c.js?2 33 bytes [built] [code generated] ./c.js?3 33 bytes [built] [code generated] -17 modules ++ 17 modules webpack x.x.x compiled successfully in X ms" `; @@ -2657,27 +2657,27 @@ exclude1: hidden assets 28.9 KiB 2 assets sourceMap exclude1-main.js.map 12.5 KiB [emitted] [dev] (auxiliary name: main) hidden assets 25 KiB 2 assets - 1 related asset - 1 related asset + + 1 related asset + + 1 related asset asset exclude1-chunk_js.js 804 bytes [emitted] hidden assets 1.57 KiB 2 assets sourceMap exclude1-chunk_js.js.map 295 bytes [emitted] [dev] hidden assets 590 bytes 2 assets - 1 related asset - 1 related asset + + 1 related asset + + 1 related asset assets by path *.css 144 bytes asset exclude1-chunk_js.css 74 bytes [emitted] hidden assets 148 bytes 2 assets sourceMap exclude1-chunk_js.css.map 197 bytes [emitted] [dev] hidden assets 394 bytes 2 assets - 1 related asset - 1 related asset + + 1 related asset + + 1 related asset asset exclude1-main.css 70 bytes [emitted] (name: main) hidden assets 140 bytes 2 assets sourceMap exclude1-main.css.map 187 bytes [emitted] [dev] (auxiliary name: main) hidden assets 374 bytes 2 assets - 1 related asset - 1 related asset + + 1 related asset + + 1 related asset exclude2: assets by path *.js 15.2 KiB @@ -3085,23 +3085,27 @@ exports[`StatsTestCases should print correct stats for scope-hoisting-bailouts 1 "runtime modules 6.83 KiB 10 modules built modules 615 bytes [built] code generated modules 530 bytes [code generated] - modules by path ./*.js 377 bytes - ./index.js 150 bytes [built] [code generated] - Statement (ExpressionStatement) with side effects in source code at 7:0-25 - ModuleConcatenation bailout: Cannot concat with ./cjs.js: Module is not an ECMAScript module - ModuleConcatenation bailout: Cannot concat with ./eval.js: Module uses eval() - ModuleConcatenation bailout: Cannot concat with ./module-id.js: Module uses module.id - ModuleConcatenation bailout: Cannot concat with ./module-loaded.js: Module uses module.loaded - ./entry.js 32 bytes [built] [code generated] - ./cjs.js 59 bytes [built] [code generated] - CommonJS bailout: module.exports is used directly at 3:0-14 - Statement (ExpressionStatement) with side effects in source code at 1:0-26 - ModuleConcatenation bailout: Module is not an ECMAScript module - ./ref-from-cjs.js 45 bytes [built] [code generated] - ./eval.js 35 bytes [built] [code generated] - Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-34 - ModuleConcatenation bailout: Module uses eval() - 2 modules + ./index.js 150 bytes [built] [code generated] + Statement (ExpressionStatement) with side effects in source code at 7:0-25 + ModuleConcatenation bailout: Cannot concat with ./cjs.js: Module is not an ECMAScript module + ModuleConcatenation bailout: Cannot concat with ./eval.js: Module uses eval() + ModuleConcatenation bailout: Cannot concat with ./module-id.js: Module uses module.id + ModuleConcatenation bailout: Cannot concat with ./module-loaded.js: Module uses module.loaded + ./entry.js 32 bytes [built] [code generated] + ./cjs.js 59 bytes [built] [code generated] + CommonJS bailout: module.exports is used directly at 3:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-26 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./ref-from-cjs.js 45 bytes [built] [code generated] + ./eval.js 35 bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-34 + ModuleConcatenation bailout: Module uses eval() + ./module-id.js 26 bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-25 + ModuleConcatenation bailout: Module uses module.id + ./module-loaded.js 30 bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-29 + ModuleConcatenation bailout: Module uses module.loaded ./concatenated.js + 2 modules 111 bytes [built] [code generated] ModuleConcatenation bailout: Cannot concat with external \\"external\\": Module external \\"external\\" is not in the same chunk(s) (expected in chunk(s) unnamed chunk(s), module is in chunk(s) index) external \\"external\\" 42 bytes [built] [code generated] @@ -3136,15 +3140,18 @@ Entrypoint second 13.5 KiB = b-vendor.js 419 bytes b-second.js 13.1 KiB runtime modules 15.1 KiB 20 modules cacheable modules 975 bytes code generated modules 857 bytes [code generated] - modules by path ./*.js + 1 modules 459 bytes - ./second.js + 1 modules 227 bytes [built] [code generated] - ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) second, module is in chunk(s) vendor) - 2 modules - modules by path ./*.js 106 bytes - ./vendor.js 25 bytes [built] [code generated] - 2 modules ./first.js + 2 modules 292 bytes [built] [code generated] ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) first, module is in chunk(s) vendor) + ./second.js + 1 modules 227 bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) second, module is in chunk(s) vendor) + ./vendor.js 25 bytes [built] [code generated] + ./lazy_first.js + 1 modules 116 bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_shared.js + ./lazy_shared.js 56 bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_first.js, ./lazy_second.js + ./lazy_second.js + 1 modules 116 bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_shared.js + ./common_lazy_shared.js 25 bytes [built] [code generated] orphan modules 118 bytes [orphan] ./common2.js 25 bytes [orphan] [built] ./module_first.js 31 bytes [orphan] [built] @@ -3162,16 +3169,7 @@ cacheable modules 823 bytes modules by path ./components/src/ 501 bytes orphan modules 315 bytes [orphan] modules by path ./components/src/CompAB/*.js 164 bytes 2 modules - modules by path ./components/src/CompC/*.js 67 bytes - ./components/src/CompC/CompC.js 33 bytes [orphan] [built] - [module unused] - [inactive] harmony side effect evaluation ./CompC ./components/src/CompC/index.js 1:0-34 - [inactive] harmony export imported specifier ./CompC ./components/src/CompC/index.js 1:0-34 - [inactive] harmony export imported specifier ./CompC ./components/src/index.js 2:0-43 (skipped side-effect-free modules) - ./components/src/CompC/index.js 34 bytes [orphan] [built] - [module unused] - [inactive] harmony side effect evaluation ./CompC ./components/src/index.js 2:0-43 - [inactive] harmony export imported specifier ./CompC ./components/src/index.js 2:0-43 + modules by path ./components/src/CompC/*.js 67 bytes 2 modules ./components/src/index.js 84 bytes [orphan] [built] [module unused] [inactive] from origin ./main.js + 1 modules @@ -3200,20 +3198,21 @@ cacheable modules 823 bytes from origin ./main.js + 1 modules [inactive] harmony side effect evaluation ./utils ./main.js + 1 modules ./components/src/CompAB/CompB.js 1:0-30 harmony import specifier ./utils ./main.js + 1 modules ./components/src/CompAB/CompB.js 5:2-5 - ./main.js + 1 modules 221 bytes [built] [code generated] - [no exports used] - entry ./main.js main - | ./main.js 144 bytes [built] - | [no exports used] - | ./components/src/CompAB/CompB.js 77 bytes [built] - | [only some exports used: default] - | [inactive] from origin ./components/src/CompAB/index.js - | [inactive] harmony side effect evaluation ./CompB ./components/src/CompAB/index.js 2:0-43 - | [inactive] harmony export imported specifier ./CompB ./components/src/CompAB/index.js 2:0-43 - | [inactive] harmony export imported specifier ./CompAB ./components/src/index.js 1:0-40 (skipped side-effect-free modules) - | harmony import specifier ./components ./main.js 4:15-20 (skipped side-effect-free modules) - ./foo.js 101 bytes [built] [code generated] - import() ./foo ./main.js + 1 modules ./main.js 6:0-15 + modules by path ./*.js 322 bytes + ./main.js + 1 modules 221 bytes [built] [code generated] + [no exports used] + entry ./main.js main + | ./main.js 144 bytes [built] + | [no exports used] + | ./components/src/CompAB/CompB.js 77 bytes [built] + | [only some exports used: default] + | [inactive] from origin ./components/src/CompAB/index.js + | [inactive] harmony side effect evaluation ./CompB ./components/src/CompAB/index.js 2:0-43 + | [inactive] harmony export imported specifier ./CompB ./components/src/CompAB/index.js 2:0-43 + | [inactive] harmony export imported specifier ./CompAB ./components/src/index.js 1:0-40 (skipped side-effect-free modules) + | harmony import specifier ./components ./main.js 4:15-20 (skipped side-effect-free modules) + ./foo.js 101 bytes [built] [code generated] + import() ./foo ./main.js + 1 modules ./main.js 6:0-15 webpack x.x.x compiled successfully in X ms" `; @@ -4127,12 +4126,12 @@ switched: ./subfolder/big.js?1 267 bytes [built] [code generated] ./subfolder/big.js?2 267 bytes [built] [code generated] ./subfolder/small.js?1 66 bytes [built] [code generated] - 8 modules + + 8 modules modules by path ./*.js 594 bytes ./small.js?1 66 bytes [built] [code generated] ./small.js?2 66 bytes [built] [code generated] ./small.js?3 66 bytes [built] [code generated] - 6 modules + + 6 modules chunk (runtime: main) switched-main-12217e1d.js (main-12217e1d) 1.57 KiB (javascript) 3.02 KiB (runtime) ={1}= ={59}= ={318}= ={410}= ={520}= ={581}= ={869}= ={997}= [entry] [rendered] > ./ main runtime modules 3.02 KiB 5 modules @@ -4146,11 +4145,11 @@ switched: > ./ main modules by path ./inner-module/*.js 594 bytes ./inner-module/small.js?1 66 bytes [built] [code generated] - 8 modules + + 8 modules modules by path ./in-some-directory/*.js 531 bytes ./in-some-directory/big.js?1 267 bytes [built] [code generated] ./in-some-directory/small.js?1 66 bytes [built] [code generated] - 3 modules + + 3 modules modules by path ./*.js 534 bytes ./big.js?1 267 bytes [built] [code generated] ./big.js?2 267 bytes [built] [code generated]