'use strict'; 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; }, };