@hackylabs/deep-redact 3.0.2 → 3.0.4
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/{cjs/index.js → index.js} +6 -3
- package/dist/{esm/index.mjs → index.mjs} +3 -2
- package/dist/types/index.d.ts +3 -2
- package/dist/types/types.d.ts +66 -19
- package/dist/types/utils/TransformerRegistry.d.ts +52 -0
- package/dist/types/utils/index.d.ts +9 -15
- package/dist/types/utils/standardTransformers/bigint.d.ts +1 -1
- package/dist/types/utils/standardTransformers/date.d.ts +1 -1
- package/dist/types/utils/standardTransformers/error.d.ts +1 -1
- package/dist/types/utils/standardTransformers/index.d.ts +8 -1
- package/dist/types/utils/standardTransformers/map.d.ts +1 -1
- package/dist/types/utils/standardTransformers/regex.d.ts +1 -1
- package/dist/types/utils/standardTransformers/set.d.ts +1 -1
- package/dist/types/utils/standardTransformers/url.d.ts +1 -1
- package/dist/utils/TransformerRegistry.js +100 -0
- package/dist/utils/TransformerRegistry.mjs +94 -0
- package/dist/{cjs/utils → utils}/index.js +78 -59
- package/dist/{esm/utils → utils}/index.mjs +69 -48
- package/dist/utils/standardTransformers/index.js +38 -0
- package/dist/utils/standardTransformers/index.mjs +35 -0
- package/package.json +51 -43
- package/dist/cjs/utils/standardTransformers/index.js +0 -19
- package/dist/esm/utils/standardTransformers/index.js +0 -16
- /package/dist/{cjs/types.js → types.js} +0 -0
- /package/dist/{esm/types.mjs → types.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/bigint.js +0 -0
- /package/dist/{esm/utils/standardTransformers/bigint.js → utils/standardTransformers/bigint.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/date.js +0 -0
- /package/dist/{esm/utils/standardTransformers/date.js → utils/standardTransformers/date.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/error.js +0 -0
- /package/dist/{esm/utils/standardTransformers/error.js → utils/standardTransformers/error.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/map.js +0 -0
- /package/dist/{esm/utils/standardTransformers/map.js → utils/standardTransformers/map.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/regex.js +0 -0
- /package/dist/{esm/utils/standardTransformers/regex.js → utils/standardTransformers/regex.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/set.js +0 -0
- /package/dist/{esm/utils/standardTransformers/set.js → utils/standardTransformers/set.mjs} +0 -0
- /package/dist/{cjs/utils → utils}/standardTransformers/url.js +0 -0
- /package/dist/{esm/utils/standardTransformers/url.js → utils/standardTransformers/url.mjs} +0 -0
|
@@ -14,8 +14,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.default = exports.DeepRedact = void 0;
|
|
18
|
-
const
|
|
17
|
+
exports.organisedStandardTransformers = exports.standardTransformers = exports.default = exports.DeepRedact = void 0;
|
|
18
|
+
const index_js_1 = require("./utils/standardTransformers/index.js");
|
|
19
|
+
Object.defineProperty(exports, "organisedStandardTransformers", { enumerable: true, get: function () { return index_js_1.organisedStandardTransformers; } });
|
|
20
|
+
Object.defineProperty(exports, "standardTransformers", { enumerable: true, get: function () { return index_js_1.standardTransformers; } });
|
|
21
|
+
const index_js_2 = __importDefault(require("./utils/index.js"));
|
|
19
22
|
class DeepRedact {
|
|
20
23
|
/**
|
|
21
24
|
* Create a new DeepRedact instance with the provided configuration.
|
|
@@ -45,7 +48,7 @@ class DeepRedact {
|
|
|
45
48
|
const englishSerialise = serialise !== null && serialise !== void 0 ? serialise : serialize;
|
|
46
49
|
if (typeof englishSerialise === 'boolean')
|
|
47
50
|
this.config.serialise = englishSerialise;
|
|
48
|
-
this.redactorUtils = new
|
|
51
|
+
this.redactorUtils = new index_js_2.default(Object.assign({}, rest));
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
54
|
exports.DeepRedact = DeepRedact;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { organisedStandardTransformers, standardTransformers } from './utils/standardTransformers/index.mjs';
|
|
2
|
+
import RedactorUtils from './utils/index.mjs';
|
|
2
3
|
class DeepRedact {
|
|
3
4
|
/**
|
|
4
5
|
* The redactorUtils instance to handle the redaction.
|
|
@@ -36,4 +37,4 @@ class DeepRedact {
|
|
|
36
37
|
return this.config.serialise ? JSON.stringify(redacted) : redacted;
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
|
-
export { DeepRedact, DeepRedact as default, };
|
|
40
|
+
export { DeepRedact, DeepRedact as default, standardTransformers, organisedStandardTransformers, };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { DeepRedactConfig, RedactorUtilsConfig, BlacklistKeyConfig, Types, Transformer, ComplexStringTest, BaseDeepRedactConfig } from './types';
|
|
1
|
+
import type { DeepRedactConfig, RedactorUtilsConfig, BlacklistKeyConfig, Types, Transformer, ComplexStringTest, BaseDeepRedactConfig, OrganisedTransformers, TransformerConfig } from './types.js';
|
|
2
|
+
import { organisedStandardTransformers, standardTransformers } from './utils/standardTransformers/index.js';
|
|
2
3
|
declare class DeepRedact {
|
|
3
4
|
/**
|
|
4
5
|
* The redactorUtils instance to handle the redaction.
|
|
@@ -25,4 +26,4 @@ declare class DeepRedact {
|
|
|
25
26
|
*/
|
|
26
27
|
redact: (value: unknown) => unknown;
|
|
27
28
|
}
|
|
28
|
-
export { DeepRedact, DeepRedact as default, type BaseDeepRedactConfig, type RedactorUtilsConfig, type BlacklistKeyConfig, type ComplexStringTest, type Transformer, type Types, };
|
|
29
|
+
export { DeepRedact, DeepRedact as default, type BaseDeepRedactConfig, type RedactorUtilsConfig, type BlacklistKeyConfig, type ComplexStringTest, type Transformer, type Types, type OrganisedTransformers, type TransformerConfig, standardTransformers, organisedStandardTransformers, };
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
export type Types = 'string' | 'number' | 'bigint' | 'boolean' | 'object' | 'function' | 'symbol' | 'undefined';
|
|
2
2
|
export type Transformer = (value: unknown, key?: string, reference?: WeakMap<object, unknown>) => unknown;
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for organised transformers by type and constructor
|
|
5
|
+
*/
|
|
6
|
+
export interface OrganisedTransformers {
|
|
7
|
+
/**
|
|
8
|
+
* Transformers for primitive types (based on typeof result)
|
|
9
|
+
*/
|
|
10
|
+
byType?: {
|
|
11
|
+
bigint?: Transformer[];
|
|
12
|
+
string?: Transformer[];
|
|
13
|
+
number?: Transformer[];
|
|
14
|
+
boolean?: Transformer[];
|
|
15
|
+
symbol?: Transformer[];
|
|
16
|
+
function?: Transformer[];
|
|
17
|
+
object?: Transformer[];
|
|
18
|
+
undefined?: Transformer[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Transformers for specific constructors (based on instanceof checks)
|
|
22
|
+
*/
|
|
23
|
+
byConstructor?: {
|
|
24
|
+
Date?: Transformer[];
|
|
25
|
+
Error?: Transformer[];
|
|
26
|
+
Map?: Transformer[];
|
|
27
|
+
Set?: Transformer[];
|
|
28
|
+
RegExp?: Transformer[];
|
|
29
|
+
URL?: Transformer[];
|
|
30
|
+
[key: string]: Transformer[] | undefined;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Transformers that run on all values (like the current system)
|
|
34
|
+
*/
|
|
35
|
+
fallback?: Transformer[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Transformer configuration - supports both old array format and new organised format
|
|
39
|
+
*/
|
|
40
|
+
export type TransformerConfig = Transformer[] | OrganisedTransformers;
|
|
3
41
|
export interface BlacklistKeyConfig {
|
|
4
42
|
/**
|
|
5
43
|
* Perform a fuzzy match on the key. This will match any key that contains the string, rather than a case-sensitive match.
|
|
@@ -131,25 +169,40 @@ export interface BaseDeepRedactConfig {
|
|
|
131
169
|
*/
|
|
132
170
|
serialize?: boolean;
|
|
133
171
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
172
|
+
* Configuration for transformers to apply when transforming unsupported values.
|
|
173
|
+
* Supports both legacy array format and new organised format for better performance.
|
|
174
|
+
*
|
|
175
|
+
* Legacy format: Array of transformers that run on all values in order
|
|
176
|
+
* New format: Object with transformers organised by type and constructor
|
|
177
|
+
*
|
|
137
178
|
* @default []
|
|
138
|
-
* @example
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* // convert a Date to an ISO string.
|
|
142
|
-
* (value: unknown) => {
|
|
143
|
-
* if (!(value instanceof Date)) return value
|
|
144
|
-
* return value.toISOString()
|
|
145
|
-
* },
|
|
146
|
-
* // convert a BigInt to a string.
|
|
179
|
+
* @example
|
|
180
|
+
* // Legacy format (still supported)
|
|
181
|
+
* [
|
|
147
182
|
* (value: unknown) => {
|
|
148
183
|
* if (typeof value !== 'bigint') return value
|
|
149
184
|
* return value.toString(10)
|
|
185
|
+
* },
|
|
186
|
+
* (value: unknown) => {
|
|
187
|
+
* if (!(value instanceof Date)) return value
|
|
188
|
+
* return value.toISOString()
|
|
150
189
|
* }
|
|
190
|
+
* ]
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* {
|
|
194
|
+
* byType: {
|
|
195
|
+
* bigint: [(value: unknown) => (value as bigint).toString(10)]
|
|
196
|
+
* },
|
|
197
|
+
* byConstructor: {
|
|
198
|
+
* Date: [(value: unknown) => (value as Date).toISOString()]
|
|
199
|
+
* },
|
|
200
|
+
* fallback: [
|
|
201
|
+
* // transformers that run on all values
|
|
202
|
+
* ]
|
|
203
|
+
* }
|
|
151
204
|
*/
|
|
152
|
-
transformers?:
|
|
205
|
+
transformers?: TransformerConfig;
|
|
153
206
|
}
|
|
154
207
|
export type DeepRedactConfig = Partial<Omit<BaseDeepRedactConfig, '_blacklistedKeysTransformed' | 'blacklistedKeys' | 'stringTests'>> & ({
|
|
155
208
|
blacklistedKeys: BaseDeepRedactConfig['blacklistedKeys'];
|
|
@@ -169,9 +222,3 @@ export type Stack = Array<{
|
|
|
169
222
|
redactingParent: boolean;
|
|
170
223
|
keyConfig: BlacklistKeyConfig | undefined;
|
|
171
224
|
}>;
|
|
172
|
-
export type Logs = Array<{
|
|
173
|
-
path: string;
|
|
174
|
-
message: string;
|
|
175
|
-
raw: unknown;
|
|
176
|
-
transformed: unknown;
|
|
177
|
-
}> | null;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Transformer } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for organizing transformers by type and constructor for efficient lookup
|
|
4
|
+
*/
|
|
5
|
+
export declare class TransformerRegistry {
|
|
6
|
+
private typeTransformers;
|
|
7
|
+
private constructorTransformers;
|
|
8
|
+
private fallbackTransformers;
|
|
9
|
+
/**
|
|
10
|
+
* Add a transformer for a specific typeof result
|
|
11
|
+
* @param type - The typeof result (e.g., 'bigint', 'string', etc.)
|
|
12
|
+
* @param transformer - The transformer function
|
|
13
|
+
*/
|
|
14
|
+
addTypeTransformer(type: string, transformer: Transformer): void;
|
|
15
|
+
/**
|
|
16
|
+
* Add a transformer for a specific constructor
|
|
17
|
+
* @param constructor - The constructor function (e.g., Date, Error, etc.)
|
|
18
|
+
* @param transformer - The transformer function
|
|
19
|
+
*/
|
|
20
|
+
addConstructorTransformer(constructor: Function, transformer: Transformer): void;
|
|
21
|
+
/**
|
|
22
|
+
* Add a fallback transformer that runs on all values
|
|
23
|
+
* @param transformer - The transformer function
|
|
24
|
+
*/
|
|
25
|
+
addFallbackTransformer(transformer: Transformer): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get relevant transformers for a value
|
|
28
|
+
* @param value - The value to get transformers for
|
|
29
|
+
* @returns Array of relevant transformers
|
|
30
|
+
*/
|
|
31
|
+
getTransformersForValue(value: unknown): Transformer[];
|
|
32
|
+
/**
|
|
33
|
+
* Apply transformers to a value
|
|
34
|
+
* @param value - The value to transform
|
|
35
|
+
* @param key - The key (optional)
|
|
36
|
+
* @param referenceMap - Reference map for circular references (optional)
|
|
37
|
+
* @returns The transformed value
|
|
38
|
+
*/
|
|
39
|
+
applyTransformers(value: unknown, key?: string, referenceMap?: WeakMap<object, string>): unknown;
|
|
40
|
+
/**
|
|
41
|
+
* Clear all transformers
|
|
42
|
+
*/
|
|
43
|
+
clear(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Get all registered transformers for debugging
|
|
46
|
+
*/
|
|
47
|
+
getRegisteredTransformers(): {
|
|
48
|
+
types: Map<string, Transformer[]>;
|
|
49
|
+
constructors: Map<Function, Transformer[]>;
|
|
50
|
+
fallback: Transformer[];
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RedactorUtilsConfig } from '../types';
|
|
1
|
+
import type { RedactorUtilsConfig } from '../types.js';
|
|
2
2
|
declare class RedactorUtils {
|
|
3
3
|
/**
|
|
4
4
|
* The configuration for the redaction.
|
|
@@ -6,21 +6,22 @@ declare class RedactorUtils {
|
|
|
6
6
|
*/
|
|
7
7
|
private readonly config;
|
|
8
8
|
/**
|
|
9
|
-
* The
|
|
9
|
+
* The transformed blacklist keys of flat regex patterns and complex config objects
|
|
10
10
|
* @private
|
|
11
11
|
*/
|
|
12
|
-
private readonly
|
|
12
|
+
private readonly blacklistedKeysTransformed;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* The transformer registry for efficient transformer lookup
|
|
15
15
|
* @private
|
|
16
16
|
*/
|
|
17
|
-
private readonly
|
|
17
|
+
private readonly transformerRegistry;
|
|
18
|
+
constructor(customConfig: RedactorUtilsConfig);
|
|
18
19
|
/**
|
|
19
|
-
*
|
|
20
|
+
* Sets up the transformer registry based on the configuration
|
|
21
|
+
* @param transformers - The transformer configuration
|
|
20
22
|
* @private
|
|
21
23
|
*/
|
|
22
|
-
private
|
|
23
|
-
constructor(customConfig: RedactorUtilsConfig);
|
|
24
|
+
private setupTransformerRegistry;
|
|
24
25
|
private createTransformedBlacklistedKey;
|
|
25
26
|
/**
|
|
26
27
|
* Applies transformers to a value
|
|
@@ -30,13 +31,6 @@ declare class RedactorUtils {
|
|
|
30
31
|
* @private
|
|
31
32
|
*/
|
|
32
33
|
private applyTransformers;
|
|
33
|
-
/**
|
|
34
|
-
* Sanitises a string for the computed regex
|
|
35
|
-
* @param key - The string to sanitise
|
|
36
|
-
* @returns The sanitised string
|
|
37
|
-
* @private
|
|
38
|
-
*/
|
|
39
|
-
private sanitiseStringForRegex;
|
|
40
34
|
/**
|
|
41
35
|
* Checks if a key should be redacted
|
|
42
36
|
* @param key - The key to check
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from '../../types';
|
|
1
|
+
import type { Transformer } from '../../types.js';
|
|
2
2
|
export declare const _bigint: Transformer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _date: Transformer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _error: Transformer;
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import type { Transformer } from "
|
|
1
|
+
import type { Transformer, OrganisedTransformers } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Standard transformers in array for legacy support
|
|
4
|
+
*/
|
|
2
5
|
export declare const standardTransformers: Transformer[];
|
|
6
|
+
/**
|
|
7
|
+
* Standard transformers organised by type and constructor for performance reasons
|
|
8
|
+
*/
|
|
9
|
+
export declare const organisedStandardTransformers: OrganisedTransformers;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _map: Transformer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _regex: Transformer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _set: Transformer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Transformer } from "../../types";
|
|
1
|
+
import type { Transformer } from "../../types.js";
|
|
2
2
|
export declare const _url: Transformer;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransformerRegistry = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Registry for organizing transformers by type and constructor for efficient lookup
|
|
6
|
+
*/
|
|
7
|
+
class TransformerRegistry {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.typeTransformers = new Map();
|
|
10
|
+
this.constructorTransformers = new Map();
|
|
11
|
+
this.fallbackTransformers = [];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Add a transformer for a specific typeof result
|
|
15
|
+
* @param type - The typeof result (e.g., 'bigint', 'string', etc.)
|
|
16
|
+
* @param transformer - The transformer function
|
|
17
|
+
*/
|
|
18
|
+
addTypeTransformer(type, transformer) {
|
|
19
|
+
if (!this.typeTransformers.has(type)) {
|
|
20
|
+
this.typeTransformers.set(type, []);
|
|
21
|
+
}
|
|
22
|
+
this.typeTransformers.get(type).push(transformer);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Add a transformer for a specific constructor
|
|
26
|
+
* @param constructor - The constructor function (e.g., Date, Error, etc.)
|
|
27
|
+
* @param transformer - The transformer function
|
|
28
|
+
*/
|
|
29
|
+
addConstructorTransformer(constructor, transformer) {
|
|
30
|
+
if (!this.constructorTransformers.has(constructor)) {
|
|
31
|
+
this.constructorTransformers.set(constructor, []);
|
|
32
|
+
}
|
|
33
|
+
this.constructorTransformers.get(constructor).push(transformer);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add a fallback transformer that runs on all values
|
|
37
|
+
* @param transformer - The transformer function
|
|
38
|
+
*/
|
|
39
|
+
addFallbackTransformer(transformer) {
|
|
40
|
+
this.fallbackTransformers.push(transformer);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get relevant transformers for a value
|
|
44
|
+
* @param value - The value to get transformers for
|
|
45
|
+
* @returns Array of relevant transformers
|
|
46
|
+
*/
|
|
47
|
+
getTransformersForValue(value) {
|
|
48
|
+
const transformers = [];
|
|
49
|
+
const type = typeof value;
|
|
50
|
+
if (this.typeTransformers.has(type)) {
|
|
51
|
+
transformers.push(...this.typeTransformers.get(type));
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === 'object' && value !== null) {
|
|
54
|
+
const constructor = value.constructor;
|
|
55
|
+
if (this.constructorTransformers.has(constructor)) {
|
|
56
|
+
transformers.push(...this.constructorTransformers.get(constructor));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
transformers.push(...this.fallbackTransformers);
|
|
60
|
+
return transformers;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Apply transformers to a value
|
|
64
|
+
* @param value - The value to transform
|
|
65
|
+
* @param key - The key (optional)
|
|
66
|
+
* @param referenceMap - Reference map for circular references (optional)
|
|
67
|
+
* @returns The transformed value
|
|
68
|
+
*/
|
|
69
|
+
applyTransformers(value, key, referenceMap) {
|
|
70
|
+
if (typeof value === 'string')
|
|
71
|
+
return value;
|
|
72
|
+
const transformers = this.getTransformersForValue(value);
|
|
73
|
+
for (const transformer of transformers) {
|
|
74
|
+
const transformed = transformer(value, key, referenceMap);
|
|
75
|
+
if (transformed !== value) {
|
|
76
|
+
return transformed;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Clear all transformers
|
|
83
|
+
*/
|
|
84
|
+
clear() {
|
|
85
|
+
this.typeTransformers.clear();
|
|
86
|
+
this.constructorTransformers.clear();
|
|
87
|
+
this.fallbackTransformers = [];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get all registered transformers for debugging
|
|
91
|
+
*/
|
|
92
|
+
getRegisteredTransformers() {
|
|
93
|
+
return {
|
|
94
|
+
types: new Map(this.typeTransformers),
|
|
95
|
+
constructors: new Map(this.constructorTransformers),
|
|
96
|
+
fallback: [...this.fallbackTransformers]
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.TransformerRegistry = TransformerRegistry;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for organizing transformers by type and constructor for efficient lookup
|
|
3
|
+
*/
|
|
4
|
+
export class TransformerRegistry {
|
|
5
|
+
typeTransformers = new Map();
|
|
6
|
+
constructorTransformers = new Map();
|
|
7
|
+
fallbackTransformers = [];
|
|
8
|
+
/**
|
|
9
|
+
* Add a transformer for a specific typeof result
|
|
10
|
+
* @param type - The typeof result (e.g., 'bigint', 'string', etc.)
|
|
11
|
+
* @param transformer - The transformer function
|
|
12
|
+
*/
|
|
13
|
+
addTypeTransformer(type, transformer) {
|
|
14
|
+
if (!this.typeTransformers.has(type)) {
|
|
15
|
+
this.typeTransformers.set(type, []);
|
|
16
|
+
}
|
|
17
|
+
this.typeTransformers.get(type).push(transformer);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Add a transformer for a specific constructor
|
|
21
|
+
* @param constructor - The constructor function (e.g., Date, Error, etc.)
|
|
22
|
+
* @param transformer - The transformer function
|
|
23
|
+
*/
|
|
24
|
+
addConstructorTransformer(constructor, transformer) {
|
|
25
|
+
if (!this.constructorTransformers.has(constructor)) {
|
|
26
|
+
this.constructorTransformers.set(constructor, []);
|
|
27
|
+
}
|
|
28
|
+
this.constructorTransformers.get(constructor).push(transformer);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add a fallback transformer that runs on all values
|
|
32
|
+
* @param transformer - The transformer function
|
|
33
|
+
*/
|
|
34
|
+
addFallbackTransformer(transformer) {
|
|
35
|
+
this.fallbackTransformers.push(transformer);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get relevant transformers for a value
|
|
39
|
+
* @param value - The value to get transformers for
|
|
40
|
+
* @returns Array of relevant transformers
|
|
41
|
+
*/
|
|
42
|
+
getTransformersForValue(value) {
|
|
43
|
+
const transformers = [];
|
|
44
|
+
const type = typeof value;
|
|
45
|
+
if (this.typeTransformers.has(type)) {
|
|
46
|
+
transformers.push(...this.typeTransformers.get(type));
|
|
47
|
+
}
|
|
48
|
+
if (typeof value === 'object' && value !== null) {
|
|
49
|
+
const constructor = value.constructor;
|
|
50
|
+
if (this.constructorTransformers.has(constructor)) {
|
|
51
|
+
transformers.push(...this.constructorTransformers.get(constructor));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
transformers.push(...this.fallbackTransformers);
|
|
55
|
+
return transformers;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply transformers to a value
|
|
59
|
+
* @param value - The value to transform
|
|
60
|
+
* @param key - The key (optional)
|
|
61
|
+
* @param referenceMap - Reference map for circular references (optional)
|
|
62
|
+
* @returns The transformed value
|
|
63
|
+
*/
|
|
64
|
+
applyTransformers(value, key, referenceMap) {
|
|
65
|
+
if (typeof value === 'string')
|
|
66
|
+
return value;
|
|
67
|
+
const transformers = this.getTransformersForValue(value);
|
|
68
|
+
for (const transformer of transformers) {
|
|
69
|
+
const transformed = transformer(value, key, referenceMap);
|
|
70
|
+
if (transformed !== value) {
|
|
71
|
+
return transformed;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clear all transformers
|
|
78
|
+
*/
|
|
79
|
+
clear() {
|
|
80
|
+
this.typeTransformers.clear();
|
|
81
|
+
this.constructorTransformers.clear();
|
|
82
|
+
this.fallbackTransformers = [];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all registered transformers for debugging
|
|
86
|
+
*/
|
|
87
|
+
getRegisteredTransformers() {
|
|
88
|
+
return {
|
|
89
|
+
types: new Map(this.typeTransformers),
|
|
90
|
+
constructors: new Map(this.constructorTransformers),
|
|
91
|
+
fallback: [...this.fallbackTransformers]
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const index_js_1 = require("./standardTransformers/index.js");
|
|
4
|
+
const TransformerRegistry_js_1 = require("./TransformerRegistry.js");
|
|
4
5
|
const defaultConfig = {
|
|
5
6
|
stringTests: [],
|
|
6
7
|
blacklistedKeys: [],
|
|
@@ -11,33 +12,28 @@ const defaultConfig = {
|
|
|
11
12
|
replaceStringByLength: false,
|
|
12
13
|
replacement: '[REDACTED]',
|
|
13
14
|
types: ['string'],
|
|
14
|
-
transformers:
|
|
15
|
+
transformers: index_js_1.standardTransformers,
|
|
15
16
|
};
|
|
16
17
|
class RedactorUtils {
|
|
17
18
|
constructor(customConfig) {
|
|
18
|
-
var _a
|
|
19
|
+
var _a;
|
|
19
20
|
/**
|
|
20
21
|
* The configuration for the redaction.
|
|
21
22
|
* @private
|
|
22
23
|
*/
|
|
23
24
|
this.config = defaultConfig;
|
|
24
25
|
/**
|
|
25
|
-
* The
|
|
26
|
-
* @private
|
|
27
|
-
*/
|
|
28
|
-
this.computedRegex = null;
|
|
29
|
-
/**
|
|
30
|
-
* Regex to sanitise strings for the computed regex
|
|
26
|
+
* The transformed blacklist keys of flat regex patterns and complex config objects
|
|
31
27
|
* @private
|
|
32
28
|
*/
|
|
33
|
-
this.
|
|
29
|
+
this.blacklistedKeysTransformed = [];
|
|
34
30
|
/**
|
|
35
|
-
* The
|
|
31
|
+
* The transformer registry for efficient transformer lookup
|
|
36
32
|
* @private
|
|
37
33
|
*/
|
|
38
|
-
this.
|
|
34
|
+
this.transformerRegistry = new TransformerRegistry_js_1.TransformerRegistry();
|
|
39
35
|
this.createTransformedBlacklistedKey = (key, customConfig) => {
|
|
40
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
|
|
36
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
|
|
41
37
|
if (key instanceof RegExp) {
|
|
42
38
|
return {
|
|
43
39
|
key,
|
|
@@ -49,13 +45,24 @@ class RedactorUtils {
|
|
|
49
45
|
remove: (_f = customConfig.remove) !== null && _f !== void 0 ? _f : defaultConfig.remove,
|
|
50
46
|
};
|
|
51
47
|
}
|
|
48
|
+
if (typeof key === 'string') {
|
|
49
|
+
return {
|
|
50
|
+
key,
|
|
51
|
+
fuzzyKeyMatch: (_g = customConfig.fuzzyKeyMatch) !== null && _g !== void 0 ? _g : defaultConfig.fuzzyKeyMatch,
|
|
52
|
+
caseSensitiveKeyMatch: (_h = customConfig.caseSensitiveKeyMatch) !== null && _h !== void 0 ? _h : defaultConfig.caseSensitiveKeyMatch,
|
|
53
|
+
retainStructure: (_j = customConfig.retainStructure) !== null && _j !== void 0 ? _j : defaultConfig.retainStructure,
|
|
54
|
+
replacement: (_k = customConfig.replacement) !== null && _k !== void 0 ? _k : defaultConfig.replacement,
|
|
55
|
+
replaceStringByLength: (_l = customConfig.replaceStringByLength) !== null && _l !== void 0 ? _l : defaultConfig.replaceStringByLength,
|
|
56
|
+
remove: (_m = customConfig.remove) !== null && _m !== void 0 ? _m : defaultConfig.remove,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
52
59
|
return {
|
|
53
|
-
fuzzyKeyMatch: (
|
|
54
|
-
caseSensitiveKeyMatch: (
|
|
55
|
-
retainStructure: (
|
|
56
|
-
replacement: (
|
|
57
|
-
replaceStringByLength: (
|
|
58
|
-
remove: (
|
|
60
|
+
fuzzyKeyMatch: (_p = (_o = key.fuzzyKeyMatch) !== null && _o !== void 0 ? _o : customConfig.fuzzyKeyMatch) !== null && _p !== void 0 ? _p : defaultConfig.fuzzyKeyMatch,
|
|
61
|
+
caseSensitiveKeyMatch: (_r = (_q = key.caseSensitiveKeyMatch) !== null && _q !== void 0 ? _q : customConfig.caseSensitiveKeyMatch) !== null && _r !== void 0 ? _r : defaultConfig.caseSensitiveKeyMatch,
|
|
62
|
+
retainStructure: (_t = (_s = key.retainStructure) !== null && _s !== void 0 ? _s : customConfig.retainStructure) !== null && _t !== void 0 ? _t : defaultConfig.retainStructure,
|
|
63
|
+
replacement: (_v = (_u = key.replacement) !== null && _u !== void 0 ? _u : customConfig.replacement) !== null && _v !== void 0 ? _v : defaultConfig.replacement,
|
|
64
|
+
replaceStringByLength: (_x = (_w = key.replaceStringByLength) !== null && _w !== void 0 ? _w : customConfig.replaceStringByLength) !== null && _x !== void 0 ? _x : defaultConfig.replaceStringByLength,
|
|
65
|
+
remove: (_z = (_y = key.remove) !== null && _y !== void 0 ? _y : customConfig.remove) !== null && _z !== void 0 ? _z : defaultConfig.remove,
|
|
59
66
|
key: key.key,
|
|
60
67
|
};
|
|
61
68
|
};
|
|
@@ -67,23 +74,8 @@ class RedactorUtils {
|
|
|
67
74
|
* @private
|
|
68
75
|
*/
|
|
69
76
|
this.applyTransformers = (value, key, referenceMap) => {
|
|
70
|
-
|
|
71
|
-
return value;
|
|
72
|
-
let transformed = value;
|
|
73
|
-
for (const transformer of this.config.transformers) {
|
|
74
|
-
transformed = transformer(transformed, key, referenceMap);
|
|
75
|
-
if (transformed !== value)
|
|
76
|
-
return transformed;
|
|
77
|
-
}
|
|
78
|
-
return value;
|
|
77
|
+
return this.transformerRegistry.applyTransformers(value, key, referenceMap);
|
|
79
78
|
};
|
|
80
|
-
/**
|
|
81
|
-
* Sanitises a string for the computed regex
|
|
82
|
-
* @param key - The string to sanitise
|
|
83
|
-
* @returns The sanitised string
|
|
84
|
-
* @private
|
|
85
|
-
*/
|
|
86
|
-
this.sanitiseStringForRegex = (key) => key.replace(this.sanitiseRegex, '');
|
|
87
79
|
/**
|
|
88
80
|
* Checks if a key should be redacted
|
|
89
81
|
* @param key - The key to check
|
|
@@ -91,17 +83,14 @@ class RedactorUtils {
|
|
|
91
83
|
* @private
|
|
92
84
|
*/
|
|
93
85
|
this.shouldRedactKey = (key) => {
|
|
94
|
-
var _a;
|
|
95
|
-
if ((_a = this.computedRegex) === null || _a === void 0 ? void 0 : _a.test(this.sanitiseStringForRegex(key)))
|
|
96
|
-
return true;
|
|
97
86
|
return this.blacklistedKeysTransformed.some(config => {
|
|
98
87
|
const pattern = config.key;
|
|
99
88
|
if (pattern instanceof RegExp)
|
|
100
89
|
return pattern.test(key);
|
|
101
90
|
if (!config.fuzzyKeyMatch && !config.caseSensitiveKeyMatch)
|
|
102
|
-
return key.toLowerCase() === pattern.toLowerCase();
|
|
91
|
+
return key.toLowerCase().trim().replace(/[_-]/g, '') === pattern.toLowerCase().trim().replace(/[_-]/g, '');
|
|
103
92
|
if (config.fuzzyKeyMatch && !config.caseSensitiveKeyMatch)
|
|
104
|
-
return key.toLowerCase().includes(pattern.toLowerCase());
|
|
93
|
+
return key.toLowerCase().trim().replace(/[_-]/g, '').includes(pattern.toLowerCase().trim().replace(/[_-]/g, ''));
|
|
105
94
|
if (config.fuzzyKeyMatch && config.caseSensitiveKeyMatch)
|
|
106
95
|
return key.includes(pattern);
|
|
107
96
|
if (!config.fuzzyKeyMatch && config.caseSensitiveKeyMatch)
|
|
@@ -188,10 +177,50 @@ class RedactorUtils {
|
|
|
188
177
|
return output;
|
|
189
178
|
};
|
|
190
179
|
this.config = Object.assign(Object.assign({}, defaultConfig), customConfig);
|
|
191
|
-
this.blacklistedKeysTransformed = ((_a = customConfig.blacklistedKeys) !== null && _a !== void 0 ? _a : []).
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
180
|
+
this.blacklistedKeysTransformed = ((_a = customConfig.blacklistedKeys) !== null && _a !== void 0 ? _a : []).map((key) => this.createTransformedBlacklistedKey(key, customConfig));
|
|
181
|
+
this.setupTransformerRegistry(this.config.transformers);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Sets up the transformer registry based on the configuration
|
|
185
|
+
* @param transformers - The transformer configuration
|
|
186
|
+
* @private
|
|
187
|
+
*/
|
|
188
|
+
setupTransformerRegistry(transformers) {
|
|
189
|
+
if (Array.isArray(transformers)) {
|
|
190
|
+
transformers.forEach(transformer => { this.transformerRegistry.addFallbackTransformer(transformer); });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const organised = transformers;
|
|
194
|
+
if (organised.byType) {
|
|
195
|
+
Object.entries(organised.byType).forEach(([type, typeTransformers]) => {
|
|
196
|
+
if (typeTransformers) {
|
|
197
|
+
typeTransformers.forEach(transformer => {
|
|
198
|
+
this.transformerRegistry.addTypeTransformer(type, transformer);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (organised.byConstructor) {
|
|
204
|
+
Object.entries(organised.byConstructor).forEach(([constructorName, constructorTransformers]) => {
|
|
205
|
+
if (constructorTransformers) {
|
|
206
|
+
const constructorMap = {
|
|
207
|
+
Date,
|
|
208
|
+
Error,
|
|
209
|
+
Map,
|
|
210
|
+
Set,
|
|
211
|
+
RegExp,
|
|
212
|
+
URL,
|
|
213
|
+
};
|
|
214
|
+
const constructor = constructorMap[constructorName];
|
|
215
|
+
if (constructor) {
|
|
216
|
+
constructorTransformers.forEach(transformer => {
|
|
217
|
+
this.transformerRegistry.addConstructorTransformer(constructor, transformer);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
195
224
|
}
|
|
196
225
|
/**
|
|
197
226
|
* Applies string transformations
|
|
@@ -311,28 +340,18 @@ class RedactorUtils {
|
|
|
311
340
|
* @private
|
|
312
341
|
*/
|
|
313
342
|
findMatchingKeyConfig(key) {
|
|
314
|
-
var _a;
|
|
315
|
-
if ((_a = this.computedRegex) === null || _a === void 0 ? void 0 : _a.test(key)) {
|
|
316
|
-
return {
|
|
317
|
-
key,
|
|
318
|
-
fuzzyKeyMatch: this.config.fuzzyKeyMatch,
|
|
319
|
-
caseSensitiveKeyMatch: this.config.caseSensitiveKeyMatch,
|
|
320
|
-
replaceStringByLength: this.config.replaceStringByLength,
|
|
321
|
-
replacement: this.config.replacement,
|
|
322
|
-
retainStructure: this.config.retainStructure,
|
|
323
|
-
remove: this.config.remove,
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
343
|
return this.blacklistedKeysTransformed.find(config => {
|
|
327
344
|
const pattern = config.key;
|
|
328
345
|
if (pattern instanceof RegExp)
|
|
329
346
|
return pattern.test(key);
|
|
347
|
+
const normalisedKey = key.toLowerCase().trim().replace(/[_-]/g, '');
|
|
348
|
+
const normalisedPattern = pattern.toLowerCase().trim().replace(/[_-]/g, '');
|
|
330
349
|
if (config.fuzzyKeyMatch) {
|
|
331
|
-
const compareKey = config.caseSensitiveKeyMatch ? key :
|
|
332
|
-
const comparePattern = config.caseSensitiveKeyMatch ? pattern :
|
|
350
|
+
const compareKey = config.caseSensitiveKeyMatch ? key : normalisedKey;
|
|
351
|
+
const comparePattern = config.caseSensitiveKeyMatch ? pattern : normalisedPattern;
|
|
333
352
|
return compareKey.includes(comparePattern);
|
|
334
353
|
}
|
|
335
|
-
return config.caseSensitiveKeyMatch ? key === pattern :
|
|
354
|
+
return config.caseSensitiveKeyMatch ? key === pattern : normalisedKey === normalisedPattern;
|
|
336
355
|
});
|
|
337
356
|
}
|
|
338
357
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { standardTransformers } from './standardTransformers';
|
|
1
|
+
import { standardTransformers } from './standardTransformers/index.mjs';
|
|
2
|
+
import { TransformerRegistry } from './TransformerRegistry.mjs';
|
|
2
3
|
const defaultConfig = {
|
|
3
4
|
stringTests: [],
|
|
4
5
|
blacklistedKeys: [],
|
|
@@ -18,29 +19,64 @@ class RedactorUtils {
|
|
|
18
19
|
*/
|
|
19
20
|
config = defaultConfig;
|
|
20
21
|
/**
|
|
21
|
-
* The
|
|
22
|
-
* @private
|
|
23
|
-
*/
|
|
24
|
-
computedRegex = null;
|
|
25
|
-
/**
|
|
26
|
-
* Regex to sanitise strings for the computed regex
|
|
22
|
+
* The transformed blacklist keys of flat regex patterns and complex config objects
|
|
27
23
|
* @private
|
|
28
24
|
*/
|
|
29
|
-
|
|
25
|
+
blacklistedKeysTransformed = [];
|
|
30
26
|
/**
|
|
31
|
-
* The
|
|
27
|
+
* The transformer registry for efficient transformer lookup
|
|
32
28
|
* @private
|
|
33
29
|
*/
|
|
34
|
-
|
|
30
|
+
transformerRegistry = new TransformerRegistry();
|
|
35
31
|
constructor(customConfig) {
|
|
36
32
|
this.config = {
|
|
37
33
|
...defaultConfig,
|
|
38
34
|
...customConfig,
|
|
39
35
|
};
|
|
40
|
-
this.blacklistedKeysTransformed = (customConfig.blacklistedKeys ?? []).
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
this.blacklistedKeysTransformed = (customConfig.blacklistedKeys ?? []).map((key) => this.createTransformedBlacklistedKey(key, customConfig));
|
|
37
|
+
this.setupTransformerRegistry(this.config.transformers);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Sets up the transformer registry based on the configuration
|
|
41
|
+
* @param transformers - The transformer configuration
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
setupTransformerRegistry(transformers) {
|
|
45
|
+
if (Array.isArray(transformers)) {
|
|
46
|
+
transformers.forEach(transformer => { this.transformerRegistry.addFallbackTransformer(transformer); });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const organised = transformers;
|
|
50
|
+
if (organised.byType) {
|
|
51
|
+
Object.entries(organised.byType).forEach(([type, typeTransformers]) => {
|
|
52
|
+
if (typeTransformers) {
|
|
53
|
+
typeTransformers.forEach(transformer => {
|
|
54
|
+
this.transformerRegistry.addTypeTransformer(type, transformer);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (organised.byConstructor) {
|
|
60
|
+
Object.entries(organised.byConstructor).forEach(([constructorName, constructorTransformers]) => {
|
|
61
|
+
if (constructorTransformers) {
|
|
62
|
+
const constructorMap = {
|
|
63
|
+
Date,
|
|
64
|
+
Error,
|
|
65
|
+
Map,
|
|
66
|
+
Set,
|
|
67
|
+
RegExp,
|
|
68
|
+
URL,
|
|
69
|
+
};
|
|
70
|
+
const constructor = constructorMap[constructorName];
|
|
71
|
+
if (constructor) {
|
|
72
|
+
constructorTransformers.forEach(transformer => {
|
|
73
|
+
this.transformerRegistry.addConstructorTransformer(constructor, transformer);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
44
80
|
}
|
|
45
81
|
createTransformedBlacklistedKey = (key, customConfig) => {
|
|
46
82
|
if (key instanceof RegExp) {
|
|
@@ -54,6 +90,17 @@ class RedactorUtils {
|
|
|
54
90
|
remove: customConfig.remove ?? defaultConfig.remove,
|
|
55
91
|
};
|
|
56
92
|
}
|
|
93
|
+
if (typeof key === 'string') {
|
|
94
|
+
return {
|
|
95
|
+
key,
|
|
96
|
+
fuzzyKeyMatch: customConfig.fuzzyKeyMatch ?? defaultConfig.fuzzyKeyMatch,
|
|
97
|
+
caseSensitiveKeyMatch: customConfig.caseSensitiveKeyMatch ?? defaultConfig.caseSensitiveKeyMatch,
|
|
98
|
+
retainStructure: customConfig.retainStructure ?? defaultConfig.retainStructure,
|
|
99
|
+
replacement: customConfig.replacement ?? defaultConfig.replacement,
|
|
100
|
+
replaceStringByLength: customConfig.replaceStringByLength ?? defaultConfig.replaceStringByLength,
|
|
101
|
+
remove: customConfig.remove ?? defaultConfig.remove,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
57
104
|
return {
|
|
58
105
|
fuzzyKeyMatch: key.fuzzyKeyMatch ?? customConfig.fuzzyKeyMatch ?? defaultConfig.fuzzyKeyMatch,
|
|
59
106
|
caseSensitiveKeyMatch: key.caseSensitiveKeyMatch ?? customConfig.caseSensitiveKeyMatch ?? defaultConfig.caseSensitiveKeyMatch,
|
|
@@ -72,23 +119,8 @@ class RedactorUtils {
|
|
|
72
119
|
* @private
|
|
73
120
|
*/
|
|
74
121
|
applyTransformers = (value, key, referenceMap) => {
|
|
75
|
-
|
|
76
|
-
return value;
|
|
77
|
-
let transformed = value;
|
|
78
|
-
for (const transformer of this.config.transformers) {
|
|
79
|
-
transformed = transformer(transformed, key, referenceMap);
|
|
80
|
-
if (transformed !== value)
|
|
81
|
-
return transformed;
|
|
82
|
-
}
|
|
83
|
-
return value;
|
|
122
|
+
return this.transformerRegistry.applyTransformers(value, key, referenceMap);
|
|
84
123
|
};
|
|
85
|
-
/**
|
|
86
|
-
* Sanitises a string for the computed regex
|
|
87
|
-
* @param key - The string to sanitise
|
|
88
|
-
* @returns The sanitised string
|
|
89
|
-
* @private
|
|
90
|
-
*/
|
|
91
|
-
sanitiseStringForRegex = (key) => key.replace(this.sanitiseRegex, '');
|
|
92
124
|
/**
|
|
93
125
|
* Checks if a key should be redacted
|
|
94
126
|
* @param key - The key to check
|
|
@@ -96,16 +128,14 @@ class RedactorUtils {
|
|
|
96
128
|
* @private
|
|
97
129
|
*/
|
|
98
130
|
shouldRedactKey = (key) => {
|
|
99
|
-
if (this.computedRegex?.test(this.sanitiseStringForRegex(key)))
|
|
100
|
-
return true;
|
|
101
131
|
return this.blacklistedKeysTransformed.some(config => {
|
|
102
132
|
const pattern = config.key;
|
|
103
133
|
if (pattern instanceof RegExp)
|
|
104
134
|
return pattern.test(key);
|
|
105
135
|
if (!config.fuzzyKeyMatch && !config.caseSensitiveKeyMatch)
|
|
106
|
-
return key.toLowerCase() === pattern.toLowerCase();
|
|
136
|
+
return key.toLowerCase().trim().replace(/[_-]/g, '') === pattern.toLowerCase().trim().replace(/[_-]/g, '');
|
|
107
137
|
if (config.fuzzyKeyMatch && !config.caseSensitiveKeyMatch)
|
|
108
|
-
return key.toLowerCase().includes(pattern.toLowerCase());
|
|
138
|
+
return key.toLowerCase().trim().replace(/[_-]/g, '').includes(pattern.toLowerCase().trim().replace(/[_-]/g, ''));
|
|
109
139
|
if (config.fuzzyKeyMatch && config.caseSensitiveKeyMatch)
|
|
110
140
|
return key.includes(pattern);
|
|
111
141
|
if (!config.fuzzyKeyMatch && config.caseSensitiveKeyMatch)
|
|
@@ -268,27 +298,18 @@ class RedactorUtils {
|
|
|
268
298
|
* @private
|
|
269
299
|
*/
|
|
270
300
|
findMatchingKeyConfig(key) {
|
|
271
|
-
if (this.computedRegex?.test(key)) {
|
|
272
|
-
return {
|
|
273
|
-
key,
|
|
274
|
-
fuzzyKeyMatch: this.config.fuzzyKeyMatch,
|
|
275
|
-
caseSensitiveKeyMatch: this.config.caseSensitiveKeyMatch,
|
|
276
|
-
replaceStringByLength: this.config.replaceStringByLength,
|
|
277
|
-
replacement: this.config.replacement,
|
|
278
|
-
retainStructure: this.config.retainStructure,
|
|
279
|
-
remove: this.config.remove,
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
301
|
return this.blacklistedKeysTransformed.find(config => {
|
|
283
302
|
const pattern = config.key;
|
|
284
303
|
if (pattern instanceof RegExp)
|
|
285
304
|
return pattern.test(key);
|
|
305
|
+
const normalisedKey = key.toLowerCase().trim().replace(/[_-]/g, '');
|
|
306
|
+
const normalisedPattern = pattern.toLowerCase().trim().replace(/[_-]/g, '');
|
|
286
307
|
if (config.fuzzyKeyMatch) {
|
|
287
|
-
const compareKey = config.caseSensitiveKeyMatch ? key :
|
|
288
|
-
const comparePattern = config.caseSensitiveKeyMatch ? pattern :
|
|
308
|
+
const compareKey = config.caseSensitiveKeyMatch ? key : normalisedKey;
|
|
309
|
+
const comparePattern = config.caseSensitiveKeyMatch ? pattern : normalisedPattern;
|
|
289
310
|
return compareKey.includes(comparePattern);
|
|
290
311
|
}
|
|
291
|
-
return config.caseSensitiveKeyMatch ? key === pattern :
|
|
312
|
+
return config.caseSensitiveKeyMatch ? key === pattern : normalisedKey === normalisedPattern;
|
|
292
313
|
});
|
|
293
314
|
}
|
|
294
315
|
/**
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.organisedStandardTransformers = exports.standardTransformers = void 0;
|
|
4
|
+
const bigint_js_1 = require("./bigint.js");
|
|
5
|
+
const date_js_1 = require("./date.js");
|
|
6
|
+
const error_js_1 = require("./error.js");
|
|
7
|
+
const map_js_1 = require("./map.js");
|
|
8
|
+
const regex_js_1 = require("./regex.js");
|
|
9
|
+
const set_js_1 = require("./set.js");
|
|
10
|
+
const url_js_1 = require("./url.js");
|
|
11
|
+
/**
|
|
12
|
+
* Standard transformers in array for legacy support
|
|
13
|
+
*/
|
|
14
|
+
exports.standardTransformers = [
|
|
15
|
+
bigint_js_1._bigint,
|
|
16
|
+
date_js_1._date,
|
|
17
|
+
error_js_1._error,
|
|
18
|
+
map_js_1._map,
|
|
19
|
+
regex_js_1._regex,
|
|
20
|
+
set_js_1._set,
|
|
21
|
+
url_js_1._url,
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Standard transformers organised by type and constructor for performance reasons
|
|
25
|
+
*/
|
|
26
|
+
exports.organisedStandardTransformers = {
|
|
27
|
+
byType: {
|
|
28
|
+
bigint: [bigint_js_1._bigint],
|
|
29
|
+
},
|
|
30
|
+
byConstructor: {
|
|
31
|
+
URL: [url_js_1._url],
|
|
32
|
+
Date: [date_js_1._date],
|
|
33
|
+
Error: [error_js_1._error],
|
|
34
|
+
Map: [map_js_1._map],
|
|
35
|
+
Set: [set_js_1._set],
|
|
36
|
+
RegExp: [regex_js_1._regex],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { _bigint } from "./bigint.mjs";
|
|
2
|
+
import { _date } from "./date.mjs";
|
|
3
|
+
import { _error } from "./error.mjs";
|
|
4
|
+
import { _map } from "./map.mjs";
|
|
5
|
+
import { _regex } from "./regex.mjs";
|
|
6
|
+
import { _set } from "./set.mjs";
|
|
7
|
+
import { _url } from "./url.mjs";
|
|
8
|
+
/**
|
|
9
|
+
* Standard transformers in array for legacy support
|
|
10
|
+
*/
|
|
11
|
+
export const standardTransformers = [
|
|
12
|
+
_bigint,
|
|
13
|
+
_date,
|
|
14
|
+
_error,
|
|
15
|
+
_map,
|
|
16
|
+
_regex,
|
|
17
|
+
_set,
|
|
18
|
+
_url,
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Standard transformers organised by type and constructor for performance reasons
|
|
22
|
+
*/
|
|
23
|
+
export const organisedStandardTransformers = {
|
|
24
|
+
byType: {
|
|
25
|
+
bigint: [_bigint],
|
|
26
|
+
},
|
|
27
|
+
byConstructor: {
|
|
28
|
+
URL: [_url],
|
|
29
|
+
Date: [_date],
|
|
30
|
+
Error: [_error],
|
|
31
|
+
Map: [_map],
|
|
32
|
+
Set: [_set],
|
|
33
|
+
RegExp: [_regex],
|
|
34
|
+
},
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -1,68 +1,73 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hackylabs/deep-redact",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.4",
|
|
4
4
|
"description": "A fast, safe and configurable zero-dependency library for redacting strings or deeply redacting arrays and objects.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Benjamin Green (https://bengreen.dev)",
|
|
8
8
|
"funding": "https://ko-fi.com/hackylabs",
|
|
9
9
|
"types": "./dist/types/index.d.ts",
|
|
10
|
-
"main": "./dist/
|
|
11
|
-
"module": "./dist/
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"module": "./dist/index.mjs",
|
|
12
12
|
"exports": {
|
|
13
|
-
".": {
|
|
14
|
-
"import": "./dist/index",
|
|
15
|
-
"require": "./dist/index",
|
|
13
|
+
"./index.ts": {
|
|
14
|
+
"import": "./dist/index.mjs",
|
|
15
|
+
"require": "./dist/index.js",
|
|
16
16
|
"types": "./dist/types/index.d.ts"
|
|
17
17
|
},
|
|
18
|
-
"./types": {
|
|
19
|
-
"import": "./dist/types",
|
|
20
|
-
"require": "./dist/types",
|
|
18
|
+
"./types.ts": {
|
|
19
|
+
"import": "./dist/types.mjs",
|
|
20
|
+
"require": "./dist/types.js",
|
|
21
21
|
"types": "./dist/types/types.d.ts"
|
|
22
22
|
},
|
|
23
|
-
"./utils": {
|
|
24
|
-
"import": "./dist/utils",
|
|
25
|
-
"require": "./dist/utils",
|
|
26
|
-
"types": "./dist/types/utils.d.ts"
|
|
23
|
+
"./utils/TransformerRegistry.ts": {
|
|
24
|
+
"import": "./dist/utils/TransformerRegistry.mjs",
|
|
25
|
+
"require": "./dist/utils/TransformerRegistry.js",
|
|
26
|
+
"types": "./dist/types/utils/TransformerRegistry.d.ts"
|
|
27
27
|
},
|
|
28
|
-
"./utils/
|
|
29
|
-
"import": "./dist/utils/
|
|
30
|
-
"require": "./dist/utils/
|
|
28
|
+
"./utils/index.ts": {
|
|
29
|
+
"import": "./dist/utils/index.mjs",
|
|
30
|
+
"require": "./dist/utils/index.js",
|
|
31
|
+
"types": "./dist/types/utils/index.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./utils/standardTransformers/bigint.ts": {
|
|
34
|
+
"import": "./dist/utils/standardTransformers/bigint.mjs",
|
|
35
|
+
"require": "./dist/utils/standardTransformers/bigint.js",
|
|
31
36
|
"types": "./dist/types/utils/standardTransformers/bigint.d.ts"
|
|
32
37
|
},
|
|
33
|
-
"./utils/standardTransformers/date": {
|
|
34
|
-
"import": "./dist/utils/standardTransformers/date",
|
|
35
|
-
"require": "./dist/utils/standardTransformers/date",
|
|
38
|
+
"./utils/standardTransformers/date.ts": {
|
|
39
|
+
"import": "./dist/utils/standardTransformers/date.mjs",
|
|
40
|
+
"require": "./dist/utils/standardTransformers/date.js",
|
|
36
41
|
"types": "./dist/types/utils/standardTransformers/date.d.ts"
|
|
37
42
|
},
|
|
38
|
-
"./utils/standardTransformers/error": {
|
|
39
|
-
"import": "./dist/utils/standardTransformers/error",
|
|
40
|
-
"require": "./dist/utils/standardTransformers/error",
|
|
43
|
+
"./utils/standardTransformers/error.ts": {
|
|
44
|
+
"import": "./dist/utils/standardTransformers/error.mjs",
|
|
45
|
+
"require": "./dist/utils/standardTransformers/error.js",
|
|
41
46
|
"types": "./dist/types/utils/standardTransformers/error.d.ts"
|
|
42
47
|
},
|
|
43
|
-
"./utils/standardTransformers": {
|
|
44
|
-
"import": "./dist/utils/standardTransformers",
|
|
45
|
-
"require": "./dist/utils/standardTransformers",
|
|
46
|
-
"types": "./dist/types/utils/standardTransformers.d.ts"
|
|
48
|
+
"./utils/standardTransformers/index.ts": {
|
|
49
|
+
"import": "./dist/utils/standardTransformers/index.mjs",
|
|
50
|
+
"require": "./dist/utils/standardTransformers/index.js",
|
|
51
|
+
"types": "./dist/types/utils/standardTransformers/index.d.ts"
|
|
47
52
|
},
|
|
48
|
-
"./utils/standardTransformers/map": {
|
|
49
|
-
"import": "./dist/utils/standardTransformers/map",
|
|
50
|
-
"require": "./dist/utils/standardTransformers/map",
|
|
53
|
+
"./utils/standardTransformers/map.ts": {
|
|
54
|
+
"import": "./dist/utils/standardTransformers/map.mjs",
|
|
55
|
+
"require": "./dist/utils/standardTransformers/map.js",
|
|
51
56
|
"types": "./dist/types/utils/standardTransformers/map.d.ts"
|
|
52
57
|
},
|
|
53
|
-
"./utils/standardTransformers/regex": {
|
|
54
|
-
"import": "./dist/utils/standardTransformers/regex",
|
|
55
|
-
"require": "./dist/utils/standardTransformers/regex",
|
|
58
|
+
"./utils/standardTransformers/regex.ts": {
|
|
59
|
+
"import": "./dist/utils/standardTransformers/regex.mjs",
|
|
60
|
+
"require": "./dist/utils/standardTransformers/regex.js",
|
|
56
61
|
"types": "./dist/types/utils/standardTransformers/regex.d.ts"
|
|
57
62
|
},
|
|
58
|
-
"./utils/standardTransformers/set": {
|
|
59
|
-
"import": "./dist/utils/standardTransformers/set",
|
|
60
|
-
"require": "./dist/utils/standardTransformers/set",
|
|
63
|
+
"./utils/standardTransformers/set.ts": {
|
|
64
|
+
"import": "./dist/utils/standardTransformers/set.mjs",
|
|
65
|
+
"require": "./dist/utils/standardTransformers/set.js",
|
|
61
66
|
"types": "./dist/types/utils/standardTransformers/set.d.ts"
|
|
62
67
|
},
|
|
63
|
-
"./utils/standardTransformers/url": {
|
|
64
|
-
"import": "./dist/utils/standardTransformers/url",
|
|
65
|
-
"require": "./dist/utils/standardTransformers/url",
|
|
68
|
+
"./utils/standardTransformers/url.ts": {
|
|
69
|
+
"import": "./dist/utils/standardTransformers/url.mjs",
|
|
70
|
+
"require": "./dist/utils/standardTransformers/url.js",
|
|
66
71
|
"types": "./dist/types/utils/standardTransformers/url.d.ts"
|
|
67
72
|
}
|
|
68
73
|
},
|
|
@@ -96,17 +101,20 @@
|
|
|
96
101
|
},
|
|
97
102
|
"scripts": {
|
|
98
103
|
"lint": "eslint",
|
|
99
|
-
"build": "npm run lint && npm run test && npm run bench && npm run build:esm && npm run build:cjs && npm run update-exports && npm run update-readme && npm run update-license",
|
|
104
|
+
"build": "npm run lint && npm run test && npm run bench && npm run build:esm && npm run build:cjs && npm run update-exports && npm run test:build && npm run update-readme && npm run update-license",
|
|
105
|
+
"build:dev": "rm -rf dist && npm run build:esm && npm run build:cjs && npm run update-exports",
|
|
100
106
|
"build:esm": "tsc --project tsconfig.esm.json && ./scripts/js-to-mjs.sh",
|
|
101
107
|
"build:cjs": "tsc --project tsconfig.cjs.json",
|
|
102
108
|
"bench": "npx vitest bench --watch=false",
|
|
103
109
|
"bench:dev": "npx vitest bench",
|
|
104
110
|
"test:dev": "npx vitest",
|
|
105
111
|
"test": "npx vitest run",
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
112
|
+
"test:build": "npx vitest run test/build.test.ts --reporter=basic --coverage=false",
|
|
113
|
+
"test:build:dev": "npm run build:cjs && npm run build:esm && npm run update-exports && npx vitest test/build.test.ts --coverage=false --reporter=basic",
|
|
114
|
+
"test:load": "npx vitest run test/load/redact.test.ts --reporter=basic --coverage=false",
|
|
115
|
+
"test:load:dev": "npx vitest test/load/redact.test.ts --coverage=false --reporter=basic",
|
|
116
|
+
"test:unit": "npx vitest run test/unit --reporter=verbose",
|
|
117
|
+
"test:unit:dev": "npx vitest test/unit --coverage=false --reporter=verbose",
|
|
110
118
|
"update-readme": "npx ts-node ./scripts/update-readme.ts",
|
|
111
119
|
"update-license": "npx ts-node ./scripts/update-license.ts",
|
|
112
120
|
"update-exports": "npx ts-node ./scripts/update-exports.ts"
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.standardTransformers = void 0;
|
|
4
|
-
const bigint_1 = require("./bigint");
|
|
5
|
-
const date_1 = require("./date");
|
|
6
|
-
const error_1 = require("./error");
|
|
7
|
-
const map_1 = require("./map");
|
|
8
|
-
const regex_1 = require("./regex");
|
|
9
|
-
const set_1 = require("./set");
|
|
10
|
-
const url_1 = require("./url");
|
|
11
|
-
exports.standardTransformers = [
|
|
12
|
-
bigint_1._bigint,
|
|
13
|
-
url_1._url,
|
|
14
|
-
date_1._date,
|
|
15
|
-
error_1._error,
|
|
16
|
-
map_1._map,
|
|
17
|
-
set_1._set,
|
|
18
|
-
regex_1._regex,
|
|
19
|
-
];
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { _bigint } from "./bigint";
|
|
2
|
-
import { _date } from "./date";
|
|
3
|
-
import { _error } from "./error";
|
|
4
|
-
import { _map } from "./map";
|
|
5
|
-
import { _regex } from "./regex";
|
|
6
|
-
import { _set } from "./set";
|
|
7
|
-
import { _url } from "./url";
|
|
8
|
-
export const standardTransformers = [
|
|
9
|
-
_bigint,
|
|
10
|
-
_url,
|
|
11
|
-
_date,
|
|
12
|
-
_error,
|
|
13
|
-
_map,
|
|
14
|
-
_set,
|
|
15
|
-
_regex,
|
|
16
|
-
];
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{esm/utils/standardTransformers/bigint.js → utils/standardTransformers/bigint.mjs}
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/{esm/utils/standardTransformers/date.js → utils/standardTransformers/date.mjs}
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/{esm/utils/standardTransformers/error.js → utils/standardTransformers/error.mjs}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{esm/utils/standardTransformers/regex.js → utils/standardTransformers/regex.mjs}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|