| 'use strict'; |
| |
| var Combine = require('ordered-read-streams'); |
| var unique = require('unique-stream'); |
| var pumpify = require('pumpify'); |
| var isNegatedGlob = require('is-negated-glob'); |
| var extend = require('extend'); |
| |
| var GlobStream = require('./readable'); |
| |
| function globStream(globs, opt) { |
| if (!opt) { |
| opt = {}; |
| } |
| |
| var ourOpt = extend({}, opt); |
| var ignore = ourOpt.ignore; |
| |
| ourOpt.cwd = typeof ourOpt.cwd === 'string' ? ourOpt.cwd : process.cwd(); |
| ourOpt.dot = typeof ourOpt.dot === 'boolean' ? ourOpt.dot : false; |
| ourOpt.silent = typeof ourOpt.silent === 'boolean' ? ourOpt.silent : true; |
| ourOpt.cwdbase = typeof ourOpt.cwdbase === 'boolean' ? ourOpt.cwdbase : false; |
| ourOpt.uniqueBy = typeof ourOpt.uniqueBy === 'string' || |
| typeof ourOpt.uniqueBy === 'function' ? ourOpt.uniqueBy : 'path'; |
| |
| if (ourOpt.cwdbase) { |
| ourOpt.base = ourOpt.cwd; |
| } |
| // Normalize string `ignore` to array |
| if (typeof ignore === 'string') { |
| ignore = [ignore]; |
| } |
| // Ensure `ignore` is an array |
| if (!Array.isArray(ignore)) { |
| ignore = []; |
| } |
| |
| // Only one glob no need to aggregate |
| if (!Array.isArray(globs)) { |
| globs = [globs]; |
| } |
| |
| var positives = []; |
| var negatives = []; |
| |
| globs.forEach(sortGlobs); |
| |
| function sortGlobs(globString, index) { |
| if (typeof globString !== 'string') { |
| throw new Error('Invalid glob at index ' + index); |
| } |
| |
| var glob = isNegatedGlob(globString); |
| var globArray = glob.negated ? negatives : positives; |
| |
| globArray.push({ |
| index: index, |
| glob: glob.pattern, |
| }); |
| } |
| |
| if (positives.length === 0) { |
| throw new Error('Missing positive glob'); |
| } |
| |
| // Create all individual streams |
| var streams = positives.map(streamFromPositive); |
| |
| // Then just pipe them to a single unique stream and return it |
| var aggregate = new Combine(streams); |
| var uniqueStream = unique(ourOpt.uniqueBy); |
| |
| return pumpify.obj(aggregate, uniqueStream); |
| |
| function streamFromPositive(positive) { |
| var negativeGlobs = negatives |
| .filter(indexGreaterThan(positive.index)) |
| .map(toGlob) |
| .concat(ignore); |
| return new GlobStream(positive.glob, negativeGlobs, ourOpt); |
| } |
| } |
| |
| function indexGreaterThan(index) { |
| return function(obj) { |
| return obj.index > index; |
| }; |
| } |
| |
| function toGlob(obj) { |
| return obj.glob; |
| } |
| |
| module.exports = globStream; |