UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

68 lines (64 loc) 2.24 kB
'use strict'; var micromatch = require('micromatch'); var normalize = require('normalize-path'); var path = require('path'); // required for tests. var arrify = function(a) { return a == null ? [] : (Array.isArray(a) ? a : [a]); }; var anymatch = function(criteria, value, returnIndex, startIndex, endIndex) { criteria = arrify(criteria); value = arrify(value); if (arguments.length === 1) { return anymatch.bind(null, criteria.map(function(criterion) { return typeof criterion === 'string' && criterion[0] !== '!' ? micromatch.matcher(criterion) : criterion; })); } startIndex = startIndex || 0; var string = value[0]; var altString, altValue; var matched = false; var matchIndex = -1; function testCriteria(criterion, index) { var result; switch (Object.prototype.toString.call(criterion)) { case '[object String]': result = string === criterion || altString && altString === criterion; result = result || micromatch.isMatch(string, criterion); break; case '[object RegExp]': result = criterion.test(string) || altString && criterion.test(altString); break; case '[object Function]': result = criterion.apply(null, value); result = result || altValue && criterion.apply(null, altValue); break; default: result = false; } if (result) { matchIndex = index + startIndex; } return result; } var crit = criteria; var negGlobs = crit.reduce(function(arr, criterion, index) { if (typeof criterion === 'string' && criterion[0] === '!') { if (crit === criteria) { // make a copy before modifying crit = crit.slice(); } crit[index] = null; arr.push(criterion.substr(1)); } return arr; }, []); if (!negGlobs.length || !micromatch.any(string, negGlobs)) { if (path.sep === '\\' && typeof string === 'string') { altString = normalize(string); altString = altString === string ? null : altString; if (altString) altValue = [altString].concat(value.slice(1)); } matched = crit.slice(startIndex, endIndex).some(testCriteria); } return returnIndex === true ? matchIndex : matched; }; module.exports = anymatch;