watch-glob
Version:
Watch glob patterns
72 lines (48 loc) • 2.19 kB
text/coffeescript
_ = require('lodash')
Gaze = require('gaze').Gaze
path = require('path')
globule = require('globule')
Vinyl = require('vinyl')
watchGlob = (patterns, options, addedCallback, removedCallback) ->
watcher = new Gaze([], { cwd: options?.cwd })
setTimeout(( -> watcher.add(patterns)), options.delay)
watcher.on 'all', (evt, absoluteFilepath) ->
relativeFilepath = path.relative(options.cwd, absoluteFilepath)
confirmMatch = globule.match(patterns, relativeFilepath)
if confirmMatch.length == 0 then return
valueForCallback =
switch options?.callbackArg
when 'absolute' then absoluteFilepath
when 'relative' then relativeFilepath
when 'vinyl' then new Vinyl({ cwd: options.base, path: absoluteFilepath })
else { base: path.normalize(options.cwd), path: path.normalize(absoluteFilepath), relative: path.normalize(relativeFilepath) }
if evt in [ 'added', 'changed', 'renamed' ]
addedCallback(valueForCallback)
else if evt == 'deleted'
removedCallback(valueForCallback)
{
destroy: -> watcher.close.apply(watcher)
watched: -> watcher.watched.apply(watcher)
}
module.exports = (args...) ->
patterns = if _.isArray(args[0]) then args[0] else [ args[0] ]
callbacksIndex = null
if _.isPlainObject(args[1])
options = args[1]
callbacksIndex = 2
else if _.isString(args[1])
options = { cwd: args[1] }
callbacksIndex = 2
else
options = {}
callbacksIndex = 1
options.cwd = options.cwd || process.cwd()
addedCallback = args[callbacksIndex] || (->)
removedCallback = args[callbacksIndex + 1] || (->)
options.delay = if options.delay? then options.delay else 2000
watchGlob(patterns, options, addedCallback, removedCallback)