| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 04:08:38 +08:00
										 |  |  | const util = require("util"); | 
					
						
							| 
									
										
										
										
											2020-08-07 23:05:48 +08:00
										 |  |  | const ModuleDependency = require("../dependencies/ModuleDependency"); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const formatLocation = require("../formatLocation"); | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | const { LogType } = require("../logging/Logger"); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const AggressiveSplittingPlugin = require("../optimize/AggressiveSplittingPlugin"); | 
					
						
							|  |  |  | const ConcatenatedModule = require("../optimize/ConcatenatedModule"); | 
					
						
							|  |  |  | const SizeLimitsPlugin = require("../performance/SizeLimitsPlugin"); | 
					
						
							| 
									
										
										
										
											2021-02-04 21:10:27 +08:00
										 |  |  | const { countIterable } = require("../util/IterableHelpers"); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const { | 
					
						
							| 
									
										
										
										
											2018-12-20 15:51:54 +08:00
										 |  |  | 	compareLocations, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	compareChunksById, | 
					
						
							|  |  |  | 	compareNumbers, | 
					
						
							|  |  |  | 	compareIds, | 
					
						
							|  |  |  | 	concatComparators, | 
					
						
							|  |  |  | 	compareSelect, | 
					
						
							| 
									
										
										
										
											2019-10-16 22:38:04 +08:00
										 |  |  | 	compareModulesByIdentifier | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | } = require("../util/comparators"); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | const { makePathsRelative, parseResource } = require("../util/identifier"); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("webpack-sources").Source} Source */ | 
					
						
							|  |  |  | /** @typedef {import("../Chunk")} Chunk */ | 
					
						
							|  |  |  | /** @typedef {import("../ChunkGroup")} ChunkGroup */ | 
					
						
							|  |  |  | /** @typedef {import("../ChunkGroup").OriginRecord} OriginRecord */ | 
					
						
							|  |  |  | /** @typedef {import("../Compilation")} Compilation */ | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | /** @typedef {import("../Compilation").Asset} Asset */ | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {import("../Compilation").AssetInfo} AssetInfo */ | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							|  |  |  | /** @typedef {import("../Dependency")} Dependency */ | 
					
						
							|  |  |  | /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */ | 
					
						
							|  |  |  | /** @typedef {import("../Module")} Module */ | 
					
						
							|  |  |  | /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */ | 
					
						
							|  |  |  | /** @typedef {import("../ModuleProfile")} ModuleProfile */ | 
					
						
							|  |  |  | /** @typedef {import("../RequestShortener")} RequestShortener */ | 
					
						
							|  |  |  | /** @typedef {import("../WebpackError")} WebpackError */ | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | /** @template T @typedef {import("../util/comparators").Comparator<T>} Comparator<T> */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | /** @typedef {import("../util/smartGrouping").GroupConfig<any, object>} GroupConfig */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | /** @typedef {import("./StatsFactory")} StatsFactory */ | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @typedef {import("./StatsFactory").StatsFactoryContext} StatsFactoryContext */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsCompilation & Record<string, any>} StatsCompilation */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsCompilation | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {any=} env | 
					
						
							|  |  |  |  * @property {string=} name | 
					
						
							|  |  |  |  * @property {string=} hash | 
					
						
							|  |  |  |  * @property {string=} version | 
					
						
							|  |  |  |  * @property {number=} time | 
					
						
							|  |  |  |  * @property {number=} builtAt | 
					
						
							|  |  |  |  * @property {boolean=} needAdditionalPass | 
					
						
							|  |  |  |  * @property {string=} publicPath | 
					
						
							|  |  |  |  * @property {string=} outputPath | 
					
						
							|  |  |  |  * @property {Record<string, string[]>=} assetsByChunkName | 
					
						
							|  |  |  |  * @property {StatsAsset[]=} assets | 
					
						
							|  |  |  |  * @property {number=} filteredAssets | 
					
						
							|  |  |  |  * @property {StatsChunk[]=} chunks | 
					
						
							|  |  |  |  * @property {StatsModule[]=} modules | 
					
						
							|  |  |  |  * @property {number=} filteredModules | 
					
						
							|  |  |  |  * @property {Record<string, StatsChunkGroup>=} entrypoints | 
					
						
							|  |  |  |  * @property {Record<string, StatsChunkGroup>=} namedChunkGroups | 
					
						
							|  |  |  |  * @property {StatsError[]=} errors | 
					
						
							|  |  |  |  * @property {number=} errorsCount | 
					
						
							|  |  |  |  * @property {StatsError[]=} warnings | 
					
						
							|  |  |  |  * @property {number=} warningsCount | 
					
						
							|  |  |  |  * @property {StatsCompilation[]=} children | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @property {Record<string, StatsLogging>=} logging | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsLogging & Record<string, any>} StatsLogging */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsLogging | 
					
						
							|  |  |  |  * @property {StatsLoggingEntry[]} entries | 
					
						
							|  |  |  |  * @property {number} filteredEntries | 
					
						
							|  |  |  |  * @property {boolean} debug | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsLoggingEntry & Record<string, any>} StatsLoggingEntry */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsLoggingEntry | 
					
						
							|  |  |  |  * @property {string} type | 
					
						
							|  |  |  |  * @property {string} message | 
					
						
							|  |  |  |  * @property {string[]=} trace | 
					
						
							|  |  |  |  * @property {StatsLoggingEntry[]=} children | 
					
						
							|  |  |  |  * @property {any[]=} args | 
					
						
							|  |  |  |  * @property {number=} time | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {KnownStatsAsset & Record<string, any>} StatsAsset */ | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} KnownStatsAsset | 
					
						
							|  |  |  |  * @property {string} type | 
					
						
							|  |  |  |  * @property {string} name | 
					
						
							|  |  |  |  * @property {AssetInfo} info | 
					
						
							|  |  |  |  * @property {number} size | 
					
						
							|  |  |  |  * @property {boolean} emitted | 
					
						
							|  |  |  |  * @property {boolean} comparedForEmit | 
					
						
							|  |  |  |  * @property {boolean} cached | 
					
						
							|  |  |  |  * @property {StatsAsset[]=} related | 
					
						
							|  |  |  |  * @property {(string|number)[]=} chunkNames | 
					
						
							|  |  |  |  * @property {(string|number)[]=} chunkIdHints | 
					
						
							|  |  |  |  * @property {(string|number)[]=} chunks | 
					
						
							|  |  |  |  * @property {(string|number)[]=} auxiliaryChunkNames | 
					
						
							|  |  |  |  * @property {(string|number)[]=} auxiliaryChunks | 
					
						
							|  |  |  |  * @property {(string|number)[]=} auxiliaryChunkIdHints | 
					
						
							|  |  |  |  * @property {number=} filteredRelated | 
					
						
							|  |  |  |  * @property {boolean=} isOverSizeLimit | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {KnownStatsChunkGroup & Record<string, any>} StatsChunkGroup */ | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} KnownStatsChunkGroup | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} name | 
					
						
							|  |  |  |  * @property {(string|number)[]=} chunks | 
					
						
							|  |  |  |  * @property {({ name: string, size?: number })[]=} assets | 
					
						
							|  |  |  |  * @property {number=} filteredAssets | 
					
						
							|  |  |  |  * @property {number=} assetsSize | 
					
						
							|  |  |  |  * @property {({ name: string, size?: number })[]=} auxiliaryAssets | 
					
						
							|  |  |  |  * @property {number=} filteredAuxiliaryAssets | 
					
						
							|  |  |  |  * @property {number=} auxiliaryAssetsSize | 
					
						
							|  |  |  |  * @property {{ [x: string]: StatsChunkGroup[] }=} children | 
					
						
							|  |  |  |  * @property {{ [x: string]: string[] }=} childAssets | 
					
						
							|  |  |  |  * @property {boolean=} isOverSizeLimit | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsModule & Record<string, any>} StatsModule */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsModule | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} type | 
					
						
							|  |  |  |  * @property {string=} moduleType | 
					
						
							|  |  |  |  * @property {string=} layer | 
					
						
							|  |  |  |  * @property {string=} identifier | 
					
						
							|  |  |  |  * @property {string=} name | 
					
						
							|  |  |  |  * @property {string=} nameForCondition | 
					
						
							|  |  |  |  * @property {number=} index | 
					
						
							|  |  |  |  * @property {number=} preOrderIndex | 
					
						
							|  |  |  |  * @property {number=} index2 | 
					
						
							|  |  |  |  * @property {number=} postOrderIndex | 
					
						
							|  |  |  |  * @property {number=} size | 
					
						
							|  |  |  |  * @property {{[x: string]: number}=} sizes | 
					
						
							|  |  |  |  * @property {boolean=} cacheable | 
					
						
							|  |  |  |  * @property {boolean=} built | 
					
						
							|  |  |  |  * @property {boolean=} codeGenerated | 
					
						
							|  |  |  |  * @property {boolean=} cached | 
					
						
							|  |  |  |  * @property {boolean=} optional | 
					
						
							|  |  |  |  * @property {boolean=} orphan | 
					
						
							|  |  |  |  * @property {string|number=} id | 
					
						
							|  |  |  |  * @property {string|number=} issuerId | 
					
						
							|  |  |  |  * @property {(string|number)[]=} chunks | 
					
						
							|  |  |  |  * @property {(string|number)[]=} assets | 
					
						
							|  |  |  |  * @property {boolean=} dependent | 
					
						
							|  |  |  |  * @property {string=} issuer | 
					
						
							|  |  |  |  * @property {string=} issuerName | 
					
						
							|  |  |  |  * @property {StatsModuleIssuer[]=} issuerPath | 
					
						
							|  |  |  |  * @property {boolean=} failed | 
					
						
							|  |  |  |  * @property {number=} errors | 
					
						
							|  |  |  |  * @property {number=} warnings | 
					
						
							|  |  |  |  * @property {StatsProfile=} profile | 
					
						
							|  |  |  |  * @property {StatsModuleReason[]=} reasons | 
					
						
							|  |  |  |  * @property {(boolean | string[])=} usedExports | 
					
						
							|  |  |  |  * @property {string[]=} providedExports | 
					
						
							|  |  |  |  * @property {string[]=} optimizationBailout | 
					
						
							|  |  |  |  * @property {number=} depth | 
					
						
							|  |  |  |  * @property {StatsModule[]=} modules | 
					
						
							|  |  |  |  * @property {number=} filteredModules | 
					
						
							|  |  |  |  * @property {ReturnType<Source["source"]>=} source | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsProfile & Record<string, any>} StatsProfile */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsProfile | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {number} total | 
					
						
							|  |  |  |  * @property {number} resolving | 
					
						
							|  |  |  |  * @property {number} restoring | 
					
						
							|  |  |  |  * @property {number} building | 
					
						
							|  |  |  |  * @property {number} integration | 
					
						
							|  |  |  |  * @property {number} storing | 
					
						
							|  |  |  |  * @property {number} additionalResolving | 
					
						
							|  |  |  |  * @property {number} additionalIntegration | 
					
						
							|  |  |  |  * @property {number} factory | 
					
						
							|  |  |  |  * @property {number} dependencies | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsModuleIssuer & Record<string, any>} StatsModuleIssuer */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsModuleIssuer | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} identifier | 
					
						
							|  |  |  |  * @property {string=} name | 
					
						
							|  |  |  |  * @property {(string|number)=} id | 
					
						
							|  |  |  |  * @property {StatsProfile=} profile | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsModuleReason & Record<string, any>} StatsModuleReason */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsModuleReason | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} moduleIdentifier | 
					
						
							|  |  |  |  * @property {string=} module | 
					
						
							|  |  |  |  * @property {string=} moduleName | 
					
						
							|  |  |  |  * @property {string=} resolvedModuleIdentifier | 
					
						
							|  |  |  |  * @property {string=} resolvedModule | 
					
						
							|  |  |  |  * @property {string=} type | 
					
						
							|  |  |  |  * @property {boolean} active | 
					
						
							|  |  |  |  * @property {string=} explanation | 
					
						
							|  |  |  |  * @property {string=} userRequest | 
					
						
							|  |  |  |  * @property {string=} loc | 
					
						
							|  |  |  |  * @property {(string|number)=} moduleId | 
					
						
							|  |  |  |  * @property {(string|number)=} resolvedModuleId | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsChunk & Record<string, any>} StatsChunk */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsChunk | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {boolean} rendered | 
					
						
							|  |  |  |  * @property {boolean} initial | 
					
						
							|  |  |  |  * @property {boolean} entry | 
					
						
							|  |  |  |  * @property {boolean} recorded | 
					
						
							|  |  |  |  * @property {string=} reason | 
					
						
							|  |  |  |  * @property {number} size | 
					
						
							|  |  |  |  * @property {Record<string, number>=} sizes | 
					
						
							|  |  |  |  * @property {string[]=} names | 
					
						
							|  |  |  |  * @property {string[]=} idHints | 
					
						
							|  |  |  |  * @property {string[]=} runtime | 
					
						
							|  |  |  |  * @property {string[]=} files | 
					
						
							|  |  |  |  * @property {string[]=} auxiliaryFiles | 
					
						
							|  |  |  |  * @property {string} hash | 
					
						
							|  |  |  |  * @property {Record<string, (string|number)[]>=} childrenByOrder | 
					
						
							|  |  |  |  * @property {(string|number)=} id | 
					
						
							|  |  |  |  * @property {(string|number)[]=} siblings | 
					
						
							|  |  |  |  * @property {(string|number)[]=} parents | 
					
						
							|  |  |  |  * @property {(string|number)[]=} children | 
					
						
							|  |  |  |  * @property {StatsModule[]=} modules | 
					
						
							|  |  |  |  * @property {number=} filteredModules | 
					
						
							|  |  |  |  * @property {StatsChunkOrigin[]=} origins | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsChunkOrigin & Record<string, any>} StatsChunkOrigin */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsChunkOrigin | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} module | 
					
						
							|  |  |  |  * @property {string=} moduleIdentifier | 
					
						
							|  |  |  |  * @property {string=} moduleName | 
					
						
							|  |  |  |  * @property {string=} loc | 
					
						
							|  |  |  |  * @property {string=} request | 
					
						
							|  |  |  |  * @property {(string|number)=} moduleId | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsModuleTraceItem & Record<string, any>} StatsModuleTraceItem */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsModuleTraceItem | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} originIdentifier | 
					
						
							|  |  |  |  * @property {string=} originName | 
					
						
							|  |  |  |  * @property {string=} moduleIdentifier | 
					
						
							|  |  |  |  * @property {string=} moduleName | 
					
						
							|  |  |  |  * @property {StatsModuleTraceDependency[]=} dependencies | 
					
						
							|  |  |  |  * @property {(string|number)=} originId | 
					
						
							|  |  |  |  * @property {(string|number)=} moduleId | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsModuleTraceDependency & Record<string, any>} StatsModuleTraceDependency */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsModuleTraceDependency | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string=} loc | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {KnownStatsError & Record<string, any>} StatsError */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @typedef {Object} KnownStatsError | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {string} message | 
					
						
							|  |  |  |  * @property {string=} chunkName | 
					
						
							|  |  |  |  * @property {boolean=} chunkEntry | 
					
						
							|  |  |  |  * @property {boolean=} chunkInitial | 
					
						
							|  |  |  |  * @property {string=} file | 
					
						
							|  |  |  |  * @property {string=} moduleIdentifier | 
					
						
							|  |  |  |  * @property {string=} moduleName | 
					
						
							|  |  |  |  * @property {string=} loc | 
					
						
							|  |  |  |  * @property {string|number=} chunkId | 
					
						
							|  |  |  |  * @property {string|number=} moduleId | 
					
						
							|  |  |  |  * @property {any=} moduleTrace | 
					
						
							|  |  |  |  * @property {any=} details | 
					
						
							|  |  |  |  * @property {any=} stack | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | /** @typedef {Asset & { type: string, related: PreprocessedAsset[] }} PreprocessedAsset */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template O | 
					
						
							|  |  |  |  * @typedef {Record<string, (object: O, data: T, context: StatsFactoryContext, options: NormalizedStatsOptions, factory: StatsFactory) => void>} ExtractorsByOption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} SimpleExtractors | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {ExtractorsByOption<Compilation, StatsCompilation>} compilation | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  |  * @property {ExtractorsByOption<PreprocessedAsset, StatsAsset>} asset | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<PreprocessedAsset, StatsAsset>} asset$visible | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  |  * @property {ExtractorsByOption<{ name: string, chunkGroup: ChunkGroup }, StatsChunkGroup>} chunkGroup | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<Module, StatsModule>} module | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<Module, StatsModule>} module$visible | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<Module, StatsModuleIssuer>} moduleIssuer | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<ModuleProfile, StatsProfile>} profile | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<ModuleGraphConnection, StatsModuleReason>} moduleReason | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<Chunk, StatsChunk>} chunk | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<OriginRecord, StatsChunkOrigin>} chunkOrigin | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<WebpackError, StatsError>} error | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<WebpackError, StatsError>} warning | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<{ origin: Module, module: Module }, StatsModuleTraceItem>} moduleTraceItem | 
					
						
							|  |  |  |  * @property {ExtractorsByOption<Dependency, StatsModuleTraceDependency>} moduleTraceDependency | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template I | 
					
						
							|  |  |  |  * @param {Iterable<T>} items items to select from | 
					
						
							|  |  |  |  * @param {function(T): Iterable<I>} selector selector function to select values from item | 
					
						
							|  |  |  |  * @returns {I[]} array of values | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const uniqueArray = (items, selector) => { | 
					
						
							| 
									
										
										
										
											2020-01-21 05:36:47 +08:00
										 |  |  | 	/** @type {Set<I>} */ | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 	const set = new Set(); | 
					
						
							|  |  |  | 	for (const item of items) { | 
					
						
							|  |  |  | 		for (const i of selector(item)) { | 
					
						
							|  |  |  | 			set.add(i); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return Array.from(set); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template I | 
					
						
							|  |  |  |  * @param {Iterable<T>} items items to select from | 
					
						
							|  |  |  |  * @param {function(T): Iterable<I>} selector selector function to select values from item | 
					
						
							|  |  |  |  * @param {Comparator<I>} comparator comparator function | 
					
						
							|  |  |  |  * @returns {I[]} array of values | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const uniqueOrderedArray = (items, selector, comparator) => { | 
					
						
							|  |  |  | 	return uniqueArray(items, selector).sort(comparator); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 05:36:47 +08:00
										 |  |  | /** @template T @template R @typedef {{ [P in keyof T]: R }} MappedValues<T, R> */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							|  |  |  |  * @param {T} obj object to be mapped | 
					
						
							|  |  |  |  * @param {function(T[keyof T], keyof T): R} fn mapping function | 
					
						
							|  |  |  |  * @returns {MappedValues<T, R>} mapped object | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const mapObject = (obj, fn) => { | 
					
						
							|  |  |  | 	const newObj = Object.create(null); | 
					
						
							|  |  |  | 	for (const key of Object.keys(obj)) { | 
					
						
							|  |  |  | 		newObj[key] = fn(obj[key], /** @type {keyof T} */ (key)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return newObj; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Compilation} compilation the compilation | 
					
						
							|  |  |  |  * @param {function(Compilation, string): any[]} getItems get items | 
					
						
							|  |  |  |  * @returns {number} total number | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const countWithChildren = (compilation, getItems) => { | 
					
						
							|  |  |  | 	let count = getItems(compilation, "").length; | 
					
						
							|  |  |  | 	for (const child of compilation.children) { | 
					
						
							|  |  |  | 		count += countWithChildren(child, (c, type) => | 
					
						
							|  |  |  | 			getItems(c, `.children[].compilation${type}`) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | /** @type {ExtractorsByOption<WebpackError | string, StatsError>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const EXTRACT_ERROR = { | 
					
						
							| 
									
										
										
										
											2019-10-15 04:34:40 +08:00
										 |  |  | 	_: (object, error, context, { requestShortener }) => { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		// TODO webpack 6 disallow strings in the errors/warnings list
 | 
					
						
							|  |  |  | 		if (typeof error === "string") { | 
					
						
							|  |  |  | 			object.message = error; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			if (error.chunk) { | 
					
						
							|  |  |  | 				object.chunkName = error.chunk.name; | 
					
						
							|  |  |  | 				object.chunkEntry = error.chunk.hasRuntime(); | 
					
						
							|  |  |  | 				object.chunkInitial = error.chunk.canBeInitial(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (error.file) { | 
					
						
							|  |  |  | 				object.file = error.file; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (error.module) { | 
					
						
							|  |  |  | 				object.moduleIdentifier = error.module.identifier(); | 
					
						
							|  |  |  | 				object.moduleName = error.module.readableIdentifier(requestShortener); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (error.loc) { | 
					
						
							|  |  |  | 				object.loc = formatLocation(error.loc); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			object.message = error.message; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 	ids: (object, error, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 		if (typeof error !== "string") { | 
					
						
							|  |  |  | 			if (error.chunk) { | 
					
						
							|  |  |  | 				object.chunkId = error.chunk.id; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (error.module) { | 
					
						
							|  |  |  | 				object.moduleId = chunkGraph.getModuleId(error.module); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	moduleTrace: (object, error, context, options, factory) => { | 
					
						
							|  |  |  | 		if (typeof error !== "string" && error.module) { | 
					
						
							|  |  |  | 			const { | 
					
						
							|  |  |  | 				type, | 
					
						
							|  |  |  | 				compilation: { moduleGraph } | 
					
						
							|  |  |  | 			} = context; | 
					
						
							| 
									
										
										
										
											2020-01-21 05:36:47 +08:00
										 |  |  | 			/** @type {Set<Module>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			const visitedModules = new Set(); | 
					
						
							|  |  |  | 			const moduleTrace = []; | 
					
						
							|  |  |  | 			let current = error.module; | 
					
						
							|  |  |  | 			while (current) { | 
					
						
							|  |  |  | 				if (visitedModules.has(current)) break; // circular (technically impossible, but how knows)
 | 
					
						
							|  |  |  | 				visitedModules.add(current); | 
					
						
							|  |  |  | 				const origin = moduleGraph.getIssuer(current); | 
					
						
							|  |  |  | 				if (!origin) break; | 
					
						
							|  |  |  | 				moduleTrace.push({ origin, module: current }); | 
					
						
							|  |  |  | 				current = origin; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			object.moduleTrace = factory.create( | 
					
						
							|  |  |  | 				`${type}.moduleTrace`, | 
					
						
							|  |  |  | 				moduleTrace, | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2021-02-05 22:55:31 +08:00
										 |  |  | 	errorDetails: ( | 
					
						
							|  |  |  | 		object, | 
					
						
							|  |  |  | 		error, | 
					
						
							|  |  |  | 		{ type, compilation, cachedGetErrors, cachedGetWarnings }, | 
					
						
							|  |  |  | 		{ errorDetails } | 
					
						
							|  |  |  | 	) => { | 
					
						
							|  |  |  | 		if ( | 
					
						
							|  |  |  | 			typeof error !== "string" && | 
					
						
							|  |  |  | 			(errorDetails === true || | 
					
						
							|  |  |  | 				(type.endsWith(".error") && cachedGetErrors(compilation).length < 3)) | 
					
						
							|  |  |  | 		) { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.details = error.details; | 
					
						
							| 
									
										
										
										
											2019-10-15 04:34:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	errorStack: (object, error) => { | 
					
						
							|  |  |  | 		if (typeof error !== "string") { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.stack = error.stack; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {SimpleExtractors} */ | 
					
						
							|  |  |  | const SIMPLE_EXTRACTORS = { | 
					
						
							|  |  |  | 	compilation: { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		_: (object, compilation, context) => { | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 			if (!context.makePathsRelative) { | 
					
						
							|  |  |  | 				context.makePathsRelative = makePathsRelative.bindContextCache( | 
					
						
							|  |  |  | 					compilation.compiler.context, | 
					
						
							|  |  |  | 					compilation.compiler.root | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (!context.cachedGetErrors) { | 
					
						
							|  |  |  | 				const map = new WeakMap(); | 
					
						
							|  |  |  | 				context.cachedGetErrors = compilation => { | 
					
						
							|  |  |  | 					return ( | 
					
						
							|  |  |  | 						map.get(compilation) || | 
					
						
							|  |  |  | 						(errors => (map.set(compilation, errors), errors))( | 
					
						
							|  |  |  | 							compilation.getErrors() | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (!context.cachedGetWarnings) { | 
					
						
							|  |  |  | 				const map = new WeakMap(); | 
					
						
							|  |  |  | 				context.cachedGetWarnings = compilation => { | 
					
						
							|  |  |  | 					return ( | 
					
						
							|  |  |  | 						map.get(compilation) || | 
					
						
							|  |  |  | 						(warnings => (map.set(compilation, warnings), warnings))( | 
					
						
							|  |  |  | 							compilation.getWarnings() | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-26 03:58:22 +08:00
										 |  |  | 			if (compilation.name) { | 
					
						
							|  |  |  | 				object.name = compilation.name; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			if (compilation.needAdditionalPass) { | 
					
						
							|  |  |  | 				object.needAdditionalPass = true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		hash: (object, compilation) => { | 
					
						
							|  |  |  | 			object.hash = compilation.hash; | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		version: object => { | 
					
						
							|  |  |  | 			object.version = require("../../package.json").version; | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		env: (object, compilation, context, { _env }) => { | 
					
						
							|  |  |  | 			object.env = _env; | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-09-04 04:01:25 +08:00
										 |  |  | 		timings: (object, compilation) => { | 
					
						
							|  |  |  | 			object.time = compilation.endTime - compilation.startTime; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-09-04 04:01:25 +08:00
										 |  |  | 		builtAt: (object, compilation) => { | 
					
						
							|  |  |  | 			object.builtAt = compilation.endTime; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		publicPath: (object, compilation) => { | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 			object.publicPath = compilation.getPath( | 
					
						
							|  |  |  | 				compilation.outputOptions.publicPath | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		outputPath: (object, compilation) => { | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 			object.outputPath = compilation.outputOptions.path; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		assets: (object, compilation, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 			/** @type {Map<string, Chunk[]>} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 04:42:54 +08:00
										 |  |  | 			const compilationFileToChunks = new Map(); | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 			/** @type {Map<string, Chunk[]>} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 04:42:54 +08:00
										 |  |  | 			const compilationAuxiliaryFileToChunks = new Map(); | 
					
						
							|  |  |  | 			for (const chunk of compilation.chunks) { | 
					
						
							|  |  |  | 				for (const file of chunk.files) { | 
					
						
							|  |  |  | 					let array = compilationFileToChunks.get(file); | 
					
						
							|  |  |  | 					if (array === undefined) { | 
					
						
							|  |  |  | 						array = []; | 
					
						
							|  |  |  | 						compilationFileToChunks.set(file, array); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					array.push(chunk); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				for (const file of chunk.auxiliaryFiles) { | 
					
						
							|  |  |  | 					let array = compilationAuxiliaryFileToChunks.get(file); | 
					
						
							|  |  |  | 					if (array === undefined) { | 
					
						
							|  |  |  | 						array = []; | 
					
						
							|  |  |  | 						compilationAuxiliaryFileToChunks.set(file, array); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					array.push(chunk); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {Map<string, PreprocessedAsset>} */ | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 			const assetMap = new Map(); | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {Set<PreprocessedAsset>} */ | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 			const assets = new Set(); | 
					
						
							|  |  |  | 			for (const asset of compilation.getAssets()) { | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 				/** @type {PreprocessedAsset} */ | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 				const item = { | 
					
						
							|  |  |  | 					...asset, | 
					
						
							|  |  |  | 					type: "asset", | 
					
						
							|  |  |  | 					related: undefined | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				assets.add(item); | 
					
						
							|  |  |  | 				assetMap.set(asset.name, item); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			for (const item of assetMap.values()) { | 
					
						
							|  |  |  | 				const related = item.info.related; | 
					
						
							|  |  |  | 				if (!related) continue; | 
					
						
							|  |  |  | 				for (const type of Object.keys(related)) { | 
					
						
							|  |  |  | 					const relatedEntry = related[type]; | 
					
						
							|  |  |  | 					const deps = Array.isArray(relatedEntry) | 
					
						
							|  |  |  | 						? relatedEntry | 
					
						
							|  |  |  | 						: [relatedEntry]; | 
					
						
							|  |  |  | 					for (const dep of deps) { | 
					
						
							|  |  |  | 						const depItem = assetMap.get(dep); | 
					
						
							|  |  |  | 						if (!depItem) continue; | 
					
						
							|  |  |  | 						assets.delete(depItem); | 
					
						
							|  |  |  | 						depItem.type = type; | 
					
						
							|  |  |  | 						item.related = item.related || []; | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 						item.related.push(depItem); | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.assetsByChunkName = {}; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			for (const [file, chunks] of compilationFileToChunks) { | 
					
						
							|  |  |  | 				for (const chunk of chunks) { | 
					
						
							|  |  |  | 					const name = chunk.name; | 
					
						
							|  |  |  | 					if (!name) continue; | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 					if ( | 
					
						
							|  |  |  | 						!Object.prototype.hasOwnProperty.call( | 
					
						
							|  |  |  | 							object.assetsByChunkName, | 
					
						
							|  |  |  | 							name | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						object.assetsByChunkName[name] = []; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					object.assetsByChunkName[name].push(file); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			const groupedAssets = factory.create( | 
					
						
							|  |  |  | 				`${type}.assets`, | 
					
						
							|  |  |  | 				Array.from(assets), | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					...context, | 
					
						
							|  |  |  | 					compilationFileToChunks, | 
					
						
							|  |  |  | 					compilationAuxiliaryFileToChunks | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			const limited = spaceLimited(groupedAssets, options.assetsSpace); | 
					
						
							|  |  |  | 			object.assets = limited.children; | 
					
						
							|  |  |  | 			object.filteredAssets = limited.filteredChildren; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		chunks: (object, compilation, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			object.chunks = factory.create( | 
					
						
							|  |  |  | 				`${type}.chunks`, | 
					
						
							|  |  |  | 				Array.from(compilation.chunks), | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		modules: (object, compilation, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			const array = Array.from(compilation.modules); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			const groupedModules = factory.create(`${type}.modules`, array, context); | 
					
						
							|  |  |  | 			const limited = spaceLimited(groupedModules, options.modulesSpace); | 
					
						
							|  |  |  | 			object.modules = limited.children; | 
					
						
							|  |  |  | 			object.filteredModules = limited.filteredChildren; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 		entrypoints: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			compilation, | 
					
						
							|  |  |  | 			context, | 
					
						
							|  |  |  | 			{ entrypoints, chunkGroups, chunkGroupAuxiliary, chunkGroupChildren }, | 
					
						
							|  |  |  | 			factory | 
					
						
							|  |  |  | 		) => { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			const array = Array.from(compilation.entrypoints, ([key, value]) => ({ | 
					
						
							|  |  |  | 				name: key, | 
					
						
							|  |  |  | 				chunkGroup: value | 
					
						
							|  |  |  | 			})); | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 			if (entrypoints === "auto" && !chunkGroups) { | 
					
						
							|  |  |  | 				if (array.length > 5) return; | 
					
						
							|  |  |  | 				if ( | 
					
						
							|  |  |  | 					!chunkGroupChildren && | 
					
						
							|  |  |  | 					array.every(({ chunkGroup }) => { | 
					
						
							|  |  |  | 						if (chunkGroup.chunks.length !== 1) return false; | 
					
						
							|  |  |  | 						const chunk = chunkGroup.chunks[0]; | 
					
						
							|  |  |  | 						return ( | 
					
						
							|  |  |  | 							chunk.files.size === 1 && | 
					
						
							|  |  |  | 							(!chunkGroupAuxiliary || chunk.auxiliaryFiles.size === 0) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				) { | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.entrypoints = factory.create( | 
					
						
							|  |  |  | 				`${type}.entrypoints`, | 
					
						
							|  |  |  | 				array, | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		chunkGroups: (object, compilation, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			const array = Array.from( | 
					
						
							|  |  |  | 				compilation.namedChunkGroups, | 
					
						
							|  |  |  | 				([key, value]) => ({ | 
					
						
							|  |  |  | 					name: key, | 
					
						
							|  |  |  | 					chunkGroup: value | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-12-28 19:57:38 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.namedChunkGroups = factory.create( | 
					
						
							|  |  |  | 				`${type}.namedChunkGroups`, | 
					
						
							|  |  |  | 				array, | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		errors: (object, compilation, context, options, factory) => { | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 			const { type, cachedGetErrors } = context; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.errors = factory.create( | 
					
						
							|  |  |  | 				`${type}.errors`, | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 				cachedGetErrors(compilation), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 		errorsCount: (object, compilation, { cachedGetErrors }) => { | 
					
						
							|  |  |  | 			object.errorsCount = countWithChildren(compilation, c => | 
					
						
							|  |  |  | 				cachedGetErrors(c) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-09-04 04:09:43 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		warnings: (object, compilation, context, options, factory) => { | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 			const { type, cachedGetWarnings } = context; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.warnings = factory.create( | 
					
						
							|  |  |  | 				`${type}.warnings`, | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 				cachedGetWarnings(compilation), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-09-21 03:24:15 +08:00
										 |  |  | 		warningsCount: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			compilation, | 
					
						
							|  |  |  | 			context, | 
					
						
							|  |  |  | 			{ warningsFilter }, | 
					
						
							|  |  |  | 			factory | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			const { type, cachedGetWarnings } = context; | 
					
						
							|  |  |  | 			object.warningsCount = countWithChildren(compilation, (c, childType) => { | 
					
						
							|  |  |  | 				if (!warningsFilter && warningsFilter.length === 0) | 
					
						
							|  |  |  | 					return cachedGetWarnings(c); | 
					
						
							|  |  |  | 				return factory | 
					
						
							|  |  |  | 					.create(`${type}${childType}.warnings`, cachedGetWarnings(c), context) | 
					
						
							|  |  |  | 					.filter(warning => { | 
					
						
							|  |  |  | 						const warningString = Object.keys(warning) | 
					
						
							|  |  |  | 							.map(key => `${warning[key]}`) | 
					
						
							|  |  |  | 							.join("\n"); | 
					
						
							|  |  |  | 						return !warningsFilter.some(filter => | 
					
						
							|  |  |  | 							filter(warning, warningString) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2020-09-04 04:09:43 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2021-02-05 22:55:31 +08:00
										 |  |  | 		errorDetails: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			compilation, | 
					
						
							|  |  |  | 			{ cachedGetErrors, cachedGetWarnings }, | 
					
						
							|  |  |  | 			{ errorDetails, errors, warnings } | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			if (errorDetails === "auto") { | 
					
						
							|  |  |  | 				if (warnings) { | 
					
						
							|  |  |  | 					const warnings = cachedGetWarnings(compilation); | 
					
						
							|  |  |  | 					object.filteredWarningDetailsCount = warnings | 
					
						
							|  |  |  | 						.map(e => typeof e !== "string" && e.details) | 
					
						
							|  |  |  | 						.filter(Boolean).length; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if (errors) { | 
					
						
							|  |  |  | 					const errors = cachedGetErrors(compilation); | 
					
						
							|  |  |  | 					if (errors.length >= 3) { | 
					
						
							|  |  |  | 						object.filteredErrorDetailsCount = errors | 
					
						
							|  |  |  | 							.map(e => typeof e !== "string" && e.details) | 
					
						
							|  |  |  | 							.filter(Boolean).length; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		logging: (object, compilation, _context, options, factory) => { | 
					
						
							|  |  |  | 			const util = require("util"); | 
					
						
							|  |  |  | 			const { loggingDebug, loggingTrace, context } = options; | 
					
						
							|  |  |  | 			object.logging = {}; | 
					
						
							|  |  |  | 			let acceptedTypes; | 
					
						
							|  |  |  | 			let collapsedGroups = false; | 
					
						
							|  |  |  | 			switch (options.logging) { | 
					
						
							|  |  |  | 				case "none": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "error": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([LogType.error]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "warn": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([LogType.error, LogType.warn]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "info": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([LogType.error, LogType.warn, LogType.info]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "log": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([ | 
					
						
							|  |  |  | 						LogType.error, | 
					
						
							|  |  |  | 						LogType.warn, | 
					
						
							|  |  |  | 						LogType.info, | 
					
						
							|  |  |  | 						LogType.log, | 
					
						
							|  |  |  | 						LogType.group, | 
					
						
							|  |  |  | 						LogType.groupEnd, | 
					
						
							|  |  |  | 						LogType.groupCollapsed, | 
					
						
							|  |  |  | 						LogType.clear | 
					
						
							|  |  |  | 					]); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case "verbose": | 
					
						
							|  |  |  | 					acceptedTypes = new Set([ | 
					
						
							|  |  |  | 						LogType.error, | 
					
						
							|  |  |  | 						LogType.warn, | 
					
						
							|  |  |  | 						LogType.info, | 
					
						
							|  |  |  | 						LogType.log, | 
					
						
							|  |  |  | 						LogType.group, | 
					
						
							|  |  |  | 						LogType.groupEnd, | 
					
						
							|  |  |  | 						LogType.groupCollapsed, | 
					
						
							|  |  |  | 						LogType.profile, | 
					
						
							|  |  |  | 						LogType.profileEnd, | 
					
						
							|  |  |  | 						LogType.time, | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 						LogType.status, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 						LogType.clear | 
					
						
							|  |  |  | 					]); | 
					
						
							|  |  |  | 					collapsedGroups = true; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			const cachedMakePathsRelative = makePathsRelative.bindContextCache( | 
					
						
							| 
									
										
										
										
											2020-04-17 16:54:27 +08:00
										 |  |  | 				context, | 
					
						
							|  |  |  | 				compilation.compiler.root | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 			let depthInCollapsedGroup = 0; | 
					
						
							|  |  |  | 			for (const [origin, logEntries] of compilation.logging) { | 
					
						
							|  |  |  | 				const debugMode = loggingDebug.some(fn => fn(origin)); | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 				/** @type {KnownStatsLoggingEntry[]} */ | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 				const groupStack = []; | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 				/** @type {KnownStatsLoggingEntry[]} */ | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 				const rootList = []; | 
					
						
							|  |  |  | 				let currentList = rootList; | 
					
						
							|  |  |  | 				let processedLogEntries = 0; | 
					
						
							|  |  |  | 				for (const entry of logEntries) { | 
					
						
							|  |  |  | 					let type = entry.type; | 
					
						
							|  |  |  | 					if (!debugMode && !acceptedTypes.has(type)) continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// Expand groups in verbose and debug modes
 | 
					
						
							|  |  |  | 					if (type === LogType.groupCollapsed && (debugMode || collapsedGroups)) | 
					
						
							|  |  |  | 						type = LogType.group; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (depthInCollapsedGroup === 0) { | 
					
						
							|  |  |  | 						processedLogEntries++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (type === LogType.groupEnd) { | 
					
						
							|  |  |  | 						groupStack.pop(); | 
					
						
							|  |  |  | 						if (groupStack.length > 0) { | 
					
						
							|  |  |  | 							currentList = groupStack[groupStack.length - 1].children; | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							currentList = rootList; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if (depthInCollapsedGroup > 0) depthInCollapsedGroup--; | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					let message = undefined; | 
					
						
							|  |  |  | 					if (entry.type === LogType.time) { | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 						message = `${entry.args[0]}: ${ | 
					
						
							|  |  |  | 							entry.args[1] * 1000 + entry.args[2] / 1000000 | 
					
						
							| 
									
										
										
										
											2020-04-04 05:13:14 +08:00
										 |  |  | 						} ms`;
 | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 					} else if (entry.args && entry.args.length > 0) { | 
					
						
							|  |  |  | 						message = util.format(entry.args[0], ...entry.args.slice(1)); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 					/** @type {KnownStatsLoggingEntry} */ | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 					const newEntry = { | 
					
						
							|  |  |  | 						...entry, | 
					
						
							|  |  |  | 						type, | 
					
						
							|  |  |  | 						message, | 
					
						
							|  |  |  | 						trace: loggingTrace ? entry.trace : undefined, | 
					
						
							|  |  |  | 						children: | 
					
						
							|  |  |  | 							type === LogType.group || type === LogType.groupCollapsed | 
					
						
							|  |  |  | 								? [] | 
					
						
							|  |  |  | 								: undefined | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 					currentList.push(newEntry); | 
					
						
							|  |  |  | 					if (newEntry.children) { | 
					
						
							|  |  |  | 						groupStack.push(newEntry); | 
					
						
							|  |  |  | 						currentList = newEntry.children; | 
					
						
							|  |  |  | 						if (depthInCollapsedGroup > 0) { | 
					
						
							|  |  |  | 							depthInCollapsedGroup++; | 
					
						
							|  |  |  | 						} else if (type === LogType.groupCollapsed) { | 
					
						
							|  |  |  | 							depthInCollapsedGroup = 1; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				let name = cachedMakePathsRelative(origin).replace(/\|/g, " "); | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 				if (name in object.logging) { | 
					
						
							|  |  |  | 					let i = 1; | 
					
						
							|  |  |  | 					while (`${name}#${i}` in object.logging) { | 
					
						
							|  |  |  | 						i++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					name = `${name}#${i}`; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				object.logging[name] = { | 
					
						
							|  |  |  | 					entries: rootList, | 
					
						
							|  |  |  | 					filteredEntries: logEntries.length - processedLogEntries, | 
					
						
							|  |  |  | 					debug: debugMode | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		children: (object, compilation, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			object.children = factory.create( | 
					
						
							|  |  |  | 				`${type}.children`, | 
					
						
							|  |  |  | 				compilation.children, | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	asset: { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:21:08 +08:00
										 |  |  | 		_: (object, asset, context, options, factory) => { | 
					
						
							|  |  |  | 			const { compilation } = context; | 
					
						
							|  |  |  | 			object.type = asset.type; | 
					
						
							|  |  |  | 			object.name = asset.name; | 
					
						
							|  |  |  | 			object.size = asset.source.size(); | 
					
						
							|  |  |  | 			object.emitted = compilation.emittedAssets.has(asset.name); | 
					
						
							|  |  |  | 			object.comparedForEmit = compilation.comparedForEmitAssets.has( | 
					
						
							|  |  |  | 				asset.name | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			const cached = !object.emitted && !object.comparedForEmit; | 
					
						
							|  |  |  | 			object.cached = cached; | 
					
						
							|  |  |  | 			object.info = asset.info; | 
					
						
							|  |  |  | 			if (!cached || options.cachedAssets) { | 
					
						
							|  |  |  | 				Object.assign( | 
					
						
							|  |  |  | 					object, | 
					
						
							|  |  |  | 					factory.create(`${context.type}$visible`, asset, context) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	asset$visible: { | 
					
						
							| 
									
										
										
										
											2019-07-25 04:42:54 +08:00
										 |  |  | 		_: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			asset, | 
					
						
							|  |  |  | 			{ compilation, compilationFileToChunks, compilationAuxiliaryFileToChunks } | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			const chunks = compilationFileToChunks.get(asset.name) || []; | 
					
						
							|  |  |  | 			const auxiliaryChunks = | 
					
						
							|  |  |  | 				compilationAuxiliaryFileToChunks.get(asset.name) || []; | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 			object.chunkNames = uniqueOrderedArray( | 
					
						
							|  |  |  | 				chunks, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 				c => (c.name ? [c.name] : []), | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 				compareIds | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 			object.chunkIdHints = uniqueOrderedArray( | 
					
						
							|  |  |  | 				chunks, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 				c => Array.from(c.idNameHints), | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 				compareIds | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 			object.auxiliaryChunkNames = uniqueOrderedArray( | 
					
						
							|  |  |  | 				auxiliaryChunks, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 				c => (c.name ? [c.name] : []), | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 				compareIds | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 			object.auxiliaryChunkIdHints = uniqueOrderedArray( | 
					
						
							|  |  |  | 				auxiliaryChunks, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 				c => Array.from(c.idNameHints), | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 				compareIds | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			object.filteredRelated = asset.related ? asset.related.length : undefined; | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		relatedAssets: (object, asset, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			object.related = factory.create( | 
					
						
							| 
									
										
										
										
											2020-12-04 22:21:08 +08:00
										 |  |  | 				`${type.slice(0, -8)}.related`, | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 				asset.related, | 
					
						
							|  |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			object.filteredRelated = asset.related | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 				? asset.related.length - object.related.length | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 				: undefined; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		ids: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			asset, | 
					
						
							|  |  |  | 			{ compilationFileToChunks, compilationAuxiliaryFileToChunks } | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			const chunks = compilationFileToChunks.get(asset.name) || []; | 
					
						
							|  |  |  | 			const auxiliaryChunks = | 
					
						
							|  |  |  | 				compilationAuxiliaryFileToChunks.get(asset.name) || []; | 
					
						
							|  |  |  | 			object.chunks = uniqueOrderedArray(chunks, c => c.ids, compareIds); | 
					
						
							|  |  |  | 			object.auxiliaryChunks = uniqueOrderedArray( | 
					
						
							|  |  |  | 				auxiliaryChunks, | 
					
						
							|  |  |  | 				c => c.ids, | 
					
						
							|  |  |  | 				compareIds | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		performance: (object, asset) => { | 
					
						
							|  |  |  | 			object.isOverSizeLimit = SizeLimitsPlugin.isOverSizeLimit(asset.source); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	chunkGroup: { | 
					
						
							|  |  |  | 		_: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			{ name, chunkGroup }, | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 			{ compilation, compilation: { moduleGraph, chunkGraph } }, | 
					
						
							|  |  |  | 			{ ids, chunkGroupAuxiliary, chunkGroupChildren, chunkGroupMaxAssets } | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		) => { | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 			const children = | 
					
						
							|  |  |  | 				chunkGroupChildren && | 
					
						
							|  |  |  | 				chunkGroup.getChildrenByOrders(moduleGraph, chunkGraph); | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			/** | 
					
						
							|  |  |  | 			 * @param {string} name Name | 
					
						
							|  |  |  | 			 * @returns {{ name: string, size: number }} Asset object | 
					
						
							|  |  |  | 			 */ | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 			const toAsset = name => { | 
					
						
							|  |  |  | 				const asset = compilation.getAsset(name); | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					name, | 
					
						
							|  |  |  | 					size: asset ? asset.info.size : -1 | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			/** @type {(total: number, asset: { size: number }) => number} */ | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 			const sizeReducer = (total, { size }) => total + size; | 
					
						
							|  |  |  | 			const assets = uniqueArray(chunkGroup.chunks, c => c.files).map(toAsset); | 
					
						
							|  |  |  | 			const auxiliaryAssets = uniqueOrderedArray( | 
					
						
							|  |  |  | 				chunkGroup.chunks, | 
					
						
							|  |  |  | 				c => c.auxiliaryFiles, | 
					
						
							|  |  |  | 				compareIds | 
					
						
							|  |  |  | 			).map(toAsset); | 
					
						
							|  |  |  | 			const assetsSize = assets.reduce(sizeReducer, 0); | 
					
						
							|  |  |  | 			const auxiliaryAssetsSize = auxiliaryAssets.reduce(sizeReducer, 0); | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsChunkGroup} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsChunkGroup = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				name, | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 				chunks: ids ? chunkGroup.chunks.map(c => c.id) : undefined, | 
					
						
							|  |  |  | 				assets: assets.length <= chunkGroupMaxAssets ? assets : undefined, | 
					
						
							|  |  |  | 				filteredAssets: | 
					
						
							|  |  |  | 					assets.length <= chunkGroupMaxAssets ? 0 : assets.length, | 
					
						
							|  |  |  | 				assetsSize, | 
					
						
							|  |  |  | 				auxiliaryAssets: | 
					
						
							|  |  |  | 					chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets | 
					
						
							|  |  |  | 						? auxiliaryAssets | 
					
						
							|  |  |  | 						: undefined, | 
					
						
							|  |  |  | 				filteredAuxiliaryAssets: | 
					
						
							|  |  |  | 					chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets | 
					
						
							|  |  |  | 						? 0 | 
					
						
							|  |  |  | 						: auxiliaryAssets.length, | 
					
						
							|  |  |  | 				auxiliaryAssetsSize, | 
					
						
							|  |  |  | 				children: children | 
					
						
							|  |  |  | 					? mapObject(children, groups => | 
					
						
							|  |  |  | 							groups.map(group => { | 
					
						
							|  |  |  | 								const assets = uniqueArray(group.chunks, c => c.files).map( | 
					
						
							|  |  |  | 									toAsset | 
					
						
							|  |  |  | 								); | 
					
						
							|  |  |  | 								const auxiliaryAssets = uniqueOrderedArray( | 
					
						
							|  |  |  | 									group.chunks, | 
					
						
							|  |  |  | 									c => c.auxiliaryFiles, | 
					
						
							|  |  |  | 									compareIds | 
					
						
							|  |  |  | 								).map(toAsset); | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 								/** @type {KnownStatsChunkGroup} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 								const childStatsChunkGroup = { | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 									name: group.name, | 
					
						
							|  |  |  | 									chunks: ids ? group.chunks.map(c => c.id) : undefined, | 
					
						
							|  |  |  | 									assets: | 
					
						
							|  |  |  | 										assets.length <= chunkGroupMaxAssets ? assets : undefined, | 
					
						
							|  |  |  | 									filteredAssets: | 
					
						
							|  |  |  | 										assets.length <= chunkGroupMaxAssets ? 0 : assets.length, | 
					
						
							|  |  |  | 									auxiliaryAssets: | 
					
						
							|  |  |  | 										chunkGroupAuxiliary && | 
					
						
							|  |  |  | 										auxiliaryAssets.length <= chunkGroupMaxAssets | 
					
						
							|  |  |  | 											? auxiliaryAssets | 
					
						
							|  |  |  | 											: undefined, | 
					
						
							|  |  |  | 									filteredAuxiliaryAssets: | 
					
						
							|  |  |  | 										chunkGroupAuxiliary && | 
					
						
							|  |  |  | 										auxiliaryAssets.length <= chunkGroupMaxAssets | 
					
						
							|  |  |  | 											? 0 | 
					
						
							|  |  |  | 											: auxiliaryAssets.length | 
					
						
							|  |  |  | 								}; | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 								return childStatsChunkGroup; | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 							}) | 
					
						
							|  |  |  | 					  ) | 
					
						
							|  |  |  | 					: undefined, | 
					
						
							|  |  |  | 				childAssets: children | 
					
						
							|  |  |  | 					? mapObject(children, groups => { | 
					
						
							|  |  |  | 							/** @type {Set<string>} */ | 
					
						
							|  |  |  | 							const set = new Set(); | 
					
						
							|  |  |  | 							for (const group of groups) { | 
					
						
							|  |  |  | 								for (const chunk of group.chunks) { | 
					
						
							|  |  |  | 									for (const asset of chunk.files) { | 
					
						
							|  |  |  | 										set.add(asset); | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:38 +08:00
										 |  |  | 							return Array.from(set); | 
					
						
							|  |  |  | 					  }) | 
					
						
							|  |  |  | 					: undefined | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsChunkGroup); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		performance: (object, { chunkGroup }) => { | 
					
						
							|  |  |  | 			object.isOverSizeLimit = SizeLimitsPlugin.isOverSizeLimit(chunkGroup); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	module: { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 		_: (object, module, context, options, factory) => { | 
					
						
							|  |  |  | 			const { compilation, type } = context; | 
					
						
							|  |  |  | 			const built = compilation.builtModules.has(module); | 
					
						
							|  |  |  | 			const codeGenerated = compilation.codeGeneratedModules.has(module); | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			/** @type {{[x: string]: number}} */ | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 			const sizes = {}; | 
					
						
							|  |  |  | 			for (const sourceType of module.getSourceTypes()) { | 
					
						
							|  |  |  | 				sizes[sourceType] = module.size(sourceType); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsModule} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsModule = { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 				type: "module", | 
					
						
							|  |  |  | 				moduleType: module.type, | 
					
						
							| 
									
										
										
										
											2020-12-22 21:51:09 +08:00
										 |  |  | 				layer: module.layer, | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 				size: module.size(), | 
					
						
							|  |  |  | 				sizes, | 
					
						
							|  |  |  | 				built, | 
					
						
							|  |  |  | 				codeGenerated, | 
					
						
							|  |  |  | 				cached: !built && !codeGenerated | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsModule); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 			if (built || codeGenerated || options.cachedModules) { | 
					
						
							|  |  |  | 				Object.assign( | 
					
						
							|  |  |  | 					object, | 
					
						
							|  |  |  | 					factory.create(`${type}$visible`, module, context) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	module$visible: { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		_: (object, module, context, { requestShortener }, factory) => { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			const { compilation, type, rootModules } = context; | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 			const { moduleGraph } = compilation; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			/** @type {Module[]} */ | 
					
						
							|  |  |  | 			const path = []; | 
					
						
							|  |  |  | 			const issuer = moduleGraph.getIssuer(module); | 
					
						
							|  |  |  | 			let current = issuer; | 
					
						
							|  |  |  | 			while (current) { | 
					
						
							|  |  |  | 				path.push(current); | 
					
						
							|  |  |  | 				current = moduleGraph.getIssuer(current); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			path.reverse(); | 
					
						
							|  |  |  | 			const profile = moduleGraph.getProfile(module); | 
					
						
							| 
									
										
										
										
											2019-11-08 19:43:05 +08:00
										 |  |  | 			const errors = module.getErrors(); | 
					
						
							|  |  |  | 			const errorsCount = errors !== undefined ? countIterable(errors) : 0; | 
					
						
							|  |  |  | 			const warnings = module.getWarnings(); | 
					
						
							|  |  |  | 			const warningsCount = | 
					
						
							|  |  |  | 				warnings !== undefined ? countIterable(warnings) : 0; | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			/** @type {{[x: string]: number}} */ | 
					
						
							| 
									
										
										
										
											2020-01-21 05:36:47 +08:00
										 |  |  | 			const sizes = {}; | 
					
						
							|  |  |  | 			for (const sourceType of module.getSourceTypes()) { | 
					
						
							|  |  |  | 				sizes[sourceType] = module.size(sourceType); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsModule} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsModule = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				identifier: module.identifier(), | 
					
						
							|  |  |  | 				name: module.readableIdentifier(requestShortener), | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				nameForCondition: module.nameForCondition(), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				index: moduleGraph.getPreOrderIndex(module), | 
					
						
							|  |  |  | 				preOrderIndex: moduleGraph.getPreOrderIndex(module), | 
					
						
							|  |  |  | 				index2: moduleGraph.getPostOrderIndex(module), | 
					
						
							|  |  |  | 				postOrderIndex: moduleGraph.getPostOrderIndex(module), | 
					
						
							|  |  |  | 				cacheable: module.buildInfo.cacheable, | 
					
						
							|  |  |  | 				optional: module.isOptional(moduleGraph), | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				orphan: | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 					!type.endsWith("module.modules[].module$visible") && | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					compilation.chunkGraph.getNumberOfModuleChunks(module) === 0, | 
					
						
							|  |  |  | 				dependent: rootModules ? !rootModules.has(module) : undefined, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				issuer: issuer && issuer.identifier(), | 
					
						
							|  |  |  | 				issuerName: issuer && issuer.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 				issuerPath: | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 					issuer && | 
					
						
							|  |  |  | 					factory.create(`${type.slice(0, -8)}.issuerPath`, path, context), | 
					
						
							| 
									
										
										
										
											2019-11-08 19:43:05 +08:00
										 |  |  | 				failed: errorsCount > 0, | 
					
						
							|  |  |  | 				errors: errorsCount, | 
					
						
							|  |  |  | 				warnings: warningsCount | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsModule); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			if (profile) { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 				object.profile = factory.create( | 
					
						
							|  |  |  | 					`${type.slice(0, -8)}.profile`, | 
					
						
							|  |  |  | 					profile, | 
					
						
							|  |  |  | 					context | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		ids: (object, module, { compilation: { chunkGraph, moduleGraph } }) => { | 
					
						
							|  |  |  | 			object.id = chunkGraph.getModuleId(module); | 
					
						
							|  |  |  | 			const issuer = moduleGraph.getIssuer(module); | 
					
						
							|  |  |  | 			object.issuerId = issuer && chunkGraph.getModuleId(issuer); | 
					
						
							|  |  |  | 			object.chunks = Array.from( | 
					
						
							|  |  |  | 				chunkGraph.getOrderedModuleChunksIterable(module, compareChunksById), | 
					
						
							|  |  |  | 				chunk => chunk.id | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		moduleAssets: (object, module) => { | 
					
						
							|  |  |  | 			object.assets = module.buildInfo.assets | 
					
						
							|  |  |  | 				? Object.keys(module.buildInfo.assets) | 
					
						
							|  |  |  | 				: []; | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		reasons: (object, module, context, options, factory) => { | 
					
						
							|  |  |  | 			const { | 
					
						
							|  |  |  | 				type, | 
					
						
							|  |  |  | 				compilation: { moduleGraph } | 
					
						
							|  |  |  | 			} = context; | 
					
						
							|  |  |  | 			object.reasons = factory.create( | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 				`${type.slice(0, -8)}.reasons`, | 
					
						
							| 
									
										
										
										
											2019-11-08 05:12:31 +08:00
										 |  |  | 				Array.from(moduleGraph.getIncomingConnections(module)), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		usedExports: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			module, | 
					
						
							|  |  |  | 			{ runtime, compilation: { moduleGraph } } | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			const usedExports = moduleGraph.getUsedExports(module, runtime); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			if (usedExports === null) { | 
					
						
							|  |  |  | 				object.usedExports = null; | 
					
						
							|  |  |  | 			} else if (typeof usedExports === "boolean") { | 
					
						
							|  |  |  | 				object.usedExports = usedExports; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				object.usedExports = Array.from(usedExports); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-30 16:03:42 +08:00
										 |  |  | 		providedExports: (object, module, { compilation: { moduleGraph } }) => { | 
					
						
							|  |  |  | 			const providedExports = moduleGraph.getProvidedExports(module); | 
					
						
							|  |  |  | 			object.providedExports = Array.isArray(providedExports) | 
					
						
							|  |  |  | 				? providedExports | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				: null; | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		optimizationBailout: ( | 
					
						
							|  |  |  | 			object, | 
					
						
							|  |  |  | 			module, | 
					
						
							|  |  |  | 			{ compilation: { moduleGraph } }, | 
					
						
							|  |  |  | 			{ requestShortener } | 
					
						
							|  |  |  | 		) => { | 
					
						
							|  |  |  | 			object.optimizationBailout = moduleGraph | 
					
						
							|  |  |  | 				.getOptimizationBailout(module) | 
					
						
							|  |  |  | 				.map(item => { | 
					
						
							|  |  |  | 					if (typeof item === "function") return item(requestShortener); | 
					
						
							|  |  |  | 					return item; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		depth: (object, module, { compilation: { moduleGraph } }) => { | 
					
						
							|  |  |  | 			object.depth = moduleGraph.getDepth(module); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		nestedModules: (object, module, context, options, factory) => { | 
					
						
							|  |  |  | 			const { type } = context; | 
					
						
							|  |  |  | 			if (module instanceof ConcatenatedModule) { | 
					
						
							|  |  |  | 				const modules = module.modules; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				const groupedModules = factory.create( | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 					`${type.slice(0, -8)}.modules`, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					modules, | 
					
						
							|  |  |  | 					context | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				const limited = spaceLimited( | 
					
						
							|  |  |  | 					groupedModules, | 
					
						
							|  |  |  | 					options.nestedModulesSpace | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				object.modules = limited.children; | 
					
						
							|  |  |  | 				object.filteredModules = limited.filteredChildren; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		source: (object, module) => { | 
					
						
							|  |  |  | 			const originalSource = module.originalSource(); | 
					
						
							|  |  |  | 			if (originalSource) { | 
					
						
							|  |  |  | 				object.source = originalSource.source(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	profile: { | 
					
						
							|  |  |  | 		_: (object, profile) => { | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsProfile} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsProfile = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				total: | 
					
						
							|  |  |  | 					profile.factory + | 
					
						
							|  |  |  | 					profile.restoring + | 
					
						
							|  |  |  | 					profile.integration + | 
					
						
							|  |  |  | 					profile.building + | 
					
						
							|  |  |  | 					profile.storing, | 
					
						
							|  |  |  | 				resolving: profile.factory, | 
					
						
							|  |  |  | 				restoring: profile.restoring, | 
					
						
							|  |  |  | 				building: profile.building, | 
					
						
							|  |  |  | 				integration: profile.integration, | 
					
						
							|  |  |  | 				storing: profile.storing, | 
					
						
							|  |  |  | 				additionalResolving: profile.additionalFactories, | 
					
						
							|  |  |  | 				additionalIntegration: profile.additionalIntegration, | 
					
						
							|  |  |  | 				// TODO remove this in webpack 6
 | 
					
						
							|  |  |  | 				factory: profile.factory, | 
					
						
							|  |  |  | 				// TODO remove this in webpack 6
 | 
					
						
							|  |  |  | 				dependencies: profile.additionalFactories | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsProfile); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	moduleIssuer: { | 
					
						
							|  |  |  | 		_: (object, module, context, { requestShortener }, factory) => { | 
					
						
							|  |  |  | 			const { compilation, type } = context; | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 			const { moduleGraph } = compilation; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			const profile = moduleGraph.getProfile(module); | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsModuleIssuer} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsModuleIssuer = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				identifier: module.identifier(), | 
					
						
							|  |  |  | 				name: module.readableIdentifier(requestShortener) | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsModuleIssuer); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			if (profile) { | 
					
						
							|  |  |  | 				object.profile = factory.create(`${type}.profile`, profile, context); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		ids: (object, module, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			object.id = chunkGraph.getModuleId(module); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	moduleReason: { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		_: (object, reason, { runtime }, { requestShortener }) => { | 
					
						
							| 
									
										
										
										
											2020-08-07 23:05:48 +08:00
										 |  |  | 			const dep = reason.dependency; | 
					
						
							|  |  |  | 			const moduleDep = | 
					
						
							|  |  |  | 				dep && dep instanceof ModuleDependency ? dep : undefined; | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsModuleReason} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsModuleReason = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				moduleIdentifier: reason.originModule | 
					
						
							|  |  |  | 					? reason.originModule.identifier() | 
					
						
							|  |  |  | 					: null, | 
					
						
							|  |  |  | 				module: reason.originModule | 
					
						
							|  |  |  | 					? reason.originModule.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					: null, | 
					
						
							|  |  |  | 				moduleName: reason.originModule | 
					
						
							|  |  |  | 					? reason.originModule.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					: null, | 
					
						
							| 
									
										
										
										
											2019-01-11 02:23:19 +08:00
										 |  |  | 				resolvedModuleIdentifier: reason.resolvedOriginModule | 
					
						
							|  |  |  | 					? reason.resolvedOriginModule.identifier() | 
					
						
							|  |  |  | 					: null, | 
					
						
							| 
									
										
										
										
											2019-01-10 07:45:25 +08:00
										 |  |  | 				resolvedModule: reason.resolvedOriginModule | 
					
						
							|  |  |  | 					? reason.resolvedOriginModule.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					: null, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				type: reason.dependency ? reason.dependency.type : null, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				active: reason.isActive(runtime), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				explanation: reason.explanation, | 
					
						
							| 
									
										
										
										
											2020-08-07 23:05:48 +08:00
										 |  |  | 				userRequest: (moduleDep && moduleDep.userRequest) || null | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsModuleReason); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			if (reason.dependency) { | 
					
						
							|  |  |  | 				const locInfo = formatLocation(reason.dependency.loc); | 
					
						
							|  |  |  | 				if (locInfo) { | 
					
						
							|  |  |  | 					object.loc = locInfo; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		ids: (object, reason, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			object.moduleId = reason.originModule | 
					
						
							|  |  |  | 				? chunkGraph.getModuleId(reason.originModule) | 
					
						
							|  |  |  | 				: null; | 
					
						
							|  |  |  | 			object.resolvedModuleId = reason.resolvedOriginModule | 
					
						
							|  |  |  | 				? chunkGraph.getModuleId(reason.resolvedOriginModule) | 
					
						
							|  |  |  | 				: null; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	chunk: { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		_: (object, chunk, { makePathsRelative, compilation: { chunkGraph } }) => { | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 			const childIdByOrder = chunk.getChildIdsByOrders(chunkGraph); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsChunk} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsChunk = { | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 				rendered: chunk.rendered, | 
					
						
							|  |  |  | 				initial: chunk.canBeInitial(), | 
					
						
							|  |  |  | 				entry: chunk.hasRuntime(), | 
					
						
							|  |  |  | 				recorded: AggressiveSplittingPlugin.wasChunkRecorded(chunk), | 
					
						
							|  |  |  | 				reason: chunk.chunkReason, | 
					
						
							|  |  |  | 				size: chunkGraph.getChunkModulesSize(chunk), | 
					
						
							|  |  |  | 				sizes: chunkGraph.getChunkModulesSizes(chunk), | 
					
						
							|  |  |  | 				names: chunk.name ? [chunk.name] : [], | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 				idHints: Array.from(chunk.idNameHints), | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				runtime: | 
					
						
							|  |  |  | 					chunk.runtime === undefined | 
					
						
							|  |  |  | 						? undefined | 
					
						
							|  |  |  | 						: typeof chunk.runtime === "string" | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 						? [makePathsRelative(chunk.runtime)] | 
					
						
							|  |  |  | 						: Array.from(chunk.runtime.sort(), makePathsRelative), | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 				files: Array.from(chunk.files), | 
					
						
							| 
									
										
										
										
											2019-07-17 23:30:25 +08:00
										 |  |  | 				auxiliaryFiles: Array.from(chunk.auxiliaryFiles).sort(compareIds), | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 				hash: chunk.renderedHash, | 
					
						
							|  |  |  | 				childrenByOrder: childIdByOrder | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsChunk); | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		ids: (object, chunk) => { | 
					
						
							|  |  |  | 			object.id = chunk.id; | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 		chunkRelations: (object, chunk, { compilation: { chunkGraph } }) => { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			/** @type {Set<string|number>} */ | 
					
						
							|  |  |  | 			const parents = new Set(); | 
					
						
							|  |  |  | 			/** @type {Set<string|number>} */ | 
					
						
							|  |  |  | 			const children = new Set(); | 
					
						
							|  |  |  | 			/** @type {Set<string|number>} */ | 
					
						
							|  |  |  | 			const siblings = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (const chunkGroup of chunk.groupsIterable) { | 
					
						
							|  |  |  | 				for (const parentGroup of chunkGroup.parentsIterable) { | 
					
						
							|  |  |  | 					for (const chunk of parentGroup.chunks) { | 
					
						
							|  |  |  | 						parents.add(chunk.id); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				for (const childGroup of chunkGroup.childrenIterable) { | 
					
						
							|  |  |  | 					for (const chunk of childGroup.chunks) { | 
					
						
							|  |  |  | 						children.add(chunk.id); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				for (const sibling of chunkGroup.chunks) { | 
					
						
							|  |  |  | 					if (sibling !== chunk) siblings.add(sibling.id); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 			object.siblings = Array.from(siblings).sort(compareIds); | 
					
						
							|  |  |  | 			object.parents = Array.from(parents).sort(compareIds); | 
					
						
							|  |  |  | 			object.children = Array.from(children).sort(compareIds); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		chunkModules: (object, chunk, context, options, factory) => { | 
					
						
							|  |  |  | 			const { | 
					
						
							|  |  |  | 				type, | 
					
						
							|  |  |  | 				compilation: { chunkGraph } | 
					
						
							|  |  |  | 			} = context; | 
					
						
							|  |  |  | 			const array = chunkGraph.getChunkModules(chunk); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			const groupedModules = factory.create(`${type}.modules`, array, { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				...context, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				runtime: chunk.runtime, | 
					
						
							|  |  |  | 				rootModules: new Set(chunkGraph.getChunkRootModules(chunk)) | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			const limited = spaceLimited(groupedModules, options.chunkModulesSpace); | 
					
						
							|  |  |  | 			object.modules = limited.children; | 
					
						
							|  |  |  | 			object.filteredModules = limited.filteredChildren; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		chunkOrigins: (object, chunk, context, options, factory) => { | 
					
						
							|  |  |  | 			const { | 
					
						
							|  |  |  | 				type, | 
					
						
							|  |  |  | 				compilation: { chunkGraph } | 
					
						
							|  |  |  | 			} = context; | 
					
						
							|  |  |  | 			/** @type {Set<string>} */ | 
					
						
							|  |  |  | 			const originsKeySet = new Set(); | 
					
						
							| 
									
										
										
										
											2020-01-21 05:36:47 +08:00
										 |  |  | 			const origins = []; | 
					
						
							|  |  |  | 			for (const g of chunk.groupsIterable) { | 
					
						
							|  |  |  | 				origins.push(...g.origins); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			const array = origins.filter(origin => { | 
					
						
							|  |  |  | 				const key = [ | 
					
						
							|  |  |  | 					origin.module ? chunkGraph.getModuleId(origin.module) : undefined, | 
					
						
							|  |  |  | 					formatLocation(origin.loc), | 
					
						
							|  |  |  | 					origin.request | 
					
						
							|  |  |  | 				].join(); | 
					
						
							|  |  |  | 				if (originsKeySet.has(key)) return false; | 
					
						
							|  |  |  | 				originsKeySet.add(key); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			object.origins = factory.create(`${type}.origins`, array, context); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	chunkOrigin: { | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		_: (object, origin, context, { requestShortener }) => { | 
					
						
							| 
									
										
										
										
											2021-02-05 20:19:32 +08:00
										 |  |  | 			/** @type {KnownStatsChunkOrigin} */ | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			const statsChunkOrigin = { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				module: origin.module ? origin.module.identifier() : "", | 
					
						
							|  |  |  | 				moduleIdentifier: origin.module ? origin.module.identifier() : "", | 
					
						
							|  |  |  | 				moduleName: origin.module | 
					
						
							|  |  |  | 					? origin.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					: "", | 
					
						
							|  |  |  | 				loc: formatLocation(origin.loc), | 
					
						
							|  |  |  | 				request: origin.request | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			Object.assign(object, statsChunkOrigin); | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		ids: (object, origin, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			object.moduleId = origin.module | 
					
						
							|  |  |  | 				? chunkGraph.getModuleId(origin.module) | 
					
						
							|  |  |  | 				: undefined; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	error: EXTRACT_ERROR, | 
					
						
							|  |  |  | 	warning: EXTRACT_ERROR, | 
					
						
							|  |  |  | 	moduleTraceItem: { | 
					
						
							|  |  |  | 		_: (object, { origin, module }, context, { requestShortener }, factory) => { | 
					
						
							|  |  |  | 			const { | 
					
						
							|  |  |  | 				type, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 				compilation: { moduleGraph } | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			} = context; | 
					
						
							|  |  |  | 			object.originIdentifier = origin.identifier(); | 
					
						
							|  |  |  | 			object.originName = origin.readableIdentifier(requestShortener); | 
					
						
							|  |  |  | 			object.moduleIdentifier = module.identifier(); | 
					
						
							|  |  |  | 			object.moduleName = module.readableIdentifier(requestShortener); | 
					
						
							| 
									
										
										
										
											2019-11-08 05:12:31 +08:00
										 |  |  | 			const dependencies = Array.from( | 
					
						
							|  |  |  | 				moduleGraph.getIncomingConnections(module) | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				.filter(c => c.resolvedOriginModule === origin && c.dependency) | 
					
						
							|  |  |  | 				.map(c => c.dependency); | 
					
						
							|  |  |  | 			object.dependencies = factory.create( | 
					
						
							|  |  |  | 				`${type}.dependencies`, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				Array.from(new Set(dependencies)), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 				context | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		ids: (object, { origin, module }, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			object.originId = chunkGraph.getModuleId(origin); | 
					
						
							|  |  |  | 			object.moduleId = chunkGraph.getModuleId(module); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	moduleTraceDependency: { | 
					
						
							|  |  |  | 		_: (object, dependency) => { | 
					
						
							|  |  |  | 			object.loc = formatLocation(dependency.loc); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, Record<string, (thing: any, context: StatsFactoryContext, options: NormalizedStatsOptions) => boolean | undefined>>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const FILTER = { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	"module.reasons": { | 
					
						
							|  |  |  | 		"!orphanModules": (reason, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			if ( | 
					
						
							|  |  |  | 				reason.originModule && | 
					
						
							|  |  |  | 				chunkGraph.getNumberOfModuleChunks(reason.originModule) === 0 | 
					
						
							|  |  |  | 			) { | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, Record<string, (thing: Object, context: StatsFactoryContext, options: NormalizedStatsOptions) => boolean | undefined>>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const FILTER_RESULTS = { | 
					
						
							|  |  |  | 	"compilation.warnings": { | 
					
						
							| 
									
										
										
										
											2020-09-21 04:08:38 +08:00
										 |  |  | 		warningsFilter: util.deprecate( | 
					
						
							|  |  |  | 			(warning, context, { warningsFilter }) => { | 
					
						
							|  |  |  | 				const warningString = Object.keys(warning) | 
					
						
							|  |  |  | 					.map(key => `${warning[key]}`) | 
					
						
							|  |  |  | 					.join("\n"); | 
					
						
							|  |  |  | 				return !warningsFilter.some(filter => filter(warning, warningString)); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			"config.stats.warningsFilter is deprecated in favor of config.ignoreWarnings", | 
					
						
							|  |  |  | 			"DEP_WEBPACK_STATS_WARNINGS_FILTER" | 
					
						
							|  |  |  | 		) | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, (comparators: Function[], context: StatsFactoryContext) => void>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const MODULES_SORTER = { | 
					
						
							|  |  |  | 	_: (comparators, { compilation: { moduleGraph } }) => { | 
					
						
							|  |  |  | 		comparators.push( | 
					
						
							|  |  |  | 			compareSelect( | 
					
						
							|  |  |  | 				/** | 
					
						
							|  |  |  | 				 * @param {Module} m module | 
					
						
							|  |  |  | 				 * @returns {number} depth | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				m => moduleGraph.getDepth(m), | 
					
						
							|  |  |  | 				compareNumbers | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			compareSelect( | 
					
						
							|  |  |  | 				/** | 
					
						
							|  |  |  | 				 * @param {Module} m module | 
					
						
							|  |  |  | 				 * @returns {number} index | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				m => moduleGraph.getPreOrderIndex(m), | 
					
						
							|  |  |  | 				compareNumbers | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			compareSelect( | 
					
						
							|  |  |  | 				/** | 
					
						
							|  |  |  | 				 * @param {Module} m module | 
					
						
							|  |  |  | 				 * @returns {string} identifier | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				m => m.identifier(), | 
					
						
							|  |  |  | 				compareIds | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, Record<string, (comparators: Function[], context: StatsFactoryContext) => void>>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const SORTERS = { | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 	"compilation.chunks": { | 
					
						
							|  |  |  | 		_: comparators => { | 
					
						
							|  |  |  | 			comparators.push(compareSelect(c => c.id, compareIds)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	"compilation.modules": MODULES_SORTER, | 
					
						
							|  |  |  | 	"chunk.rootModules": MODULES_SORTER, | 
					
						
							|  |  |  | 	"chunk.modules": MODULES_SORTER, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	"module.modules": MODULES_SORTER, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	"module.reasons": { | 
					
						
							|  |  |  | 		_: (comparators, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			comparators.push( | 
					
						
							| 
									
										
										
										
											2019-10-16 22:38:04 +08:00
										 |  |  | 				compareSelect(x => x.originModule, compareModulesByIdentifier) | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-01-12 02:07:37 +08:00
										 |  |  | 			comparators.push( | 
					
						
							| 
									
										
										
										
											2019-10-16 22:38:04 +08:00
										 |  |  | 				compareSelect(x => x.resolvedOriginModule, compareModulesByIdentifier) | 
					
						
							| 
									
										
										
										
											2019-01-12 02:07:37 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 			comparators.push( | 
					
						
							|  |  |  | 				compareSelect( | 
					
						
							|  |  |  | 					x => x.dependency, | 
					
						
							|  |  |  | 					concatComparators( | 
					
						
							|  |  |  | 						compareSelect( | 
					
						
							|  |  |  | 							/** | 
					
						
							|  |  |  | 							 * @param {Dependency} x dependency | 
					
						
							|  |  |  | 							 * @returns {DependencyLocation} location | 
					
						
							|  |  |  | 							 */ | 
					
						
							|  |  |  | 							x => x.loc, | 
					
						
							|  |  |  | 							compareLocations | 
					
						
							|  |  |  | 						), | 
					
						
							|  |  |  | 						compareSelect(x => x.type, compareIds) | 
					
						
							|  |  |  | 					) | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"chunk.origins": { | 
					
						
							|  |  |  | 		_: (comparators, { compilation: { chunkGraph } }) => { | 
					
						
							|  |  |  | 			comparators.push( | 
					
						
							|  |  |  | 				compareSelect( | 
					
						
							|  |  |  | 					origin => | 
					
						
							|  |  |  | 						origin.module ? chunkGraph.getModuleId(origin.module) : undefined, | 
					
						
							|  |  |  | 					compareIds | 
					
						
							|  |  |  | 				), | 
					
						
							|  |  |  | 				compareSelect(origin => formatLocation(origin.loc), compareIds), | 
					
						
							|  |  |  | 				compareSelect(origin => origin.request, compareIds) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | const getItemSize = item => { | 
					
						
							|  |  |  | 	// Each item takes 1 line
 | 
					
						
							|  |  |  | 	// + the size of the children
 | 
					
						
							|  |  |  | 	// + 1 extra line when it has children and filteredChildren
 | 
					
						
							|  |  |  | 	return !item.children | 
					
						
							|  |  |  | 		? 1 | 
					
						
							|  |  |  | 		: item.filteredChildren | 
					
						
							|  |  |  | 		? 2 + getTotalSize(item.children) | 
					
						
							|  |  |  | 		: 1 + getTotalSize(item.children); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | const getTotalSize = children => { | 
					
						
							|  |  |  | 	let size = 0; | 
					
						
							|  |  |  | 	for (const child of children) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		size += getItemSize(child); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return size; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const getTotalItems = children => { | 
					
						
							|  |  |  | 	let count = 0; | 
					
						
							|  |  |  | 	for (const child of children) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:46:36 +08:00
										 |  |  | 		if (!child.children && !child.filteredChildren) { | 
					
						
							|  |  |  | 			count++; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			if (child.children) count += getTotalItems(child.children); | 
					
						
							|  |  |  | 			if (child.filteredChildren) count += child.filteredChildren; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const collapse = children => { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 	// After collapse each child must take exactly one line
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	const newChildren = []; | 
					
						
							|  |  |  | 	for (const child of children) { | 
					
						
							|  |  |  | 		if (child.children) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 			let filteredChildren = child.filteredChildren || 0; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			filteredChildren += getTotalItems(child.children); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 			newChildren.push({ | 
					
						
							|  |  |  | 				...child, | 
					
						
							|  |  |  | 				children: undefined, | 
					
						
							|  |  |  | 				filteredChildren | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			newChildren.push(child); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return newChildren; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | const spaceLimited = (itemsAndGroups, max) => { | 
					
						
							|  |  |  | 	/** @type {any[] | undefined} */ | 
					
						
							|  |  |  | 	let children = undefined; | 
					
						
							|  |  |  | 	/** @type {number | undefined} */ | 
					
						
							|  |  |  | 	let filteredChildren = undefined; | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 	// This are the groups, which take 1+ lines each
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	const groups = itemsAndGroups.filter(c => c.children || c.filteredChildren); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 	// The sizes of the groups are stored in groupSizes
 | 
					
						
							|  |  |  | 	const groupSizes = groups.map(g => getItemSize(g)); | 
					
						
							|  |  |  | 	// This are the items, which take 1 line each
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	const items = itemsAndGroups.filter(c => !c.children && !c.filteredChildren); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 	// The total of group sizes
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	let groupsSize = groupSizes.reduce((a, b) => a + b, 0); | 
					
						
							|  |  |  | 	if (groupsSize + items.length <= max) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		// The total size in the current state fits into the max
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		// keep all
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		children = groups.concat(items); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:38 +08:00
										 |  |  | 	} else if ( | 
					
						
							|  |  |  | 		groups.length > 0 && | 
					
						
							|  |  |  | 		groups.length + Math.min(1, items.length) < max | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		// If each group would take 1 line the total would be below the maximum
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		// collapse some groups, keep items
 | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:38 +08:00
										 |  |  | 		while (groupsSize + items.length + (filteredChildren ? 1 : 0) > max) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 			// calculate how much we are over the size limit
 | 
					
						
							|  |  |  | 			// this allows to approach the limit faster
 | 
					
						
							|  |  |  | 			// it's always > 1
 | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:38 +08:00
										 |  |  | 			const oversize = | 
					
						
							|  |  |  | 				items.length + groupsSize + (filteredChildren ? 1 : 0) - max; | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 			// Find the maximum group and process only this one
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			const maxGroupSize = Math.max(...groupSizes); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:38 +08:00
										 |  |  | 			if (maxGroupSize < items.length) { | 
					
						
							|  |  |  | 				filteredChildren = items.length; | 
					
						
							|  |  |  | 				items.length = 0; | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			for (let i = 0; i < groups.length; i++) { | 
					
						
							|  |  |  | 				if (groupSizes[i] === maxGroupSize) { | 
					
						
							|  |  |  | 					const group = groups[i]; | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 					// 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; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					const limited = spaceLimited( | 
					
						
							|  |  |  | 						group.children, | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 						groupSizes[i] - headerSize - oversize / groups.length | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					); | 
					
						
							|  |  |  | 					groups[i] = { | 
					
						
							|  |  |  | 						...group, | 
					
						
							|  |  |  | 						children: limited.children, | 
					
						
							|  |  |  | 						filteredChildren: | 
					
						
							|  |  |  | 							(group.filteredChildren || 0) + limited.filteredChildren | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 					const newSize = getItemSize(groups[i]); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					groupsSize -= groupSizes[i] - newSize; | 
					
						
							|  |  |  | 					groupSizes[i] = newSize; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		children = groups.concat(items); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:38 +08:00
										 |  |  | 	} else if ( | 
					
						
							|  |  |  | 		groups.length > 0 && | 
					
						
							|  |  |  | 		groups.length + Math.min(1, items.length) <= max | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		// If we have only enough space to show one line per group and one line for the filtered items
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		// collapse all groups and items
 | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		children = groups.length ? collapse(groups) : undefined; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		filteredChildren = items.length; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:04:04 +08:00
										 |  |  | 		// If we have no space
 | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		// collapse complete group
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		filteredChildren = getTotalItems(itemsAndGroups); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	return { | 
					
						
							|  |  |  | 		children, | 
					
						
							|  |  |  | 		filteredChildren | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | const assetGroup = (children, assets) => { | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 	let size = 0; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	for (const asset of children) { | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		size += asset.size; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return { | 
					
						
							|  |  |  | 		size | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | const moduleGroup = (children, modules) => { | 
					
						
							|  |  |  | 	let size = 0; | 
					
						
							|  |  |  | 	const sizes = {}; | 
					
						
							|  |  |  | 	for (const module of children) { | 
					
						
							|  |  |  | 		size += module.size; | 
					
						
							|  |  |  | 		for (const key of Object.keys(module.sizes)) { | 
					
						
							|  |  |  | 			sizes[key] = (sizes[key] || 0) + module.sizes[key]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return { | 
					
						
							|  |  |  | 		size, | 
					
						
							|  |  |  | 		sizes | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, (groupConfigs: GroupConfig[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} */ | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | const ASSETS_GROUPERS = { | 
					
						
							|  |  |  | 	_: (groupConfigs, context, options) => { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		const groupByFlag = (name, exclude) => { | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: asset => { | 
					
						
							|  |  |  | 					return asset[name] ? ["1"] : undefined; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				getOptions: () => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						groupChildren: !exclude, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 						force: exclude | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, assets) => { | 
					
						
							|  |  |  | 					return exclude | 
					
						
							|  |  |  | 						? { | 
					
						
							|  |  |  | 								type: "assets by status", | 
					
						
							|  |  |  | 								[name]: !!key, | 
					
						
							|  |  |  | 								filteredChildren: assets.length, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 								...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 						  } | 
					
						
							|  |  |  | 						: { | 
					
						
							|  |  |  | 								type: "assets by status", | 
					
						
							|  |  |  | 								[name]: !!key, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 								children, | 
					
						
							|  |  |  | 								...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 						  }; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		const { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:39:57 +08:00
										 |  |  | 			groupAssetsByEmitStatus, | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			groupAssetsByPath, | 
					
						
							|  |  |  | 			groupAssetsByExtension | 
					
						
							|  |  |  | 		} = options; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:39:57 +08:00
										 |  |  | 		if (groupAssetsByEmitStatus) { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			groupByFlag("emitted"); | 
					
						
							|  |  |  | 			groupByFlag("comparedForEmit"); | 
					
						
							|  |  |  | 			groupByFlag("isOverSizeLimit"); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:39:57 +08:00
										 |  |  | 		if (groupAssetsByEmitStatus || !options.cachedAssets) { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			groupByFlag("cached", !options.cachedAssets); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (groupAssetsByPath || groupAssetsByExtension) { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: asset => { | 
					
						
							|  |  |  | 					const extensionMatch = | 
					
						
							|  |  |  | 						groupAssetsByExtension && /(\.[^.]+)(?:\?.*|$)/.exec(asset.name); | 
					
						
							|  |  |  | 					const extension = extensionMatch ? extensionMatch[1] : ""; | 
					
						
							|  |  |  | 					const pathMatch = | 
					
						
							|  |  |  | 						groupAssetsByPath && /(.+)[/\\][^/\\]+(?:\?.*|$)/.exec(asset.name); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:01 +08:00
										 |  |  | 					const path = pathMatch ? pathMatch[1].split(/[/\\]/) : []; | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					const keys = []; | 
					
						
							|  |  |  | 					if (groupAssetsByPath) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:01 +08:00
										 |  |  | 						keys.push("."); | 
					
						
							|  |  |  | 						if (extension) | 
					
						
							|  |  |  | 							keys.push( | 
					
						
							|  |  |  | 								path.length | 
					
						
							|  |  |  | 									? `${path.join("/")}/*${extension}` | 
					
						
							|  |  |  | 									: `*${extension}` | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						while (path.length > 0) { | 
					
						
							|  |  |  | 							keys.push(path.join("/") + "/"); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 							path.pop(); | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						if (extension) keys.push(`*${extension}`); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					return keys; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, assets) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 						type: groupAssetsByPath ? "assets by path" : "assets by extension", | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 						name: key, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 						children, | 
					
						
							|  |  |  | 						...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	groupAssetsByInfo: (groupConfigs, context, options) => { | 
					
						
							|  |  |  | 		const groupByAssetInfoFlag = name => { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: asset => { | 
					
						
							|  |  |  | 					return asset.info && asset.info[name] ? ["1"] : undefined; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, assets) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type: "assets by info", | 
					
						
							|  |  |  | 						info: { | 
					
						
							|  |  |  | 							[name]: !!key | 
					
						
							|  |  |  | 						}, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 						children, | 
					
						
							|  |  |  | 						...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		groupByAssetInfoFlag("immutable"); | 
					
						
							|  |  |  | 		groupByAssetInfoFlag("development"); | 
					
						
							|  |  |  | 		groupByAssetInfoFlag("hotModuleReplacement"); | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	groupAssetsByChunk: (groupConfigs, context, options) => { | 
					
						
							|  |  |  | 		const groupByNames = name => { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: asset => { | 
					
						
							|  |  |  | 					return asset[name]; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, assets) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type: "assets by chunk", | 
					
						
							|  |  |  | 						[name]: [key], | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 						children, | 
					
						
							|  |  |  | 						...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		groupByNames("chunkNames"); | 
					
						
							|  |  |  | 		groupByNames("auxiliaryChunkNames"); | 
					
						
							|  |  |  | 		groupByNames("chunkIdHints"); | 
					
						
							|  |  |  | 		groupByNames("auxiliaryChunkIdHints"); | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	excludeAssets: (groupConfigs, context, { excludeAssets }) => { | 
					
						
							|  |  |  | 		groupConfigs.push({ | 
					
						
							|  |  |  | 			getKeys: asset => { | 
					
						
							|  |  |  | 				const ident = asset.name; | 
					
						
							|  |  |  | 				const excluded = excludeAssets.some(fn => fn(ident, asset)); | 
					
						
							|  |  |  | 				if (excluded) return ["excluded"]; | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			getOptions: () => ({ | 
					
						
							|  |  |  | 				groupChildren: false, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				force: true | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			}), | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			createGroup: (key, children, assets) => ({ | 
					
						
							|  |  |  | 				type: "hidden assets", | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 				filteredChildren: assets.length, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				...assetGroup(children, assets) | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {function(string): Record<string, (groupConfigs: GroupConfig[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} */ | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | const MODULES_GROUPERS = type => ({ | 
					
						
							|  |  |  | 	_: (groupConfigs, context, options) => { | 
					
						
							|  |  |  | 		const groupByFlag = (name, type, exclude) => { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: module => { | 
					
						
							|  |  |  | 					return module[name] ? ["1"] : undefined; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				getOptions: () => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						groupChildren: !exclude, | 
					
						
							|  |  |  | 						force: exclude | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, modules) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type, | 
					
						
							|  |  |  | 						[name]: !!key, | 
					
						
							|  |  |  | 						...(exclude ? { filteredChildren: modules.length } : { children }), | 
					
						
							|  |  |  | 						...moduleGroup(children, modules) | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		const { | 
					
						
							|  |  |  | 			groupModulesByCacheStatus, | 
					
						
							| 
									
										
										
										
											2020-12-22 21:51:09 +08:00
										 |  |  | 			groupModulesByLayer, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			groupModulesByAttributes, | 
					
						
							|  |  |  | 			groupModulesByType, | 
					
						
							|  |  |  | 			groupModulesByPath, | 
					
						
							|  |  |  | 			groupModulesByExtension | 
					
						
							|  |  |  | 		} = options; | 
					
						
							|  |  |  | 		if (groupModulesByAttributes) { | 
					
						
							|  |  |  | 			groupByFlag("errors", "modules with errors"); | 
					
						
							|  |  |  | 			groupByFlag("warnings", "modules with warnings"); | 
					
						
							|  |  |  | 			groupByFlag("assets", "modules with assets"); | 
					
						
							|  |  |  | 			groupByFlag("optional", "optional modules"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (groupModulesByCacheStatus) { | 
					
						
							|  |  |  | 			groupByFlag("cacheable", "cacheable modules"); | 
					
						
							|  |  |  | 			groupByFlag("built", "built modules"); | 
					
						
							|  |  |  | 			groupByFlag("codeGenerated", "code generated modules"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (groupModulesByCacheStatus || !options.cachedModules) { | 
					
						
							|  |  |  | 			groupByFlag("cached", "cached modules", !options.cachedModules); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (groupModulesByAttributes || !options.orphanModules) { | 
					
						
							|  |  |  | 			groupByFlag("orphan", "orphan modules", !options.orphanModules); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (groupModulesByAttributes || !options.dependentModules) { | 
					
						
							|  |  |  | 			groupByFlag("dependent", "dependent modules", !options.dependentModules); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-02 16:51:10 +08:00
										 |  |  | 		if (groupModulesByType || !options.runtimeModules) { | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: module => { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 					if (!module.moduleType) return; | 
					
						
							| 
									
										
										
										
											2020-09-02 16:51:10 +08:00
										 |  |  | 					if (groupModulesByType) { | 
					
						
							|  |  |  | 						return [module.moduleType.split("/", 1)[0]]; | 
					
						
							|  |  |  | 					} else if (module.moduleType === "runtime") { | 
					
						
							|  |  |  | 						return ["runtime"]; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 				}, | 
					
						
							|  |  |  | 				getOptions: key => { | 
					
						
							| 
									
										
										
										
											2020-09-02 16:51:10 +08:00
										 |  |  | 					const exclude = key === "runtime" && !options.runtimeModules; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					return { | 
					
						
							|  |  |  | 						groupChildren: !exclude, | 
					
						
							|  |  |  | 						force: exclude | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, modules) => { | 
					
						
							| 
									
										
										
										
											2020-09-02 16:51:10 +08:00
										 |  |  | 					const exclude = key === "runtime" && !options.runtimeModules; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					return { | 
					
						
							|  |  |  | 						type: `${key} modules`, | 
					
						
							|  |  |  | 						moduleType: key, | 
					
						
							|  |  |  | 						...(exclude ? { filteredChildren: modules.length } : { children }), | 
					
						
							|  |  |  | 						...moduleGroup(children, modules) | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-12-22 21:51:09 +08:00
										 |  |  | 		if (groupModulesByLayer) { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: module => { | 
					
						
							|  |  |  | 					return [module.layer]; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, modules) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type: "modules by layer", | 
					
						
							|  |  |  | 						layer: key, | 
					
						
							|  |  |  | 						children, | 
					
						
							|  |  |  | 						...moduleGroup(children, modules) | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 		if (groupModulesByPath || groupModulesByExtension) { | 
					
						
							|  |  |  | 			groupConfigs.push({ | 
					
						
							|  |  |  | 				getKeys: module => { | 
					
						
							| 
									
										
										
										
											2020-12-04 22:20:57 +08:00
										 |  |  | 					if (!module.name) return; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					const resource = parseResource(module.name.split("!").pop()).path; | 
					
						
							|  |  |  | 					const extensionMatch = | 
					
						
							|  |  |  | 						groupModulesByExtension && /(\.[^.]+)(?:\?.*|$)/.exec(resource); | 
					
						
							|  |  |  | 					const extension = extensionMatch ? extensionMatch[1] : ""; | 
					
						
							|  |  |  | 					const pathMatch = | 
					
						
							|  |  |  | 						groupModulesByPath && /(.+)[/\\][^/\\]+(?:\?.*|$)/.exec(resource); | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:01 +08:00
										 |  |  | 					const path = pathMatch ? pathMatch[1].split(/[/\\]/) : []; | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					const keys = []; | 
					
						
							|  |  |  | 					if (groupModulesByPath) { | 
					
						
							| 
									
										
										
										
											2020-09-29 15:57:01 +08:00
										 |  |  | 						if (extension) | 
					
						
							|  |  |  | 							keys.push( | 
					
						
							|  |  |  | 								path.length | 
					
						
							|  |  |  | 									? `${path.join("/")}/*${extension}` | 
					
						
							|  |  |  | 									: `*${extension}` | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						while (path.length > 0) { | 
					
						
							|  |  |  | 							keys.push(path.join("/") + "/"); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 							path.pop(); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						if (extension) keys.push(`*${extension}`); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					return keys; | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				createGroup: (key, children, modules) => { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type: groupModulesByPath | 
					
						
							|  |  |  | 							? "modules by path" | 
					
						
							|  |  |  | 							: "modules by extension", | 
					
						
							|  |  |  | 						name: key, | 
					
						
							|  |  |  | 						children, | 
					
						
							|  |  |  | 						...moduleGroup(children, modules) | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	excludeModules: (groupConfigs, context, { excludeModules }) => { | 
					
						
							|  |  |  | 		groupConfigs.push({ | 
					
						
							|  |  |  | 			getKeys: module => { | 
					
						
							|  |  |  | 				const name = module.name; | 
					
						
							|  |  |  | 				if (name) { | 
					
						
							|  |  |  | 					const excluded = excludeModules.some(fn => fn(name, module, type)); | 
					
						
							|  |  |  | 					if (excluded) return ["1"]; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			getOptions: () => ({ | 
					
						
							|  |  |  | 				groupChildren: false, | 
					
						
							|  |  |  | 				force: true | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 			createGroup: (key, children, modules) => ({ | 
					
						
							|  |  |  | 				type: "hidden modules", | 
					
						
							|  |  |  | 				filteredChildren: children.length, | 
					
						
							|  |  |  | 				...moduleGroup(children, modules) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, Record<string, (groupConfigs: GroupConfig[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>>} */ | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | const RESULT_GROUPERS = { | 
					
						
							|  |  |  | 	"compilation.assets": ASSETS_GROUPERS, | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	"asset.related": ASSETS_GROUPERS, | 
					
						
							|  |  |  | 	"compilation.modules": MODULES_GROUPERS("module"), | 
					
						
							|  |  |  | 	"chunk.modules": MODULES_GROUPERS("chunk"), | 
					
						
							|  |  |  | 	"chunk.rootModules": MODULES_GROUPERS("root-of-chunk"), | 
					
						
							|  |  |  | 	"module.modules": MODULES_GROUPERS("nested") | 
					
						
							| 
									
										
										
										
											2020-08-27 15:59:12 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | // remove a prefixed "!" that can be specified to reverse sort order
 | 
					
						
							|  |  |  | const normalizeFieldKey = field => { | 
					
						
							|  |  |  | 	if (field[0] === "!") { | 
					
						
							|  |  |  | 		return field.substr(1); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return field; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // if a field is prefixed by a "!" reverse sort order
 | 
					
						
							|  |  |  | const sortOrderRegular = field => { | 
					
						
							|  |  |  | 	if (field[0] === "!") { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {string} field field name | 
					
						
							|  |  |  |  * @returns {function(Object, Object): number} comparators | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const sortByField = field => { | 
					
						
							|  |  |  | 	if (!field) { | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {any} a first | 
					
						
							|  |  |  | 		 * @param {any} b second | 
					
						
							|  |  |  | 		 * @returns {-1|0|1} zero | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		const noSort = (a, b) => 0; | 
					
						
							|  |  |  | 		return noSort; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const fieldKey = normalizeFieldKey(field); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	let sortFn = compareSelect(m => m[fieldKey], compareIds); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// if a field is prefixed with a "!" the sort is reversed!
 | 
					
						
							|  |  |  | 	const sortIsRegular = sortOrderRegular(field); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!sortIsRegular) { | 
					
						
							|  |  |  | 		const oldSortFn = sortFn; | 
					
						
							|  |  |  | 		sortFn = (a, b) => oldSortFn(b, a); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sortFn; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | const ASSET_SORTERS = { | 
					
						
							| 
									
										
										
										
											2021-01-10 07:46:29 +08:00
										 |  |  | 	/** @type {(comparators: Function[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void} */ | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 	assetsSort: (comparators, context, { assetsSort }) => { | 
					
						
							|  |  |  | 		comparators.push(sortByField(assetsSort)); | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	_: comparators => { | 
					
						
							|  |  |  | 		comparators.push(compareSelect(a => a.name, compareIds)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  | /** @type {Record<string, Record<string, (comparators: Function[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>>} */ | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | const RESULT_SORTERS = { | 
					
						
							|  |  |  | 	"compilation.chunks": { | 
					
						
							|  |  |  | 		chunksSort: (comparators, context, { chunksSort }) => { | 
					
						
							|  |  |  | 			comparators.push(sortByField(chunksSort)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"compilation.modules": { | 
					
						
							|  |  |  | 		modulesSort: (comparators, context, { modulesSort }) => { | 
					
						
							|  |  |  | 			comparators.push(sortByField(modulesSort)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"chunk.modules": { | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		chunkModulesSort: (comparators, context, { chunkModulesSort }) => { | 
					
						
							|  |  |  | 			comparators.push(sortByField(chunkModulesSort)); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"module.modules": { | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		nestedModulesSort: (comparators, context, { nestedModulesSort }) => { | 
					
						
							|  |  |  | 			comparators.push(sortByField(nestedModulesSort)); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 	"compilation.assets": ASSET_SORTERS, | 
					
						
							|  |  |  | 	"asset.related": ASSET_SORTERS | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {Record<string, Record<string, Function>>} config the config see above | 
					
						
							| 
									
										
										
										
											2020-12-18 01:51:55 +08:00
										 |  |  |  * @param {NormalizedStatsOptions} options stats options | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  |  * @param {function(string, Function): void} fn handler function called for every active line in config | 
					
						
							|  |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const iterateConfig = (config, options, fn) => { | 
					
						
							|  |  |  | 	for (const hookFor of Object.keys(config)) { | 
					
						
							|  |  |  | 		const subConfig = config[hookFor]; | 
					
						
							|  |  |  | 		for (const option of Object.keys(subConfig)) { | 
					
						
							|  |  |  | 			if (option !== "_") { | 
					
						
							|  |  |  | 				if (option.startsWith("!")) { | 
					
						
							|  |  |  | 					if (options[option.slice(1)]) continue; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					const value = options[option]; | 
					
						
							|  |  |  | 					if ( | 
					
						
							|  |  |  | 						value === false || | 
					
						
							|  |  |  | 						value === undefined || | 
					
						
							|  |  |  | 						(Array.isArray(value) && value.length === 0) | 
					
						
							|  |  |  | 					) | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			fn(hookFor, subConfig[option]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {Record<string, string>} */ | 
					
						
							|  |  |  | const ITEM_NAMES = { | 
					
						
							|  |  |  | 	"compilation.children[]": "compilation", | 
					
						
							|  |  |  | 	"compilation.modules[]": "module", | 
					
						
							|  |  |  | 	"compilation.entrypoints[]": "chunkGroup", | 
					
						
							|  |  |  | 	"compilation.namedChunkGroups[]": "chunkGroup", | 
					
						
							|  |  |  | 	"compilation.errors[]": "error", | 
					
						
							|  |  |  | 	"compilation.warnings[]": "warning", | 
					
						
							|  |  |  | 	"chunk.modules[]": "module", | 
					
						
							|  |  |  | 	"chunk.rootModules[]": "module", | 
					
						
							|  |  |  | 	"chunk.origins[]": "chunkOrigin", | 
					
						
							|  |  |  | 	"compilation.chunks[]": "chunk", | 
					
						
							|  |  |  | 	"compilation.assets[]": "asset", | 
					
						
							| 
									
										
										
										
											2020-08-01 12:21:29 +08:00
										 |  |  | 	"asset.related[]": "asset", | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	"module.issuerPath[]": "moduleIssuer", | 
					
						
							|  |  |  | 	"module.reasons[]": "moduleReason", | 
					
						
							|  |  |  | 	"module.modules[]": "module", | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 	"module.children[]": "module", | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	"moduleTrace[]": "moduleTraceItem", | 
					
						
							|  |  |  | 	"moduleTraceItem.dependencies[]": "moduleTraceDependency" | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {Object[]} items items to be merged | 
					
						
							|  |  |  |  * @returns {Object} an object | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const mergeToObject = items => { | 
					
						
							|  |  |  | 	const obj = Object.create(null); | 
					
						
							|  |  |  | 	for (const item of items) { | 
					
						
							|  |  |  | 		obj[item.name] = item; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return obj; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {Record<string, (items: Object[]) => any>} */ | 
					
						
							|  |  |  | const MERGER = { | 
					
						
							|  |  |  | 	"compilation.entrypoints": mergeToObject, | 
					
						
							|  |  |  | 	"compilation.namedChunkGroups": mergeToObject | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DefaultStatsFactoryPlugin { | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-04-23 16:48:36 +08:00
										 |  |  | 	 * Apply the plugin | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler the compiler instance | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap("DefaultStatsFactoryPlugin", compilation => { | 
					
						
							|  |  |  | 			compilation.hooks.statsFactory.tap( | 
					
						
							|  |  |  | 				"DefaultStatsFactoryPlugin", | 
					
						
							|  |  |  | 				(stats, options, context) => { | 
					
						
							|  |  |  | 					iterateConfig(SIMPLE_EXTRACTORS, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.extract | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (obj, data, ctx) => | 
					
						
							|  |  |  | 								fn(obj, data, ctx, options, stats) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					iterateConfig(FILTER, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.filter | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (item, ctx, idx, i) => | 
					
						
							|  |  |  | 								fn(item, ctx, options, idx, i) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					iterateConfig(FILTER_RESULTS, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.filterResults | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (item, ctx, idx, i) => | 
					
						
							|  |  |  | 								fn(item, ctx, options, idx, i) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					iterateConfig(SORTERS, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.sort | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (comparators, ctx) => | 
					
						
							|  |  |  | 								fn(comparators, ctx, options) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					iterateConfig(RESULT_SORTERS, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.sortResults | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (comparators, ctx) => | 
					
						
							|  |  |  | 								fn(comparators, ctx, options) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2020-09-02 00:08:09 +08:00
										 |  |  | 					iterateConfig(RESULT_GROUPERS, options, (hookFor, fn) => { | 
					
						
							|  |  |  | 						stats.hooks.groupResults | 
					
						
							|  |  |  | 							.for(hookFor) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", (groupConfigs, ctx) => | 
					
						
							|  |  |  | 								fn(groupConfigs, ctx, options) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 					for (const key of Object.keys(ITEM_NAMES)) { | 
					
						
							|  |  |  | 						const itemName = ITEM_NAMES[key]; | 
					
						
							|  |  |  | 						stats.hooks.getItemName | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							|  |  |  | 							.tap("DefaultStatsFactoryPlugin", () => itemName); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					for (const key of Object.keys(MERGER)) { | 
					
						
							|  |  |  | 						const merger = MERGER[key]; | 
					
						
							|  |  |  | 						stats.hooks.merge.for(key).tap("DefaultStatsFactoryPlugin", merger); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if (options.children) { | 
					
						
							|  |  |  | 						if (Array.isArray(options.children)) { | 
					
						
							|  |  |  | 							stats.hooks.getItemFactory | 
					
						
							|  |  |  | 								.for("compilation.children[].compilation") | 
					
						
							|  |  |  | 								.tap("DefaultStatsFactoryPlugin", (comp, { _index: idx }) => { | 
					
						
							|  |  |  | 									if (idx < options.children.length) { | 
					
						
							|  |  |  | 										return compilation.createStatsFactory( | 
					
						
							|  |  |  | 											compilation.createStatsOptions( | 
					
						
							|  |  |  | 												options.children[idx], | 
					
						
							|  |  |  | 												context | 
					
						
							|  |  |  | 											) | 
					
						
							|  |  |  | 										); | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 								}); | 
					
						
							|  |  |  | 						} else if (options.children !== true) { | 
					
						
							|  |  |  | 							const childFactory = compilation.createStatsFactory( | 
					
						
							|  |  |  | 								compilation.createStatsOptions(options.children, context) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 							stats.hooks.getItemFactory | 
					
						
							|  |  |  | 								.for("compilation.children[].compilation") | 
					
						
							|  |  |  | 								.tap("DefaultStatsFactoryPlugin", () => { | 
					
						
							|  |  |  | 									return childFactory; | 
					
						
							|  |  |  | 								}); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = DefaultStatsFactoryPlugin; |