@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.
Files changed (126) hide show
  1. package/README.md +382 -0
  2. package/dist/crypto/index.d.ts +6 -0
  3. package/dist/crypto/index.d.ts.map +1 -0
  4. package/dist/crypto/index.js +6 -0
  5. package/dist/crypto/index.js.map +1 -0
  6. package/dist/crypto/pii-map-crypto.d.ts +100 -0
  7. package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
  8. package/dist/crypto/pii-map-crypto.js +163 -0
  9. package/dist/crypto/pii-map-crypto.js.map +1 -0
  10. package/dist/index.d.ts +173 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +294 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/ner/bio-decoder.d.ts +64 -0
  15. package/dist/ner/bio-decoder.d.ts.map +1 -0
  16. package/dist/ner/bio-decoder.js +216 -0
  17. package/dist/ner/bio-decoder.js.map +1 -0
  18. package/dist/ner/index.d.ts +10 -0
  19. package/dist/ner/index.d.ts.map +1 -0
  20. package/dist/ner/index.js +10 -0
  21. package/dist/ner/index.js.map +1 -0
  22. package/dist/ner/model-manager.d.ts +102 -0
  23. package/dist/ner/model-manager.d.ts.map +1 -0
  24. package/dist/ner/model-manager.js +253 -0
  25. package/dist/ner/model-manager.js.map +1 -0
  26. package/dist/ner/ner-model.d.ts +114 -0
  27. package/dist/ner/ner-model.d.ts.map +1 -0
  28. package/dist/ner/ner-model.js +240 -0
  29. package/dist/ner/ner-model.js.map +1 -0
  30. package/dist/ner/onnx-runtime.d.ts +45 -0
  31. package/dist/ner/onnx-runtime.d.ts.map +1 -0
  32. package/dist/ner/onnx-runtime.js +99 -0
  33. package/dist/ner/onnx-runtime.js.map +1 -0
  34. package/dist/ner/tokenizer.d.ts +140 -0
  35. package/dist/ner/tokenizer.d.ts.map +1 -0
  36. package/dist/ner/tokenizer.js +341 -0
  37. package/dist/ner/tokenizer.js.map +1 -0
  38. package/dist/pipeline/index.d.ts +9 -0
  39. package/dist/pipeline/index.d.ts.map +1 -0
  40. package/dist/pipeline/index.js +9 -0
  41. package/dist/pipeline/index.js.map +1 -0
  42. package/dist/pipeline/prenormalize.d.ts +48 -0
  43. package/dist/pipeline/prenormalize.d.ts.map +1 -0
  44. package/dist/pipeline/prenormalize.js +94 -0
  45. package/dist/pipeline/prenormalize.js.map +1 -0
  46. package/dist/pipeline/resolver.d.ts +56 -0
  47. package/dist/pipeline/resolver.d.ts.map +1 -0
  48. package/dist/pipeline/resolver.js +238 -0
  49. package/dist/pipeline/resolver.js.map +1 -0
  50. package/dist/pipeline/tagger.d.ts +74 -0
  51. package/dist/pipeline/tagger.d.ts.map +1 -0
  52. package/dist/pipeline/tagger.js +169 -0
  53. package/dist/pipeline/tagger.js.map +1 -0
  54. package/dist/pipeline/validator.d.ts +65 -0
  55. package/dist/pipeline/validator.d.ts.map +1 -0
  56. package/dist/pipeline/validator.js +264 -0
  57. package/dist/pipeline/validator.js.map +1 -0
  58. package/dist/recognizers/base.d.ts +78 -0
  59. package/dist/recognizers/base.d.ts.map +1 -0
  60. package/dist/recognizers/base.js +100 -0
  61. package/dist/recognizers/base.js.map +1 -0
  62. package/dist/recognizers/bic-swift.d.ts +10 -0
  63. package/dist/recognizers/bic-swift.d.ts.map +1 -0
  64. package/dist/recognizers/bic-swift.js +107 -0
  65. package/dist/recognizers/bic-swift.js.map +1 -0
  66. package/dist/recognizers/credit-card.d.ts +32 -0
  67. package/dist/recognizers/credit-card.d.ts.map +1 -0
  68. package/dist/recognizers/credit-card.js +160 -0
  69. package/dist/recognizers/credit-card.js.map +1 -0
  70. package/dist/recognizers/custom-id.d.ts +28 -0
  71. package/dist/recognizers/custom-id.d.ts.map +1 -0
  72. package/dist/recognizers/custom-id.js +116 -0
  73. package/dist/recognizers/custom-id.js.map +1 -0
  74. package/dist/recognizers/email.d.ts +10 -0
  75. package/dist/recognizers/email.d.ts.map +1 -0
  76. package/dist/recognizers/email.js +75 -0
  77. package/dist/recognizers/email.js.map +1 -0
  78. package/dist/recognizers/iban.d.ts +14 -0
  79. package/dist/recognizers/iban.d.ts.map +1 -0
  80. package/dist/recognizers/iban.js +67 -0
  81. package/dist/recognizers/iban.js.map +1 -0
  82. package/dist/recognizers/index.d.ts +20 -0
  83. package/dist/recognizers/index.d.ts.map +1 -0
  84. package/dist/recognizers/index.js +42 -0
  85. package/dist/recognizers/index.js.map +1 -0
  86. package/dist/recognizers/ip-address.d.ts +14 -0
  87. package/dist/recognizers/ip-address.d.ts.map +1 -0
  88. package/dist/recognizers/ip-address.js +183 -0
  89. package/dist/recognizers/ip-address.js.map +1 -0
  90. package/dist/recognizers/phone.d.ts +10 -0
  91. package/dist/recognizers/phone.d.ts.map +1 -0
  92. package/dist/recognizers/phone.js +145 -0
  93. package/dist/recognizers/phone.js.map +1 -0
  94. package/dist/recognizers/registry.d.ts +59 -0
  95. package/dist/recognizers/registry.d.ts.map +1 -0
  96. package/dist/recognizers/registry.js +113 -0
  97. package/dist/recognizers/registry.js.map +1 -0
  98. package/dist/recognizers/url.d.ts +14 -0
  99. package/dist/recognizers/url.d.ts.map +1 -0
  100. package/dist/recognizers/url.js +121 -0
  101. package/dist/recognizers/url.js.map +1 -0
  102. package/dist/types/index.d.ts +134 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/types/index.js +69 -0
  105. package/dist/types/index.js.map +1 -0
  106. package/dist/types/pii-types.d.ts +50 -0
  107. package/dist/types/pii-types.d.ts.map +1 -0
  108. package/dist/types/pii-types.js +114 -0
  109. package/dist/types/pii-types.js.map +1 -0
  110. package/dist/utils/iban-checksum.d.ts +23 -0
  111. package/dist/utils/iban-checksum.d.ts.map +1 -0
  112. package/dist/utils/iban-checksum.js +106 -0
  113. package/dist/utils/iban-checksum.js.map +1 -0
  114. package/dist/utils/index.d.ts +8 -0
  115. package/dist/utils/index.d.ts.map +1 -0
  116. package/dist/utils/index.js +8 -0
  117. package/dist/utils/index.js.map +1 -0
  118. package/dist/utils/luhn.d.ts +17 -0
  119. package/dist/utils/luhn.d.ts.map +1 -0
  120. package/dist/utils/luhn.js +55 -0
  121. package/dist/utils/luhn.js.map +1 -0
  122. package/dist/utils/offsets.d.ts +86 -0
  123. package/dist/utils/offsets.d.ts.map +1 -0
  124. package/dist/utils/offsets.js +124 -0
  125. package/dist/utils/offsets.js.map +1 -0
  126. 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,8 @@
1
+ /**
2
+ * Utils Module
3
+ * Exports utility functions
4
+ */
5
+ export * from './luhn.js';
6
+ export * from './iban-checksum.js';
7
+ export * from './offsets.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}