| 
									
										
										
										
											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"); | 
					
						
							|  |  |  | const SizeFormatHelpers = 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"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | const optionsOrFallback = function() { | 
					
						
							|  |  |  | 	let optionValues = []; | 
					
						
							|  |  |  | 	optionValues.push.apply(optionValues, arguments); | 
					
						
							|  |  |  | 	return optionValues.find(optionValue => typeof optionValue !== "undefined"); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | class Stats { | 
					
						
							|  |  |  | 	constructor(compilation) { | 
					
						
							|  |  |  | 		this.compilation = compilation; | 
					
						
							|  |  |  | 		this.hash = compilation.hash; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | 		if(!warningsFilter) { | 
					
						
							|  |  |  | 			return warnings; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// create a chain of filters
 | 
					
						
							|  |  |  | 		// if they return "true" a warning should be surpressed
 | 
					
						
							|  |  |  | 		const normalizedWarningsFilters = [].concat(warningsFilter).map(filter => { | 
					
						
							|  |  |  | 			if(typeof filter === "string") { | 
					
						
							|  |  |  | 				return warning => warning.indexOf(filter) > -1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(filter instanceof RegExp) { | 
					
						
							|  |  |  | 				return warning => filter.test(warning); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(typeof filter === "function") { | 
					
						
							|  |  |  | 				return filter; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			throw new Error(`Can only filter warnings with Strings or RegExps. (Given: ${filter})`); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return warnings.filter(warning => { | 
					
						
							|  |  |  | 			return !normalizedWarningsFilters.some(check => check(warning)); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	hasWarnings() { | 
					
						
							|  |  |  | 		return this.compilation.warnings.length > 0; | 
					
						
							| 
									
										
										
										
											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() { | 
					
						
							|  |  |  | 		return this.compilation.errors.length > 0; | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							|  |  |  | 		if(field[0] === "!") { | 
					
						
							|  |  |  | 			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) { | 
					
						
							|  |  |  | 		if(field[0] === "!") { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 	toJson(options, forToString) { | 
					
						
							|  |  |  | 		if(typeof options === "boolean" || typeof options === "string") { | 
					
						
							|  |  |  | 			options = Stats.presetToOptions(options); | 
					
						
							|  |  |  | 		} else if(!options) { | 
					
						
							|  |  |  | 			options = {}; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const optionOrLocalFallback = (v, def) => | 
					
						
							|  |  |  | 			typeof v !== "undefined" ? v : | 
					
						
							| 
									
										
										
										
											2017-07-26 20:22:47 +08:00
										 |  |  | 			typeof options.all !== "undefined" ? options.all : def; | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const testAgainstGivenOption = (item) => { | 
					
						
							|  |  |  | 			if(typeof item === "string") { | 
					
						
							|  |  |  | 				const regExp = new RegExp(`[\\\\/]${item.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")}([\\\\/]|$|!|\\?)`); // eslint-disable-line no-useless-escape
 | 
					
						
							|  |  |  | 				return ident => regExp.test(ident); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(item && typeof item === "object" && typeof item.test === "function") | 
					
						
							|  |  |  | 				return ident => item.test(ident); | 
					
						
							|  |  |  | 			if(typeof item === "function") | 
					
						
							|  |  |  | 				return item; | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const compilation = this.compilation; | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		const context = optionsOrFallback(options.context, process.cwd()); | 
					
						
							| 
									
										
										
										
											2017-07-24 19:28:33 +08:00
										 |  |  | 		const requestShortener = new RequestShortener(context); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showPerformance = optionOrLocalFallback(options.performance, true); | 
					
						
							|  |  |  | 		const showHash = optionOrLocalFallback(options.hash, true); | 
					
						
							|  |  |  | 		const showVersion = optionOrLocalFallback(options.version, true); | 
					
						
							|  |  |  | 		const showTimings = optionOrLocalFallback(options.timings, true); | 
					
						
							|  |  |  | 		const showAssets = optionOrLocalFallback(options.assets, true); | 
					
						
							|  |  |  | 		const showEntrypoints = optionOrLocalFallback(options.entrypoints, !forToString); | 
					
						
							|  |  |  | 		const showChunks = optionOrLocalFallback(options.chunks, !forToString); | 
					
						
							| 
									
										
										
										
											2017-06-09 16:31:02 +08:00
										 |  |  | 		const showChunkModules = optionOrLocalFallback(options.chunkModules, true); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showChunkOrigins = optionOrLocalFallback(options.chunkOrigins, !forToString); | 
					
						
							|  |  |  | 		const showModules = optionOrLocalFallback(options.modules, true); | 
					
						
							|  |  |  | 		const showDepth = optionOrLocalFallback(options.depth, !forToString); | 
					
						
							|  |  |  | 		const showCachedModules = optionOrLocalFallback(options.cached, true); | 
					
						
							|  |  |  | 		const showCachedAssets = optionOrLocalFallback(options.cachedAssets, true); | 
					
						
							|  |  |  | 		const showReasons = optionOrLocalFallback(options.reasons, !forToString); | 
					
						
							|  |  |  | 		const showUsedExports = optionOrLocalFallback(options.usedExports, !forToString); | 
					
						
							|  |  |  | 		const showProvidedExports = optionOrLocalFallback(options.providedExports, !forToString); | 
					
						
							|  |  |  | 		const showOptimizationBailout = optionOrLocalFallback(options.optimizationBailout, !forToString); | 
					
						
							|  |  |  | 		const showChildren = optionOrLocalFallback(options.children, true); | 
					
						
							|  |  |  | 		const showSource = optionOrLocalFallback(options.source, !forToString); | 
					
						
							|  |  |  | 		const showModuleTrace = optionOrLocalFallback(options.moduleTrace, true); | 
					
						
							|  |  |  | 		const showErrors = optionOrLocalFallback(options.errors, true); | 
					
						
							|  |  |  | 		const showErrorDetails = optionOrLocalFallback(options.errorDetails, !forToString); | 
					
						
							|  |  |  | 		const showWarnings = optionOrLocalFallback(options.warnings, true); | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		const warningsFilter = optionsOrFallback(options.warningsFilter, null); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		const showPublicPath = optionOrLocalFallback(options.publicPath, !forToString); | 
					
						
							| 
									
										
										
										
											2017-07-28 00:33:10 +08:00
										 |  |  | 		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); | 
					
						
							|  |  |  | 		const sortModules = optionsOrFallback(options.modulesSort, "id"); | 
					
						
							|  |  |  | 		const sortChunks = optionsOrFallback(options.chunksSort, "id"); | 
					
						
							|  |  |  | 		const sortAssets = optionsOrFallback(options.assetsSort, ""); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 		if(!showCachedModules) { | 
					
						
							|  |  |  | 			excludeModules.push((ident, module) => !module.built); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const createModuleFilter = () => { | 
					
						
							|  |  |  | 			let i = 0; | 
					
						
							|  |  |  | 			return module => { | 
					
						
							|  |  |  | 				if(excludeModules.length > 0) { | 
					
						
							|  |  |  | 					const ident = requestShortener.shorten(module.resource); | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 					const excluded = excludeModules.some(fn => fn(ident, module)); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					if(excluded) | 
					
						
							|  |  |  | 						return false; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return i++ < maxModules; | 
					
						
							|  |  |  | 			}; | 
					
						
							| 
									
										
										
										
											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 => { | 
					
						
							|  |  |  | 				if(excludeAssets.length > 0) { | 
					
						
							|  |  |  | 					const ident = asset.name; | 
					
						
							|  |  |  | 					const excluded = excludeAssets.some(fn => fn(ident, asset)); | 
					
						
							|  |  |  | 					if(excluded) | 
					
						
							|  |  |  | 						return false; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return showCachedAssets || asset.emitted; | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:17:20 +08:00
										 |  |  | 		const sortByFieldAndOrder = (fieldKey, a, b) => { | 
					
						
							|  |  |  | 			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; | 
					
						
							|  |  |  | 			return a[fieldKey] < b[fieldKey] ? -1 : 1; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-05 10:09:56 +08:00
										 |  |  | 		const sortByField = (field) => (a, b) => { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const formatError = (e) => { | 
					
						
							|  |  |  | 			let text = ""; | 
					
						
							|  |  |  | 			if(typeof e === "string") | 
					
						
							|  |  |  | 				e = { | 
					
						
							|  |  |  | 					message: e | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			if(e.chunk) { | 
					
						
							|  |  |  | 				text += `chunk ${e.chunk.name || e.chunk.id}${e.chunk.hasRuntime() ? " [entry]" : e.chunk.isInitial() ? " [initial]" : ""}\n`; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(e.file) { | 
					
						
							|  |  |  | 				text += `${e.file}\n`; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(e.module && e.module.readableIdentifier && typeof e.module.readableIdentifier === "function") { | 
					
						
							|  |  |  | 				text += `${e.module.readableIdentifier(requestShortener)}\n`; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			text += e.message; | 
					
						
							|  |  |  | 			if(showErrorDetails && e.details) text += `\n${e.details}`; | 
					
						
							|  |  |  | 			if(showErrorDetails && e.missing) text += e.missing.map(item => `\n[${item}]`).join(""); | 
					
						
							| 
									
										
										
										
											2017-04-28 15:20:14 +08:00
										 |  |  | 			if(showModuleTrace && e.dependencies && e.origin) { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				text += `\n @ ${e.origin.readableIdentifier(requestShortener)}`; | 
					
						
							|  |  |  | 				e.dependencies.forEach(dep => { | 
					
						
							|  |  |  | 					if(!dep.loc) return; | 
					
						
							|  |  |  | 					if(typeof dep.loc === "string") return; | 
					
						
							| 
									
										
										
										
											2017-01-10 00:11:34 +08:00
										 |  |  | 					const locInfo = formatLocation(dep.loc); | 
					
						
							|  |  |  | 					if(!locInfo) return; | 
					
						
							|  |  |  | 					text += ` ${locInfo}`; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 				let current = e.origin; | 
					
						
							|  |  |  | 				while(current.issuer) { | 
					
						
							|  |  |  | 					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), | 
					
						
							| 
									
										
										
										
											2017-02-28 20:05:51 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(showVersion) { | 
					
						
							|  |  |  | 			obj.version = require("../package.json").version; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-11-29 08:38:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(showHash) obj.hash = this.hash; | 
					
						
							|  |  |  | 		if(showTimings && this.startTime && this.endTime) { | 
					
						
							|  |  |  | 			obj.time = this.endTime - this.startTime; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(compilation.needAdditionalPass) { | 
					
						
							|  |  |  | 			obj.needAdditionalPass = true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(showPublicPath) { | 
					
						
							|  |  |  | 			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
										 |  |  | 		} | 
					
						
							|  |  |  | 		if(showAssets) { | 
					
						
							|  |  |  | 			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 = {}; | 
					
						
							| 
									
										
										
										
											2017-07-26 22:03:06 +08:00
										 |  |  | 			obj.assets = compilationAssets.map(asset => { | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				const obj = { | 
					
						
							|  |  |  | 					name: asset, | 
					
						
							|  |  |  | 					size: compilation.assets[asset].size(), | 
					
						
							|  |  |  | 					chunks: [], | 
					
						
							|  |  |  | 					chunkNames: [], | 
					
						
							|  |  |  | 					emitted: compilation.assets[asset].emitted | 
					
						
							|  |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				if(showPerformance) { | 
					
						
							|  |  |  | 					obj.isOverSizeLimit = compilation.assets[asset].isOverSizeLimit; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				assetsByFile[asset] = obj; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 				return obj; | 
					
						
							| 
									
										
										
										
											2017-07-26 17:46:31 +08:00
										 |  |  | 			}).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
										 |  |  | 
 | 
					
						
							|  |  |  | 			compilation.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 				chunk.files.forEach(asset => { | 
					
						
							|  |  |  | 					if(assetsByFile[asset]) { | 
					
						
							|  |  |  | 						chunk.ids.forEach(id => { | 
					
						
							|  |  |  | 							assetsByFile[asset].chunks.push(id); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						if(chunk.name) { | 
					
						
							|  |  |  | 							assetsByFile[asset].chunkNames.push(chunk.name); | 
					
						
							|  |  |  | 							if(obj.assetsByChunkName[chunk.name]) | 
					
						
							|  |  |  | 								obj.assetsByChunkName[chunk.name] = [].concat(obj.assetsByChunkName[chunk.name]).concat([asset]); | 
					
						
							|  |  |  | 							else | 
					
						
							|  |  |  | 								obj.assetsByChunkName[chunk.name] = asset; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +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
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(showEntrypoints) { | 
					
						
							|  |  |  | 			obj.entrypoints = {}; | 
					
						
							|  |  |  | 			Object.keys(compilation.entrypoints).forEach(name => { | 
					
						
							|  |  |  | 				const ep = compilation.entrypoints[name]; | 
					
						
							|  |  |  | 				obj.entrypoints[name] = { | 
					
						
							|  |  |  | 					chunks: ep.chunks.map(c => c.id), | 
					
						
							|  |  |  | 					assets: ep.chunks.reduce((array, c) => array.concat(c.files || []), []) | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				if(showPerformance) { | 
					
						
							|  |  |  | 					obj.entrypoints[name].isOverSizeLimit = ep.isOverSizeLimit; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-02-19 18:11:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		function fnModule(module) { | 
					
						
							|  |  |  | 			const obj = { | 
					
						
							|  |  |  | 				id: module.id, | 
					
						
							|  |  |  | 				identifier: module.identifier(), | 
					
						
							|  |  |  | 				name: module.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 				index: module.index, | 
					
						
							|  |  |  | 				index2: module.index2, | 
					
						
							|  |  |  | 				size: module.size(), | 
					
						
							|  |  |  | 				cacheable: !!module.cacheable, | 
					
						
							|  |  |  | 				built: !!module.built, | 
					
						
							|  |  |  | 				optional: !!module.optional, | 
					
						
							|  |  |  | 				prefetched: !!module.prefetched, | 
					
						
							| 
									
										
										
										
											2017-04-19 04:30:18 +08:00
										 |  |  | 				chunks: module.mapChunks(chunk => chunk.id), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				assets: Object.keys(module.assets || {}), | 
					
						
							|  |  |  | 				issuer: module.issuer && module.issuer.identifier(), | 
					
						
							|  |  |  | 				issuerId: module.issuer && module.issuer.id, | 
					
						
							|  |  |  | 				issuerName: module.issuer && module.issuer.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 				profile: module.profile, | 
					
						
							|  |  |  | 				failed: !!module.error, | 
					
						
							|  |  |  | 				errors: module.errors && module.dependenciesErrors && (module.errors.length + module.dependenciesErrors.length), | 
					
						
							|  |  |  | 				warnings: module.errors && module.dependenciesErrors && (module.warnings.length + module.dependenciesWarnings.length) | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(showReasons) { | 
					
						
							|  |  |  | 				obj.reasons = module.reasons.filter(reason => reason.dependency && reason.module).map(reason => { | 
					
						
							|  |  |  | 					const obj = { | 
					
						
							|  |  |  | 						moduleId: reason.module.id, | 
					
						
							|  |  |  | 						moduleIdentifier: reason.module.identifier(), | 
					
						
							|  |  |  | 						module: reason.module.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 						moduleName: reason.module.readableIdentifier(requestShortener), | 
					
						
							|  |  |  | 						type: reason.dependency.type, | 
					
						
							|  |  |  | 						userRequest: reason.dependency.userRequest | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2017-03-18 20:38:47 +08:00
										 |  |  | 					const locInfo = formatLocation(reason.dependency.loc); | 
					
						
							| 
									
										
										
										
											2017-01-10 00:11:34 +08:00
										 |  |  | 					if(locInfo) obj.loc = locInfo; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					return obj; | 
					
						
							|  |  |  | 				}).sort((a, b) => a.moduleId - b.moduleId); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(showUsedExports) { | 
					
						
							|  |  |  | 				obj.usedExports = module.used ? module.usedExports : false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(showProvidedExports) { | 
					
						
							|  |  |  | 				obj.providedExports = Array.isArray(module.providedExports) ? module.providedExports : null; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 			if(showOptimizationBailout) { | 
					
						
							|  |  |  | 				obj.optimizationBailout = module.optimizationBailout.map(item => { | 
					
						
							|  |  |  | 					if(typeof item === "function") return item(requestShortener); | 
					
						
							|  |  |  | 					return item; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(showDepth) { | 
					
						
							|  |  |  | 				obj.depth = module.depth; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(showSource && module._source) { | 
					
						
							|  |  |  | 				obj.source = module._source.source(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return obj; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(showChunks) { | 
					
						
							|  |  |  | 			obj.chunks = compilation.chunks.map(chunk => { | 
					
						
							|  |  |  | 				const obj = { | 
					
						
							|  |  |  | 					id: chunk.id, | 
					
						
							|  |  |  | 					rendered: chunk.rendered, | 
					
						
							|  |  |  | 					initial: chunk.isInitial(), | 
					
						
							|  |  |  | 					entry: chunk.hasRuntime(), | 
					
						
							|  |  |  | 					recorded: chunk.recorded, | 
					
						
							|  |  |  | 					extraAsync: !!chunk.extraAsync, | 
					
						
							| 
									
										
										
										
											2017-04-21 16:05:56 +08:00
										 |  |  | 					size: chunk.mapModules(m => m.size()).reduce((size, moduleSize) => size + moduleSize, 0), | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					names: chunk.name ? [chunk.name] : [], | 
					
						
							|  |  |  | 					files: chunk.files.slice(), | 
					
						
							|  |  |  | 					hash: chunk.renderedHash, | 
					
						
							|  |  |  | 					parents: chunk.parents.map(c => c.id) | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				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)); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if(showChunkOrigins) { | 
					
						
							|  |  |  | 					obj.origins = chunk.origins.map(origin => ({ | 
					
						
							| 
									
										
										
										
											2014-02-11 15:32:18 +08:00
										 |  |  | 						moduleId: origin.module ? origin.module.id : undefined, | 
					
						
							| 
									
										
										
										
											2014-01-23 22:31:40 +08:00
										 |  |  | 						module: origin.module ? origin.module.identifier() : "", | 
					
						
							| 
									
										
										
										
											2014-02-24 22:07:15 +08:00
										 |  |  | 						moduleIdentifier: origin.module ? origin.module.identifier() : "", | 
					
						
							|  |  |  | 						moduleName: origin.module ? origin.module.readableIdentifier(requestShortener) : "", | 
					
						
							| 
									
										
										
										
											2017-01-10 00:11:34 +08:00
										 |  |  | 						loc: formatLocation(origin.loc), | 
					
						
							| 
									
										
										
										
											2014-01-23 22:31:40 +08:00
										 |  |  | 						name: origin.name, | 
					
						
							|  |  |  | 						reasons: origin.reasons || [] | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					})); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return obj; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			obj.chunks.sort(sortByField(sortChunks)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(showModules) { | 
					
						
							|  |  |  | 			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)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		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; | 
					
						
							| 
									
										
										
										
											2017-07-24 19:28:33 +08:00
										 |  |  | 				if(child.name) | 
					
						
							|  |  |  | 					obj.name = identifierUtils.makePathsRelative(context, child.name, compilation.cache); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							|  |  |  | 		if(typeof options === "boolean" || typeof options === "string") { | 
					
						
							|  |  |  | 			options = Stats.presetToOptions(options); | 
					
						
							|  |  |  | 		} else if(!options) { | 
					
						
							|  |  |  | 			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" | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const colors = Object.keys(defaultColors).reduce((obj, color) => { | 
					
						
							|  |  |  | 			obj[color] = str => { | 
					
						
							|  |  |  | 				if(useColors) { | 
					
						
							|  |  |  | 					buf.push( | 
					
						
							|  |  |  | 						(useColors === true || useColors[color] === undefined) ? | 
					
						
							| 
									
										
										
										
											2017-07-26 20:22:47 +08:00
										 |  |  | 						defaultColors[color] : useColors[color] | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				buf.push(str); | 
					
						
							|  |  |  | 				if(useColors) { | 
					
						
							|  |  |  | 					buf.push("\u001b[39m\u001b[22m"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 			return obj; | 
					
						
							|  |  |  | 		}, { | 
					
						
							| 
									
										
										
										
											2017-07-26 20:22:47 +08:00
										 |  |  | 			normal: (str) => buf.push(str) | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const coloredTime = (time) => { | 
					
						
							|  |  |  | 			let times = [800, 400, 200, 100]; | 
					
						
							|  |  |  | 			if(obj.time) { | 
					
						
							|  |  |  | 				times = [obj.time / 2, obj.time / 4, obj.time / 8, obj.time / 16]; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			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); | 
					
						
							| 
									
										
										
										
											2017-02-05 08:40:15 +08:00
										 |  |  | 			for(let col = 0; col < cols; col++) | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				colSizes[col] = 0; | 
					
						
							| 
									
										
										
										
											2017-02-05 08:40:15 +08:00
										 |  |  | 			for(let row = 0; row < rows; row++) { | 
					
						
							|  |  |  | 				for(let col = 0; col < cols; col++) { | 
					
						
							|  |  |  | 					const value = `${getText(array, row, col)}`; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					if(value.length > colSizes[col]) { | 
					
						
							|  |  |  | 						colSizes[col] = value.length; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-12-14 18:50:44 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-02-05 08:40:15 +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; | 
					
						
							|  |  |  | 					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) | 
					
						
							|  |  |  | 						colors.normal(splitter || "  "); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				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) => { | 
					
						
							|  |  |  | 			if(asset.isOverSizeLimit) { | 
					
						
							|  |  |  | 				return colors.yellow; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return defaultColor; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(obj.hash) { | 
					
						
							|  |  |  | 			colors.normal("Hash: "); | 
					
						
							|  |  |  | 			colors.bold(obj.hash); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(obj.version) { | 
					
						
							|  |  |  | 			colors.normal("Version: webpack "); | 
					
						
							|  |  |  | 			colors.bold(obj.version); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(typeof obj.time === "number") { | 
					
						
							|  |  |  | 			colors.normal("Time: "); | 
					
						
							|  |  |  | 			colors.bold(obj.time); | 
					
						
							|  |  |  | 			colors.normal("ms"); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(obj.publicPath) { | 
					
						
							|  |  |  | 			colors.normal("PublicPath: "); | 
					
						
							|  |  |  | 			colors.bold(obj.publicPath); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(obj.assets && obj.assets.length > 0) { | 
					
						
							|  |  |  | 			const t = [ | 
					
						
							|  |  |  | 				[{ | 
					
						
							|  |  |  | 					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 | 
					
						
							|  |  |  | 				}] | 
					
						
							|  |  |  | 			]; | 
					
						
							|  |  |  | 			obj.assets.forEach(asset => { | 
					
						
							|  |  |  | 				t.push([{ | 
					
						
							|  |  |  | 					value: asset.name, | 
					
						
							|  |  |  | 					color: getAssetColor(asset, colors.green) | 
					
						
							|  |  |  | 				}, { | 
					
						
							|  |  |  | 					value: SizeFormatHelpers.formatSize(asset.size), | 
					
						
							|  |  |  | 					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 | 
					
						
							|  |  |  | 				}]); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			table(t, "rrrlll"); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-07-27 16:11:58 +08:00
										 |  |  | 		if(obj.filteredAssets > 0) { | 
					
						
							|  |  |  | 			colors.normal(" "); | 
					
						
							|  |  |  | 			if(obj.assets.length > 0) | 
					
						
							|  |  |  | 				colors.normal("+ "); | 
					
						
							|  |  |  | 			colors.normal(obj.filteredAssets); | 
					
						
							|  |  |  | 			if(obj.assets.length > 0) | 
					
						
							|  |  |  | 				colors.normal(" hidden"); | 
					
						
							|  |  |  | 			colors.normal(obj.filteredAssets !== 1 ? " assets" : " asset"); | 
					
						
							|  |  |  | 			newline(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(obj.entrypoints) { | 
					
						
							|  |  |  | 			Object.keys(obj.entrypoints).forEach(name => { | 
					
						
							|  |  |  | 				const ep = obj.entrypoints[name]; | 
					
						
							|  |  |  | 				colors.normal("Entrypoint "); | 
					
						
							|  |  |  | 				colors.bold(name); | 
					
						
							|  |  |  | 				if(ep.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(" ="); | 
					
						
							|  |  |  | 				ep.assets.forEach(asset => { | 
					
						
							|  |  |  | 					colors.normal(" "); | 
					
						
							|  |  |  | 					colors.green(asset); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2016-09-09 20:19:36 +08:00
										 |  |  | 				newline(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const modulesByIdentifier = {}; | 
					
						
							|  |  |  | 		if(obj.modules) { | 
					
						
							|  |  |  | 			obj.modules.forEach(module => { | 
					
						
							|  |  |  | 				modulesByIdentifier[`$${module.identifier}`] = module; | 
					
						
							| 
									
										
										
										
											2013-05-08 20:47:13 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} else if(obj.chunks) { | 
					
						
							|  |  |  | 			obj.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 				if(chunk.modules) { | 
					
						
							|  |  |  | 					chunk.modules.forEach(module => { | 
					
						
							|  |  |  | 						modulesByIdentifier[`$${module.identifier}`] = module; | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-05-08 20:47:13 +08:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		const processModuleAttributes = (module) => { | 
					
						
							| 
									
										
										
										
											2015-11-09 18:33:32 +08:00
										 |  |  | 			colors.normal(" "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			colors.normal(SizeFormatHelpers.formatSize(module.size)); | 
					
						
							|  |  |  | 			if(module.chunks) { | 
					
						
							|  |  |  | 				module.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 					colors.normal(" {"); | 
					
						
							|  |  |  | 					colors.yellow(chunk); | 
					
						
							|  |  |  | 					colors.normal("}"); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(typeof module.depth === "number") { | 
					
						
							|  |  |  | 				colors.normal(` [depth ${module.depth}]`); | 
					
						
							| 
									
										
										
										
											2013-05-08 19:28:54 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(!module.cacheable) { | 
					
						
							|  |  |  | 				colors.red(" [not cacheable]"); | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(module.optional) { | 
					
						
							|  |  |  | 				colors.yellow(" [optional]"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(module.built) { | 
					
						
							|  |  |  | 				colors.green(" [built]"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(module.prefetched) { | 
					
						
							|  |  |  | 				colors.magenta(" [prefetched]"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(module.failed) | 
					
						
							|  |  |  | 				colors.red(" [failed]"); | 
					
						
							|  |  |  | 			if(module.warnings) | 
					
						
							|  |  |  | 				colors.yellow(` [${module.warnings} warning${module.warnings === 1 ? "" : "s"}]`); | 
					
						
							|  |  |  | 			if(module.errors) | 
					
						
							|  |  |  | 				colors.red(` [${module.errors} error${module.errors === 1 ? "" : "s"}]`); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const processModuleContent = (module, prefix) => { | 
					
						
							|  |  |  | 			if(Array.isArray(module.providedExports)) { | 
					
						
							|  |  |  | 				colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2017-06-07 18:21:26 +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(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(module.usedExports !== undefined) { | 
					
						
							|  |  |  | 				if(module.usedExports !== true) { | 
					
						
							|  |  |  | 					colors.normal(prefix); | 
					
						
							| 
									
										
										
										
											2017-08-03 05:45:02 +08:00
										 |  |  | 					if(module.usedExports === false || module.usedExports.length === 0) | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 						colors.cyan("[no exports used]"); | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 						colors.cyan(`[only some exports used: ${module.usedExports.join(", ")}]`); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-05-28 21:25:07 +08:00
										 |  |  | 			if(Array.isArray(module.optimizationBailout)) { | 
					
						
							|  |  |  | 				module.optimizationBailout.forEach(item => { | 
					
						
							|  |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					colors.yellow(item); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(module.reasons) { | 
					
						
							|  |  |  | 				module.reasons.forEach(reason => { | 
					
						
							|  |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					colors.normal(reason.type); | 
					
						
							|  |  |  | 					colors.normal(" "); | 
					
						
							|  |  |  | 					colors.cyan(reason.userRequest); | 
					
						
							|  |  |  | 					colors.normal(" ["); | 
					
						
							|  |  |  | 					colors.normal(reason.moduleId); | 
					
						
							|  |  |  | 					colors.normal("] "); | 
					
						
							|  |  |  | 					colors.magenta(reason.module); | 
					
						
							|  |  |  | 					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
										 |  |  | 					} | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 			if(module.profile) { | 
					
						
							|  |  |  | 				colors.normal(prefix); | 
					
						
							|  |  |  | 				let sum = 0; | 
					
						
							|  |  |  | 				const path = []; | 
					
						
							|  |  |  | 				let current = module; | 
					
						
							|  |  |  | 				while(current.issuer) { | 
					
						
							| 
									
										
										
										
											2017-07-19 02:22:20 +08:00
										 |  |  | 					path.push(current = current.issuer); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-07-19 02:22:20 +08:00
										 |  |  | 				path.reverse().forEach(module => { | 
					
						
							| 
									
										
										
										
											2015-11-09 18:33:32 +08:00
										 |  |  | 					colors.normal("["); | 
					
						
							|  |  |  | 					colors.normal(module.id); | 
					
						
							|  |  |  | 					colors.normal("] "); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 					if(module.profile) { | 
					
						
							|  |  |  | 						const time = (module.profile.factory || 0) + (module.profile.building || 0); | 
					
						
							|  |  |  | 						coloredTime(time); | 
					
						
							|  |  |  | 						sum += time; | 
					
						
							|  |  |  | 						colors.normal(" "); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					colors.normal("->"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 				Object.keys(module.profile).forEach(key => { | 
					
						
							|  |  |  | 					colors.normal(` ${key}:`); | 
					
						
							|  |  |  | 					const time = module.profile[key]; | 
					
						
							|  |  |  | 					coloredTime(time); | 
					
						
							|  |  |  | 					sum += time; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				colors.normal(" = "); | 
					
						
							|  |  |  | 				coloredTime(sum); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											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) => { | 
					
						
							|  |  |  | 			if(obj.modules) { | 
					
						
							|  |  |  | 				obj.modules.forEach(module => { | 
					
						
							|  |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					if(module.id < 1000) colors.normal(" "); | 
					
						
							|  |  |  | 					if(module.id < 100) colors.normal(" "); | 
					
						
							|  |  |  | 					if(module.id < 10) colors.normal(" "); | 
					
						
							|  |  |  | 					colors.normal("["); | 
					
						
							|  |  |  | 					colors.normal(module.id); | 
					
						
							|  |  |  | 					colors.normal("] "); | 
					
						
							|  |  |  | 					colors.bold(module.name || module.identifier); | 
					
						
							|  |  |  | 					processModuleAttributes(module); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 					processModuleContent(module, prefix + "       "); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				if(obj.filteredModules > 0) { | 
					
						
							|  |  |  | 					colors.normal(prefix); | 
					
						
							|  |  |  | 					colors.normal("   "); | 
					
						
							|  |  |  | 					if(obj.modules.length > 0) | 
					
						
							|  |  |  | 						colors.normal(" + "); | 
					
						
							|  |  |  | 					colors.normal(obj.filteredModules); | 
					
						
							|  |  |  | 					if(obj.modules.length > 0) | 
					
						
							|  |  |  | 						colors.normal(" hidden"); | 
					
						
							|  |  |  | 					colors.normal(obj.filteredModules !== 1 ? " modules" : " module"); | 
					
						
							|  |  |  | 					newline(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(obj.chunks) { | 
					
						
							|  |  |  | 			obj.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 				colors.normal("chunk "); | 
					
						
							|  |  |  | 				if(chunk.id < 1000) colors.normal(" "); | 
					
						
							|  |  |  | 				if(chunk.id < 100) colors.normal(" "); | 
					
						
							|  |  |  | 				if(chunk.id < 10) colors.normal(" "); | 
					
						
							|  |  |  | 				colors.normal("{"); | 
					
						
							|  |  |  | 				colors.yellow(chunk.id); | 
					
						
							|  |  |  | 				colors.normal("} "); | 
					
						
							|  |  |  | 				colors.green(chunk.files.join(", ")); | 
					
						
							|  |  |  | 				if(chunk.names && chunk.names.length > 0) { | 
					
						
							|  |  |  | 					colors.normal(" ("); | 
					
						
							|  |  |  | 					colors.normal(chunk.names.join(", ")); | 
					
						
							|  |  |  | 					colors.normal(")"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				colors.normal(" "); | 
					
						
							|  |  |  | 				colors.normal(SizeFormatHelpers.formatSize(chunk.size)); | 
					
						
							|  |  |  | 				chunk.parents.forEach(id => { | 
					
						
							|  |  |  | 					colors.normal(" {"); | 
					
						
							|  |  |  | 					colors.yellow(id); | 
					
						
							|  |  |  | 					colors.normal("}"); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				if(chunk.entry) { | 
					
						
							|  |  |  | 					colors.yellow(" [entry]"); | 
					
						
							|  |  |  | 				} else if(chunk.initial) { | 
					
						
							|  |  |  | 					colors.yellow(" [initial]"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if(chunk.rendered) { | 
					
						
							|  |  |  | 					colors.green(" [rendered]"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if(chunk.recorded) { | 
					
						
							|  |  |  | 					colors.green(" [recorded]"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				newline(); | 
					
						
							|  |  |  | 				if(chunk.origins) { | 
					
						
							|  |  |  | 					chunk.origins.forEach(origin => { | 
					
						
							|  |  |  | 						colors.normal("    > "); | 
					
						
							|  |  |  | 						if(origin.reasons && origin.reasons.length) { | 
					
						
							|  |  |  | 							colors.yellow(origin.reasons.join(" ")); | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if(origin.name) { | 
					
						
							|  |  |  | 							colors.normal(origin.name); | 
					
						
							|  |  |  | 							colors.normal(" "); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if(origin.module) { | 
					
						
							|  |  |  | 							colors.normal("["); | 
					
						
							|  |  |  | 							colors.normal(origin.moduleId); | 
					
						
							|  |  |  | 							colors.normal("] "); | 
					
						
							|  |  |  | 							const module = modulesByIdentifier[`$${origin.module}`]; | 
					
						
							|  |  |  | 							if(module) { | 
					
						
							|  |  |  | 								colors.bold(module.name); | 
					
						
							|  |  |  | 								colors.normal(" "); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							if(origin.loc) { | 
					
						
							|  |  |  | 								colors.normal(origin.loc); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						newline(); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-18 05:26:38 +08:00
										 |  |  | 				processModulesList(chunk, " "); | 
					
						
							| 
									
										
										
										
											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, ""); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		if(obj._showWarnings && obj.warnings) { | 
					
						
							| 
									
										
										
										
											2017-02-28 20:05:51 +08:00
										 |  |  | 			obj.warnings.forEach(warning => { | 
					
						
							|  |  |  | 				newline(); | 
					
						
							|  |  |  | 				colors.yellow(`WARNING in ${warning}`); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if(obj._showErrors && obj.errors) { | 
					
						
							|  |  |  | 			obj.errors.forEach(error => { | 
					
						
							|  |  |  | 				newline(); | 
					
						
							|  |  |  | 				colors.red(`ERROR in ${error}`); | 
					
						
							|  |  |  | 				newline(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(obj.children) { | 
					
						
							|  |  |  | 			obj.children.forEach(child => { | 
					
						
							| 
									
										
										
										
											2017-02-05 08:07:36 +08:00
										 |  |  | 				const childString = Stats.jsonToString(child, useColors); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 				if(childString) { | 
					
						
							|  |  |  | 					if(child.name) { | 
					
						
							|  |  |  | 						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
										 |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(obj.needAdditionalPass) { | 
					
						
							|  |  |  | 			colors.yellow("Compilation needs an additional pass and will compile again."); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 01:24:55 +08:00
										 |  |  | 		while(buf[buf.length - 1] === "\n") buf.pop(); | 
					
						
							|  |  |  | 		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'
 | 
					
						
							|  |  |  | 		const pn = (typeof name === "string") && name.toLowerCase() || name || "none"; | 
					
						
							|  |  |  | 		switch(pn) { | 
					
						
							|  |  |  | 			case "none": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			case "verbose": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					entrypoints: true, | 
					
						
							|  |  |  | 					modules: false, | 
					
						
							|  |  |  | 					chunks: true, | 
					
						
							|  |  |  | 					chunkModules: true, | 
					
						
							|  |  |  | 					chunkOrigins: true, | 
					
						
							|  |  |  | 					depth: true, | 
					
						
							|  |  |  | 					reasons: true, | 
					
						
							|  |  |  | 					usedExports: true, | 
					
						
							|  |  |  | 					providedExports: true, | 
					
						
							|  |  |  | 					optimizationBailout: true, | 
					
						
							|  |  |  | 					errorDetails: true, | 
					
						
							|  |  |  | 					publicPath: true, | 
					
						
							|  |  |  | 					exclude: () => false, | 
					
						
							|  |  |  | 					maxModules: Infinity, | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			case "detailed": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					entrypoints: true, | 
					
						
							|  |  |  | 					chunks: true, | 
					
						
							|  |  |  | 					chunkModules: false, | 
					
						
							|  |  |  | 					chunkOrigins: true, | 
					
						
							|  |  |  | 					depth: true, | 
					
						
							|  |  |  | 					usedExports: true, | 
					
						
							|  |  |  | 					providedExports: true, | 
					
						
							|  |  |  | 					optimizationBailout: true, | 
					
						
							|  |  |  | 					errorDetails: true, | 
					
						
							|  |  |  | 					publicPath: true, | 
					
						
							|  |  |  | 					exclude: () => false, | 
					
						
							|  |  |  | 					maxModules: Infinity, | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			case "minimal": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false, | 
					
						
							|  |  |  | 					modules: true, | 
					
						
							|  |  |  | 					maxModules: 0, | 
					
						
							|  |  |  | 					errors: true, | 
					
						
							|  |  |  | 					warnings: true, | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			case "errors-only": | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					all: false, | 
					
						
							|  |  |  | 					errors: true, | 
					
						
							|  |  |  | 					moduleTrace: true, | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			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; | 
					
						
							|  |  |  | 		if(Array.isArray(options.children)) { | 
					
						
							|  |  |  | 			if(idx < options.children.length) | 
					
						
							|  |  |  | 				innerOptions = options.children[idx]; | 
					
						
							|  |  |  | 		} else if(typeof options.children === "object" && options.children) { | 
					
						
							|  |  |  | 			innerOptions = options.children; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(typeof innerOptions === "boolean" || typeof innerOptions === "string") | 
					
						
							|  |  |  | 			innerOptions = Stats.presetToOptions(innerOptions); | 
					
						
							|  |  |  | 		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; |