rehydra 0.16.1 → 0.16.3
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/dist/recognizers/custom-id.d.ts +3 -1
- package/dist/recognizers/custom-id.d.ts.map +1 -1
- package/dist/recognizers/custom-id.js +4 -2
- package/dist/recognizers/custom-id.js.map +1 -1
- package/dist/recognizers/registry.d.ts.map +1 -1
- package/dist/recognizers/registry.js +32 -8
- package/dist/recognizers/registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
import { CustomIdPattern } from '../types/index.js';
|
|
7
7
|
import type { Recognizer } from './base.js';
|
|
8
8
|
/**
|
|
9
|
-
* Creates a custom ID recognizer from patterns defined in policy
|
|
9
|
+
* Creates a custom ID recognizer from patterns defined in policy.
|
|
10
|
+
* It registers under its first pattern's type; each match keeps its
|
|
11
|
+
* pattern's type, and the registry checks that type against the policy.
|
|
10
12
|
*/
|
|
11
13
|
export declare function createCustomIdRecognizer(patterns: CustomIdPattern[]): Recognizer;
|
|
12
14
|
/**
|
|
@@ -1 +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
|
|
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;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,UAAU,CA8ChF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyBrD,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"}
|
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { PIIType, DetectionSource } from '../types/index.js';
|
|
7
7
|
/**
|
|
8
|
-
* Creates a custom ID recognizer from patterns defined in policy
|
|
8
|
+
* Creates a custom ID recognizer from patterns defined in policy.
|
|
9
|
+
* It registers under its first pattern's type; each match keeps its
|
|
10
|
+
* pattern's type, and the registry checks that type against the policy.
|
|
9
11
|
*/
|
|
10
12
|
export function createCustomIdRecognizer(patterns) {
|
|
11
13
|
return {
|
|
12
|
-
type: PIIType.CASE_ID,
|
|
14
|
+
type: patterns[0]?.type ?? PIIType.CASE_ID,
|
|
13
15
|
name: 'Custom ID',
|
|
14
16
|
defaultConfidence: 0.9,
|
|
15
17
|
find(text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-id.js","sourceRoot":"","sources":["../../src/recognizers/custom-id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAa,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAGzF
|
|
1
|
+
{"version":3,"file":"custom-id.js","sourceRoot":"","sources":["../../src/recognizers/custom-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/recognizers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/recognizers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAqB5C;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAyC;IAE5D;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAMtC;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE;IAI3C;;OAEG;IACH,iBAAiB,IAAI,UAAU,EAAE;IAQjC;;OAEG;IACH,kBAAkB,IAAI,OAAO,EAAE;IAI/B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAKrC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAI/B;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAWpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,SAAS,EAAE;CA4BhE;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAKtD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD"}
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
* Recognizer Registry
|
|
3
3
|
* Central registry for all PII recognizers
|
|
4
4
|
*/
|
|
5
|
+
import { PIIType } from '../types/index.js';
|
|
6
|
+
import { createCustomIdRecognizer } from './custom-id.js';
|
|
7
|
+
const BUILT_IN_TYPES = new Set(Object.values(PIIType));
|
|
8
|
+
/**
|
|
9
|
+
* Whether regex detection is on for a type. Custom types outside PIIType
|
|
10
|
+
* (issue #68) are never in the default regexEnabledTypes, so they only
|
|
11
|
+
* need to be in enabledTypes.
|
|
12
|
+
*/
|
|
13
|
+
function isRegexEnabled(type, policy) {
|
|
14
|
+
if (!policy.enabledTypes.has(type))
|
|
15
|
+
return false;
|
|
16
|
+
return !BUILT_IN_TYPES.has(type) || policy.regexEnabledTypes.has(type);
|
|
17
|
+
}
|
|
18
|
+
/** Whether a match's own type is enabled and it passes the type's confidence threshold. */
|
|
19
|
+
function isRegexMatchEnabled(match, policy) {
|
|
20
|
+
if (!isRegexEnabled(match.type, policy))
|
|
21
|
+
return false;
|
|
22
|
+
return match.confidence >= (policy.confidenceThresholds.get(match.type) ?? 0.5);
|
|
23
|
+
}
|
|
5
24
|
/**
|
|
6
25
|
* Registry for managing PII recognizers
|
|
7
26
|
*/
|
|
@@ -85,21 +104,26 @@ export class RecognizerRegistry {
|
|
|
85
104
|
const matches = [];
|
|
86
105
|
for (const [type, recognizers] of this.recognizers) {
|
|
87
106
|
// Skip types not enabled in policy
|
|
88
|
-
if (!
|
|
107
|
+
if (!isRegexEnabled(type, policy)) {
|
|
89
108
|
continue;
|
|
90
109
|
}
|
|
91
|
-
//
|
|
92
|
-
|
|
110
|
+
// Check each match's own type too: a recognizer can emit types other
|
|
111
|
+
// than the one it is registered under (createCustomIdRecognizer).
|
|
93
112
|
for (const recognizer of recognizers) {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
for (const match of typeMatches) {
|
|
97
|
-
if (match.confidence >= threshold) {
|
|
113
|
+
for (const match of recognizer.find(text)) {
|
|
114
|
+
if (isRegexMatchEnabled(match, policy))
|
|
98
115
|
matches.push(match);
|
|
99
|
-
}
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
118
|
}
|
|
119
|
+
// Patterns from the policy run per call, under the same rules.
|
|
120
|
+
const customIdPatterns = policy.customIdPatterns ?? [];
|
|
121
|
+
if (customIdPatterns.length > 0) {
|
|
122
|
+
for (const match of createCustomIdRecognizer(customIdPatterns).find(text)) {
|
|
123
|
+
if (isRegexMatchEnabled(match, policy))
|
|
124
|
+
matches.push(match);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
103
127
|
return matches;
|
|
104
128
|
}
|
|
105
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/recognizers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/recognizers/registry.ts"],"names":[],"mappings":"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"}
|