@heroku/js-blanket 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +4 -1
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/cjs/.tsbuildinfo +1 -0
  4. package/dist/cjs/adapters/logging/generic.js +23 -0
  5. package/dist/cjs/adapters/logging/generic.js.map +1 -0
  6. package/dist/cjs/adapters/logging/generic.test.js +432 -0
  7. package/dist/cjs/adapters/logging/generic.test.js.map +1 -0
  8. package/dist/cjs/core/patterns.js +17 -0
  9. package/dist/cjs/core/patterns.js.map +1 -0
  10. package/dist/cjs/core/presets.js +116 -0
  11. package/dist/cjs/core/presets.js.map +1 -0
  12. package/dist/cjs/core/scrubber.js +260 -0
  13. package/dist/cjs/core/scrubber.js.map +1 -0
  14. package/dist/cjs/core/scrubber.test.js +392 -0
  15. package/dist/cjs/core/scrubber.test.js.map +1 -0
  16. package/dist/cjs/core/types.js +3 -0
  17. package/dist/cjs/core/types.js.map +1 -0
  18. package/dist/cjs/core/types.test.js +326 -0
  19. package/dist/cjs/core/types.test.js.map +1 -0
  20. package/dist/cjs/index.js +16 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/index.test.js +31 -0
  23. package/dist/cjs/index.test.js.map +1 -0
  24. package/dist/cjs/package.json +1 -0
  25. package/dist/esm/.tsbuildinfo +1 -0
  26. package/{src/adapters/logging/generic.ts → dist/esm/adapters/logging/generic.d.ts} +1 -4
  27. package/dist/esm/adapters/logging/generic.js +20 -0
  28. package/dist/esm/adapters/logging/generic.js.map +1 -0
  29. package/dist/esm/adapters/logging/generic.test.d.ts +7 -0
  30. package/dist/esm/adapters/logging/generic.test.js +430 -0
  31. package/dist/esm/adapters/logging/generic.test.js.map +1 -0
  32. package/dist/esm/core/patterns.d.ts +4 -0
  33. package/dist/esm/core/patterns.js +14 -0
  34. package/dist/esm/core/patterns.js.map +1 -0
  35. package/dist/esm/core/presets.d.ts +64 -0
  36. package/{src/core/presets.ts → dist/esm/core/presets.js} +46 -55
  37. package/dist/esm/core/presets.js.map +1 -0
  38. package/dist/esm/core/scrubber.d.ts +131 -0
  39. package/dist/esm/core/scrubber.js +256 -0
  40. package/dist/esm/core/scrubber.js.map +1 -0
  41. package/dist/esm/core/scrubber.test.d.ts +1 -0
  42. package/dist/esm/core/scrubber.test.js +390 -0
  43. package/dist/esm/core/scrubber.test.js.map +1 -0
  44. package/dist/esm/core/types.d.ts +169 -0
  45. package/dist/esm/core/types.js +2 -0
  46. package/dist/esm/core/types.js.map +1 -0
  47. package/dist/esm/core/types.test.d.ts +9 -0
  48. package/dist/esm/core/types.test.js +324 -0
  49. package/dist/esm/core/types.test.js.map +1 -0
  50. package/{src/index.ts → dist/esm/index.d.ts} +0 -3
  51. package/dist/esm/index.js +7 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/index.test.d.ts +1 -0
  54. package/dist/esm/index.test.js +29 -0
  55. package/dist/esm/index.test.js.map +1 -0
  56. package/package.json +45 -47
  57. package/.c8rc.json +0 -11
  58. package/.editorconfig +0 -11
  59. package/.github/PULL_REQUEST_TEMPLATE.md +0 -41
  60. package/.github/copilot-instructions.md +0 -117
  61. package/.github/workflows/ci.yml +0 -25
  62. package/.husky/pre-commit +0 -1
  63. package/.lintstagedrc.json +0 -4
  64. package/.tool-versions +0 -1
  65. package/CODEOWNERS +0 -8
  66. package/CODE_OF_CONDUCT.md +0 -111
  67. package/CONTRIBUTING.md +0 -123
  68. package/SECURITY.md +0 -8
  69. package/docs/examples/logging-integration.md +0 -736
  70. package/eslint.config.mjs +0 -108
  71. package/prettier.config.mjs +0 -10
  72. package/scripts/test-setup.mjs +0 -24
  73. package/src/adapters/logging/generic.test.ts +0 -531
  74. package/src/core/patterns.ts +0 -22
  75. package/src/core/scrubber.test.ts +0 -465
  76. package/src/core/scrubber.ts +0 -284
  77. package/src/core/types.test.ts +0 -516
  78. package/src/core/types.ts +0 -176
  79. package/src/index.test.ts +0 -41
  80. package/tsconfig.cjs.json +0 -12
  81. package/tsconfig.esm.json +0 -12
  82. package/tsconfig.json +0 -32
  83. package/tsconfig.test.json +0 -9
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Generic Logging Adapter
4
+ *
5
+ * The generic adapter is a thin wrapper around the core Scrubber,
6
+ * designed for use with any logging library (Winston, Pino, Bunyan, etc.)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const chai_1 = require("chai");
10
+ const generic_js_1 = require("./generic.js");
11
+ const scrubber_js_1 = require("../../core/scrubber.js");
12
+ const presets_js_1 = require("../../core/presets.js");
13
+ describe('Generic Logging Adapter', () => {
14
+ describe('createRedactor()', () => {
15
+ it('returns a Scrubber instance', () => {
16
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
17
+ (0, chai_1.expect)(redactor).to.be.instanceOf(scrubber_js_1.Scrubber);
18
+ });
19
+ it('creates a functional scrubber', () => {
20
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
21
+ const result = redactor.scrub({ user: 'john', password: 'secret' });
22
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
23
+ (0, chai_1.expect)(result.scrubbed).to.be.true;
24
+ });
25
+ it('accepts empty configuration', () => {
26
+ const redactor = (0, generic_js_1.createRedactor)({});
27
+ const result = redactor.scrub({ data: 'test' });
28
+ (0, chai_1.expect)(result.data).to.deep.equal({ data: 'test' });
29
+ (0, chai_1.expect)(result.scrubbed).to.be.false;
30
+ });
31
+ });
32
+ describe('Configuration Options', () => {
33
+ it('supports field-based scrubbing', () => {
34
+ const redactor = (0, generic_js_1.createRedactor)({
35
+ fields: ['password', 'apiToken', 'secret'],
36
+ });
37
+ const result = redactor.scrub({
38
+ user: 'john',
39
+ password: 'secret123',
40
+ apiToken: 'token123',
41
+ secret: 'hidden',
42
+ public: 'visible',
43
+ });
44
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
45
+ (0, chai_1.expect)(result.data.apiToken).to.equal('[SCRUBBED]');
46
+ (0, chai_1.expect)(result.data.secret).to.equal('[SCRUBBED]');
47
+ (0, chai_1.expect)(result.data.public).to.equal('visible');
48
+ });
49
+ it('supports regex field patterns', () => {
50
+ const redactor = (0, generic_js_1.createRedactor)({
51
+ fields: [/api[-_]?key/i, /^secret/i],
52
+ });
53
+ const result = redactor.scrub({
54
+ api_key: 'key1',
55
+ 'api-key': 'key2',
56
+ apikey: 'key3',
57
+ secret_token: 'token',
58
+ SECRET: 'hidden',
59
+ });
60
+ (0, chai_1.expect)(result.data.api_key).to.equal('[SCRUBBED]');
61
+ (0, chai_1.expect)(result.data['api-key']).to.equal('[SCRUBBED]');
62
+ (0, chai_1.expect)(result.data.apikey).to.equal('[SCRUBBED]');
63
+ (0, chai_1.expect)(result.data.secret_token).to.equal('[SCRUBBED]');
64
+ (0, chai_1.expect)(result.data.SECRET).to.equal('[SCRUBBED]');
65
+ });
66
+ it('supports path-based scrubbing', () => {
67
+ const redactor = (0, generic_js_1.createRedactor)({
68
+ paths: ['user.email', 'request.headers.authorization'],
69
+ });
70
+ const result = redactor.scrub({
71
+ user: {
72
+ name: 'John',
73
+ email: 'john@example.com',
74
+ },
75
+ request: {
76
+ method: 'POST',
77
+ headers: {
78
+ authorization: 'Bearer token123',
79
+ 'content-type': 'application/json',
80
+ },
81
+ },
82
+ });
83
+ (0, chai_1.expect)(result.data.user.email).to.equal('[SCRUBBED]');
84
+ (0, chai_1.expect)(result.data.request.headers.authorization).to.equal('[SCRUBBED]');
85
+ (0, chai_1.expect)(result.data.user.name).to.equal('John');
86
+ (0, chai_1.expect)(result.data.request.headers['content-type']).to.equal('application/json');
87
+ });
88
+ it('supports pattern-based scrubbing', () => {
89
+ const redactor = (0, generic_js_1.createRedactor)({
90
+ patterns: [
91
+ /\b\d{3}-\d{2}-\d{4}\b/g, // SSN
92
+ /\d{4}-\d{4}-\d{4}-\d{4}/g, // Credit card
93
+ ],
94
+ });
95
+ const result = redactor.scrub({
96
+ message: 'User SSN is 123-45-6789 and card is 4532-1234-5678-9010',
97
+ });
98
+ (0, chai_1.expect)(result.data.message).to.equal('User SSN is [SCRUBBED] and card is [SCRUBBED]');
99
+ });
100
+ it('supports combined scrubbing modes', () => {
101
+ const redactor = (0, generic_js_1.createRedactor)({
102
+ fields: ['password'],
103
+ paths: ['user.email'],
104
+ patterns: [/\b\d{3}-\d{2}-\d{4}\b/g],
105
+ });
106
+ const result = redactor.scrub({
107
+ user: {
108
+ name: 'John',
109
+ email: 'john@example.com',
110
+ password: 'secret',
111
+ },
112
+ message: 'SSN: 123-45-6789',
113
+ });
114
+ (0, chai_1.expect)(result.data.user.password).to.equal('[SCRUBBED]');
115
+ (0, chai_1.expect)(result.data.user.email).to.equal('[SCRUBBED]');
116
+ (0, chai_1.expect)(result.data.message).to.equal('SSN: [SCRUBBED]');
117
+ (0, chai_1.expect)(result.data.user.name).to.equal('John');
118
+ });
119
+ it('supports custom replacement text', () => {
120
+ const redactor = (0, generic_js_1.createRedactor)({
121
+ fields: ['password'],
122
+ replacement: '[REDACTED]',
123
+ });
124
+ const result = redactor.scrub({ password: 'secret' });
125
+ (0, chai_1.expect)(result.data.password).to.equal('[REDACTED]');
126
+ });
127
+ it('supports recursive scrubbing control', () => {
128
+ const redactorRecursive = (0, generic_js_1.createRedactor)({
129
+ fields: ['password'],
130
+ recursive: true,
131
+ });
132
+ const redactorNonRecursive = (0, generic_js_1.createRedactor)({
133
+ fields: ['password'],
134
+ recursive: false,
135
+ });
136
+ const data = {
137
+ password: 'level1',
138
+ nested: {
139
+ password: 'level2',
140
+ },
141
+ };
142
+ const recursiveResult = redactorRecursive.scrub(data);
143
+ (0, chai_1.expect)(recursiveResult.data.password).to.equal('[SCRUBBED]');
144
+ (0, chai_1.expect)(recursiveResult.data.nested.password).to.equal('[SCRUBBED]');
145
+ const nonRecursiveResult = redactorNonRecursive.scrub(data);
146
+ (0, chai_1.expect)(nonRecursiveResult.data.password).to.equal('[SCRUBBED]');
147
+ // Non-recursive should still scrub nested fields
148
+ // (the recursive flag controls traversal depth, not field matching)
149
+ });
150
+ });
151
+ describe('Preset Integration', () => {
152
+ it('works with HEROKU_FIELDS preset', () => {
153
+ const redactor = (0, generic_js_1.createRedactor)({ fields: presets_js_1.HEROKU_FIELDS });
154
+ const result = redactor.scrub({
155
+ user: 'john',
156
+ password: 'secret',
157
+ access_token: 'token123',
158
+ api_key: 'key123',
159
+ email: 'john@example.com',
160
+ });
161
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
162
+ (0, chai_1.expect)(result.data.access_token).to.equal('[SCRUBBED]');
163
+ (0, chai_1.expect)(result.data.api_key).to.equal('[SCRUBBED]');
164
+ (0, chai_1.expect)(result.data.user).to.equal('john');
165
+ });
166
+ it('works with GDPR_FIELDS preset', () => {
167
+ const redactor = (0, generic_js_1.createRedactor)({ fields: presets_js_1.GDPR_FIELDS });
168
+ const result = redactor.scrub({
169
+ name: 'John Doe',
170
+ email: 'john@example.com',
171
+ phone: '+1-555-1234',
172
+ address: '123 Main St',
173
+ });
174
+ (0, chai_1.expect)(result.data.email).to.equal('[SCRUBBED]');
175
+ (0, chai_1.expect)(result.data.phone).to.equal('[SCRUBBED]');
176
+ (0, chai_1.expect)(result.data.address).to.equal('[SCRUBBED]');
177
+ (0, chai_1.expect)(result.data.name).to.equal('John Doe');
178
+ });
179
+ it('works with PCI_FIELDS preset', () => {
180
+ const redactor = (0, generic_js_1.createRedactor)({ fields: presets_js_1.PCI_FIELDS });
181
+ const result = redactor.scrub({
182
+ user: 'john',
183
+ card_number: '4532-1234-5678-9010',
184
+ cvv: '123',
185
+ credit_card: '4111111111111111',
186
+ });
187
+ (0, chai_1.expect)(result.data.card_number).to.equal('[SCRUBBED]');
188
+ (0, chai_1.expect)(result.data.cvv).to.equal('[SCRUBBED]');
189
+ (0, chai_1.expect)(result.data.credit_card).to.equal('[SCRUBBED]');
190
+ (0, chai_1.expect)(result.data.user).to.equal('john');
191
+ });
192
+ it('works with combined presets', () => {
193
+ const redactor = (0, generic_js_1.createRedactor)({
194
+ fields: [...presets_js_1.HEROKU_FIELDS, ...presets_js_1.GDPR_FIELDS, ...presets_js_1.PCI_FIELDS],
195
+ });
196
+ const result = redactor.scrub({
197
+ user: 'john',
198
+ password: 'secret', // HEROKU_FIELDS
199
+ email: 'john@example.com', // GDPR_FIELDS
200
+ cvv: '123', // PCI_FIELDS
201
+ public: 'data',
202
+ });
203
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
204
+ (0, chai_1.expect)(result.data.email).to.equal('[SCRUBBED]');
205
+ (0, chai_1.expect)(result.data.cvv).to.equal('[SCRUBBED]');
206
+ (0, chai_1.expect)(result.data.public).to.equal('data');
207
+ });
208
+ });
209
+ describe('Logging Library Integration Patterns', () => {
210
+ it('can be used with Winston-style loggers', () => {
211
+ // Simulate Winston logger integration
212
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password', 'apiToken'] });
213
+ // Simulate Winston's meta object
214
+ const logEntry = {
215
+ level: 'info',
216
+ message: 'User login',
217
+ metadata: {
218
+ user: 'john',
219
+ password: 'secret123',
220
+ apiToken: 'token123',
221
+ ip: '192.168.1.1',
222
+ },
223
+ timestamp: new Date().toISOString(),
224
+ };
225
+ const result = redactor.scrub(logEntry);
226
+ (0, chai_1.expect)(result.data.metadata.password).to.equal('[SCRUBBED]');
227
+ (0, chai_1.expect)(result.data.metadata.apiToken).to.equal('[SCRUBBED]');
228
+ (0, chai_1.expect)(result.data.metadata.user).to.equal('john');
229
+ (0, chai_1.expect)(result.data.level).to.equal('info');
230
+ });
231
+ it('can be used with Pino-style loggers', () => {
232
+ // Simulate Pino logger integration
233
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
234
+ // Simulate Pino's flat log object
235
+ const logEntry = {
236
+ level: 30, // info
237
+ time: Date.now(),
238
+ msg: 'User action',
239
+ user: 'john',
240
+ password: 'secret',
241
+ req: {
242
+ method: 'POST',
243
+ url: '/api/login',
244
+ },
245
+ };
246
+ const result = redactor.scrub(logEntry);
247
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
248
+ (0, chai_1.expect)(result.data.user).to.equal('john');
249
+ (0, chai_1.expect)(result.data.req.method).to.equal('POST');
250
+ });
251
+ it('can be used with Bunyan-style loggers', () => {
252
+ // Simulate Bunyan logger integration
253
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password', 'token'] });
254
+ const logEntry = {
255
+ name: 'myapp',
256
+ hostname: 'server01',
257
+ pid: 12345,
258
+ level: 30,
259
+ msg: 'Authentication successful',
260
+ password: 'secret',
261
+ token: 'jwt123',
262
+ time: new Date(),
263
+ };
264
+ const result = redactor.scrub(logEntry);
265
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
266
+ (0, chai_1.expect)(result.data.token).to.equal('[SCRUBBED]');
267
+ (0, chai_1.expect)(result.data.msg).to.equal('Authentication successful');
268
+ });
269
+ it('handles array of log entries', () => {
270
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
271
+ const logs = [
272
+ { msg: 'Login attempt', user: 'john', password: 'secret1' },
273
+ { msg: 'Login success', user: 'jane', password: 'secret2' },
274
+ { msg: 'Logout', user: 'john' },
275
+ ];
276
+ const result = redactor.scrub(logs);
277
+ (0, chai_1.expect)(result.data[0]?.password).to.equal('[SCRUBBED]');
278
+ (0, chai_1.expect)(result.data[1]?.password).to.equal('[SCRUBBED]');
279
+ (0, chai_1.expect)(result.data[2]?.password).to.be.undefined;
280
+ (0, chai_1.expect)(result.data[0]?.user).to.equal('john');
281
+ });
282
+ });
283
+ describe('oauth-provider-adapters-for-mcp Migration', () => {
284
+ it('provides drop-in replacement for redaction.ts', () => {
285
+ // This test validates the interface matches what oauth-provider-adapters expects
286
+ const redactor = (0, generic_js_1.createRedactor)({
287
+ fields: ['client_secret', 'refresh_token', 'access_token'],
288
+ paths: ['oauth.credentials.secret'],
289
+ });
290
+ // Simulate OAuth data structure
291
+ const oauthData = {
292
+ client_id: 'my-client',
293
+ client_secret: 'secret123',
294
+ redirect_uri: 'http://localhost:3000/callback',
295
+ oauth: {
296
+ credentials: {
297
+ access_token: 'access123',
298
+ refresh_token: 'refresh123',
299
+ secret: 'hidden',
300
+ },
301
+ },
302
+ };
303
+ const result = redactor.scrub(oauthData);
304
+ // Verify the interface provides .data (scrubbed result)
305
+ (0, chai_1.expect)(result).to.have.property('data');
306
+ (0, chai_1.expect)(result).to.have.property('scrubbed');
307
+ (0, chai_1.expect)(result).to.have.property('scrubbedPaths');
308
+ // Verify scrubbing worked
309
+ (0, chai_1.expect)(result.data.client_secret).to.equal('[SCRUBBED]');
310
+ (0, chai_1.expect)(result.data.oauth.credentials.access_token).to.equal('[SCRUBBED]');
311
+ (0, chai_1.expect)(result.data.oauth.credentials.refresh_token).to.equal('[SCRUBBED]');
312
+ (0, chai_1.expect)(result.data.oauth.credentials.secret).to.equal('[SCRUBBED]');
313
+ (0, chai_1.expect)(result.data.client_id).to.equal('my-client');
314
+ });
315
+ it('supports the same API as oauth-provider redaction', () => {
316
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['secret'] });
317
+ // The API should support:
318
+ // 1. scrub() method
319
+ (0, chai_1.expect)(redactor).to.have.property('scrub');
320
+ (0, chai_1.expect)(typeof redactor.scrub).to.equal('function');
321
+ // 2. Return value with .data property
322
+ const result = redactor.scrub({ secret: 'hidden' });
323
+ (0, chai_1.expect)(result).to.have.property('data');
324
+ // 3. Immutability (original not modified)
325
+ const original = { secret: 'hidden', public: 'visible' };
326
+ const scrubbed = redactor.scrub(original);
327
+ (0, chai_1.expect)(original.secret).to.equal('hidden'); // Original unchanged
328
+ (0, chai_1.expect)(scrubbed.data.secret).to.equal('[SCRUBBED]');
329
+ });
330
+ });
331
+ describe('Performance', () => {
332
+ it('handles high-volume logging scenarios efficiently', () => {
333
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
334
+ const start = performance.now();
335
+ const iterations = 1000;
336
+ for (let i = 0; i < iterations; i++) {
337
+ redactor.scrub({
338
+ timestamp: new Date().toISOString(),
339
+ level: 'info',
340
+ message: 'User action',
341
+ user: `user${i}`,
342
+ password: `secret${i}`,
343
+ });
344
+ }
345
+ const end = performance.now();
346
+ const avgTime = (end - start) / iterations;
347
+ // Should average < 1ms per log entry (target from discovery doc)
348
+ (0, chai_1.expect)(avgTime).to.be.lessThan(1);
349
+ });
350
+ it('handles large nested objects efficiently', () => {
351
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
352
+ // Create a large nested structure
353
+ const largeObject = {
354
+ level: 'info',
355
+ timestamp: Date.now(),
356
+ };
357
+ for (let i = 0; i < 100; i++) {
358
+ largeObject[`user${i}`] = {
359
+ id: i,
360
+ name: `User ${i}`,
361
+ password: `secret${i}`,
362
+ metadata: {
363
+ lastLogin: new Date().toISOString(),
364
+ loginCount: i * 10,
365
+ },
366
+ };
367
+ }
368
+ const start = performance.now();
369
+ const result = redactor.scrub(largeObject);
370
+ const end = performance.now();
371
+ (0, chai_1.expect)(end - start).to.be.lessThan(10); // Should be < 10ms
372
+ (0, chai_1.expect)(result.scrubbed).to.be.true;
373
+ });
374
+ });
375
+ describe('Edge Cases', () => {
376
+ it('handles null and undefined values', () => {
377
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
378
+ const result = redactor.scrub({
379
+ user: 'john',
380
+ password: null,
381
+ apiToken: undefined,
382
+ });
383
+ // Fields matching the scrubber config are scrubbed regardless of value
384
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
385
+ // Fields not in the config are left as-is
386
+ (0, chai_1.expect)(result.data.apiToken).to.be.undefined;
387
+ (0, chai_1.expect)(result.data.user).to.equal('john');
388
+ });
389
+ it('handles circular references', () => {
390
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
391
+ const obj = {
392
+ user: 'john',
393
+ password: 'secret',
394
+ };
395
+ obj.self = obj; // Circular reference
396
+ const result = redactor.scrub(obj);
397
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
398
+ (0, chai_1.expect)(result.data.user).to.equal('john');
399
+ // Circular reference handled gracefully
400
+ });
401
+ it('handles empty objects and arrays', () => {
402
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
403
+ (0, chai_1.expect)(redactor.scrub({}).data).to.deep.equal({});
404
+ (0, chai_1.expect)(redactor.scrub([]).data).to.deep.equal([]);
405
+ });
406
+ it('handles primitive values', () => {
407
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
408
+ (0, chai_1.expect)(redactor.scrub('string').data).to.equal('string');
409
+ (0, chai_1.expect)(redactor.scrub(42).data).to.equal(42);
410
+ (0, chai_1.expect)(redactor.scrub(true).data).to.equal(true);
411
+ (0, chai_1.expect)(redactor.scrub(null).data).to.equal(null);
412
+ });
413
+ });
414
+ describe('Type Safety', () => {
415
+ it('preserves TypeScript types', () => {
416
+ const redactor = (0, generic_js_1.createRedactor)({ fields: ['password'] });
417
+ const entry = {
418
+ level: 'info',
419
+ message: 'User login',
420
+ user: 'john',
421
+ password: 'secret',
422
+ };
423
+ const result = redactor.scrub(entry);
424
+ // result.data should maintain LogEntry type
425
+ (0, chai_1.expect)(result.data.level).to.be.a('string');
426
+ (0, chai_1.expect)(result.data.message).to.be.a('string');
427
+ (0, chai_1.expect)(result.data.user).to.be.a('string');
428
+ (0, chai_1.expect)(result.data.password).to.equal('[SCRUBBED]');
429
+ });
430
+ });
431
+ });
432
+ //# sourceMappingURL=generic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.test.js","sourceRoot":"","sources":["../../../../src/adapters/logging/generic.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,+BAA8B;AAC9B,6CAA8C;AAC9C,wDAAkD;AAClD,sDAA+E;AAE/E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1D,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,sBAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEpE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC;aAC3C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,WAAW;gBACrB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;aACrC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,OAAO;gBACrB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,KAAK,EAAE,CAAC,YAAY,EAAE,+BAA+B,CAAC;aACvD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,kBAAkB;iBAC1B;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,iBAAiB;wBAChC,cAAc,EAAE,kBAAkB;qBACnC;iBACF;aACF,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACzE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAC1D,kBAAkB,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,QAAQ,EAAE;oBACR,wBAAwB,EAAE,MAAM;oBAChC,0BAA0B,EAAE,cAAc;iBAC3C;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,OAAO,EAAE,yDAAyD;aACnE,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAClC,+CAA+C,CAChD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,KAAK,EAAE,CAAC,YAAY,CAAC;gBACrB,QAAQ,EAAE,CAAC,wBAAwB,CAAC;aACrC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,kBAAkB;oBACzB,QAAQ,EAAE,QAAQ;iBACnB;gBACD,OAAO,EAAE,kBAAkB;aAC5B,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,WAAW,EAAE,YAAY;aAC1B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,iBAAiB,GAAG,IAAA,2BAAc,EAAC;gBACvC,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,MAAM,oBAAoB,GAAG,IAAA,2BAAc,EAAC;gBAC1C,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE;oBACN,QAAQ,EAAE,QAAQ;iBACnB;aACF,CAAC;YAEF,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAEpE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAA,aAAM,EAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAChE,iDAAiD;YACjD,oEAAoE;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,0BAAa,EAAE,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,UAAU;gBACxB,OAAO,EAAE,QAAQ;gBACjB,KAAK,EAAE,kBAAkB;aAC1B,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,wBAAW,EAAE,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,kBAAkB;gBACzB,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,aAAa;aACvB,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,uBAAU,EAAE,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,qBAAqB;gBAClC,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,kBAAkB;aAChC,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACvD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACvD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,GAAG,0BAAa,EAAE,GAAG,wBAAW,EAAE,GAAG,uBAAU,CAAC;aAC1D,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ,EAAE,gBAAgB;gBACpC,KAAK,EAAE,kBAAkB,EAAE,cAAc;gBACzC,GAAG,EAAE,KAAK,EAAE,aAAa;gBACzB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,sCAAsC;YACtC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YAEtE,iCAAiC;YACjC,MAAM,QAAQ,GAAG;gBACf,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE;oBACR,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,WAAW;oBACrB,QAAQ,EAAE,UAAU;oBACpB,EAAE,EAAE,aAAa;iBAClB;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,mCAAmC;YACnC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,kCAAkC;YAClC,MAAM,QAAQ,GAAG;gBACf,KAAK,EAAE,EAAE,EAAE,OAAO;gBAClB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,GAAG,EAAE,aAAa;gBAClB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,GAAG,EAAE;oBACH,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,YAAY;iBAClB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,qCAAqC;YACrC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAEnE,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,EAAE;gBACT,GAAG,EAAE,2BAA2B;gBAChC,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,IAAI,IAAI,EAAE;aACjB,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG;gBACX,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAC3D,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAC3D,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;aAChC,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YACjD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACzD,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,iFAAiF;YACjF,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC;gBAC9B,MAAM,EAAE,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC;gBAC1D,KAAK,EAAE,CAAC,0BAA0B,CAAC;aACpC,CAAC,CAAC;YAEH,gCAAgC;YAChC,MAAM,SAAS,GAAG;gBAChB,SAAS,EAAE,WAAW;gBACtB,aAAa,EAAE,WAAW;gBAC1B,YAAY,EAAE,gCAAgC;gBAC9C,KAAK,EAAE;oBACL,WAAW,EAAE;wBACX,YAAY,EAAE,WAAW;wBACzB,aAAa,EAAE,YAAY;wBAC3B,MAAM,EAAE,QAAQ;qBACjB;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEzC,wDAAwD;YACxD,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAEjD,0BAA0B;YAC1B,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAC1D,YAAY,CACb,CAAC;YACF,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAExD,0BAA0B;YAC1B,oBAAoB;YACpB,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAEnD,sCAAsC;YACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAExC,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAA,aAAM,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB;YACjE,IAAA,aAAM,EAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC;YAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,QAAQ,CAAC,KAAK,CAAC;oBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,aAAa;oBACtB,IAAI,EAAE,OAAO,CAAC,EAAE;oBAChB,QAAQ,EAAE,SAAS,CAAC,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;YAE3C,iEAAiE;YACjE,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,kCAAkC;YAClC,MAAM,WAAW,GAA4B;gBAC3C,KAAK,EAAE,MAAM;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;oBACxB,EAAE,EAAE,CAAC;oBACL,IAAI,EAAE,QAAQ,CAAC,EAAE;oBACjB,QAAQ,EAAE,SAAS,CAAC,EAAE;oBACtB,QAAQ,EAAE;wBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,UAAU,EAAE,CAAC,GAAG,EAAE;qBACnB;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAE9B,IAAA,aAAM,EAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;YAC3D,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;YAEH,uEAAuE;YACvE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,0CAA0C;YAC1C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC7C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,GAAG,GAA4B;gBACnC,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ;aACnB,CAAC;YACF,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,qBAAqB;YAErC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEnC,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1C,wCAAwC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAQpC,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAa;gBACtB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAErC,4CAA4C;YAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PII_PATTERNS = void 0;
4
+ /**
5
+ * Regex patterns for detecting PII in string content
6
+ */
7
+ exports.PII_PATTERNS = [
8
+ // Social Security Numbers (US)
9
+ /\b\d{3}-\d{2}-\d{4}\b/g,
10
+ // Email addresses
11
+ /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
12
+ // Phone numbers (US format)
13
+ /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g,
14
+ // JWT tokens
15
+ /\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
16
+ ];
17
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/core/patterns.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,YAAY,GAAG;IAC1B,+BAA+B;IAC/B,wBAAwB;IAExB,kBAAkB;IAClB,sDAAsD;IAEtD,4BAA4B;IAC5B,gCAAgC;IAEhC,aAAa;IACb,2DAA2D;CAC5D,CAAC"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PCI_FIELDS = exports.GDPR_FIELDS = exports.HEROKU_FIELDS = void 0;
4
+ /**
5
+ * Heroku-specific sensitive field patterns
6
+ *
7
+ * Consolidated list of field names and patterns that contain sensitive data in Heroku applications.
8
+ *
9
+ * Use this preset to ensure consistent PII handling across Heroku services.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { HEROKU_FIELDS } from '@heroku/js-blanket/core/presets';
14
+ * import { Scrubber } from '@heroku/js-blanket';
15
+ *
16
+ * const scrubber = new Scrubber({ fields: HEROKU_FIELDS });
17
+ * const result = scrubber.scrub(data);
18
+ * ```
19
+ */
20
+ exports.HEROKU_FIELDS = [
21
+ // Authentication & Sessions
22
+ 'access_token',
23
+ /api[-_]?key/i, // Matches api_key, api-key, apikey (case insensitive)
24
+ 'authenticity_token',
25
+ 'heroku_oauth_token',
26
+ 'heroku_session_nonce',
27
+ 'heroku_user_session',
28
+ 'oauth_token',
29
+ 'sudo_oauth_token',
30
+ 'super_user_session_secret',
31
+ 'user_session_secret',
32
+ 'postgres_session_nonce',
33
+ // Passwords & Secrets
34
+ 'password',
35
+ 'passwd',
36
+ 'old_secret',
37
+ 'secret',
38
+ 'secret_token',
39
+ 'confirm_password',
40
+ 'password_confirmation',
41
+ /client[-_]?secret/i, // Matches client_secret, client-secret, clientsecret
42
+ // Tokens
43
+ 'token',
44
+ 'bouncer.token',
45
+ 'bouncer.refresh_token',
46
+ // Headers (case-insensitive)
47
+ /authorization/i,
48
+ /cookie/i,
49
+ /x-refresh-token/i,
50
+ // SSO & Sessions
51
+ 'www-sso-session',
52
+ // Payment
53
+ 'payment_method',
54
+ // Infrastructure
55
+ 'logplexUrl',
56
+ ];
57
+ /**
58
+ * GDPR-relevant PII field patterns
59
+ *
60
+ * Field names that typically contain personally identifiable information (PII)
61
+ * regulated by GDPR (General Data Protection Regulation).
62
+ *
63
+ * Use this preset when handling EU user data to ensure compliance with GDPR requirements.
64
+ *
65
+ * @see {@link https://gdpr.eu/what-is-gdpr/|GDPR Official Documentation}
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * import { GDPR_FIELDS, HEROKU_FIELDS } from '@heroku/js-blanket/core/presets';
70
+ * import { Scrubber } from '@heroku/js-blanket';
71
+ *
72
+ * // Combine multiple presets
73
+ * const scrubber = new Scrubber({
74
+ * fields: [...HEROKU_FIELDS, ...GDPR_FIELDS]
75
+ * });
76
+ * ```
77
+ */
78
+ exports.GDPR_FIELDS = [
79
+ 'email',
80
+ 'phone',
81
+ 'address',
82
+ 'postal_code',
83
+ 'ssn',
84
+ 'tax_id',
85
+ ];
86
+ /**
87
+ * PCI-DSS relevant field patterns
88
+ *
89
+ * Field names that typically contain payment card information regulated by
90
+ * PCI-DSS (Payment Card Industry Data Security Standard).
91
+ *
92
+ * Use this preset when handling payment card data to help maintain PCI-DSS compliance.
93
+ *
94
+ * **Important**: This preset helps reduce exposure of sensitive payment data in logs and
95
+ * error reports, but is not a substitute for full PCI-DSS compliance measures.
96
+ *
97
+ * @see {@link https://www.pcisecuritystandards.org/|PCI Security Standards Council}
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { PCI_FIELDS } from '@heroku/js-blanket/core/presets';
102
+ * import { Scrubber } from '@heroku/js-blanket';
103
+ *
104
+ * const scrubber = new Scrubber({
105
+ * fields: PCI_FIELDS,
106
+ * patterns: [/\d{4}-\d{4}-\d{4}-\d{4}/g] // Also scrub card numbers in text
107
+ * });
108
+ * ```
109
+ */
110
+ exports.PCI_FIELDS = [
111
+ 'card_number',
112
+ 'cvv',
113
+ 'credit_card',
114
+ 'payment_method',
115
+ ];
116
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/core/presets.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;GAeG;AACU,QAAA,aAAa,GAAG;IAC3B,4BAA4B;IAC5B,cAAc;IACd,cAAc,EAAE,sDAAsD;IACtE,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,qBAAqB;IACrB,aAAa;IACb,kBAAkB;IAClB,2BAA2B;IAC3B,qBAAqB;IACrB,wBAAwB;IAExB,sBAAsB;IACtB,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,kBAAkB;IAClB,uBAAuB;IACvB,oBAAoB,EAAE,qDAAqD;IAE3E,SAAS;IACT,OAAO;IACP,eAAe;IACf,uBAAuB;IAEvB,6BAA6B;IAC7B,gBAAgB;IAChB,SAAS;IACT,kBAAkB;IAElB,iBAAiB;IACjB,iBAAiB;IAEjB,UAAU;IACV,gBAAgB;IAEhB,iBAAiB;IACjB,YAAY;CACb,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACU,QAAA,WAAW,GAAG;IACzB,OAAO;IACP,OAAO;IACP,SAAS;IACT,aAAa;IACb,KAAK;IACL,QAAQ;CACT,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACU,QAAA,UAAU,GAAG;IACxB,aAAa;IACb,KAAK;IACL,aAAa;IACb,gBAAgB;CACjB,CAAC"}