Blame view

node_modules/webpack/lib/node/NodeWatchFileSystem.js 2.04 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  */
  "use strict";
  
  const Watchpack = require("watchpack");
  
  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);
  
  		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();
  				}
  			}
  		};
  	}
  }
  
  module.exports = NodeWatchFileSystem;