aboutsummaryrefslogtreecommitdiff
path: root/node_modules/glob-stream/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/glob-stream/index.js')
-rw-r--r--node_modules/glob-stream/index.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/node_modules/glob-stream/index.js b/node_modules/glob-stream/index.js
new file mode 100644
index 000000000..0960c7c74
--- /dev/null
+++ b/node_modules/glob-stream/index.js
@@ -0,0 +1,117 @@
+/*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;