From a1074870c277c81d3f0f6f5c15b97399feff984d Mon Sep 17 00:00:00 2001 From: Elan Shanker Date: Tue, 7 Apr 2015 16:17:34 -0400 Subject: [PATCH 1/3] Switch to chokidar --- README.md | 9 ++++++ index.js | 82 ++++++++++++++++++++++++++++++++++++++-------------- package.json | 3 +- 3 files changed, 72 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 6bc1ba7..30683ba 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,15 @@ watcher.on('change', function(evt) { // add files after it has been created watcher.add('./somefolder/somefile.js'); + +// stop watching certain files +watcher.remove('./somefolder/dontcare.*'); + +// stop watching entirely +watcher.close(); + +// options can be passed to the underlying watch lib as the second arg +watcher = watch('./*.js', {usePolling: true}); ``` diff --git a/index.js b/index.js index 2b47e55..8be78dc 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,15 @@ -var gaze = require('gaze'); +var chokidar = require('chokidar'); +var anymatch = require('anymatch'); var EventEmitter = require('events').EventEmitter; -function onWatch(out, cb){ - return function(err, rwatcher){ - if (err) out.emit('error', err); - rwatcher.on('all', function(evt, path, old){ - var outEvt = {type: evt, path: path}; - if(old) outEvt.old = old; - out.emit('change', outEvt); - if(cb) cb(); - }); +function mapEvents(evt) { + switch (evt) { + case 'add': + return 'added'; + case 'unlink': + return 'deleted'; + case 'change': + return 'changed'; } } @@ -21,22 +21,62 @@ module.exports = function(glob, opts, cb) { opts = {}; } - var watcher = gaze(glob, opts, onWatch(out, cb)); + opts = opts || {}; + + if (opts.ignoreInitial == null) { + opts.ignoreInitial = true; + } + + var watcher = chokidar.watch(glob, opts); + + var nomatch = true; + var filteredCbs = []; - watcher.on('end', out.emit.bind(out, 'end')); + watcher.on('all', function(evt, path, stats){ + evt = mapEvents(evt); + if (!evt) { + return; + } + nomatch = false; + var outEvt = { + type: evt, + path: path + }; + if (stats) { + outEvt.stats = stats; + } + out.emit('change', outEvt); + filteredCbs.forEach(function(pair) { + if (pair.filter(path)) { + pair.cb(); + } + }); + cb && cb(); + }); + watcher.on('ready', function() { + if (nomatch) { + out.emit('nomatch'); + } + out.emit('ready'); + }); watcher.on('error', out.emit.bind(out, 'error')); - watcher.on('ready', out.emit.bind(out, 'ready')); - watcher.on('nomatch', out.emit.bind(out, 'nomatch')); - out.end = function(){ - return watcher.close(); - }; out.add = function(glob, cb){ - return watcher.add(glob, onWatch(out, cb)); - }; - out.remove = function(glob){ - return watcher.remove(glob); + if (cb) { + filteredCbs.push({ + filter: anymatch(glob), + cb: cb + }); + } + watcher.add(glob); + return watcher; }; + out.end = function() { + watcher.close(); + out.emit('end'); + return watcher; + } + out.remove = watcher.unwatch.bind(watcher); out._watcher = watcher; return out; diff --git a/package.json b/package.json index 567cf8c..82593e9 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "lib" ], "dependencies": { - "gaze": "^0.5.1" + "anymatch": "^1.2.1", + "chokidar": "^1.0.0" }, "devDependencies": { "mocha": "^2.0.1", From ceb4af0a8b354e33e95c3c68a37e1c54e379ed1b Mon Sep 17 00:00:00 2001 From: Elan Shanker Date: Tue, 18 Aug 2015 11:16:34 -0400 Subject: [PATCH 2/3] Use object for event mapping --- index.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 8be78dc..7324709 100644 --- a/index.js +++ b/index.js @@ -2,15 +2,10 @@ var chokidar = require('chokidar'); var anymatch = require('anymatch'); var EventEmitter = require('events').EventEmitter; -function mapEvents(evt) { - switch (evt) { - case 'add': - return 'added'; - case 'unlink': - return 'deleted'; - case 'change': - return 'changed'; - } +var eventMap = { + add: 'added', + unlink: 'deleted', + change: 'changed' } module.exports = function(glob, opts, cb) { @@ -33,7 +28,8 @@ module.exports = function(glob, opts, cb) { var filteredCbs = []; watcher.on('all', function(evt, path, stats){ - evt = mapEvents(evt); + // convert from chokidar event names to glob-watcher's original names + evt = eventMap[evt]; if (!evt) { return; } From 26e64389053e157df4a76d987695094c960fc1f9 Mon Sep 17 00:00:00 2001 From: Elan Shanker Date: Tue, 18 Aug 2015 11:26:22 -0400 Subject: [PATCH 3/3] Add notes about chokidar options --- README.md | 7 ++++++- index.js | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 30683ba..0f1d9fe 100644 --- a/README.md +++ b/README.md @@ -45,10 +45,15 @@ watcher.remove('./somefolder/dontcare.*'); // stop watching entirely watcher.close(); -// options can be passed to the underlying watch lib as the second arg +// options can be passed to the underlying watch lib (chokidar) as a second arg watcher = watch('./*.js', {usePolling: true}); ``` +[Chokidar options reference](https://github.com/paulmillr/chokidar#api) + +*Note:* glob-watcher overrides chokidar's default `ignoreInitial` setting to +`true` if you do not set it explicitly. + [npm-url]: https://npmjs.org/package/glob-watcher [npm-image]: https://badge.fury.io/js/glob-watcher.png diff --git a/index.js b/index.js index 7324709..f93359f 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,7 @@ module.exports = function(glob, opts, cb) { opts = opts || {}; + // overriding chokidar's default if user did not set it explicitly if (opts.ignoreInitial == null) { opts.ignoreInitial = true; }