implemented basic client-server communication
This commit is contained in:
		
							
								
								
									
										179
									
								
								node_modules/picomatch/lib/constants.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								node_modules/picomatch/lib/constants.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,179 @@
 | 
			
		||||
'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;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										1091
									
								
								node_modules/picomatch/lib/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1091
									
								
								node_modules/picomatch/lib/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										342
									
								
								node_modules/picomatch/lib/picomatch.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								node_modules/picomatch/lib/picomatch.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,342 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const path = require('path');
 | 
			
		||||
const scan = require('./scan');
 | 
			
		||||
const parse = require('./parse');
 | 
			
		||||
const utils = require('./utils');
 | 
			
		||||
const constants = require('./constants');
 | 
			
		||||
const isObject = val => val && typeof val === 'object' && !Array.isArray(val);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Creates a matcher function from one or more glob patterns. The
 | 
			
		||||
 * returned function takes a string to match as its first argument,
 | 
			
		||||
 * and returns true if the string is a match. The returned matcher
 | 
			
		||||
 * function also takes a boolean as the second argument that, when true,
 | 
			
		||||
 * returns an object with additional information.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch(glob[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * const isMatch = picomatch('*.!(*a)');
 | 
			
		||||
 * console.log(isMatch('a.a')); //=> false
 | 
			
		||||
 * console.log(isMatch('a.b')); //=> true
 | 
			
		||||
 * ```
 | 
			
		||||
 * @name picomatch
 | 
			
		||||
 * @param {String|Array} `globs` One or more glob patterns.
 | 
			
		||||
 * @param {Object=} `options`
 | 
			
		||||
 * @return {Function=} Returns a matcher function.
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const picomatch = (glob, options, returnState = false) => {
 | 
			
		||||
  if (Array.isArray(glob)) {
 | 
			
		||||
    const fns = glob.map(input => picomatch(input, options, returnState));
 | 
			
		||||
    const arrayMatcher = str => {
 | 
			
		||||
      for (const isMatch of fns) {
 | 
			
		||||
        const state = isMatch(str);
 | 
			
		||||
        if (state) return state;
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
    };
 | 
			
		||||
    return arrayMatcher;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const isState = isObject(glob) && glob.tokens && glob.input;
 | 
			
		||||
 | 
			
		||||
  if (glob === '' || (typeof glob !== 'string' && !isState)) {
 | 
			
		||||
    throw new TypeError('Expected pattern to be a non-empty string');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const opts = options || {};
 | 
			
		||||
  const posix = utils.isWindows(options);
 | 
			
		||||
  const regex = isState
 | 
			
		||||
    ? picomatch.compileRe(glob, options)
 | 
			
		||||
    : picomatch.makeRe(glob, options, false, true);
 | 
			
		||||
 | 
			
		||||
  const state = regex.state;
 | 
			
		||||
  delete regex.state;
 | 
			
		||||
 | 
			
		||||
  let isIgnored = () => false;
 | 
			
		||||
  if (opts.ignore) {
 | 
			
		||||
    const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
 | 
			
		||||
    isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const matcher = (input, returnObject = false) => {
 | 
			
		||||
    const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });
 | 
			
		||||
    const result = { glob, state, regex, posix, input, output, match, isMatch };
 | 
			
		||||
 | 
			
		||||
    if (typeof opts.onResult === 'function') {
 | 
			
		||||
      opts.onResult(result);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (isMatch === false) {
 | 
			
		||||
      result.isMatch = false;
 | 
			
		||||
      return returnObject ? result : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (isIgnored(input)) {
 | 
			
		||||
      if (typeof opts.onIgnore === 'function') {
 | 
			
		||||
        opts.onIgnore(result);
 | 
			
		||||
      }
 | 
			
		||||
      result.isMatch = false;
 | 
			
		||||
      return returnObject ? result : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof opts.onMatch === 'function') {
 | 
			
		||||
      opts.onMatch(result);
 | 
			
		||||
    }
 | 
			
		||||
    return returnObject ? result : true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  if (returnState) {
 | 
			
		||||
    matcher.state = state;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return matcher;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test `input` with the given `regex`. This is used by the main
 | 
			
		||||
 * `picomatch()` function to test the input string.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch.test(input, regex[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
 | 
			
		||||
 * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `input` String to test.
 | 
			
		||||
 * @param {RegExp} `regex`
 | 
			
		||||
 * @return {Object} Returns an object with matching info.
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.test = (input, regex, options, { glob, posix } = {}) => {
 | 
			
		||||
  if (typeof input !== 'string') {
 | 
			
		||||
    throw new TypeError('Expected input to be a string');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (input === '') {
 | 
			
		||||
    return { isMatch: false, output: '' };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const opts = options || {};
 | 
			
		||||
  const format = opts.format || (posix ? utils.toPosixSlashes : null);
 | 
			
		||||
  let match = input === glob;
 | 
			
		||||
  let output = (match && format) ? format(input) : input;
 | 
			
		||||
 | 
			
		||||
  if (match === false) {
 | 
			
		||||
    output = format ? format(input) : input;
 | 
			
		||||
    match = output === glob;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (match === false || opts.capture === true) {
 | 
			
		||||
    if (opts.matchBase === true || opts.basename === true) {
 | 
			
		||||
      match = picomatch.matchBase(input, regex, options, posix);
 | 
			
		||||
    } else {
 | 
			
		||||
      match = regex.exec(output);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { isMatch: Boolean(match), match, output };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Match the basename of a filepath.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch.matchBase(input, glob[, options]);
 | 
			
		||||
 * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `input` String to test.
 | 
			
		||||
 * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).
 | 
			
		||||
 * @return {Boolean}
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {
 | 
			
		||||
  const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);
 | 
			
		||||
  return regex.test(path.basename(input));
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns true if **any** of the given glob `patterns` match the specified `string`.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch.isMatch(string, patterns[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
 | 
			
		||||
 * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String|Array} str The string to test.
 | 
			
		||||
 * @param {String|Array} patterns One or more glob patterns to use for matching.
 | 
			
		||||
 * @param {Object} [options] See available [options](#options).
 | 
			
		||||
 * @return {Boolean} Returns true if any patterns match `str`
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parse a glob pattern to create the source string for a regular
 | 
			
		||||
 * expression.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * const result = picomatch.parse(pattern[, options]);
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `pattern`
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @return {Object} Returns an object with useful properties and output to be used as a regex source string.
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.parse = (pattern, options) => {
 | 
			
		||||
  if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));
 | 
			
		||||
  return parse(pattern, { ...options, fastpaths: false });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Scan a glob pattern to separate the pattern into segments.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch.scan(input[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * const result = picomatch.scan('!./foo/*.js');
 | 
			
		||||
 * console.log(result);
 | 
			
		||||
 * { prefix: '!./',
 | 
			
		||||
 *   input: '!./foo/*.js',
 | 
			
		||||
 *   start: 3,
 | 
			
		||||
 *   base: 'foo',
 | 
			
		||||
 *   glob: '*.js',
 | 
			
		||||
 *   isBrace: false,
 | 
			
		||||
 *   isBracket: false,
 | 
			
		||||
 *   isGlob: true,
 | 
			
		||||
 *   isExtglob: false,
 | 
			
		||||
 *   isGlobstar: false,
 | 
			
		||||
 *   negated: true }
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `input` Glob pattern to scan.
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @return {Object} Returns an object with
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.scan = (input, options) => scan(input, options);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Compile a regular expression from the `state` object returned by the
 | 
			
		||||
 * [parse()](#parse) method.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {Object} `state`
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.
 | 
			
		||||
 * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
 | 
			
		||||
 * @return {RegExp}
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {
 | 
			
		||||
  if (returnOutput === true) {
 | 
			
		||||
    return state.output;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const opts = options || {};
 | 
			
		||||
  const prepend = opts.contains ? '' : '^';
 | 
			
		||||
  const append = opts.contains ? '' : '$';
 | 
			
		||||
 | 
			
		||||
  let source = `${prepend}(?:${state.output})${append}`;
 | 
			
		||||
  if (state && state.negated === true) {
 | 
			
		||||
    source = `^(?!${source}).*$`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const regex = picomatch.toRegex(source, options);
 | 
			
		||||
  if (returnState === true) {
 | 
			
		||||
    regex.state = state;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return regex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a regular expression from a parsed glob pattern.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * const state = picomatch.parse('*.js');
 | 
			
		||||
 * // picomatch.compileRe(state[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * console.log(picomatch.compileRe(state));
 | 
			
		||||
 * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `state` The object returned from the `.parse` method.
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
 | 
			
		||||
 * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
 | 
			
		||||
 * @return {RegExp} Returns a regex created from the given pattern.
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
 | 
			
		||||
  if (!input || typeof input !== 'string') {
 | 
			
		||||
    throw new TypeError('Expected a non-empty string');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let parsed = { negated: false, fastpaths: true };
 | 
			
		||||
 | 
			
		||||
  if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {
 | 
			
		||||
    parsed.output = parse.fastpaths(input, options);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!parsed.output) {
 | 
			
		||||
    parsed = parse(input, options);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return picomatch.compileRe(parsed, options, returnOutput, returnState);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a regular expression from the given regex source string.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const picomatch = require('picomatch');
 | 
			
		||||
 * // picomatch.toRegex(source[, options]);
 | 
			
		||||
 *
 | 
			
		||||
 * const { output } = picomatch.parse('*.js');
 | 
			
		||||
 * console.log(picomatch.toRegex(output));
 | 
			
		||||
 * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `source` Regular expression source string.
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @return {RegExp}
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.toRegex = (source, options) => {
 | 
			
		||||
  try {
 | 
			
		||||
    const opts = options || {};
 | 
			
		||||
    return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    if (options && options.debug === true) throw err;
 | 
			
		||||
    return /$^/;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Picomatch constants.
 | 
			
		||||
 * @return {Object}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
picomatch.constants = constants;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Expose "picomatch"
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
module.exports = picomatch;
 | 
			
		||||
							
								
								
									
										391
									
								
								node_modules/picomatch/lib/scan.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								node_modules/picomatch/lib/scan.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,391 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const utils = require('./utils');
 | 
			
		||||
const {
 | 
			
		||||
  CHAR_ASTERISK,             /* * */
 | 
			
		||||
  CHAR_AT,                   /* @ */
 | 
			
		||||
  CHAR_BACKWARD_SLASH,       /* \ */
 | 
			
		||||
  CHAR_COMMA,                /* , */
 | 
			
		||||
  CHAR_DOT,                  /* . */
 | 
			
		||||
  CHAR_EXCLAMATION_MARK,     /* ! */
 | 
			
		||||
  CHAR_FORWARD_SLASH,        /* / */
 | 
			
		||||
  CHAR_LEFT_CURLY_BRACE,     /* { */
 | 
			
		||||
  CHAR_LEFT_PARENTHESES,     /* ( */
 | 
			
		||||
  CHAR_LEFT_SQUARE_BRACKET,  /* [ */
 | 
			
		||||
  CHAR_PLUS,                 /* + */
 | 
			
		||||
  CHAR_QUESTION_MARK,        /* ? */
 | 
			
		||||
  CHAR_RIGHT_CURLY_BRACE,    /* } */
 | 
			
		||||
  CHAR_RIGHT_PARENTHESES,    /* ) */
 | 
			
		||||
  CHAR_RIGHT_SQUARE_BRACKET  /* ] */
 | 
			
		||||
} = require('./constants');
 | 
			
		||||
 | 
			
		||||
const isPathSeparator = code => {
 | 
			
		||||
  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const depth = token => {
 | 
			
		||||
  if (token.isPrefix !== true) {
 | 
			
		||||
    token.depth = token.isGlobstar ? Infinity : 1;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Quickly scans a glob pattern and returns an object with a handful of
 | 
			
		||||
 * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
 | 
			
		||||
 * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
 | 
			
		||||
 * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
 * const pm = require('picomatch');
 | 
			
		||||
 * console.log(pm.scan('foo/bar/*.js'));
 | 
			
		||||
 * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
 | 
			
		||||
 * ```
 | 
			
		||||
 * @param {String} `str`
 | 
			
		||||
 * @param {Object} `options`
 | 
			
		||||
 * @return {Object} Returns an object with tokens and regex source string.
 | 
			
		||||
 * @api public
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const scan = (input, options) => {
 | 
			
		||||
  const opts = options || {};
 | 
			
		||||
 | 
			
		||||
  const length = input.length - 1;
 | 
			
		||||
  const scanToEnd = opts.parts === true || opts.scanToEnd === true;
 | 
			
		||||
  const slashes = [];
 | 
			
		||||
  const tokens = [];
 | 
			
		||||
  const parts = [];
 | 
			
		||||
 | 
			
		||||
  let str = input;
 | 
			
		||||
  let index = -1;
 | 
			
		||||
  let start = 0;
 | 
			
		||||
  let lastIndex = 0;
 | 
			
		||||
  let isBrace = false;
 | 
			
		||||
  let isBracket = false;
 | 
			
		||||
  let isGlob = false;
 | 
			
		||||
  let isExtglob = false;
 | 
			
		||||
  let isGlobstar = false;
 | 
			
		||||
  let braceEscaped = false;
 | 
			
		||||
  let backslashes = false;
 | 
			
		||||
  let negated = false;
 | 
			
		||||
  let negatedExtglob = false;
 | 
			
		||||
  let finished = false;
 | 
			
		||||
  let braces = 0;
 | 
			
		||||
  let prev;
 | 
			
		||||
  let code;
 | 
			
		||||
  let token = { value: '', depth: 0, isGlob: false };
 | 
			
		||||
 | 
			
		||||
  const eos = () => index >= length;
 | 
			
		||||
  const peek = () => str.charCodeAt(index + 1);
 | 
			
		||||
  const advance = () => {
 | 
			
		||||
    prev = code;
 | 
			
		||||
    return str.charCodeAt(++index);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  while (index < length) {
 | 
			
		||||
    code = advance();
 | 
			
		||||
    let next;
 | 
			
		||||
 | 
			
		||||
    if (code === CHAR_BACKWARD_SLASH) {
 | 
			
		||||
      backslashes = token.backslashes = true;
 | 
			
		||||
      code = advance();
 | 
			
		||||
 | 
			
		||||
      if (code === CHAR_LEFT_CURLY_BRACE) {
 | 
			
		||||
        braceEscaped = true;
 | 
			
		||||
      }
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {
 | 
			
		||||
      braces++;
 | 
			
		||||
 | 
			
		||||
      while (eos() !== true && (code = advance())) {
 | 
			
		||||
        if (code === CHAR_BACKWARD_SLASH) {
 | 
			
		||||
          backslashes = token.backslashes = true;
 | 
			
		||||
          advance();
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (code === CHAR_LEFT_CURLY_BRACE) {
 | 
			
		||||
          braces++;
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {
 | 
			
		||||
          isBrace = token.isBrace = true;
 | 
			
		||||
          isGlob = token.isGlob = true;
 | 
			
		||||
          finished = true;
 | 
			
		||||
 | 
			
		||||
          if (scanToEnd === true) {
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (braceEscaped !== true && code === CHAR_COMMA) {
 | 
			
		||||
          isBrace = token.isBrace = true;
 | 
			
		||||
          isGlob = token.isGlob = true;
 | 
			
		||||
          finished = true;
 | 
			
		||||
 | 
			
		||||
          if (scanToEnd === true) {
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (code === CHAR_RIGHT_CURLY_BRACE) {
 | 
			
		||||
          braces--;
 | 
			
		||||
 | 
			
		||||
          if (braces === 0) {
 | 
			
		||||
            braceEscaped = false;
 | 
			
		||||
            isBrace = token.isBrace = true;
 | 
			
		||||
            finished = true;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (code === CHAR_FORWARD_SLASH) {
 | 
			
		||||
      slashes.push(index);
 | 
			
		||||
      tokens.push(token);
 | 
			
		||||
      token = { value: '', depth: 0, isGlob: false };
 | 
			
		||||
 | 
			
		||||
      if (finished === true) continue;
 | 
			
		||||
      if (prev === CHAR_DOT && index === (start + 1)) {
 | 
			
		||||
        start += 2;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      lastIndex = index + 1;
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opts.noext !== true) {
 | 
			
		||||
      const isExtglobChar = code === CHAR_PLUS
 | 
			
		||||
        || code === CHAR_AT
 | 
			
		||||
        || code === CHAR_ASTERISK
 | 
			
		||||
        || code === CHAR_QUESTION_MARK
 | 
			
		||||
        || code === CHAR_EXCLAMATION_MARK;
 | 
			
		||||
 | 
			
		||||
      if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {
 | 
			
		||||
        isGlob = token.isGlob = true;
 | 
			
		||||
        isExtglob = token.isExtglob = true;
 | 
			
		||||
        finished = true;
 | 
			
		||||
        if (code === CHAR_EXCLAMATION_MARK && index === start) {
 | 
			
		||||
          negatedExtglob = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (scanToEnd === true) {
 | 
			
		||||
          while (eos() !== true && (code = advance())) {
 | 
			
		||||
            if (code === CHAR_BACKWARD_SLASH) {
 | 
			
		||||
              backslashes = token.backslashes = true;
 | 
			
		||||
              code = advance();
 | 
			
		||||
              continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (code === CHAR_RIGHT_PARENTHESES) {
 | 
			
		||||
              isGlob = token.isGlob = true;
 | 
			
		||||
              finished = true;
 | 
			
		||||
              break;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (code === CHAR_ASTERISK) {
 | 
			
		||||
      if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
 | 
			
		||||
      isGlob = token.isGlob = true;
 | 
			
		||||
      finished = true;
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (code === CHAR_QUESTION_MARK) {
 | 
			
		||||
      isGlob = token.isGlob = true;
 | 
			
		||||
      finished = true;
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (code === CHAR_LEFT_SQUARE_BRACKET) {
 | 
			
		||||
      while (eos() !== true && (next = advance())) {
 | 
			
		||||
        if (next === CHAR_BACKWARD_SLASH) {
 | 
			
		||||
          backslashes = token.backslashes = true;
 | 
			
		||||
          advance();
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (next === CHAR_RIGHT_SQUARE_BRACKET) {
 | 
			
		||||
          isBracket = token.isBracket = true;
 | 
			
		||||
          isGlob = token.isGlob = true;
 | 
			
		||||
          finished = true;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
 | 
			
		||||
      negated = token.negated = true;
 | 
			
		||||
      start++;
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {
 | 
			
		||||
      isGlob = token.isGlob = true;
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        while (eos() !== true && (code = advance())) {
 | 
			
		||||
          if (code === CHAR_LEFT_PARENTHESES) {
 | 
			
		||||
            backslashes = token.backslashes = true;
 | 
			
		||||
            code = advance();
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          if (code === CHAR_RIGHT_PARENTHESES) {
 | 
			
		||||
            finished = true;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (isGlob === true) {
 | 
			
		||||
      finished = true;
 | 
			
		||||
 | 
			
		||||
      if (scanToEnd === true) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (opts.noext === true) {
 | 
			
		||||
    isExtglob = false;
 | 
			
		||||
    isGlob = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let base = str;
 | 
			
		||||
  let prefix = '';
 | 
			
		||||
  let glob = '';
 | 
			
		||||
 | 
			
		||||
  if (start > 0) {
 | 
			
		||||
    prefix = str.slice(0, start);
 | 
			
		||||
    str = str.slice(start);
 | 
			
		||||
    lastIndex -= start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (base && isGlob === true && lastIndex > 0) {
 | 
			
		||||
    base = str.slice(0, lastIndex);
 | 
			
		||||
    glob = str.slice(lastIndex);
 | 
			
		||||
  } else if (isGlob === true) {
 | 
			
		||||
    base = '';
 | 
			
		||||
    glob = str;
 | 
			
		||||
  } else {
 | 
			
		||||
    base = str;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (base && base !== '' && base !== '/' && base !== str) {
 | 
			
		||||
    if (isPathSeparator(base.charCodeAt(base.length - 1))) {
 | 
			
		||||
      base = base.slice(0, -1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (opts.unescape === true) {
 | 
			
		||||
    if (glob) glob = utils.removeBackslashes(glob);
 | 
			
		||||
 | 
			
		||||
    if (base && backslashes === true) {
 | 
			
		||||
      base = utils.removeBackslashes(base);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const state = {
 | 
			
		||||
    prefix,
 | 
			
		||||
    input,
 | 
			
		||||
    start,
 | 
			
		||||
    base,
 | 
			
		||||
    glob,
 | 
			
		||||
    isBrace,
 | 
			
		||||
    isBracket,
 | 
			
		||||
    isGlob,
 | 
			
		||||
    isExtglob,
 | 
			
		||||
    isGlobstar,
 | 
			
		||||
    negated,
 | 
			
		||||
    negatedExtglob
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  if (opts.tokens === true) {
 | 
			
		||||
    state.maxDepth = 0;
 | 
			
		||||
    if (!isPathSeparator(code)) {
 | 
			
		||||
      tokens.push(token);
 | 
			
		||||
    }
 | 
			
		||||
    state.tokens = tokens;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (opts.parts === true || opts.tokens === true) {
 | 
			
		||||
    let prevIndex;
 | 
			
		||||
 | 
			
		||||
    for (let idx = 0; idx < slashes.length; idx++) {
 | 
			
		||||
      const n = prevIndex ? prevIndex + 1 : start;
 | 
			
		||||
      const i = slashes[idx];
 | 
			
		||||
      const value = input.slice(n, i);
 | 
			
		||||
      if (opts.tokens) {
 | 
			
		||||
        if (idx === 0 && start !== 0) {
 | 
			
		||||
          tokens[idx].isPrefix = true;
 | 
			
		||||
          tokens[idx].value = prefix;
 | 
			
		||||
        } else {
 | 
			
		||||
          tokens[idx].value = value;
 | 
			
		||||
        }
 | 
			
		||||
        depth(tokens[idx]);
 | 
			
		||||
        state.maxDepth += tokens[idx].depth;
 | 
			
		||||
      }
 | 
			
		||||
      if (idx !== 0 || value !== '') {
 | 
			
		||||
        parts.push(value);
 | 
			
		||||
      }
 | 
			
		||||
      prevIndex = i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (prevIndex && prevIndex + 1 < input.length) {
 | 
			
		||||
      const value = input.slice(prevIndex + 1);
 | 
			
		||||
      parts.push(value);
 | 
			
		||||
 | 
			
		||||
      if (opts.tokens) {
 | 
			
		||||
        tokens[tokens.length - 1].value = value;
 | 
			
		||||
        depth(tokens[tokens.length - 1]);
 | 
			
		||||
        state.maxDepth += tokens[tokens.length - 1].depth;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    state.slashes = slashes;
 | 
			
		||||
    state.parts = parts;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = scan;
 | 
			
		||||
							
								
								
									
										64
									
								
								node_modules/picomatch/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								node_modules/picomatch/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const path = require('path');
 | 
			
		||||
const win32 = process.platform === 'win32';
 | 
			
		||||
const {
 | 
			
		||||
  REGEX_BACKSLASH,
 | 
			
		||||
  REGEX_REMOVE_BACKSLASH,
 | 
			
		||||
  REGEX_SPECIAL_CHARS,
 | 
			
		||||
  REGEX_SPECIAL_CHARS_GLOBAL
 | 
			
		||||
} = require('./constants');
 | 
			
		||||
 | 
			
		||||
exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
 | 
			
		||||
exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
 | 
			
		||||
exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);
 | 
			
		||||
exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1');
 | 
			
		||||
exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');
 | 
			
		||||
 | 
			
		||||
exports.removeBackslashes = str => {
 | 
			
		||||
  return str.replace(REGEX_REMOVE_BACKSLASH, match => {
 | 
			
		||||
    return match === '\\' ? '' : match;
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.supportsLookbehinds = () => {
 | 
			
		||||
  const segs = process.version.slice(1).split('.').map(Number);
 | 
			
		||||
  if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.isWindows = options => {
 | 
			
		||||
  if (options && typeof options.windows === 'boolean') {
 | 
			
		||||
    return options.windows;
 | 
			
		||||
  }
 | 
			
		||||
  return win32 === true || path.sep === '\\';
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.escapeLast = (input, char, lastIdx) => {
 | 
			
		||||
  const idx = input.lastIndexOf(char, lastIdx);
 | 
			
		||||
  if (idx === -1) return input;
 | 
			
		||||
  if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1);
 | 
			
		||||
  return `${input.slice(0, idx)}\\${input.slice(idx)}`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.removePrefix = (input, state = {}) => {
 | 
			
		||||
  let output = input;
 | 
			
		||||
  if (output.startsWith('./')) {
 | 
			
		||||
    output = output.slice(2);
 | 
			
		||||
    state.prefix = './';
 | 
			
		||||
  }
 | 
			
		||||
  return output;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.wrapOutput = (input, state = {}, options = {}) => {
 | 
			
		||||
  const prepend = options.contains ? '' : '^';
 | 
			
		||||
  const append = options.contains ? '' : '$';
 | 
			
		||||
 | 
			
		||||
  let output = `${prepend}(?:${input})${append}`;
 | 
			
		||||
  if (state.negated === true) {
 | 
			
		||||
    output = `(?:^(?!${output}).*$)`;
 | 
			
		||||
  }
 | 
			
		||||
  return output;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user