| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const Watchpack = require("watchpack");const objectToMap = require("../util/objectToMap");class NodeWatchFileSystem {	constructor(inputFileSystem) {		this.inputFileSystem = inputFileSystem;		this.watcherOptions = {			aggregateTimeout: 0		};		this.watcher = new Watchpack(this.watcherOptions);	}	watch(files, dirs, missing, startTime, options, callback, callbackUndelayed) {		if (!Array.isArray(files)) {			throw new Error("Invalid arguments: 'files'");		}		if (!Array.isArray(dirs)) {			throw new Error("Invalid arguments: 'dirs'");		}		if (!Array.isArray(missing)) {			throw new Error("Invalid arguments: 'missing'");		}		if (typeof callback !== "function") {			throw new Error("Invalid arguments: 'callback'");		}		if (typeof startTime !== "number" && startTime) {			throw new Error("Invalid arguments: 'startTime'");		}		if (typeof options !== "object") {			throw new Error("Invalid arguments: 'options'");		}		if (typeof callbackUndelayed !== "function" && callbackUndelayed) {			throw new Error("Invalid arguments: 'callbackUndelayed'");		}		const oldWatcher = this.watcher;		this.watcher = new Watchpack(options);		if (callbackUndelayed) {			this.watcher.once("change", callbackUndelayed);		}		const cachedFiles = files;		const cachedDirs = dirs;		this.watcher.once("aggregated", (changes, removals) => {			changes = changes.concat(removals);			if (this.inputFileSystem && this.inputFileSystem.purge) {				this.inputFileSystem.purge(changes);			}			const times = objectToMap(this.watcher.getTimes());			files = new Set(files);			dirs = new Set(dirs);			missing = new Set(missing);			removals = new Set(removals.filter(file => files.has(file)));			callback(				null,				changes.filter(file => files.has(file)).sort(),				changes.filter(file => dirs.has(file)).sort(),				changes.filter(file => missing.has(file)).sort(),				times,				times,				removals			);		});		this.watcher.watch(			cachedFiles.concat(missing),			cachedDirs.concat(missing),			startTime		);		if (oldWatcher) {			oldWatcher.close();		}		return {			close: () => {				if (this.watcher) {					this.watcher.close();					this.watcher = null;				}			},			pause: () => {				if (this.watcher) {					this.watcher.pause();				}			},			getFileTimestamps: () => {				if (this.watcher) {					return objectToMap(this.watcher.getTimes());				} else {					return new Map();				}			},			getContextTimestamps: () => {				if (this.watcher) {					return objectToMap(this.watcher.getTimes());				} else {					return new Map();				}			}		};	}}module.exports = NodeWatchFileSystem;
 |