| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 20:51:52 +08:00
										 |  |  | require("./helpers/warmup-webpack"); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | const path = require("path"); | 
					
						
							| 
									
										
										
										
											2019-06-11 19:09:42 +08:00
										 |  |  | const fs = require("graceful-fs"); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | const vm = require("vm"); | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | const { pathToFileURL, URL } = require("url"); | 
					
						
							| 
									
										
										
										
											2018-10-18 04:15:46 +08:00
										 |  |  | const rimraf = require("rimraf"); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | const checkArrayExpectation = require("./checkArrayExpectation"); | 
					
						
							| 
									
										
										
										
											2018-08-02 19:05:48 +08:00
										 |  |  | const createLazyTestEnv = require("./helpers/createLazyTestEnv"); | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | const deprecationTracking = require("./helpers/deprecationTracking"); | 
					
						
							| 
									
										
										
										
											2021-01-08 21:50:15 +08:00
										 |  |  | const captureStdio = require("./helpers/captureStdio"); | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | const asModule = require("./helpers/asModule"); | 
					
						
							| 
									
										
										
										
											2022-02-15 02:31:59 +08:00
										 |  |  | const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | const casesPath = path.join(__dirname, "cases"); | 
					
						
							|  |  |  | let categories = fs.readdirSync(casesPath); | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | categories = categories.map(cat => { | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 	return { | 
					
						
							|  |  |  | 		name: cat, | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 		tests: fs | 
					
						
							|  |  |  | 			.readdirSync(path.join(casesPath, cat)) | 
					
						
							|  |  |  | 			.filter(folder => folder.indexOf("_") < 0) | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | const createLogger = appendTarget => { | 
					
						
							|  |  |  | 	return { | 
					
						
							|  |  |  | 		log: l => appendTarget.push(l), | 
					
						
							|  |  |  | 		debug: l => appendTarget.push(l), | 
					
						
							|  |  |  | 		trace: l => appendTarget.push(l), | 
					
						
							|  |  |  | 		info: l => appendTarget.push(l), | 
					
						
							|  |  |  | 		warn: console.warn.bind(console), | 
					
						
							|  |  |  | 		error: console.error.bind(console), | 
					
						
							|  |  |  | 		logTime: () => {}, | 
					
						
							|  |  |  | 		group: () => {}, | 
					
						
							|  |  |  | 		groupCollapsed: () => {}, | 
					
						
							|  |  |  | 		groupEnd: () => {}, | 
					
						
							|  |  |  | 		profile: () => {}, | 
					
						
							|  |  |  | 		profileEnd: () => {}, | 
					
						
							|  |  |  | 		clear: () => {}, | 
					
						
							|  |  |  | 		status: () => {} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | const describeCases = config => { | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 	describe(config.name, () => { | 
					
						
							| 
									
										
										
										
											2021-01-08 21:50:15 +08:00
										 |  |  | 		let stderr; | 
					
						
							|  |  |  | 		beforeEach(() => { | 
					
						
							|  |  |  | 			stderr = captureStdio(process.stderr, true); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		afterEach(() => { | 
					
						
							|  |  |  | 			stderr.restore(); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 		categories.forEach(category => { | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 			describe(category.name, function () { | 
					
						
							| 
									
										
										
										
											2018-05-18 22:34:01 +08:00
										 |  |  | 				jest.setTimeout(20000); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 				category.tests | 
					
						
							|  |  |  | 					.filter(test => { | 
					
						
							|  |  |  | 						const testDirectory = path.join(casesPath, category.name, test); | 
					
						
							|  |  |  | 						const filterPath = path.join(testDirectory, "test.filter.js"); | 
					
						
							|  |  |  | 						if (fs.existsSync(filterPath) && !require(filterPath)(config)) { | 
					
						
							| 
									
										
										
										
											2019-03-29 06:14:52 +08:00
										 |  |  | 							describe.skip(test, () => { | 
					
						
							|  |  |  | 								it("filtered", () => {}); | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 							return false; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						return true; | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					.forEach(testName => { | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 						let infraStructureLog = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 						describe(testName, () => { | 
					
						
							|  |  |  | 							const testDirectory = path.join( | 
					
						
							|  |  |  | 								casesPath, | 
					
						
							|  |  |  | 								category.name, | 
					
						
							|  |  |  | 								testName | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 							const outputDirectory = path.join( | 
					
						
							|  |  |  | 								__dirname, | 
					
						
							|  |  |  | 								"js", | 
					
						
							|  |  |  | 								config.name, | 
					
						
							|  |  |  | 								category.name, | 
					
						
							|  |  |  | 								testName | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-10-18 04:15:46 +08:00
										 |  |  | 							const cacheDirectory = path.join( | 
					
						
							|  |  |  | 								__dirname, | 
					
						
							|  |  |  | 								"js/.cache", | 
					
						
							|  |  |  | 								config.name, | 
					
						
							|  |  |  | 								category.name, | 
					
						
							|  |  |  | 								testName | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 							let testConfig = {}; | 
					
						
							|  |  |  | 							const testConfigPath = path.join(testDirectory, "test.config.js"); | 
					
						
							|  |  |  | 							if (fs.existsSync(testConfigPath)) { | 
					
						
							|  |  |  | 								testConfig = require(testConfigPath); | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 							const TerserPlugin = require("terser-webpack-plugin"); | 
					
						
							|  |  |  | 							const terserForTesting = new TerserPlugin({ | 
					
						
							|  |  |  | 								parallel: false | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2021-07-08 17:26:27 +08:00
										 |  |  | 							let options = { | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								context: casesPath, | 
					
						
							| 
									
										
										
										
											2020-07-17 16:27:48 +08:00
										 |  |  | 								entry: "./" + category.name + "/" + testName + "/", | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 								target: config.target || "async-node", | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								devtool: config.devtool, | 
					
						
							|  |  |  | 								mode: config.mode || "none", | 
					
						
							|  |  |  | 								optimization: config.mode | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 									? { | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 											emitOnErrors: true, | 
					
						
							|  |  |  | 											minimizer: [terserForTesting], | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 											...config.optimization | 
					
						
							|  |  |  | 									  } | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 									: { | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 											removeAvailableModules: true, | 
					
						
							|  |  |  | 											removeEmptyChunks: true, | 
					
						
							|  |  |  | 											mergeDuplicateChunks: true, | 
					
						
							|  |  |  | 											flagIncludedChunks: true, | 
					
						
							|  |  |  | 											sideEffects: true, | 
					
						
							|  |  |  | 											providedExports: true, | 
					
						
							|  |  |  | 											usedExports: true, | 
					
						
							|  |  |  | 											mangleExports: true, | 
					
						
							|  |  |  | 											emitOnErrors: true, | 
					
						
							|  |  |  | 											concatenateModules: false, | 
					
						
							|  |  |  | 											moduleIds: "size", | 
					
						
							|  |  |  | 											chunkIds: "size", | 
					
						
							|  |  |  | 											minimizer: [terserForTesting], | 
					
						
							| 
									
										
										
										
											2019-09-04 15:08:44 +08:00
										 |  |  | 											...config.optimization | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 									  }, | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								performance: { | 
					
						
							|  |  |  | 									hints: false | 
					
						
							|  |  |  | 								}, | 
					
						
							| 
									
										
										
										
											2019-05-22 21:54:44 +08:00
										 |  |  | 								node: { | 
					
						
							|  |  |  | 									__dirname: "mock", | 
					
						
							|  |  |  | 									__filename: "mock" | 
					
						
							|  |  |  | 								}, | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 								cache: config.cache && { | 
					
						
							|  |  |  | 									cacheDirectory, | 
					
						
							|  |  |  | 									...config.cache | 
					
						
							|  |  |  | 								}, | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								output: { | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 									pathinfo: "verbose", | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 									path: outputDirectory, | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 									filename: config.module ? "bundle.mjs" : "bundle.js" | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								}, | 
					
						
							|  |  |  | 								resolve: { | 
					
						
							|  |  |  | 									modules: ["web_modules", "node_modules"], | 
					
						
							|  |  |  | 									mainFields: [ | 
					
						
							|  |  |  | 										"webpack", | 
					
						
							|  |  |  | 										"browser", | 
					
						
							|  |  |  | 										"web", | 
					
						
							|  |  |  | 										"browserify", | 
					
						
							|  |  |  | 										["jam", "main"], | 
					
						
							|  |  |  | 										"main" | 
					
						
							|  |  |  | 									], | 
					
						
							|  |  |  | 									aliasFields: ["browser"], | 
					
						
							| 
									
										
										
										
											2020-07-17 16:27:48 +08:00
										 |  |  | 									extensions: [".webpack.js", ".web.js", ".js", ".json"] | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 								}, | 
					
						
							|  |  |  | 								resolveLoader: { | 
					
						
							|  |  |  | 									modules: [ | 
					
						
							|  |  |  | 										"web_loaders", | 
					
						
							|  |  |  | 										"web_modules", | 
					
						
							|  |  |  | 										"node_loaders", | 
					
						
							|  |  |  | 										"node_modules" | 
					
						
							|  |  |  | 									], | 
					
						
							|  |  |  | 									mainFields: ["webpackLoader", "webLoader", "loader", "main"], | 
					
						
							|  |  |  | 									extensions: [ | 
					
						
							|  |  |  | 										".webpack-loader.js", | 
					
						
							|  |  |  | 										".web-loader.js", | 
					
						
							|  |  |  | 										".loader.js", | 
					
						
							|  |  |  | 										".js" | 
					
						
							|  |  |  | 									] | 
					
						
							|  |  |  | 								}, | 
					
						
							|  |  |  | 								module: { | 
					
						
							|  |  |  | 									rules: [ | 
					
						
							|  |  |  | 										{ | 
					
						
							|  |  |  | 											test: /\.coffee$/, | 
					
						
							|  |  |  | 											loader: "coffee-loader" | 
					
						
							|  |  |  | 										}, | 
					
						
							|  |  |  | 										{ | 
					
						
							| 
									
										
										
										
											2018-05-10 15:13:17 +08:00
										 |  |  | 											test: /\.pug/, | 
					
						
							|  |  |  | 											loader: "pug-loader" | 
					
						
							| 
									
										
										
										
											2018-05-24 20:12:11 +08:00
										 |  |  | 										}, | 
					
						
							|  |  |  | 										{ | 
					
						
							|  |  |  | 											test: /\.wat$/i, | 
					
						
							|  |  |  | 											loader: "wast-loader", | 
					
						
							| 
									
										
										
										
											2019-07-15 21:03:29 +08:00
										 |  |  | 											type: "webassembly/async" | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 										} | 
					
						
							|  |  |  | 									] | 
					
						
							|  |  |  | 								}, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 								plugins: (config.plugins || []).concat(function () { | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 									this.hooks.compilation.tap("TestCasesTest", compilation => { | 
					
						
							|  |  |  | 										[ | 
					
						
							|  |  |  | 											"optimize", | 
					
						
							| 
									
										
										
										
											2018-07-31 04:30:27 +08:00
										 |  |  | 											"optimizeModules", | 
					
						
							|  |  |  | 											"optimizeChunks", | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 											"afterOptimizeTree", | 
					
						
							|  |  |  | 											"afterOptimizeAssets" | 
					
						
							|  |  |  | 										].forEach(hook => { | 
					
						
							|  |  |  | 											compilation.hooks[hook].tap("TestCasesTest", () => | 
					
						
							|  |  |  | 												compilation.checkConstraints() | 
					
						
							|  |  |  | 											); | 
					
						
							|  |  |  | 										}); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 									}); | 
					
						
							| 
									
										
										
										
											2019-06-04 17:26:04 +08:00
										 |  |  | 								}), | 
					
						
							|  |  |  | 								experiments: { | 
					
						
							| 
									
										
										
										
											2019-06-05 19:25:15 +08:00
										 |  |  | 									asyncWebAssembly: true, | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 									topLevelAwait: true, | 
					
						
							| 
									
										
										
										
											2021-11-05 16:53:32 +08:00
										 |  |  | 									backCompat: false, | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 									...(config.module ? { outputModule: true } : {}) | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 								}, | 
					
						
							|  |  |  | 								infrastructureLogging: config.cache && { | 
					
						
							|  |  |  | 									debug: true, | 
					
						
							|  |  |  | 									console: createLogger(infraStructureLog) | 
					
						
							| 
									
										
										
										
											2019-06-04 17:26:04 +08:00
										 |  |  | 								} | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 							}; | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 							const cleanups = []; | 
					
						
							|  |  |  | 							afterAll(() => { | 
					
						
							| 
									
										
										
										
											2021-07-08 17:26:27 +08:00
										 |  |  | 								options = undefined; | 
					
						
							|  |  |  | 								testConfig = undefined; | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 								for (const fn of cleanups) fn(); | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-10-18 04:15:46 +08:00
										 |  |  | 							beforeAll(done => { | 
					
						
							|  |  |  | 								rimraf(cacheDirectory, done); | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-10-25 17:18:45 +08:00
										 |  |  | 							if (config.cache) { | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 								it( | 
					
						
							|  |  |  | 									`${testName} should pre-compile to fill disk cache (1st)`, | 
					
						
							|  |  |  | 									done => { | 
					
						
							|  |  |  | 										const oldPath = options.output.path; | 
					
						
							|  |  |  | 										options.output.path = path.join( | 
					
						
							|  |  |  | 											options.output.path, | 
					
						
							|  |  |  | 											"cache1" | 
					
						
							|  |  |  | 										); | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 										infraStructureLog.length = 0; | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 										const deprecationTracker = deprecationTracking.start(); | 
					
						
							| 
									
										
										
										
											2021-07-08 17:26:27 +08:00
										 |  |  | 										const webpack = require(".."); | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 										webpack(options, err => { | 
					
						
							|  |  |  | 											deprecationTracker(); | 
					
						
							|  |  |  | 											options.output.path = oldPath; | 
					
						
							|  |  |  | 											if (err) return done(err); | 
					
						
							| 
									
										
										
										
											2022-02-15 02:31:59 +08:00
										 |  |  | 											const infrastructureLogErrors = | 
					
						
							|  |  |  | 												filterInfraStructureErrors(infraStructureLog, { | 
					
						
							|  |  |  | 													run: 1, | 
					
						
							|  |  |  | 													options | 
					
						
							|  |  |  | 												}); | 
					
						
							|  |  |  | 											if ( | 
					
						
							|  |  |  | 												infrastructureLogErrors.length && | 
					
						
							|  |  |  | 												checkArrayExpectation( | 
					
						
							|  |  |  | 													testDirectory, | 
					
						
							|  |  |  | 													{ infrastructureLogs: infrastructureLogErrors }, | 
					
						
							|  |  |  | 													"infrastructureLog", | 
					
						
							|  |  |  | 													"infrastructure-log", | 
					
						
							|  |  |  | 													"InfrastructureLog", | 
					
						
							|  |  |  | 													done | 
					
						
							|  |  |  | 												) | 
					
						
							|  |  |  | 											) { | 
					
						
							|  |  |  | 												return; | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 											} | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 											done(); | 
					
						
							|  |  |  | 										}); | 
					
						
							|  |  |  | 									}, | 
					
						
							|  |  |  | 									testConfig.timeout || 60000 | 
					
						
							|  |  |  | 								); | 
					
						
							|  |  |  | 								it( | 
					
						
							|  |  |  | 									`${testName} should pre-compile to fill disk cache (2nd)`, | 
					
						
							|  |  |  | 									done => { | 
					
						
							|  |  |  | 										const oldPath = options.output.path; | 
					
						
							|  |  |  | 										options.output.path = path.join( | 
					
						
							|  |  |  | 											options.output.path, | 
					
						
							|  |  |  | 											"cache2" | 
					
						
							|  |  |  | 										); | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 										infraStructureLog.length = 0; | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 										const deprecationTracker = deprecationTracking.start(); | 
					
						
							| 
									
										
										
										
											2021-07-08 17:26:27 +08:00
										 |  |  | 										const webpack = require(".."); | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 										webpack(options, err => { | 
					
						
							|  |  |  | 											deprecationTracker(); | 
					
						
							|  |  |  | 											options.output.path = oldPath; | 
					
						
							|  |  |  | 											if (err) return done(err); | 
					
						
							| 
									
										
										
										
											2022-02-15 02:31:59 +08:00
										 |  |  | 											const infrastructureLogErrors = | 
					
						
							|  |  |  | 												filterInfraStructureErrors(infraStructureLog, { | 
					
						
							|  |  |  | 													run: 2, | 
					
						
							|  |  |  | 													options | 
					
						
							|  |  |  | 												}); | 
					
						
							|  |  |  | 											if ( | 
					
						
							|  |  |  | 												infrastructureLogErrors.length && | 
					
						
							|  |  |  | 												checkArrayExpectation( | 
					
						
							|  |  |  | 													testDirectory, | 
					
						
							|  |  |  | 													{ infrastructureLogs: infrastructureLogErrors }, | 
					
						
							|  |  |  | 													"infrastructureLog", | 
					
						
							|  |  |  | 													"infrastructure-log", | 
					
						
							|  |  |  | 													"InfrastructureLog", | 
					
						
							|  |  |  | 													done | 
					
						
							|  |  |  | 												) | 
					
						
							|  |  |  | 											) { | 
					
						
							|  |  |  | 												return; | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 											} | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 											done(); | 
					
						
							|  |  |  | 										}); | 
					
						
							|  |  |  | 									}, | 
					
						
							|  |  |  | 									testConfig.cachedTimeout || testConfig.timeout || 10000 | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2018-10-25 17:18:45 +08:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-03-06 05:48:18 +08:00
										 |  |  | 							it( | 
					
						
							|  |  |  | 								testName + " should compile", | 
					
						
							|  |  |  | 								done => { | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 									infraStructureLog.length = 0; | 
					
						
							| 
									
										
										
										
											2021-07-08 17:26:27 +08:00
										 |  |  | 									const webpack = require(".."); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 									const compiler = webpack(options); | 
					
						
							|  |  |  | 									const run = () => { | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 										const deprecationTracker = deprecationTracking.start(); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 										compiler.run((err, stats) => { | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 											const deprecations = deprecationTracker(); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 											if (err) return done(err); | 
					
						
							| 
									
										
										
										
											2022-02-15 02:31:59 +08:00
										 |  |  | 											const infrastructureLogErrors = | 
					
						
							|  |  |  | 												filterInfraStructureErrors(infraStructureLog, { | 
					
						
							|  |  |  | 													run: 3, | 
					
						
							|  |  |  | 													options | 
					
						
							|  |  |  | 												}); | 
					
						
							|  |  |  | 											if ( | 
					
						
							|  |  |  | 												infrastructureLogErrors.length && | 
					
						
							|  |  |  | 												checkArrayExpectation( | 
					
						
							|  |  |  | 													testDirectory, | 
					
						
							|  |  |  | 													{ infrastructureLogs: infrastructureLogErrors }, | 
					
						
							|  |  |  | 													"infrastructureLog", | 
					
						
							|  |  |  | 													"infrastructure-log", | 
					
						
							|  |  |  | 													"InfrastructureLog", | 
					
						
							|  |  |  | 													done | 
					
						
							|  |  |  | 												) | 
					
						
							|  |  |  | 											) { | 
					
						
							|  |  |  | 												return; | 
					
						
							| 
									
										
										
										
											2022-02-11 14:24:35 +08:00
										 |  |  | 											} | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 											compiler.close(err => { | 
					
						
							|  |  |  | 												if (err) return done(err); | 
					
						
							|  |  |  | 												const statOptions = { | 
					
						
							|  |  |  | 													preset: "verbose", | 
					
						
							| 
									
										
										
										
											2020-09-15 16:07:04 +08:00
										 |  |  | 													colors: false, | 
					
						
							| 
									
										
										
										
											2021-07-20 17:52:46 +08:00
										 |  |  | 													modules: true, | 
					
						
							|  |  |  | 													reasonsSpace: 1000 | 
					
						
							| 
									
										
										
										
											2018-03-06 05:48:18 +08:00
										 |  |  | 												}; | 
					
						
							| 
									
										
										
										
											2020-01-13 23:29:12 +08:00
										 |  |  | 												fs.mkdirSync(outputDirectory, { recursive: true }); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 												fs.writeFileSync( | 
					
						
							|  |  |  | 													path.join(outputDirectory, "stats.txt"), | 
					
						
							|  |  |  | 													stats.toString(statOptions), | 
					
						
							|  |  |  | 													"utf-8" | 
					
						
							| 
									
										
										
										
											2018-03-06 05:48:18 +08:00
										 |  |  | 												); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 												const jsonStats = stats.toJson({ | 
					
						
							| 
									
										
										
										
											2021-05-20 19:06:22 +08:00
										 |  |  | 													errorDetails: true, | 
					
						
							|  |  |  | 													modules: false, | 
					
						
							|  |  |  | 													assets: false, | 
					
						
							|  |  |  | 													chunks: false | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 												}); | 
					
						
							|  |  |  | 												if ( | 
					
						
							|  |  |  | 													checkArrayExpectation( | 
					
						
							|  |  |  | 														testDirectory, | 
					
						
							|  |  |  | 														jsonStats, | 
					
						
							|  |  |  | 														"error", | 
					
						
							|  |  |  | 														"Error", | 
					
						
							|  |  |  | 														done | 
					
						
							|  |  |  | 													) | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 												) { | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 													return; | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 												} | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 												if ( | 
					
						
							|  |  |  | 													checkArrayExpectation( | 
					
						
							|  |  |  | 														testDirectory, | 
					
						
							|  |  |  | 														jsonStats, | 
					
						
							|  |  |  | 														"warning", | 
					
						
							|  |  |  | 														"Warning", | 
					
						
							|  |  |  | 														done | 
					
						
							|  |  |  | 													) | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 												) { | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 													return; | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 												} | 
					
						
							| 
									
										
										
										
											2021-01-08 21:50:15 +08:00
										 |  |  | 												const infrastructureLogging = stderr.toString(); | 
					
						
							|  |  |  | 												if (infrastructureLogging) { | 
					
						
							|  |  |  | 													done( | 
					
						
							|  |  |  | 														new Error( | 
					
						
							|  |  |  | 															"Errors/Warnings during build:\n" + | 
					
						
							|  |  |  | 																infrastructureLogging | 
					
						
							|  |  |  | 														) | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 												} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 												expect(deprecations).toEqual(config.deprecations || []); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 												Promise.resolve().then(done); | 
					
						
							|  |  |  | 											}); | 
					
						
							|  |  |  | 										}); | 
					
						
							|  |  |  | 									}; | 
					
						
							|  |  |  | 									if (config.cache) { | 
					
						
							|  |  |  | 										// pre-compile to fill memory cache
 | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 										const deprecationTracker = deprecationTracking.start(); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 										compiler.run(err => { | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 											deprecationTracker(); | 
					
						
							| 
									
										
										
										
											2018-10-25 17:18:45 +08:00
										 |  |  | 											if (err) return done(err); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 											run(); | 
					
						
							| 
									
										
										
										
											2018-10-25 17:18:45 +08:00
										 |  |  | 										}); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 									} else { | 
					
						
							|  |  |  | 										run(); | 
					
						
							|  |  |  | 									} | 
					
						
							| 
									
										
										
										
											2018-03-06 05:48:18 +08:00
										 |  |  | 								}, | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 								testConfig.cachedTimeout || | 
					
						
							|  |  |  | 									testConfig.timeout || | 
					
						
							|  |  |  | 									(config.cache ? 20000 : 60000) | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-08-02 19:05:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 							it( | 
					
						
							|  |  |  | 								testName + " should load the compiled tests", | 
					
						
							|  |  |  | 								done => { | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 									const esmContext = vm.createContext({ | 
					
						
							|  |  |  | 										it: _it, | 
					
						
							|  |  |  | 										expect, | 
					
						
							|  |  |  | 										process, | 
					
						
							|  |  |  | 										global, | 
					
						
							|  |  |  | 										URL, | 
					
						
							|  |  |  | 										Buffer, | 
					
						
							|  |  |  | 										setTimeout, | 
					
						
							|  |  |  | 										setImmediate, | 
					
						
							|  |  |  | 										nsObj: function (m) { | 
					
						
							|  |  |  | 											Object.defineProperty(m, Symbol.toStringTag, { | 
					
						
							|  |  |  | 												value: "Module" | 
					
						
							|  |  |  | 											}); | 
					
						
							|  |  |  | 											return m; | 
					
						
							|  |  |  | 										} | 
					
						
							|  |  |  | 									}); | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 									cleanups.push(() => (esmContext.it = undefined)); | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 									function _require(module, esmMode) { | 
					
						
							| 
									
										
										
										
											2022-03-14 05:54:18 +08:00
										 |  |  | 										if (module.startsWith("./")) { | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 											const p = path.join(outputDirectory, module); | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 											const content = fs.readFileSync(p, "utf-8"); | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 											if (p.endsWith(".mjs")) { | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 												let esm; | 
					
						
							|  |  |  | 												try { | 
					
						
							|  |  |  | 													esm = new vm.SourceTextModule(content, { | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 														identifier: p, | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 														context: esmContext, | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 														initializeImportMeta: (meta, module) => { | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 															meta.url = pathToFileURL(p).href; | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 														}, | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 														importModuleDynamically: async ( | 
					
						
							|  |  |  | 															specifier, | 
					
						
							|  |  |  | 															module | 
					
						
							|  |  |  | 														) => { | 
					
						
							|  |  |  | 															const result = await _require( | 
					
						
							|  |  |  | 																specifier, | 
					
						
							|  |  |  | 																"evaluated" | 
					
						
							|  |  |  | 															); | 
					
						
							| 
									
										
										
										
											2021-06-25 16:37:35 +08:00
										 |  |  | 															return await asModule(result, module.context); | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 														} | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 													}); | 
					
						
							| 
									
										
										
										
											2021-07-08 00:46:29 +08:00
										 |  |  | 													cleanups.push(() => (esmContext.it = undefined)); | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 												} catch (e) { | 
					
						
							|  |  |  | 													console.log(e); | 
					
						
							|  |  |  | 													e.message += `\nwhile parsing ${p}`; | 
					
						
							|  |  |  | 													throw e; | 
					
						
							|  |  |  | 												} | 
					
						
							|  |  |  | 												if (esmMode === "unlinked") return esm; | 
					
						
							|  |  |  | 												return (async () => { | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 													await esm.link(async (specifier, module) => { | 
					
						
							|  |  |  | 														return await asModule( | 
					
						
							|  |  |  | 															await _require(specifier, "unlinked"), | 
					
						
							| 
									
										
										
										
											2021-06-25 16:37:35 +08:00
										 |  |  | 															module.context, | 
					
						
							|  |  |  | 															true | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 														); | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 													}); | 
					
						
							|  |  |  | 													// node.js 10 needs instantiate
 | 
					
						
							|  |  |  | 													if (esm.instantiate) esm.instantiate(); | 
					
						
							|  |  |  | 													await esm.evaluate(); | 
					
						
							|  |  |  | 													if (esmMode === "evaluated") return esm; | 
					
						
							|  |  |  | 													const ns = esm.namespace; | 
					
						
							|  |  |  | 													return ns.default && ns.default instanceof Promise | 
					
						
							|  |  |  | 														? ns.default | 
					
						
							|  |  |  | 														: ns; | 
					
						
							|  |  |  | 												})(); | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 											} else { | 
					
						
							|  |  |  | 												const fn = vm.runInThisContext( | 
					
						
							|  |  |  | 													"(function(require, module, exports, __dirname, __filename, it, expect) {" + | 
					
						
							|  |  |  | 														"global.expect = expect;" + | 
					
						
							|  |  |  | 														'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 														content + | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 														"\n})", | 
					
						
							|  |  |  | 													p | 
					
						
							|  |  |  | 												); | 
					
						
							|  |  |  | 												const m = { | 
					
						
							|  |  |  | 													exports: {}, | 
					
						
							|  |  |  | 													webpackTestSuiteModule: true | 
					
						
							|  |  |  | 												}; | 
					
						
							|  |  |  | 												fn.call( | 
					
						
							|  |  |  | 													m.exports, | 
					
						
							|  |  |  | 													_require, | 
					
						
							|  |  |  | 													m, | 
					
						
							|  |  |  | 													m.exports, | 
					
						
							|  |  |  | 													outputDirectory, | 
					
						
							|  |  |  | 													p, | 
					
						
							|  |  |  | 													_it, | 
					
						
							|  |  |  | 													expect | 
					
						
							|  |  |  | 												); | 
					
						
							|  |  |  | 												return m.exports; | 
					
						
							|  |  |  | 											} | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 										} else return require(module); | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 									_require.webpackTestSuiteRequire = true; | 
					
						
							| 
									
										
										
										
											2021-06-24 16:05:37 +08:00
										 |  |  | 									Promise.resolve() | 
					
						
							|  |  |  | 										.then(() => _require("./" + options.output.filename)) | 
					
						
							|  |  |  | 										.then(() => { | 
					
						
							|  |  |  | 											if (getNumberOfTests() === 0) | 
					
						
							|  |  |  | 												return done( | 
					
						
							|  |  |  | 													new Error("No tests exported by test case") | 
					
						
							|  |  |  | 												); | 
					
						
							|  |  |  | 											done(); | 
					
						
							|  |  |  | 										}, done); | 
					
						
							| 
									
										
										
										
											2018-12-20 23:29:35 +08:00
										 |  |  | 								}, | 
					
						
							|  |  |  | 								10000 | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-02 19:05:48 +08:00
										 |  |  | 							const { it: _it, getNumberOfTests } = createLazyTestEnv( | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 								testConfig.timeout || 10000 | 
					
						
							| 
									
										
										
										
											2018-08-02 19:05:48 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-02-25 18:46:17 +08:00
										 |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2018-02-25 08:16:11 +08:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-02 17:55:59 +08:00
										 |  |  | exports.describeCases = describeCases; |