| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | const validateOptions = require("schema-utils"); | 
					
						
							|  |  |  | const schema = require("../schemas/plugins/ProgressPlugin.json"); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | const Compiler = require("./Compiler"); | 
					
						
							|  |  |  | const MultiCompiler = require("./MultiCompiler"); | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | /** @typedef {import("../declarations/plugins/ProgressPlugin").HandlerFunction} HandlerFunction */ | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | /** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginArgument} ProgressPluginArgument */ | 
					
						
							|  |  |  | /** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginOptions} ProgressPluginOptions */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const createDefaultHandler = profile => { | 
					
						
							|  |  |  | 	let lineCaretPosition = 0; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:33:37 +08:00
										 |  |  | 	let lastMessage = ""; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 	let lastState; | 
					
						
							|  |  |  | 	let lastStateTime; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const defaultHandler = (percentage, msg, ...args) => { | 
					
						
							|  |  |  | 		let state = msg; | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 		const details = args.filter(v => v.length); | 
					
						
							|  |  |  | 		const maxLineLength = process.stderr.columns || Infinity; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (percentage < 1) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			percentage = Math.floor(percentage * 100); | 
					
						
							|  |  |  | 			msg = `${percentage}% ${msg}`; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (percentage < 100) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				msg = ` ${msg}`; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (percentage < 10) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				msg = ` ${msg}`; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (details.length) { | 
					
						
							|  |  |  | 				const maxTotalDetailsLength = maxLineLength - msg.length; | 
					
						
							|  |  |  | 				const totalDetailsLength = details.reduce( | 
					
						
							|  |  |  | 					(a, b) => a + b.length, | 
					
						
							|  |  |  | 					details.length // account for added space before each detail text
 | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				const maxDetailLength = | 
					
						
							|  |  |  | 					totalDetailsLength < maxTotalDetailsLength | 
					
						
							|  |  |  | 						? Infinity | 
					
						
							|  |  |  | 						: Math.floor(maxTotalDetailsLength / details.length); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				for (let detail of details) { | 
					
						
							|  |  |  | 					if (!detail) continue; | 
					
						
							|  |  |  | 					if (detail.length + 1 > maxDetailLength) { | 
					
						
							|  |  |  | 						const truncatePrefix = "..."; | 
					
						
							|  |  |  | 						detail = `${truncatePrefix}${detail.substr( | 
					
						
							|  |  |  | 							-(maxDetailLength - truncatePrefix.length - 1) | 
					
						
							|  |  |  | 						)}`;
 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					msg += ` ${detail}`; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (profile) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			state = state.replace(/^\d+\/\d+\s+/, ""); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (percentage === 0) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				lastState = null; | 
					
						
							|  |  |  | 				lastStateTime = Date.now(); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			} else if (state !== lastState || percentage === 1) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				const now = Date.now(); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (lastState) { | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:18 +08:00
										 |  |  | 					const diff = now - lastStateTime; | 
					
						
							|  |  |  | 					if (diff >= 1) { | 
					
						
							|  |  |  | 						const stateMsg = `${diff}ms ${lastState}`; | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 						goToLineStartAndWrite(stateMsg); | 
					
						
							|  |  |  | 						process.stderr.write("\n"); | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:18 +08:00
										 |  |  | 						lineCaretPosition = 0; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				lastState = state; | 
					
						
							|  |  |  | 				lastStateTime = now; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-11-04 17:33:37 +08:00
										 |  |  | 		if (lastMessage !== msg) { | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 			msg = msg.substring(0, maxLineLength); | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 			goToLineStartAndWrite(msg); | 
					
						
							| 
									
										
										
										
											2018-11-04 17:33:37 +08:00
										 |  |  | 			lastMessage = msg; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 	const goToLineStartAndWrite = nextMessage => { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		let str = ""; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (; lineCaretPosition > nextMessage.length; lineCaretPosition--) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			str += "\b \b"; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (var i = 0; i < lineCaretPosition; i++) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 			str += "\b"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		lineCaretPosition = nextMessage.length; | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 		if (str) process.stderr.write(str + nextMessage); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return defaultHandler; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-27 07:06:02 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @callback ReportProgress | 
					
						
							|  |  |  |  * @param {number} p | 
					
						
							|  |  |  |  * @param {...string[]} [args] | 
					
						
							|  |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {WeakMap<Compiler,ReportProgress>} */ | 
					
						
							|  |  |  | const progressReporters = new WeakMap(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | class ProgressPlugin { | 
					
						
							| 
									
										
										
										
											2018-11-27 07:06:02 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler the current compiler | 
					
						
							|  |  |  | 	 * @returns {ReportProgress} a progress reporter, if any | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	static getReporter(compiler) { | 
					
						
							|  |  |  | 		return progressReporters.get(compiler); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ProgressPluginArgument} options options | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 	constructor(options) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof options === "function") { | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 			options = { | 
					
						
							|  |  |  | 				handler: options | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 		options = options || {}; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 		validateOptions(schema, options, "Progress Plugin"); | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 		options = { ...ProgressPlugin.defaultOptions, ...options }; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 		this.profile = options.profile; | 
					
						
							|  |  |  | 		this.handler = options.handler; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 		this.modulesCount = options.modulesCount; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 		this.showEntries = options.entries; | 
					
						
							|  |  |  | 		this.showModules = options.modules; | 
					
						
							|  |  |  | 		this.showActiveModules = options.activeModules; | 
					
						
							| 
									
										
										
										
											2016-01-10 06:48:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler | MultiCompiler} compiler webpack compiler | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 	apply(compiler) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		const handler = this.handler || createDefaultHandler(this.profile); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		if (compiler instanceof MultiCompiler) { | 
					
						
							|  |  |  | 			this._applyOnMultiCompiler(compiler, handler); | 
					
						
							|  |  |  | 		} else if (compiler instanceof Compiler) { | 
					
						
							|  |  |  | 			this._applyOnCompiler(compiler, handler); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {MultiCompiler} compiler webpack multi-compiler | 
					
						
							|  |  |  | 	 * @param {HandlerFunction} handler function that executes for every progress step | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	_applyOnMultiCompiler(compiler, handler) { | 
					
						
							|  |  |  | 		const states = compiler.compilers.map(() => null); | 
					
						
							|  |  |  | 		compiler.compilers.forEach((compiler, idx) => { | 
					
						
							|  |  |  | 			new ProgressPlugin((p, msg, ...args) => { | 
					
						
							|  |  |  | 				states[idx] = [p, msg, ...args]; | 
					
						
							|  |  |  | 				handler( | 
					
						
							|  |  |  | 					states | 
					
						
							|  |  |  | 						.map(state => (state && state[0]) || 0) | 
					
						
							|  |  |  | 						.reduce((a, b) => a + b) / states.length, | 
					
						
							|  |  |  | 					`[${idx}] ${msg}`, | 
					
						
							|  |  |  | 					...args | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			}).apply(compiler); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler webpack compiler | 
					
						
							|  |  |  | 	 * @param {HandlerFunction} handler function that executes for every progress step | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	_applyOnCompiler(compiler, handler) { | 
					
						
							|  |  |  | 		const { modulesCount } = this; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 		const showEntries = this.showEntries; | 
					
						
							|  |  |  | 		const showModules = this.showModules; | 
					
						
							|  |  |  | 		const showActiveModules = this.showActiveModules; | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		let lastActiveModule = ""; | 
					
						
							|  |  |  | 		let lastModulesCount = 0; | 
					
						
							|  |  |  | 		let lastEntriesCount = 0; | 
					
						
							|  |  |  | 		let moduleCount = modulesCount; | 
					
						
							|  |  |  | 		let entriesCount = 1; | 
					
						
							|  |  |  | 		let doneModules = 0; | 
					
						
							|  |  |  | 		let doneEntries = 0; | 
					
						
							|  |  |  | 		const activeModules = new Set(); | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 		let lastUpdate = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const updateThrottled = () => { | 
					
						
							|  |  |  | 			if (lastUpdate + 500 < Date.now()) update(); | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const update = () => { | 
					
						
							|  |  |  | 			/** @type {string[]} */ | 
					
						
							|  |  |  | 			const items = []; | 
					
						
							|  |  |  | 			const percentByModules = | 
					
						
							|  |  |  | 				doneModules / Math.max(lastModulesCount, moduleCount); | 
					
						
							|  |  |  | 			const percentByEntries = | 
					
						
							|  |  |  | 				doneEntries / Math.max(lastEntriesCount, entriesCount); | 
					
						
							|  |  |  | 			const percentage = | 
					
						
							|  |  |  | 				0.1 + Math.max(percentByModules, percentByEntries) * 0.6; | 
					
						
							|  |  |  | 			if (showEntries) { | 
					
						
							|  |  |  | 				items.push(`${doneEntries}/${entriesCount} entries`); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (showModules) { | 
					
						
							|  |  |  | 				items.push(`${doneModules}/${moduleCount} modules`); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (showActiveModules) { | 
					
						
							|  |  |  | 				items.push(`${activeModules.size} active`); | 
					
						
							|  |  |  | 				items.push(lastActiveModule); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			handler(percentage, "building", ...items); | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 			lastUpdate = Date.now(); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const moduleAdd = module => { | 
					
						
							|  |  |  | 			moduleCount++; | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 			if (moduleCount % 100 === 0) updateThrottled(); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-11-22 05:59:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const moduleBuild = module => { | 
					
						
							|  |  |  | 			if (showActiveModules) { | 
					
						
							|  |  |  | 				const ident = module.identifier(); | 
					
						
							|  |  |  | 				if (ident) { | 
					
						
							|  |  |  | 					activeModules.add(ident); | 
					
						
							|  |  |  | 					lastActiveModule = ident; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			update(); | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const entryAdd = (entry, name) => { | 
					
						
							|  |  |  | 			entriesCount++; | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 			if (entriesCount % 10 === 0) updateThrottled(); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-11-22 05:59:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const moduleDone = module => { | 
					
						
							|  |  |  | 			doneModules++; | 
					
						
							|  |  |  | 			if (showActiveModules) { | 
					
						
							|  |  |  | 				const ident = module.identifier(); | 
					
						
							|  |  |  | 				if (ident) { | 
					
						
							|  |  |  | 					activeModules.delete(ident); | 
					
						
							|  |  |  | 					if (lastActiveModule === ident) { | 
					
						
							|  |  |  | 						lastActiveModule = ""; | 
					
						
							|  |  |  | 						for (const m of activeModules) { | 
					
						
							|  |  |  | 							lastActiveModule = m; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 						update(); | 
					
						
							|  |  |  | 						return; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2015-11-22 05:59:08 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-07-26 19:36:16 +08:00
										 |  |  | 			if (doneModules % 100 === 0) updateThrottled(); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		const entryDone = (entry, name) => { | 
					
						
							|  |  |  | 			doneEntries++; | 
					
						
							|  |  |  | 			update(); | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		compiler.hooks.compilation.tap("ProgressPlugin", compilation => { | 
					
						
							|  |  |  | 			if (compilation.compiler.isChild()) return; | 
					
						
							|  |  |  | 			lastModulesCount = moduleCount; | 
					
						
							|  |  |  | 			lastEntriesCount = entriesCount; | 
					
						
							|  |  |  | 			moduleCount = entriesCount = 0; | 
					
						
							|  |  |  | 			doneModules = doneEntries = 0; | 
					
						
							|  |  |  | 			handler(0, "compiling"); | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 21:47:31 +08:00
										 |  |  | 			compilation.addModuleQueue.hooks.added.tap("ProgressPlugin", moduleAdd); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			compilation.hooks.buildModule.tap("ProgressPlugin", moduleBuild); | 
					
						
							|  |  |  | 			compilation.hooks.failedModule.tap("ProgressPlugin", moduleDone); | 
					
						
							|  |  |  | 			compilation.hooks.succeedModule.tap("ProgressPlugin", moduleDone); | 
					
						
							| 
									
										
										
										
											2019-07-25 21:47:31 +08:00
										 |  |  | 			compilation.hooks.stillValidModule.tap("ProgressPlugin", moduleDone); | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			compilation.hooks.addEntry.tap("ProgressPlugin", entryAdd); | 
					
						
							|  |  |  | 			compilation.hooks.failedEntry.tap("ProgressPlugin", entryDone); | 
					
						
							|  |  |  | 			compilation.hooks.succeedEntry.tap("ProgressPlugin", entryDone); | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			const hooks = { | 
					
						
							|  |  |  | 				finishModules: "finish module graph", | 
					
						
							|  |  |  | 				seal: "sealing", | 
					
						
							|  |  |  | 				beforeChunks: "chunk graph", | 
					
						
							|  |  |  | 				afterChunks: "after chunk graph", | 
					
						
							|  |  |  | 				optimizeDependencies: "dependencies optimization", | 
					
						
							|  |  |  | 				afterOptimizeDependencies: "after dependencies optimization", | 
					
						
							|  |  |  | 				optimize: "optimizing", | 
					
						
							|  |  |  | 				optimizeModules: "module optimization", | 
					
						
							|  |  |  | 				afterOptimizeModules: "after module optimization", | 
					
						
							|  |  |  | 				optimizeChunks: "chunk optimization", | 
					
						
							|  |  |  | 				afterOptimizeChunks: "after chunk optimization", | 
					
						
							|  |  |  | 				optimizeTree: "module and chunk tree optimization", | 
					
						
							|  |  |  | 				afterOptimizeTree: "after module and chunk tree optimization", | 
					
						
							|  |  |  | 				optimizeChunkModules: "chunk modules optimization", | 
					
						
							|  |  |  | 				afterOptimizeChunkModules: "after chunk modules optimization", | 
					
						
							|  |  |  | 				reviveModules: "module reviving", | 
					
						
							|  |  |  | 				beforeModuleIds: "before module ids", | 
					
						
							|  |  |  | 				moduleIds: "module ids", | 
					
						
							|  |  |  | 				optimizeModuleIds: "module id optimization", | 
					
						
							|  |  |  | 				afterOptimizeModuleIds: "module id optimization", | 
					
						
							|  |  |  | 				reviveChunks: "chunk reviving", | 
					
						
							|  |  |  | 				beforeChunkIds: "before chunk ids", | 
					
						
							|  |  |  | 				chunkIds: "chunk ids", | 
					
						
							|  |  |  | 				optimizeChunkIds: "chunk id optimization", | 
					
						
							|  |  |  | 				afterOptimizeChunkIds: "after chunk id optimization", | 
					
						
							|  |  |  | 				recordModules: "record modules", | 
					
						
							|  |  |  | 				recordChunks: "record chunks", | 
					
						
							|  |  |  | 				beforeModuleHash: "module hashing", | 
					
						
							|  |  |  | 				beforeRuntimeRequirements: "runtime requirements", | 
					
						
							|  |  |  | 				beforeHash: "hashing", | 
					
						
							|  |  |  | 				afterHash: "after hashing", | 
					
						
							|  |  |  | 				recordHash: "record hash", | 
					
						
							|  |  |  | 				beforeModuleAssets: "module assets processing", | 
					
						
							|  |  |  | 				beforeChunkAssets: "chunk assets processing", | 
					
						
							|  |  |  | 				additionalChunkAssets: "additional chunk assets processing", | 
					
						
							|  |  |  | 				record: "recording", | 
					
						
							|  |  |  | 				additionalAssets: "additional asset processing", | 
					
						
							|  |  |  | 				optimizeChunkAssets: "chunk asset optimization", | 
					
						
							|  |  |  | 				afterOptimizeChunkAssets: "after chunk asset optimization", | 
					
						
							|  |  |  | 				optimizeAssets: "asset optimization", | 
					
						
							|  |  |  | 				afterOptimizeAssets: "after asset optimization", | 
					
						
							|  |  |  | 				afterSeal: "after seal" | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 			const numberOfHooks = Object.keys(hooks).length; | 
					
						
							|  |  |  | 			Object.keys(hooks).forEach((name, idx) => { | 
					
						
							|  |  |  | 				const title = hooks[name]; | 
					
						
							|  |  |  | 				const percentage = (idx / numberOfHooks) * 0.25 + 0.7; | 
					
						
							|  |  |  | 				compilation.hooks[name].intercept({ | 
					
						
							|  |  |  | 					name: "ProgressPlugin", | 
					
						
							|  |  |  | 					call() { | 
					
						
							|  |  |  | 						handler(percentage, title); | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					tap(tap) { | 
					
						
							|  |  |  | 						// p is percentage from 0 to 1
 | 
					
						
							|  |  |  | 						// args is any number of messages in a hierarchical matter
 | 
					
						
							|  |  |  | 						progressReporters.set(compilation.compiler, (p, ...args) => { | 
					
						
							|  |  |  | 							handler(percentage, title, tap.name, ...args); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						handler(percentage, title, tap.name); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2015-02-05 06:20:36 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.hooks.emit.intercept({ | 
					
						
							|  |  |  | 			name: "ProgressPlugin", | 
					
						
							|  |  |  | 			call() { | 
					
						
							|  |  |  | 				handler(0.95, "emitting"); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			tap(tap) { | 
					
						
							|  |  |  | 				progressReporters.set(compiler, (p, ...args) => { | 
					
						
							|  |  |  | 					handler(0.95, "emitting", tap.name, ...args); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				handler(0.95, "emitting", tap.name); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.hooks.afterEmit.intercept({ | 
					
						
							|  |  |  | 			name: "ProgressPlugin", | 
					
						
							|  |  |  | 			call() { | 
					
						
							|  |  |  | 				handler(0.98, "after emitting"); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			tap(tap) { | 
					
						
							|  |  |  | 				progressReporters.set(compiler, (p, ...args) => { | 
					
						
							|  |  |  | 					handler(0.98, "after emitting", tap.name, ...args); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				handler(0.98, "after emitting", tap.name); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compiler.hooks.done.tap("ProgressPlugin", () => { | 
					
						
							|  |  |  | 			handler(1, ""); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-11-22 05:59:08 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | ProgressPlugin.defaultOptions = { | 
					
						
							|  |  |  | 	profile: false, | 
					
						
							| 
									
										
										
										
											2018-11-04 17:27:13 +08:00
										 |  |  | 	modulesCount: 500, | 
					
						
							|  |  |  | 	modules: true, | 
					
						
							|  |  |  | 	activeModules: true, | 
					
						
							| 
									
										
										
										
											2018-11-05 17:28:37 +08:00
										 |  |  | 	entries: true | 
					
						
							| 
									
										
										
										
											2018-10-29 20:49:31 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 15:57:56 +08:00
										 |  |  | module.exports = ProgressPlugin; |