UNPKG

@takentrade/takentrade-libs

Version:
151 lines (150 loc) 4.96 kB
"use strict"; /** * Validation utilities for common Nigerian/African fintech use cases */ Object.defineProperty(exports, "__esModule", { value: true }); exports.isValidAge = exports.isDateInRange = exports.isNotPastDate = exports.sanitizePhoneNumber = exports.isValidTransactionReference = exports.isValidReferralCode = exports.isStrongPassword = exports.isValidAmount = exports.isValidAccountNumber = exports.isValidNIN = exports.isValidBVN = exports.isValidEmail = exports.isValidNigerianPhone = void 0; /** * Validates Nigerian phone number * Accepts formats: 08012345678, +2348012345678, 2348012345678 */ const isValidNigerianPhone = (phone) => { const cleaned = phone.replace(/[\s\-\(\)]/g, ''); const patterns = [ /^0[7-9][0-1]\d{8}$/, // 08012345678 /^\+234[7-9][0-1]\d{8}$/, // +2348012345678 /^234[7-9][0-1]\d{8}$/, // 2348012345678 ]; return patterns.some((pattern) => pattern.test(cleaned)); }; exports.isValidNigerianPhone = isValidNigerianPhone; /** * Validates email address */ const isValidEmail = (email) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; exports.isValidEmail = isValidEmail; /** * Validates Nigerian BVN (Bank Verification Number) * Must be exactly 11 digits */ const isValidBVN = (bvn) => { return /^\d{11}$/.test(bvn); }; exports.isValidBVN = isValidBVN; /** * Validates Nigerian NIN (National Identification Number) * Must be exactly 11 digits */ const isValidNIN = (nin) => { return /^\d{11}$/.test(nin); }; exports.isValidNIN = isValidNIN; /** * Validates Nigerian account number * Must be exactly 10 digits (NUBAN format) */ const isValidAccountNumber = (accountNumber) => { return /^\d{10}$/.test(accountNumber); }; exports.isValidAccountNumber = isValidAccountNumber; /** * Validates amount (must be positive number) */ const isValidAmount = (amount) => { return typeof amount === 'number' && amount > 0 && isFinite(amount); }; exports.isValidAmount = isValidAmount; /** * Validates password strength * At least 8 characters, 1 uppercase, 1 lowercase, 1 number */ const isStrongPassword = (password) => { const minLength = 8; const hasUpperCase = /[A-Z]/.test(password); const hasLowerCase = /[a-z]/.test(password); const hasNumber = /\d/.test(password); return (password.length >= minLength && hasUpperCase && hasLowerCase && hasNumber); }; exports.isStrongPassword = isStrongPassword; /** * Validates referral code format * 6-10 alphanumeric characters */ const isValidReferralCode = (code) => { return /^[A-Z0-9]{6,10}$/.test(code); }; exports.isValidReferralCode = isValidReferralCode; /** * Validates transaction reference format */ const isValidTransactionReference = (ref) => { return /^[A-Z0-9_-]{10,50}$/.test(ref); }; exports.isValidTransactionReference = isValidTransactionReference; /** * Sanitizes phone number to standard format * Converts to: 2348012345678 */ const sanitizePhoneNumber = (phone, withPlus = false) => { if (!phone) return ''; const digits = phone.replace(/\D/g, ''); if (digits === '') return ''; if (digits.startsWith('234') && digits.length >= 13) { return withPlus ? '+' + digits : digits; } if (digits.startsWith('0') && digits.length === 11) { const result = '234' + digits.substring(1); return withPlus ? '+' + result : result; } if (digits.length === 10 && /^[789]/.test(digits)) { const result = '234' + digits; return withPlus ? '+' + result : result; } if (digits.startsWith('234')) { return withPlus ? '+' + digits : digits; } if (phone.trim().startsWith('+') || digits.length >= 11) { return withPlus ? '+' + digits : digits; } if (digits.length === 10) { const result = '234' + digits; return withPlus ? '+' + result : result; } return withPlus && phone.trim().startsWith('+') ? '+' + digits : digits; }; exports.sanitizePhoneNumber = sanitizePhoneNumber; /** * Validates date is not in the past */ const isNotPastDate = (date) => { return date.getTime() >= new Date().getTime(); }; exports.isNotPastDate = isNotPastDate; /** * Validates date is within range */ const isDateInRange = (date, minDate, maxDate) => { const timestamp = date.getTime(); return timestamp >= minDate.getTime() && timestamp <= maxDate.getTime(); }; exports.isDateInRange = isDateInRange; /** * Validates age is above minimum (for KYC) */ const isValidAge = (dateOfBirth, minAge = 18) => { const today = new Date(); const birthDate = new Date(dateOfBirth); let age = today.getFullYear() - birthDate.getFullYear(); const monthDiff = today.getMonth() - birthDate.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) { age--; } return age >= minAge; }; exports.isValidAge = isValidAge;