@hackylabs/deep-redact 3.0.2 → 3.0.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/cjs/index.js +4 -1
- package/dist/cjs/utils/TransformerRegistry.js +100 -0
- package/dist/cjs/utils/index.js +50 -9
- package/dist/cjs/utils/standardTransformers/index.js +22 -3
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/utils/TransformerRegistry.mjs +94 -0
- package/dist/esm/utils/index.mjs +50 -9
- package/dist/esm/utils/standardTransformers/index.js +28 -9
- 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 +11 -0
- package/dist/types/utils/standardTransformers/index.d.ts +8 -1
- package/dist/types/utils/standardTransformers/url.d.ts +1 -1
- package/package.json +35 -28
package/dist/cjs/index.js
CHANGED
|
@@ -14,7 +14,10 @@ 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;
|
|
17
|
+
exports.organisedStandardTransformers = exports.standardTransformers = exports.default = exports.DeepRedact = void 0;
|
|
18
|
+
const standardTransformers_1 = require("./utils/standardTransformers");
|
|
19
|
+
Object.defineProperty(exports, "organisedStandardTransformers", { enumerable: true, get: function () { return standardTransformers_1.organisedStandardTransformers; } });
|
|
20
|
+
Object.defineProperty(exports, "standardTransformers", { enumerable: true, get: function () { return standardTransformers_1.standardTransformers; } });
|
|
18
21
|
const utils_1 = __importDefault(require("./utils"));
|
|
19
22
|
class DeepRedact {
|
|
20
23
|
/**
|
|
@@ -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;
|
package/dist/cjs/utils/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const standardTransformers_1 = require("./standardTransformers");
|
|
4
|
+
const TransformerRegistry_1 = require("./TransformerRegistry");
|
|
4
5
|
const defaultConfig = {
|
|
5
6
|
stringTests: [],
|
|
6
7
|
blacklistedKeys: [],
|
|
@@ -36,6 +37,11 @@ class RedactorUtils {
|
|
|
36
37
|
* @private
|
|
37
38
|
*/
|
|
38
39
|
this.blacklistedKeysTransformed = [];
|
|
40
|
+
/**
|
|
41
|
+
* The transformer registry for efficient transformer lookup
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
this.transformerRegistry = new TransformerRegistry_1.TransformerRegistry();
|
|
39
45
|
this.createTransformedBlacklistedKey = (key, customConfig) => {
|
|
40
46
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
|
|
41
47
|
if (key instanceof RegExp) {
|
|
@@ -67,15 +73,7 @@ class RedactorUtils {
|
|
|
67
73
|
* @private
|
|
68
74
|
*/
|
|
69
75
|
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;
|
|
76
|
+
return this.transformerRegistry.applyTransformers(value, key, referenceMap);
|
|
79
77
|
};
|
|
80
78
|
/**
|
|
81
79
|
* Sanitises a string for the computed regex
|
|
@@ -192,6 +190,49 @@ class RedactorUtils {
|
|
|
192
190
|
const stringKeys = ((_b = customConfig.blacklistedKeys) !== null && _b !== void 0 ? _b : []).filter(key => typeof key === 'string');
|
|
193
191
|
if (stringKeys.length > 0)
|
|
194
192
|
this.computedRegex = new RegExp(stringKeys.map(this.sanitiseStringForRegex).filter(Boolean).join('|'));
|
|
193
|
+
this.setupTransformerRegistry(this.config.transformers);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Sets up the transformer registry based on the configuration
|
|
197
|
+
* @param transformers - The transformer configuration
|
|
198
|
+
* @private
|
|
199
|
+
*/
|
|
200
|
+
setupTransformerRegistry(transformers) {
|
|
201
|
+
if (Array.isArray(transformers)) {
|
|
202
|
+
transformers.forEach(transformer => { this.transformerRegistry.addFallbackTransformer(transformer); });
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const organised = transformers;
|
|
206
|
+
if (organised.byType) {
|
|
207
|
+
Object.entries(organised.byType).forEach(([type, typeTransformers]) => {
|
|
208
|
+
if (typeTransformers) {
|
|
209
|
+
typeTransformers.forEach(transformer => {
|
|
210
|
+
this.transformerRegistry.addTypeTransformer(type, transformer);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (organised.byConstructor) {
|
|
216
|
+
Object.entries(organised.byConstructor).forEach(([constructorName, constructorTransformers]) => {
|
|
217
|
+
if (constructorTransformers) {
|
|
218
|
+
const constructorMap = {
|
|
219
|
+
Date,
|
|
220
|
+
Error,
|
|
221
|
+
Map,
|
|
222
|
+
Set,
|
|
223
|
+
RegExp,
|
|
224
|
+
URL,
|
|
225
|
+
};
|
|
226
|
+
const constructor = constructorMap[constructorName];
|
|
227
|
+
if (constructor) {
|
|
228
|
+
constructorTransformers.forEach(transformer => {
|
|
229
|
+
this.transformerRegistry.addConstructorTransformer(constructor, transformer);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
195
236
|
}
|
|
196
237
|
/**
|
|
197
238
|
* Applies string transformations
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.standardTransformers = void 0;
|
|
3
|
+
exports.organisedStandardTransformers = exports.standardTransformers = void 0;
|
|
4
4
|
const bigint_1 = require("./bigint");
|
|
5
5
|
const date_1 = require("./date");
|
|
6
6
|
const error_1 = require("./error");
|
|
@@ -8,12 +8,31 @@ const map_1 = require("./map");
|
|
|
8
8
|
const regex_1 = require("./regex");
|
|
9
9
|
const set_1 = require("./set");
|
|
10
10
|
const url_1 = require("./url");
|
|
11
|
+
/**
|
|
12
|
+
* Standard transformers in array for legacy support
|
|
13
|
+
*/
|
|
11
14
|
exports.standardTransformers = [
|
|
12
15
|
bigint_1._bigint,
|
|
13
|
-
url_1._url,
|
|
14
16
|
date_1._date,
|
|
15
17
|
error_1._error,
|
|
16
18
|
map_1._map,
|
|
17
|
-
set_1._set,
|
|
18
19
|
regex_1._regex,
|
|
20
|
+
set_1._set,
|
|
21
|
+
url_1._url,
|
|
19
22
|
];
|
|
23
|
+
/**
|
|
24
|
+
* Standard transformers organised by type and constructor for performance reasons
|
|
25
|
+
*/
|
|
26
|
+
exports.organisedStandardTransformers = {
|
|
27
|
+
byType: {
|
|
28
|
+
bigint: [bigint_1._bigint],
|
|
29
|
+
},
|
|
30
|
+
byConstructor: {
|
|
31
|
+
URL: [url_1._url],
|
|
32
|
+
Date: [date_1._date],
|
|
33
|
+
Error: [error_1._error],
|
|
34
|
+
Map: [map_1._map],
|
|
35
|
+
Set: [set_1._set],
|
|
36
|
+
RegExp: [regex_1._regex],
|
|
37
|
+
},
|
|
38
|
+
};
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { organisedStandardTransformers, standardTransformers } from './utils/standardTransformers';
|
|
1
2
|
import RedactorUtils from './utils';
|
|
2
3
|
class DeepRedact {
|
|
3
4
|
/**
|
|
@@ -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, };
|
|
@@ -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
|
+
}
|
package/dist/esm/utils/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { standardTransformers } from './standardTransformers';
|
|
2
|
+
import { TransformerRegistry } from './TransformerRegistry';
|
|
2
3
|
const defaultConfig = {
|
|
3
4
|
stringTests: [],
|
|
4
5
|
blacklistedKeys: [],
|
|
@@ -32,6 +33,11 @@ class RedactorUtils {
|
|
|
32
33
|
* @private
|
|
33
34
|
*/
|
|
34
35
|
blacklistedKeysTransformed = [];
|
|
36
|
+
/**
|
|
37
|
+
* The transformer registry for efficient transformer lookup
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
transformerRegistry = new TransformerRegistry();
|
|
35
41
|
constructor(customConfig) {
|
|
36
42
|
this.config = {
|
|
37
43
|
...defaultConfig,
|
|
@@ -41,6 +47,49 @@ class RedactorUtils {
|
|
|
41
47
|
const stringKeys = (customConfig.blacklistedKeys ?? []).filter(key => typeof key === 'string');
|
|
42
48
|
if (stringKeys.length > 0)
|
|
43
49
|
this.computedRegex = new RegExp(stringKeys.map(this.sanitiseStringForRegex).filter(Boolean).join('|'));
|
|
50
|
+
this.setupTransformerRegistry(this.config.transformers);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets up the transformer registry based on the configuration
|
|
54
|
+
* @param transformers - The transformer configuration
|
|
55
|
+
* @private
|
|
56
|
+
*/
|
|
57
|
+
setupTransformerRegistry(transformers) {
|
|
58
|
+
if (Array.isArray(transformers)) {
|
|
59
|
+
transformers.forEach(transformer => { this.transformerRegistry.addFallbackTransformer(transformer); });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const organised = transformers;
|
|
63
|
+
if (organised.byType) {
|
|
64
|
+
Object.entries(organised.byType).forEach(([type, typeTransformers]) => {
|
|
65
|
+
if (typeTransformers) {
|
|
66
|
+
typeTransformers.forEach(transformer => {
|
|
67
|
+
this.transformerRegistry.addTypeTransformer(type, transformer);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (organised.byConstructor) {
|
|
73
|
+
Object.entries(organised.byConstructor).forEach(([constructorName, constructorTransformers]) => {
|
|
74
|
+
if (constructorTransformers) {
|
|
75
|
+
const constructorMap = {
|
|
76
|
+
Date,
|
|
77
|
+
Error,
|
|
78
|
+
Map,
|
|
79
|
+
Set,
|
|
80
|
+
RegExp,
|
|
81
|
+
URL,
|
|
82
|
+
};
|
|
83
|
+
const constructor = constructorMap[constructorName];
|
|
84
|
+
if (constructor) {
|
|
85
|
+
constructorTransformers.forEach(transformer => {
|
|
86
|
+
this.transformerRegistry.addConstructorTransformer(constructor, transformer);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
44
93
|
}
|
|
45
94
|
createTransformedBlacklistedKey = (key, customConfig) => {
|
|
46
95
|
if (key instanceof RegExp) {
|
|
@@ -72,15 +121,7 @@ class RedactorUtils {
|
|
|
72
121
|
* @private
|
|
73
122
|
*/
|
|
74
123
|
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;
|
|
124
|
+
return this.transformerRegistry.applyTransformers(value, key, referenceMap);
|
|
84
125
|
};
|
|
85
126
|
/**
|
|
86
127
|
* Sanitises a string for the computed regex
|
|
@@ -1,16 +1,35 @@
|
|
|
1
|
-
import { _bigint } from
|
|
2
|
-
import { _date } from
|
|
3
|
-
import { _error } from
|
|
4
|
-
import { _map } from
|
|
5
|
-
import { _regex } from
|
|
6
|
-
import { _set } from
|
|
7
|
-
import { _url } from
|
|
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
|
+
/**
|
|
9
|
+
* Standard transformers in array for legacy support
|
|
10
|
+
*/
|
|
8
11
|
export const standardTransformers = [
|
|
9
12
|
_bigint,
|
|
10
|
-
_url,
|
|
11
13
|
_date,
|
|
12
14
|
_error,
|
|
13
15
|
_map,
|
|
14
|
-
_set,
|
|
15
16
|
_regex,
|
|
17
|
+
_set,
|
|
18
|
+
_url,
|
|
16
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/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';
|
|
2
|
+
import { organisedStandardTransformers, standardTransformers } from './utils/standardTransformers';
|
|
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
|
+
}
|
|
@@ -20,7 +20,18 @@ declare class RedactorUtils {
|
|
|
20
20
|
* @private
|
|
21
21
|
*/
|
|
22
22
|
private readonly blacklistedKeysTransformed;
|
|
23
|
+
/**
|
|
24
|
+
* The transformer registry for efficient transformer lookup
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
private readonly transformerRegistry;
|
|
23
28
|
constructor(customConfig: RedactorUtilsConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Sets up the transformer registry based on the configuration
|
|
31
|
+
* @param transformers - The transformer configuration
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
private setupTransformerRegistry;
|
|
24
35
|
private createTransformedBlacklistedKey;
|
|
25
36
|
/**
|
|
26
37
|
* Applies transformers to a value
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import type { Transformer } from
|
|
1
|
+
import type { Transformer, OrganisedTransformers } from 'src/types';
|
|
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
|
|
1
|
+
import type { Transformer } from '../../types';
|
|
2
2
|
export declare const _url: Transformer;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hackylabs/deep-redact",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
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",
|
|
@@ -11,58 +11,63 @@
|
|
|
11
11
|
"module": "./dist/esm/index.mjs",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
14
|
-
"import": "./dist/index",
|
|
15
|
-
"require": "./dist/index",
|
|
14
|
+
"import": "./dist/esm/index.mjs",
|
|
15
|
+
"require": "./dist/cjs/index.js",
|
|
16
16
|
"types": "./dist/types/index.d.ts"
|
|
17
17
|
},
|
|
18
18
|
"./types": {
|
|
19
|
-
"import": "./dist/types",
|
|
20
|
-
"require": "./dist/types",
|
|
19
|
+
"import": "./dist/esm/types.mjs",
|
|
20
|
+
"require": "./dist/cjs/types.js",
|
|
21
21
|
"types": "./dist/types/types.d.ts"
|
|
22
22
|
},
|
|
23
|
+
"./utils/TransformerRegistry": {
|
|
24
|
+
"import": "./dist/esm/utils/TransformerRegistry.mjs",
|
|
25
|
+
"require": "./dist/cjs/utils/TransformerRegistry.js",
|
|
26
|
+
"types": "./dist/types/utils/TransformerRegistry.d.ts"
|
|
27
|
+
},
|
|
23
28
|
"./utils": {
|
|
24
|
-
"import": "./dist/utils",
|
|
25
|
-
"require": "./dist/utils",
|
|
29
|
+
"import": "./dist/esm/utils.mjs",
|
|
30
|
+
"require": "./dist/cjs/utils.js",
|
|
26
31
|
"types": "./dist/types/utils.d.ts"
|
|
27
32
|
},
|
|
28
33
|
"./utils/standardTransformers/bigint": {
|
|
29
|
-
"import": "./dist/utils/standardTransformers/bigint",
|
|
30
|
-
"require": "./dist/utils/standardTransformers/bigint",
|
|
34
|
+
"import": "./dist/esm/utils/standardTransformers/bigint.mjs",
|
|
35
|
+
"require": "./dist/cjs/utils/standardTransformers/bigint.js",
|
|
31
36
|
"types": "./dist/types/utils/standardTransformers/bigint.d.ts"
|
|
32
37
|
},
|
|
33
38
|
"./utils/standardTransformers/date": {
|
|
34
|
-
"import": "./dist/utils/standardTransformers/date",
|
|
35
|
-
"require": "./dist/utils/standardTransformers/date",
|
|
39
|
+
"import": "./dist/esm/utils/standardTransformers/date.mjs",
|
|
40
|
+
"require": "./dist/cjs/utils/standardTransformers/date.js",
|
|
36
41
|
"types": "./dist/types/utils/standardTransformers/date.d.ts"
|
|
37
42
|
},
|
|
38
43
|
"./utils/standardTransformers/error": {
|
|
39
|
-
"import": "./dist/utils/standardTransformers/error",
|
|
40
|
-
"require": "./dist/utils/standardTransformers/error",
|
|
44
|
+
"import": "./dist/esm/utils/standardTransformers/error.mjs",
|
|
45
|
+
"require": "./dist/cjs/utils/standardTransformers/error.js",
|
|
41
46
|
"types": "./dist/types/utils/standardTransformers/error.d.ts"
|
|
42
47
|
},
|
|
43
48
|
"./utils/standardTransformers": {
|
|
44
|
-
"import": "./dist/utils/standardTransformers",
|
|
45
|
-
"require": "./dist/utils/standardTransformers",
|
|
49
|
+
"import": "./dist/esm/utils/standardTransformers.mjs",
|
|
50
|
+
"require": "./dist/cjs/utils/standardTransformers.js",
|
|
46
51
|
"types": "./dist/types/utils/standardTransformers.d.ts"
|
|
47
52
|
},
|
|
48
53
|
"./utils/standardTransformers/map": {
|
|
49
|
-
"import": "./dist/utils/standardTransformers/map",
|
|
50
|
-
"require": "./dist/utils/standardTransformers/map",
|
|
54
|
+
"import": "./dist/esm/utils/standardTransformers/map.mjs",
|
|
55
|
+
"require": "./dist/cjs/utils/standardTransformers/map.js",
|
|
51
56
|
"types": "./dist/types/utils/standardTransformers/map.d.ts"
|
|
52
57
|
},
|
|
53
58
|
"./utils/standardTransformers/regex": {
|
|
54
|
-
"import": "./dist/utils/standardTransformers/regex",
|
|
55
|
-
"require": "./dist/utils/standardTransformers/regex",
|
|
59
|
+
"import": "./dist/esm/utils/standardTransformers/regex.mjs",
|
|
60
|
+
"require": "./dist/cjs/utils/standardTransformers/regex.js",
|
|
56
61
|
"types": "./dist/types/utils/standardTransformers/regex.d.ts"
|
|
57
62
|
},
|
|
58
63
|
"./utils/standardTransformers/set": {
|
|
59
|
-
"import": "./dist/utils/standardTransformers/set",
|
|
60
|
-
"require": "./dist/utils/standardTransformers/set",
|
|
64
|
+
"import": "./dist/esm/utils/standardTransformers/set.mjs",
|
|
65
|
+
"require": "./dist/cjs/utils/standardTransformers/set.js",
|
|
61
66
|
"types": "./dist/types/utils/standardTransformers/set.d.ts"
|
|
62
67
|
},
|
|
63
68
|
"./utils/standardTransformers/url": {
|
|
64
|
-
"import": "./dist/utils/standardTransformers/url",
|
|
65
|
-
"require": "./dist/utils/standardTransformers/url",
|
|
69
|
+
"import": "./dist/esm/utils/standardTransformers/url.mjs",
|
|
70
|
+
"require": "./dist/cjs/utils/standardTransformers/url.js",
|
|
66
71
|
"types": "./dist/types/utils/standardTransformers/url.d.ts"
|
|
67
72
|
}
|
|
68
73
|
},
|
|
@@ -96,17 +101,19 @@
|
|
|
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",
|
|
100
105
|
"build:esm": "tsc --project tsconfig.esm.json && ./scripts/js-to-mjs.sh",
|
|
101
106
|
"build:cjs": "tsc --project tsconfig.cjs.json",
|
|
102
107
|
"bench": "npx vitest bench --watch=false",
|
|
103
108
|
"bench:dev": "npx vitest bench",
|
|
104
109
|
"test:dev": "npx vitest",
|
|
105
110
|
"test": "npx vitest run",
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
111
|
+
"test:build": "npx vitest run test/build.test.ts --reporter=basic --coverage=false",
|
|
112
|
+
"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",
|
|
113
|
+
"test:load": "npx vitest run test/load/redact.test.ts --reporter=basic --coverage=false",
|
|
114
|
+
"test:load:dev": "npx vitest test/load/redact.test.ts --coverage=false --reporter=basic",
|
|
115
|
+
"test:unit": "npx vitest run test/unit --reporter=verbose",
|
|
116
|
+
"test:unit:dev": "npx vitest test/unit --coverage=false --reporter=verbose",
|
|
110
117
|
"update-readme": "npx ts-node ./scripts/update-readme.ts",
|
|
111
118
|
"update-license": "npx ts-node ./scripts/update-license.ts",
|
|
112
119
|
"update-exports": "npx ts-node ./scripts/update-exports.ts"
|