| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const RequestShortener = require("../RequestShortener"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("../Compilation")} Compilation */ | 
					
						
							|  |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const applyDefaults = (options, defaults) => { | 
					
						
							|  |  |  | 	for (const key of Object.keys(defaults)) { | 
					
						
							|  |  |  | 		if (typeof options[key] === "undefined") { | 
					
						
							|  |  |  | 			options[key] = defaults[key]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const NAMED_PRESETS = { | 
					
						
							|  |  |  | 	verbose: { | 
					
						
							|  |  |  | 		entrypoints: true, | 
					
						
							|  |  |  | 		chunkGroups: true, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		ids: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		modules: false, | 
					
						
							|  |  |  | 		chunks: true, | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 		chunkRelations: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		chunkModules: true, | 
					
						
							|  |  |  | 		chunkRootModules: false, | 
					
						
							|  |  |  | 		chunkOrigins: true, | 
					
						
							|  |  |  | 		depth: true, | 
					
						
							|  |  |  | 		env: true, | 
					
						
							|  |  |  | 		reasons: true, | 
					
						
							|  |  |  | 		usedExports: true, | 
					
						
							|  |  |  | 		providedExports: true, | 
					
						
							|  |  |  | 		optimizationBailout: true, | 
					
						
							|  |  |  | 		errorDetails: true, | 
					
						
							| 
									
										
										
										
											2019-10-15 04:34:40 +08:00
										 |  |  | 		errorStack: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		publicPath: true, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		logging: "verbose", | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		orphanModules: true, | 
					
						
							|  |  |  | 		runtime: true, | 
					
						
							|  |  |  | 		exclude: false, | 
					
						
							|  |  |  | 		maxModules: Infinity | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	detailed: { | 
					
						
							|  |  |  | 		entrypoints: true, | 
					
						
							|  |  |  | 		chunkGroups: true, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 		ids: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		chunks: true, | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 		chunkRelations: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		chunkModules: false, | 
					
						
							|  |  |  | 		chunkRootModules: false, | 
					
						
							|  |  |  | 		chunkOrigins: true, | 
					
						
							|  |  |  | 		depth: true, | 
					
						
							|  |  |  | 		usedExports: true, | 
					
						
							|  |  |  | 		providedExports: true, | 
					
						
							|  |  |  | 		optimizationBailout: true, | 
					
						
							|  |  |  | 		errorDetails: true, | 
					
						
							|  |  |  | 		publicPath: true, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		logging: true, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 		runtimeModules: true, | 
					
						
							|  |  |  | 		runtime: true, | 
					
						
							|  |  |  | 		exclude: false, | 
					
						
							|  |  |  | 		maxModules: Infinity | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	minimal: { | 
					
						
							|  |  |  | 		all: false, | 
					
						
							|  |  |  | 		modules: true, | 
					
						
							|  |  |  | 		maxModules: 0, | 
					
						
							|  |  |  | 		errors: true, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		warnings: true, | 
					
						
							|  |  |  | 		logging: "warn" | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	"errors-only": { | 
					
						
							|  |  |  | 		all: false, | 
					
						
							|  |  |  | 		errors: true, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		moduleTrace: true, | 
					
						
							|  |  |  | 		logging: "error" | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-05-10 03:38:10 +08:00
										 |  |  | 	"errors-warnings": { | 
					
						
							|  |  |  | 		all: false, | 
					
						
							|  |  |  | 		errors: true, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		warnings: true, | 
					
						
							|  |  |  | 		logging: "warn" | 
					
						
							| 
									
										
										
										
											2019-05-10 03:38:10 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	none: { | 
					
						
							|  |  |  | 		all: false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const NORMAL_ON = ({ all }) => all !== false; | 
					
						
							|  |  |  | const NORMAL_OFF = ({ all }) => all === true; | 
					
						
							| 
									
										
										
										
											2018-12-26 03:58:22 +08:00
										 |  |  | const OFF_FOR_TO_STRING = ({ all }, { forToString }) => | 
					
						
							|  |  |  | 	forToString ? all === true : all !== false; | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @type {Record<string, (options: Object, context: { forToString: boolean }, compilation: Compilation) => any>} */ | 
					
						
							|  |  |  | const DEFAULTS = { | 
					
						
							|  |  |  | 	context: (options, context, compilation) => compilation.compiler.context, | 
					
						
							|  |  |  | 	requestShortener: (options, context, compilation) => | 
					
						
							|  |  |  | 		compilation.compiler.context === options.context | 
					
						
							|  |  |  | 			? compilation.requestShortener | 
					
						
							| 
									
										
										
										
											2020-01-15 06:20:30 +08:00
										 |  |  | 			: new RequestShortener(options.context, compilation.compiler.root), | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	performance: NORMAL_ON, | 
					
						
							|  |  |  | 	hash: NORMAL_ON, | 
					
						
							|  |  |  | 	env: NORMAL_OFF, | 
					
						
							|  |  |  | 	version: NORMAL_ON, | 
					
						
							|  |  |  | 	timings: NORMAL_ON, | 
					
						
							|  |  |  | 	builtAt: NORMAL_ON, | 
					
						
							|  |  |  | 	assets: NORMAL_ON, | 
					
						
							|  |  |  | 	entrypoints: NORMAL_ON, | 
					
						
							|  |  |  | 	chunkGroups: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	chunks: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-22 20:19:13 +08:00
										 |  |  | 	chunkRelations: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	chunkModules: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	chunkRootModules: ({ all, chunkModules }, { forToString }) => { | 
					
						
							|  |  |  | 		if (all === false) return false; | 
					
						
							|  |  |  | 		if (all === true) return true; | 
					
						
							|  |  |  | 		if (forToString && chunkModules) return false; | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	chunkOrigins: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 	ids: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	modules: ( | 
					
						
							|  |  |  | 		{ all, chunks, chunkRootModules, chunkModules }, | 
					
						
							|  |  |  | 		{ forToString } | 
					
						
							|  |  |  | 	) => { | 
					
						
							|  |  |  | 		if (all === false) return false; | 
					
						
							|  |  |  | 		if (all === true) return true; | 
					
						
							|  |  |  | 		if (forToString && chunks && (chunkModules || chunkRootModules)) | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	nestedModules: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	orphanModules: NORMAL_OFF, | 
					
						
							|  |  |  | 	moduleAssets: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	depth: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	cached: NORMAL_ON, | 
					
						
							|  |  |  | 	runtime: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2019-07-25 21:42:42 +08:00
										 |  |  | 	cachedAssets: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	reasons: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	usedExports: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	providedExports: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	optimizationBailout: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 	children: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	source: NORMAL_OFF, | 
					
						
							|  |  |  | 	moduleTrace: NORMAL_ON, | 
					
						
							|  |  |  | 	errors: NORMAL_ON, | 
					
						
							|  |  |  | 	errorDetails: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2019-10-15 04:34:40 +08:00
										 |  |  | 	errorStack: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	warnings: NORMAL_ON, | 
					
						
							|  |  |  | 	publicPath: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 	logging: ({ all }, { forToString }) => | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 		forToString && all !== false ? "info" : false, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 	loggingDebug: () => [], | 
					
						
							|  |  |  | 	loggingTrace: OFF_FOR_TO_STRING, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	excludeModules: () => [], | 
					
						
							|  |  |  | 	excludeAssets: () => [], | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 	maxModules: (o, { forToString }) => (forToString ? 15 : Infinity), | 
					
						
							| 
									
										
										
										
											2019-10-10 20:32:07 +08:00
										 |  |  | 	modulesSort: () => "depth", | 
					
						
							|  |  |  | 	chunkModulesSort: () => "name", | 
					
						
							|  |  |  | 	chunkRootModulesSort: () => "name", | 
					
						
							|  |  |  | 	nestedModulesSort: () => false, | 
					
						
							|  |  |  | 	chunksSort: () => false, | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	assetsSort: () => "name", | 
					
						
							|  |  |  | 	outputPath: OFF_FOR_TO_STRING, | 
					
						
							|  |  |  | 	colors: () => false | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | const normalizeFilter = item => { | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	if (typeof item === "string") { | 
					
						
							|  |  |  | 		const regExp = new RegExp( | 
					
						
							|  |  |  | 			`[\\\\/]${item.replace( | 
					
						
							|  |  |  | 				// eslint-disable-next-line no-useless-escape
 | 
					
						
							|  |  |  | 				/[-[\]{}()*+?.\\^$|]/g, | 
					
						
							|  |  |  | 				"\\$&" | 
					
						
							|  |  |  | 			)}([\\\\/]|$|!|\\?)`
 | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		return ident => regExp.test(ident); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (item && typeof item === "object" && typeof item.test === "function") { | 
					
						
							|  |  |  | 		return ident => item.test(ident); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof item === "function") { | 
					
						
							|  |  |  | 		return item; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof item === "boolean") { | 
					
						
							|  |  |  | 		return () => item; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const NORMALIZER = { | 
					
						
							|  |  |  | 	excludeModules: value => { | 
					
						
							|  |  |  | 		if (!Array.isArray(value)) { | 
					
						
							|  |  |  | 			value = value ? [value] : []; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		return value.map(normalizeFilter); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	excludeAssets: value => { | 
					
						
							|  |  |  | 		if (!Array.isArray(value)) { | 
					
						
							|  |  |  | 			value = value ? [value] : []; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 		return value.map(normalizeFilter); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	warningsFilter: value => { | 
					
						
							|  |  |  | 		if (!Array.isArray(value)) { | 
					
						
							|  |  |  | 			value = value ? [value] : []; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return value.map(filter => { | 
					
						
							|  |  |  | 			if (typeof filter === "string") { | 
					
						
							|  |  |  | 				return (warning, warningString) => warningString.includes(filter); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (filter instanceof RegExp) { | 
					
						
							|  |  |  | 				return (warning, warningString) => filter.test(warningString); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (typeof filter === "function") { | 
					
						
							|  |  |  | 				return filter; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			throw new Error( | 
					
						
							|  |  |  | 				`Can only filter warnings with Strings or RegExps. (Given: ${filter})` | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2019-07-24 16:51:04 +08:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	logging: value => { | 
					
						
							|  |  |  | 		if (value === true) value = "log"; | 
					
						
							|  |  |  | 		return value; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	loggingDebug: value => { | 
					
						
							|  |  |  | 		if (!Array.isArray(value)) { | 
					
						
							|  |  |  | 			value = value ? [value] : []; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return value.map(normalizeFilter); | 
					
						
							| 
									
										
										
										
											2018-12-19 01:29:12 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DefaultStatsPresetPlugin { | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler webpack compiler | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap("DefaultStatsPresetPlugin", compilation => { | 
					
						
							|  |  |  | 			for (const key of Object.keys(NAMED_PRESETS)) { | 
					
						
							|  |  |  | 				const defaults = NAMED_PRESETS[key]; | 
					
						
							|  |  |  | 				compilation.hooks.statsPreset | 
					
						
							|  |  |  | 					.for(key) | 
					
						
							|  |  |  | 					.tap("DefaultStatsPresetPlugin", (options, context) => { | 
					
						
							|  |  |  | 						applyDefaults(options, defaults); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			compilation.hooks.statsNormalize.tap( | 
					
						
							|  |  |  | 				"DefaultStatsPresetPlugin", | 
					
						
							|  |  |  | 				(options, context) => { | 
					
						
							|  |  |  | 					for (const key of Object.keys(DEFAULTS)) { | 
					
						
							|  |  |  | 						if (options[key] === undefined) | 
					
						
							|  |  |  | 							options[key] = DEFAULTS[key](options, context, compilation); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					for (const key of Object.keys(NORMALIZER)) { | 
					
						
							|  |  |  | 						options[key] = NORMALIZER[key](options[key]); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = DefaultStatsPresetPlugin; |