123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var path_1 = require("path");
  4. var globFunction = require("glob");
  5. var helpers_1 = require("./helpers");
  6. function isNegative(pattern) {
  7. return pattern[0] === '!';
  8. }
  9. function isString(pattern) {
  10. return typeof pattern === 'string';
  11. }
  12. function assertPatternsInput(patterns) {
  13. if (!patterns.every(isString)) {
  14. throw new Error('Each glob entry must be a string');
  15. }
  16. }
  17. function generateGlobTasks(patterns, opts) {
  18. patterns = [].concat(patterns);
  19. assertPatternsInput(patterns);
  20. var globTasks = [];
  21. opts = Object.assign({
  22. cache: Object.create(null),
  23. statCache: Object.create(null),
  24. realpathCache: Object.create(null),
  25. symlinks: Object.create(null),
  26. ignore: []
  27. }, opts);
  28. patterns.forEach(function (pattern, i) {
  29. if (isNegative(pattern)) {
  30. return;
  31. }
  32. var ignore = patterns.slice(i).filter(isNegative).map(function (pattern) {
  33. return pattern.slice(1);
  34. });
  35. var task = {
  36. pattern: pattern,
  37. opts: Object.assign({}, opts, {
  38. ignore: opts.ignore.concat(ignore).concat(exports.DEFAULT_IGNORE_ARRAY),
  39. nodir: true
  40. }),
  41. base: getBasePath(pattern)
  42. };
  43. globTasks.push(task);
  44. });
  45. return globTasks;
  46. }
  47. exports.generateGlobTasks = generateGlobTasks;
  48. function globWrapper(task) {
  49. return new Promise(function (resolve, reject) {
  50. globFunction(task.pattern, task.opts, function (err, files) {
  51. if (err) {
  52. return reject(err);
  53. }
  54. var globResults = files.map(function (file) {
  55. return {
  56. absolutePath: path_1.normalize(path_1.resolve(file)),
  57. base: path_1.normalize(path_1.resolve(getBasePath(task.pattern)))
  58. };
  59. });
  60. return resolve(globResults);
  61. });
  62. });
  63. }
  64. function globAll(globs) {
  65. return Promise.resolve().then(function () {
  66. var globTasks = generateGlobTasks(globs, {});
  67. var resultSet = [];
  68. var promises = [];
  69. for (var _i = 0, globTasks_1 = globTasks; _i < globTasks_1.length; _i++) {
  70. var globTask = globTasks_1[_i];
  71. var promise = globWrapper(globTask);
  72. promises.push(promise);
  73. promise.then(function (globResult) {
  74. resultSet = resultSet.concat(globResult);
  75. });
  76. }
  77. return Promise.all(promises).then(function () {
  78. return resultSet;
  79. });
  80. });
  81. }
  82. exports.globAll = globAll;
  83. function getBasePath(pattern) {
  84. var basePath;
  85. var sepRe = (process.platform === 'win32' ? /[\/\\]/ : /\/+/);
  86. var parent = globParent(pattern);
  87. basePath = toAbsoluteGlob(parent);
  88. if (!sepRe.test(basePath.charAt(basePath.length - 1))) {
  89. basePath += path_1.sep;
  90. }
  91. return basePath;
  92. }
  93. exports.getBasePath = getBasePath;
  94. function isNegatedGlob(pattern) {
  95. var glob = { negated: false, pattern: pattern, original: pattern };
  96. if (pattern.charAt(0) === '!' && pattern.charAt(1) !== '(') {
  97. glob.negated = true;
  98. glob.pattern = pattern.slice(1);
  99. }
  100. return glob;
  101. }
  102. // https://github.com/jonschlinkert/to-absolute-glob/blob/master/index.js
  103. function toAbsoluteGlob(pattern) {
  104. var cwd = helpers_1.toUnixPath(process.cwd());
  105. // trim starting ./ from glob patterns
  106. if (pattern.slice(0, 2) === './') {
  107. pattern = pattern.slice(2);
  108. }
  109. // when the glob pattern is only a . use an empty string
  110. if (pattern.length === 1 && pattern === '.') {
  111. pattern = '';
  112. }
  113. // store last character before glob is modified
  114. var suffix = pattern.slice(-1);
  115. // check to see if glob is negated (and not a leading negated-extglob)
  116. var ing = isNegatedGlob(pattern);
  117. pattern = ing.pattern;
  118. if (!path_1.isAbsolute(pattern) || pattern.slice(0, 1) === '\\') {
  119. pattern = path_1.join(cwd, pattern);
  120. }
  121. // if glob had a trailing `/`, re-add it now in case it was removed
  122. if (suffix === '/' && pattern.slice(-1) !== '/') {
  123. pattern += '/';
  124. }
  125. // re-add leading `!` if it was removed
  126. return ing.negated ? '!' + pattern : pattern;
  127. }
  128. // https://github.com/es128/glob-parent/blob/master/index.js
  129. function globParent(pattern) {
  130. // special case for strings ending in enclosure containing path separator
  131. if (/[\{\[].*[\/]*.*[\}\]]$/.test(pattern))
  132. pattern += '/';
  133. // preserves full path in case of trailing path separator
  134. pattern += 'a';
  135. // remove path parts that are globby
  136. do {
  137. pattern = helpers_1.toUnixPath(path_1.dirname(pattern));
  138. } while (isGlob(pattern) || /(^|[^\\])([\{\[]|\([^\)]+$)/.test(pattern));
  139. // remove escape chars and return result
  140. return pattern.replace(/\\([\*\?\|\[\]\(\)\{\}])/g, '$1');
  141. }
  142. // https://github.com/jonschlinkert/is-glob/blob/master/index.js
  143. function isGlob(pattern) {
  144. if (pattern === '') {
  145. return false;
  146. }
  147. if (isExtglob(pattern))
  148. return true;
  149. var regex = /(\\).|([*?]|\[.*\]|\{.*\}|\(.*\|.*\)|^!)/;
  150. var match;
  151. while ((match = regex.exec(pattern))) {
  152. if (match[2])
  153. return true;
  154. pattern = pattern.slice(match.index + match[0].length);
  155. }
  156. return false;
  157. }
  158. // https://github.com/jonschlinkert/is-extglob/blob/master/index.js
  159. function isExtglob(pattern) {
  160. if (pattern === '') {
  161. return false;
  162. }
  163. var match;
  164. while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(pattern))) {
  165. if (match[2])
  166. return true;
  167. pattern = pattern.slice(match.index + match[0].length);
  168. }
  169. return false;
  170. }
  171. exports.DEFAULT_IGNORE_ARRAY = ['**/*.DS_Store'];