aboutsummaryrefslogtreecommitdiff
path: root/node_modules/matcher/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/matcher/index.js')
-rw-r--r--node_modules/matcher/index.js72
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);
+};