rehydra 0.1.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.
- package/LICENSE +22 -0
- package/README.md +615 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/pii-map-crypto.d.ts +114 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +228 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +180 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +384 -0
- package/dist/index.js.map +1 -0
- package/dist/ner/bio-decoder.d.ts +64 -0
- package/dist/ner/bio-decoder.d.ts.map +1 -0
- package/dist/ner/bio-decoder.js +216 -0
- package/dist/ner/bio-decoder.js.map +1 -0
- package/dist/ner/index.d.ts +10 -0
- package/dist/ner/index.d.ts.map +1 -0
- package/dist/ner/index.js +10 -0
- package/dist/ner/index.js.map +1 -0
- package/dist/ner/model-manager.d.ts +111 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +325 -0
- package/dist/ner/model-manager.js.map +1 -0
- package/dist/ner/ner-model.d.ts +114 -0
- package/dist/ner/ner-model.d.ts.map +1 -0
- package/dist/ner/ner-model.js +253 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +46 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +130 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +118 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +332 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/pipeline/index.d.ts +12 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/prenormalize.d.ts +48 -0
- package/dist/pipeline/prenormalize.d.ts.map +1 -0
- package/dist/pipeline/prenormalize.js +94 -0
- package/dist/pipeline/prenormalize.js.map +1 -0
- package/dist/pipeline/resolver.d.ts +56 -0
- package/dist/pipeline/resolver.d.ts.map +1 -0
- package/dist/pipeline/resolver.js +239 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/semantic-data-loader.d.ts +165 -0
- package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
- package/dist/pipeline/semantic-data-loader.js +655 -0
- package/dist/pipeline/semantic-data-loader.js.map +1 -0
- package/dist/pipeline/semantic-enricher.d.ts +112 -0
- package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
- package/dist/pipeline/semantic-enricher.js +318 -0
- package/dist/pipeline/semantic-enricher.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +114 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +374 -0
- package/dist/pipeline/tagger.js.map +1 -0
- package/dist/pipeline/title-extractor.d.ts +79 -0
- package/dist/pipeline/title-extractor.d.ts.map +1 -0
- package/dist/pipeline/title-extractor.js +801 -0
- package/dist/pipeline/title-extractor.js.map +1 -0
- package/dist/pipeline/validator.d.ts +65 -0
- package/dist/pipeline/validator.d.ts.map +1 -0
- package/dist/pipeline/validator.js +264 -0
- package/dist/pipeline/validator.js.map +1 -0
- package/dist/recognizers/base.d.ts +78 -0
- package/dist/recognizers/base.d.ts.map +1 -0
- package/dist/recognizers/base.js +100 -0
- package/dist/recognizers/base.js.map +1 -0
- package/dist/recognizers/bic-swift.d.ts +10 -0
- package/dist/recognizers/bic-swift.d.ts.map +1 -0
- package/dist/recognizers/bic-swift.js +107 -0
- package/dist/recognizers/bic-swift.js.map +1 -0
- package/dist/recognizers/credit-card.d.ts +32 -0
- package/dist/recognizers/credit-card.d.ts.map +1 -0
- package/dist/recognizers/credit-card.js +160 -0
- package/dist/recognizers/credit-card.js.map +1 -0
- package/dist/recognizers/custom-id.d.ts +28 -0
- package/dist/recognizers/custom-id.d.ts.map +1 -0
- package/dist/recognizers/custom-id.js +116 -0
- package/dist/recognizers/custom-id.js.map +1 -0
- package/dist/recognizers/email.d.ts +10 -0
- package/dist/recognizers/email.d.ts.map +1 -0
- package/dist/recognizers/email.js +75 -0
- package/dist/recognizers/email.js.map +1 -0
- package/dist/recognizers/iban.d.ts +14 -0
- package/dist/recognizers/iban.d.ts.map +1 -0
- package/dist/recognizers/iban.js +67 -0
- package/dist/recognizers/iban.js.map +1 -0
- package/dist/recognizers/index.d.ts +20 -0
- package/dist/recognizers/index.d.ts.map +1 -0
- package/dist/recognizers/index.js +42 -0
- package/dist/recognizers/index.js.map +1 -0
- package/dist/recognizers/ip-address.d.ts +14 -0
- package/dist/recognizers/ip-address.d.ts.map +1 -0
- package/dist/recognizers/ip-address.js +183 -0
- package/dist/recognizers/ip-address.js.map +1 -0
- package/dist/recognizers/phone.d.ts +10 -0
- package/dist/recognizers/phone.d.ts.map +1 -0
- package/dist/recognizers/phone.js +145 -0
- package/dist/recognizers/phone.js.map +1 -0
- package/dist/recognizers/registry.d.ts +59 -0
- package/dist/recognizers/registry.d.ts.map +1 -0
- package/dist/recognizers/registry.js +113 -0
- package/dist/recognizers/registry.js.map +1 -0
- package/dist/recognizers/url.d.ts +14 -0
- package/dist/recognizers/url.d.ts.map +1 -0
- package/dist/recognizers/url.js +121 -0
- package/dist/recognizers/url.js.map +1 -0
- package/dist/types/index.d.ts +197 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +80 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pii-types.d.ts +50 -0
- package/dist/types/pii-types.d.ts.map +1 -0
- package/dist/types/pii-types.js +114 -0
- package/dist/types/pii-types.js.map +1 -0
- package/dist/utils/iban-checksum.d.ts +23 -0
- package/dist/utils/iban-checksum.d.ts.map +1 -0
- package/dist/utils/iban-checksum.js +106 -0
- package/dist/utils/iban-checksum.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/luhn.d.ts +17 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +55 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/offsets.d.ts +86 -0
- package/dist/utils/offsets.d.ts.map +1 -0
- package/dist/utils/offsets.js +124 -0
- package/dist/utils/offsets.js.map +1 -0
- package/dist/utils/path.d.ts +34 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +96 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/storage-browser.d.ts +51 -0
- package/dist/utils/storage-browser.d.ts.map +1 -0
- package/dist/utils/storage-browser.js +381 -0
- package/dist/utils/storage-browser.js.map +1 -0
- package/dist/utils/storage-node.d.ts +43 -0
- package/dist/utils/storage-node.d.ts.map +1 -0
- package/dist/utils/storage-node.js +93 -0
- package/dist/utils/storage-node.js.map +1 -0
- package/dist/utils/storage.d.ts +70 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +69 -0
- package/dist/utils/storage.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BIC/SWIFT Code Recognizer
|
|
3
|
+
* Bank Identifier Code (ISO 9362)
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* BIC/SWIFT code pattern
|
|
8
|
+
* Format: AAAA BB CC DDD (8 or 11 characters)
|
|
9
|
+
* - AAAA: Bank code (4 letters)
|
|
10
|
+
* - BB: Country code (2 letters, ISO 3166-1)
|
|
11
|
+
* - CC: Location code (2 alphanumeric)
|
|
12
|
+
* - DDD: Branch code (3 alphanumeric, optional)
|
|
13
|
+
*/
|
|
14
|
+
const BIC_PATTERN = /\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\b/g;
|
|
15
|
+
/**
|
|
16
|
+
* Valid ISO 3166-1 alpha-2 country codes (common subset)
|
|
17
|
+
*/
|
|
18
|
+
const VALID_COUNTRY_CODES = new Set([
|
|
19
|
+
'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AR', 'AS', 'AT', 'AU', 'AW', 'AZ',
|
|
20
|
+
'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BM', 'BN', 'BO', 'BR', 'BS', 'BT', 'BW', 'BY', 'BZ',
|
|
21
|
+
'CA', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CY', 'CZ',
|
|
22
|
+
'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ',
|
|
23
|
+
'EC', 'EE', 'EG', 'ER', 'ES', 'ET',
|
|
24
|
+
'FI', 'FJ', 'FK', 'FM', 'FO', 'FR',
|
|
25
|
+
'GA', 'GB', 'GD', 'GE', 'GF', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GT', 'GU', 'GW', 'GY',
|
|
26
|
+
'HK', 'HN', 'HR', 'HT', 'HU',
|
|
27
|
+
'ID', 'IE', 'IL', 'IN', 'IQ', 'IR', 'IS', 'IT',
|
|
28
|
+
'JM', 'JO', 'JP',
|
|
29
|
+
'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ',
|
|
30
|
+
'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY',
|
|
31
|
+
'MA', 'MC', 'MD', 'ME', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ',
|
|
32
|
+
'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ',
|
|
33
|
+
'OM',
|
|
34
|
+
'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY',
|
|
35
|
+
'QA',
|
|
36
|
+
'RE', 'RO', 'RS', 'RU', 'RW',
|
|
37
|
+
'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SY', 'SZ',
|
|
38
|
+
'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ',
|
|
39
|
+
'UA', 'UG', 'US', 'UY', 'UZ',
|
|
40
|
+
'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU',
|
|
41
|
+
'WF', 'WS',
|
|
42
|
+
'YE', 'YT',
|
|
43
|
+
'ZA', 'ZM', 'ZW',
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* BIC/SWIFT code recognizer
|
|
47
|
+
*/
|
|
48
|
+
export const bicSwiftRecognizer = {
|
|
49
|
+
type: PIIType.BIC_SWIFT,
|
|
50
|
+
name: 'BIC/SWIFT Code',
|
|
51
|
+
defaultConfidence: 0.95,
|
|
52
|
+
find(text) {
|
|
53
|
+
const matches = [];
|
|
54
|
+
const pattern = new RegExp(BIC_PATTERN.source, 'g');
|
|
55
|
+
for (const match of text.matchAll(pattern)) {
|
|
56
|
+
if (match.index === undefined)
|
|
57
|
+
continue;
|
|
58
|
+
const bic = match[0];
|
|
59
|
+
// Validate the BIC code
|
|
60
|
+
if (!this.validate(bic))
|
|
61
|
+
continue;
|
|
62
|
+
matches.push({
|
|
63
|
+
type: PIIType.BIC_SWIFT,
|
|
64
|
+
start: match.index,
|
|
65
|
+
end: match.index + bic.length,
|
|
66
|
+
confidence: this.defaultConfidence,
|
|
67
|
+
source: DetectionSource.REGEX,
|
|
68
|
+
text: bic,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return matches;
|
|
72
|
+
},
|
|
73
|
+
validate(bic) {
|
|
74
|
+
const normalized = bic.toUpperCase();
|
|
75
|
+
// Check length (8 or 11 characters)
|
|
76
|
+
if (normalized.length !== 8 && normalized.length !== 11) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Extract and validate country code (characters 5-6)
|
|
80
|
+
const countryCode = normalized.slice(4, 6);
|
|
81
|
+
if (!VALID_COUNTRY_CODES.has(countryCode)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Bank code should be letters only
|
|
85
|
+
const bankCode = normalized.slice(0, 4);
|
|
86
|
+
if (!/^[A-Z]{4}$/.test(bankCode)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Location code should be alphanumeric
|
|
90
|
+
const locationCode = normalized.slice(6, 8);
|
|
91
|
+
if (!/^[A-Z0-9]{2}$/.test(locationCode)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Branch code (if present) should be alphanumeric
|
|
95
|
+
if (normalized.length === 11) {
|
|
96
|
+
const branchCode = normalized.slice(8, 11);
|
|
97
|
+
if (!/^[A-Z0-9]{3}$/.test(branchCode)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
},
|
|
103
|
+
normalize(bic) {
|
|
104
|
+
return bic.toUpperCase().trim();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=bic-swift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bic-swift.js","sourceRoot":"","sources":["../../src/recognizers/bic-swift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit Card Number Recognizer
|
|
3
|
+
* Detects major card types with Luhn checksum validation
|
|
4
|
+
*/
|
|
5
|
+
import type { Recognizer } from './base.js';
|
|
6
|
+
/**
|
|
7
|
+
* Credit card patterns for major card types
|
|
8
|
+
* All patterns allow optional separators (spaces, dashes)
|
|
9
|
+
*/
|
|
10
|
+
declare const CARD_PATTERNS: {
|
|
11
|
+
visa: RegExp;
|
|
12
|
+
mastercard: RegExp;
|
|
13
|
+
amex: RegExp;
|
|
14
|
+
discover: RegExp;
|
|
15
|
+
diners: RegExp;
|
|
16
|
+
jcb: RegExp;
|
|
17
|
+
generic: RegExp;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Card type names for identification
|
|
21
|
+
*/
|
|
22
|
+
type CardType = keyof typeof CARD_PATTERNS;
|
|
23
|
+
/**
|
|
24
|
+
* Credit card recognizer with Luhn validation
|
|
25
|
+
*/
|
|
26
|
+
export declare const creditCardRecognizer: Recognizer;
|
|
27
|
+
/**
|
|
28
|
+
* Identifies the card type from a card number
|
|
29
|
+
*/
|
|
30
|
+
export declare function identifyCardType(cardNumber: string): CardType | 'unknown';
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=credit-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-card.d.ts","sourceRoot":"","sources":["../../src/recognizers/credit-card.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C;;;GAGG;AACH,QAAA,MAAM,aAAa;;;;;;;;CAuBlB,CAAC;AAEF;;GAEG;AACH,KAAK,QAAQ,GAAG,MAAM,OAAO,aAAa,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAuElC,CAAC;AA6DF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAWzE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit Card Number Recognizer
|
|
3
|
+
* Detects major card types with Luhn checksum validation
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
6
|
+
import { validateLuhn } from '../utils/luhn.js';
|
|
7
|
+
/**
|
|
8
|
+
* Credit card patterns for major card types
|
|
9
|
+
* All patterns allow optional separators (spaces, dashes)
|
|
10
|
+
*/
|
|
11
|
+
const CARD_PATTERNS = {
|
|
12
|
+
// Visa: 13 or 16 digits, starts with 4
|
|
13
|
+
visa: /\b4[0-9]{3}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{1,4}\b/g,
|
|
14
|
+
// Mastercard: 16 digits, starts with 51-55 or 2221-2720
|
|
15
|
+
mastercard: /\b(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}\b/g,
|
|
16
|
+
// American Express: 15 digits, starts with 34 or 37
|
|
17
|
+
amex: /\b3[47][0-9]{2}[\s-]?[0-9]{6}[\s-]?[0-9]{5}\b/g,
|
|
18
|
+
// Discover: 16 digits, starts with 6011, 644-649, 65
|
|
19
|
+
discover: /\b(?:6011|64[4-9][0-9]|65[0-9]{2})[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}\b/g,
|
|
20
|
+
// Diners Club: 14 digits, starts with 36, 38, or 300-305
|
|
21
|
+
diners: /\b(?:36[0-9]{2}|38[0-9]{2}|30[0-5][0-9])[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{2}\b/g,
|
|
22
|
+
// JCB: 16 digits, starts with 3528-3589
|
|
23
|
+
jcb: /\b35(?:2[89]|[3-8][0-9])[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}\b/g,
|
|
24
|
+
// Generic 16-digit pattern (fallback)
|
|
25
|
+
generic: /\b[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}\b/g,
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Credit card recognizer with Luhn validation
|
|
29
|
+
*/
|
|
30
|
+
export const creditCardRecognizer = {
|
|
31
|
+
type: PIIType.CREDIT_CARD,
|
|
32
|
+
name: 'Credit Card Number',
|
|
33
|
+
defaultConfidence: 0.98,
|
|
34
|
+
find(text) {
|
|
35
|
+
const matches = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
// Try each card type pattern
|
|
38
|
+
for (const [cardType, pattern] of Object.entries(CARD_PATTERNS)) {
|
|
39
|
+
const globalPattern = new RegExp(pattern.source, 'g');
|
|
40
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
41
|
+
if (match.index === undefined)
|
|
42
|
+
continue;
|
|
43
|
+
const cardNumber = match[0];
|
|
44
|
+
const key = `${match.index}:${match.index + cardNumber.length}`;
|
|
45
|
+
if (seen.has(key))
|
|
46
|
+
continue;
|
|
47
|
+
// Validate with Luhn checksum
|
|
48
|
+
if (!this.validate(cardNumber))
|
|
49
|
+
continue;
|
|
50
|
+
// Skip generic matches that look like other number sequences
|
|
51
|
+
if (cardType === 'generic' && !looksLikeCreditCard(cardNumber)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
seen.add(key);
|
|
55
|
+
matches.push({
|
|
56
|
+
type: PIIType.CREDIT_CARD,
|
|
57
|
+
start: match.index,
|
|
58
|
+
end: match.index + cardNumber.length,
|
|
59
|
+
confidence: this.defaultConfidence,
|
|
60
|
+
source: DetectionSource.REGEX,
|
|
61
|
+
text: cardNumber,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Remove overlapping matches
|
|
66
|
+
return deduplicateOverlapping(matches);
|
|
67
|
+
},
|
|
68
|
+
validate(cardNumber) {
|
|
69
|
+
// Extract digits only
|
|
70
|
+
const digits = cardNumber.replace(/\D/g, '');
|
|
71
|
+
// Check length (13-19 digits)
|
|
72
|
+
if (digits.length < 13 || digits.length > 19) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
// Validate Luhn checksum
|
|
76
|
+
if (!validateLuhn(digits)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Should not be all same digit
|
|
80
|
+
if (/^(\d)\1+$/.test(digits)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
},
|
|
85
|
+
normalize(cardNumber) {
|
|
86
|
+
// Remove separators, return digits only
|
|
87
|
+
return cardNumber.replace(/\D/g, '');
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Additional heuristics for generic 16-digit sequences
|
|
92
|
+
*/
|
|
93
|
+
function looksLikeCreditCard(number) {
|
|
94
|
+
const digits = number.replace(/\D/g, '');
|
|
95
|
+
// Check if it starts with a known card prefix
|
|
96
|
+
const knownPrefixes = [
|
|
97
|
+
'4', // Visa
|
|
98
|
+
'5', // Mastercard
|
|
99
|
+
'34',
|
|
100
|
+
'37', // Amex
|
|
101
|
+
'6011',
|
|
102
|
+
'65', // Discover
|
|
103
|
+
'36',
|
|
104
|
+
'38', // Diners
|
|
105
|
+
'35', // JCB
|
|
106
|
+
];
|
|
107
|
+
for (const prefix of knownPrefixes) {
|
|
108
|
+
if (digits.startsWith(prefix)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// If it has separators in a card-like format, probably a card
|
|
113
|
+
if (/\d{4}[\s-]\d{4}[\s-]\d{4}[\s-]\d{4}/.test(number)) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Remove overlapping matches
|
|
120
|
+
*/
|
|
121
|
+
function deduplicateOverlapping(matches) {
|
|
122
|
+
if (matches.length <= 1)
|
|
123
|
+
return matches;
|
|
124
|
+
const sorted = [...matches].sort((a, b) => a.start - b.start);
|
|
125
|
+
const result = [];
|
|
126
|
+
for (const match of sorted) {
|
|
127
|
+
const last = result[result.length - 1];
|
|
128
|
+
if (last !== undefined && match.start < last.end) {
|
|
129
|
+
// Keep the one with higher confidence or longer match
|
|
130
|
+
if (match.confidence > last.confidence || match.end - match.start > last.end - last.start) {
|
|
131
|
+
result.pop();
|
|
132
|
+
result.push(match);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
result.push(match);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Identifies the card type from a card number
|
|
143
|
+
*/
|
|
144
|
+
export function identifyCardType(cardNumber) {
|
|
145
|
+
const digits = cardNumber.replace(/\D/g, '');
|
|
146
|
+
if (/^4/.test(digits))
|
|
147
|
+
return 'visa';
|
|
148
|
+
if (/^5[1-5]/.test(digits) || /^2(?:2[2-9][1-9]|2[3-9]|[3-6]|7[01]|720)/.test(digits))
|
|
149
|
+
return 'mastercard';
|
|
150
|
+
if (/^3[47]/.test(digits))
|
|
151
|
+
return 'amex';
|
|
152
|
+
if (/^6(?:011|4[4-9]|5)/.test(digits))
|
|
153
|
+
return 'discover';
|
|
154
|
+
if (/^3(?:6|8|0[0-5])/.test(digits))
|
|
155
|
+
return 'diners';
|
|
156
|
+
if (/^35(?:2[89]|[3-8])/.test(digits))
|
|
157
|
+
return 'jcb';
|
|
158
|
+
return 'unknown';
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=credit-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-card.js","sourceRoot":"","sources":["../../src/recognizers/credit-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom ID Recognizer
|
|
3
|
+
* Configurable recognizer for domain-specific identifiers
|
|
4
|
+
* (Case IDs, Customer IDs, File References, etc.)
|
|
5
|
+
*/
|
|
6
|
+
import { CustomIdPattern } from '../types/index.js';
|
|
7
|
+
import type { Recognizer } from './base.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a custom ID recognizer from patterns defined in policy
|
|
10
|
+
*/
|
|
11
|
+
export declare function createCustomIdRecognizer(patterns: CustomIdPattern[]): Recognizer;
|
|
12
|
+
/**
|
|
13
|
+
* Common patterns for banking/government IDs that can be used as templates
|
|
14
|
+
*/
|
|
15
|
+
export declare const COMMON_ID_PATTERNS: Record<string, RegExp>;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a standard case ID recognizer
|
|
18
|
+
*/
|
|
19
|
+
export declare function createCaseIdRecognizer(): Recognizer;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a standard customer ID recognizer
|
|
22
|
+
*/
|
|
23
|
+
export declare function createCustomerIdRecognizer(): Recognizer;
|
|
24
|
+
/**
|
|
25
|
+
* Validates that a string looks like a structured ID (not just random text)
|
|
26
|
+
*/
|
|
27
|
+
export declare function isStructuredId(text: string): boolean;
|
|
28
|
+
//# sourceMappingURL=custom-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-id.d.ts","sourceRoot":"","sources":["../../src/recognizers/custom-id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAuC,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,UAAU,CA8ChF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsBrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CAanD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,UAAU,CAQvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcpD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom ID Recognizer
|
|
3
|
+
* Configurable recognizer for domain-specific identifiers
|
|
4
|
+
* (Case IDs, Customer IDs, File References, etc.)
|
|
5
|
+
*/
|
|
6
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Creates a custom ID recognizer from patterns defined in policy
|
|
9
|
+
*/
|
|
10
|
+
export function createCustomIdRecognizer(patterns) {
|
|
11
|
+
return {
|
|
12
|
+
type: PIIType.CASE_ID, // Default type, will be overridden per pattern
|
|
13
|
+
name: 'Custom ID',
|
|
14
|
+
defaultConfidence: 0.9,
|
|
15
|
+
find(text) {
|
|
16
|
+
const matches = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
for (const patternConfig of patterns) {
|
|
19
|
+
const { pattern, type, validate } = patternConfig;
|
|
20
|
+
// Ensure pattern has global flag
|
|
21
|
+
const globalPattern = pattern.global
|
|
22
|
+
? pattern
|
|
23
|
+
: new RegExp(pattern.source, pattern.flags + 'g');
|
|
24
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
25
|
+
if (match.index === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
const idText = match[0];
|
|
28
|
+
const key = `${match.index}:${match.index + idText.length}`;
|
|
29
|
+
if (seen.has(key))
|
|
30
|
+
continue;
|
|
31
|
+
// Run custom validation if provided
|
|
32
|
+
if (validate !== undefined && !validate(idText)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
seen.add(key);
|
|
36
|
+
matches.push({
|
|
37
|
+
type,
|
|
38
|
+
start: match.index,
|
|
39
|
+
end: match.index + idText.length,
|
|
40
|
+
confidence: 0.9,
|
|
41
|
+
source: DetectionSource.REGEX,
|
|
42
|
+
text: idText,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return matches;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Common patterns for banking/government IDs that can be used as templates
|
|
52
|
+
*/
|
|
53
|
+
export const COMMON_ID_PATTERNS = {
|
|
54
|
+
// German case/file reference patterns
|
|
55
|
+
germanCaseId: /\b[A-Z]{2,3}[\s-]?[0-9]{4,10}[\s-]?[A-Z0-9]{0,4}\b/g,
|
|
56
|
+
// Generic case number (e.g., CASE-12345)
|
|
57
|
+
genericCaseNumber: /\b(?:CASE|FILE|REF|TICKET)[\s-]?[A-Z0-9]{4,12}\b/gi,
|
|
58
|
+
// Customer number patterns
|
|
59
|
+
customerNumber: /\b(?:CUST|CUSTOMER|KD|KUNDEN)[\s-]?(?:NR|NO|NUM|NUMBER)?[\s-]?[0-9]{4,12}\b/gi,
|
|
60
|
+
// Account reference (non-IBAN)
|
|
61
|
+
accountReference: /\b(?:ACC|ACCT|KONTO)[\s-]?[0-9]{6,12}\b/gi,
|
|
62
|
+
// Invoice/Order numbers
|
|
63
|
+
invoiceNumber: /\b(?:INV|INVOICE|RG|RECHNUNG)[\s-]?[A-Z0-9]{4,12}\b/gi,
|
|
64
|
+
orderNumber: /\b(?:ORD|ORDER|BESTELLUNG)[\s-]?[A-Z0-9]{4,12}\b/gi,
|
|
65
|
+
// Policy/Contract numbers
|
|
66
|
+
policyNumber: /\b(?:POL|POLICY|VERTRAG)[\s-]?[A-Z0-9]{6,15}\b/gi,
|
|
67
|
+
// Social Security / Tax ID patterns (generic)
|
|
68
|
+
taxIdGeneric: /\b[0-9]{2,3}[\s/-]?[0-9]{2,4}[\s/-]?[0-9]{2,4}[\s/-]?[0-9]{1,4}\b/g,
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Creates a standard case ID recognizer
|
|
72
|
+
*/
|
|
73
|
+
export function createCaseIdRecognizer() {
|
|
74
|
+
return createCustomIdRecognizer([
|
|
75
|
+
{
|
|
76
|
+
name: 'German Case ID',
|
|
77
|
+
pattern: COMMON_ID_PATTERNS['germanCaseId'],
|
|
78
|
+
type: PIIType.CASE_ID,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'Generic Case Number',
|
|
82
|
+
pattern: COMMON_ID_PATTERNS['genericCaseNumber'],
|
|
83
|
+
type: PIIType.CASE_ID,
|
|
84
|
+
},
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Creates a standard customer ID recognizer
|
|
89
|
+
*/
|
|
90
|
+
export function createCustomerIdRecognizer() {
|
|
91
|
+
return createCustomIdRecognizer([
|
|
92
|
+
{
|
|
93
|
+
name: 'Customer Number',
|
|
94
|
+
pattern: COMMON_ID_PATTERNS['customerNumber'],
|
|
95
|
+
type: PIIType.CUSTOMER_ID,
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validates that a string looks like a structured ID (not just random text)
|
|
101
|
+
*/
|
|
102
|
+
export function isStructuredId(text) {
|
|
103
|
+
// Should have at least some digits
|
|
104
|
+
const digitCount = (text.match(/\d/g) ?? []).length;
|
|
105
|
+
if (digitCount < 3)
|
|
106
|
+
return false;
|
|
107
|
+
// Should not be all letters or all digits
|
|
108
|
+
const letterCount = (text.match(/[a-zA-Z]/g) ?? []).length;
|
|
109
|
+
const totalAlphanumeric = digitCount + letterCount;
|
|
110
|
+
// Most of the characters should be alphanumeric
|
|
111
|
+
const cleanText = text.replace(/[\s\-_]/g, '');
|
|
112
|
+
if (totalAlphanumeric / cleanText.length < 0.9)
|
|
113
|
+
return false;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=custom-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-id.js","sourceRoot":"","sources":["../../src/recognizers/custom-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/recognizers/email.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAW5C;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,UA6D7B,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Address Recognizer
|
|
3
|
+
* RFC-like pattern with boundary awareness
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Email regex pattern
|
|
8
|
+
* - Local part: alphanumeric, dots, underscores, hyphens, plus signs
|
|
9
|
+
* - Domain: alphanumeric with dots and hyphens
|
|
10
|
+
* - TLD: 2-10 characters
|
|
11
|
+
* - Word boundaries to avoid matching code/variables
|
|
12
|
+
*/
|
|
13
|
+
const EMAIL_PATTERN = /\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.[a-zA-Z]{2,10}\b/g;
|
|
14
|
+
/**
|
|
15
|
+
* Email address recognizer
|
|
16
|
+
*/
|
|
17
|
+
export const emailRecognizer = {
|
|
18
|
+
type: PIIType.EMAIL,
|
|
19
|
+
name: 'Email Address',
|
|
20
|
+
defaultConfidence: 0.98,
|
|
21
|
+
find(text) {
|
|
22
|
+
const matches = [];
|
|
23
|
+
const pattern = new RegExp(EMAIL_PATTERN.source, 'g');
|
|
24
|
+
for (const match of text.matchAll(pattern)) {
|
|
25
|
+
if (match.index === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
const email = match[0];
|
|
28
|
+
// Skip if it looks like code (contains multiple @ or unusual patterns)
|
|
29
|
+
if (!this.validate(email)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
matches.push({
|
|
33
|
+
type: PIIType.EMAIL,
|
|
34
|
+
start: match.index,
|
|
35
|
+
end: match.index + email.length,
|
|
36
|
+
confidence: this.defaultConfidence,
|
|
37
|
+
source: DetectionSource.REGEX,
|
|
38
|
+
text: email,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return matches;
|
|
42
|
+
},
|
|
43
|
+
validate(email) {
|
|
44
|
+
// Basic validation
|
|
45
|
+
if (email.length > 254)
|
|
46
|
+
return false; // Max email length per RFC
|
|
47
|
+
if (email.includes('..'))
|
|
48
|
+
return false; // No consecutive dots
|
|
49
|
+
const parts = email.split('@');
|
|
50
|
+
if (parts.length !== 2)
|
|
51
|
+
return false;
|
|
52
|
+
const [local, domain] = parts;
|
|
53
|
+
if (local === undefined || domain === undefined)
|
|
54
|
+
return false;
|
|
55
|
+
// Local part validation
|
|
56
|
+
if (local.length === 0 || local.length > 64)
|
|
57
|
+
return false;
|
|
58
|
+
if (local.startsWith('.') || local.endsWith('.'))
|
|
59
|
+
return false;
|
|
60
|
+
// Domain validation
|
|
61
|
+
if (domain.length === 0 || domain.length > 253)
|
|
62
|
+
return false;
|
|
63
|
+
if (!domain.includes('.'))
|
|
64
|
+
return false;
|
|
65
|
+
// Check for valid TLD (at least 2 chars)
|
|
66
|
+
const tld = domain.split('.').pop();
|
|
67
|
+
if (tld === undefined || tld.length < 2)
|
|
68
|
+
return false;
|
|
69
|
+
return true;
|
|
70
|
+
},
|
|
71
|
+
normalize(email) {
|
|
72
|
+
return email.toLowerCase().trim();
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/recognizers/email.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAa,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGxE;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,gIAAgI,CAAC;AAEvJ;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAe;IACzC,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,IAAI,EAAE,eAAe;IACrB,iBAAiB,EAAE,IAAI;IAEvB,IAAI,CAAC,IAAY;QACf,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS;YAExC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEvB,uEAAuE;YACvE,IAAI,CAAC,IAAI,CAAC,QAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM;gBAC/B,UAAU,EAAE,IAAI,CAAC,iBAAiB;gBAClC,MAAM,EAAE,eAAe,CAAC,KAAK;gBAC7B,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,mBAAmB;QACnB,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,2BAA2B;QACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,sBAAsB;QAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAErC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAE9D,wBAAwB;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/D,oBAAoB;QACpB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAExC,yCAAyC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBAN Recognizer
|
|
3
|
+
* International Bank Account Number with mod-97 checksum validation
|
|
4
|
+
*/
|
|
5
|
+
import type { Recognizer } from './base.js';
|
|
6
|
+
/**
|
|
7
|
+
* IBAN recognizer with checksum validation
|
|
8
|
+
*/
|
|
9
|
+
export declare const ibanRecognizer: Recognizer;
|
|
10
|
+
/**
|
|
11
|
+
* Gets expected IBAN length for a country code
|
|
12
|
+
*/
|
|
13
|
+
export declare function getExpectedIBANLength(countryCode: string): number | undefined;
|
|
14
|
+
//# sourceMappingURL=iban.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iban.d.ts","sourceRoot":"","sources":["../../src/recognizers/iban.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAgB5C;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,UAiD5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7E"}
|