mirror of https://github.com/lukechilds/node.git
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.
68 lines
1.7 KiB
68 lines
1.7 KiB
'use strict';
|
|
var Promise = require('pinkie-promise');
|
|
var arrayUnion = require('array-union');
|
|
var objectAssign = require('object-assign');
|
|
var glob = require('glob');
|
|
var arrify = require('arrify');
|
|
var pify = require('pify');
|
|
|
|
function sortPatterns(patterns) {
|
|
patterns = arrify(patterns);
|
|
|
|
var positives = [];
|
|
var negatives = [];
|
|
|
|
patterns.forEach(function (pattern, index) {
|
|
var isNegative = pattern[0] === '!';
|
|
(isNegative ? negatives : positives).push({
|
|
index: index,
|
|
pattern: isNegative ? pattern.slice(1) : pattern
|
|
});
|
|
});
|
|
|
|
return {
|
|
positives: positives,
|
|
negatives: negatives
|
|
};
|
|
}
|
|
|
|
function setIgnore(opts, negatives, positiveIndex) {
|
|
opts = objectAssign({}, opts);
|
|
|
|
var negativePatterns = negatives.filter(function (negative) {
|
|
return negative.index > positiveIndex;
|
|
}).map(function (negative) {
|
|
return negative.pattern;
|
|
});
|
|
|
|
opts.ignore = (opts.ignore || []).concat(negativePatterns);
|
|
return opts;
|
|
}
|
|
|
|
module.exports = function (patterns, opts) {
|
|
var sortedPatterns = sortPatterns(patterns);
|
|
opts = opts || {};
|
|
|
|
if (sortedPatterns.positives.length === 0) {
|
|
return Promise.resolve([]);
|
|
}
|
|
|
|
return Promise.all(sortedPatterns.positives.map(function (positive) {
|
|
var globOpts = setIgnore(opts, sortedPatterns.negatives, positive.index);
|
|
return pify(glob, Promise)(positive.pattern, globOpts);
|
|
})).then(function (paths) {
|
|
return arrayUnion.apply(null, paths);
|
|
});
|
|
};
|
|
|
|
module.exports.sync = function (patterns, opts) {
|
|
var sortedPatterns = sortPatterns(patterns);
|
|
|
|
if (sortedPatterns.positives.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
return sortedPatterns.positives.reduce(function (ret, positive) {
|
|
return arrayUnion(ret, glob.sync(positive.pattern, setIgnore(opts, sortedPatterns.negatives, positive.index)));
|
|
}, []);
|
|
};
|
|
|