@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.
@@ -0,0 +1,4839 @@
1
+ import * as crypto from "crypto";
2
+
3
+ //#region rolldown:runtime
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all) __defProp(target, name, {
13
+ get: all[name],
14
+ enumerable: true
15
+ });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
19
+ key = keys[i];
20
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
21
+ get: ((k) => from[k]).bind(null, key),
22
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
23
+ });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ //#endregion
30
+ //#region src/regex/registry.ts
31
+ /** Register a universal (locale-independent) detector class. */
32
+ function registerUniversal(cls) {
33
+ UNIVERSAL_DETECTORS.push(cls);
34
+ }
35
+ /** Register a region-specific detector class. */
36
+ function registerRegion(locale, cls) {
37
+ if (!REGION_DETECTORS[locale]) REGION_DETECTORS[locale] = [];
38
+ REGION_DETECTORS[locale].push(cls);
39
+ }
40
+ var UNIVERSAL_DETECTORS, REGION_DETECTORS, DetectorRegistry;
41
+ var init_registry = __esm({ "src/regex/registry.ts"() {
42
+ UNIVERSAL_DETECTORS = [];
43
+ REGION_DETECTORS = {
44
+ us: [],
45
+ eu: [],
46
+ uk: []
47
+ };
48
+ DetectorRegistry = class {
49
+ _detectors = [];
50
+ constructor(locales) {
51
+ const resolvedLocales = (locales ?? ["us"]).map((loc) => loc.toLowerCase());
52
+ this._build(resolvedLocales);
53
+ }
54
+ _build(locales) {
55
+ for (const Cls of UNIVERSAL_DETECTORS) this._detectors.push(new Cls());
56
+ for (const locale of locales) {
57
+ const regionClasses = REGION_DETECTORS[locale] ?? [];
58
+ for (const Cls of regionClasses) this._detectors.push(new Cls());
59
+ }
60
+ }
61
+ get detectors() {
62
+ return this._detectors;
63
+ }
64
+ };
65
+ } });
66
+
67
+ //#endregion
68
+ //#region src/regex/synthesizers.ts
69
+ function randInt(min, max) {
70
+ return Math.floor(Math.random() * (max - min + 1)) + min;
71
+ }
72
+ function randChar(chars) {
73
+ return chars[Math.floor(Math.random() * chars.length)];
74
+ }
75
+ function randHex(len) {
76
+ let result = "";
77
+ for (let i = 0; i < len; i++) result += randChar("0123456789abcdef");
78
+ return result;
79
+ }
80
+ /**
81
+ * Format-preserving default: replace digits with random digits,
82
+ * uppercase with random uppercase, lowercase with random lowercase,
83
+ * keep everything else (separators, symbols) intact.
84
+ */
85
+ function formatPreserving(original) {
86
+ const chars = [];
87
+ for (const ch of original) if (ch >= "0" && ch <= "9") chars.push(randChar(DIGITS));
88
+ else if (ch >= "A" && ch <= "Z") chars.push(randChar(UPPER));
89
+ else if (ch >= "a" && ch <= "z") chars.push(randChar(LOWER));
90
+ else chars.push(ch);
91
+ const result = chars.join("");
92
+ if (result === original) return formatPreserving(original);
93
+ return result;
94
+ }
95
+ function synthesizeEmail() {
96
+ const id = randHex(8);
97
+ return `user${id}@example.com`;
98
+ }
99
+ function synthesizeUrl() {
100
+ const path = randHex(10);
101
+ return `https://example.com/${path}`;
102
+ }
103
+ function synthesizeIp() {
104
+ const a = randInt(1, 254);
105
+ const b = randInt(0, 255);
106
+ const c = randInt(0, 255);
107
+ const d = randInt(1, 254);
108
+ return `${a}.${b}.${c}.${d}`;
109
+ }
110
+ /**
111
+ * Generate a credit card number with valid Luhn checksum,
112
+ * preserving the separator pattern of the original.
113
+ */
114
+ function synthesizeCreditCard(original) {
115
+ const digitsOnly = original.replace(/\D/g, "");
116
+ const numDigits = digitsOnly.length;
117
+ const payload = [];
118
+ for (let i = 0; i < numDigits - 1; i++) payload.push(randInt(0, 9));
119
+ let sum = 0;
120
+ for (let i = payload.length - 1; i >= 0; i--) {
121
+ let d = payload[i];
122
+ if ((payload.length - 1 - i) % 2 === 0) {
123
+ d *= 2;
124
+ if (d > 9) d -= 9;
125
+ }
126
+ sum += d;
127
+ }
128
+ const checkDigit = (10 - sum % 10) % 10;
129
+ payload.push(checkDigit);
130
+ let digitIdx = 0;
131
+ let result = "";
132
+ for (const ch of original) if (ch >= "0" && ch <= "9") result += payload[digitIdx++];
133
+ else result += ch;
134
+ return result;
135
+ }
136
+ /**
137
+ * Generate an IBAN-like value preserving length with a valid mod-97 check.
138
+ */
139
+ function synthesizeIban(original) {
140
+ const stripped = original.replace(/\s/g, "");
141
+ const len = stripped.length;
142
+ if (len < 5) return formatPreserving(original);
143
+ const bbanLen = len - 4;
144
+ let bban = "";
145
+ for (let i = 0; i < bbanLen; i++) bban += randChar(DIGITS);
146
+ const numericStr = bban + "333300";
147
+ let remainder = 0;
148
+ for (const ch of numericStr) remainder = (remainder * 10 + parseInt(ch, 10)) % 97;
149
+ const checkDigits = (98 - remainder).toString().padStart(2, "0");
150
+ const iban = "XX" + checkDigits + bban;
151
+ if (original.includes(" ")) {
152
+ let spaceIdx = 0;
153
+ let result = "";
154
+ for (const ch of original) if (ch === " ") result += " ";
155
+ else result += iban[spaceIdx++] || "0";
156
+ return result;
157
+ }
158
+ return iban;
159
+ }
160
+ /**
161
+ * Generate a synthetic replacement for a detected PII value.
162
+ * Uses format-preserving random by default, with specific generators
163
+ * for types where structural validity matters.
164
+ */
165
+ function synthesizeValue(entityType, originalText) {
166
+ switch (entityType) {
167
+ case "Email Address": return synthesizeEmail();
168
+ case "URL": return synthesizeUrl();
169
+ case "IP Address": return synthesizeIp();
170
+ case "Credit Card Number": return synthesizeCreditCard(originalText);
171
+ case "IBAN": return synthesizeIban(originalText);
172
+ default: return formatPreserving(originalText);
173
+ }
174
+ }
175
+ var UPPER, LOWER, DIGITS;
176
+ var init_synthesizers = __esm({ "src/regex/synthesizers.ts"() {
177
+ UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
178
+ LOWER = "abcdefghijklmnopqrstuvwxyz";
179
+ DIGITS = "0123456789";
180
+ } });
181
+
182
+ //#endregion
183
+ //#region src/regex/base.ts
184
+ var Detector, RegexDetector;
185
+ var init_base = __esm({ "src/regex/base.ts"() {
186
+ Detector = class {
187
+ score = .85;
188
+ baseScore = null;
189
+ contextKeywords = [];
190
+ contextRequired = false;
191
+ contextWindow = 50;
192
+ locale = "";
193
+ needsDigit = true;
194
+ /** Check if any context keyword appears near the match position. */
195
+ hasContext(text, start, end = 0) {
196
+ if (this.contextKeywords.length === 0) return true;
197
+ const lower = this._textLower || text.toLowerCase();
198
+ const windowStart = Math.max(0, start - this.contextWindow);
199
+ const before = lower.slice(windowStart, start);
200
+ const after = end ? lower.slice(end, end + this.contextWindow) : "";
201
+ const window = before + " " + after;
202
+ return this.contextKeywords.some((kw) => window.includes(kw));
203
+ }
204
+ };
205
+ RegexDetector = class extends Detector {
206
+ validator;
207
+ /** Optional fast pre-check before running regex. Override in subclasses. */
208
+ preCheck(_text) {
209
+ return true;
210
+ }
211
+ iterMatches(text) {
212
+ if (!this.preCheck(text)) return [];
213
+ const results = [];
214
+ this.pattern.lastIndex = 0;
215
+ let match;
216
+ while ((match = this.pattern.exec(text)) !== null) {
217
+ const matchedText = match[0];
218
+ const start = match.index;
219
+ const end = start + matchedText.length;
220
+ const hasCtx = this.hasContext(text, start, end);
221
+ if (this.contextRequired && !hasCtx) continue;
222
+ let score;
223
+ if (this.validator) {
224
+ if (!this.validator(matchedText)) continue;
225
+ score = hasCtx ? 1 : this.score;
226
+ } else if (hasCtx) score = this.score;
227
+ else score = this.baseScore !== null ? this.baseScore : this.score;
228
+ results.push({
229
+ entityType: this.entityType,
230
+ text: matchedText,
231
+ start,
232
+ end,
233
+ score
234
+ });
235
+ }
236
+ return results;
237
+ }
238
+ };
239
+ } });
240
+
241
+ //#endregion
242
+ //#region src/regex/entities.ts
243
+ var EntityType;
244
+ var init_entities = __esm({ "src/regex/entities.ts"() {
245
+ EntityType = /* @__PURE__ */ function(EntityType$1) {
246
+ EntityType$1["EMAIL_ADDRESS"] = "Email Address";
247
+ EntityType$1["CREDIT_CARD"] = "Credit Card Number";
248
+ EntityType$1["PHONE_NUMBER"] = "Phone Number";
249
+ EntityType$1["IP_ADDRESS"] = "IP Address";
250
+ EntityType$1["URL"] = "URL";
251
+ EntityType$1["MAC_ADDRESS"] = "MAC Address";
252
+ EntityType$1["DATE_OF_BIRTH"] = "Date of Birth";
253
+ EntityType$1["CVV"] = "CVV";
254
+ EntityType$1["SSN"] = "Social Security Number";
255
+ EntityType$1["DRIVERS_LICENSE"] = "Driver's License";
256
+ EntityType$1["US_PASSPORT"] = "US Passport";
257
+ EntityType$1["TAX_ID"] = "Tax ID";
258
+ EntityType$1["ZIP_CODE"] = "ZIP Code";
259
+ EntityType$1["IBAN"] = "IBAN";
260
+ EntityType$1["EU_POSTAL_CODE"] = "Postal Code";
261
+ EntityType$1["VAT_ID"] = "VAT ID";
262
+ EntityType$1["NI_NUMBER"] = "NI Number";
263
+ EntityType$1["NHS_NUMBER"] = "NHS Number";
264
+ EntityType$1["UK_POSTCODE"] = "UK Postcode";
265
+ EntityType$1["UK_PASSPORT"] = "UK Passport";
266
+ EntityType$1["DE_PERSONAL_ID"] = "German Personal ID";
267
+ EntityType$1["DE_TAX_ID"] = "German Tax ID";
268
+ EntityType$1["FR_NATIONAL_ID"] = "French National ID";
269
+ EntityType$1["ES_DNI"] = "Spanish DNI";
270
+ EntityType$1["ES_NIE"] = "Spanish NIE";
271
+ EntityType$1["IT_CODICE_FISCALE"] = "Italian Codice Fiscale";
272
+ EntityType$1["PT_NIF"] = "Portuguese NIF";
273
+ EntityType$1["PL_PESEL"] = "Polish PESEL";
274
+ EntityType$1["PL_NIP"] = "Polish NIP";
275
+ EntityType$1["CZ_BIRTH_NUMBER"] = "Czech Birth Number";
276
+ EntityType$1["CZ_ICO"] = "Czech ICO";
277
+ EntityType$1["CZ_DIC"] = "Czech DIC";
278
+ EntityType$1["CZ_BANK_ACCOUNT"] = "Czech Bank Account";
279
+ EntityType$1["RU_INN"] = "Russian INN";
280
+ EntityType$1["RU_SNILS"] = "Russian SNILS";
281
+ EntityType$1["NL_BSN"] = "Dutch BSN";
282
+ EntityType$1["RO_CNP"] = "Romanian CNP";
283
+ EntityType$1["SK_BIRTH_NUMBER"] = "Slovak Birth Number";
284
+ EntityType$1["DK_CPR"] = "Danish CPR";
285
+ EntityType$1["SE_PERSONNUMMER"] = "Swedish Personnummer";
286
+ EntityType$1["NO_BIRTH_NUMBER"] = "Norwegian Birth Number";
287
+ EntityType$1["BR_CPF"] = "Brazilian CPF";
288
+ EntityType$1["BR_CNPJ"] = "Brazilian CNPJ";
289
+ EntityType$1["US_ITIN"] = "US ITIN";
290
+ EntityType$1["UK_UTR"] = "UK UTR";
291
+ EntityType$1["FR_SIREN"] = "French SIREN";
292
+ EntityType$1["ES_NSS"] = "Spanish NSS";
293
+ EntityType$1["ES_CIF"] = "Spanish CIF";
294
+ EntityType$1["IT_PARTITA_IVA"] = "Italian Partita IVA";
295
+ EntityType$1["PL_REGON"] = "Polish REGON";
296
+ EntityType$1["SK_ICO"] = "Slovak ICO";
297
+ EntityType$1["SK_DIC"] = "Slovak DIC";
298
+ EntityType$1["RO_CUI"] = "Romanian CUI";
299
+ EntityType$1["DK_CVR"] = "Danish CVR";
300
+ EntityType$1["SE_ORGNR"] = "Swedish Organisationsnummer";
301
+ EntityType$1["NO_ORGNR"] = "Norwegian Organisasjonsnummer";
302
+ EntityType$1["BE_NATIONAL_NUMBER"] = "Belgian National Number";
303
+ EntityType$1["BE_ENTERPRISE_NUMBER"] = "Belgian Enterprise Number";
304
+ EntityType$1["AT_SVNR"] = "Austrian SVNR";
305
+ EntityType$1["IE_PPS"] = "Irish PPS Number";
306
+ EntityType$1["FI_HETU"] = "Finnish HETU";
307
+ EntityType$1["FI_YTUNNUS"] = "Finnish Y-tunnus";
308
+ EntityType$1["HU_TAX_ID"] = "Hungarian Tax ID";
309
+ EntityType$1["HU_TAJ"] = "Hungarian TAJ";
310
+ EntityType$1["BG_EGN"] = "Bulgarian EGN";
311
+ EntityType$1["HR_OIB"] = "Croatian OIB";
312
+ EntityType$1["SI_EMSO"] = "Slovenian EMSO";
313
+ EntityType$1["SI_TAX_NUMBER"] = "Slovenian Tax Number";
314
+ EntityType$1["LT_PERSONAL_CODE"] = "Lithuanian Personal Code";
315
+ EntityType$1["LV_PERSONAL_CODE"] = "Latvian Personal Code";
316
+ EntityType$1["EE_PERSONAL_CODE"] = "Estonian Personal Code";
317
+ EntityType$1["CA_SIN"] = "Canadian SIN";
318
+ EntityType$1["CH_AHV"] = "Swiss AHV";
319
+ EntityType$1["AU_TFN"] = "Australian TFN";
320
+ EntityType$1["AU_MEDICARE"] = "Australian Medicare";
321
+ EntityType$1["NZ_IRD"] = "New Zealand IRD";
322
+ EntityType$1["IN_AADHAAR"] = "Indian Aadhaar";
323
+ EntityType$1["IN_PAN"] = "Indian PAN";
324
+ EntityType$1["JP_MY_NUMBER"] = "Japanese My Number";
325
+ EntityType$1["KR_RRN"] = "Korean RRN";
326
+ EntityType$1["ZA_ID"] = "South African ID";
327
+ EntityType$1["TR_KIMLIK"] = "Turkish Kimlik";
328
+ EntityType$1["IL_ID"] = "Israeli ID";
329
+ EntityType$1["AR_CUIT"] = "Argentine CUIT";
330
+ EntityType$1["CL_RUT"] = "Chilean RUT";
331
+ EntityType$1["CO_NIT"] = "Colombian NIT";
332
+ return EntityType$1;
333
+ }({});
334
+ } });
335
+
336
+ //#endregion
337
+ //#region src/regex/detectors/email.ts
338
+ var EmailDetector;
339
+ var init_email = __esm({ "src/regex/detectors/email.ts"() {
340
+ init_base();
341
+ init_entities();
342
+ init_registry();
343
+ EmailDetector = class extends RegexDetector {
344
+ entityType = EntityType.EMAIL_ADDRESS;
345
+ score = .95;
346
+ needsDigit = false;
347
+ pattern = /\b[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}\b/g;
348
+ preCheck(text) {
349
+ return text.includes("@");
350
+ }
351
+ };
352
+ registerUniversal(EmailDetector);
353
+ } });
354
+
355
+ //#endregion
356
+ //#region src/regex/validators.ts
357
+ /** Validate a number string using the Luhn algorithm (ISO/IEC 7812). */
358
+ function luhnChecksum(number) {
359
+ const digits = [];
360
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
361
+ if (digits.length < 2) return false;
362
+ let total = 0;
363
+ const reversed = digits.slice().reverse();
364
+ for (let i = 0; i < reversed.length; i++) {
365
+ let d = reversed[i];
366
+ if (i % 2 === 1) {
367
+ d *= 2;
368
+ if (d > 9) d -= 9;
369
+ }
370
+ total += d;
371
+ }
372
+ return total % 10 === 0;
373
+ }
374
+ /** Validate IBAN using ISO 7064 mod-97 checksum. */
375
+ function ibanMod97(iban) {
376
+ const cleaned = iban.replace(/[\s-]/g, "").toUpperCase();
377
+ if (cleaned.length < 5) return false;
378
+ if (!/^[A-Z]{2}/.test(cleaned) || !/^\d{2}/.test(cleaned.slice(2, 4))) return false;
379
+ const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
380
+ let numeric = "";
381
+ for (const c of rearranged) if (c >= "0" && c <= "9") numeric += c;
382
+ else if (c >= "A" && c <= "Z") numeric += String(c.charCodeAt(0) - 55);
383
+ else return false;
384
+ let remainder = 0;
385
+ for (let i = 0; i < numeric.length; i++) remainder = (remainder * 10 + parseInt(numeric[i], 10)) % 97;
386
+ return remainder === 1;
387
+ }
388
+ /** Check SSN format rules: no 000/666/9xx area, no 00 group, no 0000 serial. */
389
+ function ssnValidFormat(ssn) {
390
+ let digits = "";
391
+ for (const c of ssn) if (c >= "0" && c <= "9") digits += c;
392
+ if (digits.length !== 9) return false;
393
+ const area = parseInt(digits.slice(0, 3), 10);
394
+ const group = parseInt(digits.slice(3, 5), 10);
395
+ const serial = parseInt(digits.slice(5), 10);
396
+ if (area === 0 || area === 666 || area >= 900) return false;
397
+ if (group === 0) return false;
398
+ if (serial === 0) return false;
399
+ return true;
400
+ }
401
+ /** Validate German Tax ID using ISO 7064 Mod 11,10. */
402
+ function deTaxIdChecksum(number) {
403
+ const digits = [];
404
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
405
+ if (digits.length !== 11) return false;
406
+ let product = 10;
407
+ for (let i = 0; i < 10; i++) {
408
+ let total = (digits[i] + product) % 10;
409
+ if (total === 0) total = 10;
410
+ product = total * 2 % 11;
411
+ }
412
+ let check = 11 - product;
413
+ if (check === 10) check = 0;
414
+ return digits[10] === check;
415
+ }
416
+ /** Validate French NIR using mod 97 checksum. */
417
+ function frNirChecksum(number) {
418
+ const cleaned = number.toUpperCase().replace(/2A/g, "19").replace(/2B/g, "18");
419
+ let digitsStr = "";
420
+ for (const c of cleaned) if (c >= "0" && c <= "9") digitsStr += c;
421
+ if (digitsStr.length !== 15) return false;
422
+ const base = parseInt(digitsStr.slice(0, 13), 10);
423
+ const key = parseInt(digitsStr.slice(13, 15), 10);
424
+ return key === 97 - base % 97;
425
+ }
426
+ /** Validate Spanish DNI check letter using mod-23 table. */
427
+ function esDniLetter(number) {
428
+ let cleaned = "";
429
+ for (const c of number) if (c >= "0" && c <= "9" || c >= "A" && c <= "Z" || c >= "a" && c <= "z") cleaned += c;
430
+ if (cleaned.length !== 9) return false;
431
+ const digitsStr = cleaned.slice(0, 8);
432
+ const letter = cleaned[8].toUpperCase();
433
+ for (const c of digitsStr) if (c < "0" || c > "9") return false;
434
+ const expected = ES_DNI_LETTERS[parseInt(digitsStr, 10) % 23];
435
+ return letter === expected;
436
+ }
437
+ /** Validate Spanish NIE check letter (X/Y/Z prefix, then same as DNI). */
438
+ function esNieLetter(number) {
439
+ let cleaned = "";
440
+ for (const c of number) if (c >= "0" && c <= "9" || c >= "A" && c <= "Z" || c >= "a" && c <= "z") cleaned += c;
441
+ if (cleaned.length !== 9) return false;
442
+ const prefix = cleaned[0].toUpperCase();
443
+ const mapping = {
444
+ X: "0",
445
+ Y: "1",
446
+ Z: "2"
447
+ };
448
+ if (!(prefix in mapping)) return false;
449
+ const digitsStr = mapping[prefix] + cleaned.slice(1, 8);
450
+ const letter = cleaned[8].toUpperCase();
451
+ for (const c of digitsStr) if (c < "0" || c > "9") return false;
452
+ const expected = ES_DNI_LETTERS[parseInt(digitsStr, 10) % 23];
453
+ return letter === expected;
454
+ }
455
+ /** Validate Italian Codice Fiscale using odd/even position lookup tables. */
456
+ function itCodiceFiscaleCheck(code) {
457
+ let cleaned = "";
458
+ for (const c of code) if (c >= "0" && c <= "9" || c >= "A" && c <= "Z" || c >= "a" && c <= "z") cleaned += c;
459
+ cleaned = cleaned.toUpperCase();
460
+ if (cleaned.length !== 16) return false;
461
+ let total = 0;
462
+ for (let i = 0; i < 15; i++) {
463
+ const c = cleaned[i];
464
+ const val = (i + 1) % 2 === 1 ? IT_ODD_TABLE[c] : IT_EVEN_TABLE[c];
465
+ if (val === void 0) return false;
466
+ total += val;
467
+ }
468
+ const expected = String.fromCharCode(total % 26 + "A".charCodeAt(0));
469
+ return cleaned[15] === expected;
470
+ }
471
+ /** Validate Portuguese NIF using weighted checksum. */
472
+ function ptNifChecksum(number) {
473
+ const digits = [];
474
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
475
+ if (digits.length !== 9) return false;
476
+ if (![
477
+ 1,
478
+ 2,
479
+ 3,
480
+ 5,
481
+ 6,
482
+ 8,
483
+ 9
484
+ ].includes(digits[0])) return false;
485
+ let total = 0;
486
+ for (let i = 0; i < 8; i++) total += digits[i] * (9 - i);
487
+ const remainder = total % 11;
488
+ const check = remainder < 2 ? 0 : 11 - remainder;
489
+ return digits[8] === check;
490
+ }
491
+ /** Validate Polish PESEL using weighted mod-10 checksum. */
492
+ function plPeselChecksum(number) {
493
+ const digits = [];
494
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
495
+ if (digits.length !== 11) return false;
496
+ const weights = [
497
+ 1,
498
+ 3,
499
+ 7,
500
+ 9,
501
+ 1,
502
+ 3,
503
+ 7,
504
+ 9,
505
+ 1,
506
+ 3
507
+ ];
508
+ let total = 0;
509
+ for (let i = 0; i < 10; i++) total += digits[i] * weights[i];
510
+ const check = (10 - total % 10) % 10;
511
+ return digits[10] === check;
512
+ }
513
+ /** Validate Polish NIP using weighted mod-11 checksum. */
514
+ function plNipChecksum(number) {
515
+ const digits = [];
516
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
517
+ if (digits.length !== 10) return false;
518
+ const weights = [
519
+ 6,
520
+ 5,
521
+ 7,
522
+ 2,
523
+ 3,
524
+ 4,
525
+ 5,
526
+ 6,
527
+ 7
528
+ ];
529
+ let total = 0;
530
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
531
+ const check = total % 11;
532
+ if (check === 10) return false;
533
+ return digits[9] === check;
534
+ }
535
+ /** Validate Czech Birth Number: divisible by 11 + month check. */
536
+ function czBirthNumberValid(number) {
537
+ const cleaned = number.replace(/[/ ]/g, "");
538
+ for (const c of cleaned) if (c < "0" || c > "9") return false;
539
+ if (cleaned.length !== 9 && cleaned.length !== 10) return false;
540
+ if (cleaned.length === 10) {
541
+ let remainder = 0;
542
+ for (const c of cleaned) remainder = (remainder * 10 + parseInt(c, 10)) % 11;
543
+ if (remainder !== 0) return false;
544
+ }
545
+ const month = parseInt(cleaned.slice(2, 4), 10);
546
+ let baseMonth = month % 50;
547
+ if (baseMonth > 20) baseMonth -= 20;
548
+ if (baseMonth < 1 || baseMonth > 12) return false;
549
+ return true;
550
+ }
551
+ /** Validate Czech ICO (Company ID) using mod-11 weighted checksum. */
552
+ function czIcoChecksum(number) {
553
+ const digits = [];
554
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
555
+ if (digits.length !== 8) return false;
556
+ const weights = [
557
+ 8,
558
+ 7,
559
+ 6,
560
+ 5,
561
+ 4,
562
+ 3,
563
+ 2
564
+ ];
565
+ let total = 0;
566
+ for (let i = 0; i < 7; i++) total += digits[i] * weights[i];
567
+ const remainder = total % 11;
568
+ let check;
569
+ if (remainder === 0) check = 1;
570
+ else if (remainder === 1) check = 0;
571
+ else check = 11 - remainder;
572
+ return digits[7] === check;
573
+ }
574
+ /** Validate Czech DIC (Tax/VAT ID): CZ prefix + ICO or birth number checksum. */
575
+ function czDicValid(number) {
576
+ let cleaned = number.trim();
577
+ if (cleaned.toUpperCase().startsWith("CZ")) cleaned = cleaned.slice(2);
578
+ if (!/^\d+$/.test(cleaned)) return false;
579
+ if (cleaned.length === 8) return czIcoChecksum(cleaned);
580
+ if (cleaned.length === 10) {
581
+ let remainder = 0;
582
+ for (const c of cleaned) remainder = (remainder * 10 + parseInt(c, 10)) % 11;
583
+ return remainder === 0;
584
+ }
585
+ if (cleaned.length === 9) {
586
+ const month = parseInt(cleaned.slice(2, 4), 10);
587
+ let baseMonth = month % 50;
588
+ if (baseMonth > 20) baseMonth -= 20;
589
+ return baseMonth >= 1 && baseMonth <= 12;
590
+ }
591
+ return false;
592
+ }
593
+ /** Validate Czech bank account number using mod-11 weighted checksum. */
594
+ function czBankAccountValid(number) {
595
+ const parts = number.split("/");
596
+ if (parts.length !== 2) return false;
597
+ const bankCode = parts[1];
598
+ if (!/^\d{4}$/.test(bankCode)) return false;
599
+ const accountPart = parts[0];
600
+ let prefix = "";
601
+ let account = accountPart;
602
+ if (accountPart.includes("-")) {
603
+ const split = accountPart.split("-");
604
+ if (split.length !== 2) return false;
605
+ prefix = split[0];
606
+ account = split[1];
607
+ }
608
+ if (!/^\d{1,6}$/.test(prefix) && prefix !== "") return false;
609
+ if (!/^\d{2,10}$/.test(account)) return false;
610
+ const weights = [
611
+ 6,
612
+ 3,
613
+ 7,
614
+ 9,
615
+ 10,
616
+ 5,
617
+ 8,
618
+ 4,
619
+ 2,
620
+ 1
621
+ ];
622
+ const accDigits = account.padStart(10, "0").split("").map(Number);
623
+ let total = 0;
624
+ for (let i = 0; i < 10; i++) total += accDigits[i] * weights[i];
625
+ if (total % 11 !== 0) return false;
626
+ if (prefix !== "") {
627
+ const prefDigits = prefix.padStart(6, "0").split("").map(Number);
628
+ const prefWeights = weights.slice(4);
629
+ let prefTotal = 0;
630
+ for (let i = 0; i < 6; i++) prefTotal += prefDigits[i] * prefWeights[i];
631
+ if (prefTotal % 11 !== 0) return false;
632
+ }
633
+ if (prefix === "" && account.length === 6 && czBirthNumberValid(number)) return false;
634
+ return true;
635
+ }
636
+ /** Validate Slovak Birth Number (same logic as Czech). */
637
+ function skBirthNumberValid(number) {
638
+ return czBirthNumberValid(number);
639
+ }
640
+ /** Validate Russian INN using weighted checksum (10 or 12 digits). */
641
+ function ruInnChecksum(number) {
642
+ const digits = [];
643
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
644
+ if (digits.length === 10) {
645
+ const weights = [
646
+ 2,
647
+ 4,
648
+ 10,
649
+ 3,
650
+ 5,
651
+ 9,
652
+ 4,
653
+ 6,
654
+ 8
655
+ ];
656
+ let total = 0;
657
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
658
+ return digits[9] === total % 11 % 10;
659
+ } else if (digits.length === 12) {
660
+ const weights1 = [
661
+ 7,
662
+ 2,
663
+ 4,
664
+ 10,
665
+ 3,
666
+ 5,
667
+ 9,
668
+ 4,
669
+ 6,
670
+ 8
671
+ ];
672
+ let total1 = 0;
673
+ for (let i = 0; i < 10; i++) total1 += digits[i] * weights1[i];
674
+ const check1 = total1 % 11 % 10;
675
+ if (digits[10] !== check1) return false;
676
+ const weights2 = [
677
+ 3,
678
+ 7,
679
+ 2,
680
+ 4,
681
+ 10,
682
+ 3,
683
+ 5,
684
+ 9,
685
+ 4,
686
+ 6,
687
+ 8
688
+ ];
689
+ let total2 = 0;
690
+ for (let i = 0; i < 11; i++) total2 += digits[i] * weights2[i];
691
+ const check2 = total2 % 11 % 10;
692
+ return digits[11] === check2;
693
+ }
694
+ return false;
695
+ }
696
+ /** Validate Russian SNILS using mod-101 checksum. */
697
+ function ruSnilsChecksum(number) {
698
+ const digits = [];
699
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
700
+ if (digits.length !== 11) return false;
701
+ let base = 0;
702
+ for (let i = 0; i < 9; i++) base = base * 10 + digits[i];
703
+ if (base <= 1001998) return true;
704
+ let total = 0;
705
+ for (let i = 0; i < 9; i++) total += digits[i] * (9 - i);
706
+ let check = total % 101;
707
+ if (check === 100) check = 0;
708
+ const checkValue = digits[9] * 10 + digits[10];
709
+ return checkValue === check;
710
+ }
711
+ /** Validate Dutch BSN using the 11-test. */
712
+ function nlBsn11test(number) {
713
+ const digits = [];
714
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
715
+ if (digits.length !== 9) return false;
716
+ let total = 0;
717
+ for (let i = 0; i < 8; i++) total += digits[i] * (9 - i);
718
+ total -= digits[8];
719
+ return total % 11 === 0 && total !== 0;
720
+ }
721
+ /** Validate Romanian CNP using weighted checksum. */
722
+ function roCnpChecksum(number) {
723
+ const digits = [];
724
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
725
+ if (digits.length !== 13) return false;
726
+ if (digits[0] < 1 || digits[0] > 8) return false;
727
+ const weights = [
728
+ 2,
729
+ 7,
730
+ 9,
731
+ 1,
732
+ 4,
733
+ 6,
734
+ 3,
735
+ 5,
736
+ 8,
737
+ 2,
738
+ 7,
739
+ 9
740
+ ];
741
+ let total = 0;
742
+ for (let i = 0; i < 12; i++) total += digits[i] * weights[i];
743
+ let check = total % 11;
744
+ if (check === 10) check = 1;
745
+ return digits[12] === check;
746
+ }
747
+ /** Validate Danish CPR number by checking the date portion. */
748
+ function dkCprValidDate(number) {
749
+ let digits = "";
750
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
751
+ if (digits.length !== 10) return false;
752
+ const day = parseInt(digits.slice(0, 2), 10);
753
+ const month = parseInt(digits.slice(2, 4), 10);
754
+ if (day < 1 || day > 31) return false;
755
+ if (month < 1 || month > 12) return false;
756
+ return true;
757
+ }
758
+ /** Validate Swedish Personnummer using Luhn on last 10 digits. */
759
+ function sePersonnummerLuhn(number) {
760
+ let digitsStr = "";
761
+ for (const c of number) if (c >= "0" && c <= "9") digitsStr += c;
762
+ if (digitsStr.length === 12) digitsStr = digitsStr.slice(2);
763
+ if (digitsStr.length !== 10) return false;
764
+ const month = parseInt(digitsStr.slice(2, 4), 10);
765
+ const day = parseInt(digitsStr.slice(4, 6), 10);
766
+ if (month < 1 || month > 12) return false;
767
+ if (day < 1 || day > 31) return false;
768
+ return luhnChecksum(digitsStr);
769
+ }
770
+ /** Validate Norwegian Birth Number using dual weighted checksums. */
771
+ function noBirthNumberChecksum(number) {
772
+ const digits = [];
773
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
774
+ if (digits.length !== 11) return false;
775
+ const weights1 = [
776
+ 3,
777
+ 7,
778
+ 6,
779
+ 1,
780
+ 8,
781
+ 9,
782
+ 4,
783
+ 5,
784
+ 2
785
+ ];
786
+ let total1 = 0;
787
+ for (let i = 0; i < 9; i++) total1 += digits[i] * weights1[i];
788
+ let check1 = 11 - total1 % 11;
789
+ if (check1 === 11) check1 = 0;
790
+ if (check1 === 10) return false;
791
+ if (digits[9] !== check1) return false;
792
+ const weights2 = [
793
+ 5,
794
+ 4,
795
+ 3,
796
+ 2,
797
+ 7,
798
+ 6,
799
+ 5,
800
+ 4,
801
+ 3,
802
+ 2
803
+ ];
804
+ let total2 = 0;
805
+ for (let i = 0; i < 10; i++) total2 += digits[i] * weights2[i];
806
+ let check2 = 11 - total2 % 11;
807
+ if (check2 === 11) check2 = 0;
808
+ if (check2 === 10) return false;
809
+ return digits[10] === check2;
810
+ }
811
+ /** Validate Brazilian CPF using weighted mod-11 checksum. */
812
+ function brCpfChecksum(number) {
813
+ const digits = [];
814
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
815
+ if (digits.length !== 11) return false;
816
+ if (new Set(digits).size === 1) return false;
817
+ let total1 = 0;
818
+ for (let i = 0; i < 9; i++) total1 += digits[i] * (10 - i);
819
+ let check1 = total1 * 10 % 11;
820
+ if (check1 === 10) check1 = 0;
821
+ if (digits[9] !== check1) return false;
822
+ let total2 = 0;
823
+ for (let i = 0; i < 10; i++) total2 += digits[i] * (11 - i);
824
+ let check2 = total2 * 10 % 11;
825
+ if (check2 === 10) check2 = 0;
826
+ return digits[10] === check2;
827
+ }
828
+ /** Validate Brazilian CNPJ using weighted mod-11 checksum. */
829
+ function brCnpjChecksum(number) {
830
+ const digits = [];
831
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
832
+ if (digits.length !== 14) return false;
833
+ const weights1 = [
834
+ 5,
835
+ 4,
836
+ 3,
837
+ 2,
838
+ 9,
839
+ 8,
840
+ 7,
841
+ 6,
842
+ 5,
843
+ 4,
844
+ 3,
845
+ 2
846
+ ];
847
+ let total1 = 0;
848
+ for (let i = 0; i < 12; i++) total1 += digits[i] * weights1[i];
849
+ let check1 = total1 % 11;
850
+ check1 = check1 < 2 ? 0 : 11 - check1;
851
+ if (digits[12] !== check1) return false;
852
+ const weights2 = [
853
+ 6,
854
+ 5,
855
+ 4,
856
+ 3,
857
+ 2,
858
+ 9,
859
+ 8,
860
+ 7,
861
+ 6,
862
+ 5,
863
+ 4,
864
+ 3,
865
+ 2
866
+ ];
867
+ let total2 = 0;
868
+ for (let i = 0; i < 13; i++) total2 += digits[i] * weights2[i];
869
+ let check2 = total2 % 11;
870
+ check2 = check2 < 2 ? 0 : 11 - check2;
871
+ return digits[13] === check2;
872
+ }
873
+ /** Validate US ITIN format: 9XX-[7X|8X|9X|70-88]-XXXX. */
874
+ function usItinValid(number) {
875
+ let digits = "";
876
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
877
+ if (digits.length !== 9) return false;
878
+ if (digits[0] !== "9") return false;
879
+ const d4 = parseInt(digits[3], 10);
880
+ if (d4 < 7) return false;
881
+ return true;
882
+ }
883
+ /** Validate UK UTR using mod-11 weighted checksum. */
884
+ function ukUtrChecksum(number) {
885
+ const digits = [];
886
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
887
+ if (digits.length !== 10) return false;
888
+ const weights = [
889
+ 6,
890
+ 7,
891
+ 8,
892
+ 9,
893
+ 10,
894
+ 5,
895
+ 4,
896
+ 3,
897
+ 2
898
+ ];
899
+ let total = 0;
900
+ for (let i = 0; i < 9; i++) total += digits[i + 1] * weights[i];
901
+ const remainder = total % 11;
902
+ const check = 11 - remainder === 10 ? 0 : 11 - remainder;
903
+ return digits[0] === check || 11 - remainder === 11 && digits[0] === 0;
904
+ }
905
+ /** Validate Spanish NSS using mod-97 checksum. */
906
+ function esNssChecksum(number) {
907
+ let digits = "";
908
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
909
+ if (digits.length !== 12) return false;
910
+ const province = parseInt(digits.slice(0, 2), 10);
911
+ if (province < 1 || province > 53) return false;
912
+ const baseNum = parseInt(digits.slice(0, 10), 10);
913
+ const check = parseInt(digits.slice(10, 12), 10);
914
+ return baseNum % 97 === check;
915
+ }
916
+ /** Validate Spanish CIF using custom checksum. */
917
+ function esCifChecksum(number) {
918
+ let cleaned = "";
919
+ for (const c of number) if (c >= "0" && c <= "9" || c >= "A" && c <= "Z" || c >= "a" && c <= "z") cleaned += c;
920
+ cleaned = cleaned.toUpperCase();
921
+ if (cleaned.length !== 9) return false;
922
+ const letter = cleaned[0];
923
+ if (!"ABCDEFGHJNPQRSUVW".includes(letter)) return false;
924
+ let totalEven = 0;
925
+ let totalOdd = 0;
926
+ for (let i = 1; i <= 7; i++) {
927
+ const d = parseInt(cleaned[i], 10);
928
+ if (isNaN(d)) return false;
929
+ if (i % 2 === 0) totalEven += d;
930
+ else {
931
+ const doubled = d * 2;
932
+ totalOdd += Math.floor(doubled / 10) + doubled % 10;
933
+ }
934
+ }
935
+ const total = totalEven + totalOdd;
936
+ const checkDigit = (10 - total % 10) % 10;
937
+ const control = cleaned[8];
938
+ if ("KPQS".includes(letter)) return control === String.fromCharCode("A".charCodeAt(0) + checkDigit);
939
+ if ("ABEH".includes(letter)) return control === String(checkDigit);
940
+ return control === String(checkDigit) || control === String.fromCharCode("A".charCodeAt(0) + checkDigit);
941
+ }
942
+ /** Validate Italian Partita IVA using Luhn-like algorithm. */
943
+ function itPartitaIvaChecksum(number) {
944
+ const digits = [];
945
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
946
+ if (digits.length !== 11) return false;
947
+ if (digits.every((d) => d === 0)) return false;
948
+ let total = 0;
949
+ for (let i = 0; i < 10; i++) if (i % 2 === 0) total += digits[i];
950
+ else {
951
+ const doubled = digits[i] * 2;
952
+ total += doubled > 9 ? doubled - 9 : doubled;
953
+ }
954
+ const check = (10 - total % 10) % 10;
955
+ return digits[10] === check;
956
+ }
957
+ /** Validate Polish REGON using mod-11 weighted checksum (9 or 14 digits). */
958
+ function plRegonChecksum(number) {
959
+ const digits = [];
960
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
961
+ if (digits.length === 9) {
962
+ const weights = [
963
+ 8,
964
+ 9,
965
+ 2,
966
+ 3,
967
+ 4,
968
+ 5,
969
+ 6,
970
+ 7
971
+ ];
972
+ let total = 0;
973
+ for (let i = 0; i < 8; i++) total += digits[i] * weights[i];
974
+ const check = total % 11 === 10 ? 0 : total % 11;
975
+ return digits[8] === check;
976
+ }
977
+ if (digits.length === 14) {
978
+ const weights9 = [
979
+ 8,
980
+ 9,
981
+ 2,
982
+ 3,
983
+ 4,
984
+ 5,
985
+ 6,
986
+ 7
987
+ ];
988
+ let total9 = 0;
989
+ for (let i = 0; i < 8; i++) total9 += digits[i] * weights9[i];
990
+ const check9 = total9 % 11 === 10 ? 0 : total9 % 11;
991
+ if (digits[8] !== check9) return false;
992
+ const weights14 = [
993
+ 2,
994
+ 4,
995
+ 8,
996
+ 5,
997
+ 0,
998
+ 9,
999
+ 7,
1000
+ 3,
1001
+ 6,
1002
+ 1,
1003
+ 2,
1004
+ 4,
1005
+ 8
1006
+ ];
1007
+ let total14 = 0;
1008
+ for (let i = 0; i < 13; i++) total14 += digits[i] * weights14[i];
1009
+ const check14 = total14 % 11 === 10 ? 0 : total14 % 11;
1010
+ return digits[13] === check14;
1011
+ }
1012
+ return false;
1013
+ }
1014
+ /** Validate Slovak ICO using same algorithm as Czech ICO. */
1015
+ function skIcoChecksum(number) {
1016
+ return czIcoChecksum(number);
1017
+ }
1018
+ /** Validate Slovak DIC: SK prefix + digits divisible by 11. */
1019
+ function skDicValid(number) {
1020
+ let cleaned = number.trim();
1021
+ if (cleaned.toUpperCase().startsWith("SK")) cleaned = cleaned.slice(2);
1022
+ if (!/^\d{10}$/.test(cleaned)) return false;
1023
+ let remainder = 0;
1024
+ for (const c of cleaned) remainder = (remainder * 10 + parseInt(c, 10)) % 11;
1025
+ return remainder === 0;
1026
+ }
1027
+ /** Validate Romanian CUI using mod-11 weighted checksum. */
1028
+ function roCuiChecksum(number) {
1029
+ let cleaned = number.trim().toUpperCase();
1030
+ if (cleaned.startsWith("RO")) cleaned = cleaned.slice(2);
1031
+ const digits = [];
1032
+ for (const c of cleaned) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1033
+ if (digits.length < 2 || digits.length > 10) return false;
1034
+ const weights = [
1035
+ 7,
1036
+ 5,
1037
+ 3,
1038
+ 2,
1039
+ 1,
1040
+ 7,
1041
+ 5,
1042
+ 3,
1043
+ 2
1044
+ ];
1045
+ const padded = Array(10 - digits.length).fill(0).concat(digits);
1046
+ const check = padded.pop();
1047
+ let total = 0;
1048
+ for (let i = 0; i < 9; i++) total += padded[i] * weights[i];
1049
+ const expected = total * 10 % 11 === 10 ? 0 : total * 10 % 11;
1050
+ return check === expected;
1051
+ }
1052
+ /** Validate Danish CVR using mod-11 weighted checksum. */
1053
+ function dkCvrChecksum(number) {
1054
+ const digits = [];
1055
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1056
+ if (digits.length !== 8) return false;
1057
+ const weights = [
1058
+ 2,
1059
+ 7,
1060
+ 6,
1061
+ 5,
1062
+ 4,
1063
+ 3,
1064
+ 2,
1065
+ 1
1066
+ ];
1067
+ let total = 0;
1068
+ for (let i = 0; i < 8; i++) total += digits[i] * weights[i];
1069
+ return total % 11 === 0;
1070
+ }
1071
+ /** Validate Swedish Organisationsnummer using Luhn on 10 digits. */
1072
+ function seOrgnrChecksum(number) {
1073
+ let digits = "";
1074
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1075
+ if (digits.length !== 10) return false;
1076
+ const d3 = parseInt(digits[2], 10);
1077
+ if (d3 < 2) return false;
1078
+ return luhnChecksum(digits);
1079
+ }
1080
+ /** Validate Norwegian Organisasjonsnummer using mod-11 weighted checksum. */
1081
+ function noOrgnrChecksum(number) {
1082
+ const digits = [];
1083
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1084
+ if (digits.length !== 9) return false;
1085
+ const weights = [
1086
+ 3,
1087
+ 2,
1088
+ 7,
1089
+ 6,
1090
+ 5,
1091
+ 4,
1092
+ 3,
1093
+ 2
1094
+ ];
1095
+ let total = 0;
1096
+ for (let i = 0; i < 8; i++) total += digits[i] * weights[i];
1097
+ const remainder = total % 11;
1098
+ if (remainder === 1) return false;
1099
+ const check = remainder === 0 ? 0 : 11 - remainder;
1100
+ return digits[8] === check;
1101
+ }
1102
+ /** Validate Belgian National Number using mod-97 checksum. */
1103
+ function beNationalNumberChecksum(number) {
1104
+ let digits = "";
1105
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1106
+ if (digits.length !== 11) return false;
1107
+ const base = parseInt(digits.slice(0, 9), 10);
1108
+ const check = parseInt(digits.slice(9, 11), 10);
1109
+ if (97 - base % 97 === check) return true;
1110
+ const base2000 = parseInt("2" + digits.slice(0, 9), 10);
1111
+ return 97 - base2000 % 97 === check;
1112
+ }
1113
+ /** Validate Belgian Enterprise Number using mod-97 checksum. */
1114
+ function beEnterpriseChecksum(number) {
1115
+ let digits = "";
1116
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1117
+ if (digits.length !== 10) return false;
1118
+ if (digits[0] !== "0" && digits[0] !== "1") return false;
1119
+ const base = parseInt(digits.slice(0, 8), 10);
1120
+ const check = parseInt(digits.slice(8, 10), 10);
1121
+ return 97 - base % 97 === check;
1122
+ }
1123
+ /** Validate Austrian SVNR (Social Insurance Number). */
1124
+ function atSvnrChecksum(number) {
1125
+ const digits = [];
1126
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1127
+ if (digits.length !== 10) return false;
1128
+ const weights = [
1129
+ 3,
1130
+ 7,
1131
+ 9,
1132
+ 0,
1133
+ 5,
1134
+ 8,
1135
+ 4,
1136
+ 2,
1137
+ 1,
1138
+ 6
1139
+ ];
1140
+ let total = 0;
1141
+ for (let i = 0; i < 10; i++) total += digits[i] * weights[i];
1142
+ return total % 11 === digits[3];
1143
+ }
1144
+ /** Validate Irish PPS Number using mod-23 checksum. */
1145
+ function iePpsChecksum(number) {
1146
+ let cleaned = "";
1147
+ for (const c of number) if (c >= "0" && c <= "9" || c >= "A" && c <= "Z" || c >= "a" && c <= "z") cleaned += c;
1148
+ cleaned = cleaned.toUpperCase();
1149
+ if (cleaned.length < 8 || cleaned.length > 9) return false;
1150
+ let total = 0;
1151
+ for (let i = 0; i < 7; i++) {
1152
+ const d = parseInt(cleaned[i], 10);
1153
+ if (isNaN(d)) return false;
1154
+ total += d * (8 - i);
1155
+ }
1156
+ if (cleaned.length === 9 && cleaned[8] >= "A" && cleaned[8] <= "Z") total += (cleaned[8].charCodeAt(0) - 64) * 9;
1157
+ const remainder = total % 23;
1158
+ const expected = remainder === 0 ? "W" : String.fromCharCode("A".charCodeAt(0) + remainder - 1);
1159
+ return cleaned[7] === expected;
1160
+ }
1161
+ /** Validate Finnish HETU (Personal Identity Code) using mod-31 checksum. */
1162
+ function fiHetuChecksum(number) {
1163
+ let cleaned = number.replace(/[\s-]/g, "");
1164
+ if (cleaned.length !== 11) cleaned = number.trim();
1165
+ if (cleaned.length !== 11) return false;
1166
+ const datePart = cleaned.slice(0, 6);
1167
+ for (const c of datePart) if (c < "0" || c > "9") return false;
1168
+ const sep = cleaned[6];
1169
+ if (!"-+ABCDEFYXWVU".includes(sep)) return false;
1170
+ const numPart = cleaned.slice(7, 10);
1171
+ for (const c of numPart) if (c < "0" || c > "9") return false;
1172
+ const checkChars = "0123456789ABCDEFHJKLMNPRSTUVWXY";
1173
+ const combined = parseInt(datePart + numPart, 10);
1174
+ const expected = checkChars[combined % 31];
1175
+ return cleaned[10].toUpperCase() === expected;
1176
+ }
1177
+ /** Validate Finnish Y-tunnus (Business ID) using mod-11 weighted checksum. */
1178
+ function fiYtunnusChecksum(number) {
1179
+ let digits = "";
1180
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1181
+ if (digits.length !== 8) return false;
1182
+ const weights = [
1183
+ 7,
1184
+ 9,
1185
+ 10,
1186
+ 5,
1187
+ 8,
1188
+ 4,
1189
+ 2
1190
+ ];
1191
+ let total = 0;
1192
+ for (let i = 0; i < 7; i++) total += parseInt(digits[i], 10) * weights[i];
1193
+ const remainder = total % 11;
1194
+ if (remainder === 1) return false;
1195
+ const check = remainder === 0 ? 0 : 11 - remainder;
1196
+ return parseInt(digits[7], 10) === check;
1197
+ }
1198
+ /** Validate Hungarian Tax ID using mod-11 weighted checksum. */
1199
+ function huTaxIdChecksum(number) {
1200
+ const digits = [];
1201
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1202
+ if (digits.length !== 10) return false;
1203
+ if (digits[0] !== 8) return false;
1204
+ const weights = [
1205
+ 1,
1206
+ 2,
1207
+ 3,
1208
+ 4,
1209
+ 5,
1210
+ 6,
1211
+ 7,
1212
+ 8,
1213
+ 9
1214
+ ];
1215
+ let total = 0;
1216
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
1217
+ return digits[9] === total % 11;
1218
+ }
1219
+ /** Validate Hungarian TAJ (Social Security) using mod-10 with 3/7 weights. */
1220
+ function huTajChecksum(number) {
1221
+ const digits = [];
1222
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1223
+ if (digits.length !== 9) return false;
1224
+ let total = 0;
1225
+ for (let i = 0; i < 8; i++) total += digits[i] * (i % 2 === 0 ? 3 : 7);
1226
+ return digits[8] === total % 10;
1227
+ }
1228
+ /** Validate Bulgarian EGN using weighted mod-11 checksum. */
1229
+ function bgEgnChecksum(number) {
1230
+ const digits = [];
1231
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1232
+ if (digits.length !== 10) return false;
1233
+ const month = parseInt(number.slice(2, 4), 10);
1234
+ const baseMonth = month > 40 ? month - 40 : month > 20 ? month - 20 : month;
1235
+ if (baseMonth < 1 || baseMonth > 12) return false;
1236
+ const weights = [
1237
+ 2,
1238
+ 4,
1239
+ 8,
1240
+ 5,
1241
+ 10,
1242
+ 9,
1243
+ 7,
1244
+ 3,
1245
+ 6
1246
+ ];
1247
+ let total = 0;
1248
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
1249
+ let check = total % 11;
1250
+ if (check === 10) check = 0;
1251
+ return digits[9] === check;
1252
+ }
1253
+ /** Validate Croatian OIB using ISO 7064 MOD 11,2. */
1254
+ function hrOibChecksum(number) {
1255
+ const digits = [];
1256
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1257
+ if (digits.length !== 11) return false;
1258
+ let remainder = 10;
1259
+ for (let i = 0; i < 10; i++) {
1260
+ remainder = (remainder + digits[i]) % 10;
1261
+ if (remainder === 0) remainder = 10;
1262
+ remainder = remainder * 2 % 11;
1263
+ }
1264
+ let check = 11 - remainder;
1265
+ if (check === 10) check = 0;
1266
+ return digits[10] === check;
1267
+ }
1268
+ /** Validate Slovenian EMSO using mod-11 weighted checksum. */
1269
+ function siEmsoChecksum(number) {
1270
+ const digits = [];
1271
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1272
+ if (digits.length !== 13) return false;
1273
+ const weights = [
1274
+ 7,
1275
+ 6,
1276
+ 5,
1277
+ 4,
1278
+ 3,
1279
+ 2,
1280
+ 7,
1281
+ 6,
1282
+ 5,
1283
+ 4,
1284
+ 3,
1285
+ 2
1286
+ ];
1287
+ let total = 0;
1288
+ for (let i = 0; i < 12; i++) total += digits[i] * weights[i];
1289
+ const remainder = total % 11;
1290
+ const check = remainder === 0 ? 0 : 11 - remainder;
1291
+ if (check === 10) return false;
1292
+ return digits[12] === check;
1293
+ }
1294
+ /** Validate Slovenian Tax Number using mod-11. */
1295
+ function siTaxNumberChecksum(number) {
1296
+ let cleaned = number.trim().toUpperCase();
1297
+ if (cleaned.startsWith("SI")) cleaned = cleaned.slice(2);
1298
+ const digits = [];
1299
+ for (const c of cleaned) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1300
+ if (digits.length !== 8) return false;
1301
+ const weights = [
1302
+ 8,
1303
+ 7,
1304
+ 6,
1305
+ 5,
1306
+ 4,
1307
+ 3,
1308
+ 2
1309
+ ];
1310
+ let total = 0;
1311
+ for (let i = 0; i < 7; i++) total += digits[i] * weights[i];
1312
+ const remainder = total % 11;
1313
+ if (remainder === 0 || remainder === 1) return digits[7] === 0;
1314
+ return digits[7] === 11 - remainder;
1315
+ }
1316
+ /** Validate Lithuanian Personal Code using dual-pass mod-11 checksum. */
1317
+ function ltPersonalCodeChecksum(number) {
1318
+ const digits = [];
1319
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1320
+ if (digits.length !== 11) return false;
1321
+ if (digits[0] < 1 || digits[0] > 6) return false;
1322
+ const weights1 = [
1323
+ 1,
1324
+ 2,
1325
+ 3,
1326
+ 4,
1327
+ 5,
1328
+ 6,
1329
+ 7,
1330
+ 8,
1331
+ 9,
1332
+ 1
1333
+ ];
1334
+ let total = 0;
1335
+ for (let i = 0; i < 10; i++) total += digits[i] * weights1[i];
1336
+ let check = total % 11;
1337
+ if (check === 10) {
1338
+ const weights2 = [
1339
+ 3,
1340
+ 4,
1341
+ 5,
1342
+ 6,
1343
+ 7,
1344
+ 8,
1345
+ 9,
1346
+ 1,
1347
+ 2,
1348
+ 3
1349
+ ];
1350
+ total = 0;
1351
+ for (let i = 0; i < 10; i++) total += digits[i] * weights2[i];
1352
+ check = total % 11;
1353
+ if (check === 10) check = 0;
1354
+ }
1355
+ return digits[10] === check;
1356
+ }
1357
+ /** Validate Latvian Personal Code (old format with checksum). */
1358
+ function lvPersonalCodeChecksum(number) {
1359
+ let digits = "";
1360
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1361
+ if (digits.length !== 11) return false;
1362
+ const day = parseInt(digits.slice(0, 2), 10);
1363
+ const month = parseInt(digits.slice(2, 4), 10);
1364
+ if (digits[0] === "3" && digits[1] === "2") return true;
1365
+ if (day < 1 || day > 31) return false;
1366
+ if (month < 1 || month > 12) return false;
1367
+ const weights = [
1368
+ 1,
1369
+ 6,
1370
+ 3,
1371
+ 7,
1372
+ 9,
1373
+ 10,
1374
+ 5,
1375
+ 8,
1376
+ 4,
1377
+ 2
1378
+ ];
1379
+ let total = 0;
1380
+ for (let i = 0; i < 10; i++) total += parseInt(digits[i], 10) * weights[i];
1381
+ const check = (1101 - total) % 11 % 10;
1382
+ return parseInt(digits[10], 10) === check;
1383
+ }
1384
+ /** Validate Estonian Personal Code using dual-pass mod-11 checksum. */
1385
+ function eePersonalCodeChecksum(number) {
1386
+ const digits = [];
1387
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1388
+ if (digits.length !== 11) return false;
1389
+ if (digits[0] < 1 || digits[0] > 6) return false;
1390
+ const weights1 = [
1391
+ 1,
1392
+ 2,
1393
+ 3,
1394
+ 4,
1395
+ 5,
1396
+ 6,
1397
+ 7,
1398
+ 8,
1399
+ 9,
1400
+ 1
1401
+ ];
1402
+ let total = 0;
1403
+ for (let i = 0; i < 10; i++) total += digits[i] * weights1[i];
1404
+ let check = total % 11;
1405
+ if (check === 10) {
1406
+ const weights2 = [
1407
+ 3,
1408
+ 4,
1409
+ 5,
1410
+ 6,
1411
+ 7,
1412
+ 8,
1413
+ 9,
1414
+ 1,
1415
+ 2,
1416
+ 3
1417
+ ];
1418
+ total = 0;
1419
+ for (let i = 0; i < 10; i++) total += digits[i] * weights2[i];
1420
+ check = total % 11;
1421
+ if (check === 10) check = 0;
1422
+ }
1423
+ return digits[10] === check;
1424
+ }
1425
+ /** Validate Swiss AHV using EAN-13 checksum. */
1426
+ function chAhvChecksum(number) {
1427
+ let digits = "";
1428
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1429
+ if (digits.length !== 13) return false;
1430
+ if (!digits.startsWith("756")) return false;
1431
+ let total = 0;
1432
+ for (let i = 0; i < 12; i++) total += parseInt(digits[i], 10) * (i % 2 === 0 ? 1 : 3);
1433
+ const check = (10 - total % 10) % 10;
1434
+ return parseInt(digits[12], 10) === check;
1435
+ }
1436
+ /** Validate Australian TFN using mod-11 weighted checksum. */
1437
+ function auTfnChecksum(number) {
1438
+ const digits = [];
1439
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1440
+ if (digits.length !== 9 && digits.length !== 8) return false;
1441
+ if (digits.length === 8) {
1442
+ const weights$1 = [
1443
+ 10,
1444
+ 7,
1445
+ 8,
1446
+ 4,
1447
+ 6,
1448
+ 3,
1449
+ 5,
1450
+ 1
1451
+ ];
1452
+ let total$1 = 0;
1453
+ for (let i = 0; i < 8; i++) total$1 += digits[i] * weights$1[i];
1454
+ return total$1 % 11 === 0;
1455
+ }
1456
+ const weights = [
1457
+ 1,
1458
+ 4,
1459
+ 3,
1460
+ 7,
1461
+ 5,
1462
+ 8,
1463
+ 6,
1464
+ 9,
1465
+ 10
1466
+ ];
1467
+ let total = 0;
1468
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
1469
+ return total % 11 === 0;
1470
+ }
1471
+ /** Validate Australian Medicare number using mod-10 weighted checksum. */
1472
+ function auMedicareChecksum(number) {
1473
+ let digits = "";
1474
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1475
+ if (digits.length < 10 || digits.length > 11) return false;
1476
+ const weights = [
1477
+ 1,
1478
+ 3,
1479
+ 7,
1480
+ 9,
1481
+ 1,
1482
+ 3,
1483
+ 7,
1484
+ 9
1485
+ ];
1486
+ let total = 0;
1487
+ for (let i = 0; i < 8; i++) total += parseInt(digits[i], 10) * weights[i];
1488
+ return parseInt(digits[8], 10) === total % 10;
1489
+ }
1490
+ /** Validate New Zealand IRD using dual-pass mod-11 checksum. */
1491
+ function nzIrdChecksum(number) {
1492
+ let digits = "";
1493
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1494
+ if (digits.length !== 8 && digits.length !== 9) return false;
1495
+ if (digits.length === 8) digits = "0" + digits;
1496
+ const d = digits.split("").map(Number);
1497
+ const weights1 = [
1498
+ 3,
1499
+ 2,
1500
+ 7,
1501
+ 6,
1502
+ 5,
1503
+ 4,
1504
+ 3,
1505
+ 2
1506
+ ];
1507
+ let total = 0;
1508
+ for (let i = 0; i < 8; i++) total += d[i] * weights1[i];
1509
+ const remainder = total % 11;
1510
+ if (remainder === 0) return d[8] === 0;
1511
+ if (11 - remainder !== 10) return d[8] === 11 - remainder;
1512
+ const weights2 = [
1513
+ 7,
1514
+ 4,
1515
+ 3,
1516
+ 2,
1517
+ 5,
1518
+ 2,
1519
+ 7,
1520
+ 6
1521
+ ];
1522
+ total = 0;
1523
+ for (let i = 0; i < 8; i++) total += d[i] * weights2[i];
1524
+ const r2 = total % 11;
1525
+ if (r2 === 0) return d[8] === 0;
1526
+ return d[8] === 11 - r2;
1527
+ }
1528
+ /** Validate Indian Aadhaar using Verhoeff algorithm. */
1529
+ function inAadhaarChecksum(number) {
1530
+ let digits = "";
1531
+ for (const c$1 of number) if (c$1 >= "0" && c$1 <= "9") digits += c$1;
1532
+ if (digits.length !== 12) return false;
1533
+ if (digits[0] === "0" || digits[0] === "1") return false;
1534
+ let c = 0;
1535
+ for (let i = digits.length - 1; i >= 0; i--) c = VERHOEFF_D[c][VERHOEFF_P[(digits.length - 1 - i) % 8][parseInt(digits[i], 10)]];
1536
+ return c === 0;
1537
+ }
1538
+ /** Validate Indian PAN format: AAAAA0000A. */
1539
+ function inPanValid(number) {
1540
+ const cleaned = number.trim().toUpperCase();
1541
+ if (cleaned.length !== 10) return false;
1542
+ return /^[A-Z]{3}[ABCFGHLJPT][A-Z]\d{4}[A-Z]$/.test(cleaned);
1543
+ }
1544
+ /** Validate Japanese My Number using mod-11 checksum. */
1545
+ function jpMyNumberChecksum(number) {
1546
+ let digits = "";
1547
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1548
+ if (digits.length !== 12) return false;
1549
+ let total = 0;
1550
+ for (let i = 0; i < 11; i++) {
1551
+ const p = 11 - i;
1552
+ const q = p <= 6 ? p + 1 : p - 5;
1553
+ total += parseInt(digits[i], 10) * q;
1554
+ }
1555
+ const remainder = total % 11;
1556
+ const check = remainder <= 1 ? 0 : 11 - remainder;
1557
+ return parseInt(digits[11], 10) === check;
1558
+ }
1559
+ /** Validate Korean RRN using weighted mod checksum. */
1560
+ function krRrnChecksum(number) {
1561
+ let digits = "";
1562
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1563
+ if (digits.length !== 13) return false;
1564
+ const weights = [
1565
+ 2,
1566
+ 3,
1567
+ 4,
1568
+ 5,
1569
+ 6,
1570
+ 7,
1571
+ 8,
1572
+ 9,
1573
+ 2,
1574
+ 3,
1575
+ 4,
1576
+ 5
1577
+ ];
1578
+ let total = 0;
1579
+ for (let i = 0; i < 12; i++) total += parseInt(digits[i], 10) * weights[i];
1580
+ const check = (11 - total % 11) % 10;
1581
+ return parseInt(digits[12], 10) === check;
1582
+ }
1583
+ /** Validate Turkish Kimlik using custom dual check digit algorithm. */
1584
+ function trKimlikChecksum(number) {
1585
+ const digits = [];
1586
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1587
+ if (digits.length !== 11) return false;
1588
+ if (digits[0] === 0) return false;
1589
+ const oddSum = digits[0] + digits[2] + digits[4] + digits[6] + digits[8];
1590
+ const evenSum = digits[1] + digits[3] + digits[5] + digits[7];
1591
+ const check1 = (oddSum * 7 - evenSum) % 10;
1592
+ if (check1 < 0 ? check1 + 10 : check1 !== digits[9]) return false;
1593
+ let total = 0;
1594
+ for (let i = 0; i < 10; i++) total += digits[i];
1595
+ return total % 10 === digits[10];
1596
+ }
1597
+ /** Validate Argentine CUIT using mod-11 weighted checksum. */
1598
+ function arCuitChecksum(number) {
1599
+ let digits = "";
1600
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1601
+ if (digits.length !== 11) return false;
1602
+ const weights = [
1603
+ 5,
1604
+ 4,
1605
+ 3,
1606
+ 2,
1607
+ 7,
1608
+ 6,
1609
+ 5,
1610
+ 4,
1611
+ 3,
1612
+ 2
1613
+ ];
1614
+ let total = 0;
1615
+ for (let i = 0; i < 10; i++) total += parseInt(digits[i], 10) * weights[i];
1616
+ const remainder = total % 11;
1617
+ const check = remainder === 0 ? 0 : remainder === 1 ? 9 : 11 - remainder;
1618
+ return parseInt(digits[10], 10) === check;
1619
+ }
1620
+ /** Validate Chilean RUT using mod-11 checksum with K. */
1621
+ function clRutChecksum(number) {
1622
+ let cleaned = number.replace(/[.\s]/g, "").toUpperCase();
1623
+ if (cleaned.includes("-")) {
1624
+ const parts = cleaned.split("-");
1625
+ if (parts.length !== 2) return false;
1626
+ cleaned = parts[0] + parts[1];
1627
+ }
1628
+ if (cleaned.length < 2) return false;
1629
+ const body = cleaned.slice(0, -1);
1630
+ const check = cleaned.slice(-1);
1631
+ if (!/^\d+$/.test(body)) return false;
1632
+ let total = 0;
1633
+ let mul = 2;
1634
+ for (let i = body.length - 1; i >= 0; i--) {
1635
+ total += parseInt(body[i], 10) * mul;
1636
+ mul = mul === 7 ? 2 : mul + 1;
1637
+ }
1638
+ const remainder = 11 - total % 11;
1639
+ let expected;
1640
+ if (remainder === 11) expected = "0";
1641
+ else if (remainder === 10) expected = "K";
1642
+ else expected = String(remainder);
1643
+ return check === expected;
1644
+ }
1645
+ /** Validate Colombian NIT using mod-11 with prime-based weights. */
1646
+ function coNitChecksum(number) {
1647
+ let digits = "";
1648
+ for (const c of number) if (c >= "0" && c <= "9") digits += c;
1649
+ if (digits.length < 8 || digits.length > 10) return false;
1650
+ const body = digits.slice(0, -1);
1651
+ const check = parseInt(digits.slice(-1), 10);
1652
+ const weights = [
1653
+ 3,
1654
+ 7,
1655
+ 13,
1656
+ 17,
1657
+ 19,
1658
+ 23,
1659
+ 29,
1660
+ 37,
1661
+ 41,
1662
+ 43,
1663
+ 47,
1664
+ 53,
1665
+ 59,
1666
+ 67,
1667
+ 71
1668
+ ];
1669
+ let total = 0;
1670
+ for (let i = 0; i < body.length; i++) total += parseInt(body[body.length - 1 - i], 10) * weights[i];
1671
+ const remainder = total % 11;
1672
+ const expected = remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder;
1673
+ return check === expected;
1674
+ }
1675
+ /** Validate NHS number using modulus 11 checksum. */
1676
+ function nhsChecksum(number) {
1677
+ const digits = [];
1678
+ for (const c of number) if (c >= "0" && c <= "9") digits.push(parseInt(c, 10));
1679
+ if (digits.length !== 10) return false;
1680
+ const weights = [
1681
+ 10,
1682
+ 9,
1683
+ 8,
1684
+ 7,
1685
+ 6,
1686
+ 5,
1687
+ 4,
1688
+ 3,
1689
+ 2
1690
+ ];
1691
+ let total = 0;
1692
+ for (let i = 0; i < 9; i++) total += digits[i] * weights[i];
1693
+ const remainder = total % 11;
1694
+ let checkDigit = 11 - remainder;
1695
+ if (checkDigit === 11) checkDigit = 0;
1696
+ if (checkDigit === 10) return false;
1697
+ return digits[9] === checkDigit;
1698
+ }
1699
+ var ES_DNI_LETTERS, IT_ODD_TABLE, IT_EVEN_TABLE, VERHOEFF_D, VERHOEFF_P;
1700
+ var init_validators = __esm({ "src/regex/validators.ts"() {
1701
+ ES_DNI_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
1702
+ IT_ODD_TABLE = {
1703
+ "0": 1,
1704
+ "1": 0,
1705
+ "2": 5,
1706
+ "3": 7,
1707
+ "4": 9,
1708
+ "5": 13,
1709
+ "6": 15,
1710
+ "7": 17,
1711
+ "8": 19,
1712
+ "9": 21,
1713
+ A: 1,
1714
+ B: 0,
1715
+ C: 5,
1716
+ D: 7,
1717
+ E: 9,
1718
+ F: 13,
1719
+ G: 15,
1720
+ H: 17,
1721
+ I: 19,
1722
+ J: 21,
1723
+ K: 2,
1724
+ L: 4,
1725
+ M: 18,
1726
+ N: 20,
1727
+ O: 11,
1728
+ P: 3,
1729
+ Q: 6,
1730
+ R: 8,
1731
+ S: 12,
1732
+ T: 14,
1733
+ U: 16,
1734
+ V: 10,
1735
+ W: 22,
1736
+ X: 25,
1737
+ Y: 24,
1738
+ Z: 23
1739
+ };
1740
+ IT_EVEN_TABLE = {
1741
+ "0": 0,
1742
+ "1": 1,
1743
+ "2": 2,
1744
+ "3": 3,
1745
+ "4": 4,
1746
+ "5": 5,
1747
+ "6": 6,
1748
+ "7": 7,
1749
+ "8": 8,
1750
+ "9": 9,
1751
+ A: 0,
1752
+ B: 1,
1753
+ C: 2,
1754
+ D: 3,
1755
+ E: 4,
1756
+ F: 5,
1757
+ G: 6,
1758
+ H: 7,
1759
+ I: 8,
1760
+ J: 9,
1761
+ K: 10,
1762
+ L: 11,
1763
+ M: 12,
1764
+ N: 13,
1765
+ O: 14,
1766
+ P: 15,
1767
+ Q: 16,
1768
+ R: 17,
1769
+ S: 18,
1770
+ T: 19,
1771
+ U: 20,
1772
+ V: 21,
1773
+ W: 22,
1774
+ X: 23,
1775
+ Y: 24,
1776
+ Z: 25
1777
+ };
1778
+ VERHOEFF_D = [
1779
+ [
1780
+ 0,
1781
+ 1,
1782
+ 2,
1783
+ 3,
1784
+ 4,
1785
+ 5,
1786
+ 6,
1787
+ 7,
1788
+ 8,
1789
+ 9
1790
+ ],
1791
+ [
1792
+ 1,
1793
+ 2,
1794
+ 3,
1795
+ 4,
1796
+ 0,
1797
+ 6,
1798
+ 7,
1799
+ 8,
1800
+ 9,
1801
+ 5
1802
+ ],
1803
+ [
1804
+ 2,
1805
+ 3,
1806
+ 4,
1807
+ 0,
1808
+ 1,
1809
+ 7,
1810
+ 8,
1811
+ 9,
1812
+ 5,
1813
+ 6
1814
+ ],
1815
+ [
1816
+ 3,
1817
+ 4,
1818
+ 0,
1819
+ 1,
1820
+ 2,
1821
+ 8,
1822
+ 9,
1823
+ 5,
1824
+ 6,
1825
+ 7
1826
+ ],
1827
+ [
1828
+ 4,
1829
+ 0,
1830
+ 1,
1831
+ 2,
1832
+ 3,
1833
+ 9,
1834
+ 5,
1835
+ 6,
1836
+ 7,
1837
+ 8
1838
+ ],
1839
+ [
1840
+ 5,
1841
+ 9,
1842
+ 8,
1843
+ 7,
1844
+ 6,
1845
+ 0,
1846
+ 4,
1847
+ 3,
1848
+ 2,
1849
+ 1
1850
+ ],
1851
+ [
1852
+ 6,
1853
+ 5,
1854
+ 9,
1855
+ 8,
1856
+ 7,
1857
+ 1,
1858
+ 0,
1859
+ 4,
1860
+ 3,
1861
+ 2
1862
+ ],
1863
+ [
1864
+ 7,
1865
+ 6,
1866
+ 5,
1867
+ 9,
1868
+ 8,
1869
+ 2,
1870
+ 1,
1871
+ 0,
1872
+ 4,
1873
+ 3
1874
+ ],
1875
+ [
1876
+ 8,
1877
+ 7,
1878
+ 6,
1879
+ 5,
1880
+ 9,
1881
+ 3,
1882
+ 2,
1883
+ 1,
1884
+ 0,
1885
+ 4
1886
+ ],
1887
+ [
1888
+ 9,
1889
+ 8,
1890
+ 7,
1891
+ 6,
1892
+ 5,
1893
+ 4,
1894
+ 3,
1895
+ 2,
1896
+ 1,
1897
+ 0
1898
+ ]
1899
+ ];
1900
+ VERHOEFF_P = [
1901
+ [
1902
+ 0,
1903
+ 1,
1904
+ 2,
1905
+ 3,
1906
+ 4,
1907
+ 5,
1908
+ 6,
1909
+ 7,
1910
+ 8,
1911
+ 9
1912
+ ],
1913
+ [
1914
+ 1,
1915
+ 5,
1916
+ 7,
1917
+ 6,
1918
+ 2,
1919
+ 8,
1920
+ 3,
1921
+ 0,
1922
+ 9,
1923
+ 4
1924
+ ],
1925
+ [
1926
+ 5,
1927
+ 8,
1928
+ 0,
1929
+ 3,
1930
+ 7,
1931
+ 9,
1932
+ 6,
1933
+ 1,
1934
+ 4,
1935
+ 2
1936
+ ],
1937
+ [
1938
+ 8,
1939
+ 9,
1940
+ 1,
1941
+ 6,
1942
+ 0,
1943
+ 4,
1944
+ 3,
1945
+ 5,
1946
+ 2,
1947
+ 7
1948
+ ],
1949
+ [
1950
+ 9,
1951
+ 4,
1952
+ 5,
1953
+ 3,
1954
+ 1,
1955
+ 2,
1956
+ 6,
1957
+ 8,
1958
+ 7,
1959
+ 0
1960
+ ],
1961
+ [
1962
+ 4,
1963
+ 2,
1964
+ 8,
1965
+ 6,
1966
+ 5,
1967
+ 7,
1968
+ 3,
1969
+ 9,
1970
+ 0,
1971
+ 1
1972
+ ],
1973
+ [
1974
+ 2,
1975
+ 7,
1976
+ 9,
1977
+ 3,
1978
+ 8,
1979
+ 0,
1980
+ 6,
1981
+ 4,
1982
+ 1,
1983
+ 5
1984
+ ],
1985
+ [
1986
+ 7,
1987
+ 0,
1988
+ 4,
1989
+ 6,
1990
+ 9,
1991
+ 1,
1992
+ 3,
1993
+ 2,
1994
+ 5,
1995
+ 8
1996
+ ]
1997
+ ];
1998
+ } });
1999
+
2000
+ //#endregion
2001
+ //#region src/regex/detectors/credit-card.ts
2002
+ var CC_KNOWN, CC_GENERIC, CC_CONTEXT, CreditCardDetector;
2003
+ var init_credit_card = __esm({ "src/regex/detectors/credit-card.ts"() {
2004
+ init_base();
2005
+ init_entities();
2006
+ init_registry();
2007
+ init_validators();
2008
+ CC_KNOWN = new RegExp("\\b(?:4\\d{3}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}(?:[-\\s]?\\d{3})?|4\\d{12}|5[1-5]\\d{2}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}|2[2-7]\\d{2}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}|3[47]\\d{2}[-\\s]?\\d{6}[-\\s]?\\d{5}|6(?:011|5\\d{2})[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}|3(?:0[0-5]|[68]\\d)\\d{11,13}|35(?:2[89]|[3-8]\\d)\\d{12}|62\\d{14,17}|50(?:18|20|38)\\d{8,15}|6(?:304|7(?:59|6[1-3]))\\d{8,15})\\b", "g");
2009
+ CC_GENERIC = /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{1,7}\b/g;
2010
+ CC_CONTEXT = [
2011
+ "credit card",
2012
+ "card number",
2013
+ "card no",
2014
+ "card #",
2015
+ "cc:",
2016
+ "cc #",
2017
+ "payment card",
2018
+ "debit card",
2019
+ "billing",
2020
+ "card:",
2021
+ "credit",
2022
+ "payment"
2023
+ ];
2024
+ CreditCardDetector = class extends Detector {
2025
+ entityType = EntityType.CREDIT_CARD;
2026
+ score = .9;
2027
+ iterMatches(text) {
2028
+ if (!text.match(/\d/)) return [];
2029
+ const results = [];
2030
+ CC_KNOWN.lastIndex = 0;
2031
+ let match;
2032
+ while ((match = CC_KNOWN.exec(text)) !== null) {
2033
+ const matchedText = match[0];
2034
+ if (!luhnChecksum(matchedText)) continue;
2035
+ results.push({
2036
+ entityType: this.entityType,
2037
+ text: matchedText,
2038
+ start: match.index,
2039
+ end: match.index + matchedText.length,
2040
+ score: 1
2041
+ });
2042
+ }
2043
+ CC_GENERIC.lastIndex = 0;
2044
+ while ((match = CC_GENERIC.exec(text)) !== null) {
2045
+ const matchedText = match[0];
2046
+ const start = match.index;
2047
+ if (results.some((r) => r.start <= start && start < r.end)) continue;
2048
+ if (!luhnChecksum(matchedText)) continue;
2049
+ const windowStart = Math.max(0, start - 100);
2050
+ const lower = this._textLower || text.toLowerCase();
2051
+ const window = lower.slice(windowStart, start);
2052
+ if (!CC_CONTEXT.some((kw) => window.includes(kw))) continue;
2053
+ results.push({
2054
+ entityType: this.entityType,
2055
+ text: matchedText,
2056
+ start,
2057
+ end: start + matchedText.length,
2058
+ score: 1
2059
+ });
2060
+ }
2061
+ return results;
2062
+ }
2063
+ };
2064
+ registerUniversal(CreditCardDetector);
2065
+ } });
2066
+
2067
+ //#endregion
2068
+ //#region src/regex/detectors/phone.ts
2069
+ function phoneLengthCheck(text) {
2070
+ let digits = 0;
2071
+ for (const c of text) if (c >= "0" && c <= "9") digits++;
2072
+ if (digits < 7 || digits > 15) return false;
2073
+ if (DATE_LIKE.test(text)) return false;
2074
+ if (SSN_LIKE.test(text)) return false;
2075
+ return true;
2076
+ }
2077
+ var DATE_LIKE, SSN_LIKE, PhoneDetector;
2078
+ var init_phone = __esm({ "src/regex/detectors/phone.ts"() {
2079
+ init_base();
2080
+ init_entities();
2081
+ init_registry();
2082
+ DATE_LIKE = /^\d{1,2}[-./]\d{1,2}[-./]\d{2,4}$/;
2083
+ SSN_LIKE = /^\d{3}[-.\s]\d{2}[-.\s]\d{4}$/;
2084
+ PhoneDetector = class extends RegexDetector {
2085
+ entityType = EntityType.PHONE_NUMBER;
2086
+ score = .85;
2087
+ contextKeywords = [
2088
+ "phone",
2089
+ "tel",
2090
+ "telephone",
2091
+ "call",
2092
+ "mobile",
2093
+ "cell",
2094
+ "fax",
2095
+ "contact",
2096
+ "dial",
2097
+ "reach",
2098
+ "ring",
2099
+ "text",
2100
+ "sms",
2101
+ "whatsapp",
2102
+ "number",
2103
+ "ph#",
2104
+ "ph #",
2105
+ "cell#",
2106
+ "cell #"
2107
+ ];
2108
+ contextWindow = 80;
2109
+ pattern = new RegExp("(?<!\\d)(?:(?:\\+?1[-.\\s]?)?\\([2-9]\\d{2}\\)[-.\\s]?[2-9]\\d{2}[-.\\s]?\\d{4}|(?:\\+?1[-.\\s]?)?[2-9]\\d{2}[-.\\s][2-9]\\d{2}[-.\\s]?\\d{4}|\\+[1-9]\\d{0,2}[-.\\s]?\\(?\\d{1,4}\\)?[-.\\s]?\\d{1,4}[-.\\s]?\\d{1,9}|0\\d{1,3}[-.\\s]\\d{2,4}[-.\\s]?\\d{2,4}[-.\\s]?\\d{0,4})(?:\\s?(?:x|ext\\.?)\\s?\\d{1,5})?(?!\\d)", "g");
2110
+ validator = phoneLengthCheck;
2111
+ };
2112
+ registerUniversal(PhoneDetector);
2113
+ } });
2114
+
2115
+ //#endregion
2116
+ //#region src/regex/detectors/ip-address.ts
2117
+ var IPV4, IPV6, IpAddressDetector;
2118
+ var init_ip_address = __esm({ "src/regex/detectors/ip-address.ts"() {
2119
+ init_base();
2120
+ init_entities();
2121
+ init_registry();
2122
+ 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;
2123
+ IPV6 = new RegExp("\\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b|\\b(?:[0-9a-fA-F]{1,4}:){1,7}:\\b|\\b::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}\\b", "g");
2124
+ IpAddressDetector = class IpAddressDetector extends Detector {
2125
+ entityType = EntityType.IP_ADDRESS;
2126
+ score = .95;
2127
+ iterMatches(text) {
2128
+ const results = [];
2129
+ for (const pattern of [IPV4, IPV6]) {
2130
+ pattern.lastIndex = 0;
2131
+ let match;
2132
+ while ((match = pattern.exec(text)) !== null) {
2133
+ const matchedText = match[0];
2134
+ const start = match.index;
2135
+ if (pattern === IPV4 && IpAddressDetector.isVersionNumber(text, start)) continue;
2136
+ results.push({
2137
+ entityType: this.entityType,
2138
+ text: matchedText,
2139
+ start,
2140
+ end: start + matchedText.length,
2141
+ score: this.score
2142
+ });
2143
+ }
2144
+ }
2145
+ return results;
2146
+ }
2147
+ /** Skip patterns preceded by 'v' or 'version' that look like version numbers. */
2148
+ static isVersionNumber(text, start) {
2149
+ if (start > 0 && text[start - 1].toLowerCase() === "v") return true;
2150
+ const prefix = text.slice(Math.max(0, start - 10), start).toLowerCase().trim();
2151
+ return prefix.endsWith("version");
2152
+ }
2153
+ };
2154
+ registerUniversal(IpAddressDetector);
2155
+ } });
2156
+
2157
+ //#endregion
2158
+ //#region src/regex/detectors/url.ts
2159
+ function urlValidTld(text) {
2160
+ try {
2161
+ const afterScheme = text.split("://", 2)[1];
2162
+ if (!afterScheme) return false;
2163
+ const domain = afterScheme.split("/")[0].split("?")[0].split("#")[0];
2164
+ const parts = domain.replace(/\.$/, "").split(".");
2165
+ if (parts.length < 2) return false;
2166
+ const tld = parts[parts.length - 1].toLowerCase();
2167
+ return VALID_TLDS.has(tld);
2168
+ } catch {
2169
+ return false;
2170
+ }
2171
+ }
2172
+ var VALID_TLDS, UrlDetector;
2173
+ var init_url = __esm({ "src/regex/detectors/url.ts"() {
2174
+ init_base();
2175
+ init_entities();
2176
+ init_registry();
2177
+ VALID_TLDS = new Set([
2178
+ "com",
2179
+ "org",
2180
+ "net",
2181
+ "edu",
2182
+ "gov",
2183
+ "mil",
2184
+ "int",
2185
+ "io",
2186
+ "co",
2187
+ "dev",
2188
+ "app",
2189
+ "ai",
2190
+ "me",
2191
+ "us",
2192
+ "uk",
2193
+ "de",
2194
+ "fr",
2195
+ "it",
2196
+ "es",
2197
+ "nl",
2198
+ "be",
2199
+ "at",
2200
+ "ch",
2201
+ "se",
2202
+ "no",
2203
+ "dk",
2204
+ "fi",
2205
+ "pl",
2206
+ "cz",
2207
+ "sk",
2208
+ "pt",
2209
+ "ru",
2210
+ "br",
2211
+ "jp",
2212
+ "kr",
2213
+ "cn",
2214
+ "in",
2215
+ "au",
2216
+ "nz",
2217
+ "za",
2218
+ "ca",
2219
+ "mx",
2220
+ "ar",
2221
+ "cl",
2222
+ "il",
2223
+ "tr",
2224
+ "ie",
2225
+ "hu",
2226
+ "ro",
2227
+ "bg",
2228
+ "hr",
2229
+ "si",
2230
+ "lt",
2231
+ "lv",
2232
+ "ee",
2233
+ "info",
2234
+ "biz",
2235
+ "name",
2236
+ "pro",
2237
+ "xyz",
2238
+ "online",
2239
+ "site",
2240
+ "tech",
2241
+ "store",
2242
+ "shop",
2243
+ "cloud",
2244
+ "page",
2245
+ "link",
2246
+ "top",
2247
+ "icu",
2248
+ "live",
2249
+ "world",
2250
+ "blog",
2251
+ "news",
2252
+ "tv",
2253
+ "cc",
2254
+ "ly",
2255
+ "gg",
2256
+ "to",
2257
+ "eu",
2258
+ "asia"
2259
+ ]);
2260
+ UrlDetector = class extends RegexDetector {
2261
+ entityType = EntityType.URL;
2262
+ score = .85;
2263
+ needsDigit = false;
2264
+ pattern = /https?:\/\/(?:[\w\-]+\.)+[a-zA-Z]{2,}(?:\/[^\s<>"')\]]*)?/gi;
2265
+ validator = urlValidTld;
2266
+ preCheck(text) {
2267
+ return text.includes("://");
2268
+ }
2269
+ };
2270
+ registerUniversal(UrlDetector);
2271
+ } });
2272
+
2273
+ //#endregion
2274
+ //#region src/regex/detectors/mac-address.ts
2275
+ var MacAddressDetector;
2276
+ var init_mac_address = __esm({ "src/regex/detectors/mac-address.ts"() {
2277
+ init_base();
2278
+ init_entities();
2279
+ init_registry();
2280
+ MacAddressDetector = class extends RegexDetector {
2281
+ entityType = EntityType.MAC_ADDRESS;
2282
+ score = .95;
2283
+ pattern = /\b(?:[0-9A-Fa-f]{2}[:\-]){5}[0-9A-Fa-f]{2}\b/g;
2284
+ };
2285
+ registerUniversal(MacAddressDetector);
2286
+ } });
2287
+
2288
+ //#endregion
2289
+ //#region src/regex/detectors/date-of-birth.ts
2290
+ function validDate(text) {
2291
+ if (/[a-zA-Z]/i.test(text.replace(/T/g, ""))) return true;
2292
+ const groups = text.match(/\d+/g);
2293
+ return groups !== null && groups.length >= 3;
2294
+ }
2295
+ var MONTHS, DateOfBirthDetector;
2296
+ var init_date_of_birth = __esm({ "src/regex/detectors/date-of-birth.ts"() {
2297
+ init_base();
2298
+ init_entities();
2299
+ init_registry();
2300
+ MONTHS = "(?:january|february|march|april|may|june|july|august|september|october|november|december|jan|feb|mar|apr|jun|jul|aug|sep|oct|nov|dec)";
2301
+ DateOfBirthDetector = class extends RegexDetector {
2302
+ entityType = EntityType.DATE_OF_BIRTH;
2303
+ score = .75;
2304
+ contextKeywords = [
2305
+ "born",
2306
+ "dob",
2307
+ "date of birth",
2308
+ "birthday",
2309
+ "birthdate",
2310
+ "d.o.b",
2311
+ "birth date",
2312
+ "birth",
2313
+ "b-day",
2314
+ "bday",
2315
+ "age",
2316
+ "d/o/b",
2317
+ "born on",
2318
+ "date de naissance",
2319
+ "geburtsdatum",
2320
+ "fecha de nacimiento",
2321
+ "geboortedatum",
2322
+ "data di nascita"
2323
+ ];
2324
+ contextRequired = true;
2325
+ contextWindow = 100;
2326
+ validator = validDate;
2327
+ pattern = new RegExp(
2328
+ // MM/DD/YYYY (4-digit year, month 1-12)
2329
+ "\\b(?:0?[1-9]|1[0-2])[/\\-.](?:0?[1-9]|[12]\\d|3[01])[/\\-.](?:19|20)\\d{2}\\b|\\b(?:1[3-9]|2\\d|3[01])[/\\-.](?:0?[1-9]|1[0-2])[/\\-.](?:19|20)\\d{2}\\b|\\b(?:0?[1-9]|1[0-2])[/\\-.](?:0?[1-9]|[12]\\d|3[01])[/\\-.]\\d{2}\\b|\\b(?:1[3-9]|2\\d|3[01])[/\\-.](?:0?[1-9]|1[0-2])[/\\-.]\\d{2}\\b|\\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|\\b" + MONTHS + "\\s+\\d{1,2}(?:st|nd|rd|th)?,?\\s+(?:19|20)\\d{2}\\b|\\b\\d{1,2}(?:st|nd|rd|th)?\\s+" + MONTHS + ",?\\s+(?:19|20)\\d{2}\\b|\\b" + MONTHS + "[/\\-.]\\d{2}\\b",
2330
+ "gi"
2331
+ );
2332
+ };
2333
+ registerUniversal(DateOfBirthDetector);
2334
+ } });
2335
+
2336
+ //#endregion
2337
+ //#region src/regex/detectors/cvv.ts
2338
+ var CvvDetector;
2339
+ var init_cvv = __esm({ "src/regex/detectors/cvv.ts"() {
2340
+ init_base();
2341
+ init_entities();
2342
+ init_registry();
2343
+ CvvDetector = class extends RegexDetector {
2344
+ entityType = EntityType.CVV;
2345
+ score = .8;
2346
+ contextKeywords = [
2347
+ "cvv",
2348
+ "cvc",
2349
+ "security code",
2350
+ "card verification",
2351
+ "cvv2",
2352
+ "cvc2",
2353
+ "csv"
2354
+ ];
2355
+ contextRequired = true;
2356
+ contextWindow = 50;
2357
+ pattern = /\b\d{3,4}\b/g;
2358
+ };
2359
+ registerUniversal(CvvDetector);
2360
+ } });
2361
+
2362
+ //#endregion
2363
+ //#region src/regex/detectors/us/ssn.ts
2364
+ var SSN_WITH_SEP, SSN_NO_SEP, SsnDetector;
2365
+ var init_ssn = __esm({ "src/regex/detectors/us/ssn.ts"() {
2366
+ init_base();
2367
+ init_entities();
2368
+ init_registry();
2369
+ init_validators();
2370
+ SSN_WITH_SEP = new RegExp("\\b(?!000|666|9\\d{2})\\d{3}[-.\\s](?!00)\\d{2}[-.\\s](?!0000)\\d{4}\\b", "g");
2371
+ SSN_NO_SEP = new RegExp("\\b(?!000|666|9\\d{2})\\d{3}(?!00)\\d{2}(?!0000)\\d{4}\\b", "g");
2372
+ SsnDetector = class extends Detector {
2373
+ entityType = EntityType.SSN;
2374
+ score = .85;
2375
+ contextKeywords = [
2376
+ "ssn",
2377
+ "social security",
2378
+ "social sec",
2379
+ "ss#",
2380
+ "ss #",
2381
+ "social",
2382
+ "tax id",
2383
+ "taxpayer",
2384
+ "tin",
2385
+ "social number",
2386
+ "soc number",
2387
+ "socialnum"
2388
+ ];
2389
+ contextRequired = false;
2390
+ contextWindow = 100;
2391
+ iterMatches(text) {
2392
+ const results = [];
2393
+ SSN_WITH_SEP.lastIndex = 0;
2394
+ let match;
2395
+ while ((match = SSN_WITH_SEP.exec(text)) !== null) {
2396
+ const matchedText = match[0];
2397
+ if (!ssnValidFormat(matchedText)) continue;
2398
+ const start = match.index;
2399
+ const end = start + matchedText.length;
2400
+ const hasCtx = this.hasContext(text, start, end);
2401
+ results.push({
2402
+ entityType: this.entityType,
2403
+ text: matchedText,
2404
+ start,
2405
+ end,
2406
+ score: hasCtx ? 1 : this.score
2407
+ });
2408
+ }
2409
+ SSN_NO_SEP.lastIndex = 0;
2410
+ while ((match = SSN_NO_SEP.exec(text)) !== null) {
2411
+ const matchedText = match[0];
2412
+ const start = match.index;
2413
+ const end = start + matchedText.length;
2414
+ if (results.some((r) => r.start <= start && start < r.end)) continue;
2415
+ if (!ssnValidFormat(matchedText)) continue;
2416
+ if (!this.hasContext(text, start, end)) continue;
2417
+ results.push({
2418
+ entityType: this.entityType,
2419
+ text: matchedText,
2420
+ start,
2421
+ end,
2422
+ score: 1
2423
+ });
2424
+ }
2425
+ return results;
2426
+ }
2427
+ };
2428
+ registerRegion("us", SsnDetector);
2429
+ } });
2430
+
2431
+ //#endregion
2432
+ //#region src/regex/detectors/us/drivers-license.ts
2433
+ var DriversLicenseDetector;
2434
+ var init_drivers_license = __esm({ "src/regex/detectors/us/drivers-license.ts"() {
2435
+ init_base();
2436
+ init_entities();
2437
+ init_registry();
2438
+ DriversLicenseDetector = class extends RegexDetector {
2439
+ entityType = EntityType.DRIVERS_LICENSE;
2440
+ score = .75;
2441
+ contextKeywords = [
2442
+ "driver",
2443
+ "license",
2444
+ "licence",
2445
+ "dl",
2446
+ "driver's license",
2447
+ "driving license",
2448
+ "dl#",
2449
+ "dl #",
2450
+ "dmv",
2451
+ "permit"
2452
+ ];
2453
+ contextRequired = true;
2454
+ contextWindow = 50;
2455
+ pattern = new RegExp("\\b(?:[A-Z]\\d{14}|[A-Z]\\d{13}|[A-Z]\\d{12}|[A-Z]\\d{11}|[A-Z]\\d{10}|[A-Z]\\d{8}|[A-Z]{2}\\d{6}|[A-Z]\\d{7}|\\d{9}|\\d{8})\\b", "g");
2456
+ };
2457
+ registerRegion("us", DriversLicenseDetector);
2458
+ } });
2459
+
2460
+ //#endregion
2461
+ //#region src/regex/detectors/us/passport.ts
2462
+ var UsPassportDetector;
2463
+ var init_passport$1 = __esm({ "src/regex/detectors/us/passport.ts"() {
2464
+ init_base();
2465
+ init_entities();
2466
+ init_registry();
2467
+ UsPassportDetector = class extends RegexDetector {
2468
+ entityType = EntityType.US_PASSPORT;
2469
+ score = .75;
2470
+ contextKeywords = [
2471
+ "passport",
2472
+ "passport#",
2473
+ "passport #",
2474
+ "passport number",
2475
+ "passport no"
2476
+ ];
2477
+ contextRequired = true;
2478
+ contextWindow = 50;
2479
+ pattern = /\b\d{9}\b/g;
2480
+ };
2481
+ registerRegion("us", UsPassportDetector);
2482
+ } });
2483
+
2484
+ //#endregion
2485
+ //#region src/regex/detectors/us/tax-id.ts
2486
+ var TaxIdDetector;
2487
+ var init_tax_id$2 = __esm({ "src/regex/detectors/us/tax-id.ts"() {
2488
+ init_base();
2489
+ init_entities();
2490
+ init_registry();
2491
+ TaxIdDetector = class extends RegexDetector {
2492
+ entityType = EntityType.TAX_ID;
2493
+ score = .8;
2494
+ contextKeywords = [
2495
+ "ein",
2496
+ "tax id",
2497
+ "tax identification",
2498
+ "employer identification",
2499
+ "tin",
2500
+ "tax #",
2501
+ "ein#"
2502
+ ];
2503
+ contextRequired = true;
2504
+ contextWindow = 50;
2505
+ pattern = /\b\d{2}-\d{7}\b/g;
2506
+ };
2507
+ registerRegion("us", TaxIdDetector);
2508
+ } });
2509
+
2510
+ //#endregion
2511
+ //#region src/regex/detectors/us/zip-code.ts
2512
+ function zipValid(text) {
2513
+ let digits = "";
2514
+ for (const c of text) if (c >= "0" && c <= "9") digits += c;
2515
+ return !digits.startsWith("000");
2516
+ }
2517
+ var ZipCodeDetector;
2518
+ var init_zip_code = __esm({ "src/regex/detectors/us/zip-code.ts"() {
2519
+ init_base();
2520
+ init_entities();
2521
+ init_registry();
2522
+ ZipCodeDetector = class extends RegexDetector {
2523
+ entityType = EntityType.ZIP_CODE;
2524
+ score = .7;
2525
+ contextKeywords = [
2526
+ "zip",
2527
+ "postal",
2528
+ "zip code",
2529
+ "zipcode",
2530
+ "postal code",
2531
+ "address",
2532
+ "city",
2533
+ "state",
2534
+ "mailing",
2535
+ "shipping",
2536
+ "billing",
2537
+ "delivery",
2538
+ "location",
2539
+ "resident",
2540
+ "zip+4",
2541
+ "usa",
2542
+ "united states"
2543
+ ];
2544
+ contextRequired = true;
2545
+ contextWindow = 150;
2546
+ pattern = /\b\d{5}(?:-\d{4})?\b/g;
2547
+ validator = zipValid;
2548
+ };
2549
+ registerRegion("us", ZipCodeDetector);
2550
+ } });
2551
+
2552
+ //#endregion
2553
+ //#region src/regex/detectors/us/itin.ts
2554
+ var UsItinDetector;
2555
+ var init_itin = __esm({ "src/regex/detectors/us/itin.ts"() {
2556
+ init_base();
2557
+ init_entities();
2558
+ init_registry();
2559
+ init_validators();
2560
+ UsItinDetector = class extends RegexDetector {
2561
+ entityType = EntityType.US_ITIN;
2562
+ score = .85;
2563
+ contextKeywords = [
2564
+ "itin",
2565
+ "individual taxpayer",
2566
+ "tax identification"
2567
+ ];
2568
+ contextRequired = true;
2569
+ pattern = /\b9\d{2}[- ]?\d{2}[- ]?\d{4}\b/g;
2570
+ validator = usItinValid;
2571
+ };
2572
+ registerRegion("us", UsItinDetector);
2573
+ } });
2574
+
2575
+ //#endregion
2576
+ //#region src/regex/detectors/us/index.ts
2577
+ var init_us = __esm({ "src/regex/detectors/us/index.ts"() {
2578
+ init_ssn();
2579
+ init_drivers_license();
2580
+ init_passport$1();
2581
+ init_tax_id$2();
2582
+ init_zip_code();
2583
+ init_itin();
2584
+ } });
2585
+
2586
+ //#endregion
2587
+ //#region src/regex/detectors/eu/iban.ts
2588
+ var IbanDetector;
2589
+ var init_iban = __esm({ "src/regex/detectors/eu/iban.ts"() {
2590
+ init_base();
2591
+ init_entities();
2592
+ init_registry();
2593
+ init_validators();
2594
+ IbanDetector = class extends RegexDetector {
2595
+ entityType = EntityType.IBAN;
2596
+ score = .9;
2597
+ pattern = /\b[A-Z]{2}\d{2}\s?[\dA-Z]{4}(?:\s?[\dA-Z]{4}){1,7}(?:\s?[\dA-Z]{1,4})?\b/g;
2598
+ validator = ibanMod97;
2599
+ };
2600
+ registerRegion("eu", IbanDetector);
2601
+ } });
2602
+
2603
+ //#endregion
2604
+ //#region src/regex/detectors/eu/postal-code.ts
2605
+ var EuPostalCodeDetector;
2606
+ var init_postal_code = __esm({ "src/regex/detectors/eu/postal-code.ts"() {
2607
+ init_base();
2608
+ init_entities();
2609
+ init_registry();
2610
+ EuPostalCodeDetector = class extends RegexDetector {
2611
+ entityType = EntityType.EU_POSTAL_CODE;
2612
+ score = .7;
2613
+ contextKeywords = [
2614
+ "postal",
2615
+ "postcode",
2616
+ "post code",
2617
+ "zip",
2618
+ "plz",
2619
+ "postleitzahl",
2620
+ "code postal"
2621
+ ];
2622
+ contextRequired = true;
2623
+ contextWindow = 50;
2624
+ pattern = new RegExp("\\b(?:\\d{5}|\\d{4}\\s?[A-Z]{2})\\b", "g");
2625
+ };
2626
+ registerRegion("eu", EuPostalCodeDetector);
2627
+ } });
2628
+
2629
+ //#endregion
2630
+ //#region src/regex/detectors/eu/vat-id.ts
2631
+ var VatIdDetector;
2632
+ var init_vat_id = __esm({ "src/regex/detectors/eu/vat-id.ts"() {
2633
+ init_base();
2634
+ init_entities();
2635
+ init_registry();
2636
+ VatIdDetector = class extends RegexDetector {
2637
+ entityType = EntityType.VAT_ID;
2638
+ score = .9;
2639
+ pattern = new RegExp("\\b(?:ATU\\d{8}|BE[01]\\d{9}|DE\\d{9}|DK\\d{8}|ES[A-Z0-9]\\d{7}[A-Z0-9]|FI\\d{8}|FR[A-Z0-9]{2}\\d{9}|IT\\d{11}|LU\\d{8}|NL\\d{9}B\\d{2}|PL\\d{10}|PT\\d{9}|SE\\d{12})\\b", "g");
2640
+ };
2641
+ registerRegion("eu", VatIdDetector);
2642
+ } });
2643
+
2644
+ //#endregion
2645
+ //#region src/regex/detectors/eu/index.ts
2646
+ var init_eu = __esm({ "src/regex/detectors/eu/index.ts"() {
2647
+ init_iban();
2648
+ init_postal_code();
2649
+ init_vat_id();
2650
+ } });
2651
+
2652
+ //#endregion
2653
+ //#region src/regex/detectors/uk/ni-number.ts
2654
+ var NiNumberDetector;
2655
+ var init_ni_number = __esm({ "src/regex/detectors/uk/ni-number.ts"() {
2656
+ init_base();
2657
+ init_entities();
2658
+ init_registry();
2659
+ NiNumberDetector = class extends RegexDetector {
2660
+ entityType = EntityType.NI_NUMBER;
2661
+ score = .9;
2662
+ pattern = new RegExp("\\b(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?[A-D]\\b", "gi");
2663
+ };
2664
+ registerRegion("uk", NiNumberDetector);
2665
+ } });
2666
+
2667
+ //#endregion
2668
+ //#region src/regex/detectors/uk/nhs-number.ts
2669
+ var NhsNumberDetector;
2670
+ var init_nhs_number = __esm({ "src/regex/detectors/uk/nhs-number.ts"() {
2671
+ init_base();
2672
+ init_entities();
2673
+ init_registry();
2674
+ init_validators();
2675
+ NhsNumberDetector = class extends RegexDetector {
2676
+ entityType = EntityType.NHS_NUMBER;
2677
+ score = .85;
2678
+ contextKeywords = [
2679
+ "nhs",
2680
+ "national health",
2681
+ "nhs number",
2682
+ "nhs#"
2683
+ ];
2684
+ contextRequired = false;
2685
+ contextWindow = 50;
2686
+ pattern = /\b\d{3}\s?\d{3}\s?\d{4}\b/g;
2687
+ validator = nhsChecksum;
2688
+ };
2689
+ registerRegion("uk", NhsNumberDetector);
2690
+ } });
2691
+
2692
+ //#endregion
2693
+ //#region src/regex/detectors/uk/postcode.ts
2694
+ var UkPostcodeDetector;
2695
+ var init_postcode = __esm({ "src/regex/detectors/uk/postcode.ts"() {
2696
+ init_base();
2697
+ init_entities();
2698
+ init_registry();
2699
+ UkPostcodeDetector = class extends RegexDetector {
2700
+ entityType = EntityType.UK_POSTCODE;
2701
+ score = .85;
2702
+ pattern = new RegExp("\\b(?:[A-Z]{1,2}\\d[A-Z\\d]?\\s?\\d[A-Z]{2})\\b", "gi");
2703
+ };
2704
+ registerRegion("uk", UkPostcodeDetector);
2705
+ } });
2706
+
2707
+ //#endregion
2708
+ //#region src/regex/detectors/uk/passport.ts
2709
+ var UkPassportDetector;
2710
+ var init_passport = __esm({ "src/regex/detectors/uk/passport.ts"() {
2711
+ init_base();
2712
+ init_entities();
2713
+ init_registry();
2714
+ UkPassportDetector = class extends RegexDetector {
2715
+ entityType = EntityType.UK_PASSPORT;
2716
+ score = .75;
2717
+ contextKeywords = [
2718
+ "passport",
2719
+ "passport#",
2720
+ "passport #",
2721
+ "passport number",
2722
+ "passport no"
2723
+ ];
2724
+ contextRequired = true;
2725
+ contextWindow = 50;
2726
+ pattern = /\b\d{9}\b/g;
2727
+ };
2728
+ registerRegion("uk", UkPassportDetector);
2729
+ } });
2730
+
2731
+ //#endregion
2732
+ //#region src/regex/detectors/uk/utr.ts
2733
+ var UkUtrDetector;
2734
+ var init_utr = __esm({ "src/regex/detectors/uk/utr.ts"() {
2735
+ init_base();
2736
+ init_entities();
2737
+ init_registry();
2738
+ init_validators();
2739
+ UkUtrDetector = class extends RegexDetector {
2740
+ entityType = EntityType.UK_UTR;
2741
+ score = .85;
2742
+ contextKeywords = [
2743
+ "utr",
2744
+ "unique taxpayer",
2745
+ "tax reference",
2746
+ "self assessment",
2747
+ "hmrc"
2748
+ ];
2749
+ contextRequired = true;
2750
+ pattern = /\b\d{10}\b/g;
2751
+ validator = ukUtrChecksum;
2752
+ };
2753
+ registerRegion("uk", UkUtrDetector);
2754
+ } });
2755
+
2756
+ //#endregion
2757
+ //#region src/regex/detectors/uk/index.ts
2758
+ var init_uk = __esm({ "src/regex/detectors/uk/index.ts"() {
2759
+ init_ni_number();
2760
+ init_nhs_number();
2761
+ init_postcode();
2762
+ init_passport();
2763
+ init_utr();
2764
+ } });
2765
+
2766
+ //#endregion
2767
+ //#region src/regex/detectors/de/personal-id.ts
2768
+ var DePersonalIdDetector;
2769
+ var init_personal_id = __esm({ "src/regex/detectors/de/personal-id.ts"() {
2770
+ init_base();
2771
+ init_entities();
2772
+ init_registry();
2773
+ DePersonalIdDetector = class extends RegexDetector {
2774
+ entityType = EntityType.DE_PERSONAL_ID;
2775
+ score = .75;
2776
+ contextKeywords = [
2777
+ "personalausweis",
2778
+ "personal id",
2779
+ "ausweis",
2780
+ "identifikation",
2781
+ "id-nummer",
2782
+ "ausweisnummer"
2783
+ ];
2784
+ contextRequired = true;
2785
+ contextWindow = 50;
2786
+ pattern = /\b[CFGHJKLMNPRTVWXYZ][0-9A-Z][0-9]{7}[0-9]\b/gi;
2787
+ };
2788
+ registerRegion("de", DePersonalIdDetector);
2789
+ } });
2790
+
2791
+ //#endregion
2792
+ //#region src/regex/detectors/de/tax-id.ts
2793
+ var DeTaxIdDetector;
2794
+ var init_tax_id$1 = __esm({ "src/regex/detectors/de/tax-id.ts"() {
2795
+ init_base();
2796
+ init_entities();
2797
+ init_registry();
2798
+ init_validators();
2799
+ DeTaxIdDetector = class extends RegexDetector {
2800
+ entityType = EntityType.DE_TAX_ID;
2801
+ score = .85;
2802
+ contextKeywords = [
2803
+ "steuer",
2804
+ "tax id",
2805
+ "steueridentifikationsnummer",
2806
+ "tin",
2807
+ "identifikationsnummer",
2808
+ "steuernummer"
2809
+ ];
2810
+ contextRequired = false;
2811
+ pattern = /\b\d{2}\s?\d{3}\s?\d{3}\s?\d{3}\b/g;
2812
+ validator = deTaxIdChecksum;
2813
+ };
2814
+ registerRegion("de", DeTaxIdDetector);
2815
+ } });
2816
+
2817
+ //#endregion
2818
+ //#region src/regex/detectors/de/index.ts
2819
+ var init_de = __esm({ "src/regex/detectors/de/index.ts"() {
2820
+ init_personal_id();
2821
+ init_tax_id$1();
2822
+ } });
2823
+
2824
+ //#endregion
2825
+ //#region src/regex/detectors/fr/national-id.ts
2826
+ var FrNationalIdDetector;
2827
+ var init_national_id = __esm({ "src/regex/detectors/fr/national-id.ts"() {
2828
+ init_base();
2829
+ init_entities();
2830
+ init_registry();
2831
+ init_validators();
2832
+ FrNationalIdDetector = class extends RegexDetector {
2833
+ entityType = EntityType.FR_NATIONAL_ID;
2834
+ score = .9;
2835
+ contextKeywords = [
2836
+ "nir",
2837
+ "securite sociale",
2838
+ "social security",
2839
+ "numero national",
2840
+ "insee"
2841
+ ];
2842
+ contextRequired = false;
2843
+ 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;
2844
+ validator = frNirChecksum;
2845
+ };
2846
+ registerRegion("fr", FrNationalIdDetector);
2847
+ } });
2848
+
2849
+ //#endregion
2850
+ //#region src/regex/detectors/fr/siren.ts
2851
+ var FrSirenDetector;
2852
+ var init_siren = __esm({ "src/regex/detectors/fr/siren.ts"() {
2853
+ init_base();
2854
+ init_entities();
2855
+ init_registry();
2856
+ init_validators();
2857
+ FrSirenDetector = class extends RegexDetector {
2858
+ entityType = EntityType.FR_SIREN;
2859
+ score = .85;
2860
+ contextKeywords = [
2861
+ "siren",
2862
+ "siret",
2863
+ "registre du commerce",
2864
+ "rcs",
2865
+ "company number"
2866
+ ];
2867
+ contextRequired = true;
2868
+ pattern = /\b\d{3}[- ]?\d{3}[- ]?\d{3}\b/g;
2869
+ validator = luhnChecksum;
2870
+ };
2871
+ registerRegion("fr", FrSirenDetector);
2872
+ } });
2873
+
2874
+ //#endregion
2875
+ //#region src/regex/detectors/fr/index.ts
2876
+ var init_fr = __esm({ "src/regex/detectors/fr/index.ts"() {
2877
+ init_national_id();
2878
+ init_siren();
2879
+ } });
2880
+
2881
+ //#endregion
2882
+ //#region src/regex/detectors/es/dni.ts
2883
+ var EsDniDetector;
2884
+ var init_dni = __esm({ "src/regex/detectors/es/dni.ts"() {
2885
+ init_base();
2886
+ init_entities();
2887
+ init_registry();
2888
+ init_validators();
2889
+ EsDniDetector = class extends RegexDetector {
2890
+ entityType = EntityType.ES_DNI;
2891
+ score = .9;
2892
+ contextKeywords = [
2893
+ "dni",
2894
+ "documento nacional",
2895
+ "identidad"
2896
+ ];
2897
+ contextRequired = false;
2898
+ pattern = /\b\d{8}[-\s]?[A-Z]\b/gi;
2899
+ validator = esDniLetter;
2900
+ };
2901
+ registerRegion("es", EsDniDetector);
2902
+ } });
2903
+
2904
+ //#endregion
2905
+ //#region src/regex/detectors/es/nie.ts
2906
+ var EsNieDetector;
2907
+ var init_nie = __esm({ "src/regex/detectors/es/nie.ts"() {
2908
+ init_base();
2909
+ init_entities();
2910
+ init_registry();
2911
+ init_validators();
2912
+ EsNieDetector = class extends RegexDetector {
2913
+ entityType = EntityType.ES_NIE;
2914
+ score = .9;
2915
+ contextKeywords = [
2916
+ "nie",
2917
+ "extranjero",
2918
+ "numero de identidad"
2919
+ ];
2920
+ contextRequired = false;
2921
+ pattern = /\b[XYZ]\d{7}[-\s]?[A-Z]\b/gi;
2922
+ validator = esNieLetter;
2923
+ };
2924
+ registerRegion("es", EsNieDetector);
2925
+ } });
2926
+
2927
+ //#endregion
2928
+ //#region src/regex/detectors/es/nss.ts
2929
+ var EsNssDetector;
2930
+ var init_nss = __esm({ "src/regex/detectors/es/nss.ts"() {
2931
+ init_base();
2932
+ init_entities();
2933
+ init_registry();
2934
+ init_validators();
2935
+ EsNssDetector = class extends RegexDetector {
2936
+ entityType = EntityType.ES_NSS;
2937
+ score = .85;
2938
+ contextKeywords = [
2939
+ "nss",
2940
+ "numero seguridad social",
2941
+ "seguridad social",
2942
+ "social security"
2943
+ ];
2944
+ contextRequired = true;
2945
+ pattern = /\b\d{2}[- ]?\d{8}[- ]?\d{2}\b/g;
2946
+ validator = esNssChecksum;
2947
+ };
2948
+ registerRegion("es", EsNssDetector);
2949
+ } });
2950
+
2951
+ //#endregion
2952
+ //#region src/regex/detectors/es/cif.ts
2953
+ var EsCifDetector;
2954
+ var init_cif = __esm({ "src/regex/detectors/es/cif.ts"() {
2955
+ init_base();
2956
+ init_entities();
2957
+ init_registry();
2958
+ init_validators();
2959
+ EsCifDetector = class extends RegexDetector {
2960
+ entityType = EntityType.ES_CIF;
2961
+ score = .85;
2962
+ contextKeywords = [
2963
+ "cif",
2964
+ "codigo de identificacion fiscal",
2965
+ "tax id",
2966
+ "nif empresa"
2967
+ ];
2968
+ contextRequired = false;
2969
+ pattern = /\b[A-HJ-NP-SUVW]\d{7}[0-9A-J]\b/gi;
2970
+ validator = esCifChecksum;
2971
+ };
2972
+ registerRegion("es", EsCifDetector);
2973
+ } });
2974
+
2975
+ //#endregion
2976
+ //#region src/regex/detectors/es/index.ts
2977
+ var init_es = __esm({ "src/regex/detectors/es/index.ts"() {
2978
+ init_dni();
2979
+ init_nie();
2980
+ init_nss();
2981
+ init_cif();
2982
+ } });
2983
+
2984
+ //#endregion
2985
+ //#region src/regex/detectors/it/codice-fiscale.ts
2986
+ var ItCodiceFiscaleDetector;
2987
+ var init_codice_fiscale = __esm({ "src/regex/detectors/it/codice-fiscale.ts"() {
2988
+ init_base();
2989
+ init_entities();
2990
+ init_registry();
2991
+ init_validators();
2992
+ ItCodiceFiscaleDetector = class extends RegexDetector {
2993
+ entityType = EntityType.IT_CODICE_FISCALE;
2994
+ score = .9;
2995
+ contextKeywords = [
2996
+ "codice fiscale",
2997
+ "cf",
2998
+ "fiscal code"
2999
+ ];
3000
+ contextRequired = false;
3001
+ pattern = /\b[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]\b/gi;
3002
+ validator = itCodiceFiscaleCheck;
3003
+ };
3004
+ registerRegion("it", ItCodiceFiscaleDetector);
3005
+ } });
3006
+
3007
+ //#endregion
3008
+ //#region src/regex/detectors/it/partita-iva.ts
3009
+ var ItPartitaIvaDetector;
3010
+ var init_partita_iva = __esm({ "src/regex/detectors/it/partita-iva.ts"() {
3011
+ init_base();
3012
+ init_entities();
3013
+ init_registry();
3014
+ init_validators();
3015
+ ItPartitaIvaDetector = class extends RegexDetector {
3016
+ entityType = EntityType.IT_PARTITA_IVA;
3017
+ score = .85;
3018
+ contextKeywords = [
3019
+ "partita iva",
3020
+ "p.iva",
3021
+ "p. iva",
3022
+ "vat",
3023
+ "iva"
3024
+ ];
3025
+ contextRequired = true;
3026
+ pattern = /\b(?:IT)?\d{11}\b/gi;
3027
+ validator = itPartitaIvaChecksum;
3028
+ };
3029
+ registerRegion("it", ItPartitaIvaDetector);
3030
+ } });
3031
+
3032
+ //#endregion
3033
+ //#region src/regex/detectors/it/index.ts
3034
+ var init_it = __esm({ "src/regex/detectors/it/index.ts"() {
3035
+ init_codice_fiscale();
3036
+ init_partita_iva();
3037
+ } });
3038
+
3039
+ //#endregion
3040
+ //#region src/regex/detectors/pt/nif.ts
3041
+ var PtNifDetector;
3042
+ var init_nif = __esm({ "src/regex/detectors/pt/nif.ts"() {
3043
+ init_base();
3044
+ init_entities();
3045
+ init_registry();
3046
+ init_validators();
3047
+ PtNifDetector = class extends RegexDetector {
3048
+ entityType = EntityType.PT_NIF;
3049
+ score = .85;
3050
+ contextKeywords = [
3051
+ "nif",
3052
+ "contribuinte",
3053
+ "fiscal",
3054
+ "tax"
3055
+ ];
3056
+ contextRequired = true;
3057
+ pattern = /\b[1-3589]\d{8}\b/g;
3058
+ validator = ptNifChecksum;
3059
+ };
3060
+ registerRegion("pt", PtNifDetector);
3061
+ } });
3062
+
3063
+ //#endregion
3064
+ //#region src/regex/detectors/pt/index.ts
3065
+ var init_pt = __esm({ "src/regex/detectors/pt/index.ts"() {
3066
+ init_nif();
3067
+ } });
3068
+
3069
+ //#endregion
3070
+ //#region src/regex/detectors/pl/pesel.ts
3071
+ var PlPeselDetector;
3072
+ var init_pesel = __esm({ "src/regex/detectors/pl/pesel.ts"() {
3073
+ init_base();
3074
+ init_entities();
3075
+ init_registry();
3076
+ init_validators();
3077
+ PlPeselDetector = class extends RegexDetector {
3078
+ entityType = EntityType.PL_PESEL;
3079
+ score = .85;
3080
+ contextKeywords = ["pesel"];
3081
+ contextRequired = false;
3082
+ pattern = /\b\d{11}\b/g;
3083
+ validator = plPeselChecksum;
3084
+ };
3085
+ registerRegion("pl", PlPeselDetector);
3086
+ } });
3087
+
3088
+ //#endregion
3089
+ //#region src/regex/detectors/pl/nip.ts
3090
+ var PlNipDetector;
3091
+ var init_nip = __esm({ "src/regex/detectors/pl/nip.ts"() {
3092
+ init_base();
3093
+ init_entities();
3094
+ init_registry();
3095
+ init_validators();
3096
+ PlNipDetector = class extends RegexDetector {
3097
+ entityType = EntityType.PL_NIP;
3098
+ score = .85;
3099
+ contextKeywords = [
3100
+ "nip",
3101
+ "tax",
3102
+ "podatkowy"
3103
+ ];
3104
+ contextRequired = true;
3105
+ pattern = /\b\d{3}[-\s]?\d{3}[-\s]?\d{2}[-\s]?\d{2}\b/g;
3106
+ validator = plNipChecksum;
3107
+ };
3108
+ registerRegion("pl", PlNipDetector);
3109
+ } });
3110
+
3111
+ //#endregion
3112
+ //#region src/regex/detectors/pl/regon.ts
3113
+ var PlRegonDetector;
3114
+ var init_regon = __esm({ "src/regex/detectors/pl/regon.ts"() {
3115
+ init_base();
3116
+ init_entities();
3117
+ init_registry();
3118
+ init_validators();
3119
+ PlRegonDetector = class extends RegexDetector {
3120
+ entityType = EntityType.PL_REGON;
3121
+ score = .85;
3122
+ contextKeywords = [
3123
+ "regon",
3124
+ "statistical number",
3125
+ "numer statystyczny"
3126
+ ];
3127
+ contextRequired = true;
3128
+ pattern = /\b\d{9}(?:\d{5})?\b/g;
3129
+ validator = plRegonChecksum;
3130
+ };
3131
+ registerRegion("pl", PlRegonDetector);
3132
+ } });
3133
+
3134
+ //#endregion
3135
+ //#region src/regex/detectors/pl/index.ts
3136
+ var init_pl = __esm({ "src/regex/detectors/pl/index.ts"() {
3137
+ init_pesel();
3138
+ init_nip();
3139
+ init_regon();
3140
+ } });
3141
+
3142
+ //#endregion
3143
+ //#region src/regex/detectors/cz/birth-number.ts
3144
+ var CzBirthNumberDetector;
3145
+ var init_birth_number$2 = __esm({ "src/regex/detectors/cz/birth-number.ts"() {
3146
+ init_base();
3147
+ init_entities();
3148
+ init_registry();
3149
+ init_validators();
3150
+ CzBirthNumberDetector = class extends RegexDetector {
3151
+ entityType = EntityType.CZ_BIRTH_NUMBER;
3152
+ score = .85;
3153
+ contextKeywords = [
3154
+ "rodne cislo",
3155
+ "birth number",
3156
+ "rc",
3157
+ "rodné číslo"
3158
+ ];
3159
+ contextRequired = false;
3160
+ pattern = /\b\d{6}\/?\d{3,4}\b/g;
3161
+ validator = czBirthNumberValid;
3162
+ };
3163
+ registerRegion("cz", CzBirthNumberDetector);
3164
+ } });
3165
+
3166
+ //#endregion
3167
+ //#region src/regex/detectors/cz/ico.ts
3168
+ var CzIcoDetector;
3169
+ var init_ico$1 = __esm({ "src/regex/detectors/cz/ico.ts"() {
3170
+ init_base();
3171
+ init_entities();
3172
+ init_registry();
3173
+ init_validators();
3174
+ CzIcoDetector = class extends RegexDetector {
3175
+ entityType = EntityType.CZ_ICO;
3176
+ score = .85;
3177
+ contextKeywords = [
3178
+ "ico",
3179
+ "ičo",
3180
+ "identifikacni cislo",
3181
+ "identifikační číslo",
3182
+ "company id",
3183
+ "business id"
3184
+ ];
3185
+ contextRequired = true;
3186
+ pattern = /\b\d{8}\b/g;
3187
+ validator = czIcoChecksum;
3188
+ };
3189
+ registerRegion("cz", CzIcoDetector);
3190
+ } });
3191
+
3192
+ //#endregion
3193
+ //#region src/regex/detectors/cz/dic.ts
3194
+ var CzDicDetector;
3195
+ var init_dic$1 = __esm({ "src/regex/detectors/cz/dic.ts"() {
3196
+ init_base();
3197
+ init_entities();
3198
+ init_registry();
3199
+ init_validators();
3200
+ CzDicDetector = class extends RegexDetector {
3201
+ entityType = EntityType.CZ_DIC;
3202
+ score = .85;
3203
+ contextKeywords = [
3204
+ "dic",
3205
+ "dič",
3206
+ "danove identifikacni cislo",
3207
+ "daňové identifikační číslo",
3208
+ "vat",
3209
+ "tax id"
3210
+ ];
3211
+ contextRequired = false;
3212
+ pattern = /\bCZ\d{8,10}\b/gi;
3213
+ validator = czDicValid;
3214
+ };
3215
+ registerRegion("cz", CzDicDetector);
3216
+ } });
3217
+
3218
+ //#endregion
3219
+ //#region src/regex/detectors/cz/bank-account.ts
3220
+ var CzBankAccountDetector;
3221
+ var init_bank_account = __esm({ "src/regex/detectors/cz/bank-account.ts"() {
3222
+ init_base();
3223
+ init_entities();
3224
+ init_registry();
3225
+ init_validators();
3226
+ CzBankAccountDetector = class extends RegexDetector {
3227
+ entityType = EntityType.CZ_BANK_ACCOUNT;
3228
+ score = .85;
3229
+ contextKeywords = [
3230
+ "ucet",
3231
+ "účet",
3232
+ "cislo uctu",
3233
+ "číslo účtu",
3234
+ "bank account",
3235
+ "bankovni",
3236
+ "bankovní"
3237
+ ];
3238
+ contextRequired = false;
3239
+ pattern = /\b(?:\d{1,6}-)?\d{2,10}\/\d{4}\b/g;
3240
+ validator = czBankAccountValid;
3241
+ };
3242
+ registerRegion("cz", CzBankAccountDetector);
3243
+ } });
3244
+
3245
+ //#endregion
3246
+ //#region src/regex/detectors/cz/index.ts
3247
+ var init_cz = __esm({ "src/regex/detectors/cz/index.ts"() {
3248
+ init_birth_number$2();
3249
+ init_ico$1();
3250
+ init_dic$1();
3251
+ init_bank_account();
3252
+ } });
3253
+
3254
+ //#endregion
3255
+ //#region src/regex/detectors/ru/inn.ts
3256
+ var RuInnDetector;
3257
+ var init_inn = __esm({ "src/regex/detectors/ru/inn.ts"() {
3258
+ init_base();
3259
+ init_entities();
3260
+ init_registry();
3261
+ init_validators();
3262
+ RuInnDetector = class extends RegexDetector {
3263
+ entityType = EntityType.RU_INN;
3264
+ score = .85;
3265
+ contextKeywords = [
3266
+ "inn",
3267
+ "инн",
3268
+ "taxpayer",
3269
+ "налог"
3270
+ ];
3271
+ contextRequired = true;
3272
+ pattern = /\b\d{10}\b|\b\d{12}\b/g;
3273
+ validator = ruInnChecksum;
3274
+ };
3275
+ registerRegion("ru", RuInnDetector);
3276
+ } });
3277
+
3278
+ //#endregion
3279
+ //#region src/regex/detectors/ru/snils.ts
3280
+ var RuSnilsDetector;
3281
+ var init_snils = __esm({ "src/regex/detectors/ru/snils.ts"() {
3282
+ init_base();
3283
+ init_entities();
3284
+ init_registry();
3285
+ init_validators();
3286
+ RuSnilsDetector = class extends RegexDetector {
3287
+ entityType = EntityType.RU_SNILS;
3288
+ score = .85;
3289
+ contextKeywords = [
3290
+ "snils",
3291
+ "снилс",
3292
+ "pension",
3293
+ "пенсион",
3294
+ "страховое свидетельство"
3295
+ ];
3296
+ contextRequired = true;
3297
+ pattern = /\b\d{3}[-\s]?\d{3}[-\s]?\d{3}[-\s]?\d{2}\b/g;
3298
+ validator = ruSnilsChecksum;
3299
+ };
3300
+ registerRegion("ru", RuSnilsDetector);
3301
+ } });
3302
+
3303
+ //#endregion
3304
+ //#region src/regex/detectors/ru/index.ts
3305
+ var init_ru = __esm({ "src/regex/detectors/ru/index.ts"() {
3306
+ init_inn();
3307
+ init_snils();
3308
+ } });
3309
+
3310
+ //#endregion
3311
+ //#region src/regex/detectors/nl/bsn.ts
3312
+ var NlBsnDetector;
3313
+ var init_bsn = __esm({ "src/regex/detectors/nl/bsn.ts"() {
3314
+ init_base();
3315
+ init_entities();
3316
+ init_registry();
3317
+ init_validators();
3318
+ NlBsnDetector = class extends RegexDetector {
3319
+ entityType = EntityType.NL_BSN;
3320
+ score = .85;
3321
+ contextKeywords = [
3322
+ "bsn",
3323
+ "burgerservicenummer",
3324
+ "sofi",
3325
+ "citizen service"
3326
+ ];
3327
+ contextRequired = true;
3328
+ pattern = /\b\d{9}\b/g;
3329
+ validator = nlBsn11test;
3330
+ };
3331
+ registerRegion("nl", NlBsnDetector);
3332
+ } });
3333
+
3334
+ //#endregion
3335
+ //#region src/regex/detectors/nl/index.ts
3336
+ var init_nl = __esm({ "src/regex/detectors/nl/index.ts"() {
3337
+ init_bsn();
3338
+ } });
3339
+
3340
+ //#endregion
3341
+ //#region src/regex/detectors/ro/cnp.ts
3342
+ var RoCnpDetector;
3343
+ var init_cnp = __esm({ "src/regex/detectors/ro/cnp.ts"() {
3344
+ init_base();
3345
+ init_entities();
3346
+ init_registry();
3347
+ init_validators();
3348
+ RoCnpDetector = class extends RegexDetector {
3349
+ entityType = EntityType.RO_CNP;
3350
+ score = .9;
3351
+ contextKeywords = [
3352
+ "cnp",
3353
+ "cod numeric personal",
3354
+ "personal numeric code"
3355
+ ];
3356
+ contextRequired = false;
3357
+ pattern = /\b[1-8]\d{12}\b/g;
3358
+ validator = roCnpChecksum;
3359
+ };
3360
+ registerRegion("ro", RoCnpDetector);
3361
+ } });
3362
+
3363
+ //#endregion
3364
+ //#region src/regex/detectors/ro/cui.ts
3365
+ var RoCuiDetector;
3366
+ var init_cui = __esm({ "src/regex/detectors/ro/cui.ts"() {
3367
+ init_base();
3368
+ init_entities();
3369
+ init_registry();
3370
+ init_validators();
3371
+ RoCuiDetector = class extends RegexDetector {
3372
+ entityType = EntityType.RO_CUI;
3373
+ score = .85;
3374
+ contextKeywords = [
3375
+ "cui",
3376
+ "cod unic",
3377
+ "cod de inregistrare",
3378
+ "fiscal code",
3379
+ "cif"
3380
+ ];
3381
+ contextRequired = true;
3382
+ pattern = /\b(?:RO)?\d{2,10}\b/gi;
3383
+ validator = roCuiChecksum;
3384
+ };
3385
+ registerRegion("ro", RoCuiDetector);
3386
+ } });
3387
+
3388
+ //#endregion
3389
+ //#region src/regex/detectors/ro/index.ts
3390
+ var init_ro = __esm({ "src/regex/detectors/ro/index.ts"() {
3391
+ init_cnp();
3392
+ init_cui();
3393
+ } });
3394
+
3395
+ //#endregion
3396
+ //#region src/regex/detectors/sk/birth-number.ts
3397
+ var SkBirthNumberDetector;
3398
+ var init_birth_number$1 = __esm({ "src/regex/detectors/sk/birth-number.ts"() {
3399
+ init_base();
3400
+ init_entities();
3401
+ init_registry();
3402
+ init_validators();
3403
+ SkBirthNumberDetector = class extends RegexDetector {
3404
+ entityType = EntityType.SK_BIRTH_NUMBER;
3405
+ score = .85;
3406
+ contextKeywords = [
3407
+ "rodne cislo",
3408
+ "birth number",
3409
+ "rc",
3410
+ "rodné číslo"
3411
+ ];
3412
+ contextRequired = false;
3413
+ pattern = /\b\d{6}\/?\d{3,4}\b/g;
3414
+ validator = skBirthNumberValid;
3415
+ };
3416
+ registerRegion("sk", SkBirthNumberDetector);
3417
+ } });
3418
+
3419
+ //#endregion
3420
+ //#region src/regex/detectors/sk/ico.ts
3421
+ var SkIcoDetector;
3422
+ var init_ico = __esm({ "src/regex/detectors/sk/ico.ts"() {
3423
+ init_base();
3424
+ init_entities();
3425
+ init_registry();
3426
+ init_validators();
3427
+ SkIcoDetector = class extends RegexDetector {
3428
+ entityType = EntityType.SK_ICO;
3429
+ score = .85;
3430
+ contextKeywords = [
3431
+ "ico",
3432
+ "ičo",
3433
+ "identifikacne cislo",
3434
+ "identifikačné číslo",
3435
+ "company id",
3436
+ "business id"
3437
+ ];
3438
+ contextRequired = true;
3439
+ pattern = /\b\d{8}\b/g;
3440
+ validator = skIcoChecksum;
3441
+ };
3442
+ registerRegion("sk", SkIcoDetector);
3443
+ } });
3444
+
3445
+ //#endregion
3446
+ //#region src/regex/detectors/sk/dic.ts
3447
+ var SkDicDetector;
3448
+ var init_dic = __esm({ "src/regex/detectors/sk/dic.ts"() {
3449
+ init_base();
3450
+ init_entities();
3451
+ init_registry();
3452
+ init_validators();
3453
+ SkDicDetector = class extends RegexDetector {
3454
+ entityType = EntityType.SK_DIC;
3455
+ score = .85;
3456
+ contextKeywords = [
3457
+ "dic",
3458
+ "dič",
3459
+ "danove identifikacne cislo",
3460
+ "daňové identifikačné číslo",
3461
+ "vat",
3462
+ "tax id"
3463
+ ];
3464
+ contextRequired = false;
3465
+ pattern = /\bSK\d{10}\b/gi;
3466
+ validator = skDicValid;
3467
+ };
3468
+ registerRegion("sk", SkDicDetector);
3469
+ } });
3470
+
3471
+ //#endregion
3472
+ //#region src/regex/detectors/sk/index.ts
3473
+ var init_sk = __esm({ "src/regex/detectors/sk/index.ts"() {
3474
+ init_birth_number$1();
3475
+ init_ico();
3476
+ init_dic();
3477
+ } });
3478
+
3479
+ //#endregion
3480
+ //#region src/regex/detectors/dk/cpr.ts
3481
+ var DkCprDetector;
3482
+ var init_cpr = __esm({ "src/regex/detectors/dk/cpr.ts"() {
3483
+ init_base();
3484
+ init_entities();
3485
+ init_registry();
3486
+ init_validators();
3487
+ DkCprDetector = class extends RegexDetector {
3488
+ entityType = EntityType.DK_CPR;
3489
+ score = .85;
3490
+ contextKeywords = [
3491
+ "cpr",
3492
+ "personnummer",
3493
+ "cpr-nummer",
3494
+ "central person"
3495
+ ];
3496
+ contextRequired = true;
3497
+ pattern = /\b(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|1[0-2])\d{2}[-\s]?\d{4}\b/g;
3498
+ validator = dkCprValidDate;
3499
+ };
3500
+ registerRegion("dk", DkCprDetector);
3501
+ } });
3502
+
3503
+ //#endregion
3504
+ //#region src/regex/detectors/dk/cvr.ts
3505
+ var DkCvrDetector;
3506
+ var init_cvr = __esm({ "src/regex/detectors/dk/cvr.ts"() {
3507
+ init_base();
3508
+ init_entities();
3509
+ init_registry();
3510
+ init_validators();
3511
+ DkCvrDetector = class extends RegexDetector {
3512
+ entityType = EntityType.DK_CVR;
3513
+ score = .85;
3514
+ contextKeywords = [
3515
+ "cvr",
3516
+ "virksomhed",
3517
+ "erhvervsstyrelsen",
3518
+ "company number",
3519
+ "business id"
3520
+ ];
3521
+ contextRequired = true;
3522
+ pattern = /\b(?:DK)?\d{8}\b/gi;
3523
+ validator = dkCvrChecksum;
3524
+ };
3525
+ registerRegion("dk", DkCvrDetector);
3526
+ } });
3527
+
3528
+ //#endregion
3529
+ //#region src/regex/detectors/dk/index.ts
3530
+ var init_dk = __esm({ "src/regex/detectors/dk/index.ts"() {
3531
+ init_cpr();
3532
+ init_cvr();
3533
+ } });
3534
+
3535
+ //#endregion
3536
+ //#region src/regex/detectors/se/personnummer.ts
3537
+ var SePersonnummerDetector;
3538
+ var init_personnummer = __esm({ "src/regex/detectors/se/personnummer.ts"() {
3539
+ init_base();
3540
+ init_entities();
3541
+ init_registry();
3542
+ init_validators();
3543
+ SePersonnummerDetector = class extends RegexDetector {
3544
+ entityType = EntityType.SE_PERSONNUMMER;
3545
+ score = .9;
3546
+ contextKeywords = [
3547
+ "personnummer",
3548
+ "personal number",
3549
+ "pnr"
3550
+ ];
3551
+ contextRequired = false;
3552
+ pattern = /\b(?:\d{8}|\d{6})[-+]?\d{4}\b/g;
3553
+ validator = sePersonnummerLuhn;
3554
+ };
3555
+ registerRegion("se", SePersonnummerDetector);
3556
+ } });
3557
+
3558
+ //#endregion
3559
+ //#region src/regex/detectors/se/orgnr.ts
3560
+ var SeOrgnrDetector;
3561
+ var init_orgnr$1 = __esm({ "src/regex/detectors/se/orgnr.ts"() {
3562
+ init_base();
3563
+ init_entities();
3564
+ init_registry();
3565
+ init_validators();
3566
+ SeOrgnrDetector = class extends RegexDetector {
3567
+ entityType = EntityType.SE_ORGNR;
3568
+ score = .85;
3569
+ contextKeywords = [
3570
+ "organisationsnummer",
3571
+ "orgnr",
3572
+ "org nr",
3573
+ "organization number",
3574
+ "foretag"
3575
+ ];
3576
+ contextRequired = true;
3577
+ pattern = /\b\d{6}-?\d{4}\b/g;
3578
+ validator = seOrgnrChecksum;
3579
+ };
3580
+ registerRegion("se", SeOrgnrDetector);
3581
+ } });
3582
+
3583
+ //#endregion
3584
+ //#region src/regex/detectors/se/index.ts
3585
+ var init_se = __esm({ "src/regex/detectors/se/index.ts"() {
3586
+ init_personnummer();
3587
+ init_orgnr$1();
3588
+ } });
3589
+
3590
+ //#endregion
3591
+ //#region src/regex/detectors/no/birth-number.ts
3592
+ var NoBirthNumberDetector;
3593
+ var init_birth_number = __esm({ "src/regex/detectors/no/birth-number.ts"() {
3594
+ init_base();
3595
+ init_entities();
3596
+ init_registry();
3597
+ init_validators();
3598
+ NoBirthNumberDetector = class extends RegexDetector {
3599
+ entityType = EntityType.NO_BIRTH_NUMBER;
3600
+ score = .9;
3601
+ contextKeywords = [
3602
+ "fodselsnummer",
3603
+ "birth number",
3604
+ "personnummer",
3605
+ "fødselsnummer"
3606
+ ];
3607
+ contextRequired = false;
3608
+ pattern = /\b(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|1[0-2])\d{7}\b/g;
3609
+ validator = noBirthNumberChecksum;
3610
+ };
3611
+ registerRegion("no", NoBirthNumberDetector);
3612
+ } });
3613
+
3614
+ //#endregion
3615
+ //#region src/regex/detectors/no/orgnr.ts
3616
+ var NoOrgnrDetector;
3617
+ var init_orgnr = __esm({ "src/regex/detectors/no/orgnr.ts"() {
3618
+ init_base();
3619
+ init_entities();
3620
+ init_registry();
3621
+ init_validators();
3622
+ NoOrgnrDetector = class extends RegexDetector {
3623
+ entityType = EntityType.NO_ORGNR;
3624
+ score = .85;
3625
+ contextKeywords = [
3626
+ "organisasjonsnummer",
3627
+ "orgnr",
3628
+ "org nr",
3629
+ "organization number",
3630
+ "foretaksnummer"
3631
+ ];
3632
+ contextRequired = true;
3633
+ pattern = /\b\d{9}\b/g;
3634
+ validator = noOrgnrChecksum;
3635
+ };
3636
+ registerRegion("no", NoOrgnrDetector);
3637
+ } });
3638
+
3639
+ //#endregion
3640
+ //#region src/regex/detectors/no/index.ts
3641
+ var init_no = __esm({ "src/regex/detectors/no/index.ts"() {
3642
+ init_birth_number();
3643
+ init_orgnr();
3644
+ } });
3645
+
3646
+ //#endregion
3647
+ //#region src/regex/detectors/br/cpf.ts
3648
+ var BrCpfDetector;
3649
+ var init_cpf = __esm({ "src/regex/detectors/br/cpf.ts"() {
3650
+ init_base();
3651
+ init_entities();
3652
+ init_registry();
3653
+ init_validators();
3654
+ BrCpfDetector = class extends RegexDetector {
3655
+ entityType = EntityType.BR_CPF;
3656
+ score = .9;
3657
+ contextKeywords = ["cpf", "cadastro de pessoa"];
3658
+ contextRequired = false;
3659
+ pattern = /\b\d{3}\.?\d{3}\.?\d{3}[-.]?\d{2}\b/g;
3660
+ validator = brCpfChecksum;
3661
+ };
3662
+ registerRegion("br", BrCpfDetector);
3663
+ } });
3664
+
3665
+ //#endregion
3666
+ //#region src/regex/detectors/br/cnpj.ts
3667
+ var BrCnpjDetector;
3668
+ var init_cnpj = __esm({ "src/regex/detectors/br/cnpj.ts"() {
3669
+ init_base();
3670
+ init_entities();
3671
+ init_registry();
3672
+ init_validators();
3673
+ BrCnpjDetector = class extends RegexDetector {
3674
+ entityType = EntityType.BR_CNPJ;
3675
+ score = .9;
3676
+ contextKeywords = ["cnpj", "cadastro nacional"];
3677
+ contextRequired = false;
3678
+ pattern = /\b\d{2}\.?\d{3}\.?\d{3}\/?\d{4}[-.]?\d{2}\b/g;
3679
+ validator = brCnpjChecksum;
3680
+ };
3681
+ registerRegion("br", BrCnpjDetector);
3682
+ } });
3683
+
3684
+ //#endregion
3685
+ //#region src/regex/detectors/br/index.ts
3686
+ var init_br = __esm({ "src/regex/detectors/br/index.ts"() {
3687
+ init_cpf();
3688
+ init_cnpj();
3689
+ } });
3690
+
3691
+ //#endregion
3692
+ //#region src/regex/detectors/be/national-number.ts
3693
+ var BeNationalNumberDetector;
3694
+ var init_national_number = __esm({ "src/regex/detectors/be/national-number.ts"() {
3695
+ init_base();
3696
+ init_entities();
3697
+ init_registry();
3698
+ init_validators();
3699
+ BeNationalNumberDetector = class extends RegexDetector {
3700
+ entityType = EntityType.BE_NATIONAL_NUMBER;
3701
+ score = .85;
3702
+ contextKeywords = [
3703
+ "rijksregisternummer",
3704
+ "national number",
3705
+ "numero national",
3706
+ "registre national",
3707
+ "nn"
3708
+ ];
3709
+ contextRequired = true;
3710
+ contextWindow = 50;
3711
+ pattern = /\b\d{2}[. ]?\d{2}[. ]?\d{2}[- ]?\d{3}[. ]?\d{2}\b/g;
3712
+ validator = beNationalNumberChecksum;
3713
+ };
3714
+ registerRegion("be", BeNationalNumberDetector);
3715
+ } });
3716
+
3717
+ //#endregion
3718
+ //#region src/regex/detectors/be/enterprise-number.ts
3719
+ var BeEnterpriseNumberDetector;
3720
+ var init_enterprise_number = __esm({ "src/regex/detectors/be/enterprise-number.ts"() {
3721
+ init_base();
3722
+ init_entities();
3723
+ init_registry();
3724
+ init_validators();
3725
+ BeEnterpriseNumberDetector = class extends RegexDetector {
3726
+ entityType = EntityType.BE_ENTERPRISE_NUMBER;
3727
+ score = .85;
3728
+ contextKeywords = [
3729
+ "bce",
3730
+ "kbo",
3731
+ "enterprise number",
3732
+ "ondernemingsnummer",
3733
+ "numero entreprise"
3734
+ ];
3735
+ contextRequired = true;
3736
+ contextWindow = 50;
3737
+ pattern = /\b[01]\d{3}[. ]?\d{3}[. ]?\d{3}\b/g;
3738
+ validator = beEnterpriseChecksum;
3739
+ };
3740
+ registerRegion("be", BeEnterpriseNumberDetector);
3741
+ } });
3742
+
3743
+ //#endregion
3744
+ //#region src/regex/detectors/be/index.ts
3745
+ var init_be = __esm({ "src/regex/detectors/be/index.ts"() {
3746
+ init_national_number();
3747
+ init_enterprise_number();
3748
+ } });
3749
+
3750
+ //#endregion
3751
+ //#region src/regex/detectors/at/svnr.ts
3752
+ var AtSvnrDetector;
3753
+ var init_svnr = __esm({ "src/regex/detectors/at/svnr.ts"() {
3754
+ init_base();
3755
+ init_entities();
3756
+ init_registry();
3757
+ init_validators();
3758
+ AtSvnrDetector = class extends RegexDetector {
3759
+ entityType = EntityType.AT_SVNR;
3760
+ score = .85;
3761
+ contextKeywords = [
3762
+ "svnr",
3763
+ "sozialversicherungsnummer",
3764
+ "versicherungsnummer",
3765
+ "social insurance"
3766
+ ];
3767
+ contextRequired = true;
3768
+ contextWindow = 50;
3769
+ pattern = /\b\d{4}[- ]?\d{6}\b/g;
3770
+ validator = atSvnrChecksum;
3771
+ };
3772
+ registerRegion("at", AtSvnrDetector);
3773
+ } });
3774
+
3775
+ //#endregion
3776
+ //#region src/regex/detectors/at/index.ts
3777
+ var init_at = __esm({ "src/regex/detectors/at/index.ts"() {
3778
+ init_svnr();
3779
+ } });
3780
+
3781
+ //#endregion
3782
+ //#region src/regex/detectors/ie/pps.ts
3783
+ var IePpsDetector;
3784
+ var init_pps = __esm({ "src/regex/detectors/ie/pps.ts"() {
3785
+ init_base();
3786
+ init_entities();
3787
+ init_registry();
3788
+ init_validators();
3789
+ IePpsDetector = class extends RegexDetector {
3790
+ entityType = EntityType.IE_PPS;
3791
+ score = .85;
3792
+ contextKeywords = [
3793
+ "pps",
3794
+ "ppsn",
3795
+ "personal public service",
3796
+ "revenue"
3797
+ ];
3798
+ contextRequired = false;
3799
+ contextWindow = 50;
3800
+ pattern = /\b\d{7}[A-Z]{1,2}\b/gi;
3801
+ validator = iePpsChecksum;
3802
+ };
3803
+ registerRegion("ie", IePpsDetector);
3804
+ } });
3805
+
3806
+ //#endregion
3807
+ //#region src/regex/detectors/ie/index.ts
3808
+ var init_ie = __esm({ "src/regex/detectors/ie/index.ts"() {
3809
+ init_pps();
3810
+ } });
3811
+
3812
+ //#endregion
3813
+ //#region src/regex/detectors/fi/hetu.ts
3814
+ var FiHetuDetector;
3815
+ var init_hetu = __esm({ "src/regex/detectors/fi/hetu.ts"() {
3816
+ init_base();
3817
+ init_entities();
3818
+ init_registry();
3819
+ init_validators();
3820
+ FiHetuDetector = class extends RegexDetector {
3821
+ entityType = EntityType.FI_HETU;
3822
+ score = .85;
3823
+ contextKeywords = [
3824
+ "henkilotunnus",
3825
+ "hetu",
3826
+ "personal identity code",
3827
+ "sosiaaliturvatunnus"
3828
+ ];
3829
+ contextRequired = false;
3830
+ pattern = /\b\d{6}[-+ABCDEFYXWVUabcdefyxwvu]\d{3}[0-9A-Za-z]\b/g;
3831
+ validator = fiHetuChecksum;
3832
+ };
3833
+ registerRegion("fi", FiHetuDetector);
3834
+ } });
3835
+
3836
+ //#endregion
3837
+ //#region src/regex/detectors/fi/ytunnus.ts
3838
+ var FiYtunnusDetector;
3839
+ var init_ytunnus = __esm({ "src/regex/detectors/fi/ytunnus.ts"() {
3840
+ init_base();
3841
+ init_entities();
3842
+ init_registry();
3843
+ init_validators();
3844
+ FiYtunnusDetector = class extends RegexDetector {
3845
+ entityType = EntityType.FI_YTUNNUS;
3846
+ score = .85;
3847
+ contextKeywords = [
3848
+ "y-tunnus",
3849
+ "ytunnus",
3850
+ "business id",
3851
+ "yritystunnus",
3852
+ "fo-nummer"
3853
+ ];
3854
+ contextRequired = true;
3855
+ contextWindow = 50;
3856
+ pattern = /\b\d{7}-\d\b/g;
3857
+ validator = fiYtunnusChecksum;
3858
+ };
3859
+ registerRegion("fi", FiYtunnusDetector);
3860
+ } });
3861
+
3862
+ //#endregion
3863
+ //#region src/regex/detectors/fi/index.ts
3864
+ var init_fi = __esm({ "src/regex/detectors/fi/index.ts"() {
3865
+ init_hetu();
3866
+ init_ytunnus();
3867
+ } });
3868
+
3869
+ //#endregion
3870
+ //#region src/regex/detectors/hu/tax-id.ts
3871
+ var HuTaxIdDetector;
3872
+ var init_tax_id = __esm({ "src/regex/detectors/hu/tax-id.ts"() {
3873
+ init_base();
3874
+ init_entities();
3875
+ init_registry();
3876
+ init_validators();
3877
+ HuTaxIdDetector = class extends RegexDetector {
3878
+ entityType = EntityType.HU_TAX_ID;
3879
+ score = .85;
3880
+ contextKeywords = [
3881
+ "adoazonosito",
3882
+ "adószám",
3883
+ "tax id",
3884
+ "tax number",
3885
+ "adoazonosito jel"
3886
+ ];
3887
+ contextRequired = true;
3888
+ contextWindow = 50;
3889
+ pattern = /\b8\d{9}\b/g;
3890
+ validator = huTaxIdChecksum;
3891
+ };
3892
+ registerRegion("hu", HuTaxIdDetector);
3893
+ } });
3894
+
3895
+ //#endregion
3896
+ //#region src/regex/detectors/hu/taj.ts
3897
+ var HuTajDetector;
3898
+ var init_taj = __esm({ "src/regex/detectors/hu/taj.ts"() {
3899
+ init_base();
3900
+ init_entities();
3901
+ init_registry();
3902
+ init_validators();
3903
+ HuTajDetector = class extends RegexDetector {
3904
+ entityType = EntityType.HU_TAJ;
3905
+ score = .85;
3906
+ contextKeywords = [
3907
+ "taj",
3908
+ "tarsadalombiztositasi",
3909
+ "social security",
3910
+ "társadalombiztosítási"
3911
+ ];
3912
+ contextRequired = true;
3913
+ contextWindow = 50;
3914
+ pattern = /\b\d{3}[- ]?\d{3}[- ]?\d{3}\b/g;
3915
+ validator = huTajChecksum;
3916
+ };
3917
+ registerRegion("hu", HuTajDetector);
3918
+ } });
3919
+
3920
+ //#endregion
3921
+ //#region src/regex/detectors/hu/index.ts
3922
+ var init_hu = __esm({ "src/regex/detectors/hu/index.ts"() {
3923
+ init_tax_id();
3924
+ init_taj();
3925
+ } });
3926
+
3927
+ //#endregion
3928
+ //#region src/regex/detectors/bg/egn.ts
3929
+ var BgEgnDetector;
3930
+ var init_egn = __esm({ "src/regex/detectors/bg/egn.ts"() {
3931
+ init_base();
3932
+ init_entities();
3933
+ init_registry();
3934
+ init_validators();
3935
+ BgEgnDetector = class extends RegexDetector {
3936
+ entityType = EntityType.BG_EGN;
3937
+ score = .85;
3938
+ contextKeywords = [
3939
+ "egn",
3940
+ "егн",
3941
+ "edinen grazhdanski nomer",
3942
+ "personal number",
3943
+ "civil number"
3944
+ ];
3945
+ contextRequired = true;
3946
+ contextWindow = 50;
3947
+ pattern = /\b\d{10}\b/g;
3948
+ validator = bgEgnChecksum;
3949
+ };
3950
+ registerRegion("bg", BgEgnDetector);
3951
+ } });
3952
+
3953
+ //#endregion
3954
+ //#region src/regex/detectors/bg/index.ts
3955
+ var init_bg = __esm({ "src/regex/detectors/bg/index.ts"() {
3956
+ init_egn();
3957
+ } });
3958
+
3959
+ //#endregion
3960
+ //#region src/regex/detectors/hr/oib.ts
3961
+ var HrOibDetector;
3962
+ var init_oib = __esm({ "src/regex/detectors/hr/oib.ts"() {
3963
+ init_base();
3964
+ init_entities();
3965
+ init_registry();
3966
+ init_validators();
3967
+ HrOibDetector = class extends RegexDetector {
3968
+ entityType = EntityType.HR_OIB;
3969
+ score = .85;
3970
+ contextKeywords = [
3971
+ "oib",
3972
+ "osobni identifikacijski broj",
3973
+ "personal identification",
3974
+ "identifikacijski"
3975
+ ];
3976
+ contextRequired = true;
3977
+ contextWindow = 50;
3978
+ pattern = /\b\d{11}\b/g;
3979
+ validator = hrOibChecksum;
3980
+ };
3981
+ registerRegion("hr", HrOibDetector);
3982
+ } });
3983
+
3984
+ //#endregion
3985
+ //#region src/regex/detectors/hr/index.ts
3986
+ var init_hr = __esm({ "src/regex/detectors/hr/index.ts"() {
3987
+ init_oib();
3988
+ } });
3989
+
3990
+ //#endregion
3991
+ //#region src/regex/detectors/si/emso.ts
3992
+ var SiEmsoDetector;
3993
+ var init_emso = __esm({ "src/regex/detectors/si/emso.ts"() {
3994
+ init_base();
3995
+ init_entities();
3996
+ init_registry();
3997
+ init_validators();
3998
+ SiEmsoDetector = class extends RegexDetector {
3999
+ entityType = EntityType.SI_EMSO;
4000
+ score = .85;
4001
+ contextKeywords = [
4002
+ "emso",
4003
+ "enotna maticna stevilka",
4004
+ "maticna stevilka",
4005
+ "personal number"
4006
+ ];
4007
+ contextRequired = true;
4008
+ contextWindow = 50;
4009
+ pattern = /\b\d{13}\b/g;
4010
+ validator = siEmsoChecksum;
4011
+ };
4012
+ registerRegion("si", SiEmsoDetector);
4013
+ } });
4014
+
4015
+ //#endregion
4016
+ //#region src/regex/detectors/si/tax-number.ts
4017
+ var SiTaxNumberDetector;
4018
+ var init_tax_number = __esm({ "src/regex/detectors/si/tax-number.ts"() {
4019
+ init_base();
4020
+ init_entities();
4021
+ init_registry();
4022
+ init_validators();
4023
+ SiTaxNumberDetector = class extends RegexDetector {
4024
+ entityType = EntityType.SI_TAX_NUMBER;
4025
+ score = .85;
4026
+ contextKeywords = [
4027
+ "davcna stevilka",
4028
+ "davcna",
4029
+ "tax number",
4030
+ "davčna številka"
4031
+ ];
4032
+ contextRequired = true;
4033
+ contextWindow = 50;
4034
+ pattern = /\b(?:SI)?\d{8}\b/gi;
4035
+ validator = siTaxNumberChecksum;
4036
+ };
4037
+ registerRegion("si", SiTaxNumberDetector);
4038
+ } });
4039
+
4040
+ //#endregion
4041
+ //#region src/regex/detectors/si/index.ts
4042
+ var init_si = __esm({ "src/regex/detectors/si/index.ts"() {
4043
+ init_emso();
4044
+ init_tax_number();
4045
+ } });
4046
+
4047
+ //#endregion
4048
+ //#region src/regex/detectors/lt/personal-code.ts
4049
+ var LtPersonalCodeDetector;
4050
+ var init_personal_code$2 = __esm({ "src/regex/detectors/lt/personal-code.ts"() {
4051
+ init_base();
4052
+ init_entities();
4053
+ init_registry();
4054
+ init_validators();
4055
+ LtPersonalCodeDetector = class extends RegexDetector {
4056
+ entityType = EntityType.LT_PERSONAL_CODE;
4057
+ score = .85;
4058
+ contextKeywords = [
4059
+ "asmens kodas",
4060
+ "personal code",
4061
+ "asmens"
4062
+ ];
4063
+ contextRequired = true;
4064
+ contextWindow = 50;
4065
+ pattern = /\b[1-6]\d{10}\b/g;
4066
+ validator = ltPersonalCodeChecksum;
4067
+ };
4068
+ registerRegion("lt", LtPersonalCodeDetector);
4069
+ } });
4070
+
4071
+ //#endregion
4072
+ //#region src/regex/detectors/lt/index.ts
4073
+ var init_lt = __esm({ "src/regex/detectors/lt/index.ts"() {
4074
+ init_personal_code$2();
4075
+ } });
4076
+
4077
+ //#endregion
4078
+ //#region src/regex/detectors/lv/personal-code.ts
4079
+ var LvPersonalCodeDetector;
4080
+ var init_personal_code$1 = __esm({ "src/regex/detectors/lv/personal-code.ts"() {
4081
+ init_base();
4082
+ init_entities();
4083
+ init_registry();
4084
+ init_validators();
4085
+ LvPersonalCodeDetector = class extends RegexDetector {
4086
+ entityType = EntityType.LV_PERSONAL_CODE;
4087
+ score = .85;
4088
+ contextKeywords = [
4089
+ "personas kods",
4090
+ "personal code",
4091
+ "personas"
4092
+ ];
4093
+ contextRequired = true;
4094
+ contextWindow = 50;
4095
+ pattern = /\b\d{6}-?\d{5}\b/g;
4096
+ validator = lvPersonalCodeChecksum;
4097
+ };
4098
+ registerRegion("lv", LvPersonalCodeDetector);
4099
+ } });
4100
+
4101
+ //#endregion
4102
+ //#region src/regex/detectors/lv/index.ts
4103
+ var init_lv = __esm({ "src/regex/detectors/lv/index.ts"() {
4104
+ init_personal_code$1();
4105
+ } });
4106
+
4107
+ //#endregion
4108
+ //#region src/regex/detectors/ee/personal-code.ts
4109
+ var EePersonalCodeDetector;
4110
+ var init_personal_code = __esm({ "src/regex/detectors/ee/personal-code.ts"() {
4111
+ init_base();
4112
+ init_entities();
4113
+ init_registry();
4114
+ init_validators();
4115
+ EePersonalCodeDetector = class extends RegexDetector {
4116
+ entityType = EntityType.EE_PERSONAL_CODE;
4117
+ score = .85;
4118
+ contextKeywords = [
4119
+ "isikukood",
4120
+ "personal code",
4121
+ "identity code"
4122
+ ];
4123
+ contextRequired = true;
4124
+ contextWindow = 50;
4125
+ pattern = /\b[1-6]\d{10}\b/g;
4126
+ validator = eePersonalCodeChecksum;
4127
+ };
4128
+ registerRegion("ee", EePersonalCodeDetector);
4129
+ } });
4130
+
4131
+ //#endregion
4132
+ //#region src/regex/detectors/ee/index.ts
4133
+ var init_ee = __esm({ "src/regex/detectors/ee/index.ts"() {
4134
+ init_personal_code();
4135
+ } });
4136
+
4137
+ //#endregion
4138
+ //#region src/regex/detectors/ca/sin.ts
4139
+ var CaSinDetector;
4140
+ var init_sin = __esm({ "src/regex/detectors/ca/sin.ts"() {
4141
+ init_base();
4142
+ init_entities();
4143
+ init_registry();
4144
+ init_validators();
4145
+ CaSinDetector = class extends RegexDetector {
4146
+ entityType = EntityType.CA_SIN;
4147
+ score = .85;
4148
+ contextKeywords = [
4149
+ "sin",
4150
+ "social insurance number",
4151
+ "numero assurance sociale",
4152
+ "nas"
4153
+ ];
4154
+ contextRequired = true;
4155
+ pattern = /\b\d{3}[- ]?\d{3}[- ]?\d{3}\b/g;
4156
+ validator = luhnChecksum;
4157
+ };
4158
+ registerRegion("ca", CaSinDetector);
4159
+ } });
4160
+
4161
+ //#endregion
4162
+ //#region src/regex/detectors/ca/index.ts
4163
+ var init_ca = __esm({ "src/regex/detectors/ca/index.ts"() {
4164
+ init_sin();
4165
+ } });
4166
+
4167
+ //#endregion
4168
+ //#region src/regex/detectors/ch/ahv.ts
4169
+ var ChAhvDetector;
4170
+ var init_ahv = __esm({ "src/regex/detectors/ch/ahv.ts"() {
4171
+ init_base();
4172
+ init_entities();
4173
+ init_registry();
4174
+ init_validators();
4175
+ ChAhvDetector = class extends RegexDetector {
4176
+ entityType = EntityType.CH_AHV;
4177
+ score = .85;
4178
+ contextKeywords = [
4179
+ "ahv",
4180
+ "avs",
4181
+ "oasi",
4182
+ "sozialversicherungsnummer",
4183
+ "ahv-nr"
4184
+ ];
4185
+ contextRequired = false;
4186
+ pattern = /\b756[. ]?\d{4}[. ]?\d{4}[. ]?\d{2}\b/g;
4187
+ validator = chAhvChecksum;
4188
+ };
4189
+ registerRegion("ch", ChAhvDetector);
4190
+ } });
4191
+
4192
+ //#endregion
4193
+ //#region src/regex/detectors/ch/index.ts
4194
+ var init_ch = __esm({ "src/regex/detectors/ch/index.ts"() {
4195
+ init_ahv();
4196
+ } });
4197
+
4198
+ //#endregion
4199
+ //#region src/regex/detectors/au/tfn.ts
4200
+ var AuTfnDetector;
4201
+ var init_tfn = __esm({ "src/regex/detectors/au/tfn.ts"() {
4202
+ init_base();
4203
+ init_entities();
4204
+ init_registry();
4205
+ init_validators();
4206
+ AuTfnDetector = class extends RegexDetector {
4207
+ entityType = EntityType.AU_TFN;
4208
+ score = .85;
4209
+ contextKeywords = [
4210
+ "tfn",
4211
+ "tax file number",
4212
+ "tax file no"
4213
+ ];
4214
+ contextRequired = true;
4215
+ pattern = /\b\d{3}[- ]?\d{3}[- ]?\d{2,3}\b/g;
4216
+ validator = auTfnChecksum;
4217
+ };
4218
+ registerRegion("au", AuTfnDetector);
4219
+ } });
4220
+
4221
+ //#endregion
4222
+ //#region src/regex/detectors/au/medicare.ts
4223
+ var AuMedicareDetector;
4224
+ var init_medicare = __esm({ "src/regex/detectors/au/medicare.ts"() {
4225
+ init_base();
4226
+ init_entities();
4227
+ init_registry();
4228
+ init_validators();
4229
+ AuMedicareDetector = class extends RegexDetector {
4230
+ entityType = EntityType.AU_MEDICARE;
4231
+ score = .85;
4232
+ contextKeywords = [
4233
+ "medicare",
4234
+ "medicare card",
4235
+ "medicare number"
4236
+ ];
4237
+ contextRequired = true;
4238
+ pattern = /\b\d{4}[- ]?\d{5}[- ]?\d[- ]?\d?\b/g;
4239
+ validator = auMedicareChecksum;
4240
+ };
4241
+ registerRegion("au", AuMedicareDetector);
4242
+ } });
4243
+
4244
+ //#endregion
4245
+ //#region src/regex/detectors/au/index.ts
4246
+ var init_au = __esm({ "src/regex/detectors/au/index.ts"() {
4247
+ init_tfn();
4248
+ init_medicare();
4249
+ } });
4250
+
4251
+ //#endregion
4252
+ //#region src/regex/detectors/nz/ird.ts
4253
+ var NzIrdDetector;
4254
+ var init_ird = __esm({ "src/regex/detectors/nz/ird.ts"() {
4255
+ init_base();
4256
+ init_entities();
4257
+ init_registry();
4258
+ init_validators();
4259
+ NzIrdDetector = class extends RegexDetector {
4260
+ entityType = EntityType.NZ_IRD;
4261
+ score = .85;
4262
+ contextKeywords = [
4263
+ "ird",
4264
+ "inland revenue",
4265
+ "tax number",
4266
+ "ird number"
4267
+ ];
4268
+ contextRequired = true;
4269
+ pattern = /\b\d{2,3}[- ]?\d{3}[- ]?\d{3}\b/g;
4270
+ validator = nzIrdChecksum;
4271
+ };
4272
+ registerRegion("nz", NzIrdDetector);
4273
+ } });
4274
+
4275
+ //#endregion
4276
+ //#region src/regex/detectors/nz/index.ts
4277
+ var init_nz = __esm({ "src/regex/detectors/nz/index.ts"() {
4278
+ init_ird();
4279
+ } });
4280
+
4281
+ //#endregion
4282
+ //#region src/regex/detectors/in/aadhaar.ts
4283
+ var InAadhaarDetector;
4284
+ var init_aadhaar = __esm({ "src/regex/detectors/in/aadhaar.ts"() {
4285
+ init_base();
4286
+ init_entities();
4287
+ init_registry();
4288
+ init_validators();
4289
+ InAadhaarDetector = class extends RegexDetector {
4290
+ entityType = EntityType.IN_AADHAAR;
4291
+ score = .85;
4292
+ contextKeywords = [
4293
+ "aadhaar",
4294
+ "aadhar",
4295
+ "uidai",
4296
+ "unique identification"
4297
+ ];
4298
+ contextRequired = true;
4299
+ pattern = /\b[2-9]\d{3}[- ]?\d{4}[- ]?\d{4}\b/g;
4300
+ validator = inAadhaarChecksum;
4301
+ };
4302
+ registerRegion("in", InAadhaarDetector);
4303
+ } });
4304
+
4305
+ //#endregion
4306
+ //#region src/regex/detectors/in/pan.ts
4307
+ var InPanDetector;
4308
+ var init_pan = __esm({ "src/regex/detectors/in/pan.ts"() {
4309
+ init_base();
4310
+ init_entities();
4311
+ init_registry();
4312
+ init_validators();
4313
+ InPanDetector = class extends RegexDetector {
4314
+ entityType = EntityType.IN_PAN;
4315
+ score = .85;
4316
+ contextKeywords = [
4317
+ "pan",
4318
+ "permanent account number",
4319
+ "income tax",
4320
+ "pan card"
4321
+ ];
4322
+ contextRequired = false;
4323
+ pattern = /\b[A-Z]{3}[ABCFGHLJPT][A-Z]\d{4}[A-Z]\b/gi;
4324
+ validator = inPanValid;
4325
+ };
4326
+ registerRegion("in", InPanDetector);
4327
+ } });
4328
+
4329
+ //#endregion
4330
+ //#region src/regex/detectors/in/index.ts
4331
+ var init_in = __esm({ "src/regex/detectors/in/index.ts"() {
4332
+ init_aadhaar();
4333
+ init_pan();
4334
+ } });
4335
+
4336
+ //#endregion
4337
+ //#region src/regex/detectors/jp/my-number.ts
4338
+ var JpMyNumberDetector;
4339
+ var init_my_number = __esm({ "src/regex/detectors/jp/my-number.ts"() {
4340
+ init_base();
4341
+ init_entities();
4342
+ init_registry();
4343
+ init_validators();
4344
+ JpMyNumberDetector = class extends RegexDetector {
4345
+ entityType = EntityType.JP_MY_NUMBER;
4346
+ score = .85;
4347
+ contextKeywords = [
4348
+ "my number",
4349
+ "マイナンバー",
4350
+ "kojin bango",
4351
+ "individual number"
4352
+ ];
4353
+ contextRequired = true;
4354
+ pattern = /\b\d{4}[- ]?\d{4}[- ]?\d{4}\b/g;
4355
+ validator = jpMyNumberChecksum;
4356
+ };
4357
+ registerRegion("jp", JpMyNumberDetector);
4358
+ } });
4359
+
4360
+ //#endregion
4361
+ //#region src/regex/detectors/jp/index.ts
4362
+ var init_jp = __esm({ "src/regex/detectors/jp/index.ts"() {
4363
+ init_my_number();
4364
+ } });
4365
+
4366
+ //#endregion
4367
+ //#region src/regex/detectors/kr/rrn.ts
4368
+ var KrRrnDetector;
4369
+ var init_rrn = __esm({ "src/regex/detectors/kr/rrn.ts"() {
4370
+ init_base();
4371
+ init_entities();
4372
+ init_registry();
4373
+ init_validators();
4374
+ KrRrnDetector = class extends RegexDetector {
4375
+ entityType = EntityType.KR_RRN;
4376
+ score = .85;
4377
+ contextKeywords = [
4378
+ "주민등록번호",
4379
+ "resident registration",
4380
+ "jumin",
4381
+ "rrn"
4382
+ ];
4383
+ contextRequired = true;
4384
+ pattern = /\b\d{6}[- ]?\d{7}\b/g;
4385
+ validator = krRrnChecksum;
4386
+ };
4387
+ registerRegion("kr", KrRrnDetector);
4388
+ } });
4389
+
4390
+ //#endregion
4391
+ //#region src/regex/detectors/kr/index.ts
4392
+ var init_kr = __esm({ "src/regex/detectors/kr/index.ts"() {
4393
+ init_rrn();
4394
+ } });
4395
+
4396
+ //#endregion
4397
+ //#region src/regex/detectors/za/id.ts
4398
+ var ZaIdDetector;
4399
+ var init_id$1 = __esm({ "src/regex/detectors/za/id.ts"() {
4400
+ init_base();
4401
+ init_entities();
4402
+ init_registry();
4403
+ init_validators();
4404
+ ZaIdDetector = class extends RegexDetector {
4405
+ entityType = EntityType.ZA_ID;
4406
+ score = .85;
4407
+ contextKeywords = [
4408
+ "id number",
4409
+ "identity number",
4410
+ "south african id",
4411
+ "sa id"
4412
+ ];
4413
+ contextRequired = true;
4414
+ pattern = /\b\d{13}\b/g;
4415
+ validator = luhnChecksum;
4416
+ };
4417
+ registerRegion("za", ZaIdDetector);
4418
+ } });
4419
+
4420
+ //#endregion
4421
+ //#region src/regex/detectors/za/index.ts
4422
+ var init_za = __esm({ "src/regex/detectors/za/index.ts"() {
4423
+ init_id$1();
4424
+ } });
4425
+
4426
+ //#endregion
4427
+ //#region src/regex/detectors/tr/kimlik.ts
4428
+ var TrKimlikDetector;
4429
+ var init_kimlik = __esm({ "src/regex/detectors/tr/kimlik.ts"() {
4430
+ init_base();
4431
+ init_entities();
4432
+ init_registry();
4433
+ init_validators();
4434
+ TrKimlikDetector = class extends RegexDetector {
4435
+ entityType = EntityType.TR_KIMLIK;
4436
+ score = .85;
4437
+ contextKeywords = [
4438
+ "tc kimlik",
4439
+ "kimlik no",
4440
+ "tckn",
4441
+ "vatandas",
4442
+ "nufus"
4443
+ ];
4444
+ contextRequired = true;
4445
+ pattern = /\b[1-9]\d{10}\b/g;
4446
+ validator = trKimlikChecksum;
4447
+ };
4448
+ registerRegion("tr", TrKimlikDetector);
4449
+ } });
4450
+
4451
+ //#endregion
4452
+ //#region src/regex/detectors/tr/index.ts
4453
+ var init_tr = __esm({ "src/regex/detectors/tr/index.ts"() {
4454
+ init_kimlik();
4455
+ } });
4456
+
4457
+ //#endregion
4458
+ //#region src/regex/detectors/il/id.ts
4459
+ var IlIdDetector;
4460
+ var init_id = __esm({ "src/regex/detectors/il/id.ts"() {
4461
+ init_base();
4462
+ init_entities();
4463
+ init_registry();
4464
+ init_validators();
4465
+ IlIdDetector = class extends RegexDetector {
4466
+ entityType = EntityType.IL_ID;
4467
+ score = .85;
4468
+ contextKeywords = [
4469
+ "teudat zehut",
4470
+ "mispar zehut",
4471
+ "identity number",
4472
+ "ת.ז",
4473
+ "tz"
4474
+ ];
4475
+ contextRequired = true;
4476
+ pattern = /\b\d{9}\b/g;
4477
+ validator = luhnChecksum;
4478
+ };
4479
+ registerRegion("il", IlIdDetector);
4480
+ } });
4481
+
4482
+ //#endregion
4483
+ //#region src/regex/detectors/il/index.ts
4484
+ var init_il = __esm({ "src/regex/detectors/il/index.ts"() {
4485
+ init_id();
4486
+ } });
4487
+
4488
+ //#endregion
4489
+ //#region src/regex/detectors/ar/cuit.ts
4490
+ var ArCuitDetector;
4491
+ var init_cuit = __esm({ "src/regex/detectors/ar/cuit.ts"() {
4492
+ init_base();
4493
+ init_entities();
4494
+ init_registry();
4495
+ init_validators();
4496
+ ArCuitDetector = class extends RegexDetector {
4497
+ entityType = EntityType.AR_CUIT;
4498
+ score = .85;
4499
+ contextKeywords = [
4500
+ "cuit",
4501
+ "cuil",
4502
+ "clave unica",
4503
+ "identificacion tributaria"
4504
+ ];
4505
+ contextRequired = true;
4506
+ pattern = /\b\d{2}-?\d{8}-?\d\b/g;
4507
+ validator = arCuitChecksum;
4508
+ };
4509
+ registerRegion("ar", ArCuitDetector);
4510
+ } });
4511
+
4512
+ //#endregion
4513
+ //#region src/regex/detectors/ar/index.ts
4514
+ var init_ar = __esm({ "src/regex/detectors/ar/index.ts"() {
4515
+ init_cuit();
4516
+ } });
4517
+
4518
+ //#endregion
4519
+ //#region src/regex/detectors/cl/rut.ts
4520
+ var ClRutDetector;
4521
+ var init_rut = __esm({ "src/regex/detectors/cl/rut.ts"() {
4522
+ init_base();
4523
+ init_entities();
4524
+ init_registry();
4525
+ init_validators();
4526
+ ClRutDetector = class extends RegexDetector {
4527
+ entityType = EntityType.CL_RUT;
4528
+ score = .85;
4529
+ contextKeywords = [
4530
+ "rut",
4531
+ "run",
4532
+ "rol unico tributario",
4533
+ "rol unico nacional"
4534
+ ];
4535
+ contextRequired = true;
4536
+ pattern = /\b\d{1,2}\.?\d{3}\.?\d{3}-?[\dkK]\b/g;
4537
+ validator = clRutChecksum;
4538
+ };
4539
+ registerRegion("cl", ClRutDetector);
4540
+ } });
4541
+
4542
+ //#endregion
4543
+ //#region src/regex/detectors/cl/index.ts
4544
+ var init_cl = __esm({ "src/regex/detectors/cl/index.ts"() {
4545
+ init_rut();
4546
+ } });
4547
+
4548
+ //#endregion
4549
+ //#region src/regex/detectors/co/nit.ts
4550
+ var CoNitDetector;
4551
+ var init_nit = __esm({ "src/regex/detectors/co/nit.ts"() {
4552
+ init_base();
4553
+ init_entities();
4554
+ init_registry();
4555
+ init_validators();
4556
+ CoNitDetector = class extends RegexDetector {
4557
+ entityType = EntityType.CO_NIT;
4558
+ score = .85;
4559
+ contextKeywords = [
4560
+ "nit",
4561
+ "numero de identificacion tributaria",
4562
+ "identificacion tributaria"
4563
+ ];
4564
+ contextRequired = true;
4565
+ pattern = /\b\d{3}\.?\d{3}\.?\d{3}-?\d\b/g;
4566
+ validator = coNitChecksum;
4567
+ };
4568
+ registerRegion("co", CoNitDetector);
4569
+ } });
4570
+
4571
+ //#endregion
4572
+ //#region src/regex/detectors/co/index.ts
4573
+ var init_co = __esm({ "src/regex/detectors/co/index.ts"() {
4574
+ init_nit();
4575
+ } });
4576
+
4577
+ //#endregion
4578
+ //#region src/regex/detectors/index.ts
4579
+ var init_detectors = __esm({ "src/regex/detectors/index.ts"() {
4580
+ init_email();
4581
+ init_credit_card();
4582
+ init_phone();
4583
+ init_ip_address();
4584
+ init_url();
4585
+ init_mac_address();
4586
+ init_date_of_birth();
4587
+ init_cvv();
4588
+ init_us();
4589
+ init_eu();
4590
+ init_uk();
4591
+ init_de();
4592
+ init_fr();
4593
+ init_es();
4594
+ init_it();
4595
+ init_pt();
4596
+ init_pl();
4597
+ init_cz();
4598
+ init_ru();
4599
+ init_nl();
4600
+ init_ro();
4601
+ init_sk();
4602
+ init_dk();
4603
+ init_se();
4604
+ init_no();
4605
+ init_br();
4606
+ init_be();
4607
+ init_at();
4608
+ init_ie();
4609
+ init_fi();
4610
+ init_hu();
4611
+ init_bg();
4612
+ init_hr();
4613
+ init_si();
4614
+ init_lt();
4615
+ init_lv();
4616
+ init_ee();
4617
+ init_ca();
4618
+ init_ch();
4619
+ init_au();
4620
+ init_nz();
4621
+ init_in();
4622
+ init_jp();
4623
+ init_kr();
4624
+ init_za();
4625
+ init_tr();
4626
+ init_il();
4627
+ init_ar();
4628
+ init_cl();
4629
+ init_co();
4630
+ } });
4631
+
4632
+ //#endregion
4633
+ //#region src/regex/scanner.ts
4634
+ var PIIScanner;
4635
+ var init_scanner = __esm({ "src/regex/scanner.ts"() {
4636
+ init_registry();
4637
+ init_synthesizers();
4638
+ init_detectors();
4639
+ PIIScanner = class {
4640
+ registry;
4641
+ constructor(options) {
4642
+ this.registry = new DetectorRegistry(options?.locales);
4643
+ }
4644
+ /** Detect PII entities in text and return deduplicated matches. */
4645
+ detect(text, entities) {
4646
+ let detectors = this.registry.detectors;
4647
+ if (entities) {
4648
+ const entitySet = new Set(entities);
4649
+ detectors = detectors.filter((d) => entitySet.has(d.entityType));
4650
+ }
4651
+ const hasDigit = /\d/.test(text);
4652
+ const textLower = text.toLowerCase();
4653
+ const allMatches = [];
4654
+ for (const detector of detectors) {
4655
+ if (detector.needsDigit && !hasDigit) continue;
4656
+ detector._textLower = textLower;
4657
+ allMatches.push(...detector.iterMatches(text));
4658
+ detector._textLower = null;
4659
+ }
4660
+ return this.deduplicate(allMatches);
4661
+ }
4662
+ /**
4663
+ * Detect and remove PII from text.
4664
+ * Returns a tuple of [redactedText, detectedMatches].
4665
+ */
4666
+ redact(text, entities) {
4667
+ const matches = this.detect(text, entities);
4668
+ if (matches.length === 0) return [text, []];
4669
+ const sortedMatches = [...matches].sort((a, b) => b.start - a.start);
4670
+ let result = text;
4671
+ for (const m of sortedMatches) {
4672
+ const start = m.start > 0 && result[m.start - 1] === " " ? m.start - 1 : m.start;
4673
+ result = result.slice(0, start) + result.slice(m.end);
4674
+ }
4675
+ return [result, matches];
4676
+ }
4677
+ /**
4678
+ * Detect PII and replace with numbered tokens like `<Email Address_1>`.
4679
+ * Returns tokenized text, a mapping from tokens to original values, and matches.
4680
+ */
4681
+ tokenize(text, entities) {
4682
+ const matches = this.detect(text, entities);
4683
+ if (matches.length === 0) return {
4684
+ text,
4685
+ mapping: {},
4686
+ matches: []
4687
+ };
4688
+ const sortedAsc = [...matches].sort((a, b) => a.start - b.start);
4689
+ const counters = {};
4690
+ const tokenMap = new Map();
4691
+ const mapping = {};
4692
+ for (const m of sortedAsc) {
4693
+ const count = (counters[m.entityType] ?? 0) + 1;
4694
+ counters[m.entityType] = count;
4695
+ const token = `<${m.entityType}_${count}>`;
4696
+ tokenMap.set(m, token);
4697
+ mapping[token] = m.text;
4698
+ }
4699
+ const sortedDesc = [...matches].sort((a, b) => b.start - a.start);
4700
+ let result = text;
4701
+ for (const m of sortedDesc) {
4702
+ const token = tokenMap.get(m);
4703
+ result = result.slice(0, m.start) + token + result.slice(m.end);
4704
+ }
4705
+ return {
4706
+ text: result,
4707
+ mapping,
4708
+ matches
4709
+ };
4710
+ }
4711
+ /**
4712
+ * Detect PII and partially mask each match.
4713
+ */
4714
+ mask(text, charsToShow = 3, fromEnd = false, maskingChar = "*", entities) {
4715
+ const matches = this.detect(text, entities);
4716
+ if (matches.length === 0) return {
4717
+ text,
4718
+ matches: []
4719
+ };
4720
+ const sortedMatches = [...matches].sort((a, b) => b.start - a.start);
4721
+ let result = text;
4722
+ for (const m of sortedMatches) {
4723
+ const original = m.text;
4724
+ const show = Math.min(charsToShow, original.length);
4725
+ const maskLen = original.length - show;
4726
+ let masked;
4727
+ if (fromEnd) masked = maskingChar.repeat(maskLen) + original.slice(maskLen);
4728
+ else masked = original.slice(0, show) + maskingChar.repeat(maskLen);
4729
+ result = result.slice(0, m.start) + masked + result.slice(m.end);
4730
+ }
4731
+ return {
4732
+ text: result,
4733
+ matches
4734
+ };
4735
+ }
4736
+ /**
4737
+ * Detect PII and replace each match with a deterministic hash.
4738
+ */
4739
+ hash(text, hashType = "sha256", hashPrefix = "HASH_", hashLength = 16, entities) {
4740
+ const matches = this.detect(text, entities);
4741
+ if (matches.length === 0) return {
4742
+ text,
4743
+ matches: []
4744
+ };
4745
+ const sortedMatches = [...matches].sort((a, b) => b.start - a.start);
4746
+ let result = text;
4747
+ for (const m of sortedMatches) {
4748
+ const digest = crypto.createHash(hashType).update(m.text).digest("hex");
4749
+ const truncated = digest.slice(0, hashLength);
4750
+ const replacement = hashPrefix + truncated;
4751
+ result = result.slice(0, m.start) + replacement + result.slice(m.end);
4752
+ }
4753
+ return {
4754
+ text: result,
4755
+ matches
4756
+ };
4757
+ }
4758
+ /**
4759
+ * Detect PII and encrypt each match with AES-256-CBC.
4760
+ * @param encryptionKey - Required, minimum 16 characters.
4761
+ */
4762
+ encrypt(text, encryptionKey, entities) {
4763
+ if (!encryptionKey || encryptionKey.length < 16) throw new Error("encryptionKey is required and must be at least 16 characters for local encryption");
4764
+ const matches = this.detect(text, entities);
4765
+ if (matches.length === 0) return {
4766
+ text,
4767
+ matches: []
4768
+ };
4769
+ const derivedKey = crypto.createHash("sha256").update(encryptionKey).digest();
4770
+ const sortedMatches = [...matches].sort((a, b) => b.start - a.start);
4771
+ let result = text;
4772
+ for (const m of sortedMatches) {
4773
+ const iv = crypto.randomBytes(16);
4774
+ const cipher = crypto.createCipheriv("aes-256-cbc", derivedKey, iv);
4775
+ const encrypted = Buffer.concat([cipher.update(m.text, "utf8"), cipher.final()]);
4776
+ const combined = Buffer.concat([iv, encrypted]);
4777
+ const replacement = combined.toString("base64");
4778
+ result = result.slice(0, m.start) + replacement + result.slice(m.end);
4779
+ }
4780
+ return {
4781
+ text: result,
4782
+ matches
4783
+ };
4784
+ }
4785
+ /**
4786
+ * Detect PII and replace each match with format-preserving synthetic data.
4787
+ * @param _language - Accepted for API compatibility but ignored locally.
4788
+ */
4789
+ synthesize(text, _language, entities) {
4790
+ const matches = this.detect(text, entities);
4791
+ if (matches.length === 0) return {
4792
+ text,
4793
+ matches: []
4794
+ };
4795
+ const sortedMatches = [...matches].sort((a, b) => b.start - a.start);
4796
+ let result = text;
4797
+ for (const m of sortedMatches) {
4798
+ const replacement = synthesizeValue(m.entityType, m.text);
4799
+ result = result.slice(0, m.start) + replacement + result.slice(m.end);
4800
+ }
4801
+ return {
4802
+ text: result,
4803
+ matches
4804
+ };
4805
+ }
4806
+ /** Remove overlapping matches, preferring higher score then longer span. */
4807
+ deduplicate(matches) {
4808
+ if (matches.length === 0) return [];
4809
+ matches.sort((a, b) => {
4810
+ if (a.start !== b.start) return a.start - b.start;
4811
+ if (a.score !== b.score) return b.score - a.score;
4812
+ return b.end - b.start - (a.end - a.start);
4813
+ });
4814
+ const result = [];
4815
+ let lastEnd = -1;
4816
+ for (const m of matches) if (m.start >= lastEnd) {
4817
+ result.push(m);
4818
+ lastEnd = m.end;
4819
+ }
4820
+ return result;
4821
+ }
4822
+ };
4823
+ } });
4824
+
4825
+ //#endregion
4826
+ //#region src/regex/index.ts
4827
+ var regex_exports = {};
4828
+ __export(regex_exports, {
4829
+ EntityType: () => EntityType,
4830
+ PIIScanner: () => PIIScanner
4831
+ });
4832
+ var init_regex = __esm({ "src/regex/index.ts"() {
4833
+ init_scanner();
4834
+ init_entities();
4835
+ } });
4836
+
4837
+ //#endregion
4838
+ export { EntityType, PIIScanner, __toCommonJS, init_regex, regex_exports };
4839
+ //# sourceMappingURL=regex-ByjZg3Zy.mjs.map