@elanlanguages/bridge-anonymization 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/README.md +382 -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 +100 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +163 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +173 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -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 +102 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +253 -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 +240 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +45 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +99 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +140 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +341 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/pipeline/index.d.ts +9 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +9 -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 +238 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +74 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +169 -0
- package/dist/pipeline/tagger.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 +134 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +69 -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 +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -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/package.json +62 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL Recognizer
|
|
3
|
+
* Detects URLs with various protocols
|
|
4
|
+
*/
|
|
5
|
+
import { PIIType, DetectionSource } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* URL pattern - matches common URL formats
|
|
8
|
+
* Supports: http, https, ftp, mailto, file protocols
|
|
9
|
+
*/
|
|
10
|
+
const URL_PATTERN = /\b(?:https?|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]*[-A-Za-z0-9+&@#/%=~_|]/g;
|
|
11
|
+
/**
|
|
12
|
+
* Pattern for URLs without explicit protocol (www.)
|
|
13
|
+
*/
|
|
14
|
+
const WWW_PATTERN = /\bwww\.[-A-Za-z0-9+&@#/%?=~_|!:,.;]*[-A-Za-z0-9+&@#/%=~_|]/g;
|
|
15
|
+
/**
|
|
16
|
+
* Pattern for mailto: URLs
|
|
17
|
+
*/
|
|
18
|
+
const MAILTO_PATTERN = /\bmailto:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
19
|
+
/**
|
|
20
|
+
* URL recognizer
|
|
21
|
+
*/
|
|
22
|
+
export const urlRecognizer = {
|
|
23
|
+
type: PIIType.URL,
|
|
24
|
+
name: 'URL',
|
|
25
|
+
defaultConfidence: 0.92,
|
|
26
|
+
find(text) {
|
|
27
|
+
const matches = [];
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const patterns = [URL_PATTERN, WWW_PATTERN, MAILTO_PATTERN];
|
|
30
|
+
for (const pattern of patterns) {
|
|
31
|
+
const globalPattern = new RegExp(pattern.source, 'g');
|
|
32
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
33
|
+
if (match.index === undefined)
|
|
34
|
+
continue;
|
|
35
|
+
const url = match[0];
|
|
36
|
+
const key = `${match.index}:${match.index + url.length}`;
|
|
37
|
+
if (seen.has(key))
|
|
38
|
+
continue;
|
|
39
|
+
if (!this.validate(url))
|
|
40
|
+
continue;
|
|
41
|
+
seen.add(key);
|
|
42
|
+
matches.push({
|
|
43
|
+
type: PIIType.URL,
|
|
44
|
+
start: match.index,
|
|
45
|
+
end: match.index + url.length,
|
|
46
|
+
confidence: this.defaultConfidence,
|
|
47
|
+
source: DetectionSource.REGEX,
|
|
48
|
+
text: url,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Remove overlapping matches (www. might be substring of http://www.)
|
|
53
|
+
return deduplicateOverlapping(matches);
|
|
54
|
+
},
|
|
55
|
+
validate(url) {
|
|
56
|
+
// Basic length check
|
|
57
|
+
if (url.length < 5)
|
|
58
|
+
return false;
|
|
59
|
+
// Should have at least one dot after the protocol
|
|
60
|
+
const withoutProtocol = url.replace(/^(?:https?|ftp|file|mailto):\/\/?/, '');
|
|
61
|
+
if (!withoutProtocol.includes('.'))
|
|
62
|
+
return false;
|
|
63
|
+
// TLD should be at least 2 characters
|
|
64
|
+
const parts = withoutProtocol.split('.');
|
|
65
|
+
const tld = parts[parts.length - 1];
|
|
66
|
+
if (tld === undefined)
|
|
67
|
+
return false;
|
|
68
|
+
// Remove any path/query from TLD
|
|
69
|
+
const cleanTld = tld.split(/[/?#]/)[0];
|
|
70
|
+
if (cleanTld === undefined || cleanTld.length < 2)
|
|
71
|
+
return false;
|
|
72
|
+
return true;
|
|
73
|
+
},
|
|
74
|
+
normalize(url) {
|
|
75
|
+
return url.trim();
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Remove overlapping matches
|
|
80
|
+
*/
|
|
81
|
+
function deduplicateOverlapping(matches) {
|
|
82
|
+
if (matches.length <= 1)
|
|
83
|
+
return matches;
|
|
84
|
+
const sorted = [...matches].sort((a, b) => a.start - b.start);
|
|
85
|
+
const result = [];
|
|
86
|
+
for (const match of sorted) {
|
|
87
|
+
const last = result[result.length - 1];
|
|
88
|
+
if (last !== undefined && match.start < last.end) {
|
|
89
|
+
// Overlapping - keep the longer one
|
|
90
|
+
if (match.end > last.end) {
|
|
91
|
+
result.pop();
|
|
92
|
+
result.push(match);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result.push(match);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extracts the domain from a URL
|
|
103
|
+
*/
|
|
104
|
+
export function extractDomain(url) {
|
|
105
|
+
try {
|
|
106
|
+
// Add protocol if missing for URL parsing
|
|
107
|
+
let normalizedUrl = url;
|
|
108
|
+
if (url.startsWith('www.')) {
|
|
109
|
+
normalizedUrl = 'https://' + url;
|
|
110
|
+
}
|
|
111
|
+
if (!normalizedUrl.includes('://')) {
|
|
112
|
+
normalizedUrl = 'https://' + normalizedUrl;
|
|
113
|
+
}
|
|
114
|
+
const parsed = new URL(normalizedUrl);
|
|
115
|
+
return parsed.hostname;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/recognizers/url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { PIIType } from './pii-types.js';
|
|
2
|
+
export * from './pii-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Source of entity detection
|
|
5
|
+
*/
|
|
6
|
+
export declare enum DetectionSource {
|
|
7
|
+
REGEX = "REGEX",
|
|
8
|
+
NER = "NER",
|
|
9
|
+
HYBRID = "HYBRID"
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A detected PII entity with its position and metadata
|
|
13
|
+
*/
|
|
14
|
+
export interface DetectedEntity {
|
|
15
|
+
/** PII category */
|
|
16
|
+
type: PIIType;
|
|
17
|
+
/** Unique identifier within the document (1-based, monotonically increasing) */
|
|
18
|
+
id: number;
|
|
19
|
+
/** Start character offset in original text (0-based, inclusive) */
|
|
20
|
+
start: number;
|
|
21
|
+
/** End character offset in original text (0-based, exclusive) */
|
|
22
|
+
end: number;
|
|
23
|
+
/** Detection confidence score (0.0 to 1.0) */
|
|
24
|
+
confidence: number;
|
|
25
|
+
/** How this entity was detected */
|
|
26
|
+
source: DetectionSource;
|
|
27
|
+
/** Original text (only stored in encrypted pii_map, never logged) */
|
|
28
|
+
original: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A span match from a recognizer (before ID assignment)
|
|
32
|
+
*/
|
|
33
|
+
export interface SpanMatch {
|
|
34
|
+
/** PII category */
|
|
35
|
+
type: PIIType;
|
|
36
|
+
/** Start character offset (0-based, inclusive) */
|
|
37
|
+
start: number;
|
|
38
|
+
/** End character offset (0-based, exclusive) */
|
|
39
|
+
end: number;
|
|
40
|
+
/** Detection confidence score (0.0 to 1.0) */
|
|
41
|
+
confidence: number;
|
|
42
|
+
/** How this span was detected */
|
|
43
|
+
source: DetectionSource;
|
|
44
|
+
/** The matched text */
|
|
45
|
+
text: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Custom ID pattern configuration
|
|
49
|
+
*/
|
|
50
|
+
export interface CustomIdPattern {
|
|
51
|
+
/** Pattern name for identification */
|
|
52
|
+
name: string;
|
|
53
|
+
/** Regular expression pattern */
|
|
54
|
+
pattern: RegExp;
|
|
55
|
+
/** PII type to assign (typically CASE_ID or CUSTOMER_ID) */
|
|
56
|
+
type: PIIType;
|
|
57
|
+
/** Optional validation function */
|
|
58
|
+
validate?: (match: string) => boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Anonymization policy configuration
|
|
62
|
+
*/
|
|
63
|
+
export interface AnonymizationPolicy {
|
|
64
|
+
/** Set of PII types to detect (both regex and NER) */
|
|
65
|
+
enabledTypes: Set<PIIType>;
|
|
66
|
+
/** Set of PII types to detect via regex */
|
|
67
|
+
regexEnabledTypes: Set<PIIType>;
|
|
68
|
+
/** Set of PII types to detect via NER */
|
|
69
|
+
nerEnabledTypes: Set<PIIType>;
|
|
70
|
+
/** Priority order for resolving overlapping entities (higher index = higher priority) */
|
|
71
|
+
typePriority: PIIType[];
|
|
72
|
+
/** Minimum confidence thresholds per type (default: 0.5) */
|
|
73
|
+
confidenceThresholds: Map<PIIType, number>;
|
|
74
|
+
/** Custom ID patterns for domain-specific identifiers */
|
|
75
|
+
customIdPatterns: CustomIdPattern[];
|
|
76
|
+
/** Terms that should not be treated as PII (case-insensitive) */
|
|
77
|
+
allowlistTerms: Set<string>;
|
|
78
|
+
/** Terms that should always be treated as PII */
|
|
79
|
+
denylistPatterns: RegExp[];
|
|
80
|
+
/** Whether to reuse IDs for identical repeated PII strings */
|
|
81
|
+
reuseIdsForRepeatedPII: boolean;
|
|
82
|
+
/** Whether to run leak scan on anonymized output */
|
|
83
|
+
enableLeakScan: boolean;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Encrypted PII map entry
|
|
87
|
+
*/
|
|
88
|
+
export interface EncryptedPIIMap {
|
|
89
|
+
/** AES-256-GCM encrypted data (base64) */
|
|
90
|
+
ciphertext: string;
|
|
91
|
+
/** Initialization vector (base64) */
|
|
92
|
+
iv: string;
|
|
93
|
+
/** Authentication tag (base64) */
|
|
94
|
+
authTag: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Statistics about the anonymization process
|
|
98
|
+
*/
|
|
99
|
+
export interface AnonymizationStats {
|
|
100
|
+
/** Count of entities detected per type */
|
|
101
|
+
countsByType: Record<PIIType, number>;
|
|
102
|
+
/** Total number of entities detected */
|
|
103
|
+
totalEntities: number;
|
|
104
|
+
/** NER model version used */
|
|
105
|
+
modelVersion: string;
|
|
106
|
+
/** Policy version/identifier */
|
|
107
|
+
policyVersion: string;
|
|
108
|
+
/** Processing time in milliseconds */
|
|
109
|
+
processingTimeMs: number;
|
|
110
|
+
/** Whether leak scan passed (if enabled) */
|
|
111
|
+
leakScanPassed?: boolean;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Result of the anonymization process
|
|
115
|
+
*/
|
|
116
|
+
export interface AnonymizationResult {
|
|
117
|
+
/** Text with PII replaced by placeholder tags */
|
|
118
|
+
anonymizedText: string;
|
|
119
|
+
/** List of detected entities (without original text for safety) */
|
|
120
|
+
entities: Omit<DetectedEntity, 'original'>[];
|
|
121
|
+
/** Encrypted mapping of (type, id) -> original string */
|
|
122
|
+
piiMap: EncryptedPIIMap;
|
|
123
|
+
/** Statistics about the anonymization */
|
|
124
|
+
stats: AnonymizationStats;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Creates a default anonymization policy with all types enabled
|
|
128
|
+
*/
|
|
129
|
+
export declare function createDefaultPolicy(): AnonymizationPolicy;
|
|
130
|
+
/**
|
|
131
|
+
* Merges a partial policy with defaults
|
|
132
|
+
*/
|
|
133
|
+
export declare function mergePolicy(partial: Partial<AnonymizationPolicy>): AnonymizationPolicy;
|
|
134
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { PIIType, DEFAULT_TYPE_PRIORITY } from './pii-types.js';
|
|
2
|
+
export * from './pii-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Source of entity detection
|
|
5
|
+
*/
|
|
6
|
+
export var DetectionSource;
|
|
7
|
+
(function (DetectionSource) {
|
|
8
|
+
DetectionSource["REGEX"] = "REGEX";
|
|
9
|
+
DetectionSource["NER"] = "NER";
|
|
10
|
+
DetectionSource["HYBRID"] = "HYBRID";
|
|
11
|
+
})(DetectionSource || (DetectionSource = {}));
|
|
12
|
+
/**
|
|
13
|
+
* Creates a default anonymization policy with all types enabled
|
|
14
|
+
*/
|
|
15
|
+
export function createDefaultPolicy() {
|
|
16
|
+
const allTypes = new Set(Object.values(PIIType));
|
|
17
|
+
const defaultThresholds = new Map();
|
|
18
|
+
for (const type of allTypes) {
|
|
19
|
+
// Higher threshold for NER-detected types (more uncertainty)
|
|
20
|
+
defaultThresholds.set(type, type === PIIType.PERSON || type === PIIType.ORG ? 0.7 : 0.5);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
enabledTypes: allTypes,
|
|
24
|
+
regexEnabledTypes: new Set([
|
|
25
|
+
PIIType.EMAIL,
|
|
26
|
+
PIIType.PHONE,
|
|
27
|
+
PIIType.IBAN,
|
|
28
|
+
PIIType.BIC_SWIFT,
|
|
29
|
+
PIIType.CREDIT_CARD,
|
|
30
|
+
PIIType.IP_ADDRESS,
|
|
31
|
+
PIIType.URL,
|
|
32
|
+
PIIType.CASE_ID,
|
|
33
|
+
PIIType.CUSTOMER_ID,
|
|
34
|
+
]),
|
|
35
|
+
nerEnabledTypes: new Set([
|
|
36
|
+
PIIType.PERSON,
|
|
37
|
+
PIIType.ORG,
|
|
38
|
+
PIIType.LOCATION,
|
|
39
|
+
PIIType.ADDRESS,
|
|
40
|
+
PIIType.DATE_OF_BIRTH,
|
|
41
|
+
]),
|
|
42
|
+
typePriority: [...DEFAULT_TYPE_PRIORITY],
|
|
43
|
+
confidenceThresholds: defaultThresholds,
|
|
44
|
+
customIdPatterns: [],
|
|
45
|
+
allowlistTerms: new Set(),
|
|
46
|
+
denylistPatterns: [],
|
|
47
|
+
reuseIdsForRepeatedPII: false,
|
|
48
|
+
enableLeakScan: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Merges a partial policy with defaults
|
|
53
|
+
*/
|
|
54
|
+
export function mergePolicy(partial) {
|
|
55
|
+
const defaultPolicy = createDefaultPolicy();
|
|
56
|
+
return {
|
|
57
|
+
enabledTypes: partial.enabledTypes ?? defaultPolicy.enabledTypes,
|
|
58
|
+
regexEnabledTypes: partial.regexEnabledTypes ?? defaultPolicy.regexEnabledTypes,
|
|
59
|
+
nerEnabledTypes: partial.nerEnabledTypes ?? defaultPolicy.nerEnabledTypes,
|
|
60
|
+
typePriority: partial.typePriority ?? defaultPolicy.typePriority,
|
|
61
|
+
confidenceThresholds: partial.confidenceThresholds ?? defaultPolicy.confidenceThresholds,
|
|
62
|
+
customIdPatterns: partial.customIdPatterns ?? defaultPolicy.customIdPatterns,
|
|
63
|
+
allowlistTerms: partial.allowlistTerms ?? defaultPolicy.allowlistTerms,
|
|
64
|
+
denylistPatterns: partial.denylistPatterns ?? defaultPolicy.denylistPatterns,
|
|
65
|
+
reuseIdsForRepeatedPII: partial.reuseIdsForRepeatedPII ?? defaultPolicy.reuseIdsForRepeatedPII,
|
|
66
|
+
enableLeakScan: partial.enableLeakScan ?? defaultPolicy.enableLeakScan,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,cAAc,gBAAgB,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,8BAAW,CAAA;IACX,oCAAiB,CAAA;AACnB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AA4HD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAc,CAAC,CAAC;IAE9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAmB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,6DAA6D;QAC7D,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,YAAY,EAAE,QAAQ;QACtB,iBAAiB,EAAE,IAAI,GAAG,CAAC;YACzB,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,IAAI;YACZ,OAAO,CAAC,SAAS;YACjB,OAAO,CAAC,WAAW;YACnB,OAAO,CAAC,UAAU;YAClB,OAAO,CAAC,GAAG;YACX,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,WAAW;SACpB,CAAC;QACF,eAAe,EAAE,IAAI,GAAG,CAAC;YACvB,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,GAAG;YACX,OAAO,CAAC,QAAQ;YAChB,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,aAAa;SACtB,CAAC;QACF,YAAY,EAAE,CAAC,GAAG,qBAAqB,CAAC;QACxC,oBAAoB,EAAE,iBAAiB;QACvC,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,gBAAgB,EAAE,EAAE;QACpB,sBAAsB,EAAE,KAAK;QAC7B,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAqC;IAC/D,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAE5C,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY;QAChE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,aAAa,CAAC,iBAAiB;QAC/E,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,aAAa,CAAC,eAAe;QACzE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY;QAChE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,aAAa,CAAC,oBAAoB;QACxF,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,aAAa,CAAC,gBAAgB;QAC5E,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc;QACtE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,aAAa,CAAC,gBAAgB;QAC5E,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,IAAI,aAAa,CAAC,sBAAsB;QAC9F,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc;KACvE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII Type Enumeration
|
|
3
|
+
* Defines all supported PII categories for detection and anonymization
|
|
4
|
+
*/
|
|
5
|
+
export declare enum PIIType {
|
|
6
|
+
PERSON = "PERSON",
|
|
7
|
+
ORG = "ORG",
|
|
8
|
+
LOCATION = "LOCATION",
|
|
9
|
+
ADDRESS = "ADDRESS",
|
|
10
|
+
EMAIL = "EMAIL",
|
|
11
|
+
PHONE = "PHONE",
|
|
12
|
+
URL = "URL",
|
|
13
|
+
IP_ADDRESS = "IP_ADDRESS",
|
|
14
|
+
IBAN = "IBAN",
|
|
15
|
+
BIC_SWIFT = "BIC_SWIFT",
|
|
16
|
+
ACCOUNT_NUMBER = "ACCOUNT_NUMBER",
|
|
17
|
+
CREDIT_CARD = "CREDIT_CARD",
|
|
18
|
+
TAX_ID = "TAX_ID",
|
|
19
|
+
NATIONAL_ID = "NATIONAL_ID",
|
|
20
|
+
DATE_OF_BIRTH = "DATE_OF_BIRTH",
|
|
21
|
+
CASE_ID = "CASE_ID",
|
|
22
|
+
CUSTOMER_ID = "CUSTOMER_ID"
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* All PII types as a readonly array for iteration
|
|
26
|
+
*/
|
|
27
|
+
export declare const ALL_PII_TYPES: readonly PIIType[];
|
|
28
|
+
/**
|
|
29
|
+
* PII types that are detected via regex (structured PII)
|
|
30
|
+
*/
|
|
31
|
+
export declare const REGEX_PII_TYPES: readonly PIIType[];
|
|
32
|
+
/**
|
|
33
|
+
* PII types that are detected via NER model (soft PII)
|
|
34
|
+
*/
|
|
35
|
+
export declare const NER_PII_TYPES: readonly PIIType[];
|
|
36
|
+
/**
|
|
37
|
+
* Default priority order for resolving overlapping entities
|
|
38
|
+
* Higher index = higher priority
|
|
39
|
+
*/
|
|
40
|
+
export declare const DEFAULT_TYPE_PRIORITY: readonly PIIType[];
|
|
41
|
+
/**
|
|
42
|
+
* Maps NER model labels to PIIType
|
|
43
|
+
* Common label formats from NER models (B-PER, I-PER, B-ORG, etc.)
|
|
44
|
+
*/
|
|
45
|
+
export declare const NER_LABEL_TO_PII_TYPE: Record<string, PIIType>;
|
|
46
|
+
/**
|
|
47
|
+
* Get PIIType from NER label (handles B-/I- prefixes)
|
|
48
|
+
*/
|
|
49
|
+
export declare function getPIITypeFromNERLabel(label: string): PIIType | null;
|
|
50
|
+
//# sourceMappingURL=pii-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-types.d.ts","sourceRoot":"","sources":["../../src/types/pii-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,OAAO;IAEjB,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,QAAQ,aAAa;IACrB,OAAO,YAAY;IAGnB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,GAAG,QAAQ;IACX,UAAU,eAAe;IAGzB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAG3B,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAG/B,OAAO,YAAY;IACnB,WAAW,gBAAgB;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,OAAO,EAAwC,CAAC;AAErF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,OAAO,EAa7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,OAAO,EAM3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,OAAO,EAqBnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAWzD,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASpE"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII Type Enumeration
|
|
3
|
+
* Defines all supported PII categories for detection and anonymization
|
|
4
|
+
*/
|
|
5
|
+
export var PIIType;
|
|
6
|
+
(function (PIIType) {
|
|
7
|
+
// Personal identifiers
|
|
8
|
+
PIIType["PERSON"] = "PERSON";
|
|
9
|
+
PIIType["ORG"] = "ORG";
|
|
10
|
+
PIIType["LOCATION"] = "LOCATION";
|
|
11
|
+
PIIType["ADDRESS"] = "ADDRESS";
|
|
12
|
+
// Contact information
|
|
13
|
+
PIIType["EMAIL"] = "EMAIL";
|
|
14
|
+
PIIType["PHONE"] = "PHONE";
|
|
15
|
+
PIIType["URL"] = "URL";
|
|
16
|
+
PIIType["IP_ADDRESS"] = "IP_ADDRESS";
|
|
17
|
+
// Financial identifiers
|
|
18
|
+
PIIType["IBAN"] = "IBAN";
|
|
19
|
+
PIIType["BIC_SWIFT"] = "BIC_SWIFT";
|
|
20
|
+
PIIType["ACCOUNT_NUMBER"] = "ACCOUNT_NUMBER";
|
|
21
|
+
PIIType["CREDIT_CARD"] = "CREDIT_CARD";
|
|
22
|
+
// Government/Tax identifiers
|
|
23
|
+
PIIType["TAX_ID"] = "TAX_ID";
|
|
24
|
+
PIIType["NATIONAL_ID"] = "NATIONAL_ID";
|
|
25
|
+
PIIType["DATE_OF_BIRTH"] = "DATE_OF_BIRTH";
|
|
26
|
+
// Custom/Business identifiers
|
|
27
|
+
PIIType["CASE_ID"] = "CASE_ID";
|
|
28
|
+
PIIType["CUSTOMER_ID"] = "CUSTOMER_ID";
|
|
29
|
+
})(PIIType || (PIIType = {}));
|
|
30
|
+
/**
|
|
31
|
+
* All PII types as a readonly array for iteration
|
|
32
|
+
*/
|
|
33
|
+
export const ALL_PII_TYPES = Object.values(PIIType);
|
|
34
|
+
/**
|
|
35
|
+
* PII types that are detected via regex (structured PII)
|
|
36
|
+
*/
|
|
37
|
+
export const REGEX_PII_TYPES = [
|
|
38
|
+
PIIType.EMAIL,
|
|
39
|
+
PIIType.PHONE,
|
|
40
|
+
PIIType.IBAN,
|
|
41
|
+
PIIType.BIC_SWIFT,
|
|
42
|
+
PIIType.CREDIT_CARD,
|
|
43
|
+
PIIType.IP_ADDRESS,
|
|
44
|
+
PIIType.URL,
|
|
45
|
+
PIIType.ACCOUNT_NUMBER,
|
|
46
|
+
PIIType.TAX_ID,
|
|
47
|
+
PIIType.NATIONAL_ID,
|
|
48
|
+
PIIType.CASE_ID,
|
|
49
|
+
PIIType.CUSTOMER_ID,
|
|
50
|
+
];
|
|
51
|
+
/**
|
|
52
|
+
* PII types that are detected via NER model (soft PII)
|
|
53
|
+
*/
|
|
54
|
+
export const NER_PII_TYPES = [
|
|
55
|
+
PIIType.PERSON,
|
|
56
|
+
PIIType.ORG,
|
|
57
|
+
PIIType.LOCATION,
|
|
58
|
+
PIIType.ADDRESS,
|
|
59
|
+
PIIType.DATE_OF_BIRTH,
|
|
60
|
+
];
|
|
61
|
+
/**
|
|
62
|
+
* Default priority order for resolving overlapping entities
|
|
63
|
+
* Higher index = higher priority
|
|
64
|
+
*/
|
|
65
|
+
export const DEFAULT_TYPE_PRIORITY = [
|
|
66
|
+
// Lower priority (generic)
|
|
67
|
+
PIIType.URL,
|
|
68
|
+
PIIType.IP_ADDRESS,
|
|
69
|
+
PIIType.LOCATION,
|
|
70
|
+
PIIType.ORG,
|
|
71
|
+
PIIType.PERSON,
|
|
72
|
+
// Medium priority
|
|
73
|
+
PIIType.DATE_OF_BIRTH,
|
|
74
|
+
PIIType.PHONE,
|
|
75
|
+
PIIType.EMAIL,
|
|
76
|
+
PIIType.ADDRESS,
|
|
77
|
+
// Higher priority (specific identifiers)
|
|
78
|
+
PIIType.CASE_ID,
|
|
79
|
+
PIIType.CUSTOMER_ID,
|
|
80
|
+
PIIType.ACCOUNT_NUMBER,
|
|
81
|
+
PIIType.BIC_SWIFT,
|
|
82
|
+
PIIType.IBAN,
|
|
83
|
+
PIIType.CREDIT_CARD,
|
|
84
|
+
PIIType.TAX_ID,
|
|
85
|
+
PIIType.NATIONAL_ID,
|
|
86
|
+
];
|
|
87
|
+
/**
|
|
88
|
+
* Maps NER model labels to PIIType
|
|
89
|
+
* Common label formats from NER models (B-PER, I-PER, B-ORG, etc.)
|
|
90
|
+
*/
|
|
91
|
+
export const NER_LABEL_TO_PII_TYPE = {
|
|
92
|
+
PER: PIIType.PERSON,
|
|
93
|
+
PERSON: PIIType.PERSON,
|
|
94
|
+
ORG: PIIType.ORG,
|
|
95
|
+
ORGANIZATION: PIIType.ORG,
|
|
96
|
+
LOC: PIIType.LOCATION,
|
|
97
|
+
LOCATION: PIIType.LOCATION,
|
|
98
|
+
GPE: PIIType.LOCATION, // Geo-Political Entity
|
|
99
|
+
DATE: PIIType.DATE_OF_BIRTH,
|
|
100
|
+
// Some models use MISC for addresses
|
|
101
|
+
MISC: PIIType.ADDRESS,
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Get PIIType from NER label (handles B-/I- prefixes)
|
|
105
|
+
*/
|
|
106
|
+
export function getPIITypeFromNERLabel(label) {
|
|
107
|
+
// Remove B-/I- prefix if present
|
|
108
|
+
const cleanLabel = label.replace(/^[BI]-/, '').toUpperCase();
|
|
109
|
+
if (cleanLabel === 'O') {
|
|
110
|
+
return null; // Outside any entity
|
|
111
|
+
}
|
|
112
|
+
return NER_LABEL_TO_PII_TYPE[cleanLabel] ?? null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=pii-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-types.js","sourceRoot":"","sources":["../../src/types/pii-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBAN Checksum Validation (ISO 13616)
|
|
3
|
+
* Uses Mod-97 algorithm
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Country code to IBAN length mapping (partial list of common countries)
|
|
7
|
+
*/
|
|
8
|
+
export declare const IBAN_LENGTHS: Record<string, number>;
|
|
9
|
+
/**
|
|
10
|
+
* Validates an IBAN using the mod-97 algorithm
|
|
11
|
+
* @param iban - IBAN string (spaces allowed)
|
|
12
|
+
* @returns true if checksum is valid
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateIBAN(iban: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes an IBAN by removing spaces and converting to uppercase
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeIBAN(iban: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Formats an IBAN with spaces every 4 characters for readability
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatIBAN(iban: string): string;
|
|
23
|
+
//# sourceMappingURL=iban-checksum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iban-checksum.d.ts","sourceRoot":"","sources":["../../src/utils/iban-checksum.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwB/C,CAAC;AA4CF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBAN Checksum Validation (ISO 13616)
|
|
3
|
+
* Uses Mod-97 algorithm
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Country code to IBAN length mapping (partial list of common countries)
|
|
7
|
+
*/
|
|
8
|
+
export const IBAN_LENGTHS = {
|
|
9
|
+
AD: 24, // Andorra
|
|
10
|
+
AT: 20, // Austria
|
|
11
|
+
BE: 16, // Belgium
|
|
12
|
+
CH: 21, // Switzerland
|
|
13
|
+
CZ: 24, // Czech Republic
|
|
14
|
+
DE: 22, // Germany
|
|
15
|
+
DK: 18, // Denmark
|
|
16
|
+
ES: 24, // Spain
|
|
17
|
+
FI: 18, // Finland
|
|
18
|
+
FR: 27, // France
|
|
19
|
+
GB: 22, // United Kingdom
|
|
20
|
+
GR: 27, // Greece
|
|
21
|
+
HU: 28, // Hungary
|
|
22
|
+
IE: 22, // Ireland
|
|
23
|
+
IT: 27, // Italy
|
|
24
|
+
LI: 21, // Liechtenstein
|
|
25
|
+
LU: 20, // Luxembourg
|
|
26
|
+
NL: 18, // Netherlands
|
|
27
|
+
NO: 15, // Norway
|
|
28
|
+
PL: 28, // Poland
|
|
29
|
+
PT: 25, // Portugal
|
|
30
|
+
SE: 24, // Sweden
|
|
31
|
+
SK: 24, // Slovakia
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Convert a character to its numeric value for IBAN calculation
|
|
35
|
+
* A=10, B=11, ..., Z=35
|
|
36
|
+
*/
|
|
37
|
+
function charToNumber(char) {
|
|
38
|
+
const code = char.toUpperCase().charCodeAt(0);
|
|
39
|
+
if (code >= 65 && code <= 90) {
|
|
40
|
+
// A-Z
|
|
41
|
+
return (code - 55).toString();
|
|
42
|
+
}
|
|
43
|
+
return char; // Already a digit
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Rearranges IBAN for checksum calculation:
|
|
47
|
+
* Move first 4 chars to end, convert letters to numbers
|
|
48
|
+
*/
|
|
49
|
+
function rearrangeForChecksum(iban) {
|
|
50
|
+
const cleaned = iban.replace(/\s/g, '').toUpperCase();
|
|
51
|
+
const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
|
|
52
|
+
let numeric = '';
|
|
53
|
+
for (const char of rearranged) {
|
|
54
|
+
numeric += charToNumber(char);
|
|
55
|
+
}
|
|
56
|
+
return numeric;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Calculate mod 97 for a large number represented as a string
|
|
60
|
+
*/
|
|
61
|
+
function mod97(numericString) {
|
|
62
|
+
let remainder = 0;
|
|
63
|
+
for (const digit of numericString) {
|
|
64
|
+
remainder = (remainder * 10 + parseInt(digit, 10)) % 97;
|
|
65
|
+
}
|
|
66
|
+
return remainder;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validates an IBAN using the mod-97 algorithm
|
|
70
|
+
* @param iban - IBAN string (spaces allowed)
|
|
71
|
+
* @returns true if checksum is valid
|
|
72
|
+
*/
|
|
73
|
+
export function validateIBAN(iban) {
|
|
74
|
+
const cleaned = iban.replace(/\s/g, '').toUpperCase();
|
|
75
|
+
// Basic format check
|
|
76
|
+
if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(cleaned)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Check length for known countries
|
|
80
|
+
const countryCode = cleaned.slice(0, 2);
|
|
81
|
+
const expectedLength = IBAN_LENGTHS[countryCode];
|
|
82
|
+
if (expectedLength !== undefined && cleaned.length !== expectedLength) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
// General length check (IBANs are 15-34 characters)
|
|
86
|
+
if (cleaned.length < 15 || cleaned.length > 34) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Mod-97 validation
|
|
90
|
+
const numericString = rearrangeForChecksum(cleaned);
|
|
91
|
+
return mod97(numericString) === 1;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Normalizes an IBAN by removing spaces and converting to uppercase
|
|
95
|
+
*/
|
|
96
|
+
export function normalizeIBAN(iban) {
|
|
97
|
+
return iban.replace(/\s/g, '').toUpperCase();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Formats an IBAN with spaces every 4 characters for readability
|
|
101
|
+
*/
|
|
102
|
+
export function formatIBAN(iban) {
|
|
103
|
+
const normalized = normalizeIBAN(iban);
|
|
104
|
+
return normalized.replace(/(.{4})/g, '$1 ').trim();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=iban-checksum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iban-checksum.js","sourceRoot":"","sources":["../../src/utils/iban-checksum.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC"}
|