95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
'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;
|