UNPKG

@vegaci_shared/vsplit-payment-gateway

Version:

A B2B payment gateway integration package for Stripe with split payment capabilities

130 lines (129 loc) 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isValidEmail = isValidEmail; exports.isValidAmount = isValidAmount; exports.isValidCurrency = isValidCurrency; exports.isValidPhoneNumber = isValidPhoneNumber; exports.isValidPostalCode = isValidPostalCode; exports.isValidOrderId = isValidOrderId; exports.isValidUrl = isValidUrl; exports.validateSplitPayments = validateSplitPayments; exports.validatePaymentConfig = validatePaymentConfig; /** * Validate email format */ function isValidEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); } /** * Validate amount (positive number) */ function isValidAmount(amount) { return typeof amount === 'number' && amount > 0 && isFinite(amount); } /** * Validate currency code (ISO 4217) */ function isValidCurrency(currency) { const currencyRegex = /^[A-Z]{3}$/; return currencyRegex.test(currency); } /** * Validate phone number (basic validation) */ function isValidPhoneNumber(phone) { const phoneRegex = /^\+?[\d\s\-()]+$/; return phoneRegex.test(phone) && phone.replace(/\D/g, '').length >= 10; } /** * Validate postal code (flexible format) */ function isValidPostalCode(postalCode, country) { if (!postalCode || postalCode.trim().length === 0) { return false; } // Country-specific validation can be added here switch (country?.toUpperCase()) { case 'US': return /^\d{5}(-\d{4})?$/.test(postalCode); case 'GB': case 'UK': return /^[A-Z]{1,2}\d[A-Z\d]?\s*\d[A-Z]{2}$/i.test(postalCode); case 'CA': return /^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i.test(postalCode); default: // Basic validation for other countries return postalCode.trim().length >= 3; } } /** * Validate order ID format */ function isValidOrderId(orderId) { return typeof orderId === 'string' && orderId.trim().length > 0; } /** * Validate URL format */ function isValidUrl(url) { try { new URL(url); return true; } catch { return false; } } /** * Validate split payment configuration */ function validateSplitPayments(splits, totalAmount) { if (!Array.isArray(splits) || splits.length === 0) { return { valid: false, error: 'At least one split payment is required' }; } if (splits.length > 10) { return { valid: false, error: 'Maximum 10 split payments allowed' }; } const totalSplitAmount = splits.reduce((sum, split) => sum + split.amount, 0); if (Math.abs(totalSplitAmount - totalAmount) > 0.01) { return { valid: false, error: 'Split amounts must equal total amount' }; } for (let i = 0; i < splits.length; i++) { if (!isValidAmount(splits[i].amount)) { return { valid: false, error: `Invalid amount for split ${i + 1}` }; } } return { valid: true }; } /** * Validate payment configuration */ function validatePaymentConfig(config) { const errors = []; if (!isValidAmount(config.amount)) { errors.push('Invalid payment amount'); } if (!isValidCurrency(config.currency)) { errors.push('Invalid currency code'); } if (!isValidOrderId(config.orderId)) { errors.push('Invalid order ID'); } if (config.customer?.email && !isValidEmail(config.customer.email)) { errors.push('Invalid customer email'); } if (config.customer?.phone && !isValidPhoneNumber(config.customer.phone)) { errors.push('Invalid customer phone number'); } if (config.returnUrl && !isValidUrl(config.returnUrl)) { errors.push('Invalid return URL'); } if (config.webhookUrl && !isValidUrl(config.webhookUrl)) { errors.push('Invalid webhook URL'); } return { valid: errors.length === 0, errors, }; }