| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | const _ = require("lodash"); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | const path = require("path"); | 
					
						
							| 
									
										
										
										
											2020-02-13 00:13:53 +08:00
										 |  |  | const { createFsFromVolume, Volume } = require("memfs"); | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | const captureStdio = require("./helpers/captureStdio"); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-01 14:18:45 +08:00
										 |  |  | let webpack; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-19 03:35:41 +08:00
										 |  |  | describe("ProgressPlugin", function () { | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 	let stderr; | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 	let stdout; | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2019-08-01 14:18:45 +08:00
										 |  |  | 		stderr = captureStdio(process.stderr, true); | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 		stdout = captureStdio(process.stdout, true); | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 		webpack = require(".."); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 	afterEach(() => { | 
					
						
							|  |  |  | 		stderr && stderr.restore(); | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 		stdout && stdout.restore(); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	it("should not contain NaN as a percentage when it is applied to MultiCompiler", () => { | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 		const compiler = createMultiCompiler(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 			expect(stderr.toString()).toContain("%"); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 			expect(stderr.toString()).not.toContain("NaN"); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 	it("should print profile information", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler({ | 
					
						
							|  |  |  | 			profile: true | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = getLogs(stderr.toString()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			expect(logs).toContainEqual( | 
					
						
							|  |  |  | 				expect.stringMatching( | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 					/\[webpack\.Progress\] {2}| {2}| \d+ ms module ids > DeterministicModuleIdsPlugin\n$/ | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			expect(logs).toContainEqual( | 
					
						
							|  |  |  | 				expect.stringMatching( | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 					/\[webpack\.Progress\] {2}| \d+ ms building > \.\.\. entries \.\.\. dependencies \.\.\. modules\n$/ | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 			expect(logs).toContainEqual( | 
					
						
							|  |  |  | 				expect.stringMatching(/\[webpack\.Progress\] \d+ ms building\n$/) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			expect(logs).toContainEqual( | 
					
						
							|  |  |  | 				expect.stringMatching( | 
					
						
							|  |  |  | 					/\[webpack\.Progress\] {2}| \d+ ms sealing > module ids\n$/ | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			expect(logs).toContainEqual( | 
					
						
							|  |  |  | 				expect.stringMatching(/\[webpack\.Progress\] \d+ ms sealing\n$/) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-29 02:57:33 +08:00
										 |  |  | 	it("should have monotonic increasing progress", () => { | 
					
						
							|  |  |  | 		const handlerCalls = []; | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler({ | 
					
						
							|  |  |  | 			handler: (p, ...args) => { | 
					
						
							|  |  |  | 				handlerCalls.push({ value: p, text: `${p}% ${args.join(" ")}` }); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			let lastLine = handlerCalls[0]; | 
					
						
							|  |  |  | 			for (const line of handlerCalls) { | 
					
						
							|  |  |  | 				if (line.value < lastLine.value) { | 
					
						
							|  |  |  | 					throw new Error( | 
					
						
							|  |  |  | 						`Progress value is not monotonic increasing:\n${lastLine.text}\n${line.text}` | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				lastLine = line; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 	it("should not print lines longer than stderr.columns", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler(); | 
					
						
							| 
									
										
										
										
											2019-08-05 19:32:25 +08:00
										 |  |  | 		process.stderr.columns = 36; | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = getLogs(stderr.toString()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			expect(logs.length).toBeGreaterThan(20); | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 			logs.forEach(log => expect(log.length).toBeLessThanOrEqual(35)); | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 			expect(logs).toContain( | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 				"75% sealing ...mization ...nsPlugin", | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 				"trims each detail string equally" | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 			expect(logs).toContain("92% sealing asset processing"); | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 			expect(logs).toContain("100%"); | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	it("should handle when stderr.columns is undefined", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		process.stderr.columns = undefined; | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = getLogs(stderr.toString()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			expect(logs.length).toBeGreaterThan(20); | 
					
						
							|  |  |  | 			expect(_.maxBy(logs, "length").length).toBeGreaterThan(50); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2020-01-30 17:20:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-19 01:03:02 +08:00
										 |  |  | 	it("should contain the new compiler hooks", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		process.stderr.columns = undefined; | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = getLogs(stderr.toString()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 23:38:33 +08:00
										 |  |  | 			expect(logs).toContain("4% setup normal module factory"); | 
					
						
							|  |  |  | 			expect(logs).toContain("5% setup context module factory"); | 
					
						
							| 
									
										
										
										
											2020-04-19 01:03:02 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-30 17:20:48 +08:00
										 |  |  | 	it("should display all type of percentage when it is applied to SingleCompiler", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompiler({ | 
					
						
							|  |  |  | 			entries: true, | 
					
						
							|  |  |  | 			modules: true, | 
					
						
							|  |  |  | 			dependencies: true, | 
					
						
							|  |  |  | 			activeModules: true | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = stderr.toString(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ entries/)); | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ dependencies/)); | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ modules/)); | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+ active/)); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2020-04-05 16:24:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	it("should get the custom handler text from the log", () => { | 
					
						
							|  |  |  | 		const compiler = createSimpleCompilerWithCustomHandler(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return RunCompilerAsync(compiler).then(() => { | 
					
						
							|  |  |  | 			const logs = stderr.toString(); | 
					
						
							|  |  |  | 			expect(logs).toEqual( | 
					
						
							|  |  |  | 				expect.stringMatching(/\d+\/\d+ [custom test logger]/) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+ active/)); | 
					
						
							|  |  |  | 			expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ modules/)); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const createMultiCompiler = () => { | 
					
						
							|  |  |  | 	const compiler = webpack([ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			context: path.join(__dirname, "fixtures"), | 
					
						
							|  |  |  | 			entry: "./a.js" | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			context: path.join(__dirname, "fixtures"), | 
					
						
							|  |  |  | 			entry: "./b.js" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	]); | 
					
						
							| 
									
										
										
										
											2020-02-15 13:54:52 +08:00
										 |  |  | 	compiler.outputFileSystem = createFsFromVolume(new Volume()); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 	new webpack.ProgressPlugin().apply(compiler); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 	return compiler; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-30 17:20:48 +08:00
										 |  |  | const createSimpleCompiler = progressOptions => { | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 	const compiler = webpack({ | 
					
						
							|  |  |  | 		context: path.join(__dirname, "fixtures"), | 
					
						
							| 
									
										
										
										
											2020-04-16 15:37:11 +08:00
										 |  |  | 		entry: "./a.js", | 
					
						
							|  |  |  | 		infrastructureLogging: { | 
					
						
							|  |  |  | 			debug: /Progress/ | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-15 13:54:52 +08:00
										 |  |  | 	compiler.outputFileSystem = createFsFromVolume(new Volume()); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 20:00:28 +08:00
										 |  |  | 	new webpack.ProgressPlugin({ | 
					
						
							| 
									
										
										
										
											2020-01-30 17:20:48 +08:00
										 |  |  | 		activeModules: true, | 
					
						
							|  |  |  | 		...progressOptions | 
					
						
							| 
									
										
										
										
											2019-10-10 20:00:28 +08:00
										 |  |  | 	}).apply(compiler); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 	return compiler; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-05 16:24:59 +08:00
										 |  |  | const createSimpleCompilerWithCustomHandler = options => { | 
					
						
							|  |  |  | 	const compiler = webpack({ | 
					
						
							|  |  |  | 		context: path.join(__dirname, "fixtures"), | 
					
						
							|  |  |  | 		entry: "./a.js" | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	compiler.outputFileSystem = createFsFromVolume(new Volume()); | 
					
						
							|  |  |  | 	const logger = compiler.getInfrastructureLogger("custom test logger"); | 
					
						
							|  |  |  | 	new webpack.ProgressPlugin({ | 
					
						
							|  |  |  | 		activeModules: true, | 
					
						
							|  |  |  | 		...options, | 
					
						
							|  |  |  | 		handler: (...args) => logger.status(args) | 
					
						
							|  |  |  | 	}).apply(compiler); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return compiler; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-01 14:18:45 +08:00
										 |  |  | const getLogs = logsStr => logsStr.split(/\r/).filter(v => !(v === " ")); | 
					
						
							| 
									
										
										
										
											2019-06-04 06:27:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | const RunCompilerAsync = compiler => | 
					
						
							|  |  |  | 	new Promise((resolve, reject) => { | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 		compiler.run(err => { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 				reject(err); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2019-06-05 00:33:55 +08:00
										 |  |  | 				resolve(); | 
					
						
							| 
									
										
										
										
											2018-05-15 19:19:53 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); |