You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.3 KiB

'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;