euredact 0.0.1 → 0.2.0

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,625 @@
1
+ import { EntityType } from "../../types.js";
2
+ /**
3
+ * Helper to create a PatternDef with sensible defaults.
4
+ */
5
+ function p(entityType, pattern, validator = null, description = "", contextKeywords = [], requiresContext = false) {
6
+ return { entityType, pattern, validator, description, contextKeywords, requiresContext };
7
+ }
8
+ // ---------------------------------------------------------------------------
9
+ // DOB context keywords (reused across SHARED patterns)
10
+ // ---------------------------------------------------------------------------
11
+ const DOB_CONTEXT = [
12
+ "geboren", "geboortedatum", "date de naissance", "né le", "née le",
13
+ "né(e) le", "nee le", "nee(e) le", "date of birth", "DOB",
14
+ "Geburtsdatum", "geboren am", "geboren op", "nascido", "nacido",
15
+ "data di nascita", "nato il", "nata il", "geb.", "geb.datum", "geb ",
16
+ "birth date", "birthday", "naissance", "geboorte", "geburtstag",
17
+ ];
18
+ const DOB_ISO_CONTEXT = [
19
+ "geboren", "geboortedatum", "date de naissance", "né le", "née le",
20
+ "né(e) le", "nee le", "date of birth", "DOB", "Geburtsdatum",
21
+ "geboren am", "geboren op", "geb.", "birth date", "birthday",
22
+ "naissance", "geboorte",
23
+ ];
24
+ const DATE_OF_DEATH_CONTEXT = [
25
+ "overleden", "overlijdensdatum", "date de décès", "décédé le",
26
+ "date of death", "Sterbedatum", "verstorben am", "gestorven",
27
+ "death date", "died on", "mort le", "décès",
28
+ ];
29
+ // ---------------------------------------------------------------------------
30
+ // Country configurations
31
+ // ---------------------------------------------------------------------------
32
+ const SHARED = {
33
+ code: "SHARED",
34
+ name: "Shared EU Patterns",
35
+ patterns: [
36
+ p(EntityType.EMAIL, String.raw `\b[\w._%+\-]+@[\w.\-]+\.[a-zA-Z]{2,}\b`),
37
+ p(EntityType.BIC, String.raw `\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\b`, "bic"),
38
+ p(EntityType.CREDIT_CARD, String.raw `\b(?:4[0-9]{3}[\s\-]?[0-9]{4}[\s\-]?[0-9]{4}[\s\-]?[0-9]{4}|5[1-5][0-9]{2}[\s\-]?[0-9]{4}[\s\-]?[0-9]{4}[\s\-]?[0-9]{4}|3[47][0-9]{2}[\s\-]?[0-9]{6}[\s\-]?[0-9]{5})\b`, "luhn"),
39
+ p(EntityType.VIN, String.raw `\b[A-HJ-NPR-Z0-9]{17}\b`, "vin"),
40
+ p(EntityType.IP_ADDRESS, String.raw `\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b`),
41
+ p(EntityType.IPV6_ADDRESS, String.raw `\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}:){1,6}:[0-9a-fA-F]{1,4}\b|\b::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}\b`),
42
+ p(EntityType.MAC_ADDRESS, String.raw `\b(?:[0-9a-fA-F]{2}[:\-]){5}[0-9a-fA-F]{2}\b`, null, "colon/dash"),
43
+ p(EntityType.MAC_ADDRESS, String.raw `\b[0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\b`, null, "Cisco"),
44
+ p(EntityType.IMEI, String.raw `\b\d{15}\b`, "imei"),
45
+ p(EntityType.IMEI, String.raw `\b\d{2}[\-\s]\d{6}[\-\s]\d{6}[\-\s]\d\b`, "imei", "formatted"),
46
+ p(EntityType.GPS_COORDINATES, String.raw `-?(?:[1-8]?\d(?:\.\d{4,})|90(?:\.0{4,}))\s*[,;/]\s*-?(?:1[0-7]\d(?:\.\d{4,})|180(?:\.0{4,})|\d{1,2}(?:\.\d{4,}))`),
47
+ p(EntityType.UUID, String.raw `\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\b`),
48
+ p(EntityType.SOCIAL_HANDLE, String.raw `(?<!\w)@[a-zA-Z][a-zA-Z0-9_.]{1,29}\b`),
49
+ // --- Secret / API Key (known prefixes — always active) ---
50
+ p(EntityType.SECRET, String.raw `\bAKIA[A-Z0-9]{16}\b`, null, "AWS Access Key ID"),
51
+ p(EntityType.SECRET, String.raw `\bgh[poas]_[a-zA-Z0-9]{36,}\b`, null, "GitHub token"),
52
+ p(EntityType.SECRET, String.raw `\bgithub_pat_[a-zA-Z0-9_]{22,}\b`, null, "GitHub fine-grained PAT"),
53
+ p(EntityType.SECRET, String.raw `\bgl[a-z]t-[a-zA-Z0-9_\-]{20,}\b`, null, "GitLab token"),
54
+ p(EntityType.SECRET, String.raw `\bglpat-[a-zA-Z0-9_\-]{20,}\b`, null, "GitLab PAT"),
55
+ p(EntityType.SECRET, String.raw `\b[sp]k_(?:live|test)_[a-zA-Z0-9]{24,}\b`, null, "Stripe key"),
56
+ p(EntityType.SECRET, String.raw `\bsk-(?:ant-)?[a-zA-Z0-9\-_]{20,}\b`, null, "OpenAI/Anthropic key"),
57
+ p(EntityType.SECRET, String.raw `\bxox[bpas]-\d[\d\-]{10,}`, null, "Slack numeric token"),
58
+ p(EntityType.SECRET, String.raw `\bxox[bpas]-[a-zA-Z0-9\-]{10,}`, null, "Slack token"),
59
+ p(EntityType.SECRET, String.raw `\beyJ[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+\b`, null, "JWT token"),
60
+ p(EntityType.SECRET, String.raw `\bSG\.[a-zA-Z0-9_\-]{22}\.[a-zA-Z0-9_\-]{43}\b`, null, "SendGrid key"),
61
+ p(EntityType.SECRET, String.raw `\bhvs\.[a-zA-Z0-9_\-]{20,}\b`, null, "Vault token"),
62
+ p(EntityType.SECRET, String.raw `\bkey-[a-f0-9]{20,}\b`, null, "Mailgun key"),
63
+ p(EntityType.SECRET, String.raw `\bnpm_[a-zA-Z0-9]{36,}\b`, null, "npm token"),
64
+ p(EntityType.SECRET, String.raw `\bAIza[a-zA-Z0-9_\-]{35}\b`, null, "Google API key"),
65
+ p(EntityType.SECRET, String.raw `\bdop_v1_[a-f0-9]{64}\b`, null, "DigitalOcean token"),
66
+ p(EntityType.SECRET, String.raw `\bAC[a-f0-9]{32}\b`, null, "Twilio Account SID"),
67
+ p(EntityType.SECRET, String.raw `\bxapp-\d[\d\-]{20,}`, null, "Slack app numeric token"),
68
+ p(EntityType.SECRET, String.raw `\bxapp-[a-zA-Z0-9\-]{20,}`, null, "Slack app token"),
69
+ p(EntityType.SECRET, String.raw `\bdapi[a-f0-9]{32,}\b`, null, "Databricks PAT"),
70
+ // --- Secret / API Key (connection strings with embedded credentials) ---
71
+ p(EntityType.SECRET, String.raw `(?:mongodb|mysql|postgres(?:ql)?|redis|amqp|rabbitmq):\/\/[^\s:]+:[^\s@]+@[^\s]+`, null, "Connection string with credentials"),
72
+ // --- Secret / API Key (assignment-based: KEY=value or KEY: value) ---
73
+ p(EntityType.SECRET, String.raw `(?<=[:=] )\S{8,}|(?<=[:=])\S{8,}`, "high_entropy", "Assigned secret value", [
74
+ "key", "token", "secret", "password", "credential",
75
+ "api_key", "apikey", "api-key", "auth", "bearer",
76
+ "aws_secret_access_key", "access_key", "private_key",
77
+ "wachtwoord", "mot de passe", "Passwort", "Schlüssel",
78
+ "clé", "sleutel", "lösenord", "hasło", "heslo",
79
+ "jelszó", "contraseña", "senha", "parola",
80
+ "AES_KEY", "ENCRYPTION_KEY", "SIGNING_KEY",
81
+ "ACCOUNT_SID", "AUTH_TOKEN", "TWILIO",
82
+ "RAILS_SECRET", "SECRET_KEY_BASE", "DATABASE_URL",
83
+ "NPM_TOKEN", "DIGITALOCEAN", "GOOGLE_API",
84
+ "kľúč", "nøkkel", "nyckel", "avain", "lykill",
85
+ "DB_PASS", "DB_PASSWORD", "DATASOURCE_PASSWORD",
86
+ "JWT_SIGNING", "SIGNING_KEY",
87
+ "passwd", "Kennwort",
88
+ ], true),
89
+ // --- Secret / API Key (entropy-based fallback for longer tokens) ---
90
+ p(EntityType.SECRET, String.raw `\b[A-Za-z0-9_\-+/]{24,}[A-Za-z0-9_\-+/=]*\b`, "high_entropy", "High-entropy token", [
91
+ "key", "token", "secret", "password", "credential",
92
+ "api_key", "apikey", "api-key", "auth", "bearer",
93
+ "aws_secret_access_key", "access_key", "private_key",
94
+ "wachtwoord", "mot de passe", "Passwort", "Schlüssel",
95
+ "clé", "sleutel", "lösenord", "hasło", "heslo",
96
+ "jelszó", "contraseña", "senha", "parola",
97
+ "kľúč", "nøkkel", "nyckel", "avain", "lykill",
98
+ ], true),
99
+ p(EntityType.DOB, String.raw `\b(?:0[1-9]|[12][0-9]|3[01])[/.\-](?:0[1-9]|1[0-2])[/.\-](?:19|20)\d{2}\b`, null, "DD/MM/YYYY", DOB_CONTEXT, true),
100
+ p(EntityType.DATE_OF_DEATH, String.raw `\b(?:0[1-9]|[12][0-9]|3[01])[/.\-](?:0[1-9]|1[0-2])[/.\-](?:19|20)\d{2}\b`, null, "", DATE_OF_DEATH_CONTEXT, true),
101
+ p(EntityType.DOB, String.raw `\b(?:19|20)\d{2}[/.\-](?:0[1-9]|1[0-2])[/.\-](?:0[1-9]|[12][0-9]|3[01])\b`, null, "ISO YYYY-MM-DD", DOB_ISO_CONTEXT, true),
102
+ ],
103
+ };
104
+ const NL = {
105
+ code: "NL",
106
+ name: "Netherlands",
107
+ patterns: [
108
+ p(EntityType.NATIONAL_ID, String.raw `\b[0-9]{9}\b`, "bsn"),
109
+ p(EntityType.NATIONAL_ID, String.raw `\b[0-9]{2,4}\.[0-9]{2,4}\.[0-9]{2,4}\b`, "bsn"),
110
+ p(EntityType.IBAN, String.raw `\bNL\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
111
+ p(EntityType.VAT, String.raw `\bNL\d{9}B\d{2}\b`, "vat_nl"),
112
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{8}\b`, "kvk", "", ["KvK", "Kamer van Koophandel", "kvk-nummer", "KVK-nummer", "handelsregister", "chamber of commerce"], true),
113
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d[\s\-]?\d{3}[\s\-]?\d{4}\b`),
114
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d{2}[\s\-]?\d{6,7}\b`),
115
+ p(EntityType.PHONE, String.raw `\b06[\s\-]?\d{4}[\s\-]?\d{4}\b`),
116
+ p(EntityType.PHONE, String.raw `\b06\d{8}\b`),
117
+ p(EntityType.PHONE, String.raw `\b06[\s\-]?\d{2}[\s\-]?\d{2}[\s\-]?\d{2}[\s\-]?\d{2}\b`),
118
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d{1,2}[\s\-]?\d{2,3}[\s\-]?\d{2}[\s\-]?\d{2}\b`),
119
+ p(EntityType.PHONE, String.raw `\+31\s?[1-9]\d{0,2}[\s\-]?\d{3,4}[\s\-]?\d{3,4}\b`),
120
+ p(EntityType.PASSPORT, String.raw `\b[A-Z][A-Z0-9]{8}\b`, null, "", ["paspoort", "passport", "reisdocument", "travel document", "paspoortnummer", "identiteitsbewijs"], true),
121
+ p(EntityType.LICENSE_PLATE, String.raw `\b(?:[A-Z]{2}[\-\s]?\d{3}[\-\s]?[A-Z]|\d[\-\s]?[A-Z]{3}[\-\s]?\d{2}|\d{2}[\-\s]?[A-Z]{3}[\-\s]?\d|[A-Z]{2}[\-\s]?\d{2}[\-\s]?[A-Z]{2}|\d{2}[\-\s]?[A-Z]{2}[\-\s]?\d{2}|\d[\-\s]?[A-Z]{2}[\-\s]?\d{3})\b`),
122
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\s?[A-Z]{2}\b`),
123
+ ],
124
+ };
125
+ const BE = {
126
+ code: "BE",
127
+ name: "Belgium",
128
+ patterns: [
129
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{2}\.?\d{2}\.?\d{2}[\-.]?\d{3}\.?\d{2}\b`, "belgian_nn"),
130
+ p(EntityType.IBAN, String.raw `\bBE\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
131
+ p(EntityType.VAT, String.raw `\bBE\s?0\d{3}\.?\d{3}\.?\d{3}\b`, "belgian_vat"),
132
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b0\d{3}\.?\d{3}\.?\d{3}\b`, null, "", ["KBO", "BCE", "ondernemingsnummer", "numéro d'entreprise", "enterprise number", "bedrijfsnummer"], true),
133
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d{0,2}[/\s.\-]?\d{2,3}[.\s\-]?\d{2,3}[.\s\-]?\d{2,3}\b`),
134
+ p(EntityType.PHONE, String.raw `\+32\s?\d{1,3}[\s.\-]?\d{2,3}[\s.\-]?\d{2}[\s.\-]?\d{2}`),
135
+ p(EntityType.PASSPORT, String.raw `\b[A-Z]{2}\d{6}\b`, null, "", ["paspoort", "passport", "passeport", "reisdocument", "travel document", "document de voyage"], true),
136
+ p(EntityType.DRIVERS_LICENSE, String.raw `\b\d{10}\b`, null, "", ["rijbewijs", "permis de conduire", "driving licence", "driving license", "rijbewijsnummer"], true),
137
+ p(EntityType.LICENSE_PLATE, String.raw `\b[12][\-\s]?[A-Z]{3}[\-\s]?\d{3}\b`),
138
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["postcode", "code postal", "postnummer", "postal code", "zip", "B-", "adres", "adresse", "wonende", "woonplaats", "rue", "straat", "laan", "avenue", "boulevard", "plein", "steenweg", "chaussée", "domicilié", "gedomicilieerd", "Levering:", "siège"], true),
139
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
140
+ p(EntityType.HEALTHCARE_PROVIDER, String.raw `\b\d{1}[\-.]?\d{5}[\-.]?\d{2}[\-.]?\d{3}\b`, null, "", ["RIZIV", "INAMI", "arts", "médecin", "zorgverlener", "prestataire", "dokter", "doctor"], true),
141
+ ],
142
+ };
143
+ const DE = {
144
+ code: "DE",
145
+ name: "Germany",
146
+ patterns: [
147
+ p(EntityType.TAX_ID, String.raw `\b[1-9]\d{10}\b`, "german_tax_id"),
148
+ p(EntityType.TAX_ID, String.raw `\b[1-9]\d[\s.]?\d{3}[\s.]?\d{3}[\s.]?\d{3}\b`, "german_tax_id"),
149
+ p(EntityType.NATIONAL_ID, String.raw `\b[CFGHJKLMNPRTVWXYZ][0-9A-Z]{8,9}\b`, null, "", ["Personalausweis", "Personalausweisnummer", "Ausweis", "Ausweisnummer", "Ausweis-Nr", "identity card", "Identitätskarte", "Perso", "PA-Nummer"], true),
150
+ p(EntityType.IBAN, String.raw `\bDE\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
151
+ p(EntityType.VAT, String.raw `\bDE\s?\d{9}\b`, "vat_de"),
152
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d{1,4}[\s/\-]?\d{3,8}\b`),
153
+ p(EntityType.PHONE, String.raw `\+49\s?\d{2,5}[\s/\-]?\d{3,8}\b`),
154
+ p(EntityType.PASSPORT, String.raw `\b[CFGHJK][0-9A-Z]{8,9}\b`, null, "", ["Reisepass", "passport", "Passnummer", "Reisepassnummer", "Reisepass Nummer", "Reisepass-Nr", "Pass Nr"], true),
155
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-ZÄÖÜ]{1,3}[\s\-]?[A-Z]{1,2}[\s\-]?\d{1,4}[EH]?\b`),
156
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{5}\b`, null, "", ["PLZ", "Postleitzahl", "postal code", "postcode", "Anschrift", "Adresse", "Wohnort", "Ort", "Stadt", "wohnt", "wohnhaft", "Straße", "Str.", "Weg", "Platz", "Allee", "Ring"], true),
157
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\bHR[AB]\s?\d{4,6}\b`),
158
+ p(EntityType.SSN, String.raw `\b\d{2}[\s]?\d{6}[\s]?[A-Z][\s]?\d{3}\b`, null, "", ["Rentenversicherung", "RV-Nummer", "Sozialversicherung", "SV-Nummer", "Versicherungsnummer", "Rentenversicherungsnummer", "Sozialversicherungsnummer"], true),
159
+ p(EntityType.TAX_ID, String.raw `\b\d{2,3}/\d{3,4}/\d{4,5}\b`, null, "", ["Steuernummer", "St.-Nr", "StNr", "Finanzamt", "Steuer"], true),
160
+ p(EntityType.TAX_ID, String.raw `\b\d{13}\b`, null, "", ["Steuernummer", "St.-Nr", "StNr", "Finanzamt", "Steuer"], true),
161
+ p(EntityType.HEALTH_INSURANCE, String.raw `\b[A-Z]\d{9}\b`, null, "", ["Versichertennummer", "Krankenversicherung", "KV-Nummer", "Krankenkasse", "GKV", "Versichertenkarte", "Versicherter", "Versicherte", "KVNR", "Krankenversichertennummer"], true),
162
+ ],
163
+ };
164
+ const AT = {
165
+ code: "AT",
166
+ name: "Austria",
167
+ patterns: [
168
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{4}\s?\d{6}\b`, "austrian_svnr"),
169
+ p(EntityType.IBAN, String.raw `\bAT\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
170
+ p(EntityType.VAT, String.raw `\bATU\d{8}\b`),
171
+ p(EntityType.PHONE, String.raw `\b0\d{3,4}[\s\-]?\d{5,8}\b`),
172
+ p(EntityType.PHONE, String.raw `\+43\s?\d{3,4}[\s\-]?\d{5,8}`),
173
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-ZÄÖÜ]{1,2}\s?\d{1,5}\s?[A-Z]{1,2}\b`, null, "", ["Kennzeichen", "Nummernschild", "Kfz-Kennzeichen"], true),
174
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["PLZ", "Postleitzahl", "Adresse", "Anschrift", "Straße", "Str.", "Gasse", "Weg", "Platz", "Postal:", "Wohnort"], true),
175
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
176
+ ],
177
+ };
178
+ const CH = {
179
+ code: "CH",
180
+ name: "Switzerland",
181
+ patterns: [
182
+ p(EntityType.NATIONAL_ID, String.raw `\b756\.\d{4}\.\d{4}\.\d{2}\b`, "swiss_ahv"),
183
+ p(EntityType.NATIONAL_ID, String.raw `\b756\d{10}\b`, "swiss_ahv"),
184
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\bCHE[\-\s]?\d{3}\.?\d{3}\.?\d{3}\b`),
185
+ p(EntityType.VAT, String.raw `\bCHE[\-\s]?\d{3}\.?\d{3}\.?\d{3}\s?(?:MWST|TVA|IVA)\b`),
186
+ p(EntityType.IBAN, String.raw `\bCH\d{2}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]\b`, "iban"),
187
+ p(EntityType.PHONE, String.raw `\b0\d{2}\s?\d{3}\s?\d{2}\s?\d{2}\b`),
188
+ p(EntityType.PHONE, String.raw `\+41\s?\d{2}\s?\d{3}\s?\d{2}\s?\d{2}`),
189
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}\s?\d{1,6}\b`, null, "", ["Kontrollschild", "Nummernschild", "plaque", "immatriculation", "Kennzeichen"], true),
190
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["PLZ", "Postleitzahl", "code postal", "NPA", "Adresse", "Anschrift", "adresse", "rue", "Straße", "Str.", "Gasse", "chemin", "Postal:", "Wohnort"], true),
191
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
192
+ ],
193
+ };
194
+ const FR = {
195
+ code: "FR",
196
+ name: "France",
197
+ patterns: [
198
+ p(EntityType.NATIONAL_ID, String.raw `\b[12]\s?\d{2}\s?(?:0[1-9]|1[0-2]|[2-9]\d)\s?\d{2}[0-9AB]?\s?\d{3}\s?\d{3}\s?\d{2}\b`, "french_nir"),
199
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{12}\b`, null, "", ["carte d'identité", "CNI", "carte nationale", "identity card", "pièce d'identité"], true),
200
+ p(EntityType.IBAN, String.raw `\bFR\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
201
+ p(EntityType.VAT, String.raw `\bFR\s?[0-9A-HJ-NP-Z]{2}\s?\d{9}\b`, "vat_fr"),
202
+ p(EntityType.PHONE, String.raw `\b0[1-9][\s.\-]?\d{2}[\s.\-]?\d{2}[\s.\-]?\d{2}[\s.\-]?\d{2}\b`),
203
+ p(EntityType.PHONE, String.raw `\+33\s?[1-9][\s.\-]?\d{2}[\s.\-]?\d{2}[\s.\-]?\d{2}[\s.\-]?\d{2}`),
204
+ p(EntityType.PASSPORT, String.raw `\b\d{2}[A-Z]{2}\d{5}\b`, null, "", ["passeport", "passport", "numéro de passeport"], true),
205
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}[\-\s]?\d{3}[\-\s]?[A-Z]{2}\b`),
206
+ p(EntityType.POSTAL_CODE, String.raw `\b(?:0[1-9]|[1-8]\d|9[0-5]|97[1-6])\d{3}\b`, null, "", ["code postal", "CP", "postal code", "postcode", "adresse", "domicilié", "résidant", "rue", "avenue", "boulevard", "place", "chemin", "allée", "impasse", "ville"], true),
207
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{3}\s?\d{3}\s?\d{3}\b`, null, "", ["SIREN", "siren", "RCS", "entreprise", "immatricul", "numéro d'entreprise", "registre du commerce"], true),
208
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{3}\s?\d{3}\s?\d{3}\s?\d{5}\b`, null, "", ["SIRET", "siret", "établissement", "immatricul"], true),
209
+ p(EntityType.TAX_ID, String.raw `\b\d{13}\b`, null, "", ["numéro fiscal", "SPI", "référence fiscale", "avis d'impôt", "impôt sur le revenu", "déclaration fiscale", "fiscal"], true),
210
+ ],
211
+ };
212
+ const DK = {
213
+ code: "DK",
214
+ name: "Denmark",
215
+ patterns: [
216
+ p(EntityType.NATIONAL_ID, String.raw `\b(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|1[0-2])\d{2}-\d{4}\b`),
217
+ p(EntityType.NATIONAL_ID, String.raw `\b(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|1[0-2])\d{6}\b`, "danish_cpr"),
218
+ p(EntityType.IBAN, String.raw `\bDK\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
219
+ p(EntityType.VAT, String.raw `\bDK\s?\d{8}\b`, "danish_vat"),
220
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{8}\b`, "danish_vat", "", ["CVR", "CVR-nummer", "virksomhedsnummer", "virksomhedsregisteret"], true),
221
+ p(EntityType.PHONE, String.raw `\b[2-9]\d\s?\d{2}\s?\d{2}\s?\d{2}\b`),
222
+ p(EntityType.PHONE, String.raw `\+45\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}`),
223
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}\s?\d{2}\s?\d{3}\b`, null, "", ["nummerplade", "registreringsnummer", "reg.nr", "køretøj"], true),
224
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["postnummer", "postby", "postnr", "adresse", "bopæl", "bopælsadresse", "gade", "vej", "allé", "plads", "torv", "stræde", "boulevard", "Arbejdssted"], true),
225
+ ],
226
+ };
227
+ const SE = {
228
+ code: "SE",
229
+ name: "Sweden",
230
+ patterns: [
231
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{8}[-+]?\d{4}\b`, "swedish_pnr"),
232
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}[-+]\d{4}\b`, "swedish_pnr"),
233
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{10}\b`, "swedish_pnr"),
234
+ p(EntityType.IBAN, String.raw `\bSE\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
235
+ p(EntityType.VAT, String.raw `\bSE\d{12}\b`),
236
+ p(EntityType.PHONE, String.raw `\b0\d{1,3}[\-\s]?\d{2,3}[\s]?\d{2,3}[\s]?\d{2}\b`),
237
+ p(EntityType.PHONE, String.raw `\+46\s?\d{1,3}[\s\-]?\d{2,3}[\s\-]?\d{2,3}[\s\-]?\d{2}`),
238
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{3}\s?\d{2}[A-Z0-9]\b`),
239
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{3}\s?\d{2}\b`, null, "", ["postnummer", "postort", "postkod", "adress", "bostadsadress", "gatuadress", "boende", "gatan", "vägen", "gata", "väg", "allé", "plats", "torg", "stigen", "Bostadsadress"], true),
240
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{4}\s\d{2}\b`, null, "", ["postnummer", "postort", "postkod", "adress", "bostadsadress", "gatuadress", "boende", "gatan", "vägen", "gata", "väg", "allé"], true),
241
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{6}\b`, null, "", ["postnummer", "postort", "postkod", "adress", "bostadsadress", "gatuadress", "boende", "gatan", "vägen", "gata", "väg", "allé"], true),
242
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{6}-?\d{4}\b`, null, "", ["organisationsnummer", "org.nr", "org nr", "Bolagsverket", "registreringsnummer"], true),
243
+ ],
244
+ };
245
+ const NO = {
246
+ code: "NO",
247
+ name: "Norway",
248
+ patterns: [
249
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{11}\b`, "norwegian_fnr"),
250
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}\s\d{5}\b`, "norwegian_fnr"),
251
+ p(EntityType.IBAN, String.raw `\bNO\d{2}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
252
+ p(EntityType.VAT, String.raw `\bNO\s?\d{9}\s?MVA\b`),
253
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b[89]\d{8}\b`, "norwegian_org"),
254
+ p(EntityType.PHONE, String.raw `\b[2-9]\d\s?\d{2}\s?\d{2}\s?\d{2}\b`),
255
+ p(EntityType.PHONE, String.raw `\+47\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}`),
256
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}\s?\d{5}\b`),
257
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{4}\b`, null, "", ["postnummer", "poststed", "postnr", "adresse", "bostedsadresse", "gate", "vei", "veien", "gata", "plass", "stien", "allé"], true),
258
+ ],
259
+ };
260
+ const FI = {
261
+ code: "FI",
262
+ name: "Finland",
263
+ patterns: [
264
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}[-+ABCDEFYXWVU]\d{3}[0-9A-FHJK-NPR-Y]\b`, "finnish_hetu"),
265
+ p(EntityType.IBAN, String.raw `\bFI\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
266
+ p(EntityType.VAT, String.raw `\bFI\d{8}\b`),
267
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b\d{7}-\d\b`, "finnish_business_id"),
268
+ p(EntityType.PHONE, String.raw `\b0\d{1,2}\s?\d{3,4}\s?\d{3,4}\b`),
269
+ p(EntityType.PHONE, String.raw `\+358\s?\d{1,3}[\s\-]?\d{3,4}[\s\-]?\d{3,4}`),
270
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2,3}[\-\s]?\d{3}\b`, null, "", ["rekisteritunnus", "rekisterinumero", "rekisterikilpi", "ajoneuvo"], true),
271
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{5}\b`, null, "", ["postinumero", "postitoimipaikka", "osoite", "kotiosoite", "katuosoite"], true),
272
+ ],
273
+ };
274
+ const IS = {
275
+ code: "IS",
276
+ name: "Iceland",
277
+ patterns: [
278
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}-?\d{4}\b`, "icelandic_kt"),
279
+ p(EntityType.IBAN, String.raw `\bIS\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
280
+ p(EntityType.PHONE, String.raw `\b[3-9]\d{2}\s\d{4}\b`),
281
+ p(EntityType.PHONE, String.raw `\b[3-9]\d{6}\b`, null, "", ["sími", "símanúmer", "farsími", "gsm", "phone", "tel", "hringja", "hringdu", "ná í", "nás á", "nás", "SMS", "sent to"], true),
282
+ p(EntityType.PHONE, String.raw `\+354\s?\d{3}\s?\d{4}`),
283
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}\s?\d{3}\b`, null, "", ["skráningarnúmer", "bílnúmer", "ökutæki", "bifreið", "plata"], true),
284
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{2}\b`, null, "", ["póstnúmer", "póstfang", "staður", "heimilisfang"], true),
285
+ ],
286
+ };
287
+ const IT = {
288
+ code: "IT",
289
+ name: "Italy",
290
+ patterns: [
291
+ p(EntityType.NATIONAL_ID, String.raw `\b[A-Z]{6}\d{2}[ABCDEHLMPRST]\d{2}[A-Z]\d{3}[A-Z]\b`, "italian_cf"),
292
+ p(EntityType.IBAN, String.raw `\bIT\d{2}\s?[A-Z]\d{3}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
293
+ p(EntityType.IBAN, String.raw `\bIT\d{2}[A-Z]\d{22}\b`, "iban"),
294
+ p(EntityType.VAT, String.raw `\bIT\d{11}\b`),
295
+ p(EntityType.PHONE, String.raw `\b3\d{2}[\s\-]?\d{3}[\s\-]?\d{4}\b`),
296
+ p(EntityType.PHONE, String.raw `\b0\d{1,3}[\s\-]?\d{6,8}\b`),
297
+ p(EntityType.PHONE, String.raw `\b0\d{1,2}[\s\-]\d{3}[\s\-]\d{4}\b`),
298
+ p(EntityType.PHONE, String.raw `\+39\s?\d{2,3}[\s\-]?\d{3,4}[\s\-]?\d{3,4}`),
299
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}\s?\d{3}\s?[A-Z]{2}\b`),
300
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{5}\b`, null, "", ["CAP", "codice postale", "codice di avviamento", "indirizzo", "via", "viale", "piazza", "corso", "largo", "vicolo", "Domicilio", "domicilio", "Residenza", "residenza", "Postal:"], true),
301
+ ],
302
+ };
303
+ const ES = {
304
+ code: "ES",
305
+ name: "Spain",
306
+ patterns: [
307
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{8}[A-Z]\b`, "spanish_dni"),
308
+ p(EntityType.NATIONAL_ID, String.raw `\b[XYZ]\d{7}[A-Z]\b`, "spanish_nie"),
309
+ p(EntityType.IBAN, String.raw `\bES\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
310
+ p(EntityType.VAT, String.raw `\bES[A-Z0-9]\d{7}[A-Z0-9]\b`),
311
+ p(EntityType.PHONE, String.raw `\b[679]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
312
+ p(EntityType.PHONE, String.raw `\b[679]\d{8}\b`),
313
+ p(EntityType.PHONE, String.raw `\b[679]\d[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b`),
314
+ p(EntityType.PHONE, String.raw `\+34\s?[679]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}`),
315
+ p(EntityType.LICENSE_PLATE, String.raw `\b\d{4}\s?[BCDFGHJKLMNPRSTVWXYZ]{3}\b`),
316
+ p(EntityType.POSTAL_CODE, String.raw `\b(?:0[1-9]|[1-4]\d|5[0-2])\d{3}\b`, null, "", ["código postal", "C.P.", "CP", "dirección", "domicilio", "calle", "avenida", "plaza", "paseo", "camino", "Postal:"], true),
317
+ ],
318
+ };
319
+ const PT = {
320
+ code: "PT",
321
+ name: "Portugal",
322
+ patterns: [
323
+ p(EntityType.NATIONAL_ID, String.raw `\b[1-35-9]\d{8}\b`, "portuguese_nif"),
324
+ p(EntityType.NATIONAL_ID, String.raw `\b[1-35-9]\d{2}[\s.]\d{3}[\s.]\d{3}\b`, "portuguese_nif"),
325
+ p(EntityType.IBAN, String.raw `\bPT\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{5}\b`, "iban"),
326
+ p(EntityType.VAT, String.raw `\bPT\d{9}\b`),
327
+ p(EntityType.PHONE, String.raw `\b[29]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
328
+ p(EntityType.PHONE, String.raw `\b[29]\d{8}\b`),
329
+ p(EntityType.PHONE, String.raw `\+351\s?[29]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}`),
330
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z0-9]{2}-[A-Z0-9]{2}-[A-Z0-9]{2}\b`),
331
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{4}-\d{3}\b`),
332
+ ],
333
+ };
334
+ const LU = {
335
+ code: "LU",
336
+ name: "Luxembourg",
337
+ patterns: [
338
+ p(EntityType.NATIONAL_ID, String.raw `\b(?:19|20)\d{2}\s(?:0[1-9]|1[0-2])\s(?:0[1-9]|[12]\d|3[01])\s\d{3}\s\d{2}\b`),
339
+ p(EntityType.NATIONAL_ID, String.raw `\b(?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{5}\b`),
340
+ p(EntityType.IBAN, String.raw `\bLU\d{2}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\b`, "iban"),
341
+ p(EntityType.VAT, String.raw `\bLU\s?\d{8}\b`, "vat_lu"),
342
+ p(EntityType.PHONE, String.raw `\b(?:2[0-9]|[4-9]\d)[\s\-]?\d{2}[\s\-]?\d{2}[\s\-]?\d{2}\b`),
343
+ p(EntityType.PHONE, String.raw `\b(?:2[0-9]|[4-9]\d)\d{6}\b`),
344
+ p(EntityType.PHONE, String.raw `\b6[2-9]\d[\s\-]?\d{3}[\s\-]?\d{3}\b`),
345
+ p(EntityType.PHONE, String.raw `\+352\s?\d{2,3}[\s\-]?\d{2,3}[\s\-]?\d{2,4}`),
346
+ p(EntityType.POSTAL_CODE, String.raw `\bL[\-\s]?\d{4}\b`),
347
+ p(EntityType.LICENSE_PLATE, String.raw `\b[A-Z]{2}[\s\-]?\d{3,5}\b`, null, "", ["plaque", "immatriculation", "Kennzeichen", "nummerplaat", "véhicule", "voiture", "Fahrzeug", "immatriculé"], true),
348
+ p(EntityType.CHAMBER_OF_COMMERCE, String.raw `\b[ABCDEFGJ]\s?\d{4,6}\b`, null, "", ["RCS", "Registre de Commerce", "Handelsregister", "registre", "inscrit"], true),
349
+ ],
350
+ };
351
+ const PL = {
352
+ code: "PL",
353
+ name: "Poland",
354
+ patterns: [
355
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{11}\b`, "polish_pesel"),
356
+ p(EntityType.TAX_ID, String.raw `\b\d{3}-?\d{3}-?\d{2}-?\d{2}\b`, "polish_nip"),
357
+ p(EntityType.IBAN, String.raw `\bPL\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
358
+ p(EntityType.IBAN, String.raw `\bPL\d{26}\b`, "iban"),
359
+ p(EntityType.VAT, String.raw `\bPL\d{10}\b`),
360
+ p(EntityType.PHONE, String.raw `\b[5-8]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
361
+ p(EntityType.PHONE, String.raw `\b[5-8]\d{8}\b`),
362
+ p(EntityType.PHONE, String.raw `\+48\s?[5-8]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}`),
363
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{2}-\d{3}\b`, null, "", ["kod pocztowy", "adres", "ulica", "Postal:", "Address:"]),
364
+ ],
365
+ };
366
+ const IE = {
367
+ code: "IE",
368
+ name: "Ireland",
369
+ patterns: [
370
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{7}[A-W][ABWTXZ]?\b`, "irish_pps"),
371
+ p(EntityType.IBAN, String.raw `\bIE\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
372
+ p(EntityType.IBAN, String.raw `\bIE\d{2}[A-Z]{4}\d{14}\b`, "iban"),
373
+ p(EntityType.VAT, String.raw `\bIE\d{7}[A-Z]\b`),
374
+ p(EntityType.PHONE, String.raw `\b0[89]\d[\s\-]?\d{3}[\s\-]?\d{4}\b`),
375
+ p(EntityType.PHONE, String.raw `\b0[89]\d{8}\b`),
376
+ p(EntityType.PHONE, String.raw `\b0[1-9]\d{0,2}[\s\-]?\d{5,8}\b`),
377
+ p(EntityType.PHONE, String.raw `\+353\s?\d{1,3}[\s\-]?\d{3,4}[\s\-]?\d{3,4}`),
378
+ p(EntityType.POSTAL_CODE, String.raw `\b[A-Z]\d{2}\s?[A-Z0-9]{4}\b`, null, "", ["Eircode", "postcode", "postal code", "address", "Address:", "Postal:"], true),
379
+ ],
380
+ };
381
+ const UK = {
382
+ code: "UK",
383
+ name: "United Kingdom",
384
+ patterns: [
385
+ p(EntityType.NATIONAL_ID, String.raw `\b[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\s?\d{2}\s?\d{2}\s?\d{2}\s?[ABCD]\b`),
386
+ p(EntityType.HEALTH_INSURANCE, String.raw `\b\d{3}\s?\d{3}\s?\d{4}\b`, "uk_nhs", "", ["NHS", "NHS number", "health number", "NHS no"], true),
387
+ p(EntityType.IBAN, String.raw `\bGB\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
388
+ p(EntityType.IBAN, String.raw `\bGB\d{2}[A-Z]{4}\d{14}\b`, "iban"),
389
+ p(EntityType.VAT, String.raw `\bGB\d{9}\b`),
390
+ p(EntityType.PHONE, String.raw `\b07[4-9]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
391
+ p(EntityType.PHONE, String.raw `\b07[4-9]\d{8}\b`),
392
+ p(EntityType.PHONE, String.raw `\b0[12]\d{2}[\s\-]?\d{3}[\s\-]?\d{4}\b`),
393
+ p(EntityType.PHONE, String.raw `\b0[12]\d{2}[\s\-]?\d{4}[\s\-]?\d{4}\b`),
394
+ p(EntityType.PHONE, String.raw `\b0[12]\d{9,10}\b`),
395
+ p(EntityType.PHONE, String.raw `\+44\s?\d{2,4}[\s\-]?\d{3,4}[\s\-]?\d{3,4}`),
396
+ p(EntityType.POSTAL_CODE, String.raw `\b[A-Z]{1,2}\d[A-Z\d]?\s?\d[A-Z]{2}\b`),
397
+ ],
398
+ };
399
+ const BG = {
400
+ code: "BG",
401
+ name: "Bulgaria",
402
+ patterns: [
403
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{10}\b`, "bulgarian_egn"),
404
+ p(EntityType.IBAN, String.raw `\bBG\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{2}\b`, "iban"),
405
+ p(EntityType.VAT, String.raw `\bBG\d{9,10}\b`),
406
+ p(EntityType.PHONE, String.raw `\b0?[89][789][\s\-]?\d{3}[\s\-]?\d{3,4}\b`),
407
+ p(EntityType.PHONE, String.raw `\b0?[89][789]\d{7,8}\b`),
408
+ p(EntityType.PHONE, String.raw `\+359\s?[89][789][\s\-]?\d{3}[\s\-]?\d{3,4}`),
409
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["пощенски код", "пощенски", "адрес", "ул.", "Postal:", "Address:"], true),
410
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
411
+ ],
412
+ };
413
+ const CY = {
414
+ code: "CY",
415
+ name: "Cyprus",
416
+ patterns: [
417
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{8}[A-Z]\b`),
418
+ p(EntityType.IBAN, String.raw `\bCY\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
419
+ p(EntityType.IBAN, String.raw `\bCY\d{26}\b`, "iban"),
420
+ p(EntityType.VAT, String.raw `\bCY\d{8}[A-Z]\b`),
421
+ p(EntityType.PHONE, String.raw `\b[29]\d{3}[\s\-]?\d{4}\b`),
422
+ p(EntityType.PHONE, String.raw `\b[29]\d[\s\-]?\d{3}[\s\-]?\d{3}\b`),
423
+ p(EntityType.PHONE, String.raw `\b[29]\d{7}\b`),
424
+ p(EntityType.PHONE, String.raw `\+357\s?[29]\d[\s\-]?\d{3}[\s\-]?\d{3,4}`),
425
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["Τ.Κ.", "ταχυδρομικός", "address", "Address:", "Postal:", "διεύθυνση"], true),
426
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
427
+ ],
428
+ };
429
+ const CZ = {
430
+ code: "CZ",
431
+ name: "Czech Republic",
432
+ patterns: [
433
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}/?\d{3,4}\b`, "czech_birth_number"),
434
+ p(EntityType.IBAN, String.raw `\bCZ\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
435
+ p(EntityType.IBAN, String.raw `\bCZ\d{22}\b`, "iban"),
436
+ p(EntityType.VAT, String.raw `\bCZ\d{8,10}\b`),
437
+ p(EntityType.PHONE, String.raw `\b[67]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
438
+ p(EntityType.PHONE, String.raw `\b[67]\d{8}\b`),
439
+ p(EntityType.PHONE, String.raw `\+420\s?[67]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}`),
440
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{3}\s?\d{2}\b`, null, "", ["PSČ", "poštovní", "adresa", "ulice", "Postal:", "Address:"], true),
441
+ ],
442
+ };
443
+ const SK = {
444
+ code: "SK",
445
+ name: "Slovakia",
446
+ patterns: [
447
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}/?\d{3,4}\b`, "czech_birth_number"),
448
+ p(EntityType.IBAN, String.raw `\bSK\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
449
+ p(EntityType.IBAN, String.raw `\bSK\d{22}\b`, "iban"),
450
+ p(EntityType.VAT, String.raw `\bSK\d{10}\b`),
451
+ p(EntityType.PHONE, String.raw `\b0?9\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
452
+ p(EntityType.PHONE, String.raw `\+421\s?9\d{2}[\s\-]?\d{3}[\s\-]?\d{3}`),
453
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{3}\s?\d{2}\b`, null, "", ["PSČ", "poštové", "adresa", "ulica", "Postal:", "Address:"], true),
454
+ ],
455
+ };
456
+ const EE = {
457
+ code: "EE",
458
+ name: "Estonia",
459
+ patterns: [
460
+ p(EntityType.NATIONAL_ID, String.raw `\b[1-6]\d{10}\b`, "estonian_id"),
461
+ p(EntityType.IBAN, String.raw `\bEE\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
462
+ p(EntityType.IBAN, String.raw `\bEE\d{18}\b`, "iban"),
463
+ p(EntityType.VAT, String.raw `\bEE\d{9}\b`),
464
+ p(EntityType.PHONE, String.raw `\b5\d{3}[\s\-]?\d{4}\b`),
465
+ p(EntityType.PHONE, String.raw `\b5\d{7}\b`),
466
+ p(EntityType.PHONE, String.raw `\+372\s?5\d{3}[\s\-]?\d{3,4}`),
467
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{5}\b`, null, "", ["postiindeks", "sihtnumber", "aadress", "address", "Address:", "Postal:"], true),
468
+ ],
469
+ };
470
+ const LT = {
471
+ code: "LT",
472
+ name: "Lithuania",
473
+ patterns: [
474
+ p(EntityType.NATIONAL_ID, String.raw `\b[1-6]\d{10}\b`, "estonian_id"),
475
+ p(EntityType.IBAN, String.raw `\bLT\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
476
+ p(EntityType.IBAN, String.raw `\bLT\d{18}\b`, "iban"),
477
+ p(EntityType.VAT, String.raw `\bLT\d{9,12}\b`),
478
+ p(EntityType.PHONE, String.raw `\b6\d{2}[\s\-]?\d{2}[\s\-]?\d{3}\b`),
479
+ p(EntityType.PHONE, String.raw `\b6\d{7}\b`),
480
+ p(EntityType.PHONE, String.raw `\b8[\s\-]?6\d{2}[\s\-]?\d{2}[\s\-]?\d{3}\b`),
481
+ p(EntityType.PHONE, String.raw `\+370\s?6\d{2}[\s\-]?\d{2}[\s\-]?\d{3}`),
482
+ p(EntityType.POSTAL_CODE, String.raw `\bLT-\d{5}\b`),
483
+ ],
484
+ };
485
+ const LV = {
486
+ code: "LV",
487
+ name: "Latvia",
488
+ patterns: [
489
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{6}-\d{5}\b`),
490
+ p(EntityType.NATIONAL_ID, String.raw `\b(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|1[0-2])\d{7}\b`, null, "", ["personas kods", "PK", "identifikācijas"], true),
491
+ p(EntityType.IBAN, String.raw `\bLV\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d\b`, "iban"),
492
+ p(EntityType.IBAN, String.raw `\bLV\d{2}[A-Z]{4}\d{13}\b`, "iban"),
493
+ p(EntityType.VAT, String.raw `\bLV\d{11}\b`),
494
+ p(EntityType.PHONE, String.raw `\b[2]\d{3}[\s\-]?\d{4}\b`),
495
+ p(EntityType.PHONE, String.raw `\b[2]\d{7}\b`),
496
+ p(EntityType.PHONE, String.raw `\+371\s?[2]\d{3}[\s\-]?\d{3,4}`),
497
+ p(EntityType.POSTAL_CODE, String.raw `\bLV-\d{4}\b`),
498
+ ],
499
+ };
500
+ const HR = {
501
+ code: "HR",
502
+ name: "Croatia",
503
+ patterns: [
504
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{11}\b`, "croatian_oib"),
505
+ p(EntityType.IBAN, String.raw `\bHR\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
506
+ p(EntityType.IBAN, String.raw `\bHR\d{2}\s\d{4}\s\d{4}\s\d{4}\s\d{5}\b`, "iban"),
507
+ p(EntityType.IBAN, String.raw `\bHR\d{19}\b`, "iban"),
508
+ p(EntityType.VAT, String.raw `\bHR\d{11}\b`),
509
+ p(EntityType.PHONE, String.raw `\b0?9[12579][\s\-]?\d{3}[\s\-]?\d{3,4}\b`),
510
+ p(EntityType.PHONE, String.raw `\b0?9[12579]\d{7,8}\b`),
511
+ p(EntityType.PHONE, String.raw `\+385\s?9[12579][\s\-]?\d{3}[\s\-]?\d{3,4}`),
512
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-5]\d{4}\b`, null, "", ["poštanski broj", "poštanski", "adresa", "ulica", "Postal:", "Address:"], true),
513
+ ],
514
+ };
515
+ const HU = {
516
+ code: "HU",
517
+ name: "Hungary",
518
+ patterns: [
519
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{9}\b`, "hungarian_taj"),
520
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{3}\s\d{3}\s\d{3}\b`, "hungarian_taj"),
521
+ p(EntityType.TAX_ID, String.raw `\b8\d{9}\b`, null, "", ["adóazonosító", "adószám", "adóazonosító jel"], true),
522
+ p(EntityType.VAT, String.raw `\bHU\d{8,11}\b`, null, "", ["adószám", "ÁFA"]),
523
+ p(EntityType.IBAN, String.raw `\bHU\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\b`, "iban"),
524
+ p(EntityType.IBAN, String.raw `\bHU\d{26}\b`, "iban"),
525
+ p(EntityType.PHONE, String.raw `\b06\s?\d{1,2}[\s\-]?\d{3}[\s\-]?\d{3,4}\b`),
526
+ p(EntityType.PHONE, String.raw `\+36\s?\d{1,2}[\s\-]?\d{3}[\s\-]?\d{3,4}`),
527
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["irányítószám", "postai", "cím", "utca", "Postal:", "Address:"], true),
528
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
529
+ ],
530
+ };
531
+ const RO = {
532
+ code: "RO",
533
+ name: "Romania",
534
+ patterns: [
535
+ p(EntityType.NATIONAL_ID, String.raw `\b[1-8]\d{12}\b`, "romanian_cnp"),
536
+ p(EntityType.IBAN, String.raw `\bRO\d{2}[A-Z]{4}\d{16}\b`, "iban"),
537
+ p(EntityType.VAT, String.raw `\bRO\d{2,10}\b`),
538
+ p(EntityType.PHONE, String.raw `\b0?7[2-9]\d{1}[\s\-]?\d{3}[\s\-]?\d{3,4}\b`),
539
+ p(EntityType.PHONE, String.raw `\b0?7[2-9]\d{7,8}\b`),
540
+ p(EntityType.PHONE, String.raw `\+40\s?7[2-9]\d{1}[\s\-]?\d{3}[\s\-]?\d{3,4}`),
541
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{6}\b`, null, "", ["cod poștal", "cod postal", "adresă", "strada", "Postal:", "Address:"], true),
542
+ ],
543
+ };
544
+ const EL = {
545
+ code: "EL",
546
+ name: "Greece",
547
+ patterns: [
548
+ p(EntityType.TAX_ID, String.raw `\b\d{9}\b`, "greek_afm"),
549
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{11}\b`, "greek_amka"),
550
+ p(EntityType.IBAN, String.raw `\bGR\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
551
+ p(EntityType.IBAN, String.raw `\bGR\d{25}\b`, "iban"),
552
+ p(EntityType.VAT, String.raw `\bEL\d{9}\b`),
553
+ p(EntityType.PHONE, String.raw `\b69\d[\s\-]?\d{3,4}[\s\-]?\d{4}\b`),
554
+ p(EntityType.PHONE, String.raw `\b69\d{8}\b`),
555
+ p(EntityType.PHONE, String.raw `\b2\d{1,3}[\s\-]?\d{3,4}[\s\-]?\d{3,4}\b`),
556
+ p(EntityType.PHONE, String.raw `\+30\s?\d{2,4}[\s\-]?\d{3,4}[\s\-]?\d{3,4}`),
557
+ p(EntityType.POSTAL_CODE, String.raw `\b\d{3}\s?\d{2}\b`, null, "", ["Τ.Κ.", "ταχυδρομικός", "address", "Address:", "Postal:", "διεύθυνση", "οδός"], true),
558
+ ],
559
+ };
560
+ const SI = {
561
+ code: "SI",
562
+ name: "Slovenia",
563
+ patterns: [
564
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{13}\b`, "slovenian_emso"),
565
+ p(EntityType.IBAN, String.raw `\bSI\d{2}\s?\d{4}\s?\d{4}\s?\d{4}\s?\d{3}\b`, "iban"),
566
+ p(EntityType.IBAN, String.raw `\bSI\d{17}\b`, "iban"),
567
+ p(EntityType.VAT, String.raw `\bSI\d{8}\b`),
568
+ p(EntityType.PHONE, String.raw `\b0?[34567]\d{1}[\s\-]?\d{3}[\s\-]?\d{3}\b`),
569
+ p(EntityType.PHONE, String.raw `\b0?[34567]\d{7}\b`),
570
+ p(EntityType.PHONE, String.raw `\+386\s?[34567]\d{1}[\s\-]?\d{3}[\s\-]?\d{3}`),
571
+ p(EntityType.POSTAL_CODE, String.raw `\b[1-9]\d{3}\b`, null, "", ["poštna številka", "poštna", "naslov", "ulica", "Postal:", "Address:"], true),
572
+ p(EntityType.POSTAL_CODE, String.raw `(?<=, )[1-9]\d{3}(?= [A-Z])`),
573
+ ],
574
+ };
575
+ const MT = {
576
+ code: "MT",
577
+ name: "Malta",
578
+ patterns: [
579
+ p(EntityType.NATIONAL_ID, String.raw `\b\d{5,7}[MGAPLHBZ]\b`),
580
+ p(EntityType.IBAN, String.raw `\bMT\d{2}\s?[A-Z]{4}\s?\d{4}\s?\d{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{4}\s?[A-Z0-9]{3}\b`, "iban"),
581
+ p(EntityType.IBAN, String.raw `\bMT\d{2}[A-Z]{4}\d{5}[A-Z0-9]{18}\b`, "iban"),
582
+ p(EntityType.VAT, String.raw `\bMT\d{8}\b`),
583
+ p(EntityType.PHONE, String.raw `\b[79]\d{3}[\s\-]?\d{4}\b`),
584
+ p(EntityType.PHONE, String.raw `\b[79]\d{7}\b`),
585
+ p(EntityType.PHONE, String.raw `\+356\s?[79]\d{3}[\s\-]?\d{3,4}`),
586
+ p(EntityType.POSTAL_CODE, String.raw `\b[A-Z]{3}\s?\d{4}\b`, null, "", ["kodiċi postali", "postcode", "address", "Address:", "Postal:"], true),
587
+ ],
588
+ };
589
+ // ---------------------------------------------------------------------------
590
+ // Export all configs as a single Record
591
+ // ---------------------------------------------------------------------------
592
+ export const COUNTRY_CONFIGS = {
593
+ SHARED,
594
+ NL,
595
+ BE,
596
+ DE,
597
+ AT,
598
+ CH,
599
+ FR,
600
+ DK,
601
+ SE,
602
+ NO,
603
+ FI,
604
+ IS,
605
+ IT,
606
+ ES,
607
+ PT,
608
+ LU,
609
+ PL,
610
+ IE,
611
+ UK,
612
+ BG,
613
+ CY,
614
+ CZ,
615
+ SK,
616
+ EE,
617
+ LT,
618
+ LV,
619
+ HR,
620
+ HU,
621
+ RO,
622
+ EL,
623
+ SI,
624
+ MT,
625
+ };
@@ -0,0 +1,15 @@
1
+ import { type Detection } from "../types.js";
2
+ export declare class RuleEngine {
3
+ private matcher;
4
+ private loadedCountries;
5
+ addCustomPattern(name: string, pattern: string): void;
6
+ loadCountries(countryCodes: string[] | null): void;
7
+ detect(text: string, countryCodes: string[] | null): Detection[];
8
+ /**
9
+ * Remove overlapping detections with priority-aware resolution.
10
+ * Priority: validated (3) > custom (2) > regex-only (1).
11
+ * Within the same tier, longer span wins.
12
+ */
13
+ private deduplicate;
14
+ getLoadedCountries(): Set<string>;
15
+ }