| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | 
							- /*jslint node: true */
 
- 'use strict';
 
- var through2 = require('through2');
 
- var Combine = require('ordered-read-streams');
 
- var unique = require('unique-stream');
 
- var glob = require('glob');
 
- var minimatch = require('minimatch');
 
- var glob2base = require('glob2base');
 
- var path = require('path');
 
- var gs = {
 
-   // creates a stream for a single glob or filter
 
-   createStream: function(ourGlob, negatives, opt) {
 
-     if (!negatives) negatives = [];
 
-     if (!opt) opt = {};
 
-     if (typeof opt.cwd !== 'string') opt.cwd = process.cwd();
 
-     if (typeof opt.dot !== 'boolean') opt.dot = false;
 
-     if (typeof opt.silent !== 'boolean') opt.silent = true;
 
-     if (typeof opt.nonull !== 'boolean') opt.nonull = false;
 
-     if (typeof opt.cwdbase !== 'boolean') opt.cwdbase = false;
 
-     if (opt.cwdbase) opt.base = opt.cwd;
 
-     // remove path relativity to make globs make sense
 
-     ourGlob = unrelative(opt.cwd, ourGlob);
 
-     negatives = negatives.map(unrelative.bind(null, opt.cwd));
 
-     // create globbing stuff
 
-     var globber = new glob.Glob(ourGlob, opt);
 
-     // extract base path from glob
 
-     var basePath = opt.base ? opt.base : glob2base(globber);
 
-     // create stream and map events from globber to it
 
-     var stream = through2.obj(negatives.length ? filterNegatives : undefined);
 
-     globber.on('error', stream.emit.bind(stream, 'error'));
 
-     globber.on('end', function(/* some args here so can't use bind directly */){
 
-       stream.end();
 
-     });
 
-     globber.on('match', function(filename) {
 
-       stream.write({
 
-         cwd: opt.cwd,
 
-         base: basePath,
 
-         path: path.resolve(opt.cwd, filename)
 
-       });
 
-     });
 
-     return stream;
 
-     function filterNegatives(filename, enc, cb) {
 
-       var matcha = isMatch.bind(null, filename, opt);
 
-       if (negatives.every(matcha)) {
 
-         cb(null, filename); // pass
 
-       } else {
 
-         cb(); // ignore
 
-       }
 
-     }
 
-   },
 
-   // creates a stream for multiple globs or filters
 
-   create: function(globs, opt) {
 
-     if (!opt) opt = {};
 
-     // only one glob no need to aggregate
 
-     if (!Array.isArray(globs)) return gs.createStream(globs, null, opt);
 
-     var positives = globs.filter(isPositive);
 
-     var negatives = globs.filter(isNegative);
 
-     if (positives.length === 0) throw new Error("Missing positive glob");
 
-     // only one positive glob no need to aggregate
 
-     if (positives.length === 1) return gs.createStream(positives[0], negatives, opt);
 
-     // create all individual streams
 
-     var streams = positives.map(function(glob){
 
-       return gs.createStream(glob, negatives, opt);
 
-     });
 
-     // then just pipe them to a single unique stream and return it
 
-     var aggregate = new Combine(streams);
 
-     var uniqueStream = unique('path');
 
-     return aggregate.pipe(uniqueStream);
 
-   }
 
- };
 
- function isMatch(file, opt, pattern) {
 
-   if (typeof pattern === 'string') return minimatch(file.path, pattern, opt);
 
-   if (pattern instanceof RegExp) return pattern.test(file.path);
 
-   return true; // unknown glob type?
 
- }
 
- function isNegative(pattern) {
 
-   if (typeof pattern !== 'string') return true;
 
-   if (pattern[0] === '!') return true;
 
-   return false;
 
- }
 
- function isPositive(pattern) {
 
-   return !isNegative(pattern);
 
- }
 
- function unrelative(cwd, glob) {
 
-   var mod = '';
 
-   if (glob[0] === '!') {
 
-     mod = glob[0];
 
-     glob = glob.slice(1);
 
-   }
 
-   return mod+path.resolve(cwd, glob);
 
- }
 
- module.exports = gs;
 
 
  |