Spaces:
Running
Running
; | |
const path = require('path'); | |
const WIN_SLASH = '\\\\/'; | |
const WIN_NO_SLASH = `[^${WIN_SLASH}]`; | |
/** | |
* Posix glob regex | |
*/ | |
const DOT_LITERAL = '\\.'; | |
const PLUS_LITERAL = '\\+'; | |
const QMARK_LITERAL = '\\?'; | |
const SLASH_LITERAL = '\\/'; | |
const ONE_CHAR = '(?=.)'; | |
const QMARK = '[^/]'; | |
const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; | |
const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; | |
const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; | |
const NO_DOT = `(?!${DOT_LITERAL})`; | |
const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; | |
const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; | |
const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; | |
const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; | |
const STAR = `${QMARK}*?`; | |
const POSIX_CHARS = { | |
DOT_LITERAL, | |
PLUS_LITERAL, | |
QMARK_LITERAL, | |
SLASH_LITERAL, | |
ONE_CHAR, | |
QMARK, | |
END_ANCHOR, | |
DOTS_SLASH, | |
NO_DOT, | |
NO_DOTS, | |
NO_DOT_SLASH, | |
NO_DOTS_SLASH, | |
QMARK_NO_DOT, | |
STAR, | |
START_ANCHOR | |
}; | |
/** | |
* Windows glob regex | |
*/ | |
const WINDOWS_CHARS = { | |
...POSIX_CHARS, | |
SLASH_LITERAL: `[${WIN_SLASH}]`, | |
QMARK: WIN_NO_SLASH, | |
STAR: `${WIN_NO_SLASH}*?`, | |
DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, | |
NO_DOT: `(?!${DOT_LITERAL})`, | |
NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, | |
NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, | |
NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, | |
QMARK_NO_DOT: `[^.${WIN_SLASH}]`, | |
START_ANCHOR: `(?:^|[${WIN_SLASH}])`, | |
END_ANCHOR: `(?:[${WIN_SLASH}]|$)` | |
}; | |
/** | |
* POSIX Bracket Regex | |
*/ | |
const POSIX_REGEX_SOURCE = { | |
alnum: 'a-zA-Z0-9', | |
alpha: 'a-zA-Z', | |
ascii: '\\x00-\\x7F', | |
blank: ' \\t', | |
cntrl: '\\x00-\\x1F\\x7F', | |
digit: '0-9', | |
graph: '\\x21-\\x7E', | |
lower: 'a-z', | |
print: '\\x20-\\x7E ', | |
punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', | |
space: ' \\t\\r\\n\\v\\f', | |
upper: 'A-Z', | |
word: 'A-Za-z0-9_', | |
xdigit: 'A-Fa-f0-9' | |
}; | |
module.exports = { | |
MAX_LENGTH: 1024 * 64, | |
POSIX_REGEX_SOURCE, | |
// regular expressions | |
REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, | |
REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, | |
REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, | |
REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, | |
REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, | |
REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, | |
// Replace globs with equivalent patterns to reduce parsing time. | |
REPLACEMENTS: { | |
'***': '*', | |
'**/**': '**', | |
'**/**/**': '**' | |
}, | |
// Digits | |
CHAR_0: 48, /* 0 */ | |
CHAR_9: 57, /* 9 */ | |
// Alphabet chars. | |
CHAR_UPPERCASE_A: 65, /* A */ | |
CHAR_LOWERCASE_A: 97, /* a */ | |
CHAR_UPPERCASE_Z: 90, /* Z */ | |
CHAR_LOWERCASE_Z: 122, /* z */ | |
CHAR_LEFT_PARENTHESES: 40, /* ( */ | |
CHAR_RIGHT_PARENTHESES: 41, /* ) */ | |
CHAR_ASTERISK: 42, /* * */ | |
// Non-alphabetic chars. | |
CHAR_AMPERSAND: 38, /* & */ | |
CHAR_AT: 64, /* @ */ | |
CHAR_BACKWARD_SLASH: 92, /* \ */ | |
CHAR_CARRIAGE_RETURN: 13, /* \r */ | |
CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ | |
CHAR_COLON: 58, /* : */ | |
CHAR_COMMA: 44, /* , */ | |
CHAR_DOT: 46, /* . */ | |
CHAR_DOUBLE_QUOTE: 34, /* " */ | |
CHAR_EQUAL: 61, /* = */ | |
CHAR_EXCLAMATION_MARK: 33, /* ! */ | |
CHAR_FORM_FEED: 12, /* \f */ | |
CHAR_FORWARD_SLASH: 47, /* / */ | |
CHAR_GRAVE_ACCENT: 96, /* ` */ | |
CHAR_HASH: 35, /* # */ | |
CHAR_HYPHEN_MINUS: 45, /* - */ | |
CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ | |
CHAR_LEFT_CURLY_BRACE: 123, /* { */ | |
CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ | |
CHAR_LINE_FEED: 10, /* \n */ | |
CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ | |
CHAR_PERCENT: 37, /* % */ | |
CHAR_PLUS: 43, /* + */ | |
CHAR_QUESTION_MARK: 63, /* ? */ | |
CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ | |
CHAR_RIGHT_CURLY_BRACE: 125, /* } */ | |
CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ | |
CHAR_SEMICOLON: 59, /* ; */ | |
CHAR_SINGLE_QUOTE: 39, /* ' */ | |
CHAR_SPACE: 32, /* */ | |
CHAR_TAB: 9, /* \t */ | |
CHAR_UNDERSCORE: 95, /* _ */ | |
CHAR_VERTICAL_LINE: 124, /* | */ | |
CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ | |
SEP: path.sep, | |
/** | |
* Create EXTGLOB_CHARS | |
*/ | |
extglobChars(chars) { | |
return { | |
'!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, | |
'?': { type: 'qmark', open: '(?:', close: ')?' }, | |
'+': { type: 'plus', open: '(?:', close: ')+' }, | |
'*': { type: 'star', open: '(?:', close: ')*' }, | |
'@': { type: 'at', open: '(?:', close: ')' } | |
}; | |
}, | |
/** | |
* Create GLOB_CHARS | |
*/ | |
globChars(win32) { | |
return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; | |
} | |
}; | |