| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 | 
							- '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;
 
 
  |