| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | const RequestShortener = require("./RequestShortener"); | 
					
						
							| 
									
										
										
										
											2018-07-27 04:37:21 +08:00
										 |  |  | const { formatSize } = require("./SizeFormatHelpers"); | 
					
						
							| 
									
										
										
										
											2017-01-10 00:11:34 +08:00
										 |  |  | const formatLocation = require("./formatLocation"); | 
					
						
							| 
									
										
										
										
											2017-07-24 19:28:33 +08:00
										 |  |  | const identifierUtils = require("./util/identifier"); | 
					
						
							| 
									
										
										
										
											2018-07-20 01:44:44 +08:00
										 |  |  | const compareLocations = require("./compareLocations"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const optionsOrFallback = (...args) => { | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 	let optionValues = []; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 	optionValues.push(...args); | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 	return optionValues.find(optionValue => typeof optionValue !== "undefined"); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-10 16:24:04 +08:00
										 |  |  | const compareId = (a, b) => { | 
					
						
							|  |  |  | 	if (a < b) return -1; | 
					
						
							|  |  |  | 	if (a > b) return 1; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | class Stats { | 
					
						
							|  |  |  | 	constructor(compilation) { | 
					
						
							|  |  |  | 		this.compilation = compilation; | 
					
						
							|  |  |  | 		this.hash = compilation.hash; | 
					
						
							| 
									
										
										
										
											2018-03-29 12:49:00 +08:00
										 |  |  | 		this.startTime = undefined; | 
					
						
							|  |  |  | 		this.endTime = undefined; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 	static filterWarnings(warnings, warningsFilter) { | 
					
						
							|  |  |  | 		// we dont have anything to filter so all warnings can be shown
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!warningsFilter) { | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 			return warnings; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// create a chain of filters
 | 
					
						
							| 
									
										
										
										
											2018-02-26 10:49:06 +08:00
										 |  |  | 		// if they return "true" a warning should be suppressed
 | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 		const normalizedWarningsFilters = [].concat(warningsFilter).map(filter => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (typeof filter === "string") { | 
					
						
							| 
									
										
										
										
											2018-01-12 00:58:39 +08:00
										 |  |  | 				return warning => warning.includes(filter); | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (filter instanceof RegExp) { | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 				return warning => filter.test(warning); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (typeof filter === "function") { | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 				return filter; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			throw new Error( | 
					
						
							|  |  |  | 				`Can only filter warnings with Strings or RegExps. (Given: ${filter})` | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 		return warnings.filter(warning => { | 
					
						
							|  |  |  | 			return !normalizedWarningsFilters.some(check => check(warning)); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 21:08:30 +08:00
										 |  |  | 	formatFilePath(filePath) { | 
					
						
							|  |  |  | 		const OPTIONS_REGEXP = /^(\s|\S)*!/; | 
					
						
							|  |  |  | 		return filePath.includes("!") | 
					
						
							| 
									
										
										
										
											2018-06-04 16:10:23 +08:00
										 |  |  | 			? `${filePath.replace(OPTIONS_REGEXP, "")} (${filePath})` | 
					
						
							|  |  |  | 			: `${filePath}`; | 
					
						
							| 
									
										
										
										
											2018-03-27 21:08:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	hasWarnings() { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		return ( | 
					
						
							|  |  |  | 			this.compilation.warnings.length > 0 || | 
					
						
							|  |  |  | 			this.compilation.children.some(child => child.getStats().hasWarnings()) | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-08-03 17:01:29 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	hasErrors() { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		return ( | 
					
						
							|  |  |  | 			this.compilation.errors.length > 0 || | 
					
						
							|  |  |  | 			this.compilation.children.some(child => child.getStats().hasErrors()) | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 	// remove a prefixed "!" that can be specified to reverse sort order
 | 
					
						
							| 
									
										
										
										
											2017-02-06 18:40:06 +08:00
										 |  |  | 	normalizeFieldKey(field) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (field[0] === "!") { | 
					
						
							| 
									
										
										
										
											2017-02-06 18:40:06 +08:00
										 |  |  | 			return field.substr(1); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return field; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 	// if a field is prefixed by a "!" reverse sort order
 | 
					
						
							|  |  |  | 	sortOrderRegular(field) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (field[0] === "!") { | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	toJson(options, forToString) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof options === "boolean" || typeof options === "string") { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			options = Stats.presetToOptions(options); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (!options) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			options = {}; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const optionOrLocalFallback = (v, def) => | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			typeof v !== "undefined" | 
					
						
							|  |  |  | 				? v | 
					
						
							| 
									
										
										
										
											2018-04-26 22:32:23 +08:00
										 |  |  | 				: typeof options.all !== "undefined" | 
					
						
							|  |  |  | 					? options.all | 
					
						
							|  |  |  | 					: def; | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const testAgainstGivenOption = item => { | 
					
						
							|  |  |  | 			if (typeof item === "string") { | 
					
						
							|  |  |  | 				const regExp = new RegExp( | 
					
						
							|  |  |  | 					`[\\\\/]${item.replace( | 
					
						
							| 
									
										
										
										
											2018-06-27 19:48:13 +08:00
										 |  |  | 						// eslint-disable-next-line no-useless-escape
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:15:37 +08:00
										 |  |  | 						/[-[\]{}()*+?.\\^$|]/g, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						"\\$&" | 
					
						
							|  |  |  | 					)}([\\\\/]|$|!|\\?)`
 | 
					
						
							| 
									
										
										
										
											2018-06-27 19:48:13 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 				return ident => regExp.test(ident); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (item && typeof item === "object" && typeof item.test === "function") { | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 				return ident => item.test(ident); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (typeof item === "function") { | 
					
						
							|  |  |  | 				return item; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (typeof item === "boolean") { | 
					
						
							|  |  |  | 				return () => item; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const compilation = this.compilation; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const context = optionsOrFallback( | 
					
						
							|  |  |  | 			options.context, | 
					
						
							|  |  |  | 			compilation.compiler.context | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		const requestShortener = | 
					
						
							|  |  |  | 			compilation.compiler.context === context | 
					
						
							|  |  |  | 				? compilation.requestShortener | 
					
						
							|  |  |  | 				: new RequestShortener(context); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showPerformance = optionOrLocalFallback(options.performance, true); | 
					
						
							|  |  |  | 		const showHash = optionOrLocalFallback(options.hash, true); | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 		const showEnv = optionOrLocalFallback(options.env, false); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showVersion = optionOrLocalFallback(options.version, true); | 
					
						
							|  |  |  | 		const showTimings = optionOrLocalFallback(options.timings, true); | 
					
						
							| 
									
										
										
										
											2018-01-31 09:34:08 +08:00
										 |  |  | 		const showBuiltAt = optionOrLocalFallback(options.builtAt, true); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showAssets = optionOrLocalFallback(options.assets, true); | 
					
						
							| 
									
										
										
										
											2018-01-10 05:55:36 +08:00
										 |  |  | 		const showEntrypoints = optionOrLocalFallback(options.entrypoints, true); | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 		const showChunkGroups = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.chunkGroups, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showChunks = optionOrLocalFallback(options.chunks, !forToString); | 
					
						
							| 
									
										
										
										
											2017-06-09 16:31:02 +08:00
										 |  |  | 		const showChunkModules = optionOrLocalFallback(options.chunkModules, true); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showChunkOrigins = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.chunkOrigins, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showModules = optionOrLocalFallback(options.modules, true); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showNestedModules = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.nestedModules, | 
					
						
							|  |  |  | 			true | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-03-04 13:24:10 +08:00
										 |  |  | 		const showModuleAssets = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.moduleAssets, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showDepth = optionOrLocalFallback(options.depth, !forToString); | 
					
						
							|  |  |  | 		const showCachedModules = optionOrLocalFallback(options.cached, true); | 
					
						
							|  |  |  | 		const showCachedAssets = optionOrLocalFallback(options.cachedAssets, true); | 
					
						
							|  |  |  | 		const showReasons = optionOrLocalFallback(options.reasons, !forToString); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showUsedExports = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.usedExports, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		const showProvidedExports = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.providedExports, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		const showOptimizationBailout = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.optimizationBailout, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showChildren = optionOrLocalFallback(options.children, true); | 
					
						
							| 
									
										
										
										
											2018-07-15 03:28:26 +08:00
										 |  |  | 		const showSource = optionOrLocalFallback(options.source, false); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showModuleTrace = optionOrLocalFallback(options.moduleTrace, true); | 
					
						
							|  |  |  | 		const showErrors = optionOrLocalFallback(options.errors, true); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showErrorDetails = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.errorDetails, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showWarnings = optionOrLocalFallback(options.warnings, true); | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		const warningsFilter = optionsOrFallback(options.warningsFilter, null); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showPublicPath = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.publicPath, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		const excludeModules = [] | 
					
						
							|  |  |  | 			.concat(optionsOrFallback(options.excludeModules, options.exclude, [])) | 
					
						
							|  |  |  | 			.map(testAgainstGivenOption); | 
					
						
							|  |  |  | 		const excludeAssets = [] | 
					
						
							|  |  |  | 			.concat(optionsOrFallback(options.excludeAssets, [])) | 
					
						
							|  |  |  | 			.map(testAgainstGivenOption); | 
					
						
							|  |  |  | 		const maxModules = optionsOrFallback( | 
					
						
							|  |  |  | 			options.maxModules, | 
					
						
							|  |  |  | 			forToString ? 15 : Infinity | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		const sortModules = optionsOrFallback(options.modulesSort, "id"); | 
					
						
							|  |  |  | 		const sortChunks = optionsOrFallback(options.chunksSort, "id"); | 
					
						
							|  |  |  | 		const sortAssets = optionsOrFallback(options.assetsSort, ""); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const showOutputPath = optionOrLocalFallback( | 
					
						
							|  |  |  | 			options.outputPath, | 
					
						
							|  |  |  | 			!forToString | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!showCachedModules) { | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 			excludeModules.push((ident, module) => !module.built); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const createModuleFilter = () => { | 
					
						
							|  |  |  | 			let i = 0; | 
					
						
							|  |  |  | 			return module => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (excludeModules.length > 0) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					const ident = requestShortener.shorten(module.resource); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					const excluded = excludeModules.some(fn => fn(ident, module)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (excluded) return false; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 				const result = i < maxModules; | 
					
						
							|  |  |  | 				i++; | 
					
						
							|  |  |  | 				return result; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 		const createAssetFilter = () => { | 
					
						
							|  |  |  | 			return asset => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (excludeAssets.length > 0) { | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 					const ident = asset.name; | 
					
						
							|  |  |  | 					const excluded = excludeAssets.some(fn => fn(ident, asset)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (excluded) return false; | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				return showCachedAssets || asset.emitted; | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 		const sortByFieldAndOrder = (fieldKey, a, b) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (a[fieldKey] === null && b[fieldKey] === null) return 0; | 
					
						
							|  |  |  | 			if (a[fieldKey] === null) return 1; | 
					
						
							|  |  |  | 			if (b[fieldKey] === null) return -1; | 
					
						
							|  |  |  | 			if (a[fieldKey] === b[fieldKey]) return 0; | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 			return a[fieldKey] < b[fieldKey] ? -1 : 1; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const sortByField = field => (a, b) => { | 
					
						
							|  |  |  | 			if (!field) { | 
					
						
							| 
									
										
										
										
											2017-02-05 10:09:56 +08:00
										 |  |  | 				return 0; | 
					
						
							| 
									
										
										
										
											2016-12-14 19:03:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 18:40:06 +08:00
										 |  |  | 			const fieldKey = this.normalizeFieldKey(field); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 			// if a field is prefixed with a "!" the sort is reversed!
 | 
					
						
							|  |  |  | 			const sortIsRegular = this.sortOrderRegular(field); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			return sortByFieldAndOrder( | 
					
						
							|  |  |  | 				fieldKey, | 
					
						
							|  |  |  | 				sortIsRegular ? a : b, | 
					
						
							|  |  |  | 				sortIsRegular ? b : a | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const formatError = e => { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			let text = ""; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (typeof e === "string") { | 
					
						
							|  |  |  | 				e = { message: e }; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (e.chunk) { | 
					
						
							|  |  |  | 				text += `chunk ${e.chunk.name || e.chunk.id}${ | 
					
						
							|  |  |  | 					e.chunk.hasRuntime() | 
					
						
							|  |  |  | 						? " [entry]" | 
					
						
							| 
									
										
										
										
											2018-04-26 22:32:23 +08:00
										 |  |  | 						: e.chunk.canBeInitial() | 
					
						
							|  |  |  | 							? " [initial]" | 
					
						
							|  |  |  | 							: "" | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				}\n`;
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (e.file) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				text += `${e.file}\n`; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if ( | 
					
						
							|  |  |  | 				e.module && | 
					
						
							|  |  |  | 				e.module.readableIdentifier && | 
					
						
							|  |  |  | 				typeof e.module.readableIdentifier === "function" | 
					
						
							|  |  |  | 			) { | 
					
						
							| 
									
										
										
										
											2018-03-27 21:08:30 +08:00
										 |  |  | 				text += this.formatFilePath( | 
					
						
							|  |  |  | 					e.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-06-04 16:10:23 +08:00
										 |  |  | 				if (typeof e.loc === "object") { | 
					
						
							|  |  |  | 					const locInfo = formatLocation(e.loc); | 
					
						
							|  |  |  | 					if (locInfo) text += ` ${locInfo}`; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				text += "\n"; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			text += e.message; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (showErrorDetails && e.details) { | 
					
						
							|  |  |  | 				text += `\n${e.details}`; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (showErrorDetails && e.missing) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				text += e.missing.map(item => `\n[${item}]`).join(""); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showModuleTrace && e.origin) { | 
					
						
							| 
									
										
										
										
											2018-06-04 16:10:23 +08:00
										 |  |  | 				text += `\n @ ${this.formatFilePath( | 
					
						
							|  |  |  | 					e.origin.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 				)}`;
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (typeof e.originLoc === "object") { | 
					
						
							| 
									
										
										
										
											2017-10-17 15:06:05 +08:00
										 |  |  | 					const locInfo = formatLocation(e.originLoc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (locInfo) text += ` ${locInfo}`; | 
					
						
							| 
									
										
										
										
											2017-10-17 15:06:05 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (e.dependencies) { | 
					
						
							|  |  |  | 					for (const dep of e.dependencies) { | 
					
						
							|  |  |  | 						if (!dep.loc) continue; | 
					
						
							|  |  |  | 						if (typeof dep.loc === "string") continue; | 
					
						
							| 
									
										
										
										
											2017-10-17 15:06:05 +08:00
										 |  |  | 						const locInfo = formatLocation(dep.loc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (!locInfo) continue; | 
					
						
							| 
									
										
										
										
											2017-10-17 15:06:05 +08:00
										 |  |  | 						text += ` ${locInfo}`; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-10-17 15:06:05 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				let current = e.origin; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				while (current.issuer) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					current = current.issuer; | 
					
						
							|  |  |  | 					text += `\n @ ${current.readableIdentifier(requestShortener)}`; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-07-03 19:13:01 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			return text; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-08-03 17:46:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const obj = { | 
					
						
							|  |  |  | 			errors: compilation.errors.map(formatError), | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			warnings: Stats.filterWarnings( | 
					
						
							|  |  |  | 				compilation.warnings.map(formatError), | 
					
						
							|  |  |  | 				warningsFilter | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2014-08-01 21:19:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		//We just hint other renderers since actually omitting
 | 
					
						
							|  |  |  | 		//errors/warnings from the JSON would be kind of weird.
 | 
					
						
							|  |  |  | 		Object.defineProperty(obj, "_showWarnings", { | 
					
						
							|  |  |  | 			value: showWarnings, | 
					
						
							|  |  |  | 			enumerable: false | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		Object.defineProperty(obj, "_showErrors", { | 
					
						
							|  |  |  | 			value: showErrors, | 
					
						
							|  |  |  | 			enumerable: false | 
					
						
							| 
									
										
										
										
											2015-04-17 16:17:10 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-11-29 08:38:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showVersion) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.version = require("../package.json").version; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-11-29 08:38:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showHash) obj.hash = this.hash; | 
					
						
							|  |  |  | 		if (showTimings && this.startTime && this.endTime) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.time = this.endTime - this.startTime; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showBuiltAt && this.endTime) { | 
					
						
							| 
									
										
										
										
											2017-06-04 05:40:21 +08:00
										 |  |  | 			obj.builtAt = this.endTime; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showEnv && options._env) { | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 			obj.env = options._env; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (compilation.needAdditionalPass) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.needAdditionalPass = true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showPublicPath) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.publicPath = this.compilation.mainTemplate.getPublicPath({ | 
					
						
							|  |  |  | 				hash: this.compilation.hash | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showOutputPath) { | 
					
						
							| 
									
										
										
										
											2018-01-29 10:21:36 +08:00
										 |  |  | 			obj.outputPath = this.compilation.mainTemplate.outputOptions.path; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showAssets) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			const assetsByFile = {}; | 
					
						
							| 
									
										
										
										
											2017-07-26 22:03:06 +08:00
										 |  |  | 			const compilationAssets = Object.keys(compilation.assets); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.assetsByChunkName = {}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			obj.assets = compilationAssets | 
					
						
							|  |  |  | 				.map(asset => { | 
					
						
							|  |  |  | 					const obj = { | 
					
						
							|  |  |  | 						name: asset, | 
					
						
							|  |  |  | 						size: compilation.assets[asset].size(), | 
					
						
							|  |  |  | 						chunks: [], | 
					
						
							|  |  |  | 						chunkNames: [], | 
					
						
							|  |  |  | 						emitted: compilation.assets[asset].emitted | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (showPerformance) { | 
					
						
							|  |  |  | 						obj.isOverSizeLimit = compilation.assets[asset].isOverSizeLimit; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					assetsByFile[asset] = obj; | 
					
						
							|  |  |  | 					return obj; | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				.filter(createAssetFilter()); | 
					
						
							| 
									
										
										
										
											2017-07-26 22:03:06 +08:00
										 |  |  | 			obj.filteredAssets = compilationAssets.length - obj.assets.length; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			for (const chunk of compilation.chunks) { | 
					
						
							|  |  |  | 				for (const asset of chunk.files) { | 
					
						
							|  |  |  | 					if (assetsByFile[asset]) { | 
					
						
							|  |  |  | 						for (const id of chunk.ids) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 							assetsByFile[asset].chunks.push(id); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (chunk.name) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 							assetsByFile[asset].chunkNames.push(chunk.name); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 							if (obj.assetsByChunkName[chunk.name]) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								obj.assetsByChunkName[chunk.name] = [] | 
					
						
							|  |  |  | 									.concat(obj.assetsByChunkName[chunk.name]) | 
					
						
							|  |  |  | 									.concat([asset]); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 							} else { | 
					
						
							|  |  |  | 								obj.assetsByChunkName[chunk.name] = asset; | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.assets.sort(sortByField(sortAssets)); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 19:20:23 +08:00
										 |  |  | 		const fnChunkGroup = groupMap => { | 
					
						
							|  |  |  | 			const obj = {}; | 
					
						
							|  |  |  | 			for (const keyValuePair of groupMap) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 				const name = keyValuePair[0]; | 
					
						
							| 
									
										
										
										
											2018-04-21 19:20:23 +08:00
										 |  |  | 				const cg = keyValuePair[1]; | 
					
						
							|  |  |  | 				const children = cg.getChildrenByOrders(); | 
					
						
							|  |  |  | 				obj[name] = { | 
					
						
							|  |  |  | 					chunks: cg.chunks.map(c => c.id), | 
					
						
							|  |  |  | 					assets: cg.chunks.reduce( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						(array, c) => array.concat(c.files || []), | 
					
						
							|  |  |  | 						[] | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 					), | 
					
						
							|  |  |  | 					children: Object.keys(children).reduce((obj, key) => { | 
					
						
							|  |  |  | 						const groups = children[key]; | 
					
						
							|  |  |  | 						obj[key] = groups.map(group => ({ | 
					
						
							|  |  |  | 							name: group.name, | 
					
						
							|  |  |  | 							chunks: group.chunks.map(c => c.id), | 
					
						
							|  |  |  | 							assets: group.chunks.reduce( | 
					
						
							|  |  |  | 								(array, c) => array.concat(c.files || []), | 
					
						
							|  |  |  | 								[] | 
					
						
							|  |  |  | 							) | 
					
						
							|  |  |  | 						})); | 
					
						
							|  |  |  | 						return obj; | 
					
						
							|  |  |  | 					}, Object.create(null)), | 
					
						
							|  |  |  | 					childAssets: Object.keys(children).reduce((obj, key) => { | 
					
						
							|  |  |  | 						const groups = children[key]; | 
					
						
							|  |  |  | 						obj[key] = Array.from( | 
					
						
							|  |  |  | 							groups.reduce((set, group) => { | 
					
						
							|  |  |  | 								for (const chunk of group.chunks) { | 
					
						
							|  |  |  | 									for (const asset of chunk.files) { | 
					
						
							|  |  |  | 										set.add(asset); | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								return set; | 
					
						
							|  |  |  | 							}, new Set()) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 						return obj; | 
					
						
							|  |  |  | 					}, Object.create(null)) | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (showPerformance) { | 
					
						
							| 
									
										
										
										
											2018-04-21 19:20:23 +08:00
										 |  |  | 					obj[name].isOverSizeLimit = cg.isOverSizeLimit; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-04-21 19:20:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			return obj; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (showEntrypoints) { | 
					
						
							|  |  |  | 			obj.entrypoints = fnChunkGroup(compilation.entrypoints); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (showChunkGroups) { | 
					
						
							| 
									
										
										
										
											2018-04-22 19:55:10 +08:00
										 |  |  | 			obj.namedChunkGroups = fnChunkGroup(compilation.namedChunkGroups); | 
					
						
							| 
									
										
										
										
											2013-02-19 18:11:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		const fnModule = module => { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 			const path = []; | 
					
						
							|  |  |  | 			let current = module; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			while (current.issuer) { | 
					
						
							|  |  |  | 				path.push((current = current.issuer)); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			path.reverse(); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			const obj = { | 
					
						
							|  |  |  | 				id: module.id, | 
					
						
							|  |  |  | 				identifier: module.identifier(), | 
					
						
							|  |  |  | 				name: module.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 				index: module.index, | 
					
						
							|  |  |  | 				index2: module.index2, | 
					
						
							|  |  |  | 				size: module.size(), | 
					
						
							| 
									
										
										
										
											2017-12-06 19:09:17 +08:00
										 |  |  | 				cacheable: module.buildInfo.cacheable, | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				built: !!module.built, | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 				optional: module.optional, | 
					
						
							|  |  |  | 				prefetched: module.prefetched, | 
					
						
							| 
									
										
										
										
											2018-01-24 03:08:32 +08:00
										 |  |  | 				chunks: Array.from(module.chunksIterable, chunk => chunk.id), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				issuer: module.issuer && module.issuer.identifier(), | 
					
						
							|  |  |  | 				issuerId: module.issuer && module.issuer.id, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				issuerName: | 
					
						
							|  |  |  | 					module.issuer && module.issuer.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 				issuerPath: | 
					
						
							|  |  |  | 					module.issuer && | 
					
						
							|  |  |  | 					path.map(module => ({ | 
					
						
							|  |  |  | 						id: module.id, | 
					
						
							|  |  |  | 						identifier: module.identifier(), | 
					
						
							|  |  |  | 						name: module.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 						profile: module.profile | 
					
						
							|  |  |  | 					})), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				profile: module.profile, | 
					
						
							|  |  |  | 				failed: !!module.error, | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 				errors: module.errors ? module.errors.length : 0, | 
					
						
							|  |  |  | 				warnings: module.warnings ? module.warnings.length : 0 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2018-03-04 13:24:10 +08:00
										 |  |  | 			if (showModuleAssets) { | 
					
						
							|  |  |  | 				obj.assets = Object.keys(module.buildInfo.assets || {}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showReasons) { | 
					
						
							|  |  |  | 				obj.reasons = module.reasons | 
					
						
							| 
									
										
										
										
											2018-07-20 01:44:44 +08:00
										 |  |  | 					.sort((a, b) => { | 
					
						
							|  |  |  | 						if (a.module && !b.module) return -1; | 
					
						
							|  |  |  | 						if (!a.module && b.module) return 1; | 
					
						
							|  |  |  | 						if (a.module && b.module) { | 
					
						
							|  |  |  | 							const cmp = compareId(a.module.id, b.module.id); | 
					
						
							|  |  |  | 							if (cmp) return cmp; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if (a.dependency && !b.dependency) return -1; | 
					
						
							|  |  |  | 						if (!a.dependency && b.dependency) return 1; | 
					
						
							|  |  |  | 						if (a.dependency && b.dependency) { | 
					
						
							|  |  |  | 							const cmp = compareLocations(a.dependency.loc, b.dependency.loc); | 
					
						
							|  |  |  | 							if (cmp) return cmp; | 
					
						
							|  |  |  | 							if (a.dependency.type < b.dependency.type) return -1; | 
					
						
							|  |  |  | 							if (a.dependency.type > b.dependency.type) return 1; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						return 0; | 
					
						
							|  |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					.map(reason => { | 
					
						
							|  |  |  | 						const obj = { | 
					
						
							|  |  |  | 							moduleId: reason.module ? reason.module.id : null, | 
					
						
							|  |  |  | 							moduleIdentifier: reason.module | 
					
						
							|  |  |  | 								? reason.module.identifier() | 
					
						
							|  |  |  | 								: null, | 
					
						
							|  |  |  | 							module: reason.module | 
					
						
							|  |  |  | 								? reason.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 								: null, | 
					
						
							|  |  |  | 							moduleName: reason.module | 
					
						
							|  |  |  | 								? reason.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 								: null, | 
					
						
							|  |  |  | 							type: reason.dependency ? reason.dependency.type : null, | 
					
						
							| 
									
										
										
										
											2018-05-29 19:45:32 +08:00
										 |  |  | 							explanation: reason.explanation, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							userRequest: reason.dependency | 
					
						
							|  |  |  | 								? reason.dependency.userRequest | 
					
						
							|  |  |  | 								: null | 
					
						
							|  |  |  | 						}; | 
					
						
							|  |  |  | 						if (reason.dependency) { | 
					
						
							|  |  |  | 							const locInfo = formatLocation(reason.dependency.loc); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 							if (locInfo) { | 
					
						
							|  |  |  | 								obj.loc = locInfo; | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 						return obj; | 
					
						
							| 
									
										
										
										
											2018-07-20 01:44:44 +08:00
										 |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showUsedExports) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				if (module.used === true) { | 
					
						
							|  |  |  | 					obj.usedExports = module.usedExports; | 
					
						
							|  |  |  | 				} else if (module.used === false) { | 
					
						
							|  |  |  | 					obj.usedExports = false; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showProvidedExports) { | 
					
						
							|  |  |  | 				obj.providedExports = Array.isArray(module.buildMeta.providedExports) | 
					
						
							|  |  |  | 					? module.buildMeta.providedExports | 
					
						
							|  |  |  | 					: null; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showOptimizationBailout) { | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 				obj.optimizationBailout = module.optimizationBailout.map(item => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (typeof item === "function") return item(requestShortener); | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 					return item; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showDepth) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				obj.depth = module.depth; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showNestedModules) { | 
					
						
							|  |  |  | 				if (module.modules) { | 
					
						
							| 
									
										
										
										
											2017-12-19 02:01:43 +08:00
										 |  |  | 					const modules = module.modules; | 
					
						
							|  |  |  | 					obj.modules = modules | 
					
						
							|  |  |  | 						.sort(sortByField("depth")) | 
					
						
							|  |  |  | 						.filter(createModuleFilter()) | 
					
						
							|  |  |  | 						.map(fnModule); | 
					
						
							|  |  |  | 					obj.filteredModules = modules.length - obj.modules.length; | 
					
						
							|  |  |  | 					obj.modules.sort(sortByField(sortModules)); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (showSource && module._source) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				obj.source = module._source.source(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return obj; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showChunks) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.chunks = compilation.chunks.map(chunk => { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 				const parents = new Set(); | 
					
						
							|  |  |  | 				const children = new Set(); | 
					
						
							|  |  |  | 				const siblings = new Set(); | 
					
						
							| 
									
										
										
										
											2018-04-17 14:56:40 +08:00
										 |  |  | 				const childIdByOrder = chunk.getChildIdsByOrders(); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const chunkGroup of chunk.groupsIterable) { | 
					
						
							|  |  |  | 					for (const parentGroup of chunkGroup.parentsIterable) { | 
					
						
							|  |  |  | 						for (const chunk of parentGroup.chunks) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 							parents.add(chunk.id); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					for (const childGroup of chunkGroup.childrenIterable) { | 
					
						
							|  |  |  | 						for (const chunk of childGroup.chunks) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 							children.add(chunk.id); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					for (const sibling of chunkGroup.chunks) { | 
					
						
							|  |  |  | 						if (sibling !== chunk) siblings.add(sibling.id); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				const obj = { | 
					
						
							|  |  |  | 					id: chunk.id, | 
					
						
							|  |  |  | 					rendered: chunk.rendered, | 
					
						
							| 
									
										
										
										
											2018-01-22 19:15:58 +08:00
										 |  |  | 					initial: chunk.canBeInitial(), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					entry: chunk.hasRuntime(), | 
					
						
							|  |  |  | 					recorded: chunk.recorded, | 
					
						
							| 
									
										
										
										
											2018-01-09 16:40:30 +08:00
										 |  |  | 					reason: chunk.chunkReason, | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 					size: chunk.modulesSize(), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					names: chunk.name ? [chunk.name] : [], | 
					
						
							|  |  |  | 					files: chunk.files.slice(), | 
					
						
							|  |  |  | 					hash: chunk.renderedHash, | 
					
						
							| 
									
										
										
										
											2018-07-10 16:24:04 +08:00
										 |  |  | 					siblings: Array.from(siblings).sort(compareId), | 
					
						
							|  |  |  | 					parents: Array.from(parents).sort(compareId), | 
					
						
							|  |  |  | 					children: Array.from(children).sort(compareId), | 
					
						
							| 
									
										
										
										
											2018-04-17 14:56:40 +08:00
										 |  |  | 					childrenByOrder: childIdByOrder | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (showChunkModules) { | 
					
						
							| 
									
										
										
										
											2017-04-21 16:05:56 +08:00
										 |  |  | 					obj.modules = chunk | 
					
						
							| 
									
										
										
										
											2017-05-20 20:46:21 +08:00
										 |  |  | 						.getModules() | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						.sort(sortByField("depth")) | 
					
						
							|  |  |  | 						.filter(createModuleFilter()) | 
					
						
							|  |  |  | 						.map(fnModule); | 
					
						
							| 
									
										
										
										
											2017-04-21 16:05:56 +08:00
										 |  |  | 					obj.filteredModules = chunk.getNumberOfModules() - obj.modules.length; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					obj.modules.sort(sortByField(sortModules)); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (showChunkOrigins) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					obj.origins = Array.from(chunk.groupsIterable, g => g.origins) | 
					
						
							|  |  |  | 						.reduce((a, b) => a.concat(b), []) | 
					
						
							|  |  |  | 						.map(origin => ({ | 
					
						
							|  |  |  | 							moduleId: origin.module ? origin.module.id : undefined, | 
					
						
							|  |  |  | 							module: origin.module ? origin.module.identifier() : "", | 
					
						
							|  |  |  | 							moduleIdentifier: origin.module ? origin.module.identifier() : "", | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							moduleName: origin.module | 
					
						
							|  |  |  | 								? origin.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 								: "", | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 							loc: formatLocation(origin.loc), | 
					
						
							|  |  |  | 							request: origin.request, | 
					
						
							|  |  |  | 							reasons: origin.reasons || [] | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						})) | 
					
						
							|  |  |  | 						.sort((a, b) => { | 
					
						
							|  |  |  | 							if ( | 
					
						
							|  |  |  | 								typeof a.moduleId === "number" && | 
					
						
							|  |  |  | 								typeof b.moduleId !== "number" | 
					
						
							|  |  |  | 							) | 
					
						
							|  |  |  | 								return 1; | 
					
						
							|  |  |  | 							if ( | 
					
						
							|  |  |  | 								typeof a.moduleId !== "number" && | 
					
						
							|  |  |  | 								typeof b.moduleId === "number" | 
					
						
							|  |  |  | 							) | 
					
						
							|  |  |  | 								return -1; | 
					
						
							|  |  |  | 							if ( | 
					
						
							|  |  |  | 								typeof a.moduleId === "number" && | 
					
						
							|  |  |  | 								typeof b.moduleId === "number" | 
					
						
							|  |  |  | 							) { | 
					
						
							| 
									
										
										
										
											2018-02-17 16:46:57 +08:00
										 |  |  | 								const diffId = a.moduleId - b.moduleId; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								if (diffId !== 0) return diffId; | 
					
						
							| 
									
										
										
										
											2018-02-17 16:46:57 +08:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							if (a.loc < b.loc) return -1; | 
					
						
							|  |  |  | 							if (a.loc > b.loc) return 1; | 
					
						
							| 
									
										
										
										
											2018-02-17 16:46:57 +08:00
										 |  |  | 							return 0; | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				return obj; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			obj.chunks.sort(sortByField(sortChunks)); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showModules) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			obj.modules = compilation.modules | 
					
						
							|  |  |  | 				.slice() | 
					
						
							|  |  |  | 				.sort(sortByField("depth")) | 
					
						
							|  |  |  | 				.filter(createModuleFilter()) | 
					
						
							|  |  |  | 				.map(fnModule); | 
					
						
							|  |  |  | 			obj.filteredModules = compilation.modules.length - obj.modules.length; | 
					
						
							|  |  |  | 			obj.modules.sort(sortByField(sortModules)); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (showChildren) { | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 			obj.children = compilation.children.map((child, idx) => { | 
					
						
							|  |  |  | 				const childOptions = Stats.getChildOptions(options, idx); | 
					
						
							|  |  |  | 				const obj = new Stats(child).toJson(childOptions, forToString); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				delete obj.hash; | 
					
						
							|  |  |  | 				delete obj.version; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				if (child.name) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					obj.name = identifierUtils.makePathsRelative( | 
					
						
							|  |  |  | 						context, | 
					
						
							|  |  |  | 						child.name, | 
					
						
							|  |  |  | 						compilation.cache | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				return obj; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return obj; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-11-05 02:43:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	toString(options) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof options === "boolean" || typeof options === "string") { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			options = Stats.presetToOptions(options); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (!options) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			options = {}; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		const useColors = optionsOrFallback(options.colors, false); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const obj = this.toJson(options, true); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		return Stats.jsonToString(obj, useColors); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	static jsonToString(obj, useColors) { | 
					
						
							|  |  |  | 		const buf = []; | 
					
						
							| 
									
										
										
										
											2016-11-04 07:03:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const defaultColors = { | 
					
						
							|  |  |  | 			bold: "\u001b[1m", | 
					
						
							|  |  |  | 			yellow: "\u001b[1m\u001b[33m", | 
					
						
							|  |  |  | 			red: "\u001b[1m\u001b[31m", | 
					
						
							|  |  |  | 			green: "\u001b[1m\u001b[32m", | 
					
						
							|  |  |  | 			cyan: "\u001b[1m\u001b[36m", | 
					
						
							|  |  |  | 			magenta: "\u001b[1m\u001b[35m" | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const colors = Object.keys(defaultColors).reduce( | 
					
						
							|  |  |  | 			(obj, color) => { | 
					
						
							|  |  |  | 				obj[color] = str => { | 
					
						
							|  |  |  | 					if (useColors) { | 
					
						
							|  |  |  | 						buf.push( | 
					
						
							|  |  |  | 							useColors === true || useColors[color] === undefined | 
					
						
							|  |  |  | 								? defaultColors[color] | 
					
						
							|  |  |  | 								: useColors[color] | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					buf.push(str); | 
					
						
							|  |  |  | 					if (useColors) { | 
					
						
							|  |  |  | 						buf.push("\u001b[39m\u001b[22m"); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				return obj; | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				normal: str => buf.push(str) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const coloredTime = time => { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			let times = [800, 400, 200, 100]; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (obj.time) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				times = [obj.time / 2, obj.time / 4, obj.time / 8, obj.time / 16]; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (time < times[3]) colors.normal(`${time}ms`); | 
					
						
							|  |  |  | 			else if (time < times[2]) colors.bold(`${time}ms`); | 
					
						
							|  |  |  | 			else if (time < times[1]) colors.green(`${time}ms`); | 
					
						
							|  |  |  | 			else if (time < times[0]) colors.yellow(`${time}ms`); | 
					
						
							|  |  |  | 			else colors.red(`${time}ms`); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2016-11-23 02:11:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const newline = () => buf.push("\n"); | 
					
						
							| 
									
										
										
										
											2016-11-04 06:55:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const getText = (arr, row, col) => { | 
					
						
							|  |  |  | 			return arr[row][col].value; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2016-11-05 05:08:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const table = (array, align, splitter) => { | 
					
						
							|  |  |  | 			const rows = array.length; | 
					
						
							|  |  |  | 			const cols = array[0].length; | 
					
						
							|  |  |  | 			const colSizes = new Array(cols); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			for (let col = 0; col < cols; col++) { | 
					
						
							|  |  |  | 				colSizes[col] = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			for (let row = 0; row < rows; row++) { | 
					
						
							|  |  |  | 				for (let col = 0; col < cols; col++) { | 
					
						
							| 
									
										
										
										
											2017-02-05 08:40:15 +08:00
										 |  |  | 					const value = `${getText(array, row, col)}`; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (value.length > colSizes[col]) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colSizes[col] = value.length; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-12-14 18:50:44 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			for (let row = 0; row < rows; row++) { | 
					
						
							|  |  |  | 				for (let col = 0; col < cols; col++) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					const format = array[row][col].color; | 
					
						
							| 
									
										
										
										
											2017-02-05 08:40:15 +08:00
										 |  |  | 					const value = `${getText(array, row, col)}`; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					let l = value.length; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					if (align[col] === "l") { | 
					
						
							|  |  |  | 						format(value); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					for (; l < colSizes[col] && col !== cols - 1; l++) { | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if (align[col] === "r") { | 
					
						
							|  |  |  | 						format(value); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if (col + 1 < cols && colSizes[col] !== 0) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colors.normal(splitter || "  "); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2013-05-10 00:17:28 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const getAssetColor = (asset, defaultColor) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (asset.isOverSizeLimit) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				return colors.yellow; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return defaultColor; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.hash) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			colors.normal("Hash: "); | 
					
						
							|  |  |  | 			colors.bold(obj.hash); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.version) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			colors.normal("Version: webpack "); | 
					
						
							|  |  |  | 			colors.bold(obj.version); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof obj.time === "number") { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			colors.normal("Time: "); | 
					
						
							|  |  |  | 			colors.bold(obj.time); | 
					
						
							|  |  |  | 			colors.normal("ms"); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof obj.builtAt === "number") { | 
					
						
							| 
									
										
										
										
											2018-01-31 09:34:08 +08:00
										 |  |  | 			const builtAtDate = new Date(obj.builtAt); | 
					
						
							| 
									
										
										
										
											2018-01-29 04:36:26 +08:00
										 |  |  | 			colors.normal("Built at: "); | 
					
						
							| 
									
										
										
										
											2018-03-05 15:38:32 +08:00
										 |  |  | 			colors.normal( | 
					
						
							| 
									
										
										
										
											2018-04-11 03:32:12 +08:00
										 |  |  | 				builtAtDate.toLocaleDateString(undefined, { | 
					
						
							| 
									
										
										
										
											2018-03-05 15:38:32 +08:00
										 |  |  | 					day: "2-digit", | 
					
						
							|  |  |  | 					month: "2-digit", | 
					
						
							|  |  |  | 					year: "numeric" | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-01-31 09:34:08 +08:00
										 |  |  | 			colors.normal(" "); | 
					
						
							|  |  |  | 			colors.bold(builtAtDate.toLocaleTimeString()); | 
					
						
							| 
									
										
										
										
											2018-01-29 04:36:26 +08:00
										 |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.env) { | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 			colors.normal("Environment (--env): "); | 
					
						
							|  |  |  | 			colors.bold(JSON.stringify(obj.env, null, 2)); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.publicPath) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			colors.normal("PublicPath: "); | 
					
						
							|  |  |  | 			colors.bold(obj.publicPath); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.assets && obj.assets.length > 0) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			const t = [ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				[ | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "Asset", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "Size", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "Chunks", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: "Chunk Names", | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				] | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			]; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			for (const asset of obj.assets) { | 
					
						
							|  |  |  | 				t.push([ | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: asset.name, | 
					
						
							|  |  |  | 						color: getAssetColor(asset, colors.green) | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2018-07-27 04:37:21 +08:00
										 |  |  | 						value: formatSize(asset.size), | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						color: getAssetColor(asset, colors.normal) | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: asset.chunks.join(", "), | 
					
						
							|  |  |  | 						color: colors.bold | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: asset.emitted ? "[emitted]" : "", | 
					
						
							|  |  |  | 						color: colors.green | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: asset.isOverSizeLimit ? "[big]" : "", | 
					
						
							|  |  |  | 						color: getAssetColor(asset, colors.normal) | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						value: asset.chunkNames.join(", "), | 
					
						
							|  |  |  | 						color: colors.normal | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				]); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			table(t, "rrrlll"); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.filteredAssets > 0) { | 
					
						
							| 
									
										
										
										
											2017-07-27 16:11:58 +08:00
										 |  |  | 			colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (obj.assets.length > 0) colors.normal("+ "); | 
					
						
							| 
									
										
										
										
											2017-07-27 16:11:58 +08:00
										 |  |  | 			colors.normal(obj.filteredAssets); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (obj.assets.length > 0) colors.normal(" hidden"); | 
					
						
							| 
									
										
										
										
											2017-07-27 16:11:58 +08:00
										 |  |  | 			colors.normal(obj.filteredAssets !== 1 ? " assets" : " asset"); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const processChunkGroups = (namedGroups, prefix) => { | 
					
						
							|  |  |  | 			for (const name of Object.keys(namedGroups)) { | 
					
						
							|  |  |  | 				const cg = namedGroups[name]; | 
					
						
							|  |  |  | 				colors.normal(`${prefix} `); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.bold(name); | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 				if (cg.isOverSizeLimit) { | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 					colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.yellow("[big]"); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal(" ="); | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 				for (const asset of cg.assets) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.normal(" "); | 
					
						
							|  |  |  | 					colors.green(asset); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 				for (const name of Object.keys(cg.childAssets)) { | 
					
						
							|  |  |  | 					const assets = cg.childAssets[name]; | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 					if (assets && assets.length > 0) { | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 						colors.magenta(`(${name}:`); | 
					
						
							|  |  |  | 						for (const asset of assets) { | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 							colors.green(asset); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						colors.magenta(")"); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (obj.entrypoints) { | 
					
						
							|  |  |  | 			processChunkGroups(obj.entrypoints, "Entrypoint"); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (obj.namedChunkGroups) { | 
					
						
							|  |  |  | 			let outputChunkGroups = obj.namedChunkGroups; | 
					
						
							|  |  |  | 			if (obj.entrypoints) { | 
					
						
							|  |  |  | 				outputChunkGroups = Object.keys(outputChunkGroups) | 
					
						
							|  |  |  | 					.filter(name => !obj.entrypoints[name]) | 
					
						
							|  |  |  | 					.reduce((result, name) => { | 
					
						
							|  |  |  | 						result[name] = obj.namedChunkGroups[name]; | 
					
						
							|  |  |  | 						return result; | 
					
						
							|  |  |  | 					}, {}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			processChunkGroups(outputChunkGroups, "Chunk Group"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const modulesByIdentifier = {}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.modules) { | 
					
						
							|  |  |  | 			for (const module of obj.modules) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				modulesByIdentifier[`$${module.identifier}`] = module; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (obj.chunks) { | 
					
						
							|  |  |  | 			for (const chunk of obj.chunks) { | 
					
						
							|  |  |  | 				if (chunk.modules) { | 
					
						
							|  |  |  | 					for (const module of chunk.modules) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						modulesByIdentifier[`$${module.identifier}`] = module; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-05-08 20:47:13 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const processModuleAttributes = module => { | 
					
						
							| 
									
										
										
										
											2015-11-09 18:33:32 +08:00
										 |  |  | 			colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2018-07-27 04:37:21 +08:00
										 |  |  | 			colors.normal(formatSize(module.size)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.chunks) { | 
					
						
							|  |  |  | 				for (const chunk of module.chunks) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.normal(" {"); | 
					
						
							|  |  |  | 					colors.yellow(chunk); | 
					
						
							|  |  |  | 					colors.normal("}"); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (typeof module.depth === "number") { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal(` [depth ${module.depth}]`); | 
					
						
							| 
									
										
										
										
											2013-05-08 19:28:54 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.cacheable === false) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.red(" [not cacheable]"); | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.optional) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.yellow(" [optional]"); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.built) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.green(" [built]"); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-03-04 13:24:10 +08:00
										 |  |  | 			if (module.assets && module.assets.length) { | 
					
						
							| 
									
										
										
										
											2018-03-05 17:12:40 +08:00
										 |  |  | 				colors.magenta( | 
					
						
							|  |  |  | 					` [${module.assets.length} asset${ | 
					
						
							|  |  |  | 						module.assets.length === 1 ? "" : "s" | 
					
						
							|  |  |  | 					}]`
 | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-03-04 13:24:10 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.prefetched) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.magenta(" [prefetched]"); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.failed) colors.red(" [failed]"); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (module.warnings) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				colors.yellow( | 
					
						
							|  |  |  | 					` [${module.warnings} warning${module.warnings === 1 ? "" : "s"}]` | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (module.errors) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				colors.red( | 
					
						
							|  |  |  | 					` [${module.errors} error${module.errors === 1 ? "" : "s"}]` | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const processModuleContent = (module, prefix) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (Array.isArray(module.providedExports)) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				if (module.providedExports.length === 0) { | 
					
						
							|  |  |  | 					colors.cyan("[no exports]"); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					colors.cyan(`[exports: ${module.providedExports.join(", ")}]`); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				newline(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.usedExports !== undefined) { | 
					
						
							|  |  |  | 				if (module.usedExports !== true) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2018-04-10 15:13:58 +08:00
										 |  |  | 					if (module.usedExports === null) { | 
					
						
							| 
									
										
										
										
											2017-12-14 17:57:33 +08:00
										 |  |  | 						colors.cyan("[used exports unknown]"); | 
					
						
							| 
									
										
										
										
											2018-04-10 15:13:58 +08:00
										 |  |  | 					} else if (module.usedExports === false) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colors.cyan("[no exports used]"); | 
					
						
							| 
									
										
										
										
											2018-04-10 15:13:58 +08:00
										 |  |  | 					} else if ( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						Array.isArray(module.usedExports) && | 
					
						
							|  |  |  | 						module.usedExports.length === 0 | 
					
						
							| 
									
										
										
										
											2018-04-10 15:13:58 +08:00
										 |  |  | 					) { | 
					
						
							| 
									
										
										
										
											2017-12-14 17:57:33 +08:00
										 |  |  | 						colors.cyan("[no exports used]"); | 
					
						
							| 
									
										
										
										
											2018-04-10 15:13:58 +08:00
										 |  |  | 					} else if (Array.isArray(module.usedExports)) { | 
					
						
							|  |  |  | 						const providedExportsCount = Array.isArray(module.providedExports) | 
					
						
							|  |  |  | 							? module.providedExports.length | 
					
						
							|  |  |  | 							: null; | 
					
						
							|  |  |  | 						if ( | 
					
						
							|  |  |  | 							providedExportsCount !== null && | 
					
						
							|  |  |  | 							providedExportsCount === module.usedExports.length | 
					
						
							|  |  |  | 						) { | 
					
						
							|  |  |  | 							colors.cyan("[all exports used]"); | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							colors.cyan( | 
					
						
							|  |  |  | 								`[only some exports used: ${module.usedExports.join(", ")}]` | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					newline(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (Array.isArray(module.optimizationBailout)) { | 
					
						
							|  |  |  | 				for (const item of module.optimizationBailout) { | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					colors.yellow(item); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.reasons) { | 
					
						
							|  |  |  | 				for (const reason of module.reasons) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (reason.type) { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.normal(reason.type); | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (reason.userRequest) { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.cyan(reason.userRequest); | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (reason.moduleId !== null) { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.normal("["); | 
					
						
							|  |  |  | 						colors.normal(reason.moduleId); | 
					
						
							| 
									
										
										
										
											2017-11-20 21:59:18 +08:00
										 |  |  | 						colors.normal("]"); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (reason.module && reason.module !== reason.moduleId) { | 
					
						
							| 
									
										
										
										
											2017-11-20 21:59:18 +08:00
										 |  |  | 						colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.magenta(reason.module); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (reason.loc) { | 
					
						
							| 
									
										
										
										
											2015-11-09 18:33:32 +08:00
										 |  |  | 						colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colors.normal(reason.loc); | 
					
						
							| 
									
										
										
										
											2014-01-23 22:31:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-05-29 19:45:32 +08:00
										 |  |  | 					if (reason.explanation) { | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 						colors.cyan(reason.explanation); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-01-23 22:31:40 +08:00
										 |  |  | 					newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-01-23 22:31:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.profile) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal(prefix); | 
					
						
							|  |  |  | 				let sum = 0; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (module.issuerPath) { | 
					
						
							|  |  |  | 					for (const m of module.issuerPath) { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.normal("["); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 						colors.normal(m.id); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 						colors.normal("] "); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (m.profile) { | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 							const time = (m.profile.factory || 0) + (m.profile.building || 0); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 							coloredTime(time); | 
					
						
							|  |  |  | 							sum += time; | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						colors.normal("-> "); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const key of Object.keys(module.profile)) { | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 					colors.normal(`${key}:`); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					const time = module.profile[key]; | 
					
						
							|  |  |  | 					coloredTime(time); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 					colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					sum += time; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 				colors.normal("= "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				coloredTime(sum); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (module.modules) { | 
					
						
							| 
									
										
										
										
											2017-12-19 02:01:43 +08:00
										 |  |  | 				processModulesList(module, prefix + "| "); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const processModulesList = (obj, prefix) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (obj.modules) { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:25:19 +08:00
										 |  |  | 				let maxModuleId = 0; | 
					
						
							|  |  |  | 				for (const module of obj.modules) { | 
					
						
							|  |  |  | 					if (typeof module.id === "number") { | 
					
						
							|  |  |  | 						if (maxModuleId < module.id) maxModuleId = module.id; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				let contentPrefix = prefix + "    "; | 
					
						
							|  |  |  | 				if (maxModuleId >= 10) contentPrefix += " "; | 
					
						
							|  |  |  | 				if (maxModuleId >= 100) contentPrefix += " "; | 
					
						
							|  |  |  | 				if (maxModuleId >= 1000) contentPrefix += " "; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const module of obj.modules) { | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2017-11-20 21:59:18 +08:00
										 |  |  | 					const name = module.name || module.identifier; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (typeof module.id === "string" || typeof module.id === "number") { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:25:19 +08:00
										 |  |  | 						if (typeof module.id === "number") { | 
					
						
							|  |  |  | 							if (module.id < 1000 && maxModuleId >= 1000) colors.normal(" "); | 
					
						
							|  |  |  | 							if (module.id < 100 && maxModuleId >= 100) colors.normal(" "); | 
					
						
							|  |  |  | 							if (module.id < 10 && maxModuleId >= 10) colors.normal(" "); | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							if (maxModuleId >= 1000) colors.normal(" "); | 
					
						
							|  |  |  | 							if (maxModuleId >= 100) colors.normal(" "); | 
					
						
							|  |  |  | 							if (maxModuleId >= 10) colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if (name !== module.id) { | 
					
						
							|  |  |  | 							colors.normal("["); | 
					
						
							|  |  |  | 							colors.normal(module.id); | 
					
						
							|  |  |  | 							colors.normal("]"); | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							colors.normal("["); | 
					
						
							|  |  |  | 							colors.bold(module.id); | 
					
						
							|  |  |  | 							colors.normal("]"); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2017-12-19 02:01:43 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (name !== module.id) { | 
					
						
							| 
									
										
										
										
											2017-11-20 21:59:18 +08:00
										 |  |  | 						colors.bold(name); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					processModuleAttributes(module); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							| 
									
										
										
										
											2017-12-19 02:01:43 +08:00
										 |  |  | 					processModuleContent(module, contentPrefix); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (obj.filteredModules > 0) { | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					colors.normal("   "); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (obj.modules.length > 0) colors.normal(" + "); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					colors.normal(obj.filteredModules); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (obj.modules.length > 0) colors.normal(" hidden"); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					colors.normal(obj.filteredModules !== 1 ? " modules" : " module"); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.chunks) { | 
					
						
							|  |  |  | 			for (const chunk of obj.chunks) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal("chunk "); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.id < 1000) colors.normal(" "); | 
					
						
							|  |  |  | 				if (chunk.id < 100) colors.normal(" "); | 
					
						
							|  |  |  | 				if (chunk.id < 10) colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colors.normal("{"); | 
					
						
							|  |  |  | 				colors.yellow(chunk.id); | 
					
						
							|  |  |  | 				colors.normal("} "); | 
					
						
							|  |  |  | 				colors.green(chunk.files.join(", ")); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.names && chunk.names.length > 0) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.normal(" ("); | 
					
						
							|  |  |  | 					colors.normal(chunk.names.join(", ")); | 
					
						
							|  |  |  | 					colors.normal(")"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2018-07-27 04:37:21 +08:00
										 |  |  | 				colors.normal(formatSize(chunk.size)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const id of chunk.parents) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					colors.normal(" <{"); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.yellow(id); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					colors.normal("}>"); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const id of chunk.siblings) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					colors.normal(" ={"); | 
					
						
							|  |  |  | 					colors.yellow(id); | 
					
						
							|  |  |  | 					colors.normal("}="); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				for (const id of chunk.children) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 					colors.normal(" >{"); | 
					
						
							|  |  |  | 					colors.yellow(id); | 
					
						
							|  |  |  | 					colors.normal("}<"); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-04-17 14:56:40 +08:00
										 |  |  | 				if (chunk.childrenByOrder) { | 
					
						
							|  |  |  | 					for (const name of Object.keys(chunk.childrenByOrder)) { | 
					
						
							|  |  |  | 						const children = chunk.childrenByOrder[name]; | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 						colors.magenta(`(${name}:`); | 
					
						
							|  |  |  | 						for (const id of children) { | 
					
						
							|  |  |  | 							colors.normal(" {"); | 
					
						
							|  |  |  | 							colors.yellow(id); | 
					
						
							|  |  |  | 							colors.normal("}"); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						colors.magenta(")"); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.entry) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.yellow(" [entry]"); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				} else if (chunk.initial) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.yellow(" [initial]"); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.rendered) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.green(" [rendered]"); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.recorded) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					colors.green(" [recorded]"); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.reason) { | 
					
						
							| 
									
										
										
										
											2018-01-09 16:40:30 +08:00
										 |  |  | 					colors.yellow(` ${chunk.reason}`); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (chunk.origins) { | 
					
						
							|  |  |  | 					for (const origin of chunk.origins) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colors.normal("    > "); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (origin.reasons && origin.reasons.length) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 							colors.yellow(origin.reasons.join(" ")); | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (origin.request) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 							colors.normal(origin.request); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (origin.module) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 							colors.normal("["); | 
					
						
							|  |  |  | 							colors.normal(origin.moduleId); | 
					
						
							|  |  |  | 							colors.normal("] "); | 
					
						
							|  |  |  | 							const module = modulesByIdentifier[`$${origin.module}`]; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							if (module) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 								colors.bold(module.name); | 
					
						
							|  |  |  | 								colors.normal(" "); | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (origin.loc) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 							colors.normal(origin.loc); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 						newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				processModulesList(chunk, " "); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-25 11:53:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		processModulesList(obj, ""); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj._showWarnings && obj.warnings) { | 
					
						
							|  |  |  | 			for (const warning of obj.warnings) { | 
					
						
							| 
									
										
										
										
											2017-02-28 20:05:51 +08:00
										 |  |  | 				newline(); | 
					
						
							|  |  |  | 				colors.yellow(`WARNING in ${warning}`); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj._showErrors && obj.errors) { | 
					
						
							|  |  |  | 			for (const error of obj.errors) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				newline(); | 
					
						
							|  |  |  | 				colors.red(`ERROR in ${error}`); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.children) { | 
					
						
							|  |  |  | 			for (const child of obj.children) { | 
					
						
							| 
									
										
										
										
											2017-02-05 08:07:36 +08:00
										 |  |  | 				const childString = Stats.jsonToString(child, useColors); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (childString) { | 
					
						
							|  |  |  | 					if (child.name) { | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 						colors.normal("Child "); | 
					
						
							|  |  |  | 						colors.bold(child.name); | 
					
						
							|  |  |  | 						colors.normal(":"); | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						colors.normal("Child"); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 					buf.push("    "); | 
					
						
							|  |  |  | 					buf.push(childString.replace(/\n/g, "\n    ")); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (obj.needAdditionalPass) { | 
					
						
							|  |  |  | 			colors.yellow( | 
					
						
							|  |  |  | 				"Compilation needs an additional pass and will compile again." | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		while (buf[buf.length - 1] === "\n") { | 
					
						
							|  |  |  | 			buf.pop(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		return buf.join(""); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static presetToOptions(name) { | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		// Accepted values: none, errors-only, minimal, normal, detailed, verbose
 | 
					
						
							|  |  |  | 		// Any other falsy value will behave as 'none', truthy values as 'normal'
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		const pn = | 
					
						
							|  |  |  | 			(typeof name === "string" && name.toLowerCase()) || name || "none"; | 
					
						
							|  |  |  | 		switch (pn) { | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 			case "none": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			case "verbose": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					entrypoints: true, | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 					chunkGroups: true, | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					modules: false, | 
					
						
							|  |  |  | 					chunks: true, | 
					
						
							|  |  |  | 					chunkModules: true, | 
					
						
							|  |  |  | 					chunkOrigins: true, | 
					
						
							|  |  |  | 					depth: true, | 
					
						
							| 
									
										
										
										
											2017-09-26 11:56:21 +08:00
										 |  |  | 					env: true, | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					reasons: true, | 
					
						
							|  |  |  | 					usedExports: true, | 
					
						
							|  |  |  | 					providedExports: true, | 
					
						
							|  |  |  | 					optimizationBailout: true, | 
					
						
							|  |  |  | 					errorDetails: true, | 
					
						
							|  |  |  | 					publicPath: true, | 
					
						
							| 
									
										
										
										
											2018-03-14 13:52:16 +08:00
										 |  |  | 					exclude: false, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					maxModules: Infinity | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 			case "detailed": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					entrypoints: true, | 
					
						
							| 
									
										
										
										
											2018-04-23 19:41:00 +08:00
										 |  |  | 					chunkGroups: true, | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					chunks: true, | 
					
						
							|  |  |  | 					chunkModules: false, | 
					
						
							|  |  |  | 					chunkOrigins: true, | 
					
						
							|  |  |  | 					depth: true, | 
					
						
							|  |  |  | 					usedExports: true, | 
					
						
							|  |  |  | 					providedExports: true, | 
					
						
							|  |  |  | 					optimizationBailout: true, | 
					
						
							|  |  |  | 					errorDetails: true, | 
					
						
							|  |  |  | 					publicPath: true, | 
					
						
							| 
									
										
										
										
											2018-03-14 13:52:16 +08:00
										 |  |  | 					exclude: false, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					maxModules: Infinity | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 			case "minimal": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false, | 
					
						
							|  |  |  | 					modules: true, | 
					
						
							|  |  |  | 					maxModules: 0, | 
					
						
							|  |  |  | 					errors: true, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					warnings: true | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 			case "errors-only": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false, | 
					
						
							|  |  |  | 					errors: true, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					moduleTrace: true | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				return {}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-08-03 17:01:29 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	static getChildOptions(options, idx) { | 
					
						
							|  |  |  | 		let innerOptions; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (Array.isArray(options.children)) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (idx < options.children.length) { | 
					
						
							|  |  |  | 				innerOptions = options.children[idx]; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (typeof options.children === "object" && options.children) { | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 			innerOptions = options.children; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		if (typeof innerOptions === "boolean" || typeof innerOptions === "string") { | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 			innerOptions = Stats.presetToOptions(innerOptions); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (!innerOptions) { | 
					
						
							|  |  |  | 			return options; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-05 08:07:36 +08:00
										 |  |  | 		const childOptions = Object.assign({}, options); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		delete childOptions.children; // do not inherit children
 | 
					
						
							| 
									
										
										
										
											2017-02-05 08:07:36 +08:00
										 |  |  | 		return Object.assign(childOptions, innerOptions); | 
					
						
							| 
									
										
										
										
											2015-08-03 17:01:29 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = Stats; |