aboutsummaryrefslogtreecommitdiff
path: root/node_modules/micromatch/lib
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
committerFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
commitbbff7403fbf46f9ad92240ac213df8d30ef31b64 (patch)
treec58400ec5124da1c7d56b01aea83309f80a56c3b /node_modules/micromatch/lib
parent003fb34971cf63466184351b4db5f7c67df4f444 (diff)
update packages
Diffstat (limited to 'node_modules/micromatch/lib')
-rw-r--r--node_modules/micromatch/lib/chars.js67
-rw-r--r--node_modules/micromatch/lib/expand.js304
-rw-r--r--node_modules/micromatch/lib/glob.js193
-rw-r--r--node_modules/micromatch/lib/utils.js326
4 files changed, 243 insertions, 647 deletions
diff --git a/node_modules/micromatch/lib/chars.js b/node_modules/micromatch/lib/chars.js
deleted file mode 100644
index a1ffe3714..000000000
--- a/node_modules/micromatch/lib/chars.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-
-var chars = {}, unesc, temp;
-
-function reverse(object, prepender) {
- return Object.keys(object).reduce(function(reversed, key) {
- var newKey = prepender ? prepender + key : key; // Optionally prepend a string to key.
- reversed[object[key]] = newKey; // Swap key and value.
- return reversed; // Return the result.
- }, {});
-}
-
-/**
- * Regex for common characters
- */
-
-chars.escapeRegex = {
- '?': /\?/g,
- '@': /\@/g,
- '!': /\!/g,
- '+': /\+/g,
- '*': /\*/g,
- '(': /\(/g,
- ')': /\)/g,
- '[': /\[/g,
- ']': /\]/g
-};
-
-/**
- * Escape characters
- */
-
-chars.ESC = {
- '?': '__UNESC_QMRK__',
- '@': '__UNESC_AMPE__',
- '!': '__UNESC_EXCL__',
- '+': '__UNESC_PLUS__',
- '*': '__UNESC_STAR__',
- ',': '__UNESC_COMMA__',
- '(': '__UNESC_LTPAREN__',
- ')': '__UNESC_RTPAREN__',
- '[': '__UNESC_LTBRACK__',
- ']': '__UNESC_RTBRACK__'
-};
-
-/**
- * Unescape characters
- */
-
-chars.UNESC = unesc || (unesc = reverse(chars.ESC, '\\'));
-
-chars.ESC_TEMP = {
- '?': '__TEMP_QMRK__',
- '@': '__TEMP_AMPE__',
- '!': '__TEMP_EXCL__',
- '*': '__TEMP_STAR__',
- '+': '__TEMP_PLUS__',
- ',': '__TEMP_COMMA__',
- '(': '__TEMP_LTPAREN__',
- ')': '__TEMP_RTPAREN__',
- '[': '__TEMP_LTBRACK__',
- ']': '__TEMP_RTBRACK__'
-};
-
-chars.TEMP = temp || (temp = reverse(chars.ESC_TEMP));
-
-module.exports = chars;
diff --git a/node_modules/micromatch/lib/expand.js b/node_modules/micromatch/lib/expand.js
deleted file mode 100644
index e99b081eb..000000000
--- a/node_modules/micromatch/lib/expand.js
+++ /dev/null
@@ -1,304 +0,0 @@
-/*!
- * micromatch <https://github.com/jonschlinkert/micromatch>
- *
- * Copyright (c) 2014-2015, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-
-'use strict';
-
-var utils = require('./utils');
-var Glob = require('./glob');
-
-/**
- * Expose `expand`
- */
-
-module.exports = expand;
-
-/**
- * Expand a glob pattern to resolve braces and
- * similar patterns before converting to regex.
- *
- * @param {String|Array} `pattern`
- * @param {Array} `files`
- * @param {Options} `opts`
- * @return {Array}
- */
-
-function expand(pattern, options) {
- if (typeof pattern !== 'string') {
- throw new TypeError('micromatch.expand(): argument should be a string.');
- }
-
- var glob = new Glob(pattern, options || {});
- var opts = glob.options;
-
- if (!utils.isGlob(pattern)) {
- glob.pattern = glob.pattern.replace(/([\/.])/g, '\\$1');
- return glob;
- }
-
- glob.pattern = glob.pattern.replace(/(\+)(?!\()/g, '\\$1');
- glob.pattern = glob.pattern.split('$').join('\\$');
-
- if (typeof opts.braces !== 'boolean' && typeof opts.nobraces !== 'boolean') {
- opts.braces = true;
- }
-
- if (glob.pattern === '.*') {
- return {
- pattern: '\\.' + star,
- tokens: tok,
- options: opts
- };
- }
-
- if (glob.pattern === '*') {
- return {
- pattern: oneStar(opts.dot),
- tokens: tok,
- options: opts
- };
- }
-
- // parse the glob pattern into tokens
- glob.parse();
- var tok = glob.tokens;
- tok.is.negated = opts.negated;
-
- // dotfile handling
- if ((opts.dotfiles === true || tok.is.dotfile) && opts.dot !== false) {
- opts.dotfiles = true;
- opts.dot = true;
- }
-
- if ((opts.dotdirs === true || tok.is.dotdir) && opts.dot !== false) {
- opts.dotdirs = true;
- opts.dot = true;
- }
-
- // check for braces with a dotfile pattern
- if (/[{,]\./.test(glob.pattern)) {
- opts.makeRe = false;
- opts.dot = true;
- }
-
- if (opts.nonegate !== true) {
- opts.negated = glob.negated;
- }
-
- // if the leading character is a dot or a slash, escape it
- if (glob.pattern.charAt(0) === '.' && glob.pattern.charAt(1) !== '/') {
- glob.pattern = '\\' + glob.pattern;
- }
-
- /**
- * Extended globs
- */
-
- // expand braces, e.g `{1..5}`
- glob.track('before braces');
- if (tok.is.braces) {
- glob.braces();
- }
- glob.track('after braces');
-
- // expand extglobs, e.g `foo/!(a|b)`
- glob.track('before extglob');
- if (tok.is.extglob) {
- glob.extglob();
- }
- glob.track('after extglob');
-
- // expand brackets, e.g `[[:alpha:]]`
- glob.track('before brackets');
- if (tok.is.brackets) {
- glob.brackets();
- }
- glob.track('after brackets');
-
- // special patterns
- glob._replace('[!', '[^');
- glob._replace('(?', '(%~');
- glob._replace(/\[\]/, '\\[\\]');
- glob._replace('/[', '/' + (opts.dot ? dotfiles : nodot) + '[', true);
- glob._replace('/?', '/' + (opts.dot ? dotfiles : nodot) + '[^/]', true);
- glob._replace('/.', '/(?=.)\\.', true);
-
- // windows drives
- glob._replace(/^(\w):([\\\/]+?)/gi, '(?=.)$1:$2', true);
-
- // negate slashes in exclusion ranges
- if (glob.pattern.indexOf('[^') !== -1) {
- glob.pattern = negateSlash(glob.pattern);
- }
-
- if (opts.globstar !== false && glob.pattern === '**') {
- glob.pattern = globstar(opts.dot);
-
- } else {
- glob.pattern = balance(glob.pattern, '[', ']');
- glob.escape(glob.pattern);
-
- // if the pattern has `**`
- if (tok.is.globstar) {
- glob.pattern = collapse(glob.pattern, '/**');
- glob.pattern = collapse(glob.pattern, '**/');
- glob._replace('/**/', '(?:/' + globstar(opts.dot) + '/|/)', true);
- glob._replace(/\*{2,}/g, '**');
-
- // 'foo/*'
- glob._replace(/(\w+)\*(?!\/)/g, '$1[^/]*?', true);
- glob._replace(/\*\*\/\*(\w)/g, globstar(opts.dot) + '\\/' + (opts.dot ? dotfiles : nodot) + '[^/]*?$1', true);
-
- if (opts.dot !== true) {
- glob._replace(/\*\*\/(.)/g, '(?:**\\/|)$1');
- }
-
- // 'foo/**' or '{**,*}', but not 'foo**'
- if (tok.path.dirname !== '' || /,\*\*|\*\*,/.test(glob.orig)) {
- glob._replace('**', globstar(opts.dot), true);
- }
- }
-
- // ends with /*
- glob._replace(/\/\*$/, '\\/' + oneStar(opts.dot), true);
- // ends with *, no slashes
- glob._replace(/(?!\/)\*$/, star, true);
- // has 'n*.' (partial wildcard w/ file extension)
- glob._replace(/([^\/]+)\*/, '$1' + oneStar(true), true);
- // has '*'
- glob._replace('*', oneStar(opts.dot), true);
- glob._replace('?.', '?\\.', true);
- glob._replace('?:', '?:', true);
-
- glob._replace(/\?+/g, function(match) {
- var len = match.length;
- if (len === 1) {
- return qmark;
- }
- return qmark + '{' + len + '}';
- });
-
- // escape '.abc' => '\\.abc'
- glob._replace(/\.([*\w]+)/g, '\\.$1');
- // fix '[^\\\\/]'
- glob._replace(/\[\^[\\\/]+\]/g, qmark);
- // '///' => '\/'
- glob._replace(/\/+/g, '\\/');
- // '\\\\\\' => '\\'
- glob._replace(/\\{2,}/g, '\\');
- }
-
- // unescape previously escaped patterns
- glob.unescape(glob.pattern);
- glob._replace('__UNESC_STAR__', '*');
-
- // escape dots that follow qmarks
- glob._replace('?.', '?\\.');
-
- // remove unnecessary slashes in character classes
- glob._replace('[^\\/]', qmark);
-
- if (glob.pattern.length > 1) {
- if (/^[\[?*]/.test(glob.pattern)) {
- // only prepend the string if we don't want to match dotfiles
- glob.pattern = (opts.dot ? dotfiles : nodot) + glob.pattern;
- }
- }
-
- return glob;
-}
-
-/**
- * Collapse repeated character sequences.
- *
- * ```js
- * collapse('a/../../../b', '../');
- * //=> 'a/../b'
- * ```
- *
- * @param {String} `str`
- * @param {String} `ch` Character sequence to collapse
- * @return {String}
- */
-
-function collapse(str, ch) {
- var res = str.split(ch);
- var isFirst = res[0] === '';
- var isLast = res[res.length - 1] === '';
- res = res.filter(Boolean);
- if (isFirst) res.unshift('');
- if (isLast) res.push('');
- return res.join(ch);
-}
-
-/**
- * Negate slashes in exclusion ranges, per glob spec:
- *
- * ```js
- * negateSlash('[^foo]');
- * //=> '[^\\/foo]'
- * ```
- *
- * @param {String} `str` glob pattern
- * @return {String}
- */
-
-function negateSlash(str) {
- return str.replace(/\[\^([^\]]*?)\]/g, function(match, inner) {
- if (inner.indexOf('/') === -1) {
- inner = '\\/' + inner;
- }
- return '[^' + inner + ']';
- });
-}
-
-/**
- * Escape imbalanced braces/bracket. This is a very
- * basic, naive implementation that only does enough
- * to serve the purpose.
- */
-
-function balance(str, a, b) {
- var aarr = str.split(a);
- var alen = aarr.join('').length;
- var blen = str.split(b).join('').length;
-
- if (alen !== blen) {
- str = aarr.join('\\' + a);
- return str.split(b).join('\\' + b);
- }
- return str;
-}
-
-/**
- * Special patterns to be converted to regex.
- * Heuristics are used to simplify patterns
- * and speed up processing.
- */
-
-/* eslint no-multi-spaces: 0 */
-var qmark = '[^/]';
-var star = qmark + '*?';
-var nodot = '(?!\\.)(?=.)';
-var dotfileGlob = '(?:\\/|^)\\.{1,2}($|\\/)';
-var dotfiles = '(?!' + dotfileGlob + ')(?=.)';
-var twoStarDot = '(?:(?!' + dotfileGlob + ').)*?';
-
-/**
- * Create a regex for `*`.
- *
- * If `dot` is true, or the pattern does not begin with
- * a leading star, then return the simpler regex.
- */
-
-function oneStar(dotfile) {
- return dotfile ? '(?!' + dotfileGlob + ')(?=.)' + star : (nodot + star);
-}
-
-function globstar(dotfile) {
- if (dotfile) { return twoStarDot; }
- return '(?:(?!(?:\\/|^)\\.).)*?';
-}
diff --git a/node_modules/micromatch/lib/glob.js b/node_modules/micromatch/lib/glob.js
deleted file mode 100644
index c61332673..000000000
--- a/node_modules/micromatch/lib/glob.js
+++ /dev/null
@@ -1,193 +0,0 @@
-'use strict';
-
-var chars = require('./chars');
-var utils = require('./utils');
-
-/**
- * Expose `Glob`
- */
-
-var Glob = module.exports = function Glob(pattern, options) {
- if (!(this instanceof Glob)) {
- return new Glob(pattern, options);
- }
- this.options = options || {};
- this.pattern = pattern;
- this.history = [];
- this.tokens = {};
- this.init(pattern);
-};
-
-/**
- * Initialize defaults
- */
-
-Glob.prototype.init = function(pattern) {
- this.orig = pattern;
- this.negated = this.isNegated();
- this.options.track = this.options.track || false;
- this.options.makeRe = true;
-};
-
-/**
- * Push a change into `glob.history`. Useful
- * for debugging.
- */
-
-Glob.prototype.track = function(msg) {
- if (this.options.track) {
- this.history.push({msg: msg, pattern: this.pattern});
- }
-};
-
-/**
- * Return true if `glob.pattern` was negated
- * with `!`, also remove the `!` from the pattern.
- *
- * @return {Boolean}
- */
-
-Glob.prototype.isNegated = function() {
- if (this.pattern.charCodeAt(0) === 33 /* '!' */) {
- this.pattern = this.pattern.slice(1);
- return true;
- }
- return false;
-};
-
-/**
- * Expand braces in the given glob pattern.
- *
- * We only need to use the [braces] lib when
- * patterns are nested.
- */
-
-Glob.prototype.braces = function() {
- if (this.options.nobraces !== true && this.options.nobrace !== true) {
- // naive/fast check for imbalanced characters
- var a = this.pattern.match(/[\{\(\[]/g);
- var b = this.pattern.match(/[\}\)\]]/g);
-
- // if imbalanced, don't optimize the pattern
- if (a && b && (a.length !== b.length)) {
- this.options.makeRe = false;
- }
-
- // expand brace patterns and join the resulting array
- var expanded = utils.braces(this.pattern, this.options);
- this.pattern = expanded.join('|');
- }
-};
-
-/**
- * Expand bracket expressions in `glob.pattern`
- */
-
-Glob.prototype.brackets = function() {
- if (this.options.nobrackets !== true) {
- this.pattern = utils.brackets(this.pattern);
- }
-};
-
-/**
- * Expand bracket expressions in `glob.pattern`
- */
-
-Glob.prototype.extglob = function() {
- if (this.options.noextglob === true) return;
-
- if (utils.isExtglob(this.pattern)) {
- this.pattern = utils.extglob(this.pattern, {escape: true});
- }
-};
-
-/**
- * Parse the given pattern
- */
-
-Glob.prototype.parse = function(pattern) {
- this.tokens = utils.parseGlob(pattern || this.pattern, true);
- return this.tokens;
-};
-
-/**
- * Replace `a` with `b`. Also tracks the change before and
- * after each replacement. This is disabled by default, but
- * can be enabled by setting `options.track` to true.
- *
- * Also, when the pattern is a string, `.split()` is used,
- * because it's much faster than replace.
- *
- * @param {RegExp|String} `a`
- * @param {String} `b`
- * @param {Boolean} `escape` When `true`, escapes `*` and `?` in the replacement.
- * @return {String}
- */
-
-Glob.prototype._replace = function(a, b, escape) {
- this.track('before (find): "' + a + '" (replace with): "' + b + '"');
- if (escape) b = esc(b);
- if (a && b && typeof a === 'string') {
- this.pattern = this.pattern.split(a).join(b);
- } else {
- this.pattern = this.pattern.replace(a, b);
- }
- this.track('after');
-};
-
-/**
- * Escape special characters in the given string.
- *
- * @param {String} `str` Glob pattern
- * @return {String}
- */
-
-Glob.prototype.escape = function(str) {
- this.track('before escape: ');
- var re = /["\\](['"]?[^"'\\]['"]?)/g;
-
- this.pattern = str.replace(re, function($0, $1) {
- var o = chars.ESC;
- var ch = o && o[$1];
- if (ch) {
- return ch;
- }
- if (/[a-z]/i.test($0)) {
- return $0.split('\\').join('');
- }
- return $0;
- });
-
- this.track('after escape: ');
-};
-
-/**
- * Unescape special characters in the given string.
- *
- * @param {String} `str`
- * @return {String}
- */
-
-Glob.prototype.unescape = function(str) {
- var re = /__([A-Z]+)_([A-Z]+)__/g;
- this.pattern = str.replace(re, function($0, $1) {
- return chars[$1][$0];
- });
- this.pattern = unesc(this.pattern);
-};
-
-/**
- * Escape/unescape utils
- */
-
-function esc(str) {
- str = str.split('?').join('%~');
- str = str.split('*').join('%%');
- return str;
-}
-
-function unesc(str) {
- str = str.split('%~').join('?');
- str = str.split('%%').join('*');
- return str;
-}
diff --git a/node_modules/micromatch/lib/utils.js b/node_modules/micromatch/lib/utils.js
index 7c24a5106..f0ba9177a 100644
--- a/node_modules/micromatch/lib/utils.js
+++ b/node_modules/micromatch/lib/utils.js
@@ -1,70 +1,186 @@
'use strict';
-var win32 = process && process.platform === 'win32';
-var path = require('path');
-var fileRe = require('filename-regex');
var utils = module.exports;
+var path = require('path');
/**
* Module dependencies
*/
+var Snapdragon = require('snapdragon');
+utils.define = require('define-property');
utils.diff = require('arr-diff');
-utils.unique = require('array-unique');
-utils.braces = require('braces');
-utils.brackets = require('expand-brackets');
-utils.extglob = require('extglob');
-utils.isExtglob = require('is-extglob');
-utils.isGlob = require('is-glob');
+utils.extend = require('extend-shallow');
+utils.pick = require('object.pick');
utils.typeOf = require('kind-of');
-utils.normalize = require('normalize-path');
-utils.omit = require('object.omit');
-utils.parseGlob = require('parse-glob');
-utils.cache = require('regex-cache');
+utils.unique = require('array-unique');
+
+/**
+ * Returns true if the platform is windows, or `path.sep` is `\\`.
+ * This is defined as a function to allow `path.sep` to be set in unit tests,
+ * or by the user, if there is a reason to do so.
+ * @return {Boolean}
+ */
+
+utils.isWindows = function() {
+ return path.sep === '\\' || process.platform === 'win32';
+};
+
+/**
+ * Get the `Snapdragon` instance to use
+ */
+
+utils.instantiate = function(ast, options) {
+ var snapdragon;
+ // if an instance was created by `.parse`, use that instance
+ if (utils.typeOf(ast) === 'object' && ast.snapdragon) {
+ snapdragon = ast.snapdragon;
+ // if the user supplies an instance on options, use that instance
+ } else if (utils.typeOf(options) === 'object' && options.snapdragon) {
+ snapdragon = options.snapdragon;
+ // create a new instance
+ } else {
+ snapdragon = new Snapdragon(options);
+ }
+
+ utils.define(snapdragon, 'parse', function(str, options) {
+ var parsed = Snapdragon.prototype.parse.apply(this, arguments);
+ parsed.input = str;
+
+ // escape unmatched brace/bracket/parens
+ var last = this.parser.stack.pop();
+ if (last && this.options.strictErrors !== true) {
+ var open = last.nodes[0];
+ var inner = last.nodes[1];
+ if (last.type === 'bracket') {
+ if (inner.val.charAt(0) === '[') {
+ inner.val = '\\' + inner.val;
+ }
+
+ } else {
+ open.val = '\\' + open.val;
+ var sibling = open.parent.nodes[1];
+ if (sibling.type === 'star') {
+ sibling.loose = true;
+ }
+ }
+ }
+
+ // add non-enumerable parser reference
+ utils.define(parsed, 'parser', this.parser);
+ return parsed;
+ });
+
+ return snapdragon;
+};
+
+/**
+ * Create the key to use for memoization. The key is generated
+ * by iterating over the options and concatenating key-value pairs
+ * to the pattern string.
+ */
+
+utils.createKey = function(pattern, options) {
+ if (utils.typeOf(options) !== 'object') {
+ return pattern;
+ }
+ var val = pattern;
+ var keys = Object.keys(options);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ val += ';' + key + '=' + String(options[key]);
+ }
+ return val;
+};
+
+/**
+ * Cast `val` to an array
+ * @return {Array}
+ */
+
+utils.arrayify = function(val) {
+ if (typeof val === 'string') return [val];
+ return val ? (Array.isArray(val) ? val : [val]) : [];
+};
+
+/**
+ * Return true if `val` is a non-empty string
+ */
+
+utils.isString = function(val) {
+ return typeof val === 'string';
+};
+
+/**
+ * Return true if `val` is a non-empty string
+ */
+
+utils.isObject = function(val) {
+ return utils.typeOf(val) === 'object';
+};
/**
- * Get the filename of a filepath
+ * Returns true if the given `str` has special characters
+ */
+
+utils.hasSpecialChars = function(str) {
+ return /(?:(?:(^|\/)[!.])|[*?+()|\[\]{}]|[+@]\()/.test(str);
+};
+
+/**
+ * Escape regex characters in the given string
+ */
+
+utils.escapeRegex = function(str) {
+ return str.replace(/[-[\]{}()^$|*+?.\\\/\s]/g, '\\$&');
+};
+
+/**
+ * Normalize slashes in the given filepath.
*
- * @param {String} `string`
+ * @param {String} `filepath`
* @return {String}
*/
-utils.filename = function filename(fp) {
- var seg = fp.match(fileRe());
- return seg && seg[0];
+utils.toPosixPath = function(str) {
+ return str.replace(/\\+/g, '/');
};
/**
- * Returns a function that returns true if the given
- * pattern is the same as a given `filepath`
+ * Strip backslashes before special characters in a string.
*
- * @param {String} `pattern`
- * @return {Function}
+ * @param {String} `str`
+ * @return {String}
*/
-utils.isPath = function isPath(pattern, opts) {
- opts = opts || {};
- return function(fp) {
- var unixified = utils.unixify(fp, opts);
- if(opts.nocase){
- return pattern.toLowerCase() === unixified.toLowerCase();
- }
- return pattern === unixified;
- };
+utils.unescape = function(str) {
+ return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, ''));
};
/**
- * Returns a function that returns true if the given
- * pattern contains a `filepath`
- *
- * @param {String} `pattern`
- * @return {Function}
+ * Strip the prefix from a filepath
+ * @param {String} `fp`
+ * @return {String}
*/
-utils.hasPath = function hasPath(pattern, opts) {
- return function(fp) {
- return utils.unixify(pattern, opts).indexOf(fp) !== -1;
- };
+utils.stripPrefix = function(str) {
+ if (str.charAt(0) !== '.') {
+ return str;
+ }
+ var ch = str.charAt(1);
+ if (utils.isSlash(ch)) {
+ return str.slice(2);
+ }
+ return str;
+};
+
+/**
+ * Returns true if the given str is an escaped or
+ * unescaped path character
+ */
+
+utils.isSlash = function(str) {
+ return str === '/' || str === '\\/' || str === '\\' || str === '\\\\';
};
/**
@@ -75,75 +191,119 @@ utils.hasPath = function hasPath(pattern, opts) {
* @return {Function}
*/
-utils.matchPath = function matchPath(pattern, opts) {
- var fn = (opts && opts.contains)
- ? utils.hasPath(pattern, opts)
- : utils.isPath(pattern, opts);
- return fn;
+utils.matchPath = function(pattern, options) {
+ return (options && options.contains)
+ ? utils.containsPattern(pattern, options)
+ : utils.equalsPattern(pattern, options);
};
/**
- * Returns a function that returns true if the given
- * regex matches the `filename` of a file path.
- *
- * @param {RegExp} `re`
- * @return {Boolean}
+ * Returns true if the given (original) filepath or unixified path are equal
+ * to the given pattern.
*/
-utils.hasFilename = function hasFilename(re) {
- return function(fp) {
- var name = utils.filename(fp);
- return name && re.test(name);
- };
+utils._equals = function(filepath, unixPath, pattern) {
+ return pattern === filepath || pattern === unixPath;
};
/**
- * Coerce `val` to an array
- *
- * @param {*} val
- * @return {Array}
+ * Returns true if the given (original) filepath or unixified path contain
+ * the given pattern.
*/
-utils.arrayify = function arrayify(val) {
- return !Array.isArray(val)
- ? [val]
- : val;
+utils._contains = function(filepath, unixPath, pattern) {
+ return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1;
};
/**
- * Normalize all slashes in a file path or glob pattern to
- * forward slashes.
+ * Returns a function that returns true if the given
+ * pattern is the same as a given `filepath`
+ *
+ * @param {String} `pattern`
+ * @return {Function}
*/
-utils.unixify = function unixify(fp, opts) {
- if (opts && opts.unixify === false) return fp;
- if (opts && opts.unixify === true || win32 || path.sep === '\\') {
- return utils.normalize(fp, false);
- }
- if (opts && opts.unescape === true) {
- return fp ? fp.toString().replace(/\\(\w)/g, '$1') : '';
- }
- return fp;
+utils.equalsPattern = function(pattern, options) {
+ var unixify = utils.unixify(options);
+ options = options || {};
+
+ return function fn(filepath) {
+ var equal = utils._equals(filepath, unixify(filepath), pattern);
+ if (equal === true || options.nocase !== true) {
+ return equal;
+ }
+ var lower = filepath.toLowerCase();
+ return utils._equals(lower, unixify(lower), pattern);
+ };
};
/**
- * Escape/unescape utils
+ * Returns a function that returns true if the given
+ * pattern contains a `filepath`
+ *
+ * @param {String} `pattern`
+ * @return {Function}
*/
-utils.escapePath = function escapePath(fp) {
- return fp.replace(/[\\.]/g, '\\$&');
+utils.containsPattern = function(pattern, options) {
+ var unixify = utils.unixify(options);
+ options = options || {};
+
+ return function(filepath) {
+ var contains = utils._contains(filepath, unixify(filepath), pattern);
+ if (contains === true || options.nocase !== true) {
+ return contains;
+ }
+ var lower = filepath.toLowerCase();
+ return utils._contains(lower, unixify(lower), pattern);
+ };
};
-utils.unescapeGlob = function unescapeGlob(fp) {
- return fp.replace(/[\\"']/g, '');
+/**
+ * Returns a function that returns true if the given
+ * regex matches the `filename` of a file path.
+ *
+ * @param {RegExp} `re` Matching regex
+ * @return {Function}
+ */
+
+utils.matchBasename = function(re) {
+ return function(filepath) {
+ return re.test(path.basename(filepath));
+ };
};
-utils.escapeRe = function escapeRe(str) {
- return str.replace(/[-[\\$*+?.#^\s{}(|)\]]/g, '\\$&');
+/**
+ * Determines the filepath to return based on the provided options.
+ * @return {any}
+ */
+
+utils.value = function(str, unixify, options) {
+ if (options && options.unixify === false) {
+ return str;
+ }
+ return unixify(str);
};
/**
- * Expose `utils`
+ * Returns a function that normalizes slashes in a string to forward
+ * slashes, strips `./` from beginning of paths, and optionally unescapes
+ * special characters.
+ * @return {Function}
*/
-module.exports = utils;
+utils.unixify = function(options) {
+ options = options || {};
+ return function(filepath) {
+ if (utils.isWindows() || options.unixify === true) {
+ filepath = utils.toPosixPath(filepath);
+ }
+ if (options.stripPrefix !== false) {
+ filepath = utils.stripPrefix(filepath);
+ }
+ if (options.unescape === true) {
+ filepath = utils.unescape(filepath);
+ }
+ return filepath;
+ };
+};