mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			156 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
"use strict";
 | 
						|
 | 
						|
/*globals describe it */
 | 
						|
const path = require("path");
 | 
						|
const fs = require("fs");
 | 
						|
const MemoryFs = require("memory-fs");
 | 
						|
 | 
						|
const webpack = require("..");
 | 
						|
 | 
						|
describe("WatchDetection", () => {
 | 
						|
	if (process.env.NO_WATCH_TESTS) {
 | 
						|
		it.skip("long running tests excluded", () => {});
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	jest.setTimeout(10000);
 | 
						|
 | 
						|
	for (let changeTimeout = 10; changeTimeout < 100; changeTimeout += 10) {
 | 
						|
		createTestCase(changeTimeout);
 | 
						|
	}
 | 
						|
	for (let changeTimeout = 200; changeTimeout <= 2000; changeTimeout += 200) {
 | 
						|
		createTestCase(changeTimeout);
 | 
						|
	}
 | 
						|
 | 
						|
	function createTestCase(changeTimeout) {
 | 
						|
		describe(`time between changes ${changeTimeout}ms`, () => {
 | 
						|
			const fixturePath = path.join(
 | 
						|
				__dirname,
 | 
						|
				"fixtures",
 | 
						|
				"temp-" + changeTimeout
 | 
						|
			);
 | 
						|
			const filePath = path.join(fixturePath, "file.js");
 | 
						|
			const file2Path = path.join(fixturePath, "file2.js");
 | 
						|
			const loaderPath = path.join(__dirname, "fixtures", "delay-loader.js");
 | 
						|
 | 
						|
			beforeAll(() => {
 | 
						|
				try {
 | 
						|
					fs.mkdirSync(fixturePath);
 | 
						|
				} catch (e) {
 | 
						|
					// empty
 | 
						|
				}
 | 
						|
				fs.writeFileSync(filePath, "require('./file2')", "utf-8");
 | 
						|
				fs.writeFileSync(file2Path, "original", "utf-8");
 | 
						|
			});
 | 
						|
 | 
						|
			afterAll(done => {
 | 
						|
				setTimeout(() => {
 | 
						|
					try {
 | 
						|
						fs.unlinkSync(filePath);
 | 
						|
					} catch (e) {
 | 
						|
						// empty
 | 
						|
					}
 | 
						|
					try {
 | 
						|
						fs.unlinkSync(file2Path);
 | 
						|
					} catch (e) {
 | 
						|
						// empty
 | 
						|
					}
 | 
						|
					try {
 | 
						|
						fs.rmdirSync(fixturePath);
 | 
						|
					} catch (e) {
 | 
						|
						// empty
 | 
						|
					}
 | 
						|
					done();
 | 
						|
				}, 100); // cool down a bit
 | 
						|
			});
 | 
						|
 | 
						|
			it("should build the bundle correctly", done => {
 | 
						|
				const compiler = webpack({
 | 
						|
					mode: "development",
 | 
						|
					entry: loaderPath + "!" + filePath,
 | 
						|
					output: {
 | 
						|
						path: "/",
 | 
						|
						filename: "bundle.js"
 | 
						|
					}
 | 
						|
				});
 | 
						|
				const memfs = (compiler.outputFileSystem = new MemoryFs());
 | 
						|
				let onChange;
 | 
						|
				compiler.hooks.done.tap("WatchDetectionTest", () => {
 | 
						|
					if (onChange) onChange();
 | 
						|
				});
 | 
						|
 | 
						|
				let watcher;
 | 
						|
 | 
						|
				step1();
 | 
						|
 | 
						|
				function step1() {
 | 
						|
					onChange = () => {
 | 
						|
						if (
 | 
						|
							memfs.readFileSync("/bundle.js") &&
 | 
						|
							memfs
 | 
						|
								.readFileSync("/bundle.js")
 | 
						|
								.toString()
 | 
						|
								.indexOf("original") >= 0
 | 
						|
						)
 | 
						|
							step2();
 | 
						|
					};
 | 
						|
 | 
						|
					watcher = compiler.watch(
 | 
						|
						{
 | 
						|
							aggregateTimeout: 50
 | 
						|
						},
 | 
						|
						() => {}
 | 
						|
					);
 | 
						|
				}
 | 
						|
 | 
						|
				function step2() {
 | 
						|
					onChange = null;
 | 
						|
 | 
						|
					fs.writeFile(
 | 
						|
						filePath,
 | 
						|
						"require('./file2'); again",
 | 
						|
						"utf-8",
 | 
						|
						handleError
 | 
						|
					);
 | 
						|
 | 
						|
					setTimeout(step3, changeTimeout);
 | 
						|
				}
 | 
						|
 | 
						|
				function step3() {
 | 
						|
					onChange = null;
 | 
						|
 | 
						|
					fs.writeFile(file2Path, "wrong", "utf-8", handleError);
 | 
						|
 | 
						|
					setTimeout(step4, changeTimeout);
 | 
						|
				}
 | 
						|
 | 
						|
				function step4() {
 | 
						|
					onChange = () => {
 | 
						|
						if (
 | 
						|
							memfs
 | 
						|
								.readFileSync("/bundle.js")
 | 
						|
								.toString()
 | 
						|
								.indexOf("correct") >= 0
 | 
						|
						)
 | 
						|
							step5();
 | 
						|
					};
 | 
						|
 | 
						|
					fs.writeFile(file2Path, "correct", "utf-8", handleError);
 | 
						|
				}
 | 
						|
 | 
						|
				function step5() {
 | 
						|
					onChange = null;
 | 
						|
 | 
						|
					watcher.close(() => {
 | 
						|
						setTimeout(done, 500);
 | 
						|
					});
 | 
						|
				}
 | 
						|
 | 
						|
				function handleError(err) {
 | 
						|
					if (err) done(err);
 | 
						|
				}
 | 
						|
			});
 | 
						|
		});
 | 
						|
	}
 | 
						|
});
 |