UNPKG

test-numbers-generator

Version:

Generate and validate European test phone numbers (mobile and landline) in safe, non-existent ranges.

43 lines (39 loc) 1.82 kB
// src/ibanGenerator.ts /** * Genereert een geldig Nederlands IBAN nummer voor testdoeleinden. * Formaat: NLkkBBBB0123456789 (kk = controlegetal, BBBB = bankcode) */ export function generateTestDutchIBAN(bankCode: string = "TEST"): string { // Bankcode moet 4 hoofdletters zijn bankCode = bankCode.toUpperCase().padEnd(4, 'X').slice(0, 4); // 10 random cijfers voor het rekeningnummer const accountNumber = Math.floor(1000000000 + Math.random() * 9000000000).toString(); // IBAN zonder controlegetal const partialIban = `NL00${bankCode}${accountNumber}`; // Controlegetal berekenen const checkDigits = calculateIbanCheckDigits(partialIban); return `NL${checkDigits}${bankCode}${accountNumber}`; } /** * Bereken het IBAN controlegetal volgens de mod-97 methode. */ function calculateIbanCheckDigits(iban: string): string { // Zet letters om naar cijfers (A=10, B=11, ..., Z=35) const rearranged = iban.slice(4) + iban.slice(0, 4); // Let op: sommige banken geven een rekeningnummer met leidende nullen, dus we moeten alles als string behandelen const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString()); // BigInt kan alleen werken met cijfers, dus we moeten de string splitsen als deze te lang is // Maar voor Nederlandse IBANs is de string kort genoeg voor BigInt const mod97 = 98n - (BigInt(replaced) % 97n); return mod97.toString().padStart(2, '0'); } /** * Valideert of een string een geldig Nederlands IBAN is. */ export function isValidDutchIBAN(iban: string): boolean { if (!/^NL\d{2}[A-Z]{4}\d{10}$/.test(iban)) return false; // Mod-97 check const rearranged = iban.slice(4) + iban.slice(0, 4); const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString()); return BigInt(replaced) % 97n === 1n; }