diff options
Diffstat (limited to 'node_modules/matcher/index.js')
-rw-r--r-- | node_modules/matcher/index.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/node_modules/matcher/index.js b/node_modules/matcher/index.js new file mode 100644 index 000000000..796e7c8d0 --- /dev/null +++ b/node_modules/matcher/index.js @@ -0,0 +1,72 @@ +'use strict'; +var escapeStringRegexp = require('escape-string-regexp'); +var reCache = {}; + +function makeRe(pattern, shouldNegate) { + var cacheKey = pattern + shouldNegate; + + if (reCache[cacheKey]) { + return reCache[cacheKey]; + } + + var negated = false; + + if (pattern[0] === '!') { + negated = true; + pattern = pattern.slice(1); + } + + pattern = escapeStringRegexp(pattern).replace(/\\\*/g, '.*'); + + if (negated && shouldNegate) { + pattern = '(?!' + pattern + ')'; + } + + var re = new RegExp('^' + pattern + '$', 'i'); + + re.negated = negated; + + reCache[cacheKey] = re; + + return re; +} + +module.exports = function (inputs, patterns) { + if (!(Array.isArray(inputs) && Array.isArray(patterns))) { + throw new TypeError('Expected two arrays, got ' + typeof inputs + ' ' + typeof patterns); + } + + if (patterns.length === 0) { + return inputs; + } + + var firstNegated = patterns[0][0] === '!'; + + patterns = patterns.map(function (x) { + return makeRe(x, false); + }); + + var ret = []; + + for (var i = 0; i < inputs.length; i++) { + // if first pattern is negated we include + // everything to match user expectation + var matches = firstNegated; + + for (var j = 0; j < patterns.length; j++) { + if (patterns[j].test(inputs[i])) { + matches = !patterns[j].negated; + } + } + + if (matches) { + ret.push(inputs[i]); + } + } + + return ret; +}; + +module.exports.isMatch = function (input, pattern) { + return makeRe(pattern, true).test(input); +}; |