summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/minimatch/dist/cjs/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/minimatch/dist/cjs/index.js')
-rw-r--r--deps/npm/node_modules/minimatch/dist/cjs/index.js369
1 files changed, 40 insertions, 329 deletions
diff --git a/deps/npm/node_modules/minimatch/dist/cjs/index.js b/deps/npm/node_modules/minimatch/dist/cjs/index.js
index 3bb6c3dee5..3cbc67f892 100644
--- a/deps/npm/node_modules/minimatch/dist/cjs/index.js
+++ b/deps/npm/node_modules/minimatch/dist/cjs/index.js
@@ -3,13 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.unescape = exports.escape = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
+exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
const brace_expansion_1 = __importDefault(require("brace-expansion"));
-const brace_expressions_js_1 = require("./brace-expressions.js");
+const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js");
+const ast_js_1 = require("./ast.js");
const escape_js_1 = require("./escape.js");
const unescape_js_1 = require("./unescape.js");
const minimatch = (p, pattern, options = {}) => {
- assertValidPattern(pattern);
+ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
// shortcut: comments match nothing.
if (!options.nocomment && pattern.charAt(0) === '#') {
return false;
@@ -17,7 +18,6 @@ const minimatch = (p, pattern, options = {}) => {
return new Minimatch(pattern, options).match(p);
};
exports.minimatch = minimatch;
-exports.default = exports.minimatch;
// Optimized checking for the most common glob patterns.
const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
@@ -85,13 +85,6 @@ exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
exports.minimatch.sep = exports.sep;
exports.GLOBSTAR = Symbol('globstar **');
exports.minimatch.GLOBSTAR = exports.GLOBSTAR;
-const plTypes = {
- '!': { open: '(?:(?!(?:', close: '))[^/]*?)' },
- '?': { open: '(?:', close: ')?' },
- '+': { open: '(?:', close: ')+' },
- '*': { open: '(?:', close: ')*' },
- '@': { open: '(?:', close: ')' },
-};
// any single thing other than /
// don't need to escape / when using new RegExp()
const qmark = '[^/]';
@@ -104,15 +97,6 @@ const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
// not a ^ or / followed by a dot,
// followed by anything, any number of times.
const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
-// "abc" -> { a:true, b:true, c:true }
-const charSet = (s) => s.split('').reduce((set, c) => {
- set[c] = true;
- return set;
-}, {});
-// characters that need to be escaped in RegExp.
-const reSpecials = charSet('().*{}+?[]^$\\!');
-// characters that indicate we have to add the pattern start
-const addPatternStartSet = charSet('[.(');
const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options);
exports.filter = filter;
exports.minimatch.filter = exports.filter;
@@ -132,6 +116,16 @@ const defaults = (def) => {
return orig.defaults(ext(def, options)).Minimatch;
}
},
+ AST: class AST extends orig.AST {
+ /* c8 ignore start */
+ constructor(type, parent, options = {}) {
+ super(type, parent, ext(def, options));
+ }
+ /* c8 ignore stop */
+ static fromGlob(pattern, options = {}) {
+ return orig.AST.fromGlob(pattern, ext(def, options));
+ }
+ },
unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
escape: (s, options = {}) => orig.escape(s, ext(def, options)),
filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
@@ -156,7 +150,7 @@ exports.minimatch.defaults = exports.defaults;
// a{2..}b -> a{2..}b
// a{b}c -> a{b}c
const braceExpand = (pattern, options = {}) => {
- assertValidPattern(pattern);
+ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
// Thanks to Yeting Li <https://github.com/yetingli> for
// improving this regexp to avoid a ReDOS vulnerability.
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
@@ -167,15 +161,6 @@ const braceExpand = (pattern, options = {}) => {
};
exports.braceExpand = braceExpand;
exports.minimatch.braceExpand = exports.braceExpand;
-const MAX_PATTERN_LENGTH = 1024 * 64;
-const assertValidPattern = (pattern) => {
- if (typeof pattern !== 'string') {
- throw new TypeError('invalid pattern');
- }
- if (pattern.length > MAX_PATTERN_LENGTH) {
- throw new TypeError('pattern is too long');
- }
-};
// parse a component of the expanded set.
// At this point, no pattern may contain "/" in it
// so we're going to return a 2d array, where each entry is the full
@@ -201,7 +186,6 @@ const match = (list, pattern, options = {}) => {
exports.match = match;
exports.minimatch.match = exports.match;
// replace stuff like \* with *
-const globUnescape = (s) => s.replace(/\\(.)/g, '$1');
const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
class Minimatch {
@@ -223,7 +207,7 @@ class Minimatch {
windowsNoMagicRoot;
regexp;
constructor(pattern, options = {}) {
- assertValidPattern(pattern);
+ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
options = options || {};
this.options = options;
this.pattern = pattern;
@@ -814,7 +798,7 @@ class Minimatch {
return (0, exports.braceExpand)(this.pattern, this.options);
}
parse(pattern) {
- assertValidPattern(pattern);
+ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
const options = this.options;
// shortcuts
if (pattern === '**')
@@ -852,293 +836,8 @@ class Minimatch {
else if ((m = pattern.match(dotStarRE))) {
fastTest = dotStarTest;
}
- let re = '';
- let hasMagic = false;
- let escaping = false;
- // ? => one single character
- const patternListStack = [];
- const negativeLists = [];
- let stateChar = false;
- let uflag = false;
- let pl;
- // . and .. never match anything that doesn't start with .,
- // even when options.dot is set. However, if the pattern
- // starts with ., then traversal patterns can match.
- let dotTravAllowed = pattern.charAt(0) === '.';
- let dotFileAllowed = options.dot || dotTravAllowed;
- const patternStart = () => dotTravAllowed
- ? ''
- : dotFileAllowed
- ? '(?!(?:^|\\/)\\.{1,2}(?:$|\\/))'
- : '(?!\\.)';
- const subPatternStart = (p) => p.charAt(0) === '.'
- ? ''
- : options.dot
- ? '(?!(?:^|\\/)\\.{1,2}(?:$|\\/))'
- : '(?!\\.)';
- const clearStateChar = () => {
- if (stateChar) {
- // we had some state-tracking character
- // that wasn't consumed by this pass.
- switch (stateChar) {
- case '*':
- re += star;
- hasMagic = true;
- break;
- case '?':
- re += qmark;
- hasMagic = true;
- break;
- default:
- re += '\\' + stateChar;
- break;
- }
- this.debug('clearStateChar %j %j', stateChar, re);
- stateChar = false;
- }
- };
- for (let i = 0, c; i < pattern.length && (c = pattern.charAt(i)); i++) {
- this.debug('%s\t%s %s %j', pattern, i, re, c);
- // skip over any that are escaped.
- if (escaping) {
- // completely not allowed, even escaped.
- // should be impossible.
- /* c8 ignore start */
- if (c === '/') {
- return false;
- }
- /* c8 ignore stop */
- if (reSpecials[c]) {
- re += '\\';
- }
- re += c;
- escaping = false;
- continue;
- }
- switch (c) {
- // Should already be path-split by now.
- /* c8 ignore start */
- case '/': {
- return false;
- }
- /* c8 ignore stop */
- case '\\':
- clearStateChar();
- escaping = true;
- continue;
- // the various stateChar values
- // for the "extglob" stuff.
- case '?':
- case '*':
- case '+':
- case '@':
- case '!':
- this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c);
- // if we already have a stateChar, then it means
- // that there was something like ** or +? in there.
- // Handle the stateChar, then proceed with this one.
- this.debug('call clearStateChar %j', stateChar);
- clearStateChar();
- stateChar = c;
- // if extglob is disabled, then +(asdf|foo) isn't a thing.
- // just clear the statechar *now*, rather than even diving into
- // the patternList stuff.
- if (options.noext)
- clearStateChar();
- continue;
- case '(': {
- if (!stateChar) {
- re += '\\(';
- continue;
- }
- const plEntry = {
- type: stateChar,
- start: i - 1,
- reStart: re.length,
- open: plTypes[stateChar].open,
- close: plTypes[stateChar].close,
- };
- this.debug(this.pattern, '\t', plEntry);
- patternListStack.push(plEntry);
- // negation is (?:(?!(?:js)(?:<rest>))[^/]*)
- re += plEntry.open;
- // next entry starts with a dot maybe?
- if (plEntry.start === 0 && plEntry.type !== '!') {
- dotTravAllowed = true;
- re += subPatternStart(pattern.slice(i + 1));
- }
- this.debug('plType %j %j', stateChar, re);
- stateChar = false;
- continue;
- }
- case ')': {
- const plEntry = patternListStack[patternListStack.length - 1];
- if (!plEntry) {
- re += '\\)';
- continue;
- }
- patternListStack.pop();
- // closing an extglob
- clearStateChar();
- hasMagic = true;
- pl = plEntry;
- // negation is (?:(?!js)[^/]*)
- // The others are (?:<pattern>)<type>
- re += pl.close;
- if (pl.type === '!') {
- negativeLists.push(Object.assign(pl, { reEnd: re.length }));
- }
- continue;
- }
- case '|': {
- const plEntry = patternListStack[patternListStack.length - 1];
- if (!plEntry) {
- re += '\\|';
- continue;
- }
- clearStateChar();
- re += '|';
- // next subpattern can start with a dot?
- if (plEntry.start === 0 && plEntry.type !== '!') {
- dotTravAllowed = true;
- re += subPatternStart(pattern.slice(i + 1));
- }
- continue;
- }
- // these are mostly the same in regexp and glob
- case '[':
- // swallow any state-tracking char before the [
- clearStateChar();
- const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(pattern, i);
- if (consumed) {
- re += src;
- uflag = uflag || needUflag;
- i += consumed - 1;
- hasMagic = hasMagic || magic;
- }
- else {
- re += '\\[';
- }
- continue;
- case ']':
- re += '\\' + c;
- continue;
- default:
- // swallow any state char that wasn't consumed
- clearStateChar();
- re += regExpEscape(c);
- break;
- } // switch
- } // for
- // handle the case where we had a +( thing at the *end*
- // of the pattern.
- // each pattern list stack adds 3 chars, and we need to go through
- // and escape any | chars that were passed through as-is for the regexp.
- // Go through and escape them, taking care not to double-escape any
- // | chars that were already escaped.
- for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
- let tail;
- tail = re.slice(pl.reStart + pl.open.length);
- this.debug(this.pattern, 'setting tail', re, pl);
- // maybe some even number of \, then maybe 1 \, followed by a |
- tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, (_, $1, $2) => {
- if (!$2) {
- // the | isn't already escaped, so escape it.
- $2 = '\\';
- // should already be done
- /* c8 ignore start */
- }
- /* c8 ignore stop */
- // need to escape all those slashes *again*, without escaping the
- // one that we need for escaping the | character. As it works out,
- // escaping an even number of slashes can be done by simply repeating
- // it exactly after itself. That's why this trick works.
- //
- // I am sorry that you have to see this.
- return $1 + $1 + $2 + '|';
- });
- this.debug('tail=%j\n %s', tail, tail, pl, re);
- const t = pl.type === '*' ? star : pl.type === '?' ? qmark : '\\' + pl.type;
- hasMagic = true;
- re = re.slice(0, pl.reStart) + t + '\\(' + tail;
- }
- // handle trailing things that only matter at the very end.
- clearStateChar();
- if (escaping) {
- // trailing \\
- re += '\\\\';
- }
- // only need to apply the nodot start if the re starts with
- // something that could conceivably capture a dot
- const addPatternStart = addPatternStartSet[re.charAt(0)];
- // Hack to work around lack of negative lookbehind in JS
- // A pattern like: *.!(x).!(y|z) needs to ensure that a name
- // like 'a.xyz.yz' doesn't match. So, the first negative
- // lookahead, has to look ALL the way ahead, to the end of
- // the pattern.
- for (let n = negativeLists.length - 1; n > -1; n--) {
- const nl = negativeLists[n];
- const nlBefore = re.slice(0, nl.reStart);
- const nlFirst = re.slice(nl.reStart, nl.reEnd - 8);
- let nlAfter = re.slice(nl.reEnd);
- const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter;
- // Handle nested stuff like *(*.js|!(*.json)), where open parens
- // mean that we should *not* include the ) in the bit that is considered
- // "after" the negated section.
- const closeParensBefore = nlBefore.split(')').length;
- const openParensBefore = nlBefore.split('(').length - closeParensBefore;
- let cleanAfter = nlAfter;
- for (let i = 0; i < openParensBefore; i++) {
- cleanAfter = cleanAfter.replace(/\)[+*?]?/, '');
- }
- nlAfter = cleanAfter;
- const dollar = nlAfter === '' ? '(?:$|\\/)' : '';
- re = nlBefore + nlFirst + nlAfter + dollar + nlLast;
- }
- // if the re is not "" at this point, then we need to make sure
- // it doesn't match against an empty path part.
- // Otherwise a/* will match a/, which it should not.
- if (re !== '' && hasMagic) {
- re = '(?=.)' + re;
- }
- if (addPatternStart) {
- re = patternStart() + re;
- }
- // if it's nocase, and the lcase/uppercase don't match, it's magic
- if (options.nocase && !hasMagic && !options.nocaseMagicOnly) {
- hasMagic = pattern.toUpperCase() !== pattern.toLowerCase();
- }
- // skip the regexp for non-magical patterns
- // unescape anything in it, though, so that it'll be
- // an exact match against a file etc.
- if (!hasMagic) {
- return globUnescape(re);
- }
- const flags = (options.nocase ? 'i' : '') + (uflag ? 'u' : '');
- try {
- const ext = fastTest
- ? {
- _glob: pattern,
- _src: re,
- test: fastTest,
- }
- : {
- _glob: pattern,
- _src: re,
- };
- return Object.assign(new RegExp('^' + re + '$', flags), ext);
- /* c8 ignore start */
- }
- catch (er) {
- // should be impossible
- // If it was an invalid regular expression, then it can't match
- // anything. This trick looks for a character after the end of
- // the string, which is of course impossible, except in multi-line
- // mode, but it's not a /m regex.
- this.debug('invalid regexp', er);
- return new RegExp('$.');
- }
- /* c8 ignore stop */
+ const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
+ return fastTest ? Object.assign(re, { test: fastTest }) : re;
}
makeRe() {
if (this.regexp || this.regexp === false)
@@ -1160,7 +859,7 @@ class Minimatch {
: options.dot
? twoStarDot
: twoStarNoDot;
- const flags = options.nocase ? 'i' : '';
+ const flags = new Set(options.nocase ? ['i'] : []);
// regexpify non-globstar patterns
// if ** is only item, then we just do one twoStar
// if ** is first, and there are more, prepend (\/|twoStar\/)? to next
@@ -1169,11 +868,17 @@ class Minimatch {
// then filter out GLOBSTAR symbols
let re = set
.map(pattern => {
- const pp = pattern.map(p => typeof p === 'string'
- ? regExpEscape(p)
- : p === exports.GLOBSTAR
- ? exports.GLOBSTAR
- : p._src);
+ const pp = pattern.map(p => {
+ if (p instanceof RegExp) {
+ for (const f of p.flags.split(''))
+ flags.add(f);
+ }
+ return typeof p === 'string'
+ ? regExpEscape(p)
+ : p === exports.GLOBSTAR
+ ? exports.GLOBSTAR
+ : p._src;
+ });
pp.forEach((p, i) => {
const next = pp[i + 1];
const prev = pp[i - 1];
@@ -1199,14 +904,17 @@ class Minimatch {
return pp.filter(p => p !== exports.GLOBSTAR).join('/');
})
.join('|');
+ // need to wrap in parens if we had more than one thing with |,
+ // otherwise only the first will be anchored to ^ and the last to $
+ const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
// must match entire pattern
// ending in a * or ** will make it less strict.
- re = '^(?:' + re + ')$';
+ re = '^' + open + re + close + '$';
// can match anything, as long as it's not this.
if (this.negate)
- re = '^(?!' + re + ').*$';
+ re = '^(?!' + re + ').+$';
try {
- this.regexp = new RegExp(re, flags);
+ this.regexp = new RegExp(re, [...flags].join(''));
/* c8 ignore start */
}
catch (ex) {
@@ -1293,11 +1001,14 @@ class Minimatch {
}
exports.Minimatch = Minimatch;
/* c8 ignore start */
+var ast_js_2 = require("./ast.js");
+Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
var escape_js_2 = require("./escape.js");
Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
var unescape_js_2 = require("./unescape.js");
Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
/* c8 ignore stop */
+exports.minimatch.AST = ast_js_1.AST;
exports.minimatch.Minimatch = Minimatch;
exports.minimatch.escape = escape_js_1.escape;
exports.minimatch.unescape = unescape_js_1.unescape;