| var util = require('util'), |
| minimatch = require('minimatch'), |
| Glob = require('glob').Glob, |
| EventEmitter = require('events').EventEmitter; |
| |
| module.exports = fileset; |
| |
| function fileset(include, exclude, options, cb) { |
| if (typeof exclude === 'function') cb = exclude, exclude = ''; |
| else if (typeof options === 'function') cb = options, options = {}; |
| |
| var includes = (typeof include === 'string') ? include.split(' ') : include; |
| var excludes = (typeof exclude === 'string') ? exclude.split(' ') : exclude; |
| |
| var em = new EventEmitter, |
| remaining = includes.length, |
| results = []; |
| |
| if(!includes.length) return cb(new Error('Must provide an include pattern')); |
| |
| em.includes = includes.map(function(pattern) { |
| return new fileset.Fileset(pattern, options) |
| .on('error', cb ? cb : em.emit.bind(em, 'error')) |
| .on('match', em.emit.bind(em, 'match')) |
| .on('match', em.emit.bind(em, 'include')) |
| .on('end', next.bind({}, pattern)) |
| }); |
| |
| function next(pattern, matches) { |
| results = results.concat(matches); |
| |
| if(!(--remaining)) { |
| results = results.filter(function(file) { |
| return !excludes.filter(function(glob) { |
| var match = minimatch(file, glob, { matchBase: true }); |
| if(match) em.emit('exclude', file); |
| return match; |
| }).length; |
| }); |
| |
| if(cb) cb(null, results); |
| em.emit('end', results); |
| } |
| } |
| |
| return em; |
| } |
| |
| fileset.Fileset = function Fileset(pattern, options, cb) { |
| |
| if (typeof options === 'function') cb = options, options = {}; |
| if (!options) options = {}; |
| |
| Glob.call(this, pattern, options); |
| |
| if(typeof cb === 'function') { |
| this.on('error', cb); |
| this.on('end', function(matches) { cb(null, matches); }); |
| } |
| }; |
| |
| util.inherits(fileset.Fileset, Glob); |
| |
| |