@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 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;
@@ -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
- if (typeof value === 'string')
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
+ };
@@ -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
+ }
@@ -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
- if (typeof value === 'string')
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 "./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";
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
+ };
@@ -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, };
@@ -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
- * A list of transformers to apply when transforming unsupported values.
135
- * Each transformer should conditionally transform the value, or return the value unchanged to be passed to the next transformer.
136
- * Transformers will be run in the order they are provided recursively over the entire object.
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
- * // redact a key by name.
140
- * standardTransformers.redactByKey,
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?: Array<Transformer>;
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 "src/types";
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 "../../types";
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.2",
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
- "load": "npx vitest run test/load/redact.test.ts --reporter=basic --coverage=false",
107
- "load:dev": "npx vitest test/load/redact.test.ts --coverage=false --reporter=basic",
108
- "unit": "npx vitest run test/unit --reporter=verbose",
109
- "unit:dev": "npx vitest test/unit --coverage=false --reporter=verbose",
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"