2 var Promise = require('pinkie-promise');
3 var arrayUnion = require('array-union');
4 var objectAssign = require('object-assign');
5 var glob = require('glob');
6 var pify = require('pify');
8 var globP = pify(glob, Promise).bind(glob);
10 function isNegative(pattern) {
11 return pattern[0] === '!';
14 function isString(value) {
15 return typeof value === 'string';
18 function assertPatternsInput(patterns) {
19 if (!patterns.every(isString)) {
20 throw new TypeError('patterns must be a string or an array of strings');
24 function generateGlobTasks(patterns, opts) {
25 patterns = [].concat(patterns);
26 assertPatternsInput(patterns);
31 cache: Object.create(null),
32 statCache: Object.create(null),
33 realpathCache: Object.create(null),
34 symlinks: Object.create(null),
38 patterns.forEach(function (pattern, i) {
39 if (isNegative(pattern)) {
43 var ignore = patterns.slice(i).filter(isNegative).map(function (pattern) {
44 return pattern.slice(1);
49 opts: objectAssign({}, opts, {
50 ignore: opts.ignore.concat(ignore)
58 module.exports = function (patterns, opts) {
62 globTasks = generateGlobTasks(patterns, opts);
64 return Promise.reject(err);
67 return Promise.all(globTasks.map(function (task) {
68 return globP(task.pattern, task.opts);
69 })).then(function (paths) {
70 return arrayUnion.apply(null, paths);
74 module.exports.sync = function (patterns, opts) {
75 var globTasks = generateGlobTasks(patterns, opts);
77 return globTasks.reduce(function (matches, task) {
78 return arrayUnion(matches, glob.sync(task.pattern, task.opts));
82 module.exports.generateGlobTasks = generateGlobTasks;
84 module.exports.hasMagic = function (patterns, opts) {
85 return [].concat(patterns).some(function (pattern) {
86 return glob.hasMagic(pattern, opts);