UNPKG

random-world

Version:

Node.js module to generate random collections of data.

154 lines (127 loc) 3.94 kB
/** * Money module - generates random credit card and financial data */ import { InterfaceResolver } from '../utils/interface-resolver.js'; import { random, pickRandom } from '../utils/utilities.js'; import { NotFoundError } from '../errors.js'; import cards from './data/ccards.js'; export class Money extends InterfaceResolver { static namespace = 'money'; static methods = ['ccnumber', 'ccstart', 'ccexpiry', 'cctype', 'cvv', 'cv2']; /** * Generate a valid credit card number using Luhn algorithm * @param {Object} options - Options including shortName, hasHyphens * @returns {string} Credit card number */ ccnumber(options = {}) { let cardDefaults = pickRandom(cards); let hasHyphens = false; if (options.shortName) { cardDefaults = cards.find(card => card.shortName === options.shortName); } if (Object.hasOwn(options, 'hasHyphens')) { hasHyphens = options.hasHyphens; } if (!cardDefaults) { throw new NotFoundError('No card found with supplied shortName'); } const startsWith = pickRandom(cardDefaults.startsWith); const len = pickRandom(cardDefaults.len); let number = startsWith.toString(); while (number.length < (len - 1)) { number += Math.floor(random() * 10).toString(); } const check = this.calculateCheckDigit(number); number += check; if (hasHyphens) { number = number.match(/.{1,4}/g).join('-'); } return number; } /** * Calculate Luhn check digit * @param {string} string - Card number without check digit * @returns {string} Check digit */ calculateCheckDigit(string) { let checksum = 0; const isOdd = (string.length % 2) === 0; string.split('').reverse().forEach((val, idx) => { let digit = +val; if ((idx + (isOdd ? 0 : 1)) % 2) { digit *= 2; if (digit > 9) { digit -= 9; } } checksum += digit; }); if (checksum !== 0) { checksum = 10 - (checksum % 10); if (checksum === 10) { checksum = 0; } } return checksum.toString(); } /** * Generate a random card expiry date * @param {Object} options - Options (reserved for future use) * @returns {string} Expiry date (MM/YY) */ ccexpiry(options = {}) { return this.getRandomDate(options); } /** * Generate a random card start date * @param {Object} options - Options (reserved for future use) * @returns {string} Start date (MM/YY) */ ccstart(options = {}) { return this.getRandomDate(options); } /** * Generate a random MM/YY date * @param {Object} options - Options (reserved for future use) * @returns {string} Date (MM/YY) */ getRandomDate(_options = {}) { const defaults = { padding: 2, round: true, min: 1, max: 12, separator: '/' }; const month = this.proxy.numbers.integer(defaults); const year = this.proxy.numbers.integer(defaults); return [month, year].join(defaults.separator); } /** * Get a random card type name * @returns {string} Card type name */ cctype() { return pickRandom(cards).name; } /** * Generate a random CVV * @returns {string} 3-digit CVV */ cvv() { return this.proxy.numbers.integer({ min: 0, max: 999, padding: 3, round: true }); } /** * Alias for cvv * @returns {string} 3-digit CV2 */ cv2() { return this.cvv(); } } export default Money;