@blindfold/sdk 1.0.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.
- package/LICENSE +21 -0
- package/README.md +427 -0
- package/dist/index-CsE6Vhax.d.mts +177 -0
- package/dist/index-CsE6Vhax.d.mts.map +1 -0
- package/dist/index-Dfv8zV_d.d.ts +177 -0
- package/dist/index-Dfv8zV_d.d.ts.map +1 -0
- package/dist/index.d.mts +450 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.d.ts +450 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +575 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +568 -0
- package/dist/index.mjs.map +1 -0
- package/dist/regex/index.d.mts +2 -0
- package/dist/regex/index.d.ts +2 -0
- package/dist/regex/index.js +5 -0
- package/dist/regex/index.mjs +4 -0
- package/dist/regex-BEaK0E7Y.js +4881 -0
- package/dist/regex-BEaK0E7Y.js.map +1 -0
- package/dist/regex-ByjZg3Zy.mjs +4839 -0
- package/dist/regex-ByjZg3Zy.mjs.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-BEaK0E7Y.js","names":["cls: DetectorClass","locale: string","UNIVERSAL_DETECTORS: DetectorClass[]","REGION_DETECTORS: Record<string, DetectorClass[]>","locales?: string[]","locales: string[]","min: number","max: number","chars: string","len: number","original: string","chars: string[]","payload: number[]","entityType: string","originalText: string","text: string","start: number","end: number","_text: string","results: PIIMatch[]","match: RegExpExecArray | null","score: number","text: string","number: string","digits: number[]","iban: string","ssn: string","mapping: Record<string, string>","code: string","check: number","weights","total","c","expected: string","IT_ODD_TABLE: Record<string, number>","IT_EVEN_TABLE: Record<string, number>","text: string","results: PIIMatch[]","match: RegExpExecArray | null","text: string","text: string","results: PIIMatch[]","match: RegExpExecArray | null","start: number","text: string","text: string","text: string","results: PIIMatch[]","match: RegExpExecArray | null","text: string","options?: PIIScannerOptions","text: string","entities?: string[]","allMatches: PIIMatch[]","counters: Record<string, number>","tokenMap: Map<PIIMatch, string>","mapping: Record<string, string>","charsToShow: number","fromEnd: boolean","maskingChar: string","masked: string","hashType: string","hashPrefix: string","hashLength: number","encryptionKey: string","_language?: string","matches: PIIMatch[]","result: PIIMatch[]"],"sources":["../src/regex/registry.ts","../src/regex/synthesizers.ts","../src/regex/base.ts","../src/regex/entities.ts","../src/regex/detectors/email.ts","../src/regex/validators.ts","../src/regex/detectors/credit-card.ts","../src/regex/detectors/phone.ts","../src/regex/detectors/ip-address.ts","../src/regex/detectors/url.ts","../src/regex/detectors/mac-address.ts","../src/regex/detectors/date-of-birth.ts","../src/regex/detectors/cvv.ts","../src/regex/detectors/us/ssn.ts","../src/regex/detectors/us/drivers-license.ts","../src/regex/detectors/us/passport.ts","../src/regex/detectors/us/tax-id.ts","../src/regex/detectors/us/zip-code.ts","../src/regex/detectors/us/itin.ts","../src/regex/detectors/us/index.ts","../src/regex/detectors/eu/iban.ts","../src/regex/detectors/eu/postal-code.ts","../src/regex/detectors/eu/vat-id.ts","../src/regex/detectors/eu/index.ts","../src/regex/detectors/uk/ni-number.ts","../src/regex/detectors/uk/nhs-number.ts","../src/regex/detectors/uk/postcode.ts","../src/regex/detectors/uk/passport.ts","../src/regex/detectors/uk/utr.ts","../src/regex/detectors/uk/index.ts","../src/regex/detectors/de/personal-id.ts","../src/regex/detectors/de/tax-id.ts","../src/regex/detectors/de/index.ts","../src/regex/detectors/fr/national-id.ts","../src/regex/detectors/fr/siren.ts","../src/regex/detectors/fr/index.ts","../src/regex/detectors/es/dni.ts","../src/regex/detectors/es/nie.ts","../src/regex/detectors/es/nss.ts","../src/regex/detectors/es/cif.ts","../src/regex/detectors/es/index.ts","../src/regex/detectors/it/codice-fiscale.ts","../src/regex/detectors/it/partita-iva.ts","../src/regex/detectors/it/index.ts","../src/regex/detectors/pt/nif.ts","../src/regex/detectors/pt/index.ts","../src/regex/detectors/pl/pesel.ts","../src/regex/detectors/pl/nip.ts","../src/regex/detectors/pl/regon.ts","../src/regex/detectors/pl/index.ts","../src/regex/detectors/cz/birth-number.ts","../src/regex/detectors/cz/ico.ts","../src/regex/detectors/cz/dic.ts","../src/regex/detectors/cz/bank-account.ts","../src/regex/detectors/cz/index.ts","../src/regex/detectors/ru/inn.ts","../src/regex/detectors/ru/snils.ts","../src/regex/detectors/ru/index.ts","../src/regex/detectors/nl/bsn.ts","../src/regex/detectors/nl/index.ts","../src/regex/detectors/ro/cnp.ts","../src/regex/detectors/ro/cui.ts","../src/regex/detectors/ro/index.ts","../src/regex/detectors/sk/birth-number.ts","../src/regex/detectors/sk/ico.ts","../src/regex/detectors/sk/dic.ts","../src/regex/detectors/sk/index.ts","../src/regex/detectors/dk/cpr.ts","../src/regex/detectors/dk/cvr.ts","../src/regex/detectors/dk/index.ts","../src/regex/detectors/se/personnummer.ts","../src/regex/detectors/se/orgnr.ts","../src/regex/detectors/se/index.ts","../src/regex/detectors/no/birth-number.ts","../src/regex/detectors/no/orgnr.ts","../src/regex/detectors/no/index.ts","../src/regex/detectors/br/cpf.ts","../src/regex/detectors/br/cnpj.ts","../src/regex/detectors/br/index.ts","../src/regex/detectors/be/national-number.ts","../src/regex/detectors/be/enterprise-number.ts","../src/regex/detectors/be/index.ts","../src/regex/detectors/at/svnr.ts","../src/regex/detectors/at/index.ts","../src/regex/detectors/ie/pps.ts","../src/regex/detectors/ie/index.ts","../src/regex/detectors/fi/hetu.ts","../src/regex/detectors/fi/ytunnus.ts","../src/regex/detectors/fi/index.ts","../src/regex/detectors/hu/tax-id.ts","../src/regex/detectors/hu/taj.ts","../src/regex/detectors/hu/index.ts","../src/regex/detectors/bg/egn.ts","../src/regex/detectors/bg/index.ts","../src/regex/detectors/hr/oib.ts","../src/regex/detectors/hr/index.ts","../src/regex/detectors/si/emso.ts","../src/regex/detectors/si/tax-number.ts","../src/regex/detectors/si/index.ts","../src/regex/detectors/lt/personal-code.ts","../src/regex/detectors/lt/index.ts","../src/regex/detectors/lv/personal-code.ts","../src/regex/detectors/lv/index.ts","../src/regex/detectors/ee/personal-code.ts","../src/regex/detectors/ee/index.ts","../src/regex/detectors/ca/sin.ts","../src/regex/detectors/ca/index.ts","../src/regex/detectors/ch/ahv.ts","../src/regex/detectors/ch/index.ts","../src/regex/detectors/au/tfn.ts","../src/regex/detectors/au/medicare.ts","../src/regex/detectors/au/index.ts","../src/regex/detectors/nz/ird.ts","../src/regex/detectors/nz/index.ts","../src/regex/detectors/in/aadhaar.ts","../src/regex/detectors/in/pan.ts","../src/regex/detectors/in/index.ts","../src/regex/detectors/jp/my-number.ts","../src/regex/detectors/jp/index.ts","../src/regex/detectors/kr/rrn.ts","../src/regex/detectors/kr/index.ts","../src/regex/detectors/za/id.ts","../src/regex/detectors/za/index.ts","../src/regex/detectors/tr/kimlik.ts","../src/regex/detectors/tr/index.ts","../src/regex/detectors/il/id.ts","../src/regex/detectors/il/index.ts","../src/regex/detectors/ar/cuit.ts","../src/regex/detectors/ar/index.ts","../src/regex/detectors/cl/rut.ts","../src/regex/detectors/cl/index.ts","../src/regex/detectors/co/nit.ts","../src/regex/detectors/co/index.ts","../src/regex/detectors/index.ts","../src/regex/scanner.ts","../src/regex/index.ts"],"sourcesContent":["// Detector registry: collects all detectors and filters by locale\n\nimport { Detector } from './base'\n\n// Type for a detector constructor (zero-arg)\ntype DetectorClass = new () => Detector\n\n// Module-level arrays populated by registerUniversal / registerRegion calls\nconst UNIVERSAL_DETECTORS: DetectorClass[] = []\nconst REGION_DETECTORS: Record<string, DetectorClass[]> = {\n us: [],\n eu: [],\n uk: [],\n}\n\n/** Register a universal (locale-independent) detector class. */\nexport function registerUniversal(cls: DetectorClass): void {\n UNIVERSAL_DETECTORS.push(cls)\n}\n\n/** Register a region-specific detector class. */\nexport function registerRegion(locale: string, cls: DetectorClass): void {\n if (!REGION_DETECTORS[locale]) {\n REGION_DETECTORS[locale] = []\n }\n REGION_DETECTORS[locale].push(cls)\n}\n\n/** Builds a list of detector instances filtered by locale. */\nexport class DetectorRegistry {\n private _detectors: Detector[] = []\n\n constructor(locales?: string[]) {\n const resolvedLocales = (locales ?? ['us']).map((loc) => loc.toLowerCase())\n this._build(resolvedLocales)\n }\n\n private _build(locales: string[]): void {\n for (const Cls of UNIVERSAL_DETECTORS) {\n this._detectors.push(new Cls())\n }\n\n for (const locale of locales) {\n const regionClasses = REGION_DETECTORS[locale] ?? []\n for (const Cls of regionClasses) {\n this._detectors.push(new Cls())\n }\n }\n }\n\n get detectors(): Detector[] {\n return this._detectors\n }\n}\n","// Format-preserving PII synthesis: generates realistic fake replacements locally\n\nconst UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nconst LOWER = 'abcdefghijklmnopqrstuvwxyz'\nconst DIGITS = '0123456789'\n\nfunction randInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nfunction randChar(chars: string): string {\n return chars[Math.floor(Math.random() * chars.length)]\n}\n\nfunction randHex(len: number): string {\n let result = ''\n for (let i = 0; i < len; i++) {\n result += randChar('0123456789abcdef')\n }\n return result\n}\n\n/**\n * Format-preserving default: replace digits with random digits,\n * uppercase with random uppercase, lowercase with random lowercase,\n * keep everything else (separators, symbols) intact.\n */\nfunction formatPreserving(original: string): string {\n const chars: string[] = []\n for (const ch of original) {\n if (ch >= '0' && ch <= '9') {\n chars.push(randChar(DIGITS))\n } else if (ch >= 'A' && ch <= 'Z') {\n chars.push(randChar(UPPER))\n } else if (ch >= 'a' && ch <= 'z') {\n chars.push(randChar(LOWER))\n } else {\n chars.push(ch)\n }\n }\n const result = chars.join('')\n // Retry once if we accidentally generated the same value\n if (result === original) {\n return formatPreserving(original)\n }\n return result\n}\n\nfunction synthesizeEmail(): string {\n const id = randHex(8)\n return `user${id}@example.com`\n}\n\nfunction synthesizeUrl(): string {\n const path = randHex(10)\n return `https://example.com/${path}`\n}\n\nfunction synthesizeIp(): string {\n const a = randInt(1, 254)\n const b = randInt(0, 255)\n const c = randInt(0, 255)\n const d = randInt(1, 254)\n return `${a}.${b}.${c}.${d}`\n}\n\n/**\n * Generate a credit card number with valid Luhn checksum,\n * preserving the separator pattern of the original.\n */\nfunction synthesizeCreditCard(original: string): string {\n // Extract only digits from original to know the length\n const digitsOnly = original.replace(/\\D/g, '')\n const numDigits = digitsOnly.length\n\n // Generate random digits (all but the last, which is the Luhn check digit)\n const payload: number[] = []\n for (let i = 0; i < numDigits - 1; i++) {\n payload.push(randInt(0, 9))\n }\n\n // Calculate Luhn check digit\n let sum = 0\n for (let i = payload.length - 1; i >= 0; i--) {\n let d = payload[i]\n // Double every second digit from right (the check digit position is even, payload last is odd)\n if ((payload.length - 1 - i) % 2 === 0) {\n d *= 2\n if (d > 9) d -= 9\n }\n sum += d\n }\n const checkDigit = (10 - (sum % 10)) % 10\n payload.push(checkDigit)\n\n // Re-insert separators at the same positions as the original\n let digitIdx = 0\n let result = ''\n for (const ch of original) {\n if (ch >= '0' && ch <= '9') {\n result += payload[digitIdx++]\n } else {\n result += ch\n }\n }\n return result\n}\n\n/**\n * Generate an IBAN-like value preserving length with a valid mod-97 check.\n */\nfunction synthesizeIban(original: string): string {\n // Preserve the length; use XX country code + random digits\n const stripped = original.replace(/\\s/g, '')\n const len = stripped.length\n if (len < 5) return formatPreserving(original)\n\n // Generate random BBAN digits\n const bbanLen = len - 4\n let bban = ''\n for (let i = 0; i < bbanLen; i++) {\n bban += randChar(DIGITS)\n }\n\n // Calculate check digits: convert \"XX00\" + bban to numeric for mod-97\n // Country letters: X=33, so \"XX\" -> \"3333\"\n const numericStr = bban + '333300'\n // Compute mod-97 on the numeric string in chunks\n let remainder = 0\n for (const ch of numericStr) {\n remainder = (remainder * 10 + parseInt(ch, 10)) % 97\n }\n const checkDigits = (98 - remainder).toString().padStart(2, '0')\n\n const iban = 'XX' + checkDigits + bban\n\n // Re-insert spaces if original had them\n if (original.includes(' ')) {\n let spaceIdx = 0\n let result = ''\n for (const ch of original) {\n if (ch === ' ') {\n result += ' '\n } else {\n result += iban[spaceIdx++] || '0'\n }\n }\n return result\n }\n\n return iban\n}\n\n/**\n * Generate a synthetic replacement for a detected PII value.\n * Uses format-preserving random by default, with specific generators\n * for types where structural validity matters.\n */\nexport function synthesizeValue(entityType: string, originalText: string): string {\n switch (entityType) {\n case 'Email Address':\n return synthesizeEmail()\n case 'URL':\n return synthesizeUrl()\n case 'IP Address':\n return synthesizeIp()\n case 'Credit Card Number':\n return synthesizeCreditCard(originalText)\n case 'IBAN':\n return synthesizeIban(originalText)\n default:\n return formatPreserving(originalText)\n }\n}\n","// Base detector classes inspired by scrubadub's architecture\n\nimport { EntityType, PIIMatch } from './entities'\n\n/** Base class for all PII detectors. */\nexport abstract class Detector {\n abstract entityType: EntityType\n score = 0.85\n baseScore: number | null = null // score when no context found (null = backward compat)\n contextKeywords: string[] = []\n contextRequired = false\n contextWindow = 50\n locale = ''\n needsDigit = true\n\n abstract iterMatches(text: string): PIIMatch[]\n\n /** Check if any context keyword appears near the match position. */\n protected hasContext(text: string, start: number, end: number = 0): boolean {\n if (this.contextKeywords.length === 0) {\n return true\n }\n const lower = (this as any)._textLower || text.toLowerCase()\n const windowStart = Math.max(0, start - this.contextWindow)\n const before = lower.slice(windowStart, start)\n const after = end ? lower.slice(end, end + this.contextWindow) : ''\n const window = before + ' ' + after\n return this.contextKeywords.some((kw) => window.includes(kw))\n }\n}\n\n/** Detector using a single regex pattern with optional validation. */\nexport abstract class RegexDetector extends Detector {\n abstract pattern: RegExp\n validator?: (text: string) => boolean\n\n /** Optional fast pre-check before running regex. Override in subclasses. */\n preCheck(_text: string): boolean {\n return true\n }\n\n iterMatches(text: string): PIIMatch[] {\n if (!this.preCheck(text)) {\n return []\n }\n\n const results: PIIMatch[] = []\n // Reset lastIndex for stateful /g patterns\n this.pattern.lastIndex = 0\n\n let match: RegExpExecArray | null\n while ((match = this.pattern.exec(text)) !== null) {\n const matchedText = match[0]\n const start = match.index\n const end = start + matchedText.length\n\n const hasCtx = this.hasContext(text, start, end)\n\n if (this.contextRequired && !hasCtx) {\n continue\n }\n\n let score: number\n if (this.validator) {\n if (!this.validator(matchedText)) {\n continue\n }\n score = hasCtx ? 1.0 : this.score\n } else {\n if (hasCtx) {\n score = this.score\n } else {\n score = this.baseScore !== null ? this.baseScore : this.score\n }\n }\n\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start,\n end,\n score,\n })\n }\n return results\n }\n}\n","// Entity types and match objects for local PII detection\n\n/**\n * PII entity types detected by the regex scanner.\n * Names match the Blindfold API entity types for transparent switching.\n */\nexport enum EntityType {\n // Universal (always active)\n EMAIL_ADDRESS = 'Email Address',\n CREDIT_CARD = 'Credit Card Number',\n PHONE_NUMBER = 'Phone Number',\n IP_ADDRESS = 'IP Address',\n URL = 'URL',\n MAC_ADDRESS = 'MAC Address',\n DATE_OF_BIRTH = 'Date of Birth',\n CVV = 'CVV',\n\n // US\n SSN = 'Social Security Number',\n DRIVERS_LICENSE = \"Driver's License\",\n US_PASSPORT = 'US Passport',\n TAX_ID = 'Tax ID',\n ZIP_CODE = 'ZIP Code',\n\n // EU\n IBAN = 'IBAN',\n EU_POSTAL_CODE = 'Postal Code',\n VAT_ID = 'VAT ID',\n\n // UK\n NI_NUMBER = 'NI Number',\n NHS_NUMBER = 'NHS Number',\n UK_POSTCODE = 'UK Postcode',\n UK_PASSPORT = 'UK Passport',\n\n // Germany (DE)\n DE_PERSONAL_ID = 'German Personal ID',\n DE_TAX_ID = 'German Tax ID',\n\n // France (FR)\n FR_NATIONAL_ID = 'French National ID',\n\n // Spain (ES)\n ES_DNI = 'Spanish DNI',\n ES_NIE = 'Spanish NIE',\n\n // Italy (IT)\n IT_CODICE_FISCALE = 'Italian Codice Fiscale',\n\n // Portugal (PT)\n PT_NIF = 'Portuguese NIF',\n\n // Poland (PL)\n PL_PESEL = 'Polish PESEL',\n PL_NIP = 'Polish NIP',\n\n // Czech Republic (CZ)\n CZ_BIRTH_NUMBER = 'Czech Birth Number',\n CZ_ICO = 'Czech ICO',\n CZ_DIC = 'Czech DIC',\n CZ_BANK_ACCOUNT = 'Czech Bank Account',\n\n // Russia (RU)\n RU_INN = 'Russian INN',\n RU_SNILS = 'Russian SNILS',\n\n // Netherlands (NL)\n NL_BSN = 'Dutch BSN',\n\n // Romania (RO)\n RO_CNP = 'Romanian CNP',\n\n // Slovakia (SK)\n SK_BIRTH_NUMBER = 'Slovak Birth Number',\n\n // Denmark (DK)\n DK_CPR = 'Danish CPR',\n\n // Sweden (SE)\n SE_PERSONNUMMER = 'Swedish Personnummer',\n\n // Norway (NO)\n NO_BIRTH_NUMBER = 'Norwegian Birth Number',\n\n // Brazil (BR)\n BR_CPF = 'Brazilian CPF',\n BR_CNPJ = 'Brazilian CNPJ',\n\n // US (additional)\n US_ITIN = 'US ITIN',\n\n // UK (additional)\n UK_UTR = 'UK UTR',\n\n // France (additional)\n FR_SIREN = 'French SIREN',\n\n // Spain (additional)\n ES_NSS = 'Spanish NSS',\n ES_CIF = 'Spanish CIF',\n\n // Italy (additional)\n IT_PARTITA_IVA = 'Italian Partita IVA',\n\n // Poland (additional)\n PL_REGON = 'Polish REGON',\n\n // Slovakia (additional)\n SK_ICO = 'Slovak ICO',\n SK_DIC = 'Slovak DIC',\n\n // Romania (additional)\n RO_CUI = 'Romanian CUI',\n\n // Denmark (additional)\n DK_CVR = 'Danish CVR',\n\n // Sweden (additional)\n SE_ORGNR = 'Swedish Organisationsnummer',\n\n // Norway (additional)\n NO_ORGNR = 'Norwegian Organisasjonsnummer',\n\n // Belgium (BE)\n BE_NATIONAL_NUMBER = 'Belgian National Number',\n BE_ENTERPRISE_NUMBER = 'Belgian Enterprise Number',\n\n // Austria (AT)\n AT_SVNR = 'Austrian SVNR',\n\n // Ireland (IE)\n IE_PPS = 'Irish PPS Number',\n\n // Finland (FI)\n FI_HETU = 'Finnish HETU',\n FI_YTUNNUS = 'Finnish Y-tunnus',\n\n // Hungary (HU)\n HU_TAX_ID = 'Hungarian Tax ID',\n HU_TAJ = 'Hungarian TAJ',\n\n // Bulgaria (BG)\n BG_EGN = 'Bulgarian EGN',\n\n // Croatia (HR)\n HR_OIB = 'Croatian OIB',\n\n // Slovenia (SI)\n SI_EMSO = 'Slovenian EMSO',\n SI_TAX_NUMBER = 'Slovenian Tax Number',\n\n // Lithuania (LT)\n LT_PERSONAL_CODE = 'Lithuanian Personal Code',\n\n // Latvia (LV)\n LV_PERSONAL_CODE = 'Latvian Personal Code',\n\n // Estonia (EE)\n EE_PERSONAL_CODE = 'Estonian Personal Code',\n\n // Canada (CA)\n CA_SIN = 'Canadian SIN',\n\n // Switzerland (CH)\n CH_AHV = 'Swiss AHV',\n\n // Australia (AU)\n AU_TFN = 'Australian TFN',\n AU_MEDICARE = 'Australian Medicare',\n\n // New Zealand (NZ)\n NZ_IRD = 'New Zealand IRD',\n\n // India (IN)\n IN_AADHAAR = 'Indian Aadhaar',\n IN_PAN = 'Indian PAN',\n\n // Japan (JP)\n JP_MY_NUMBER = 'Japanese My Number',\n\n // South Korea (KR)\n KR_RRN = 'Korean RRN',\n\n // South Africa (ZA)\n ZA_ID = 'South African ID',\n\n // Turkey (TR)\n TR_KIMLIK = 'Turkish Kimlik',\n\n // Israel (IL)\n IL_ID = 'Israeli ID',\n\n // Argentina (AR)\n AR_CUIT = 'Argentine CUIT',\n\n // Chile (CL)\n CL_RUT = 'Chilean RUT',\n\n // Colombia (CO)\n CO_NIT = 'Colombian NIT',\n}\n\n/** A single PII match found by a detector. */\nexport interface PIIMatch {\n entityType: string\n text: string\n start: number\n end: number\n score: number\n}\n\n","// Email address detector\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\nclass EmailDetector extends RegexDetector {\n entityType = EntityType.EMAIL_ADDRESS\n score = 0.95\n needsDigit = false\n pattern = /\\b[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}\\b/g\n\n preCheck(text: string): boolean {\n return text.includes('@')\n }\n}\n\nregisterUniversal(EmailDetector)\n\nexport { EmailDetector }\n","// Validation functions for PII entities (Luhn, IBAN mod-97, SSN, NHS)\n\n/** Validate a number string using the Luhn algorithm (ISO/IEC 7812). */\nexport function luhnChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') {\n digits.push(parseInt(c, 10))\n }\n }\n if (digits.length < 2) {\n return false\n }\n let total = 0\n const reversed = digits.slice().reverse()\n for (let i = 0; i < reversed.length; i++) {\n let d = reversed[i]\n if (i % 2 === 1) {\n d *= 2\n if (d > 9) {\n d -= 9\n }\n }\n total += d\n }\n return total % 10 === 0\n}\n\n/** Validate IBAN using ISO 7064 mod-97 checksum. */\nexport function ibanMod97(iban: string): boolean {\n const cleaned = iban.replace(/[\\s-]/g, '').toUpperCase()\n if (cleaned.length < 5) {\n return false\n }\n if (!/^[A-Z]{2}/.test(cleaned) || !/^\\d{2}/.test(cleaned.slice(2, 4))) {\n return false\n }\n // Move first 4 characters to end\n const rearranged = cleaned.slice(4) + cleaned.slice(0, 4)\n let numeric = ''\n for (const c of rearranged) {\n if (c >= '0' && c <= '9') {\n numeric += c\n } else if (c >= 'A' && c <= 'Z') {\n numeric += String(c.charCodeAt(0) - 55)\n } else {\n return false\n }\n }\n // Use modular arithmetic to avoid BigInt issues with large numbers.\n // Process the numeric string in chunks.\n let remainder = 0\n for (let i = 0; i < numeric.length; i++) {\n remainder = (remainder * 10 + parseInt(numeric[i], 10)) % 97\n }\n return remainder === 1\n}\n\n/** Check SSN format rules: no 000/666/9xx area, no 00 group, no 0000 serial. */\nexport function ssnValidFormat(ssn: string): boolean {\n let digits = ''\n for (const c of ssn) {\n if (c >= '0' && c <= '9') {\n digits += c\n }\n }\n if (digits.length !== 9) {\n return false\n }\n const area = parseInt(digits.slice(0, 3), 10)\n const group = parseInt(digits.slice(3, 5), 10)\n const serial = parseInt(digits.slice(5), 10)\n if (area === 0 || area === 666 || area >= 900) {\n return false\n }\n if (group === 0) {\n return false\n }\n if (serial === 0) {\n return false\n }\n return true\n}\n\n/** Validate German Tax ID using ISO 7064 Mod 11,10. */\nexport function deTaxIdChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n let product = 10\n for (let i = 0; i < 10; i++) {\n let total = (digits[i] + product) % 10\n if (total === 0) total = 10\n product = (total * 2) % 11\n }\n let check = 11 - product\n if (check === 10) check = 0\n return digits[10] === check\n}\n\n/** Validate French NIR using mod 97 checksum. */\nexport function frNirChecksum(number: string): boolean {\n const cleaned = number.toUpperCase().replace(/2A/g, '19').replace(/2B/g, '18')\n let digitsStr = ''\n for (const c of cleaned) {\n if (c >= '0' && c <= '9') digitsStr += c\n }\n if (digitsStr.length !== 15) return false\n const base = parseInt(digitsStr.slice(0, 13), 10)\n const key = parseInt(digitsStr.slice(13, 15), 10)\n return key === 97 - (base % 97)\n}\n\nconst ES_DNI_LETTERS = 'TRWAGMYFPDXBNJZSQVHLCKE'\n\n/** Validate Spanish DNI check letter using mod-23 table. */\nexport function esDniLetter(number: string): boolean {\n let cleaned = ''\n for (const c of number) {\n if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) cleaned += c\n }\n if (cleaned.length !== 9) return false\n const digitsStr = cleaned.slice(0, 8)\n const letter = cleaned[8].toUpperCase()\n for (const c of digitsStr) {\n if (c < '0' || c > '9') return false\n }\n const expected = ES_DNI_LETTERS[parseInt(digitsStr, 10) % 23]\n return letter === expected\n}\n\n/** Validate Spanish NIE check letter (X/Y/Z prefix, then same as DNI). */\nexport function esNieLetter(number: string): boolean {\n let cleaned = ''\n for (const c of number) {\n if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) cleaned += c\n }\n if (cleaned.length !== 9) return false\n const prefix = cleaned[0].toUpperCase()\n const mapping: Record<string, string> = { X: '0', Y: '1', Z: '2' }\n if (!(prefix in mapping)) return false\n const digitsStr = mapping[prefix] + cleaned.slice(1, 8)\n const letter = cleaned[8].toUpperCase()\n for (const c of digitsStr) {\n if (c < '0' || c > '9') return false\n }\n const expected = ES_DNI_LETTERS[parseInt(digitsStr, 10) % 23]\n return letter === expected\n}\n\nconst IT_ODD_TABLE: Record<string, number> = {\n '0': 1,\n '1': 0,\n '2': 5,\n '3': 7,\n '4': 9,\n '5': 13,\n '6': 15,\n '7': 17,\n '8': 19,\n '9': 21,\n A: 1,\n B: 0,\n C: 5,\n D: 7,\n E: 9,\n F: 13,\n G: 15,\n H: 17,\n I: 19,\n J: 21,\n K: 2,\n L: 4,\n M: 18,\n N: 20,\n O: 11,\n P: 3,\n Q: 6,\n R: 8,\n S: 12,\n T: 14,\n U: 16,\n V: 10,\n W: 22,\n X: 25,\n Y: 24,\n Z: 23,\n}\n\nconst IT_EVEN_TABLE: Record<string, number> = {\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 4,\n '5': 5,\n '6': 6,\n '7': 7,\n '8': 8,\n '9': 9,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n}\n\n/** Validate Italian Codice Fiscale using odd/even position lookup tables. */\nexport function itCodiceFiscaleCheck(code: string): boolean {\n let cleaned = ''\n for (const c of code) {\n if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) cleaned += c\n }\n cleaned = cleaned.toUpperCase()\n if (cleaned.length !== 16) return false\n let total = 0\n for (let i = 0; i < 15; i++) {\n const c = cleaned[i]\n const val = (i + 1) % 2 === 1 ? IT_ODD_TABLE[c] : IT_EVEN_TABLE[c]\n if (val === undefined) return false\n total += val\n }\n const expected = String.fromCharCode((total % 26) + 'A'.charCodeAt(0))\n return cleaned[15] === expected\n}\n\n/** Validate Portuguese NIF using weighted checksum. */\nexport function ptNifChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 9) return false\n if (![1, 2, 3, 5, 6, 8, 9].includes(digits[0])) return false\n let total = 0\n for (let i = 0; i < 8; i++) {\n total += digits[i] * (9 - i)\n }\n const remainder = total % 11\n const check = remainder < 2 ? 0 : 11 - remainder\n return digits[8] === check\n}\n\n/** Validate Polish PESEL using weighted mod-10 checksum. */\nexport function plPeselChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n const weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]\n let total = 0\n for (let i = 0; i < 10; i++) {\n total += digits[i] * weights[i]\n }\n const check = (10 - (total % 10)) % 10\n return digits[10] === check\n}\n\n/** Validate Polish NIP using weighted mod-11 checksum. */\nexport function plNipChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 10) return false\n const weights = [6, 5, 7, 2, 3, 4, 5, 6, 7]\n let total = 0\n for (let i = 0; i < 9; i++) {\n total += digits[i] * weights[i]\n }\n const check = total % 11\n if (check === 10) return false\n return digits[9] === check\n}\n\n/** Validate Czech Birth Number: divisible by 11 + month check. */\nexport function czBirthNumberValid(number: string): boolean {\n const cleaned = number.replace(/[/ ]/g, '')\n for (const c of cleaned) {\n if (c < '0' || c > '9') return false\n }\n if (cleaned.length !== 9 && cleaned.length !== 10) return false\n if (cleaned.length === 10) {\n // Must be divisible by 11\n let remainder = 0\n for (const c of cleaned) {\n remainder = (remainder * 10 + parseInt(c, 10)) % 11\n }\n if (remainder !== 0) return false\n }\n const month = parseInt(cleaned.slice(2, 4), 10)\n let baseMonth = month % 50\n if (baseMonth > 20) baseMonth -= 20\n if (baseMonth < 1 || baseMonth > 12) return false\n return true\n}\n\n/** Validate Czech ICO (Company ID) using mod-11 weighted checksum. */\nexport function czIcoChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 8) return false\n const weights = [8, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 7; i++) {\n total += digits[i] * weights[i]\n }\n const remainder = total % 11\n let check: number\n if (remainder === 0) check = 1\n else if (remainder === 1) check = 0\n else check = 11 - remainder\n return digits[7] === check\n}\n\n/** Validate Czech DIC (Tax/VAT ID): CZ prefix + ICO or birth number checksum. */\nexport function czDicValid(number: string): boolean {\n let cleaned = number.trim()\n if (cleaned.toUpperCase().startsWith('CZ')) {\n cleaned = cleaned.slice(2)\n }\n if (!/^\\d+$/.test(cleaned)) return false\n if (cleaned.length === 8) {\n return czIcoChecksum(cleaned)\n }\n if (cleaned.length === 10) {\n let remainder = 0\n for (const c of cleaned) {\n remainder = (remainder * 10 + parseInt(c, 10)) % 11\n }\n return remainder === 0\n }\n if (cleaned.length === 9) {\n const month = parseInt(cleaned.slice(2, 4), 10)\n let baseMonth = month % 50\n if (baseMonth > 20) baseMonth -= 20\n return baseMonth >= 1 && baseMonth <= 12\n }\n return false\n}\n\n/** Validate Czech bank account number using mod-11 weighted checksum. */\nexport function czBankAccountValid(number: string): boolean {\n const parts = number.split('/')\n if (parts.length !== 2) return false\n const bankCode = parts[1]\n if (!/^\\d{4}$/.test(bankCode)) return false\n const accountPart = parts[0]\n let prefix = ''\n let account = accountPart\n if (accountPart.includes('-')) {\n const split = accountPart.split('-')\n if (split.length !== 2) return false\n prefix = split[0]\n account = split[1]\n }\n if (!/^\\d{1,6}$/.test(prefix) && prefix !== '') return false\n if (!/^\\d{2,10}$/.test(account)) return false\n const weights = [6, 3, 7, 9, 10, 5, 8, 4, 2, 1]\n // Validate account number\n const accDigits = account.padStart(10, '0').split('').map(Number)\n let total = 0\n for (let i = 0; i < 10; i++) total += accDigits[i] * weights[i]\n if (total % 11 !== 0) return false\n // Validate prefix if present\n if (prefix !== '') {\n const prefDigits = prefix.padStart(6, '0').split('').map(Number)\n const prefWeights = weights.slice(4) // [10, 5, 8, 4, 2, 1]\n let prefTotal = 0\n for (let i = 0; i < 6; i++) prefTotal += prefDigits[i] * prefWeights[i]\n if (prefTotal % 11 !== 0) return false\n }\n // Disambiguate: if no prefix and account is 6 digits (YYMMDD), the match\n // could be a Czech birth number (YYMMDD/XXXX). Prefer birth number.\n if (prefix === '' && account.length === 6 && czBirthNumberValid(number)) {\n return false\n }\n return true\n}\n\n/** Validate Slovak Birth Number (same logic as Czech). */\nexport function skBirthNumberValid(number: string): boolean {\n return czBirthNumberValid(number)\n}\n\n/** Validate Russian INN using weighted checksum (10 or 12 digits). */\nexport function ruInnChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length === 10) {\n const weights = [2, 4, 10, 3, 5, 9, 4, 6, 8]\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i] * weights[i]\n return digits[9] === (total % 11) % 10\n } else if (digits.length === 12) {\n const weights1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\n let total1 = 0\n for (let i = 0; i < 10; i++) total1 += digits[i] * weights1[i]\n const check1 = (total1 % 11) % 10\n if (digits[10] !== check1) return false\n const weights2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\n let total2 = 0\n for (let i = 0; i < 11; i++) total2 += digits[i] * weights2[i]\n const check2 = (total2 % 11) % 10\n return digits[11] === check2\n }\n return false\n}\n\n/** Validate Russian SNILS using mod-101 checksum. */\nexport function ruSnilsChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n let base = 0\n for (let i = 0; i < 9; i++) base = base * 10 + digits[i]\n if (base <= 1001998) return true\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i] * (9 - i)\n let check = total % 101\n if (check === 100) check = 0\n const checkValue = digits[9] * 10 + digits[10]\n return checkValue === check\n}\n\n/** Validate Dutch BSN using the 11-test. */\nexport function nlBsn11test(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 9) return false\n let total = 0\n for (let i = 0; i < 8; i++) {\n total += digits[i] * (9 - i)\n }\n total -= digits[8]\n return total % 11 === 0 && total !== 0\n}\n\n/** Validate Romanian CNP using weighted checksum. */\nexport function roCnpChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 13) return false\n if (digits[0] < 1 || digits[0] > 8) return false\n const weights = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9]\n let total = 0\n for (let i = 0; i < 12; i++) total += digits[i] * weights[i]\n let check = total % 11\n if (check === 10) check = 1\n return digits[12] === check\n}\n\n/** Validate Danish CPR number by checking the date portion. */\nexport function dkCprValidDate(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 10) return false\n const day = parseInt(digits.slice(0, 2), 10)\n const month = parseInt(digits.slice(2, 4), 10)\n if (day < 1 || day > 31) return false\n if (month < 1 || month > 12) return false\n return true\n}\n\n/** Validate Swedish Personnummer using Luhn on last 10 digits. */\nexport function sePersonnummerLuhn(number: string): boolean {\n let digitsStr = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digitsStr += c\n }\n if (digitsStr.length === 12) digitsStr = digitsStr.slice(2)\n if (digitsStr.length !== 10) return false\n const month = parseInt(digitsStr.slice(2, 4), 10)\n const day = parseInt(digitsStr.slice(4, 6), 10)\n if (month < 1 || month > 12) return false\n if (day < 1 || day > 31) return false\n return luhnChecksum(digitsStr)\n}\n\n/** Validate Norwegian Birth Number using dual weighted checksums. */\nexport function noBirthNumberChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n const weights1 = [3, 7, 6, 1, 8, 9, 4, 5, 2]\n let total1 = 0\n for (let i = 0; i < 9; i++) total1 += digits[i] * weights1[i]\n let check1 = 11 - (total1 % 11)\n if (check1 === 11) check1 = 0\n if (check1 === 10) return false\n if (digits[9] !== check1) return false\n const weights2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]\n let total2 = 0\n for (let i = 0; i < 10; i++) total2 += digits[i] * weights2[i]\n let check2 = 11 - (total2 % 11)\n if (check2 === 11) check2 = 0\n if (check2 === 10) return false\n return digits[10] === check2\n}\n\n/** Validate Brazilian CPF using weighted mod-11 checksum. */\nexport function brCpfChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n if (new Set(digits).size === 1) return false\n let total1 = 0\n for (let i = 0; i < 9; i++) total1 += digits[i] * (10 - i)\n let check1 = (total1 * 10) % 11\n if (check1 === 10) check1 = 0\n if (digits[9] !== check1) return false\n let total2 = 0\n for (let i = 0; i < 10; i++) total2 += digits[i] * (11 - i)\n let check2 = (total2 * 10) % 11\n if (check2 === 10) check2 = 0\n return digits[10] === check2\n}\n\n/** Validate Brazilian CNPJ using weighted mod-11 checksum. */\nexport function brCnpjChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 14) return false\n const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let total1 = 0\n for (let i = 0; i < 12; i++) total1 += digits[i] * weights1[i]\n let check1 = total1 % 11\n check1 = check1 < 2 ? 0 : 11 - check1\n if (digits[12] !== check1) return false\n const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let total2 = 0\n for (let i = 0; i < 13; i++) total2 += digits[i] * weights2[i]\n let check2 = total2 % 11\n check2 = check2 < 2 ? 0 : 11 - check2\n return digits[13] === check2\n}\n\n/** Validate US ITIN format: 9XX-[7X|8X|9X|70-88]-XXXX. */\nexport function usItinValid(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 9) return false\n if (digits[0] !== '9') return false\n const d4 = parseInt(digits[3], 10)\n if (d4 < 7) return false\n return true\n}\n\n/** Validate UK UTR using mod-11 weighted checksum. */\nexport function ukUtrChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 10) return false\n const weights = [6, 7, 8, 9, 10, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i + 1] * weights[i]\n const remainder = total % 11\n const check = 11 - remainder === 10 ? 0 : 11 - remainder\n return digits[0] === check || (11 - remainder === 11 && digits[0] === 0)\n}\n\n/** Validate Spanish NSS using mod-97 checksum. */\nexport function esNssChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 12) return false\n const province = parseInt(digits.slice(0, 2), 10)\n if (province < 1 || province > 53) return false\n const baseNum = parseInt(digits.slice(0, 10), 10)\n const check = parseInt(digits.slice(10, 12), 10)\n return baseNum % 97 === check\n}\n\n/** Validate Spanish CIF using custom checksum. */\nexport function esCifChecksum(number: string): boolean {\n let cleaned = ''\n for (const c of number) {\n if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) cleaned += c\n }\n cleaned = cleaned.toUpperCase()\n if (cleaned.length !== 9) return false\n const letter = cleaned[0]\n if (!'ABCDEFGHJNPQRSUVW'.includes(letter)) return false\n let totalEven = 0\n let totalOdd = 0\n for (let i = 1; i <= 7; i++) {\n const d = parseInt(cleaned[i], 10)\n if (isNaN(d)) return false\n if (i % 2 === 0) {\n totalEven += d\n } else {\n const doubled = d * 2\n totalOdd += Math.floor(doubled / 10) + (doubled % 10)\n }\n }\n const total = totalEven + totalOdd\n const checkDigit = (10 - (total % 10)) % 10\n const control = cleaned[8]\n if ('KPQS'.includes(letter)) {\n return control === String.fromCharCode('A'.charCodeAt(0) + checkDigit)\n }\n if ('ABEH'.includes(letter)) {\n return control === String(checkDigit)\n }\n return control === String(checkDigit) || control === String.fromCharCode('A'.charCodeAt(0) + checkDigit)\n}\n\n/** Validate Italian Partita IVA using Luhn-like algorithm. */\nexport function itPartitaIvaChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n if (digits.every(d => d === 0)) return false\n let total = 0\n for (let i = 0; i < 10; i++) {\n if (i % 2 === 0) {\n total += digits[i]\n } else {\n const doubled = digits[i] * 2\n total += doubled > 9 ? doubled - 9 : doubled\n }\n }\n const check = (10 - (total % 10)) % 10\n return digits[10] === check\n}\n\n/** Validate Polish REGON using mod-11 weighted checksum (9 or 14 digits). */\nexport function plRegonChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length === 9) {\n const weights = [8, 9, 2, 3, 4, 5, 6, 7]\n let total = 0\n for (let i = 0; i < 8; i++) total += digits[i] * weights[i]\n const check = total % 11 === 10 ? 0 : total % 11\n return digits[8] === check\n }\n if (digits.length === 14) {\n const weights9 = [8, 9, 2, 3, 4, 5, 6, 7]\n let total9 = 0\n for (let i = 0; i < 8; i++) total9 += digits[i] * weights9[i]\n const check9 = total9 % 11 === 10 ? 0 : total9 % 11\n if (digits[8] !== check9) return false\n const weights14 = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8]\n let total14 = 0\n for (let i = 0; i < 13; i++) total14 += digits[i] * weights14[i]\n const check14 = total14 % 11 === 10 ? 0 : total14 % 11\n return digits[13] === check14\n }\n return false\n}\n\n/** Validate Slovak ICO using same algorithm as Czech ICO. */\nexport function skIcoChecksum(number: string): boolean {\n return czIcoChecksum(number)\n}\n\n/** Validate Slovak DIC: SK prefix + digits divisible by 11. */\nexport function skDicValid(number: string): boolean {\n let cleaned = number.trim()\n if (cleaned.toUpperCase().startsWith('SK')) cleaned = cleaned.slice(2)\n if (!/^\\d{10}$/.test(cleaned)) return false\n let remainder = 0\n for (const c of cleaned) {\n remainder = (remainder * 10 + parseInt(c, 10)) % 11\n }\n return remainder === 0\n}\n\n/** Validate Romanian CUI using mod-11 weighted checksum. */\nexport function roCuiChecksum(number: string): boolean {\n let cleaned = number.trim().toUpperCase()\n if (cleaned.startsWith('RO')) cleaned = cleaned.slice(2)\n const digits: number[] = []\n for (const c of cleaned) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length < 2 || digits.length > 10) return false\n const weights = [7, 5, 3, 2, 1, 7, 5, 3, 2]\n const padded = Array(10 - digits.length).fill(0).concat(digits)\n const check = padded.pop()!\n let total = 0\n for (let i = 0; i < 9; i++) total += padded[i] * weights[i]\n const expected = (total * 10) % 11 === 10 ? 0 : (total * 10) % 11\n return check === expected\n}\n\n/** Validate Danish CVR using mod-11 weighted checksum. */\nexport function dkCvrChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 8) return false\n const weights = [2, 7, 6, 5, 4, 3, 2, 1]\n let total = 0\n for (let i = 0; i < 8; i++) total += digits[i] * weights[i]\n return total % 11 === 0\n}\n\n/** Validate Swedish Organisationsnummer using Luhn on 10 digits. */\nexport function seOrgnrChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 10) return false\n const d3 = parseInt(digits[2], 10)\n if (d3 < 2) return false\n return luhnChecksum(digits)\n}\n\n/** Validate Norwegian Organisasjonsnummer using mod-11 weighted checksum. */\nexport function noOrgnrChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 9) return false\n const weights = [3, 2, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 8; i++) total += digits[i] * weights[i]\n const remainder = total % 11\n if (remainder === 1) return false\n const check = remainder === 0 ? 0 : 11 - remainder\n return digits[8] === check\n}\n\n/** Validate Belgian National Number using mod-97 checksum. */\nexport function beNationalNumberChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 11) return false\n const base = parseInt(digits.slice(0, 9), 10)\n const check = parseInt(digits.slice(9, 11), 10)\n if (97 - (base % 97) === check) return true\n const base2000 = parseInt('2' + digits.slice(0, 9), 10)\n return 97 - (base2000 % 97) === check\n}\n\n/** Validate Belgian Enterprise Number using mod-97 checksum. */\nexport function beEnterpriseChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 10) return false\n if (digits[0] !== '0' && digits[0] !== '1') return false\n const base = parseInt(digits.slice(0, 8), 10)\n const check = parseInt(digits.slice(8, 10), 10)\n return 97 - (base % 97) === check\n}\n\n/** Validate Austrian SVNR (Social Insurance Number). */\nexport function atSvnrChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 10) return false\n const weights = [3, 7, 9, 0, 5, 8, 4, 2, 1, 6]\n let total = 0\n for (let i = 0; i < 10; i++) total += digits[i] * weights[i]\n return total % 11 === digits[3]\n}\n\n/** Validate Irish PPS Number using mod-23 checksum. */\nexport function iePpsChecksum(number: string): boolean {\n let cleaned = ''\n for (const c of number) {\n if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) cleaned += c\n }\n cleaned = cleaned.toUpperCase()\n if (cleaned.length < 8 || cleaned.length > 9) return false\n let total = 0\n for (let i = 0; i < 7; i++) {\n const d = parseInt(cleaned[i], 10)\n if (isNaN(d)) return false\n total += d * (8 - i)\n }\n if (cleaned.length === 9 && cleaned[8] >= 'A' && cleaned[8] <= 'Z') {\n total += (cleaned[8].charCodeAt(0) - 64) * 9\n }\n const remainder = total % 23\n const expected = remainder === 0 ? 'W' : String.fromCharCode('A'.charCodeAt(0) + remainder - 1)\n return cleaned[7] === expected\n}\n\n/** Validate Finnish HETU (Personal Identity Code) using mod-31 checksum. */\nexport function fiHetuChecksum(number: string): boolean {\n let cleaned = number.replace(/[\\s-]/g, '')\n // Fallback: if stripping removed the separator, use the trimmed original\n if (cleaned.length !== 11) cleaned = number.trim()\n if (cleaned.length !== 11) return false\n const datePart = cleaned.slice(0, 6)\n for (const c of datePart) {\n if (c < '0' || c > '9') return false\n }\n const sep = cleaned[6]\n if (!'-+ABCDEFYXWVU'.includes(sep)) return false\n const numPart = cleaned.slice(7, 10)\n for (const c of numPart) {\n if (c < '0' || c > '9') return false\n }\n const checkChars = '0123456789ABCDEFHJKLMNPRSTUVWXY'\n const combined = parseInt(datePart + numPart, 10)\n const expected = checkChars[combined % 31]\n return cleaned[10].toUpperCase() === expected\n}\n\n/** Validate Finnish Y-tunnus (Business ID) using mod-11 weighted checksum. */\nexport function fiYtunnusChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 8) return false\n const weights = [7, 9, 10, 5, 8, 4, 2]\n let total = 0\n for (let i = 0; i < 7; i++) total += parseInt(digits[i], 10) * weights[i]\n const remainder = total % 11\n if (remainder === 1) return false\n const check = remainder === 0 ? 0 : 11 - remainder\n return parseInt(digits[7], 10) === check\n}\n\n/** Validate Hungarian Tax ID using mod-11 weighted checksum. */\nexport function huTaxIdChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 10) return false\n if (digits[0] !== 8) return false\n const weights = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i] * weights[i]\n return digits[9] === total % 11\n}\n\n/** Validate Hungarian TAJ (Social Security) using mod-10 with 3/7 weights. */\nexport function huTajChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 9) return false\n let total = 0\n for (let i = 0; i < 8; i++) {\n total += digits[i] * (i % 2 === 0 ? 3 : 7)\n }\n return digits[8] === total % 10\n}\n\n/** Validate Bulgarian EGN using weighted mod-11 checksum. */\nexport function bgEgnChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 10) return false\n const month = parseInt(number.slice(2, 4), 10)\n const baseMonth = month > 40 ? month - 40 : month > 20 ? month - 20 : month\n if (baseMonth < 1 || baseMonth > 12) return false\n const weights = [2, 4, 8, 5, 10, 9, 7, 3, 6]\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i] * weights[i]\n let check = total % 11\n if (check === 10) check = 0\n return digits[9] === check\n}\n\n/** Validate Croatian OIB using ISO 7064 MOD 11,2. */\nexport function hrOibChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n let remainder = 10\n for (let i = 0; i < 10; i++) {\n remainder = (remainder + digits[i]) % 10\n if (remainder === 0) remainder = 10\n remainder = (remainder * 2) % 11\n }\n let check = 11 - remainder\n if (check === 10) check = 0\n return digits[10] === check\n}\n\n/** Validate Slovenian EMSO using mod-11 weighted checksum. */\nexport function siEmsoChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 13) return false\n const weights = [7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 12; i++) total += digits[i] * weights[i]\n const remainder = total % 11\n const check = remainder === 0 ? 0 : 11 - remainder\n if (check === 10) return false\n return digits[12] === check\n}\n\n/** Validate Slovenian Tax Number using mod-11. */\nexport function siTaxNumberChecksum(number: string): boolean {\n let cleaned = number.trim().toUpperCase()\n if (cleaned.startsWith('SI')) cleaned = cleaned.slice(2)\n const digits: number[] = []\n for (const c of cleaned) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 8) return false\n const weights = [8, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 7; i++) total += digits[i] * weights[i]\n const remainder = total % 11\n if (remainder === 0 || remainder === 1) return digits[7] === 0\n return digits[7] === 11 - remainder\n}\n\n/** Validate Lithuanian Personal Code using dual-pass mod-11 checksum. */\nexport function ltPersonalCodeChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n if (digits[0] < 1 || digits[0] > 6) return false\n const weights1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1]\n let total = 0\n for (let i = 0; i < 10; i++) total += digits[i] * weights1[i]\n let check = total % 11\n if (check === 10) {\n const weights2 = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3]\n total = 0\n for (let i = 0; i < 10; i++) total += digits[i] * weights2[i]\n check = total % 11\n if (check === 10) check = 0\n }\n return digits[10] === check\n}\n\n/** Validate Latvian Personal Code (old format with checksum). */\nexport function lvPersonalCodeChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 11) return false\n const day = parseInt(digits.slice(0, 2), 10)\n const month = parseInt(digits.slice(2, 4), 10)\n if (digits[0] === '3' && digits[1] === '2') {\n return true\n }\n if (day < 1 || day > 31) return false\n if (month < 1 || month > 12) return false\n const weights = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2]\n let total = 0\n for (let i = 0; i < 10; i++) total += parseInt(digits[i], 10) * weights[i]\n const check = ((1101 - total) % 11) % 10\n return parseInt(digits[10], 10) === check\n}\n\n/** Validate Estonian Personal Code using dual-pass mod-11 checksum. */\nexport function eePersonalCodeChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n if (digits[0] < 1 || digits[0] > 6) return false\n const weights1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1]\n let total = 0\n for (let i = 0; i < 10; i++) total += digits[i] * weights1[i]\n let check = total % 11\n if (check === 10) {\n const weights2 = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3]\n total = 0\n for (let i = 0; i < 10; i++) total += digits[i] * weights2[i]\n check = total % 11\n if (check === 10) check = 0\n }\n return digits[10] === check\n}\n\n/** Validate Swiss AHV using EAN-13 checksum. */\nexport function chAhvChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 13) return false\n if (!digits.startsWith('756')) return false\n let total = 0\n for (let i = 0; i < 12; i++) {\n total += parseInt(digits[i], 10) * (i % 2 === 0 ? 1 : 3)\n }\n const check = (10 - (total % 10)) % 10\n return parseInt(digits[12], 10) === check\n}\n\n/** Validate Australian TFN using mod-11 weighted checksum. */\nexport function auTfnChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 9 && digits.length !== 8) return false\n if (digits.length === 8) {\n const weights = [10, 7, 8, 4, 6, 3, 5, 1]\n let total = 0\n for (let i = 0; i < 8; i++) total += digits[i] * weights[i]\n return total % 11 === 0\n }\n const weights = [1, 4, 3, 7, 5, 8, 6, 9, 10]\n let total = 0\n for (let i = 0; i < 9; i++) total += digits[i] * weights[i]\n return total % 11 === 0\n}\n\n/** Validate Australian Medicare number using mod-10 weighted checksum. */\nexport function auMedicareChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length < 10 || digits.length > 11) return false\n const weights = [1, 3, 7, 9, 1, 3, 7, 9]\n let total = 0\n for (let i = 0; i < 8; i++) total += parseInt(digits[i], 10) * weights[i]\n return parseInt(digits[8], 10) === total % 10\n}\n\n/** Validate New Zealand IRD using dual-pass mod-11 checksum. */\nexport function nzIrdChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 8 && digits.length !== 9) return false\n if (digits.length === 8) digits = '0' + digits\n const d = digits.split('').map(Number)\n const weights1 = [3, 2, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 8; i++) total += d[i] * weights1[i]\n const remainder = total % 11\n if (remainder === 0) return d[8] === 0\n if (11 - remainder !== 10) return d[8] === 11 - remainder\n const weights2 = [7, 4, 3, 2, 5, 2, 7, 6]\n total = 0\n for (let i = 0; i < 8; i++) total += d[i] * weights2[i]\n const r2 = total % 11\n if (r2 === 0) return d[8] === 0\n return d[8] === 11 - r2\n}\n\n// Verhoeff lookup tables\nconst VERHOEFF_D = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\n]\nconst VERHOEFF_P = [\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\n]\n\n/** Validate Indian Aadhaar using Verhoeff algorithm. */\nexport function inAadhaarChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 12) return false\n if (digits[0] === '0' || digits[0] === '1') return false\n let c = 0\n for (let i = digits.length - 1; i >= 0; i--) {\n c = VERHOEFF_D[c][VERHOEFF_P[(digits.length - 1 - i) % 8][parseInt(digits[i], 10)]]\n }\n return c === 0\n}\n\n/** Validate Indian PAN format: AAAAA0000A. */\nexport function inPanValid(number: string): boolean {\n const cleaned = number.trim().toUpperCase()\n if (cleaned.length !== 10) return false\n return /^[A-Z]{3}[ABCFGHLJPT][A-Z]\\d{4}[A-Z]$/.test(cleaned)\n}\n\n/** Validate Japanese My Number using mod-11 checksum. */\nexport function jpMyNumberChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 12) return false\n let total = 0\n for (let i = 0; i < 11; i++) {\n const p = 11 - i\n const q = p <= 6 ? p + 1 : p - 5\n total += parseInt(digits[i], 10) * q\n }\n const remainder = total % 11\n const check = remainder <= 1 ? 0 : 11 - remainder\n return parseInt(digits[11], 10) === check\n}\n\n/** Validate Korean RRN using weighted mod checksum. */\nexport function krRrnChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 13) return false\n const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]\n let total = 0\n for (let i = 0; i < 12; i++) total += parseInt(digits[i], 10) * weights[i]\n const check = (11 - (total % 11)) % 10\n return parseInt(digits[12], 10) === check\n}\n\n/** Validate Turkish Kimlik using custom dual check digit algorithm. */\nexport function trKimlikChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') digits.push(parseInt(c, 10))\n }\n if (digits.length !== 11) return false\n if (digits[0] === 0) return false\n const oddSum = digits[0] + digits[2] + digits[4] + digits[6] + digits[8]\n const evenSum = digits[1] + digits[3] + digits[5] + digits[7]\n const check1 = ((oddSum * 7) - evenSum) % 10\n if (check1 < 0 ? check1 + 10 : check1 !== digits[9]) return false\n let total = 0\n for (let i = 0; i < 10; i++) total += digits[i]\n return total % 10 === digits[10]\n}\n\n/** Validate Argentine CUIT using mod-11 weighted checksum. */\nexport function arCuitChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length !== 11) return false\n const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 10; i++) total += parseInt(digits[i], 10) * weights[i]\n const remainder = total % 11\n const check = remainder === 0 ? 0 : remainder === 1 ? 9 : 11 - remainder\n return parseInt(digits[10], 10) === check\n}\n\n/** Validate Chilean RUT using mod-11 checksum with K. */\nexport function clRutChecksum(number: string): boolean {\n let cleaned = number.replace(/[.\\s]/g, '').toUpperCase()\n if (cleaned.includes('-')) {\n const parts = cleaned.split('-')\n if (parts.length !== 2) return false\n cleaned = parts[0] + parts[1]\n }\n if (cleaned.length < 2) return false\n const body = cleaned.slice(0, -1)\n const check = cleaned.slice(-1)\n if (!/^\\d+$/.test(body)) return false\n let total = 0\n let mul = 2\n for (let i = body.length - 1; i >= 0; i--) {\n total += parseInt(body[i], 10) * mul\n mul = mul === 7 ? 2 : mul + 1\n }\n const remainder = 11 - (total % 11)\n let expected: string\n if (remainder === 11) expected = '0'\n else if (remainder === 10) expected = 'K'\n else expected = String(remainder)\n return check === expected\n}\n\n/** Validate Colombian NIT using mod-11 with prime-based weights. */\nexport function coNitChecksum(number: string): boolean {\n let digits = ''\n for (const c of number) {\n if (c >= '0' && c <= '9') digits += c\n }\n if (digits.length < 8 || digits.length > 10) return false\n const body = digits.slice(0, -1)\n const check = parseInt(digits.slice(-1), 10)\n const weights = [3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71]\n let total = 0\n for (let i = 0; i < body.length; i++) {\n total += parseInt(body[body.length - 1 - i], 10) * weights[i]\n }\n const remainder = total % 11\n const expected = remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder\n return check === expected\n}\n\n/** Validate NHS number using modulus 11 checksum. */\nexport function nhsChecksum(number: string): boolean {\n const digits: number[] = []\n for (const c of number) {\n if (c >= '0' && c <= '9') {\n digits.push(parseInt(c, 10))\n }\n }\n if (digits.length !== 10) {\n return false\n }\n const weights = [10, 9, 8, 7, 6, 5, 4, 3, 2]\n let total = 0\n for (let i = 0; i < 9; i++) {\n total += digits[i] * weights[i]\n }\n const remainder = total % 11\n let checkDigit = 11 - remainder\n if (checkDigit === 11) {\n checkDigit = 0\n }\n if (checkDigit === 10) {\n return false\n }\n return digits[9] === checkDigit\n}\n","// Credit card number detector with Luhn validation\n\nimport { Detector } from '../base'\nimport { EntityType, PIIMatch } from '../entities'\nimport { registerUniversal } from '../registry'\nimport { luhnChecksum } from '../validators'\n\n// Known IIN prefix patterns (no context needed)\nconst CC_KNOWN = new RegExp(\n '\\\\b(?:' +\n // Visa: 13, 16, or 19 digits\n '4\\\\d{3}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}(?:[-\\\\s]?\\\\d{3})?' +\n '|4\\\\d{12}' +\n // Mastercard: 5[1-5]xx or 2[2-7]xx (16 digits)\n '|5[1-5]\\\\d{2}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}' +\n '|2[2-7]\\\\d{2}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}' +\n // Amex: 34xx or 37xx (15 digits)\n '|3[47]\\\\d{2}[-\\\\s]?\\\\d{6}[-\\\\s]?\\\\d{5}' +\n // Discover: 6011 or 65xx (16 digits)\n '|6(?:011|5\\\\d{2})[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}[-\\\\s]?\\\\d{4}' +\n // Diners Club: 300-305, 36, 38 (14-16 digits)\n '|3(?:0[0-5]|[68]\\\\d)\\\\d{11,13}' +\n // JCB: 3528-3589 (16 digits)\n '|35(?:2[89]|[3-8]\\\\d)\\\\d{12}' +\n // UnionPay: 62xx (16-19 digits)\n '|62\\\\d{14,17}' +\n // Maestro: 5018, 5020, 5038, 6304, 6759, 6761-6763 (12-19 digits)\n '|50(?:18|20|38)\\\\d{8,15}' +\n '|6(?:304|7(?:59|6[1-3]))\\\\d{8,15}' +\n ')\\\\b',\n 'g'\n)\n\n// Generic long number pattern (context required, for unknown IIN prefixes)\nconst CC_GENERIC = /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{1,7}\\b/g\n\nconst CC_CONTEXT = [\n 'credit card', 'card number', 'card no', 'card #',\n 'cc:', 'cc #', 'payment card', 'debit card',\n 'billing', 'card:', 'credit', 'payment',\n]\n\nclass CreditCardDetector extends Detector {\n entityType = EntityType.CREDIT_CARD\n score = 0.9\n\n iterMatches(text: string): PIIMatch[] {\n if (!text.match(/\\d/)) return []\n\n const results: PIIMatch[] = []\n\n // Branch 1: Known IIN prefixes (no context needed)\n CC_KNOWN.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = CC_KNOWN.exec(text)) !== null) {\n const matchedText = match[0]\n if (!luhnChecksum(matchedText)) continue\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start: match.index,\n end: match.index + matchedText.length,\n score: 1.0,\n })\n }\n\n // Branch 2: Generic long numbers with context + Luhn (unknown IIN)\n CC_GENERIC.lastIndex = 0\n while ((match = CC_GENERIC.exec(text)) !== null) {\n const matchedText = match[0]\n const start = match.index\n // Skip if overlaps with known pattern match\n if (results.some((r) => r.start <= start && start < r.end)) continue\n if (!luhnChecksum(matchedText)) continue\n // Require CC context keywords\n const windowStart = Math.max(0, start - 100)\n const lower = (this as any)._textLower || text.toLowerCase()\n const window = lower.slice(windowStart, start)\n if (!CC_CONTEXT.some((kw) => window.includes(kw))) continue\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start,\n end: start + matchedText.length,\n score: 1.0,\n })\n }\n\n return results\n }\n}\n\nregisterUniversal(CreditCardDetector)\n\nexport { CreditCardDetector }\n","// Phone number detector (NANP + international + EU trunk formats)\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\nconst DATE_LIKE = /^\\d{1,2}[-./]\\d{1,2}[-./]\\d{2,4}$/\nconst SSN_LIKE = /^\\d{3}[-.\\s]\\d{2}[-.\\s]\\d{4}$/\n\nfunction phoneLengthCheck(text: string): boolean {\n let digits = 0\n for (const c of text) {\n if (c >= '0' && c <= '9') digits++\n }\n if (digits < 7 || digits > 15) return false\n // Reject date-like patterns (e.g., 03-15-1990) to avoid stealing DOB matches\n if (DATE_LIKE.test(text)) return false\n // Reject SSN-like patterns (e.g., 044-10-7757) to avoid stealing SSN matches\n if (SSN_LIKE.test(text)) return false\n return true\n}\n\nclass PhoneDetector extends RegexDetector {\n entityType = EntityType.PHONE_NUMBER\n score = 0.85\n contextKeywords = [\n 'phone', 'tel', 'telephone', 'call', 'mobile', 'cell', 'fax',\n 'contact', 'dial', 'reach', 'ring', 'text', 'sms', 'whatsapp',\n 'number', 'ph#', 'ph #', 'cell#', 'cell #',\n ]\n contextWindow = 80\n pattern = new RegExp(\n '(?<!\\\\d)' +\n '(?:' +\n // NANP with parens: separator optional after closing paren\n '(?:\\\\+?1[-.\\\\s]?)?\\\\([2-9]\\\\d{2}\\\\)[-.\\\\s]?[2-9]\\\\d{2}[-.\\\\s]?\\\\d{4}' +\n '|' +\n // NANP without parens: first separator required\n '(?:\\\\+?1[-.\\\\s]?)?[2-9]\\\\d{2}[-.\\\\s][2-9]\\\\d{2}[-.\\\\s]?\\\\d{4}' +\n '|' +\n // International: +CC with optional separator after country code\n '\\\\+[1-9]\\\\d{0,2}[-.\\\\s]?\\\\(?\\\\d{1,4}\\\\)?[-.\\\\s]?\\\\d{1,4}[-.\\\\s]?\\\\d{1,9}' +\n '|' +\n // EU trunk prefix: 0XX followed by 7-11 digits with separators\n '0\\\\d{1,3}[-.\\\\s]\\\\d{2,4}[-.\\\\s]?\\\\d{2,4}[-.\\\\s]?\\\\d{0,4}' +\n ')' +\n // Optional extension\n '(?:\\\\s?(?:x|ext\\\\.?)\\\\s?\\\\d{1,5})?' +\n '(?!\\\\d)',\n 'g'\n )\n validator = phoneLengthCheck\n}\n\nregisterUniversal(PhoneDetector)\n\nexport { PhoneDetector }\n","// IP address detector (IPv4 and IPv6)\n\nimport { Detector } from '../base'\nimport { EntityType, PIIMatch } from '../entities'\nimport { registerUniversal } from '../registry'\n\nconst IPV4 = /\\b(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\b/g\n\nconst IPV6 = new RegExp(\n '\\\\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\\\b' +\n '|\\\\b(?:[0-9a-fA-F]{1,4}:){1,7}:\\\\b' +\n '|\\\\b::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}\\\\b',\n 'g'\n)\n\nclass IpAddressDetector extends Detector {\n entityType = EntityType.IP_ADDRESS\n score = 0.95\n\n iterMatches(text: string): PIIMatch[] {\n const results: PIIMatch[] = []\n\n for (const pattern of [IPV4, IPV6]) {\n pattern.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = pattern.exec(text)) !== null) {\n const matchedText = match[0]\n const start = match.index\n // Skip common non-IP patterns like version numbers\n if (pattern === IPV4 && IpAddressDetector.isVersionNumber(text, start)) {\n continue\n }\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start,\n end: start + matchedText.length,\n score: this.score,\n })\n }\n }\n\n return results\n }\n\n /** Skip patterns preceded by 'v' or 'version' that look like version numbers. */\n private static isVersionNumber(text: string, start: number): boolean {\n if (start > 0 && text[start - 1].toLowerCase() === 'v') {\n return true\n }\n const prefix = text\n .slice(Math.max(0, start - 10), start)\n .toLowerCase()\n .trim()\n return prefix.endsWith('version')\n }\n}\n\nregisterUniversal(IpAddressDetector)\n\nexport { IpAddressDetector }\n","// URL detector\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\n// Common TLDs — covers ~99% of real-world URLs\nconst VALID_TLDS = new Set([\n 'com', 'org', 'net', 'edu', 'gov', 'mil', 'int',\n 'io', 'co', 'dev', 'app', 'ai', 'me', 'us', 'uk', 'de', 'fr', 'it',\n 'es', 'nl', 'be', 'at', 'ch', 'se', 'no', 'dk', 'fi', 'pl', 'cz',\n 'sk', 'pt', 'ru', 'br', 'jp', 'kr', 'cn', 'in', 'au', 'nz', 'za',\n 'ca', 'mx', 'ar', 'cl', 'il', 'tr', 'ie', 'hu', 'ro', 'bg', 'hr',\n 'si', 'lt', 'lv', 'ee', 'info', 'biz', 'name', 'pro', 'xyz', 'online',\n 'site', 'tech', 'store', 'shop', 'cloud', 'page', 'link', 'top',\n 'icu', 'live', 'world', 'blog', 'news', 'tv', 'cc', 'ly', 'gg',\n 'to', 'eu', 'asia',\n])\n\nfunction urlValidTld(text: string): boolean {\n try {\n const afterScheme = text.split('://', 2)[1]\n if (!afterScheme) return false\n const domain = afterScheme.split('/')[0].split('?')[0].split('#')[0]\n const parts = domain.replace(/\\.$/, '').split('.')\n if (parts.length < 2) return false\n const tld = parts[parts.length - 1].toLowerCase()\n return VALID_TLDS.has(tld)\n } catch {\n return false\n }\n}\n\nclass UrlDetector extends RegexDetector {\n entityType = EntityType.URL\n score = 0.85\n needsDigit = false\n pattern = /https?:\\/\\/(?:[\\w\\-]+\\.)+[a-zA-Z]{2,}(?:\\/[^\\s<>\"')\\]]*)?/gi\n validator = urlValidTld\n\n preCheck(text: string): boolean {\n return text.includes('://')\n }\n}\n\nregisterUniversal(UrlDetector)\n\nexport { UrlDetector }\n","// MAC address detector\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\nclass MacAddressDetector extends RegexDetector {\n entityType = EntityType.MAC_ADDRESS\n score = 0.95\n // Standard MAC formats: AA:BB:CC:DD:EE:FF or AA-BB-CC-DD-EE-FF\n pattern = /\\b(?:[0-9A-Fa-f]{2}[:\\-]){5}[0-9A-Fa-f]{2}\\b/g\n}\n\nregisterUniversal(MacAddressDetector)\n\nexport { MacAddressDetector }\n","// Date of birth detector (context-required)\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\nconst MONTHS =\n '(?:january|february|march|april|may|june|july|august|' +\n 'september|october|november|december|' +\n 'jan|feb|mar|apr|jun|jul|aug|sep|oct|nov|dec)'\n\nfunction validDate(text: string): boolean {\n // Word-based dates (month name present) are well-constrained by pattern\n if (/[a-zA-Z]/i.test(text.replace(/T/g, ''))) return true\n // For numeric dates, ensure we have at least 3 digit groups\n const groups = text.match(/\\d+/g)\n return groups !== null && groups.length >= 3\n}\n\nclass DateOfBirthDetector extends RegexDetector {\n entityType = EntityType.DATE_OF_BIRTH\n score = 0.75\n contextKeywords = [\n 'born', 'dob', 'date of birth', 'birthday', 'birthdate', 'd.o.b',\n 'birth date', 'birth', 'b-day', 'bday', 'age', 'd/o/b', 'born on',\n 'date de naissance', 'geburtsdatum', 'fecha de nacimiento',\n 'geboortedatum', 'data di nascita',\n ]\n contextRequired = true\n contextWindow = 100\n validator = validDate\n\n // Multiple date formats\n pattern = new RegExp(\n // MM/DD/YYYY (4-digit year, month 1-12)\n '\\\\b(?:0?[1-9]|1[0-2])[/\\\\-.](?:0?[1-9]|[12]\\\\d|3[01])[/\\\\-.](?:19|20)\\\\d{2}\\\\b' +\n '|' +\n // DD/MM/YYYY (4-digit year, day 13-31 first — unambiguous DD/MM)\n '\\\\b(?:1[3-9]|2\\\\d|3[01])[/\\\\-.](?:0?[1-9]|1[0-2])[/\\\\-.](?:19|20)\\\\d{2}\\\\b' +\n '|' +\n // MM/DD/YY (2-digit year, month 1-12)\n '\\\\b(?:0?[1-9]|1[0-2])[/\\\\-.](?:0?[1-9]|[12]\\\\d|3[01])[/\\\\-.]\\\\d{2}\\\\b' +\n '|' +\n // DD/MM/YY (2-digit year, day 13-31 first)\n '\\\\b(?:1[3-9]|2\\\\d|3[01])[/\\\\-.](?:0?[1-9]|1[0-2])[/\\\\-.]\\\\d{2}\\\\b' +\n '|' +\n // YYYY-MM-DD (ISO, with optional T timestamp)\n '\\\\b(?:19|20)\\\\d{2}[/\\\\-.](?:0?[1-9]|1[0-2])[/\\\\-.](?:0?[1-9]|[12]\\\\d|3[01])(?:T\\\\d{2}:\\\\d{2}:\\\\d{2})?\\\\b' +\n '|' +\n // Month DDth, YYYY (with optional ordinal suffix)\n '\\\\b' + MONTHS + '\\\\s+\\\\d{1,2}(?:st|nd|rd|th)?,?\\\\s+(?:19|20)\\\\d{2}\\\\b' +\n '|' +\n // DD Month YYYY (with optional ordinal suffix)\n '\\\\b\\\\d{1,2}(?:st|nd|rd|th)?\\\\s+' + MONTHS + ',?\\\\s+(?:19|20)\\\\d{2}\\\\b' +\n '|' +\n // Month/YY (abbreviated — e.g., \"May/58\", \"August/72\")\n '\\\\b' + MONTHS + '[/\\\\-.]\\\\d{2}\\\\b',\n 'gi'\n )\n}\n\nregisterUniversal(DateOfBirthDetector)\n\nexport { DateOfBirthDetector }\n","// CVV/CVC detector (always context-required)\n\nimport { RegexDetector } from '../base'\nimport { EntityType } from '../entities'\nimport { registerUniversal } from '../registry'\n\nclass CvvDetector extends RegexDetector {\n entityType = EntityType.CVV\n score = 0.8\n contextKeywords = ['cvv', 'cvc', 'security code', 'card verification', 'cvv2', 'cvc2', 'csv']\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{3,4}\\b/g\n}\n\nregisterUniversal(CvvDetector)\n\nexport { CvvDetector }\n","// US Social Security Number detector\n\nimport { Detector } from '../../base'\nimport { EntityType, PIIMatch } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ssnValidFormat } from '../../validators'\n\n// SSN with separators (dashes, spaces, or dots)\nconst SSN_WITH_SEP = new RegExp(\n '\\\\b(?!000|666|9\\\\d{2})\\\\d{3}[-.\\\\s](?!00)\\\\d{2}[-.\\\\s](?!0000)\\\\d{4}\\\\b',\n 'g'\n)\n\n// SSN without separators (9 bare digits) — requires context to avoid noise\nconst SSN_NO_SEP = new RegExp(\n '\\\\b(?!000|666|9\\\\d{2})\\\\d{3}(?!00)\\\\d{2}(?!0000)\\\\d{4}\\\\b',\n 'g'\n)\n\nclass SsnDetector extends Detector {\n entityType = EntityType.SSN\n score = 0.85\n contextKeywords = [\n 'ssn', 'social security', 'social sec', 'ss#', 'ss #',\n 'social', 'tax id', 'taxpayer', 'tin',\n 'social number', 'soc number', 'socialnum',\n ]\n contextRequired = false\n contextWindow = 100\n\n iterMatches(text: string): PIIMatch[] {\n const results: PIIMatch[] = []\n\n // Branch 1: SSN with separators (no context required)\n SSN_WITH_SEP.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = SSN_WITH_SEP.exec(text)) !== null) {\n const matchedText = match[0]\n if (!ssnValidFormat(matchedText)) continue\n const start = match.index\n const end = start + matchedText.length\n const hasCtx = this.hasContext(text, start, end)\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start,\n end,\n score: hasCtx ? 1.0 : this.score,\n })\n }\n\n // Branch 2: SSN without separators (context REQUIRED)\n SSN_NO_SEP.lastIndex = 0\n while ((match = SSN_NO_SEP.exec(text)) !== null) {\n const matchedText = match[0]\n const start = match.index\n const end = start + matchedText.length\n // Skip if this overlaps with an already-found separated SSN\n if (results.some((r) => r.start <= start && start < r.end)) continue\n if (!ssnValidFormat(matchedText)) continue\n if (!this.hasContext(text, start, end)) continue\n results.push({\n entityType: this.entityType,\n text: matchedText,\n start,\n end,\n score: 1.0,\n })\n }\n\n return results\n }\n}\n\nregisterRegion('us', SsnDetector)\n\nexport { SsnDetector }\n","// US Driver's License detector (context-required, top state formats)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass DriversLicenseDetector extends RegexDetector {\n entityType = EntityType.DRIVERS_LICENSE\n score = 0.75\n contextKeywords = [\n 'driver',\n 'license',\n 'licence',\n 'dl',\n \"driver's license\",\n 'driving license',\n 'dl#',\n 'dl #',\n 'dmv',\n 'permit',\n ]\n contextRequired = true\n contextWindow = 50\n\n // US state DL formats (ordered longest first to avoid partial matches)\n pattern = new RegExp(\n '\\\\b(?:' +\n '[A-Z]\\\\d{14}' + // NJ: A12345678901234\n '|[A-Z]\\\\d{13}' + // WI: A1234567890123\n '|[A-Z]\\\\d{12}' + // FL: A123456789012\n '|[A-Z]\\\\d{11}' + // IL: A12345678901\n '|[A-Z]\\\\d{10}' + // MI: A1234567890\n '|[A-Z]\\\\d{8}' + // MA/VA: A12345678\n '|[A-Z]{2}\\\\d{6}' + // OH: AB123456\n '|[A-Z]\\\\d{7}' + // CA: A1234567\n '|\\\\d{9}' + // NY: 123456789\n '|\\\\d{8}' + // TX/PA: 12345678\n ')\\\\b',\n 'g'\n )\n}\n\nregisterRegion('us', DriversLicenseDetector)\n\nexport { DriversLicenseDetector }\n","// US Passport number detector (context-required)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass UsPassportDetector extends RegexDetector {\n entityType = EntityType.US_PASSPORT\n score = 0.75\n contextKeywords = ['passport', 'passport#', 'passport #', 'passport number', 'passport no']\n contextRequired = true\n contextWindow = 50\n\n // US passport: 9 digits\n pattern = /\\b\\d{9}\\b/g\n}\n\nregisterRegion('us', UsPassportDetector)\n\nexport { UsPassportDetector }\n","// US Tax ID / EIN detector (context-required)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass TaxIdDetector extends RegexDetector {\n entityType = EntityType.TAX_ID\n score = 0.8\n contextKeywords = [\n 'ein',\n 'tax id',\n 'tax identification',\n 'employer identification',\n 'tin',\n 'tax #',\n 'ein#',\n ]\n contextRequired = true\n contextWindow = 50\n\n // EIN format: XX-XXXXXXX (first two digits are valid prefixes)\n pattern = /\\b\\d{2}-\\d{7}\\b/g\n}\n\nregisterRegion('us', TaxIdDetector)\n\nexport { TaxIdDetector }\n","// US ZIP Code detector (context-required)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nfunction zipValid(text: string): boolean {\n let digits = ''\n for (const c of text) {\n if (c >= '0' && c <= '9') digits += c\n }\n return !digits.startsWith('000')\n}\n\nclass ZipCodeDetector extends RegexDetector {\n entityType = EntityType.ZIP_CODE\n score = 0.7\n contextKeywords = [\n 'zip', 'postal', 'zip code', 'zipcode', 'postal code',\n 'address', 'city', 'state', 'mailing', 'shipping',\n 'billing', 'delivery', 'location', 'resident', 'zip+4',\n 'usa', 'united states',\n ]\n contextRequired = true\n contextWindow = 150\n\n // 5 digits or 5+4 format\n pattern = /\\b\\d{5}(?:-\\d{4})?\\b/g\n validator = zipValid\n}\n\nregisterRegion('us', ZipCodeDetector)\n\nexport { ZipCodeDetector }\n","// US Individual Taxpayer Identification Number (ITIN) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { usItinValid } from '../../validators'\n\nclass UsItinDetector extends RegexDetector {\n entityType = EntityType.US_ITIN\n score = 0.85\n contextKeywords = ['itin', 'individual taxpayer', 'tax identification']\n contextRequired = true\n\n pattern = /\\b9\\d{2}[- ]?\\d{2}[- ]?\\d{4}\\b/g\n validator = usItinValid\n}\n\nregisterRegion('us', UsItinDetector)\n\nexport { UsItinDetector }\n","// US-specific PII detectors\nimport './ssn'\nimport './drivers-license'\nimport './passport'\nimport './tax-id'\nimport './zip-code'\nimport './itin'\n","// IBAN detector with mod-97 checksum validation\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ibanMod97 } from '../../validators'\n\nclass IbanDetector extends RegexDetector {\n entityType = EntityType.IBAN\n score = 0.9\n // IBAN: 2 letter country code + 2 check digits + up to 30 alphanumeric chars\n pattern = /\\b[A-Z]{2}\\d{2}\\s?[\\dA-Z]{4}(?:\\s?[\\dA-Z]{4}){1,7}(?:\\s?[\\dA-Z]{1,4})?\\b/g\n validator = ibanMod97\n}\n\nregisterRegion('eu', IbanDetector)\n\nexport { IbanDetector }\n","// EU postal code detector (DE/FR/NL, context-required)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass EuPostalCodeDetector extends RegexDetector {\n entityType = EntityType.EU_POSTAL_CODE\n score = 0.7\n contextKeywords = ['postal', 'postcode', 'post code', 'zip', 'plz', 'postleitzahl', 'code postal']\n contextRequired = true\n contextWindow = 50\n\n // DE: 5 digits | FR: 5 digits | NL: 4 digits + 2 letters\n pattern = new RegExp(\n '\\\\b(?:' +\n '\\\\d{5}' + // DE, FR\n '|\\\\d{4}\\\\s?[A-Z]{2}' + // NL\n ')\\\\b',\n 'g'\n )\n}\n\nregisterRegion('eu', EuPostalCodeDetector)\n\nexport { EuPostalCodeDetector }\n","// EU VAT ID detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass VatIdDetector extends RegexDetector {\n entityType = EntityType.VAT_ID\n score = 0.9\n // EU VAT numbers: 2-letter country prefix + country-specific format\n pattern = new RegExp(\n '\\\\b(?:' +\n 'ATU\\\\d{8}' + // Austria\n '|BE[01]\\\\d{9}' + // Belgium\n '|DE\\\\d{9}' + // Germany\n '|DK\\\\d{8}' + // Denmark\n '|ES[A-Z0-9]\\\\d{7}[A-Z0-9]' + // Spain\n '|FI\\\\d{8}' + // Finland\n '|FR[A-Z0-9]{2}\\\\d{9}' + // France\n '|IT\\\\d{11}' + // Italy\n '|LU\\\\d{8}' + // Luxembourg\n '|NL\\\\d{9}B\\\\d{2}' + // Netherlands\n '|PL\\\\d{10}' + // Poland\n '|PT\\\\d{9}' + // Portugal\n '|SE\\\\d{12}' + // Sweden\n ')\\\\b',\n 'g'\n )\n}\n\nregisterRegion('eu', VatIdDetector)\n\nexport { VatIdDetector }\n","// EU-specific PII detectors\nimport './iban'\nimport './postal-code'\nimport './vat-id'\n","// UK National Insurance Number detector (scrubadub-inspired pattern)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass NiNumberDetector extends RegexDetector {\n entityType = EntityType.NI_NUMBER\n score = 0.9\n // Scrubadub pattern: negative lookaheads for invalid prefixes\n pattern = new RegExp(\n '\\\\b' +\n '(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)' +\n '[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]' +\n '\\\\s?\\\\d{2}\\\\s?\\\\d{2}\\\\s?\\\\d{2}\\\\s?[A-D]' +\n '\\\\b',\n 'gi'\n )\n}\n\nregisterRegion('uk', NiNumberDetector)\n\nexport { NiNumberDetector }\n","// UK NHS Number detector with modulus 11 checksum\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { nhsChecksum } from '../../validators'\n\nclass NhsNumberDetector extends RegexDetector {\n entityType = EntityType.NHS_NUMBER\n score = 0.85\n contextKeywords = ['nhs', 'national health', 'nhs number', 'nhs#']\n contextRequired = false\n contextWindow = 50\n\n // 10 digits with optional spaces\n pattern = /\\b\\d{3}\\s?\\d{3}\\s?\\d{4}\\b/g\n validator = nhsChecksum\n}\n\nregisterRegion('uk', NhsNumberDetector)\n\nexport { NhsNumberDetector }\n","// UK Postcode detector (scrubadub-inspired comprehensive pattern)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass UkPostcodeDetector extends RegexDetector {\n entityType = EntityType.UK_POSTCODE\n score = 0.85\n // Comprehensive UK postcode pattern covering all valid formats\n pattern = new RegExp(\n '\\\\b(?:' +\n '[A-Z]{1,2}\\\\d[A-Z\\\\d]?' + // Area + district\n '\\\\s?' +\n '\\\\d[A-Z]{2}' + // Sector + unit\n ')\\\\b',\n 'gi'\n )\n}\n\nregisterRegion('uk', UkPostcodeDetector)\n\nexport { UkPostcodeDetector }\n","// UK Passport number detector (context-required)\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass UkPassportDetector extends RegexDetector {\n entityType = EntityType.UK_PASSPORT\n score = 0.75\n contextKeywords = ['passport', 'passport#', 'passport #', 'passport number', 'passport no']\n contextRequired = true\n contextWindow = 50\n\n // UK passport: 9 digits\n pattern = /\\b\\d{9}\\b/g\n}\n\nregisterRegion('uk', UkPassportDetector)\n\nexport { UkPassportDetector }\n","// UK Unique Taxpayer Reference (UTR) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ukUtrChecksum } from '../../validators'\n\nclass UkUtrDetector extends RegexDetector {\n entityType = EntityType.UK_UTR\n score = 0.85\n contextKeywords = ['utr', 'unique taxpayer', 'tax reference', 'self assessment', 'hmrc']\n contextRequired = true\n\n pattern = /\\b\\d{10}\\b/g\n validator = ukUtrChecksum\n}\n\nregisterRegion('uk', UkUtrDetector)\n\nexport { UkUtrDetector }\n","// UK-specific PII detectors\nimport './ni-number'\nimport './nhs-number'\nimport './postcode'\nimport './passport'\nimport './utr'\n","// German Personal ID (Personalausweis) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\n\nclass DePersonalIdDetector extends RegexDetector {\n entityType = EntityType.DE_PERSONAL_ID\n score = 0.75\n contextKeywords = [\n 'personalausweis',\n 'personal id',\n 'ausweis',\n 'identifikation',\n 'id-nummer',\n 'ausweisnummer',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b[CFGHJKLMNPRTVWXYZ][0-9A-Z][0-9]{7}[0-9]\\b/gi\n}\n\nregisterRegion('de', DePersonalIdDetector)\n\nexport { DePersonalIdDetector }\n","// German Tax ID (Steueridentifikationsnummer) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { deTaxIdChecksum } from '../../validators'\n\nclass DeTaxIdDetector extends RegexDetector {\n entityType = EntityType.DE_TAX_ID\n score = 0.85\n contextKeywords = [\n 'steuer',\n 'tax id',\n 'steueridentifikationsnummer',\n 'tin',\n 'identifikationsnummer',\n 'steuernummer',\n ]\n contextRequired = false\n\n pattern = /\\b\\d{2}\\s?\\d{3}\\s?\\d{3}\\s?\\d{3}\\b/g\n validator = deTaxIdChecksum\n}\n\nregisterRegion('de', DeTaxIdDetector)\n\nexport { DeTaxIdDetector }\n","// German PII detectors\nimport './personal-id'\nimport './tax-id'\n","// French National ID (NIR / INSEE) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { frNirChecksum } from '../../validators'\n\nclass FrNationalIdDetector extends RegexDetector {\n entityType = EntityType.FR_NATIONAL_ID\n score = 0.9\n contextKeywords = ['nir', 'securite sociale', 'social security', 'numero national', 'insee']\n contextRequired = false\n\n pattern = /\\b[12]\\s?\\d{2}\\s?(?:0[1-9]|1[0-2]|[2-9]\\d)\\s?\\d{2,3}\\s?\\d{3}\\s?\\d{3}\\s?\\d{2}\\b/g\n validator = frNirChecksum\n}\n\nregisterRegion('fr', FrNationalIdDetector)\n\nexport { FrNationalIdDetector }\n","// French SIREN (company identification) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { luhnChecksum } from '../../validators'\n\nclass FrSirenDetector extends RegexDetector {\n entityType = EntityType.FR_SIREN\n score = 0.85\n contextKeywords = ['siren', 'siret', 'registre du commerce', 'rcs', 'company number']\n contextRequired = true\n\n pattern = /\\b\\d{3}[- ]?\\d{3}[- ]?\\d{3}\\b/g\n validator = luhnChecksum\n}\n\nregisterRegion('fr', FrSirenDetector)\n\nexport { FrSirenDetector }\n","// French PII detectors\nimport './national-id'\nimport './siren'\n","// Spanish DNI (Documento Nacional de Identidad) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { esDniLetter } from '../../validators'\n\nclass EsDniDetector extends RegexDetector {\n entityType = EntityType.ES_DNI\n score = 0.9\n contextKeywords = ['dni', 'documento nacional', 'identidad']\n contextRequired = false\n\n pattern = /\\b\\d{8}[-\\s]?[A-Z]\\b/gi\n validator = esDniLetter\n}\n\nregisterRegion('es', EsDniDetector)\n\nexport { EsDniDetector }\n","// Spanish NIE (Numero de Identidad de Extranjero) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { esNieLetter } from '../../validators'\n\nclass EsNieDetector extends RegexDetector {\n entityType = EntityType.ES_NIE\n score = 0.9\n contextKeywords = ['nie', 'extranjero', 'numero de identidad']\n contextRequired = false\n\n pattern = /\\b[XYZ]\\d{7}[-\\s]?[A-Z]\\b/gi\n validator = esNieLetter\n}\n\nregisterRegion('es', EsNieDetector)\n\nexport { EsNieDetector }\n","// Spanish Social Security Number (NSS) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { esNssChecksum } from '../../validators'\n\nclass EsNssDetector extends RegexDetector {\n entityType = EntityType.ES_NSS\n score = 0.85\n contextKeywords = ['nss', 'numero seguridad social', 'seguridad social', 'social security']\n contextRequired = true\n\n pattern = /\\b\\d{2}[- ]?\\d{8}[- ]?\\d{2}\\b/g\n validator = esNssChecksum\n}\n\nregisterRegion('es', EsNssDetector)\n\nexport { EsNssDetector }\n","// Spanish CIF (Codigo de Identificacion Fiscal) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { esCifChecksum } from '../../validators'\n\nclass EsCifDetector extends RegexDetector {\n entityType = EntityType.ES_CIF\n score = 0.85\n contextKeywords = ['cif', 'codigo de identificacion fiscal', 'tax id', 'nif empresa']\n contextRequired = false\n\n pattern = /\\b[A-HJ-NP-SUVW]\\d{7}[0-9A-J]\\b/gi\n validator = esCifChecksum\n}\n\nregisterRegion('es', EsCifDetector)\n\nexport { EsCifDetector }\n","// Spanish PII detectors\nimport './dni'\nimport './nie'\nimport './nss'\nimport './cif'\n","// Italian Codice Fiscale detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { itCodiceFiscaleCheck } from '../../validators'\n\nclass ItCodiceFiscaleDetector extends RegexDetector {\n entityType = EntityType.IT_CODICE_FISCALE\n score = 0.9\n contextKeywords = ['codice fiscale', 'cf', 'fiscal code']\n contextRequired = false\n\n pattern = /\\b[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]\\b/gi\n validator = itCodiceFiscaleCheck\n}\n\nregisterRegion('it', ItCodiceFiscaleDetector)\n\nexport { ItCodiceFiscaleDetector }\n","// Italian Partita IVA (VAT number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { itPartitaIvaChecksum } from '../../validators'\n\nclass ItPartitaIvaDetector extends RegexDetector {\n entityType = EntityType.IT_PARTITA_IVA\n score = 0.85\n contextKeywords = ['partita iva', 'p.iva', 'p. iva', 'vat', 'iva']\n contextRequired = true\n\n pattern = /\\b(?:IT)?\\d{11}\\b/gi\n validator = itPartitaIvaChecksum\n}\n\nregisterRegion('it', ItPartitaIvaDetector)\n\nexport { ItPartitaIvaDetector }\n","// Italian PII detectors\nimport './codice-fiscale'\nimport './partita-iva'\n","// Portuguese NIF (Numero de Identificacao Fiscal) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ptNifChecksum } from '../../validators'\n\nclass PtNifDetector extends RegexDetector {\n entityType = EntityType.PT_NIF\n score = 0.85\n contextKeywords = ['nif', 'contribuinte', 'fiscal', 'tax']\n contextRequired = true\n\n pattern = /\\b[1-3589]\\d{8}\\b/g\n validator = ptNifChecksum\n}\n\nregisterRegion('pt', PtNifDetector)\n\nexport { PtNifDetector }\n","// Portuguese PII detectors\nimport './nif'\n","// Polish PESEL detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { plPeselChecksum } from '../../validators'\n\nclass PlPeselDetector extends RegexDetector {\n entityType = EntityType.PL_PESEL\n score = 0.85\n contextKeywords = ['pesel']\n contextRequired = false\n\n pattern = /\\b\\d{11}\\b/g\n validator = plPeselChecksum\n}\n\nregisterRegion('pl', PlPeselDetector)\n\nexport { PlPeselDetector }\n","// Polish NIP (tax identification number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { plNipChecksum } from '../../validators'\n\nclass PlNipDetector extends RegexDetector {\n entityType = EntityType.PL_NIP\n score = 0.85\n contextKeywords = ['nip', 'tax', 'podatkowy']\n contextRequired = true\n\n pattern = /\\b\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{2}[-\\s]?\\d{2}\\b/g\n validator = plNipChecksum\n}\n\nregisterRegion('pl', PlNipDetector)\n\nexport { PlNipDetector }\n","// Polish REGON (statistical number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { plRegonChecksum } from '../../validators'\n\nclass PlRegonDetector extends RegexDetector {\n entityType = EntityType.PL_REGON\n score = 0.85\n contextKeywords = ['regon', 'statistical number', 'numer statystyczny']\n contextRequired = true\n\n pattern = /\\b\\d{9}(?:\\d{5})?\\b/g\n validator = plRegonChecksum\n}\n\nregisterRegion('pl', PlRegonDetector)\n\nexport { PlRegonDetector }\n","// Polish PII detectors\nimport './pesel'\nimport './nip'\nimport './regon'\n","// Czech Birth Number (Rodne Cislo) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { czBirthNumberValid } from '../../validators'\n\nclass CzBirthNumberDetector extends RegexDetector {\n entityType = EntityType.CZ_BIRTH_NUMBER\n score = 0.85\n contextKeywords = ['rodne cislo', 'birth number', 'rc', 'rodn\\u00e9 \\u010d\\u00edslo']\n contextRequired = false\n\n pattern = /\\b\\d{6}\\/?\\d{3,4}\\b/g\n validator = czBirthNumberValid\n}\n\nregisterRegion('cz', CzBirthNumberDetector)\n\nexport { CzBirthNumberDetector }\n","// Czech ICO (Company ID) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { czIcoChecksum } from '../../validators'\n\nclass CzIcoDetector extends RegexDetector {\n entityType = EntityType.CZ_ICO\n score = 0.85\n contextKeywords = [\n 'ico',\n 'i\\u010do',\n 'identifikacni cislo',\n 'identifika\\u010dn\\u00ed \\u010d\\u00edslo',\n 'company id',\n 'business id',\n ]\n contextRequired = true\n\n pattern = /\\b\\d{8}\\b/g\n validator = czIcoChecksum\n}\n\nregisterRegion('cz', CzIcoDetector)\n\nexport { CzIcoDetector }\n","// Czech DIC (Tax/VAT ID) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { czDicValid } from '../../validators'\n\nclass CzDicDetector extends RegexDetector {\n entityType = EntityType.CZ_DIC\n score = 0.85\n contextKeywords = [\n 'dic',\n 'di\\u010d',\n 'danove identifikacni cislo',\n 'da\\u0148ov\\u00e9 identifika\\u010dn\\u00ed \\u010d\\u00edslo',\n 'vat',\n 'tax id',\n ]\n contextRequired = false\n\n pattern = /\\bCZ\\d{8,10}\\b/gi\n validator = czDicValid\n}\n\nregisterRegion('cz', CzDicDetector)\n\nexport { CzDicDetector }\n","// Czech Bank Account Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { czBankAccountValid } from '../../validators'\n\nclass CzBankAccountDetector extends RegexDetector {\n entityType = EntityType.CZ_BANK_ACCOUNT\n score = 0.85\n contextKeywords = [\n 'ucet',\n '\\u00fa\\u010det',\n 'cislo uctu',\n '\\u010d\\u00edslo \\u00fa\\u010dtu',\n 'bank account',\n 'bankovni',\n 'bankovn\\u00ed',\n ]\n contextRequired = false\n\n pattern = /\\b(?:\\d{1,6}-)?\\d{2,10}\\/\\d{4}\\b/g\n validator = czBankAccountValid\n}\n\nregisterRegion('cz', CzBankAccountDetector)\n\nexport { CzBankAccountDetector }\n","// Czech PII detectors\nimport './birth-number'\nimport './ico'\nimport './dic'\nimport './bank-account'\n","// Russian INN (taxpayer identification number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ruInnChecksum } from '../../validators'\n\nclass RuInnDetector extends RegexDetector {\n entityType = EntityType.RU_INN\n score = 0.85\n contextKeywords = ['inn', '\\u0438\\u043d\\u043d', 'taxpayer', '\\u043d\\u0430\\u043b\\u043e\\u0433']\n contextRequired = true\n\n pattern = /\\b\\d{10}\\b|\\b\\d{12}\\b/g\n validator = ruInnChecksum\n}\n\nregisterRegion('ru', RuInnDetector)\n\nexport { RuInnDetector }\n","// Russian SNILS (insurance pension number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ruSnilsChecksum } from '../../validators'\n\nclass RuSnilsDetector extends RegexDetector {\n entityType = EntityType.RU_SNILS\n score = 0.85\n contextKeywords = [\n 'snils',\n '\\u0441\\u043d\\u0438\\u043b\\u0441',\n 'pension',\n '\\u043f\\u0435\\u043d\\u0441\\u0438\\u043e\\u043d',\n '\\u0441\\u0442\\u0440\\u0430\\u0445\\u043e\\u0432\\u043e\\u0435 \\u0441\\u0432\\u0438\\u0434\\u0435\\u0442\\u0435\\u043b\\u044c\\u0441\\u0442\\u0432\\u043e',\n ]\n contextRequired = true\n\n pattern = /\\b\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{2}\\b/g\n validator = ruSnilsChecksum\n}\n\nregisterRegion('ru', RuSnilsDetector)\n\nexport { RuSnilsDetector }\n","// Russian PII detectors\nimport './inn'\nimport './snils'\n","// Dutch BSN (Burgerservicenummer) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { nlBsn11test } from '../../validators'\n\nclass NlBsnDetector extends RegexDetector {\n entityType = EntityType.NL_BSN\n score = 0.85\n contextKeywords = ['bsn', 'burgerservicenummer', 'sofi', 'citizen service']\n contextRequired = true\n\n pattern = /\\b\\d{9}\\b/g\n validator = nlBsn11test\n}\n\nregisterRegion('nl', NlBsnDetector)\n\nexport { NlBsnDetector }\n","// Dutch PII detectors\nimport './bsn'\n","// Romanian CNP (Cod Numeric Personal) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { roCnpChecksum } from '../../validators'\n\nclass RoCnpDetector extends RegexDetector {\n entityType = EntityType.RO_CNP\n score = 0.9\n contextKeywords = ['cnp', 'cod numeric personal', 'personal numeric code']\n contextRequired = false\n\n pattern = /\\b[1-8]\\d{12}\\b/g\n validator = roCnpChecksum\n}\n\nregisterRegion('ro', RoCnpDetector)\n\nexport { RoCnpDetector }\n","// Romanian CUI (company identification number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { roCuiChecksum } from '../../validators'\n\nclass RoCuiDetector extends RegexDetector {\n entityType = EntityType.RO_CUI\n score = 0.85\n contextKeywords = ['cui', 'cod unic', 'cod de inregistrare', 'fiscal code', 'cif']\n contextRequired = true\n\n pattern = /\\b(?:RO)?\\d{2,10}\\b/gi\n validator = roCuiChecksum\n}\n\nregisterRegion('ro', RoCuiDetector)\n\nexport { RoCuiDetector }\n","// Romanian PII detectors\nimport './cnp'\nimport './cui'\n","// Slovak Birth Number (Rodne Cislo) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { skBirthNumberValid } from '../../validators'\n\nclass SkBirthNumberDetector extends RegexDetector {\n entityType = EntityType.SK_BIRTH_NUMBER\n score = 0.85\n contextKeywords = ['rodne cislo', 'birth number', 'rc', 'rodn\\u00e9 \\u010d\\u00edslo']\n contextRequired = false\n\n pattern = /\\b\\d{6}\\/?\\d{3,4}\\b/g\n validator = skBirthNumberValid\n}\n\nregisterRegion('sk', SkBirthNumberDetector)\n\nexport { SkBirthNumberDetector }\n","// Slovak ICO (company identification number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { skIcoChecksum } from '../../validators'\n\nclass SkIcoDetector extends RegexDetector {\n entityType = EntityType.SK_ICO\n score = 0.85\n contextKeywords = ['ico', 'ičo', 'identifikacne cislo', 'identifikačné číslo', 'company id', 'business id']\n contextRequired = true\n\n pattern = /\\b\\d{8}\\b/g\n validator = skIcoChecksum\n}\n\nregisterRegion('sk', SkIcoDetector)\n\nexport { SkIcoDetector }\n","// Slovak DIC (tax identification number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { skDicValid } from '../../validators'\n\nclass SkDicDetector extends RegexDetector {\n entityType = EntityType.SK_DIC\n score = 0.85\n contextKeywords = ['dic', 'dič', 'danove identifikacne cislo', 'daňové identifikačné číslo', 'vat', 'tax id']\n contextRequired = false\n\n pattern = /\\bSK\\d{10}\\b/gi\n validator = skDicValid\n}\n\nregisterRegion('sk', SkDicDetector)\n\nexport { SkDicDetector }\n","// Slovak PII detectors\nimport './birth-number'\nimport './ico'\nimport './dic'\n","// Danish CPR (Central Person Register) number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { dkCprValidDate } from '../../validators'\n\nclass DkCprDetector extends RegexDetector {\n entityType = EntityType.DK_CPR\n score = 0.85\n contextKeywords = ['cpr', 'personnummer', 'cpr-nummer', 'central person']\n contextRequired = true\n\n pattern = /\\b(?:0[1-9]|[12]\\d|3[01])(?:0[1-9]|1[0-2])\\d{2}[-\\s]?\\d{4}\\b/g\n validator = dkCprValidDate\n}\n\nregisterRegion('dk', DkCprDetector)\n\nexport { DkCprDetector }\n","// Danish CVR (company registration number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { dkCvrChecksum } from '../../validators'\n\nclass DkCvrDetector extends RegexDetector {\n entityType = EntityType.DK_CVR\n score = 0.85\n contextKeywords = ['cvr', 'virksomhed', 'erhvervsstyrelsen', 'company number', 'business id']\n contextRequired = true\n\n pattern = /\\b(?:DK)?\\d{8}\\b/gi\n validator = dkCvrChecksum\n}\n\nregisterRegion('dk', DkCvrDetector)\n\nexport { DkCvrDetector }\n","// Danish PII detectors\nimport './cpr'\nimport './cvr'\n","// Swedish Personnummer detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { sePersonnummerLuhn } from '../../validators'\n\nclass SePersonnummerDetector extends RegexDetector {\n entityType = EntityType.SE_PERSONNUMMER\n score = 0.9\n contextKeywords = ['personnummer', 'personal number', 'pnr']\n contextRequired = false\n\n pattern = /\\b(?:\\d{8}|\\d{6})[-+]?\\d{4}\\b/g\n validator = sePersonnummerLuhn\n}\n\nregisterRegion('se', SePersonnummerDetector)\n\nexport { SePersonnummerDetector }\n","// Swedish Organisationsnummer (organization number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { seOrgnrChecksum } from '../../validators'\n\nclass SeOrgnrDetector extends RegexDetector {\n entityType = EntityType.SE_ORGNR\n score = 0.85\n contextKeywords = ['organisationsnummer', 'orgnr', 'org nr', 'organization number', 'foretag']\n contextRequired = true\n\n pattern = /\\b\\d{6}-?\\d{4}\\b/g\n validator = seOrgnrChecksum\n}\n\nregisterRegion('se', SeOrgnrDetector)\n\nexport { SeOrgnrDetector }\n","// Swedish PII detectors\nimport './personnummer'\nimport './orgnr'\n","// Norwegian Birth Number (Fodselsnummer) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { noBirthNumberChecksum } from '../../validators'\n\nclass NoBirthNumberDetector extends RegexDetector {\n entityType = EntityType.NO_BIRTH_NUMBER\n score = 0.9\n contextKeywords = ['fodselsnummer', 'birth number', 'personnummer', 'f\\u00f8dselsnummer']\n contextRequired = false\n\n pattern = /\\b(?:0[1-9]|[12]\\d|3[01])(?:0[1-9]|1[0-2])\\d{7}\\b/g\n validator = noBirthNumberChecksum\n}\n\nregisterRegion('no', NoBirthNumberDetector)\n\nexport { NoBirthNumberDetector }\n","// Norwegian Organisasjonsnummer (organization number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { noOrgnrChecksum } from '../../validators'\n\nclass NoOrgnrDetector extends RegexDetector {\n entityType = EntityType.NO_ORGNR\n score = 0.85\n contextKeywords = ['organisasjonsnummer', 'orgnr', 'org nr', 'organization number', 'foretaksnummer']\n contextRequired = true\n\n pattern = /\\b\\d{9}\\b/g\n validator = noOrgnrChecksum\n}\n\nregisterRegion('no', NoOrgnrDetector)\n\nexport { NoOrgnrDetector }\n","// Norwegian PII detectors\nimport './birth-number'\nimport './orgnr'\n","// Brazilian CPF (Cadastro de Pessoa Fisica) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { brCpfChecksum } from '../../validators'\n\nclass BrCpfDetector extends RegexDetector {\n entityType = EntityType.BR_CPF\n score = 0.9\n contextKeywords = ['cpf', 'cadastro de pessoa']\n contextRequired = false\n\n pattern = /\\b\\d{3}\\.?\\d{3}\\.?\\d{3}[-.]?\\d{2}\\b/g\n validator = brCpfChecksum\n}\n\nregisterRegion('br', BrCpfDetector)\n\nexport { BrCpfDetector }\n","// Brazilian CNPJ (Cadastro Nacional de Pessoa Juridica) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { brCnpjChecksum } from '../../validators'\n\nclass BrCnpjDetector extends RegexDetector {\n entityType = EntityType.BR_CNPJ\n score = 0.9\n contextKeywords = ['cnpj', 'cadastro nacional']\n contextRequired = false\n\n pattern = /\\b\\d{2}\\.?\\d{3}\\.?\\d{3}\\/?\\d{4}[-.]?\\d{2}\\b/g\n validator = brCnpjChecksum\n}\n\nregisterRegion('br', BrCnpjDetector)\n\nexport { BrCnpjDetector }\n","// Brazilian PII detectors\nimport './cpf'\nimport './cnpj'\n","// Belgian National Number (Rijksregisternummer) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { beNationalNumberChecksum } from '../../validators'\n\nclass BeNationalNumberDetector extends RegexDetector {\n entityType = EntityType.BE_NATIONAL_NUMBER\n score = 0.85\n contextKeywords = [\n 'rijksregisternummer',\n 'national number',\n 'numero national',\n 'registre national',\n 'nn',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{2}[. ]?\\d{2}[. ]?\\d{2}[- ]?\\d{3}[. ]?\\d{2}\\b/g\n validator = beNationalNumberChecksum\n}\n\nregisterRegion('be', BeNationalNumberDetector)\n\nexport { BeNationalNumberDetector }\n","// Belgian Enterprise Number (BCE/KBO) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { beEnterpriseChecksum } from '../../validators'\n\nclass BeEnterpriseNumberDetector extends RegexDetector {\n entityType = EntityType.BE_ENTERPRISE_NUMBER\n score = 0.85\n contextKeywords = [\n 'bce',\n 'kbo',\n 'enterprise number',\n 'ondernemingsnummer',\n 'numero entreprise',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b[01]\\d{3}[. ]?\\d{3}[. ]?\\d{3}\\b/g\n validator = beEnterpriseChecksum\n}\n\nregisterRegion('be', BeEnterpriseNumberDetector)\n\nexport { BeEnterpriseNumberDetector }\n","// Belgian PII detectors\nimport './national-number'\nimport './enterprise-number'\n","// Austrian Social Insurance Number (SVNR) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { atSvnrChecksum } from '../../validators'\n\nclass AtSvnrDetector extends RegexDetector {\n entityType = EntityType.AT_SVNR\n score = 0.85\n contextKeywords = [\n 'svnr',\n 'sozialversicherungsnummer',\n 'versicherungsnummer',\n 'social insurance',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{4}[- ]?\\d{6}\\b/g\n validator = atSvnrChecksum\n}\n\nregisterRegion('at', AtSvnrDetector)\n\nexport { AtSvnrDetector }\n","// Austrian PII detectors\nimport './svnr'\n","// Irish Personal Public Service (PPS) Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { iePpsChecksum } from '../../validators'\n\nclass IePpsDetector extends RegexDetector {\n entityType = EntityType.IE_PPS\n score = 0.85\n contextKeywords = [\n 'pps',\n 'ppsn',\n 'personal public service',\n 'revenue',\n ]\n contextRequired = false\n contextWindow = 50\n\n pattern = /\\b\\d{7}[A-Z]{1,2}\\b/gi\n validator = iePpsChecksum\n}\n\nregisterRegion('ie', IePpsDetector)\n\nexport { IePpsDetector }\n","// Irish PII detectors\nimport './pps'\n","// Finnish Personal Identity Code (HETU) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { fiHetuChecksum } from '../../validators'\n\nclass FiHetuDetector extends RegexDetector {\n entityType = EntityType.FI_HETU\n score = 0.85\n contextKeywords = [\n 'henkilotunnus',\n 'hetu',\n 'personal identity code',\n 'sosiaaliturvatunnus',\n ]\n contextRequired = false\n\n pattern = /\\b\\d{6}[-+ABCDEFYXWVUabcdefyxwvu]\\d{3}[0-9A-Za-z]\\b/g\n validator = fiHetuChecksum\n}\n\nregisterRegion('fi', FiHetuDetector)\n\nexport { FiHetuDetector }\n","// Finnish Business ID (Y-tunnus) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { fiYtunnusChecksum } from '../../validators'\n\nclass FiYtunnusDetector extends RegexDetector {\n entityType = EntityType.FI_YTUNNUS\n score = 0.85\n contextKeywords = [\n 'y-tunnus',\n 'ytunnus',\n 'business id',\n 'yritystunnus',\n 'fo-nummer',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{7}-\\d\\b/g\n validator = fiYtunnusChecksum\n}\n\nregisterRegion('fi', FiYtunnusDetector)\n\nexport { FiYtunnusDetector }\n","// Finnish PII detectors\nimport './hetu'\nimport './ytunnus'\n","// Hungarian Tax ID detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { huTaxIdChecksum } from '../../validators'\n\nclass HuTaxIdDetector extends RegexDetector {\n entityType = EntityType.HU_TAX_ID\n score = 0.85\n contextKeywords = [\n 'adoazonosito',\n 'adószám',\n 'tax id',\n 'tax number',\n 'adoazonosito jel',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b8\\d{9}\\b/g\n validator = huTaxIdChecksum\n}\n\nregisterRegion('hu', HuTaxIdDetector)\n\nexport { HuTaxIdDetector }\n","// Hungarian Social Security Number (TAJ) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { huTajChecksum } from '../../validators'\n\nclass HuTajDetector extends RegexDetector {\n entityType = EntityType.HU_TAJ\n score = 0.85\n contextKeywords = [\n 'taj',\n 'tarsadalombiztositasi',\n 'social security',\n 'társadalombiztosítási',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{3}[- ]?\\d{3}[- ]?\\d{3}\\b/g\n validator = huTajChecksum\n}\n\nregisterRegion('hu', HuTajDetector)\n\nexport { HuTajDetector }\n","// Hungarian PII detectors\nimport './tax-id'\nimport './taj'\n","// Bulgarian Personal Number (EGN) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { bgEgnChecksum } from '../../validators'\n\nclass BgEgnDetector extends RegexDetector {\n entityType = EntityType.BG_EGN\n score = 0.85\n contextKeywords = [\n 'egn',\n 'егн',\n 'edinen grazhdanski nomer',\n 'personal number',\n 'civil number',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{10}\\b/g\n validator = bgEgnChecksum\n}\n\nregisterRegion('bg', BgEgnDetector)\n\nexport { BgEgnDetector }\n","// Bulgarian PII detectors\nimport './egn'\n","// Croatian Personal Identification Number (OIB) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { hrOibChecksum } from '../../validators'\n\nclass HrOibDetector extends RegexDetector {\n entityType = EntityType.HR_OIB\n score = 0.85\n contextKeywords = [\n 'oib',\n 'osobni identifikacijski broj',\n 'personal identification',\n 'identifikacijski',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{11}\\b/g\n validator = hrOibChecksum\n}\n\nregisterRegion('hr', HrOibDetector)\n\nexport { HrOibDetector }\n","// Croatian PII detectors\nimport './oib'\n","// Slovenian Personal Identification Number (EMSO) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { siEmsoChecksum } from '../../validators'\n\nclass SiEmsoDetector extends RegexDetector {\n entityType = EntityType.SI_EMSO\n score = 0.85\n contextKeywords = [\n 'emso',\n 'enotna maticna stevilka',\n 'maticna stevilka',\n 'personal number',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{13}\\b/g\n validator = siEmsoChecksum\n}\n\nregisterRegion('si', SiEmsoDetector)\n\nexport { SiEmsoDetector }\n","// Slovenian Tax Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { siTaxNumberChecksum } from '../../validators'\n\nclass SiTaxNumberDetector extends RegexDetector {\n entityType = EntityType.SI_TAX_NUMBER\n score = 0.85\n contextKeywords = [\n 'davcna stevilka',\n 'davcna',\n 'tax number',\n 'davčna številka',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b(?:SI)?\\d{8}\\b/gi\n validator = siTaxNumberChecksum\n}\n\nregisterRegion('si', SiTaxNumberDetector)\n\nexport { SiTaxNumberDetector }\n","// Slovenian PII detectors\nimport './emso'\nimport './tax-number'\n","// Lithuanian Personal Code (Asmens kodas) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { ltPersonalCodeChecksum } from '../../validators'\n\nclass LtPersonalCodeDetector extends RegexDetector {\n entityType = EntityType.LT_PERSONAL_CODE\n score = 0.85\n contextKeywords = [\n 'asmens kodas',\n 'personal code',\n 'asmens',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b[1-6]\\d{10}\\b/g\n validator = ltPersonalCodeChecksum\n}\n\nregisterRegion('lt', LtPersonalCodeDetector)\n\nexport { LtPersonalCodeDetector }\n","// Lithuanian PII detectors\nimport './personal-code'\n","// Latvian Personal Code (Personas kods) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { lvPersonalCodeChecksum } from '../../validators'\n\nclass LvPersonalCodeDetector extends RegexDetector {\n entityType = EntityType.LV_PERSONAL_CODE\n score = 0.85\n contextKeywords = [\n 'personas kods',\n 'personal code',\n 'personas',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b\\d{6}-?\\d{5}\\b/g\n validator = lvPersonalCodeChecksum\n}\n\nregisterRegion('lv', LvPersonalCodeDetector)\n\nexport { LvPersonalCodeDetector }\n","// Latvian PII detectors\nimport './personal-code'\n","// Estonian Personal Code (Isikukood) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { eePersonalCodeChecksum } from '../../validators'\n\nclass EePersonalCodeDetector extends RegexDetector {\n entityType = EntityType.EE_PERSONAL_CODE\n score = 0.85\n contextKeywords = [\n 'isikukood',\n 'personal code',\n 'identity code',\n ]\n contextRequired = true\n contextWindow = 50\n\n pattern = /\\b[1-6]\\d{10}\\b/g\n validator = eePersonalCodeChecksum\n}\n\nregisterRegion('ee', EePersonalCodeDetector)\n\nexport { EePersonalCodeDetector }\n","// Estonian PII detectors\nimport './personal-code'\n","// Canadian SIN (Social Insurance Number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { luhnChecksum } from '../../validators'\n\nclass CaSinDetector extends RegexDetector {\n entityType = EntityType.CA_SIN\n score = 0.85\n contextKeywords = ['sin', 'social insurance number', 'numero assurance sociale', 'nas']\n contextRequired = true\n\n pattern = /\\b\\d{3}[- ]?\\d{3}[- ]?\\d{3}\\b/g\n validator = luhnChecksum\n}\n\nregisterRegion('ca', CaSinDetector)\n\nexport { CaSinDetector }\n","// Canadian PII detectors\nimport './sin'\n","// Swiss AHV (Social Insurance Number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { chAhvChecksum } from '../../validators'\n\nclass ChAhvDetector extends RegexDetector {\n entityType = EntityType.CH_AHV\n score = 0.85\n contextKeywords = ['ahv', 'avs', 'oasi', 'sozialversicherungsnummer', 'ahv-nr']\n contextRequired = false\n\n // 756.XXXX.XXXX.XX format\n pattern = /\\b756[. ]?\\d{4}[. ]?\\d{4}[. ]?\\d{2}\\b/g\n validator = chAhvChecksum\n}\n\nregisterRegion('ch', ChAhvDetector)\n\nexport { ChAhvDetector }\n","// Swiss PII detectors\nimport './ahv'\n","// Australian TFN (Tax File Number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { auTfnChecksum } from '../../validators'\n\nclass AuTfnDetector extends RegexDetector {\n entityType = EntityType.AU_TFN\n score = 0.85\n contextKeywords = ['tfn', 'tax file number', 'tax file no']\n contextRequired = true\n\n // 8 or 9 digits with optional separators\n pattern = /\\b\\d{3}[- ]?\\d{3}[- ]?\\d{2,3}\\b/g\n validator = auTfnChecksum\n}\n\nregisterRegion('au', AuTfnDetector)\n\nexport { AuTfnDetector }\n","// Australian Medicare Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { auMedicareChecksum } from '../../validators'\n\nclass AuMedicareDetector extends RegexDetector {\n entityType = EntityType.AU_MEDICARE\n score = 0.85\n contextKeywords = ['medicare', 'medicare card', 'medicare number']\n contextRequired = true\n\n // 10-11 digits: XXXX-XXXXX-X-X\n pattern = /\\b\\d{4}[- ]?\\d{5}[- ]?\\d[- ]?\\d?\\b/g\n validator = auMedicareChecksum\n}\n\nregisterRegion('au', AuMedicareDetector)\n\nexport { AuMedicareDetector }\n","// Australian PII detectors\nimport './tfn'\nimport './medicare'\n","// New Zealand IRD (Inland Revenue Department) Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { nzIrdChecksum } from '../../validators'\n\nclass NzIrdDetector extends RegexDetector {\n entityType = EntityType.NZ_IRD\n score = 0.85\n contextKeywords = ['ird', 'inland revenue', 'tax number', 'ird number']\n contextRequired = true\n\n // 8-9 digits with optional separators\n pattern = /\\b\\d{2,3}[- ]?\\d{3}[- ]?\\d{3}\\b/g\n validator = nzIrdChecksum\n}\n\nregisterRegion('nz', NzIrdDetector)\n\nexport { NzIrdDetector }\n","// New Zealand PII detectors\nimport './ird'\n","// Indian Aadhaar Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { inAadhaarChecksum } from '../../validators'\n\nclass InAadhaarDetector extends RegexDetector {\n entityType = EntityType.IN_AADHAAR\n score = 0.85\n contextKeywords = ['aadhaar', 'aadhar', 'uidai', 'unique identification']\n contextRequired = true\n\n // 12 digits starting with 2-9, with optional separators\n pattern = /\\b[2-9]\\d{3}[- ]?\\d{4}[- ]?\\d{4}\\b/g\n validator = inAadhaarChecksum\n}\n\nregisterRegion('in', InAadhaarDetector)\n\nexport { InAadhaarDetector }\n","// Indian PAN (Permanent Account Number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { inPanValid } from '../../validators'\n\nclass InPanDetector extends RegexDetector {\n entityType = EntityType.IN_PAN\n score = 0.85\n contextKeywords = ['pan', 'permanent account number', 'income tax', 'pan card']\n contextRequired = false\n\n // AAAAA0000A format\n pattern = /\\b[A-Z]{3}[ABCFGHLJPT][A-Z]\\d{4}[A-Z]\\b/gi\n validator = inPanValid\n}\n\nregisterRegion('in', InPanDetector)\n\nexport { InPanDetector }\n","// Indian PII detectors\nimport './aadhaar'\nimport './pan'\n","// Japanese My Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { jpMyNumberChecksum } from '../../validators'\n\nclass JpMyNumberDetector extends RegexDetector {\n entityType = EntityType.JP_MY_NUMBER\n score = 0.85\n contextKeywords = ['my number', '\\u30DE\\u30A4\\u30CA\\u30F3\\u30D0\\u30FC', 'kojin bango', 'individual number']\n contextRequired = true\n\n // 12 digits with optional separators\n pattern = /\\b\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g\n validator = jpMyNumberChecksum\n}\n\nregisterRegion('jp', JpMyNumberDetector)\n\nexport { JpMyNumberDetector }\n","// Japanese PII detectors\nimport './my-number'\n","// South Korean RRN (Resident Registration Number) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { krRrnChecksum } from '../../validators'\n\nclass KrRrnDetector extends RegexDetector {\n entityType = EntityType.KR_RRN\n score = 0.85\n contextKeywords = ['\\uC8FC\\uBBFC\\uB4F1\\uB85D\\uBC88\\uD638', 'resident registration', 'jumin', 'rrn']\n contextRequired = true\n\n // 13 digits: YYMMDD-NNNNNNN\n pattern = /\\b\\d{6}[- ]?\\d{7}\\b/g\n validator = krRrnChecksum\n}\n\nregisterRegion('kr', KrRrnDetector)\n\nexport { KrRrnDetector }\n","// South Korean PII detectors\nimport './rrn'\n","// South African ID Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { luhnChecksum } from '../../validators'\n\nclass ZaIdDetector extends RegexDetector {\n entityType = EntityType.ZA_ID\n score = 0.85\n contextKeywords = ['id number', 'identity number', 'south african id', 'sa id']\n contextRequired = true\n\n // 13 digits\n pattern = /\\b\\d{13}\\b/g\n validator = luhnChecksum\n}\n\nregisterRegion('za', ZaIdDetector)\n\nexport { ZaIdDetector }\n","// South African PII detectors\nimport './id'\n","// Turkish Kimlik (National ID) Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { trKimlikChecksum } from '../../validators'\n\nclass TrKimlikDetector extends RegexDetector {\n entityType = EntityType.TR_KIMLIK\n score = 0.85\n contextKeywords = ['tc kimlik', 'kimlik no', 'tckn', 'vatandas', 'nufus']\n contextRequired = true\n\n // 11 digits, first digit non-zero\n pattern = /\\b[1-9]\\d{10}\\b/g\n validator = trKimlikChecksum\n}\n\nregisterRegion('tr', TrKimlikDetector)\n\nexport { TrKimlikDetector }\n","// Turkish PII detectors\nimport './kimlik'\n","// Israeli ID Number detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { luhnChecksum } from '../../validators'\n\nclass IlIdDetector extends RegexDetector {\n entityType = EntityType.IL_ID\n score = 0.85\n contextKeywords = ['teudat zehut', 'mispar zehut', 'identity number', '\\u05EA.\\u05D6', 'tz']\n contextRequired = true\n\n // 9 digits\n pattern = /\\b\\d{9}\\b/g\n validator = luhnChecksum\n}\n\nregisterRegion('il', IlIdDetector)\n\nexport { IlIdDetector }\n","// Israeli PII detectors\nimport './id'\n","// Argentine CUIT (Clave Unica de Identificacion Tributaria) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { arCuitChecksum } from '../../validators'\n\nclass ArCuitDetector extends RegexDetector {\n entityType = EntityType.AR_CUIT\n score = 0.85\n contextKeywords = ['cuit', 'cuil', 'clave unica', 'identificacion tributaria']\n contextRequired = true\n\n // XX-XXXXXXXX-X format\n pattern = /\\b\\d{2}-?\\d{8}-?\\d\\b/g\n validator = arCuitChecksum\n}\n\nregisterRegion('ar', ArCuitDetector)\n\nexport { ArCuitDetector }\n","// Argentine PII detectors\nimport './cuit'\n","// Chilean RUT (Rol Unico Tributario) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { clRutChecksum } from '../../validators'\n\nclass ClRutDetector extends RegexDetector {\n entityType = EntityType.CL_RUT\n score = 0.85\n contextKeywords = ['rut', 'run', 'rol unico tributario', 'rol unico nacional']\n contextRequired = true\n\n // XX.XXX.XXX-X format (check digit can be 0-9 or K)\n pattern = /\\b\\d{1,2}\\.?\\d{3}\\.?\\d{3}-?[\\dkK]\\b/g\n validator = clRutChecksum\n}\n\nregisterRegion('cl', ClRutDetector)\n\nexport { ClRutDetector }\n","// Chilean PII detectors\nimport './rut'\n","// Colombian NIT (Numero de Identificacion Tributaria) detector\n\nimport { RegexDetector } from '../../base'\nimport { EntityType } from '../../entities'\nimport { registerRegion } from '../../registry'\nimport { coNitChecksum } from '../../validators'\n\nclass CoNitDetector extends RegexDetector {\n entityType = EntityType.CO_NIT\n score = 0.85\n contextKeywords = ['nit', 'numero de identificacion tributaria', 'identificacion tributaria']\n contextRequired = true\n\n // XXX.XXX.XXX-X format\n pattern = /\\b\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d\\b/g\n validator = coNitChecksum\n}\n\nregisterRegion('co', CoNitDetector)\n\nexport { CoNitDetector }\n","// Colombian PII detectors\nimport './nit'\n","// Auto-import all detector modules so they register with the registry.\nimport './email'\nimport './credit-card'\nimport './phone'\nimport './ip-address'\nimport './url'\nimport './mac-address'\nimport './date-of-birth'\nimport './cvv'\nimport './us/index'\nimport './eu/index'\nimport './uk/index'\nimport './de/index'\nimport './fr/index'\nimport './es/index'\nimport './it/index'\nimport './pt/index'\nimport './pl/index'\nimport './cz/index'\nimport './ru/index'\nimport './nl/index'\nimport './ro/index'\nimport './sk/index'\nimport './dk/index'\nimport './se/index'\nimport './no/index'\nimport './br/index'\nimport './be/index'\nimport './at/index'\nimport './ie/index'\nimport './fi/index'\nimport './hu/index'\nimport './bg/index'\nimport './hr/index'\nimport './si/index'\nimport './lt/index'\nimport './lv/index'\nimport './ee/index'\nimport './ca/index'\nimport './ch/index'\nimport './au/index'\nimport './nz/index'\nimport './in/index'\nimport './jp/index'\nimport './kr/index'\nimport './za/index'\nimport './tr/index'\nimport './il/index'\nimport './ar/index'\nimport './cl/index'\nimport './co/index'\n","// PIIScanner: orchestrates detectors, deduplicates results, produces output\n\nimport * as crypto from 'crypto'\nimport { EntityType, PIIMatch } from './entities'\nimport { DetectorRegistry } from './registry'\nimport { synthesizeValue } from './synthesizers'\n\n// Force import of all detectors so they auto-register\nimport './detectors/index'\n\nexport interface PIIScannerOptions {\n /** List of locale codes to enable (default: [\"us\"]). */\n locales?: string[]\n}\n\nexport interface TokenizeResult {\n text: string\n mapping: Record<string, string>\n matches: PIIMatch[]\n}\n\nexport interface MaskResult {\n text: string\n matches: PIIMatch[]\n}\n\nexport interface HashResult {\n text: string\n matches: PIIMatch[]\n}\n\nexport interface EncryptResult {\n text: string\n matches: PIIMatch[]\n}\n\nexport interface SynthesizeResult {\n text: string\n matches: PIIMatch[]\n}\n\n/**\n * Local regex-based PII scanner.\n *\n * Usage:\n * const scanner = new PIIScanner({ locales: ['us', 'eu'] })\n * const matches = scanner.detect('Email john@acme.com, SSN 123-45-6789')\n * const [redacted, matches] = scanner.redact('Email john@acme.com')\n */\nexport class PIIScanner {\n private registry: DetectorRegistry\n\n constructor(options?: PIIScannerOptions) {\n this.registry = new DetectorRegistry(options?.locales)\n }\n\n /** Detect PII entities in text and return deduplicated matches. */\n detect(text: string, entities?: string[]): PIIMatch[] {\n let detectors = this.registry.detectors\n if (entities) {\n const entitySet = new Set(entities)\n detectors = detectors.filter((d) => entitySet.has(d.entityType))\n }\n const hasDigit = /\\d/.test(text)\n const textLower = text.toLowerCase()\n const allMatches: PIIMatch[] = []\n for (const detector of detectors) {\n if (detector.needsDigit && !hasDigit) {\n continue\n }\n ;(detector as any)._textLower = textLower\n allMatches.push(...detector.iterMatches(text))\n ;(detector as any)._textLower = null\n }\n return this.deduplicate(allMatches)\n }\n\n /**\n * Detect and remove PII from text.\n * Returns a tuple of [redactedText, detectedMatches].\n */\n redact(text: string, entities?: string[]): [string, PIIMatch[]] {\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return [text, []]\n }\n\n // Sort by start position descending so replacements do not shift indices\n const sortedMatches = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedMatches) {\n // Also consume a preceding space to keep output clean\n const start = m.start > 0 && result[m.start - 1] === ' ' ? m.start - 1 : m.start\n result = result.slice(0, start) + result.slice(m.end)\n }\n\n return [result, matches]\n }\n\n /**\n * Detect PII and replace with numbered tokens like `<Email Address_1>`.\n * Returns tokenized text, a mapping from tokens to original values, and matches.\n */\n tokenize(text: string, entities?: string[]): TokenizeResult {\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return { text, mapping: {}, matches: [] }\n }\n\n // Assign per-type counters in reading order (ascending start position)\n const sortedAsc = [...matches].sort((a, b) => a.start - b.start)\n const counters: Record<string, number> = {}\n const tokenMap: Map<PIIMatch, string> = new Map()\n const mapping: Record<string, string> = {}\n\n for (const m of sortedAsc) {\n const count = (counters[m.entityType] ?? 0) + 1\n counters[m.entityType] = count\n const token = `<${m.entityType}_${count}>`\n tokenMap.set(m, token)\n mapping[token] = m.text\n }\n\n // Replace in descending position order\n const sortedDesc = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedDesc) {\n const token = tokenMap.get(m)!\n result = result.slice(0, m.start) + token + result.slice(m.end)\n }\n\n return { text: result, mapping, matches }\n }\n\n /**\n * Detect PII and partially mask each match.\n */\n mask(\n text: string,\n charsToShow: number = 3,\n fromEnd: boolean = false,\n maskingChar: string = '*',\n entities?: string[]\n ): MaskResult {\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return { text, matches: [] }\n }\n\n const sortedMatches = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedMatches) {\n const original = m.text\n const show = Math.min(charsToShow, original.length)\n const maskLen = original.length - show\n let masked: string\n if (fromEnd) {\n masked = maskingChar.repeat(maskLen) + original.slice(maskLen)\n } else {\n masked = original.slice(0, show) + maskingChar.repeat(maskLen)\n }\n result = result.slice(0, m.start) + masked + result.slice(m.end)\n }\n\n return { text: result, matches }\n }\n\n /**\n * Detect PII and replace each match with a deterministic hash.\n */\n hash(\n text: string,\n hashType: string = 'sha256',\n hashPrefix: string = 'HASH_',\n hashLength: number = 16,\n entities?: string[]\n ): HashResult {\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return { text, matches: [] }\n }\n\n const sortedMatches = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedMatches) {\n const digest = crypto.createHash(hashType).update(m.text).digest('hex')\n const truncated = digest.slice(0, hashLength)\n const replacement = hashPrefix + truncated\n result = result.slice(0, m.start) + replacement + result.slice(m.end)\n }\n\n return { text: result, matches }\n }\n\n /**\n * Detect PII and encrypt each match with AES-256-CBC.\n * @param encryptionKey - Required, minimum 16 characters.\n */\n encrypt(text: string, encryptionKey: string, entities?: string[]): EncryptResult {\n if (!encryptionKey || encryptionKey.length < 16) {\n throw new Error('encryptionKey is required and must be at least 16 characters for local encryption')\n }\n\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return { text, matches: [] }\n }\n\n // Derive a 32-byte key from the provided key using SHA-256\n const derivedKey = crypto.createHash('sha256').update(encryptionKey).digest()\n\n const sortedMatches = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedMatches) {\n const iv = crypto.randomBytes(16)\n const cipher = crypto.createCipheriv('aes-256-cbc', derivedKey, iv)\n const encrypted = Buffer.concat([cipher.update(m.text, 'utf8'), cipher.final()])\n const combined = Buffer.concat([iv, encrypted])\n const replacement = combined.toString('base64')\n result = result.slice(0, m.start) + replacement + result.slice(m.end)\n }\n\n return { text: result, matches }\n }\n\n /**\n * Detect PII and replace each match with format-preserving synthetic data.\n * @param _language - Accepted for API compatibility but ignored locally.\n */\n synthesize(text: string, _language?: string, entities?: string[]): SynthesizeResult {\n const matches = this.detect(text, entities)\n if (matches.length === 0) {\n return { text, matches: [] }\n }\n\n const sortedMatches = [...matches].sort((a, b) => b.start - a.start)\n let result = text\n for (const m of sortedMatches) {\n const replacement = synthesizeValue(m.entityType, m.text)\n result = result.slice(0, m.start) + replacement + result.slice(m.end)\n }\n\n return { text: result, matches }\n }\n\n /** Remove overlapping matches, preferring higher score then longer span. */\n private deduplicate(matches: PIIMatch[]): PIIMatch[] {\n if (matches.length === 0) {\n return []\n }\n // Sort by start ascending, then by score descending, then span length descending\n matches.sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start\n if (a.score !== b.score) return b.score - a.score\n return b.end - b.start - (a.end - a.start)\n })\n const result: PIIMatch[] = []\n let lastEnd = -1\n for (const m of matches) {\n if (m.start >= lastEnd) {\n result.push(m)\n lastEnd = m.end\n }\n }\n return result\n }\n}\n","export { PIIScanner } from './scanner'\nexport type { PIIScannerOptions } from './scanner'\nexport { EntityType } from './entities'\nexport type { PIIMatch } from './entities'\n"],"mappings":"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"}
|