@takentrade/takentrade-libs
Version:
TakeNTrade shared libraries
151 lines (150 loc) • 4.96 kB
JavaScript
;
/**
* 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;