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); this.watcher.once("aggregated", (changes, removals) => { changes = changes.concat(removals); if(this.inputFileSystem && this.inputFileSystem.purge) { this.inputFileSystem.purge(changes); } const times = this.watcher.getTimes(); callback(null, changes.filter(file => files.indexOf(file) >= 0).sort(), changes.filter(file => dirs.indexOf(file) >= 0).sort(), changes.filter(file => missing.indexOf(file) >= 0).sort(), times, times); }); this.watcher.watch(files.concat(missing), dirs.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(); } } }; }
export default function onSourceChange( {sourceDir, artifactsDir, onChange, shouldWatchFile}: Object): Watchpack { // TODO: For network disks, we would need to add {poll: true}. const watcher = new Watchpack(); const onFileChange = (filePath) => { proxyFileChanges({artifactsDir, onChange, filePath, shouldWatchFile}); }; const executeImmediately = true; watcher.on('change', debounce(onFileChange, 1000, executeImmediately)); log.debug(`Watching for file changes in ${sourceDir}`); watcher.watch([], [sourceDir], Date.now()); // TODO: support interrupting the watcher on Windows. // https://github.com/mozilla/web-ext/issues/225 process.on('SIGINT', () => watcher.close()); return watcher; }