index.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. 'use strict';
  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 arrify = require('arrify');
  7. var pify = require('pify');
  8. var globP = pify(glob, Promise).bind(glob);
  9. function isNegative(pattern) {
  10. return pattern[0] === '!';
  11. }
  12. function generateGlobTasks(patterns, opts) {
  13. var globTasks = [];
  14. patterns = arrify(patterns);
  15. opts = objectAssign({
  16. cache: Object.create(null),
  17. statCache: Object.create(null),
  18. realpathCache: Object.create(null),
  19. symlinks: Object.create(null),
  20. ignore: []
  21. }, opts);
  22. patterns.forEach(function (pattern, i) {
  23. if (isNegative(pattern)) {
  24. return;
  25. }
  26. var ignore = patterns.slice(i).filter(isNegative).map(function (pattern) {
  27. return pattern.slice(1);
  28. });
  29. globTasks.push({
  30. pattern: pattern,
  31. opts: objectAssign({}, opts, {
  32. ignore: opts.ignore.concat(ignore)
  33. })
  34. });
  35. });
  36. return globTasks;
  37. }
  38. module.exports = function (patterns, opts) {
  39. var globTasks = generateGlobTasks(patterns, opts);
  40. return Promise.all(globTasks.map(function (task) {
  41. return globP(task.pattern, task.opts);
  42. })).then(function (paths) {
  43. return arrayUnion.apply(null, paths);
  44. });
  45. };
  46. module.exports.sync = function (patterns, opts) {
  47. var globTasks = generateGlobTasks(patterns, opts);
  48. return globTasks.reduce(function (matches, task) {
  49. return arrayUnion(matches, glob.sync(task.pattern, task.opts));
  50. }, []);
  51. };
  52. module.exports.generateGlobTasks = generateGlobTasks;