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.

index.js 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use strict';
  2. var union = require('array-union');
  3. var assign = require('object-assign');
  4. var async = require('async');
  5. var glob = require('glob');
  6. function arrayify(arr) {
  7. return Array.isArray(arr) ? arr : [arr];
  8. }
  9. function sortPatterns(patterns) {
  10. patterns = arrayify(patterns);
  11. var positives = [];
  12. var negatives = [];
  13. patterns.forEach(function (pattern, index) {
  14. var isNegative = pattern[0] === '!';
  15. (isNegative ? negatives : positives).push({
  16. index: index,
  17. pattern: isNegative ? pattern.slice(1) : pattern
  18. });
  19. });
  20. return {
  21. positives: positives,
  22. negatives: negatives
  23. };
  24. }
  25. function setIgnore(opts, negatives, positiveIndex) {
  26. opts = assign({}, opts);
  27. var negativePatterns = negatives.filter(function (negative) {
  28. return negative.index > positiveIndex;
  29. }).map(function (negative) {
  30. return negative.pattern;
  31. });
  32. opts.ignore = (opts.ignore || []).concat(negativePatterns);
  33. return opts;
  34. }
  35. module.exports = function (patterns, opts, cb) {
  36. var sortedPatterns = sortPatterns(patterns);
  37. if (typeof opts === 'function') {
  38. cb = opts;
  39. opts = {};
  40. }
  41. if (sortedPatterns.positives.length === 0) {
  42. cb(null, []);
  43. return;
  44. }
  45. async.parallel(sortedPatterns.positives.map(function (positive) {
  46. return function (cb2) {
  47. glob(positive.pattern, setIgnore(opts, sortedPatterns.negatives, positive.index), function (err, paths) {
  48. if (err) {
  49. cb2(err);
  50. return;
  51. }
  52. cb2(null, paths);
  53. });
  54. };
  55. }), function (err, paths) {
  56. if (err) {
  57. cb(err);
  58. return;
  59. }
  60. cb(null, union.apply(null, paths));
  61. });
  62. };
  63. module.exports.sync = function (patterns, opts) {
  64. var sortedPatterns = sortPatterns(patterns);
  65. if (sortedPatterns.positives.length === 0) {
  66. return [];
  67. }
  68. return sortedPatterns.positives.reduce(function (ret, positive) {
  69. return union(ret, glob.sync(positive.pattern, setIgnore(opts, sortedPatterns.negatives, positive.index)));
  70. }, []);
  71. };