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

61 lines (45 loc) 1.57 kB
module.exports = { checksum(input) { const string = input.toString(); let sum = 0; let parity = 2; for (let i = string.length - 1; i >= 0; i--) { const digit = Math.max(parity, 1) * string[i]; sum += digit > 9 ? digit.toString().split('').map(Number).reduce((a, b) => a + b, 0) : digit; parity *= -1; } sum %= 10; return sum > 0 ? 10 - sum : 0; }, generate(input, inputOptions) { let string = input.toString(); const options = { pad: 0, weightFactor: 2 }; // option pad if (typeof inputOptions !== 'undefined') { if (typeof inputOptions.pad !== 'undefined') { options.pad = inputOptions.pad; if (options.pad > string.length) { string = Array(options.pad - String(string).length).join('0') + string; } } } return string + this.checksum(string); }, random(input, inputOptions) { function getRandomStringOfNumbers(length) { let randomStringOfNumbers = ''; while (randomStringOfNumbers.length < length) { const random = Math.random().toString(); randomStringOfNumbers += random.substr(2, random.length); if (randomStringOfNumbers.length > length) { randomStringOfNumbers = randomStringOfNumbers.substr(0, length); } } return randomStringOfNumbers; } return this.generate(getRandomStringOfNumbers(input - 1), inputOptions); }, validate(input) { return this.checksum(input.toString().slice(0, -1)) === parseInt(input.toString().slice(-1)); }, }