finprim 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/iban.ts","../../src/sortcode.ts","../../src/currency.ts","../../src/bic.ts","../../src/card.ts","../../src/zod/index.ts"],"names":["z"],"mappings":";;;;;;;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,E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","file":"index.js","sourcesContent":["import type { IBAN, IBANValidationResult } from './types'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const upper = input.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${input}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n let currency: SupportedCurrency | undefined\n let cleaned = input.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const digits = input.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","import { z } from 'zod'\nimport { validateIBAN } from '../iban'\nimport { validateUKSortCode, validateUKAccountNumber } from '../sortcode'\nimport { validateCurrencyCode } from '../currency'\nimport { validateBIC } from '../bic'\nimport { validateCardNumber } from '../card'\n\ntype StringValidator = (val: string) => { valid: boolean; error?: string }\n\nfunction refineWith(validator: StringValidator) {\n return {\n validate: (val: string) => validator(val).valid,\n message: (val: string) => {\n const result = validator(val)\n return { message: result.valid ? '' : (result.error ?? 'Invalid') }\n },\n }\n}\n\nconst ibanRefiner = refineWith(validateIBAN)\nconst sortCodeRefiner = refineWith(validateUKSortCode)\nconst accountNumberRefiner = refineWith(validateUKAccountNumber)\nconst currencyRefiner = refineWith(validateCurrencyCode)\nconst bicRefiner = refineWith(validateBIC)\nconst cardNumberRefiner = refineWith(validateCardNumber)\n\nexport const ibanSchema = z.string().refine(ibanRefiner.validate, ibanRefiner.message)\n\nexport const sortCodeSchema = z.string().refine(sortCodeRefiner.validate, sortCodeRefiner.message)\n\nexport const accountNumberSchema = z\n .string()\n .refine(accountNumberRefiner.validate, accountNumberRefiner.message)\n\nexport const currencySchema = z.string().refine(currencyRefiner.validate, currencyRefiner.message)\n\nexport const bicSchema = z.string().refine(bicRefiner.validate, bicRefiner.message)\n\nexport const cardNumberSchema = z.string().refine(cardNumberRefiner.validate, cardNumberRefiner.message)\n\nexport const ukPaymentSchema = z.object({\n sortCode: sortCodeSchema,\n accountNumber: accountNumberSchema,\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(18).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport const internationalPaymentSchema = z.object({\n iban: ibanSchema,\n bic: bicSchema.optional(),\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(35).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport type UKPayment = z.infer<typeof ukPaymentSchema>\nexport type InternationalPayment = z.infer<typeof internationalPaymentSchema>\n"]}
1
+ {"version":3,"sources":["../../src/_guard.ts","../../src/iban.ts","../../src/sortcode.ts","../../src/currency.ts","../../src/bic.ts","../../src/card.ts","../../src/vat.ts","../../src/routing.ts","../../src/zod/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["export const MAX_SAFE_INPUT_LENGTH = 256\n\nexport function guardStringInput(\n input: unknown,\n label = 'Input'\n): { ok: true; value: string } | { ok: false; error: string } {\n if (input == null || typeof input !== 'string') {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length === 0) {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length > MAX_SAFE_INPUT_LENGTH) {\n return {\n ok: false,\n error: `${label} must not exceed ${MAX_SAFE_INPUT_LENGTH} characters`,\n }\n }\n return { ok: true, value: input }\n}\n\nexport function guardNumber(\n value: unknown,\n options: { min?: number; max?: number; integer?: boolean; label?: string }\n): { ok: true; value: number } | { ok: false; error: string } {\n const label = options.label ?? 'Value'\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return { ok: false, error: `${label} must be a finite number` }\n }\n if (Number.isNaN(value)) {\n return { ok: false, error: `${label} must not be NaN` }\n }\n if (options.integer && !Number.isInteger(value)) {\n return { ok: false, error: `${label} must be an integer` }\n }\n if (options.min !== undefined && value < options.min) {\n return { ok: false, error: `${label} must be at least ${options.min}` }\n }\n if (options.max !== undefined && value > options.max) {\n return { ok: false, error: `${label} must be at most ${options.max}` }\n }\n return { ok: true, value }\n}\n","import type { IBAN, IBANValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function formatIBAN(input: string): string {\n if (typeof input !== 'string') return ''\n const cleaned = input.replace(/\\s/g, '').toUpperCase().slice(0, 34)\n return formatIBANString(cleaned)\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport function formatSortCode(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/[-\\s]/g, '').slice(0, 6)\n if (digits.length < 6) return digits\n return `${digits.slice(0, 2)}-${digits.slice(2, 4)}-${digits.slice(4, 6)}`\n}\n\nexport function formatUKAccountNumber(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/\\s/g, '').slice(0, 8)\n if (digits.length < 8) return digits\n return `${digits.slice(0, 4)} ${digits.slice(4, 8)}`\n}\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const upper = guarded.value.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${upper}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n if (typeof amount !== 'number' || !Number.isFinite(amount)) {\n return ''\n }\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n let currency: SupportedCurrency | undefined\n let cleaned = guarded.value.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const digits = guarded.value.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","import type { VATNumber, VATValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst EU_VAT_PATTERNS: Record<string, RegExp> = {\n AT: /^ATU\\d{8}$/,\n BE: /^BE0?\\d{9}$/,\n BG: /^BG\\d{9,10}$/,\n CY: /^CY\\d{8}[A-Z]$/,\n CZ: /^CZ\\d{8,10}$/,\n DE: /^DE\\d{9}$/,\n DK: /^DK\\d{8}$/,\n EE: /^EE\\d{9}$/,\n EL: /^EL\\d{9}$/,\n ES: /^ES[A-Z0-9]\\d{7}[A-Z0-9]$/,\n FI: /^FI\\d{8}$/,\n FR: /^FR[A-HJ-NP-Z0-9]{2}\\d{9}$/,\n GR: /^GR\\d{9}$/,\n HR: /^HR\\d{11}$/,\n HU: /^HU\\d{8}$/,\n IE: /^IE\\d[A-Z0-9]\\d{5}[A-Z]$|^IE\\d{7}[A-W][A-I0-9]?$/,\n IT: /^IT\\d{11}$/,\n LT: /^LT\\d{9}$|^LT\\d{12}$/,\n LU: /^LU\\d{8}$/,\n LV: /^LV\\d{11}$/,\n MT: /^MT\\d{8}$/,\n NL: /^NL\\d{9}B\\d{2}$/,\n PL: /^PL\\d{10}$/,\n PT: /^PT\\d{9}$/,\n RO: /^RO\\d{2,10}$/,\n SE: /^SE\\d{12}$/,\n SI: /^SI\\d{8}$/,\n SK: /^SK\\d{10}$/,\n}\n\nexport function validateEUVAT(input: string): VATValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'VAT number is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n const pattern = EU_VAT_PATTERNS[countryCode]\n if (!pattern) {\n return { valid: false, error: `Unsupported EU VAT country code: ${countryCode}` }\n }\n\n if (!pattern.test(cleaned)) {\n return { valid: false, error: `Invalid VAT format for ${countryCode}` }\n }\n\n const formatted = `${countryCode} ${cleaned.slice(2)}`\n\n return {\n valid: true,\n value: cleaned as VATNumber,\n formatted,\n countryCode,\n }\n}\n","import type { RoutingNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nfunction routingChecksum(digits: string): boolean {\n if (digits.length !== 9) return false\n const sum =\n 3 * (Number(digits[0]) + Number(digits[3]) + Number(digits[6])) +\n 7 * (Number(digits[1]) + Number(digits[4]) + Number(digits[7])) +\n Number(digits[2]) + Number(digits[5]) + Number(digits[8])\n return sum % 10 === 0\n}\n\nexport function validateUSRoutingNumber(input: string): ValidationResult<RoutingNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{9}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'US routing number must be exactly 9 digits',\n }\n }\n\n if (!routingChecksum(cleaned)) {\n return { valid: false, error: 'US routing number checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as RoutingNumber,\n formatted: cleaned,\n }\n}\n","import { z } from 'zod'\nimport { validateIBAN } from '../iban'\nimport { validateUKSortCode, validateUKAccountNumber } from '../sortcode'\nimport { validateCurrencyCode } from '../currency'\nimport { validateBIC } from '../bic'\nimport { validateCardNumber } from '../card'\nimport { validateEUVAT } from '../vat'\nimport { validateUSRoutingNumber } from '../routing'\n\ntype StringValidator = (val: string) => { valid: boolean; error?: string }\n\nfunction refineWith(validator: StringValidator) {\n return {\n validate: (val: string) => validator(val).valid,\n message: (val: string) => {\n const result = validator(val)\n return { message: result.valid ? '' : (result.error ?? 'Invalid') }\n },\n }\n}\n\nconst ibanRefiner = refineWith(validateIBAN)\nconst sortCodeRefiner = refineWith(validateUKSortCode)\nconst accountNumberRefiner = refineWith(validateUKAccountNumber)\nconst currencyRefiner = refineWith(validateCurrencyCode)\nconst bicRefiner = refineWith(validateBIC)\nconst cardNumberRefiner = refineWith(validateCardNumber)\nconst vatRefiner = refineWith(validateEUVAT)\nconst routingNumberRefiner = refineWith(validateUSRoutingNumber)\n\nexport const ibanSchema = z.string().refine(ibanRefiner.validate, ibanRefiner.message)\n\nexport const sortCodeSchema = z.string().refine(sortCodeRefiner.validate, sortCodeRefiner.message)\n\nexport const accountNumberSchema = z\n .string()\n .refine(accountNumberRefiner.validate, accountNumberRefiner.message)\n\nexport const currencySchema = z.string().refine(currencyRefiner.validate, currencyRefiner.message)\n\nexport const bicSchema = z.string().refine(bicRefiner.validate, bicRefiner.message)\n\nexport const cardNumberSchema = z.string().refine(cardNumberRefiner.validate, cardNumberRefiner.message)\n\nexport const vatSchema = z.string().refine(vatRefiner.validate, vatRefiner.message)\n\nexport const routingNumberSchema = z\n .string()\n .refine(routingNumberRefiner.validate, routingNumberRefiner.message)\n\nexport const ukPaymentSchema = z.object({\n sortCode: sortCodeSchema,\n accountNumber: accountNumberSchema,\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(18).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport const internationalPaymentSchema = z.object({\n iban: ibanSchema,\n bic: bicSchema.optional(),\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(35).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport type UKPayment = z.infer<typeof ukPaymentSchema>\nexport type InternationalPayment = z.infer<typeof internationalPaymentSchema>\n"]}
@@ -2,6 +2,24 @@ import { z } from 'zod';
2
2
 
3
3
  // src/zod/index.ts
4
4
 
5
+ // src/_guard.ts
6
+ var MAX_SAFE_INPUT_LENGTH = 256;
7
+ function guardStringInput(input, label = "Input") {
8
+ if (input == null || typeof input !== "string") {
9
+ return { ok: false, error: `${label} must be a non-empty string` };
10
+ }
11
+ if (input.length === 0) {
12
+ return { ok: false, error: `${label} must be a non-empty string` };
13
+ }
14
+ if (input.length > MAX_SAFE_INPUT_LENGTH) {
15
+ return {
16
+ ok: false,
17
+ error: `${label} must not exceed ${MAX_SAFE_INPUT_LENGTH} characters`
18
+ };
19
+ }
20
+ return { ok: true, value: input };
21
+ }
22
+
5
23
  // src/iban.ts
6
24
  var IBAN_LENGTHS = {
7
25
  AL: 28,
@@ -89,10 +107,9 @@ function formatIBANString(iban) {
89
107
  return iban.replace(/(.{4})/g, "$1 ").trim();
90
108
  }
91
109
  function validateIBAN(input) {
92
- if (!input || typeof input !== "string") {
93
- return { valid: false, error: "Input must be a non-empty string" };
94
- }
95
- const cleaned = input.replace(/\s/g, "").toUpperCase();
110
+ const guarded = guardStringInput(input);
111
+ if (!guarded.ok) return { valid: false, error: guarded.error };
112
+ const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
96
113
  if (cleaned.length < 4) {
97
114
  return { valid: false, error: "IBAN is too short" };
98
115
  }
@@ -127,10 +144,9 @@ function validateIBAN(input) {
127
144
 
128
145
  // src/sortcode.ts
129
146
  function validateUKSortCode(input) {
130
- if (!input || typeof input !== "string") {
131
- return { valid: false, error: "Input must be a non-empty string" };
132
- }
133
- const cleaned = input.replace(/[-\s]/g, "");
147
+ const guarded = guardStringInput(input);
148
+ if (!guarded.ok) return { valid: false, error: guarded.error };
149
+ const cleaned = guarded.value.replace(/[-\s]/g, "");
134
150
  if (!/^\d{6}$/.test(cleaned)) {
135
151
  return {
136
152
  valid: false,
@@ -145,10 +161,9 @@ function validateUKSortCode(input) {
145
161
  };
146
162
  }
147
163
  function validateUKAccountNumber(input) {
148
- if (!input || typeof input !== "string") {
149
- return { valid: false, error: "Input must be a non-empty string" };
150
- }
151
- const cleaned = input.replace(/\s/g, "");
164
+ const guarded = guardStringInput(input);
165
+ if (!guarded.ok) return { valid: false, error: guarded.error };
166
+ const cleaned = guarded.value.replace(/\s/g, "");
152
167
  if (!/^\d{8}$/.test(cleaned)) {
153
168
  return {
154
169
  valid: false,
@@ -175,14 +190,13 @@ var SUPPORTED_CURRENCIES = [
175
190
  "NZD"
176
191
  ];
177
192
  function validateCurrencyCode(input) {
178
- if (!input || typeof input !== "string") {
179
- return { valid: false, error: "Input must be a non-empty string" };
180
- }
181
- const upper = input.toUpperCase();
193
+ const guarded = guardStringInput(input);
194
+ if (!guarded.ok) return { valid: false, error: guarded.error };
195
+ const upper = guarded.value.toUpperCase();
182
196
  if (!SUPPORTED_CURRENCIES.includes(upper)) {
183
197
  return {
184
198
  valid: false,
185
- error: `Unsupported currency code: ${input}. Supported: ${SUPPORTED_CURRENCIES.join(", ")}`
199
+ error: `Unsupported currency code: ${upper}. Supported: ${SUPPORTED_CURRENCIES.join(", ")}`
186
200
  };
187
201
  }
188
202
  return {
@@ -195,10 +209,9 @@ function validateCurrencyCode(input) {
195
209
  // src/bic.ts
196
210
  var BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/;
197
211
  function validateBIC(input) {
198
- if (!input || typeof input !== "string") {
199
- return { valid: false, error: "Input must be a non-empty string" };
200
- }
201
- const cleaned = input.replace(/\s/g, "").toUpperCase();
212
+ const guarded = guardStringInput(input);
213
+ if (!guarded.ok) return { valid: false, error: guarded.error };
214
+ const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
202
215
  if (cleaned.length !== 8 && cleaned.length !== 11) {
203
216
  return {
204
217
  valid: false,
@@ -237,10 +250,9 @@ function formatCardNumber(digits, network) {
237
250
  return digits.replace(/(.{4})/g, "$1 ").trim();
238
251
  }
239
252
  function validateCardNumber(input) {
240
- if (!input || typeof input !== "string") {
241
- return { valid: false, error: "Input must be a non-empty string" };
242
- }
243
- const digits = input.replace(/[\s-]/g, "");
253
+ const guarded = guardStringInput(input);
254
+ if (!guarded.ok) return { valid: false, error: guarded.error };
255
+ const digits = guarded.value.replace(/[\s-]/g, "");
244
256
  if (!/^\d+$/.test(digits)) {
245
257
  return { valid: false, error: "Card number must contain only digits" };
246
258
  }
@@ -274,6 +286,87 @@ function validateCardNumber(input) {
274
286
  };
275
287
  }
276
288
 
289
+ // src/vat.ts
290
+ var EU_VAT_PATTERNS = {
291
+ AT: /^ATU\d{8}$/,
292
+ BE: /^BE0?\d{9}$/,
293
+ BG: /^BG\d{9,10}$/,
294
+ CY: /^CY\d{8}[A-Z]$/,
295
+ CZ: /^CZ\d{8,10}$/,
296
+ DE: /^DE\d{9}$/,
297
+ DK: /^DK\d{8}$/,
298
+ EE: /^EE\d{9}$/,
299
+ EL: /^EL\d{9}$/,
300
+ ES: /^ES[A-Z0-9]\d{7}[A-Z0-9]$/,
301
+ FI: /^FI\d{8}$/,
302
+ FR: /^FR[A-HJ-NP-Z0-9]{2}\d{9}$/,
303
+ GR: /^GR\d{9}$/,
304
+ HR: /^HR\d{11}$/,
305
+ HU: /^HU\d{8}$/,
306
+ IE: /^IE\d[A-Z0-9]\d{5}[A-Z]$|^IE\d{7}[A-W][A-I0-9]?$/,
307
+ IT: /^IT\d{11}$/,
308
+ LT: /^LT\d{9}$|^LT\d{12}$/,
309
+ LU: /^LU\d{8}$/,
310
+ LV: /^LV\d{11}$/,
311
+ MT: /^MT\d{8}$/,
312
+ NL: /^NL\d{9}B\d{2}$/,
313
+ PL: /^PL\d{10}$/,
314
+ PT: /^PT\d{9}$/,
315
+ RO: /^RO\d{2,10}$/,
316
+ SE: /^SE\d{12}$/,
317
+ SI: /^SI\d{8}$/,
318
+ SK: /^SK\d{10}$/
319
+ };
320
+ function validateEUVAT(input) {
321
+ const guarded = guardStringInput(input);
322
+ if (!guarded.ok) return { valid: false, error: guarded.error };
323
+ const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
324
+ if (cleaned.length < 4) {
325
+ return { valid: false, error: "VAT number is too short" };
326
+ }
327
+ const countryCode = cleaned.slice(0, 2);
328
+ const pattern = EU_VAT_PATTERNS[countryCode];
329
+ if (!pattern) {
330
+ return { valid: false, error: `Unsupported EU VAT country code: ${countryCode}` };
331
+ }
332
+ if (!pattern.test(cleaned)) {
333
+ return { valid: false, error: `Invalid VAT format for ${countryCode}` };
334
+ }
335
+ const formatted = `${countryCode} ${cleaned.slice(2)}`;
336
+ return {
337
+ valid: true,
338
+ value: cleaned,
339
+ formatted,
340
+ countryCode
341
+ };
342
+ }
343
+
344
+ // src/routing.ts
345
+ function routingChecksum(digits) {
346
+ if (digits.length !== 9) return false;
347
+ const sum = 3 * (Number(digits[0]) + Number(digits[3]) + Number(digits[6])) + 7 * (Number(digits[1]) + Number(digits[4]) + Number(digits[7])) + Number(digits[2]) + Number(digits[5]) + Number(digits[8]);
348
+ return sum % 10 === 0;
349
+ }
350
+ function validateUSRoutingNumber(input) {
351
+ const guarded = guardStringInput(input);
352
+ if (!guarded.ok) return { valid: false, error: guarded.error };
353
+ const cleaned = guarded.value.replace(/\s/g, "");
354
+ if (!/^\d{9}$/.test(cleaned)) {
355
+ return {
356
+ valid: false,
357
+ error: "US routing number must be exactly 9 digits"
358
+ };
359
+ }
360
+ if (!routingChecksum(cleaned)) {
361
+ return { valid: false, error: "US routing number checksum is invalid" };
362
+ }
363
+ return {
364
+ valid: true,
365
+ value: cleaned,
366
+ formatted: cleaned
367
+ };
368
+ }
369
+
277
370
  // src/zod/index.ts
278
371
  function refineWith(validator) {
279
372
  return {
@@ -290,12 +383,16 @@ var accountNumberRefiner = refineWith(validateUKAccountNumber);
290
383
  var currencyRefiner = refineWith(validateCurrencyCode);
291
384
  var bicRefiner = refineWith(validateBIC);
292
385
  var cardNumberRefiner = refineWith(validateCardNumber);
386
+ var vatRefiner = refineWith(validateEUVAT);
387
+ var routingNumberRefiner = refineWith(validateUSRoutingNumber);
293
388
  var ibanSchema = z.string().refine(ibanRefiner.validate, ibanRefiner.message);
294
389
  var sortCodeSchema = z.string().refine(sortCodeRefiner.validate, sortCodeRefiner.message);
295
390
  var accountNumberSchema = z.string().refine(accountNumberRefiner.validate, accountNumberRefiner.message);
296
391
  var currencySchema = z.string().refine(currencyRefiner.validate, currencyRefiner.message);
297
392
  var bicSchema = z.string().refine(bicRefiner.validate, bicRefiner.message);
298
393
  var cardNumberSchema = z.string().refine(cardNumberRefiner.validate, cardNumberRefiner.message);
394
+ var vatSchema = z.string().refine(vatRefiner.validate, vatRefiner.message);
395
+ var routingNumberSchema = z.string().refine(routingNumberRefiner.validate, routingNumberRefiner.message);
299
396
  var ukPaymentSchema = z.object({
300
397
  sortCode: sortCodeSchema,
301
398
  accountNumber: accountNumberSchema,
@@ -313,6 +410,6 @@ var internationalPaymentSchema = z.object({
313
410
  payeeName: z.string().min(1).max(140).optional()
314
411
  });
315
412
 
316
- export { accountNumberSchema, bicSchema, cardNumberSchema, currencySchema, ibanSchema, internationalPaymentSchema, sortCodeSchema, ukPaymentSchema };
413
+ export { accountNumberSchema, bicSchema, cardNumberSchema, currencySchema, ibanSchema, internationalPaymentSchema, routingNumberSchema, sortCodeSchema, ukPaymentSchema, vatSchema };
317
414
  //# sourceMappingURL=index.mjs.map
318
415
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/iban.ts","../../src/sortcode.ts","../../src/currency.ts","../../src/bic.ts","../../src/card.ts","../../src/zod/index.ts"],"names":[],"mappings":";;;;;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI;AAC9D,CAAA;AAEA,IAAM,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA;AAClC,IAAM,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA;AAClC,IAAM,sBAAA,GAAyB,EAAA;AAE/B,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,MAAA;AAAA,IAChB,CAAC,WAAW,IAAA,KAAA,CAAU,SAAA,GAAY,KAAK,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,IAAK,EAAA;AAAA,IACpE;AAAA,GACF;AACF;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAClD,EAAA,OAAO,CAAC,GAAG,UAAU,CAAA,CAClB,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AACpC,IAAA,OAAO,QAAQ,QAAA,IAAY,IAAA,IAAQ,YAC9B,IAAA,GAAO,sBAAA,EAAwB,UAAS,GACzC,IAAA;AAAA,EACN,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAC7C;AAEO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAErD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEtC,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,8CAAA,EAA+C;AAAA,EAC/E;AAEA,EAAA,MAAM,cAAA,GAAiB,aAAa,WAAW,CAAA;AAE/C,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,0BAAA,EAA6B,WAAW,CAAA,CAAA,EAAG;AAAA,EAC3E;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,cAAA,EAAgB;AACrC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,CAAA,mBAAA,EAAsB,WAAW,mBAAmB,cAAc,CAAA,iBAAA,EAAoB,QAAQ,MAAM,CAAA;AAAA,KAC7G;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AAEnC,EAAA,IAAI,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,EAC3D;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,iBAAiB,OAAO,CAAA;AAAA,IACnC;AAAA,GACF;AACF;;;ACpFO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAE1C,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEtF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACF;AACF;AAEO,SAAS,wBAAwB,KAAA,EAAgD;AACtF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEvC,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACF;AACF;;;AC5CO,IAAM,oBAAA,GAA4C;AAAA,EACvD,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AACnD,CAAA;AAqBO,SAAS,qBAAqB,KAAA,EAA+C;AAClF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,EAAA,IAAI,CAAC,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,CAAA,2BAAA,EAA8B,KAAK,gBAAgB,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AACF;;;AC1CA,IAAM,SAAA,GAAY,6CAAA;AAEX,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAErD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,WAAW,EAAA,EAAI;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,oCAAA,EAAuC,OAAA,CAAQ,MAAM,CAAA;AAAA,KAC9D;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,KAAW,EAAA,GAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAE9D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,GAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,QAAQ,IAAI,MAAM,CAAA;AAAA,GAC7D;AACF;;;AC3BA,SAAS,cAAc,MAAA,EAA6B;AAClD,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,IAAI,SAAA,CAAU,KAAK,MAAM,CAAA,IAAK,UAAU,IAAA,CAAK,MAAM,GAAG,OAAO,YAAA;AAC7D,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,UAAA;AACvC,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAgB,OAAA,EAA8B;AACtE,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAC/C;AAEO,SAAS,mBAAmB,KAAA,EAAqC;AACtE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAEzC,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sCAAA,EAAuC;AAAA,EACvE;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,EAAA,IAAM,MAAA,CAAO,SAAS,EAAA,EAAI;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,uDAAA,EAA0D,MAAA,CAAO,MAAM,CAAA;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,IAAI,QAAQ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,IAAS,CAAA;AAAA,IAC1B;AACA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,YAAA,GAAe,CAAC,YAAA;AAAA,EAClB;AAEA,EAAA,IAAI,GAAA,GAAM,OAAO,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sEAAA,EAAkE;AAAA,EAClG;AAEA,EAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3C,OAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,EAAE;AAAA,GACxB;AACF;;;AC1DA,SAAS,WAAW,SAAA,EAA4B;AAC9C,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,GAAA,KAAgB,SAAA,CAAU,GAAG,CAAA,CAAE,KAAA;AAAA,IAC1C,OAAA,EAAS,CAAC,GAAA,KAAgB;AACxB,MAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,MAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,QAAQ,EAAA,GAAM,MAAA,CAAO,SAAS,SAAA,EAAW;AAAA,IACpE;AAAA,GACF;AACF;AAEA,IAAM,WAAA,GAAc,WAAW,YAAY,CAAA;AAC3C,IAAM,eAAA,GAAkB,WAAW,kBAAkB,CAAA;AACrD,IAAM,oBAAA,GAAuB,WAAW,uBAAuB,CAAA;AAC/D,IAAM,eAAA,GAAkB,WAAW,oBAAoB,CAAA;AACvD,IAAM,UAAA,GAAa,WAAW,WAAW,CAAA;AACzC,IAAM,iBAAA,GAAoB,WAAW,kBAAkB,CAAA;AAEhD,IAAM,UAAA,GAAa,EAAE,MAAA,EAAO,CAAE,OAAO,WAAA,CAAY,QAAA,EAAU,YAAY,OAAO;AAE9E,IAAM,cAAA,GAAiB,EAAE,MAAA,EAAO,CAAE,OAAO,eAAA,CAAgB,QAAA,EAAU,gBAAgB,OAAO;AAE1F,IAAM,mBAAA,GAAsB,EAChC,MAAA,EAAO,CACP,OAAO,oBAAA,CAAqB,QAAA,EAAU,qBAAqB,OAAO;AAE9D,IAAM,cAAA,GAAiB,EAAE,MAAA,EAAO,CAAE,OAAO,eAAA,CAAgB,QAAA,EAAU,gBAAgB,OAAO;AAE1F,IAAM,SAAA,GAAY,EAAE,MAAA,EAAO,CAAE,OAAO,UAAA,CAAW,QAAA,EAAU,WAAW,OAAO;AAE3E,IAAM,gBAAA,GAAmB,EAAE,MAAA,EAAO,CAAE,OAAO,iBAAA,CAAkB,QAAA,EAAU,kBAAkB,OAAO;AAEhG,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,QAAA,EAAU,cAAA;AAAA,EACV,aAAA,EAAe,mBAAA;AAAA,EACf,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kCAAkC,CAAA;AAAA,EAC9D,QAAA,EAAU,cAAA;AAAA,EACV,WAAW,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EACvC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AACxC,CAAC;AAEM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EACjD,IAAA,EAAM,UAAA;AAAA,EACN,GAAA,EAAK,UAAU,QAAA,EAAS;AAAA,EACxB,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kCAAkC,CAAA;AAAA,EAC9D,QAAA,EAAU,cAAA;AAAA,EACV,WAAW,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EACvC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AACxC,CAAC","file":"index.mjs","sourcesContent":["import type { IBAN, IBANValidationResult } from './types'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const upper = input.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${input}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n let currency: SupportedCurrency | undefined\n let cleaned = input.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const digits = input.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","import { z } from 'zod'\nimport { validateIBAN } from '../iban'\nimport { validateUKSortCode, validateUKAccountNumber } from '../sortcode'\nimport { validateCurrencyCode } from '../currency'\nimport { validateBIC } from '../bic'\nimport { validateCardNumber } from '../card'\n\ntype StringValidator = (val: string) => { valid: boolean; error?: string }\n\nfunction refineWith(validator: StringValidator) {\n return {\n validate: (val: string) => validator(val).valid,\n message: (val: string) => {\n const result = validator(val)\n return { message: result.valid ? '' : (result.error ?? 'Invalid') }\n },\n }\n}\n\nconst ibanRefiner = refineWith(validateIBAN)\nconst sortCodeRefiner = refineWith(validateUKSortCode)\nconst accountNumberRefiner = refineWith(validateUKAccountNumber)\nconst currencyRefiner = refineWith(validateCurrencyCode)\nconst bicRefiner = refineWith(validateBIC)\nconst cardNumberRefiner = refineWith(validateCardNumber)\n\nexport const ibanSchema = z.string().refine(ibanRefiner.validate, ibanRefiner.message)\n\nexport const sortCodeSchema = z.string().refine(sortCodeRefiner.validate, sortCodeRefiner.message)\n\nexport const accountNumberSchema = z\n .string()\n .refine(accountNumberRefiner.validate, accountNumberRefiner.message)\n\nexport const currencySchema = z.string().refine(currencyRefiner.validate, currencyRefiner.message)\n\nexport const bicSchema = z.string().refine(bicRefiner.validate, bicRefiner.message)\n\nexport const cardNumberSchema = z.string().refine(cardNumberRefiner.validate, cardNumberRefiner.message)\n\nexport const ukPaymentSchema = z.object({\n sortCode: sortCodeSchema,\n accountNumber: accountNumberSchema,\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(18).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport const internationalPaymentSchema = z.object({\n iban: ibanSchema,\n bic: bicSchema.optional(),\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(35).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport type UKPayment = z.infer<typeof ukPaymentSchema>\nexport type InternationalPayment = z.infer<typeof internationalPaymentSchema>\n"]}
1
+ {"version":3,"sources":["../../src/_guard.ts","../../src/iban.ts","../../src/sortcode.ts","../../src/currency.ts","../../src/bic.ts","../../src/card.ts","../../src/vat.ts","../../src/routing.ts","../../src/zod/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const MAX_SAFE_INPUT_LENGTH = 256\n\nexport function guardStringInput(\n input: unknown,\n label = 'Input'\n): { ok: true; value: string } | { ok: false; error: string } {\n if (input == null || typeof input !== 'string') {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length === 0) {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length > MAX_SAFE_INPUT_LENGTH) {\n return {\n ok: false,\n error: `${label} must not exceed ${MAX_SAFE_INPUT_LENGTH} characters`,\n }\n }\n return { ok: true, value: input }\n}\n\nexport function guardNumber(\n value: unknown,\n options: { min?: number; max?: number; integer?: boolean; label?: string }\n): { ok: true; value: number } | { ok: false; error: string } {\n const label = options.label ?? 'Value'\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return { ok: false, error: `${label} must be a finite number` }\n }\n if (Number.isNaN(value)) {\n return { ok: false, error: `${label} must not be NaN` }\n }\n if (options.integer && !Number.isInteger(value)) {\n return { ok: false, error: `${label} must be an integer` }\n }\n if (options.min !== undefined && value < options.min) {\n return { ok: false, error: `${label} must be at least ${options.min}` }\n }\n if (options.max !== undefined && value > options.max) {\n return { ok: false, error: `${label} must be at most ${options.max}` }\n }\n return { ok: true, value }\n}\n","import type { IBAN, IBANValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function formatIBAN(input: string): string {\n if (typeof input !== 'string') return ''\n const cleaned = input.replace(/\\s/g, '').toUpperCase().slice(0, 34)\n return formatIBANString(cleaned)\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport function formatSortCode(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/[-\\s]/g, '').slice(0, 6)\n if (digits.length < 6) return digits\n return `${digits.slice(0, 2)}-${digits.slice(2, 4)}-${digits.slice(4, 6)}`\n}\n\nexport function formatUKAccountNumber(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/\\s/g, '').slice(0, 8)\n if (digits.length < 8) return digits\n return `${digits.slice(0, 4)} ${digits.slice(4, 8)}`\n}\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const upper = guarded.value.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${upper}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n if (typeof amount !== 'number' || !Number.isFinite(amount)) {\n return ''\n }\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n let currency: SupportedCurrency | undefined\n let cleaned = guarded.value.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const digits = guarded.value.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","import type { VATNumber, VATValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst EU_VAT_PATTERNS: Record<string, RegExp> = {\n AT: /^ATU\\d{8}$/,\n BE: /^BE0?\\d{9}$/,\n BG: /^BG\\d{9,10}$/,\n CY: /^CY\\d{8}[A-Z]$/,\n CZ: /^CZ\\d{8,10}$/,\n DE: /^DE\\d{9}$/,\n DK: /^DK\\d{8}$/,\n EE: /^EE\\d{9}$/,\n EL: /^EL\\d{9}$/,\n ES: /^ES[A-Z0-9]\\d{7}[A-Z0-9]$/,\n FI: /^FI\\d{8}$/,\n FR: /^FR[A-HJ-NP-Z0-9]{2}\\d{9}$/,\n GR: /^GR\\d{9}$/,\n HR: /^HR\\d{11}$/,\n HU: /^HU\\d{8}$/,\n IE: /^IE\\d[A-Z0-9]\\d{5}[A-Z]$|^IE\\d{7}[A-W][A-I0-9]?$/,\n IT: /^IT\\d{11}$/,\n LT: /^LT\\d{9}$|^LT\\d{12}$/,\n LU: /^LU\\d{8}$/,\n LV: /^LV\\d{11}$/,\n MT: /^MT\\d{8}$/,\n NL: /^NL\\d{9}B\\d{2}$/,\n PL: /^PL\\d{10}$/,\n PT: /^PT\\d{9}$/,\n RO: /^RO\\d{2,10}$/,\n SE: /^SE\\d{12}$/,\n SI: /^SI\\d{8}$/,\n SK: /^SK\\d{10}$/,\n}\n\nexport function validateEUVAT(input: string): VATValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'VAT number is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n const pattern = EU_VAT_PATTERNS[countryCode]\n if (!pattern) {\n return { valid: false, error: `Unsupported EU VAT country code: ${countryCode}` }\n }\n\n if (!pattern.test(cleaned)) {\n return { valid: false, error: `Invalid VAT format for ${countryCode}` }\n }\n\n const formatted = `${countryCode} ${cleaned.slice(2)}`\n\n return {\n valid: true,\n value: cleaned as VATNumber,\n formatted,\n countryCode,\n }\n}\n","import type { RoutingNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nfunction routingChecksum(digits: string): boolean {\n if (digits.length !== 9) return false\n const sum =\n 3 * (Number(digits[0]) + Number(digits[3]) + Number(digits[6])) +\n 7 * (Number(digits[1]) + Number(digits[4]) + Number(digits[7])) +\n Number(digits[2]) + Number(digits[5]) + Number(digits[8])\n return sum % 10 === 0\n}\n\nexport function validateUSRoutingNumber(input: string): ValidationResult<RoutingNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{9}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'US routing number must be exactly 9 digits',\n }\n }\n\n if (!routingChecksum(cleaned)) {\n return { valid: false, error: 'US routing number checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as RoutingNumber,\n formatted: cleaned,\n }\n}\n","import { z } from 'zod'\nimport { validateIBAN } from '../iban'\nimport { validateUKSortCode, validateUKAccountNumber } from '../sortcode'\nimport { validateCurrencyCode } from '../currency'\nimport { validateBIC } from '../bic'\nimport { validateCardNumber } from '../card'\nimport { validateEUVAT } from '../vat'\nimport { validateUSRoutingNumber } from '../routing'\n\ntype StringValidator = (val: string) => { valid: boolean; error?: string }\n\nfunction refineWith(validator: StringValidator) {\n return {\n validate: (val: string) => validator(val).valid,\n message: (val: string) => {\n const result = validator(val)\n return { message: result.valid ? '' : (result.error ?? 'Invalid') }\n },\n }\n}\n\nconst ibanRefiner = refineWith(validateIBAN)\nconst sortCodeRefiner = refineWith(validateUKSortCode)\nconst accountNumberRefiner = refineWith(validateUKAccountNumber)\nconst currencyRefiner = refineWith(validateCurrencyCode)\nconst bicRefiner = refineWith(validateBIC)\nconst cardNumberRefiner = refineWith(validateCardNumber)\nconst vatRefiner = refineWith(validateEUVAT)\nconst routingNumberRefiner = refineWith(validateUSRoutingNumber)\n\nexport const ibanSchema = z.string().refine(ibanRefiner.validate, ibanRefiner.message)\n\nexport const sortCodeSchema = z.string().refine(sortCodeRefiner.validate, sortCodeRefiner.message)\n\nexport const accountNumberSchema = z\n .string()\n .refine(accountNumberRefiner.validate, accountNumberRefiner.message)\n\nexport const currencySchema = z.string().refine(currencyRefiner.validate, currencyRefiner.message)\n\nexport const bicSchema = z.string().refine(bicRefiner.validate, bicRefiner.message)\n\nexport const cardNumberSchema = z.string().refine(cardNumberRefiner.validate, cardNumberRefiner.message)\n\nexport const vatSchema = z.string().refine(vatRefiner.validate, vatRefiner.message)\n\nexport const routingNumberSchema = z\n .string()\n .refine(routingNumberRefiner.validate, routingNumberRefiner.message)\n\nexport const ukPaymentSchema = z.object({\n sortCode: sortCodeSchema,\n accountNumber: accountNumberSchema,\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(18).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport const internationalPaymentSchema = z.object({\n iban: ibanSchema,\n bic: bicSchema.optional(),\n amount: z.number().positive('Amount must be greater than zero'),\n currency: currencySchema,\n reference: z.string().max(35).optional(),\n payeeName: z.string().min(1).max(140).optional(),\n})\n\nexport type UKPayment = z.infer<typeof ukPaymentSchema>\nexport type InternationalPayment = z.infer<typeof internationalPaymentSchema>\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "finprim",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Financial primitives for modern TypeScript applications",
5
5
  "author": "Oluwatosin Adelaja , Silke Nodwell,Mohammead Hassani Sadiq, Nick Goddard ",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/tintolee/finprim.git"
9
+ "url": "git+https://github.com/tintolee/finprim.git"
10
10
  },
11
11
  "keywords": [
12
12
  "fintech",
@@ -38,6 +38,11 @@
38
38
  "types": "./dist/react/index.d.ts",
39
39
  "import": "./dist/react/index.mjs",
40
40
  "require": "./dist/react/index.js"
41
+ },
42
+ "./nest": {
43
+ "types": "./dist/nest/index.d.ts",
44
+ "import": "./dist/nest/index.mjs",
45
+ "require": "./dist/nest/index.js"
41
46
  }
42
47
  },
43
48
  "files": [
@@ -54,6 +59,7 @@
54
59
  "prepublishOnly": "npm run lint && npm run build && npm run test"
55
60
  },
56
61
  "devDependencies": {
62
+ "@nestjs/common": "^10.0.0",
57
63
  "@testing-library/react": "^14.3.1",
58
64
  "@types/react": "^18.0.0",
59
65
  "jsdom": "^28.1.0",
@@ -66,7 +72,8 @@
66
72
  },
67
73
  "peerDependencies": {
68
74
  "react": ">=17.0.0",
69
- "zod": ">=3.0.0"
75
+ "zod": ">=3.0.0",
76
+ "@nestjs/common": ">=10.0.0"
70
77
  },
71
78
  "peerDependenciesMeta": {
72
79
  "zod": {
@@ -74,6 +81,9 @@
74
81
  },
75
82
  "react": {
76
83
  "optional": true
84
+ },
85
+ "@nestjs/common": {
86
+ "optional": true
77
87
  }
78
88
  }
79
89
  }