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

122 lines (116 loc) 4.59 kB
'use strict'; var assign = require('../../helpers/assign'); var hasSymbols = require('has-symbols')(); var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } }; var coercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return 42; } }; var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } }; var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } }; var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } }; var uncoercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return function toStrFn() {}; } }; var objects = [{}, coercibleObject, coercibleFnObject, toStringOnlyObject, valueOfOnlyObject]; var nullPrimitives = [undefined, null]; var nonIntegerNumbers = [-1.3, 0.2, 1.8, 1 / 3]; var zeroes = [0, -0]; var infinities = [Infinity, -Infinity]; var numbers = zeroes.concat([42], infinities, nonIntegerNumbers); var strings = ['', 'foo', 'a\uD83D\uDCA9c']; var booleans = [true, false]; var symbols = hasSymbols ? [Symbol.iterator, Symbol('foo')] : []; var nonSymbolPrimitives = [].concat(nullPrimitives, booleans, strings, numbers); var nonNumberPrimitives = [].concat(nullPrimitives, booleans, strings, symbols); var nonNullPrimitives = [].concat(booleans, strings, numbers, symbols); var nonUndefinedPrimitives = [].concat(null, nonNullPrimitives); var nonStrings = [].concat(nullPrimitives, booleans, numbers, symbols, objects); var primitives = [].concat(nullPrimitives, nonNullPrimitives); var nonPropertyKeys = [].concat(nullPrimitives, booleans, numbers, objects); var propertyKeys = [].concat(strings, symbols); var nonBooleans = [].concat(nullPrimitives, strings, symbols, numbers, objects); var falsies = [].concat(nullPrimitives, false, '', 0, -0, NaN); var truthies = [].concat(true, 'foo', 42, symbols, objects); var timestamps = [].concat(0, 946713600000, 1546329600000); var nonFunctions = [].concat(primitives, objects, [42]); var nonArrays = [].concat(nonFunctions); var descriptors = { configurable: function (descriptor) { return assign(assign({}, descriptor), { '[[Configurable]]': true }); }, nonConfigurable: function (descriptor) { return assign(assign({}, descriptor), { '[[Configurable]]': false }); }, enumerable: function (descriptor) { return assign(assign({}, descriptor), { '[[Enumerable]]': true }); }, nonEnumerable: function (descriptor) { return assign(assign({}, descriptor), { '[[Enumerable]]': false }); }, writable: function (descriptor) { return assign(assign({}, descriptor), { '[[Writable]]': true }); }, nonWritable: function (descriptor) { return assign(assign({}, descriptor), { '[[Writable]]': false }); } }; module.exports = { coercibleObject: coercibleObject, coercibleFnObject: coercibleFnObject, valueOfOnlyObject: valueOfOnlyObject, toStringOnlyObject: toStringOnlyObject, uncoercibleObject: uncoercibleObject, uncoercibleFnObject: uncoercibleFnObject, objects: objects, nonFunctions: nonFunctions, nonArrays: nonArrays, nullPrimitives: nullPrimitives, numbers: numbers, zeroes: zeroes, infinities: infinities, strings: strings, booleans: booleans, symbols: symbols, hasSymbols: hasSymbols, nonSymbolPrimitives: nonSymbolPrimitives, nonNumberPrimitives: nonNumberPrimitives, nonNullPrimitives: nonNullPrimitives, nonUndefinedPrimitives: nonUndefinedPrimitives, nonStrings: nonStrings, nonNumbers: nonNumberPrimitives.concat(objects), nonIntegerNumbers: nonIntegerNumbers, primitives: primitives, nonPropertyKeys: nonPropertyKeys, propertyKeys: propertyKeys, nonBooleans: nonBooleans, falsies: falsies, truthies: truthies, timestamps: timestamps, bothDescriptor: function () { return { '[[Get]]': function () {}, '[[Value]]': true }; }, bothDescriptorWritable: function () { return descriptors.writable({ '[[Get]]': function () {} }); }, accessorDescriptor: function (value) { return descriptors.enumerable(descriptors.configurable({ '[[Get]]': function get() { return value; } })); }, mutatorDescriptor: function () { return descriptors.enumerable(descriptors.configurable({ '[[Set]]': function () {} })); }, dataDescriptor: function (value) { return descriptors.nonWritable({ '[[Value]]': arguments.length > 0 ? value : 42 }); }, genericDescriptor: function () { return descriptors.configurable(descriptors.nonEnumerable()); }, descriptors: descriptors };