diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:38:50 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:40:43 +0200 |
commit | 7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch) | |
tree | 6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/matcher/index.js | |
parent | 963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff) |
add linting (and some initial fixes)
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); +}; |