chain-able
Version:
interfaces that describe their intentions.
161 lines (146 loc) • 12.8 kB
JavaScript
/**
* @member matcher
* @see https://github.com/sindresorhus/matcher/blob/master/index.js
* @symb 🎯
*/
var ObjectAssign = require('../util/assign')
var isMatcher = require('../is/matcher')
var cache = require('../cache')
var toarr = require('../to-arr')
var toRegExp = require('./to-regexp')
var m = {}
/**
* @desc turn any string[], function[], or RegExp[] into a matcher
* @memberOf matcher
* @since 3.0.0
* @func make
*
* @param {Array<string> | string | Function | RegExp} pattern a matchable pattern
* @param {boolean | undefined} shouldNegate turn into a negated regex
* @param {boolean | undefined} alphaOmega should have regex start at the beginning and the end
* @return {Array<string> | string | Function | RegExp} matchable
*
* @example
*
* matcher.make('*')
* //=> RegExp('.*', 'i')
*
* @example
*
* var any = new RgExp('.*', 'i')
* matcher.make(any)
* //=> any
*
* @example
*
* var strings = x => typeof x === 'string'
* matcher.make(strings)
* // {test: strings}
*
* @example
*
* var tester = {test: x => x === true}
* matcher.make(tester)
* // tester
*
* @example
*
* var noName = '!name'
* matcher.make(noName, true)
* // new RegExp('(?:name)', 'i')
*
* @example
*
* var noName = '!name'
* matcher.make(noName, true, true)
* // new RegExp('^(?:name)$', 'i')
*
*/
m.make = function (pattern, shouldNegate, alphaOmega) {
if (cache.has(pattern)) { return cache.get(pattern) }
var matchable = pattern
if (isMatcher(matchable) && !matchable.test) { matchable.test = matchable }
if (isMatcher(matchable)) { return matchable }
var negated = matchable[0] === '!'
if (negated) { matchable = matchable.slice(1) }
matchable = toRegExp(matchable)
if (negated && shouldNegate) { matchable = "(?!" + matchable + ")" }
if (alphaOmega) { matchable = "^" + matchable + "$" }
matchable = new RegExp(("" + matchable), 'i')
matchable.negated = negated
cache.set(pattern, matchable)
return matchable
}
/**
* @desc same as .make but also accepts inputs, and returns an array
* @memberOf matcher
* @func match
* @since 3.0.0
*
* @param {Array<string> | string} inputs input to use patterns as predicates on
* @param {Array<string> | string | Function | RegExp} patterns predicates to match with, transformed to Matcher
* @param {boolean | undefined} shouldNegate should negate, passed to matcher.make
* @param {boolean | undefined} alphaOmega should enforce regex @beginning and end, passed to .matcher
* @return {Array<any>}
*
* @see Matcher.make
* @see compose/Observe
*
* @example
*
*
* matcher(['foo', 'bar', 'moo'], ['*oo', '!foo']);
* //=> ['moo']
*
* matcher(['foo', 'bar', 'moo'], ['!*oo']);
*
*
* @example
*
*
* matcher('kinga', 'kinga')
* //=> ['kinga']
* matcher('k*nga', 'kinga')
* //=> ['kinga']
* matcher('kinga', 'nope')
* //=> []
*
* matcher(new RegExp(/kinga/), 'kinga')
* //=> ['kinga']
* matcher(new RegExp(/kinga/), 'nope')
* //=> ['nope']
*
* matcher(x => x === 'kinga', 'kinga')
* //=> ['kinga']
* matcher(x => x === 'kinga', 'nope')
* //=> []
*
* matcher({test: x => x === 'kinga'}, 'kinga')
* //=> ['kinga']
* matcher({test: x => x === 'kinga'}, 'nope')
* //=> []
*
*
*/
m.matcher = function (inputs, patterns, shouldNegate, alphaOmega) {
patterns = toarr(patterns).map(function (p) { return m.make(p, shouldNegate, alphaOmega); })
inputs = toarr(inputs)
var firstNegated = patterns[0].negated
var matchesToReturn = []
for (var i = 0; i < inputs.length; i++) {
var input = inputs[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(input)) {
matches = !patterns[j].negated
}
}
if (matches) { matchesToReturn.push(input) }
}
return matchesToReturn
}
/** @TODO: replace to-test **/
// m.test = (inputs, patterns) => m.matcher(inputs, patterns).length !== 0
module.exports = ObjectAssign(m.matcher, m)
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlci5qcyIsInNvdXJjZXMiOlsibWF0Y2hlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtZW1iZXIgbWF0Y2hlclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL21hdGNoZXIvYmxvYi9tYXN0ZXIvaW5kZXguanNcbiAqIEBzeW1iIPCfjq9cbiAqL1xuY29uc3QgT2JqZWN0QXNzaWduID0gcmVxdWlyZSgnLi4vdXRpbC9hc3NpZ24nKVxuY29uc3QgaXNNYXRjaGVyID0gcmVxdWlyZSgnLi4vaXMvbWF0Y2hlcicpXG5jb25zdCBjYWNoZSA9IHJlcXVpcmUoJy4uL2NhY2hlJylcbmNvbnN0IHRvYXJyID0gcmVxdWlyZSgnLi4vdG8tYXJyJylcbmNvbnN0IHRvUmVnRXhwID0gcmVxdWlyZSgnLi90by1yZWdleHAnKVxuXG5jb25zdCBtID0ge31cblxuLyoqXG4gKiBAZGVzYyB0dXJuIGFueSBzdHJpbmdbXSwgZnVuY3Rpb25bXSwgb3IgUmVnRXhwW10gaW50byBhIG1hdGNoZXJcbiAqIEBtZW1iZXJPZiBtYXRjaGVyXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBmdW5jIG1ha2VcbiAqXG4gKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+IHwgc3RyaW5nIHwgRnVuY3Rpb24gfCBSZWdFeHB9IHBhdHRlcm4gYSBtYXRjaGFibGUgcGF0dGVyblxuICogQHBhcmFtICB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gc2hvdWxkTmVnYXRlIHR1cm4gaW50byBhIG5lZ2F0ZWQgcmVnZXhcbiAqIEBwYXJhbSAge2Jvb2xlYW4gfCB1bmRlZmluZWR9IGFscGhhT21lZ2Egc2hvdWxkIGhhdmUgcmVnZXggc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZFxuICogQHJldHVybiB7QXJyYXk8c3RyaW5nPiB8IHN0cmluZyB8IEZ1bmN0aW9uIHwgUmVnRXhwfSBtYXRjaGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIG1hdGNoZXIubWFrZSgnKicpXG4gKiAgICAvLz0+IFJlZ0V4cCgnLionLCAnaScpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICB2YXIgYW55ID0gbmV3IFJnRXhwKCcuKicsICdpJylcbiAqICAgIG1hdGNoZXIubWFrZShhbnkpXG4gKiAgICAvLz0+IGFueVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdmFyIHN0cmluZ3MgPSB4ID0+IHR5cGVvZiB4ID09PSAnc3RyaW5nJ1xuICogICAgbWF0Y2hlci5tYWtlKHN0cmluZ3MpXG4gKiAgICAvLyB7dGVzdDogc3RyaW5nc31cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIHZhciB0ZXN0ZXIgPSB7dGVzdDogeCA9PiB4ID09PSB0cnVlfVxuICogICAgbWF0Y2hlci5tYWtlKHRlc3RlcilcbiAqICAgIC8vIHRlc3RlclxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdmFyIG5vTmFtZSA9ICchbmFtZSdcbiAqICAgIG1hdGNoZXIubWFrZShub05hbWUsIHRydWUpXG4gKiAgICAvLyBuZXcgUmVnRXhwKCcoPzpuYW1lKScsICdpJylcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIHZhciBub05hbWUgPSAnIW5hbWUnXG4gKiAgICBtYXRjaGVyLm1ha2Uobm9OYW1lLCB0cnVlLCB0cnVlKVxuICogICAgLy8gbmV3IFJlZ0V4cCgnXig/Om5hbWUpJCcsICdpJylcbiAqXG4gKi9cbm0ubWFrZSA9IChwYXR0ZXJuLCBzaG91bGROZWdhdGUsIGFscGhhT21lZ2EpID0+IHtcbiAgaWYgKGNhY2hlLmhhcyhwYXR0ZXJuKSkgcmV0dXJuIGNhY2hlLmdldChwYXR0ZXJuKVxuXG4gIGxldCBtYXRjaGFibGUgPSBwYXR0ZXJuXG4gIGlmIChpc01hdGNoZXIobWF0Y2hhYmxlKSAmJiAhbWF0Y2hhYmxlLnRlc3QpIG1hdGNoYWJsZS50ZXN0ID0gbWF0Y2hhYmxlXG4gIGlmIChpc01hdGNoZXIobWF0Y2hhYmxlKSkgcmV0dXJuIG1hdGNoYWJsZVxuXG4gIGxldCBuZWdhdGVkID0gbWF0Y2hhYmxlWzBdID09PSAnISdcbiAgaWYgKG5lZ2F0ZWQpIG1hdGNoYWJsZSA9IG1hdGNoYWJsZS5zbGljZSgxKVxuICBtYXRjaGFibGUgPSB0b1JlZ0V4cChtYXRjaGFibGUpXG5cbiAgaWYgKG5lZ2F0ZWQgJiYgc2hvdWxkTmVnYXRlKSBtYXRjaGFibGUgPSBgKD8hJHttYXRjaGFibGV9KWBcbiAgaWYgKGFscGhhT21lZ2EpIG1hdGNoYWJsZSA9IGBeJHttYXRjaGFibGV9JGBcblxuICBtYXRjaGFibGUgPSBuZXcgUmVnRXhwKGAke21hdGNoYWJsZX1gLCAnaScpXG4gIG1hdGNoYWJsZS5uZWdhdGVkID0gbmVnYXRlZFxuXG4gIGNhY2hlLnNldChwYXR0ZXJuLCBtYXRjaGFibGUpXG4gIHJldHVybiBtYXRjaGFibGVcbn1cblxuLyoqXG4gKiBAZGVzYyBzYW1lIGFzIC5tYWtlIGJ1dCBhbHNvIGFjY2VwdHMgaW5wdXRzLCBhbmQgcmV0dXJucyBhbiBhcnJheVxuICogQG1lbWJlck9mIG1hdGNoZXJcbiAqIEBmdW5jIG1hdGNoXG4gKiBAc2luY2UgMy4wLjBcbiAqXG4gKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+IHwgc3RyaW5nfSBpbnB1dHMgaW5wdXQgdG8gdXNlIHBhdHRlcm5zIGFzIHByZWRpY2F0ZXMgb25cbiAqIEBwYXJhbSAge0FycmF5PHN0cmluZz4gfCBzdHJpbmcgfCBGdW5jdGlvbiB8IFJlZ0V4cH0gcGF0dGVybnMgcHJlZGljYXRlcyB0byBtYXRjaCB3aXRoLCB0cmFuc2Zvcm1lZCB0byBNYXRjaGVyXG4gKiBAcGFyYW0gIHtib29sZWFuIHwgdW5kZWZpbmVkfSBzaG91bGROZWdhdGUgc2hvdWxkIG5lZ2F0ZSwgcGFzc2VkIHRvIG1hdGNoZXIubWFrZVxuICogQHBhcmFtICB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gYWxwaGFPbWVnYSBzaG91bGQgZW5mb3JjZSByZWdleCBAYmVnaW5uaW5nIGFuZCBlbmQsIHBhc3NlZCB0byAubWF0Y2hlclxuICogQHJldHVybiB7QXJyYXk8YW55Pn1cbiAqXG4gKiBAc2VlIE1hdGNoZXIubWFrZVxuICogQHNlZSBjb21wb3NlL09ic2VydmVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqXG4gKiAgIG1hdGNoZXIoWydmb28nLCAnYmFyJywgJ21vbyddLCBbJypvbycsICchZm9vJ10pO1xuICogICAvLz0+IFsnbW9vJ11cbiAqXG4gKiAgIG1hdGNoZXIoWydmb28nLCAnYmFyJywgJ21vbyddLCBbJyEqb28nXSk7XG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICpcbiAqICAgbWF0Y2hlcigna2luZ2EnLCAna2luZ2EnKVxuICogICAvLz0+IFsna2luZ2EnXVxuICogICBtYXRjaGVyKCdrKm5nYScsICdraW5nYScpXG4gKiAgIC8vPT4gWydraW5nYSddXG4gKiAgIG1hdGNoZXIoJ2tpbmdhJywgJ25vcGUnKVxuICogICAvLz0+IFtdXG4gKlxuICogICBtYXRjaGVyKG5ldyBSZWdFeHAoL2tpbmdhLyksICdraW5nYScpXG4gKiAgIC8vPT4gWydraW5nYSddXG4gKiAgIG1hdGNoZXIobmV3IFJlZ0V4cCgva2luZ2EvKSwgJ25vcGUnKVxuICogICAvLz0+IFsnbm9wZSddXG4gKlxuICogICBtYXRjaGVyKHggPT4geCA9PT0gJ2tpbmdhJywgJ2tpbmdhJylcbiAqICAgLy89PiBbJ2tpbmdhJ11cbiAqICAgbWF0Y2hlcih4ID0+IHggPT09ICdraW5nYScsICdub3BlJylcbiAqICAgLy89PiBbXVxuICpcbiAqICAgbWF0Y2hlcih7dGVzdDogeCA9PiB4ID09PSAna2luZ2EnfSwgJ2tpbmdhJylcbiAqICAgLy89PiBbJ2tpbmdhJ11cbiAqICAgbWF0Y2hlcih7dGVzdDogeCA9PiB4ID09PSAna2luZ2EnfSwgJ25vcGUnKVxuICogICAvLz0+IFtdXG4gKlxuICpcbiAqL1xubS5tYXRjaGVyID0gKGlucHV0cywgcGF0dGVybnMsIHNob3VsZE5lZ2F0ZSwgYWxwaGFPbWVnYSkgPT4ge1xuICBwYXR0ZXJucyA9IHRvYXJyKHBhdHRlcm5zKS5tYXAocCA9PiBtLm1ha2UocCwgc2hvdWxkTmVnYXRlLCBhbHBoYU9tZWdhKSlcbiAgaW5wdXRzID0gdG9hcnIoaW5wdXRzKVxuXG4gIGNvbnN0IGZpcnN0TmVnYXRlZCA9IHBhdHRlcm5zWzBdLm5lZ2F0ZWRcbiAgY29uc3QgbWF0Y2hlc1RvUmV0dXJuID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2ldXG4gICAgLy8gSWYgZmlyc3QgcGF0dGVybiBpcyBuZWdhdGVkIHdlIGluY2x1ZGUgZXZlcnl0aGluZyB0byBtYXRjaCB1c2VyIGV4cGVjdGF0aW9uXG4gICAgbGV0IG1hdGNoZXMgPSBmaXJzdE5lZ2F0ZWRcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdHRlcm5zLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAocGF0dGVybnNbal0udGVzdChpbnB1dCkpIHtcbiAgICAgICAgbWF0Y2hlcyA9ICFwYXR0ZXJuc1tqXS5uZWdhdGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZXMpIG1hdGNoZXNUb1JldHVybi5wdXNoKGlucHV0KVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXNUb1JldHVyblxufVxuXG4vKiogQFRPRE86IHJlcGxhY2UgdG8tdGVzdCAqKi9cbi8vIG0udGVzdCA9IChpbnB1dHMsIHBhdHRlcm5zKSA9PiBtLm1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJucykubGVuZ3RoICE9PSAwXG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0QXNzaWduKG0ubWF0Y2hlciwgbSlcbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0FBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNqQ0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2xDQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7O0FBRXZDQSxHQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRFosQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFBLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsQUFBRztFQUM5QyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUE7O0VBRWpEQyxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU87RUFDdkIsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUEsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUE7RUFDdkUsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBQSxPQUFPLFNBQVMsRUFBQTs7RUFFMUNBLEdBQUcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7RUFDbEMsSUFBSSxPQUFPLEVBQUUsRUFBQSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQTtFQUMzQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQzs7RUFFL0IsSUFBSSxPQUFPLElBQUksWUFBWSxFQUFFLEVBQUEsU0FBUyxHQUFHLEtBQUksR0FBRSxTQUFTLE1BQUUsQUFBQyxFQUFBO0VBQzNELElBQUksVUFBVSxFQUFFLEVBQUEsU0FBUyxHQUFHLEdBQUUsR0FBRSxTQUFTLE1BQUUsQUFBQyxFQUFBOztFQUU1QyxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQSxFQUFDLEdBQUUsU0FBUyxDQUFFLEVBQUUsR0FBRyxDQUFDO0VBQzNDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTzs7RUFFM0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO0VBQzdCLE9BQU8sU0FBUztDQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxREQsQ0FBQyxDQUFDLE9BQU8sR0FBRyxTQUFBLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEFBQUc7RUFDMUQsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLENBQUEsQ0FBQyxBQUFHLFNBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFBLENBQUM7RUFDeEUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0VBRXRCRCxHQUFLLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO0VBQ3hDQSxHQUFLLENBQUMsZUFBZSxHQUFHLEVBQUU7O0VBRTFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3RDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0lBRXZCQyxHQUFHLENBQUMsT0FBTyxHQUFHLFlBQVk7SUFDMUIsS0FBS0EsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDeEMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzNCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO09BQy9CO0tBQ0Y7O0lBRUQsSUFBSSxPQUFPLEVBQUUsRUFBQSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFBO0dBQ3pDOztFQUVELE9BQU8sZUFBZTtDQUN2Qjs7Ozs7QUFLRCxNQUFNLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzsifQ==