UNPKG

5.82 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var path_1 = require("path");
4var globFunction = require("glob");
5var helpers_1 = require("./helpers");
6function isNegative(pattern) {
7 return pattern[0] === '!';
8}
9function isString(pattern) {
10 return typeof pattern === 'string';
11}
12function assertPatternsInput(patterns) {
13 if (!patterns.every(isString)) {
14 throw new Error('Each glob entry must be a string');
15 }
16}
17function 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}
47exports.generateGlobTasks = generateGlobTasks;
48function 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}
64function 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}
82exports.globAll = globAll;
83function 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}
93exports.getBasePath = getBasePath;
94function 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
103function 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
129function 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
143function 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
159function 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}
171exports.DEFAULT_IGNORE_ARRAY = ['**/*.DS_Store'];