payseed
Version:
A comprehensive TypeScript library for payment processing utilities - format money, validate cards, calculate fees, and more.
1 lines • 11.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"names":["formatMoney","money","amount","currency","value","calculateFee","percentage","seedId","prefix","random","time","toMinorUnits","decimals","toMajorUnits","identifyCardBrand","cardNumber","cleanNumber","maskCardNumber","lastFour","validateCardNumber","sum","isEven","i","digit","calculateProcessingFee","percentageFee","fixedFee","formatCurrency","locale","majorAmount","getCurrencyDecimals","parseMoney","moneyString","cleanString","addMoney","a","b","subtractMoney","multiplyMoney","factor","isZeroMoney","isNegativeMoney","paymentReference","type","prefixes","timestamp"],"mappings":"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","file":"index.cjs","sourcesContent":["export type CurrencyCode = 'USD' | 'EUR' | 'GBP' | 'JPY' | 'CAD' | 'AUD' | 'CHF' | 'CNY';\r\n\r\nexport interface Money {\r\n amount: number; // in minor units (cents)\r\n currency: CurrencyCode;\r\n}\r\n\r\nexport interface PaymentCard {\r\n number: string;\r\n brand?: 'visa' | 'mastercard' | 'amex' | 'discover' | 'unknown';\r\n}\r\n\r\nexport function formatMoney(money: Money): string {\r\n const { amount, currency } = money;\r\n const value = (amount / 100).toFixed(2);\r\n return `${currency} ${value}`;\r\n}\r\n\r\nexport function calculateFee(amount: number, percentage: number): number {\r\n if (amount < 0) throw new Error('Amount must be non-negative');\r\n if (percentage < 0) throw new Error('Percentage must be non-negative');\r\n return Math.round((amount * percentage) / 100);\r\n}\r\n\r\nexport function seedId(prefix = 'payseed'): string {\r\n const random = Math.random().toString(36).slice(2, 10);\r\n const time = Date.now().toString(36);\r\n return `${prefix}_${time}_${random}`;\r\n}\r\n\r\n/**\r\n * Convert amount from major units to minor units (e.g., dollars to cents)\r\n */\r\nexport function toMinorUnits(amount: number, decimals = 2): number {\r\n return Math.round(amount * Math.pow(10, decimals));\r\n}\r\n\r\n/**\r\n * Convert amount from minor units to major units (e.g., cents to dollars)\r\n */\r\nexport function toMajorUnits(amount: number, decimals = 2): number {\r\n return amount / Math.pow(10, decimals);\r\n}\r\n\r\n/**\r\n * Validate and identify credit card brand\r\n */\r\nexport function identifyCardBrand(cardNumber: string): PaymentCard['brand'] {\r\n const cleanNumber = cardNumber.replace(/\\D/g, '');\r\n \r\n if (/^4/.test(cleanNumber)) return 'visa';\r\n if (/^5[1-5]/.test(cleanNumber)) return 'mastercard';\r\n if (/^3[47]/.test(cleanNumber)) return 'amex';\r\n if (/^6(?:011|5)/.test(cleanNumber)) return 'discover';\r\n \r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Mask credit card number for display (show only last 4 digits)\r\n */\r\nexport function maskCardNumber(cardNumber: string): string {\r\n const cleanNumber = cardNumber.replace(/\\D/g, '');\r\n if (cleanNumber.length < 4) return '****';\r\n \r\n const lastFour = cleanNumber.slice(-4);\r\n const masked = '*'.repeat(Math.max(cleanNumber.length - 4, 0));\r\n \r\n return masked + lastFour;\r\n}\r\n\r\n/**\r\n * Validate card number using Luhn algorithm\r\n */\r\nexport function validateCardNumber(cardNumber: string): boolean {\r\n const cleanNumber = cardNumber.replace(/\\D/g, '');\r\n \r\n if (cleanNumber.length < 13 || cleanNumber.length > 19) {\r\n return false;\r\n }\r\n \r\n let sum = 0;\r\n let isEven = false;\r\n \r\n for (let i = cleanNumber.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleanNumber[i], 10);\r\n \r\n if (isEven) {\r\n digit *= 2;\r\n if (digit > 9) {\r\n digit -= 9;\r\n }\r\n }\r\n \r\n sum += digit;\r\n isEven = !isEven;\r\n }\r\n \r\n return sum % 10 === 0;\r\n}\r\n\r\n/**\r\n * Calculate payment processing fee with fixed and percentage components\r\n */\r\nexport function calculateProcessingFee(\r\n amount: number,\r\n percentageFee: number,\r\n fixedFee: number = 0\r\n): number {\r\n if (amount < 0) throw new Error('Amount must be non-negative');\r\n if (percentageFee < 0) throw new Error('Percentage fee must be non-negative');\r\n if (fixedFee < 0) throw new Error('Fixed fee must be non-negative');\r\n \r\n const percentageAmount = Math.round((amount * percentageFee) / 100);\r\n return percentageAmount + fixedFee;\r\n}\r\n\r\n/**\r\n * Format currency with locale support\r\n */\r\nexport function formatCurrency(\r\n amount: number,\r\n currency: CurrencyCode,\r\n locale = 'en-US'\r\n): string {\r\n const majorAmount = toMajorUnits(amount, getCurrencyDecimals(currency));\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n }).format(majorAmount);\r\n}\r\n\r\n/**\r\n * Get number of decimals for a currency\r\n */\r\nexport function getCurrencyDecimals(currency: CurrencyCode): number {\r\n // JPY typically has no decimal places\r\n if (currency === 'JPY') return 0;\r\n \r\n // Most currencies use 2 decimal places\r\n return 2;\r\n}\r\n\r\n/**\r\n * Parse money string to Money object\r\n */\r\nexport function parseMoney(moneyString: string, currency: CurrencyCode): Money {\r\n const cleanString = moneyString.replace(/[^0-9.-]/g, '');\r\n const amount = parseFloat(cleanString);\r\n \r\n if (isNaN(amount)) {\r\n throw new Error('Invalid money format');\r\n }\r\n \r\n return {\r\n amount: toMinorUnits(amount, getCurrencyDecimals(currency)),\r\n currency,\r\n };\r\n}\r\n\r\n/**\r\n * Add two money values (must be same currency)\r\n */\r\nexport function addMoney(a: Money, b: Money): Money {\r\n if (a.currency !== b.currency) {\r\n throw new Error('Cannot add money with different currencies');\r\n }\r\n \r\n return {\r\n amount: a.amount + b.amount,\r\n currency: a.currency,\r\n };\r\n}\r\n\r\n/**\r\n * Subtract two money values (must be same currency)\r\n */\r\nexport function subtractMoney(a: Money, b: Money): Money {\r\n if (a.currency !== b.currency) {\r\n throw new Error('Cannot subtract money with different currencies');\r\n }\r\n \r\n return {\r\n amount: a.amount - b.amount,\r\n currency: a.currency,\r\n };\r\n}\r\n\r\n/**\r\n * Multiply money by a factor\r\n */\r\nexport function multiplyMoney(money: Money, factor: number): Money {\r\n return {\r\n amount: Math.round(money.amount * factor),\r\n currency: money.currency,\r\n };\r\n}\r\n\r\n/**\r\n * Check if money amount is zero\r\n */\r\nexport function isZeroMoney(money: Money): boolean {\r\n return money.amount === 0;\r\n}\r\n\r\n/**\r\n * Check if money amount is negative\r\n */\r\nexport function isNegativeMoney(money: Money): boolean {\r\n return money.amount < 0;\r\n}\r\n\r\n/**\r\n * Generate a payment reference ID\r\n */\r\nexport function paymentReference(type: 'invoice' | 'order' | 'payment' = 'payment'): string {\r\n const prefixes = {\r\n invoice: 'INV',\r\n order: 'ORD',\r\n payment: 'PAY',\r\n };\r\n \r\n const timestamp = Date.now().toString(36).toUpperCase();\r\n const random = Math.random().toString(36).substring(2, 8).toUpperCase();\r\n \r\n return `${prefixes[type]}-${timestamp}-${random}`;\r\n}\r\n"]}