UNPKG

snap-validate

Version:

Zero-dependency, ~4KB validation library for common patterns. CJS + ESM, Standard Schema support, no TypeScript compiler required.

50 lines (37 loc) 1.14 kB
const { BaseValidator } = require('../core/BaseValidator'); const { safeRegexTestSync } = require('../utils/safeRegex'); const luhnCheck = (num) => { let sum = 0; let isEven = false; const cleanNum = String(num).replace(/\s/g, ''); for (let i = cleanNum.length - 1; i >= 0; i--) { let digit = parseInt(cleanNum[i], 10); if (isEven) { digit *= 2; if (digit > 9) digit -= 9; } sum += digit; isEven = !isEven; } return sum % 10 === 0; }; const creditCard = (value) => { return new BaseValidator(value) .required('Credit card number is required') .custom((val) => { // required() already handles emptiness; skip the digit/Luhn checks // for falsy values to avoid emitting a second error. if (!val) { return true; } const cleanValue = String(val).replace(/\s/g, ''); if (!safeRegexTestSync(/^\d{13,19}$/, cleanValue)) { return 'Credit card must be 13-19 digits'; } if (!luhnCheck(cleanValue)) { return 'Invalid credit card number'; } return true; }); }; module.exports = { creditCard };