@optimizely-opal/opal-tool-ocp-sdk 1.0.0-beta.1 → 1.0.0-beta.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.
Files changed (45) hide show
  1. package/README.md +42 -0
  2. package/dist/function/GlobalToolFunction.d.ts +1 -0
  3. package/dist/function/GlobalToolFunction.d.ts.map +1 -1
  4. package/dist/function/GlobalToolFunction.js +8 -0
  5. package/dist/function/GlobalToolFunction.js.map +1 -1
  6. package/dist/function/GlobalToolFunction.test.js +3 -0
  7. package/dist/function/GlobalToolFunction.test.js.map +1 -1
  8. package/dist/function/ToolFunction.d.ts +7 -1
  9. package/dist/function/ToolFunction.d.ts.map +1 -1
  10. package/dist/function/ToolFunction.js +14 -1
  11. package/dist/function/ToolFunction.js.map +1 -1
  12. package/dist/function/ToolFunction.test.js +3 -0
  13. package/dist/function/ToolFunction.test.js.map +1 -1
  14. package/dist/logging/ToolLogger.d.ts +34 -0
  15. package/dist/logging/ToolLogger.d.ts.map +1 -0
  16. package/dist/logging/ToolLogger.js +153 -0
  17. package/dist/logging/ToolLogger.js.map +1 -0
  18. package/dist/logging/ToolLogger.test.d.ts +2 -0
  19. package/dist/logging/ToolLogger.test.d.ts.map +1 -0
  20. package/dist/logging/ToolLogger.test.js +646 -0
  21. package/dist/logging/ToolLogger.test.js.map +1 -0
  22. package/dist/service/Service.d.ts.map +1 -1
  23. package/dist/service/Service.js +17 -0
  24. package/dist/service/Service.js.map +1 -1
  25. package/dist/service/Service.test.js +114 -6
  26. package/dist/service/Service.test.js.map +1 -1
  27. package/dist/validation/ParameterValidator.d.ts +42 -0
  28. package/dist/validation/ParameterValidator.d.ts.map +1 -0
  29. package/dist/validation/ParameterValidator.js +122 -0
  30. package/dist/validation/ParameterValidator.js.map +1 -0
  31. package/dist/validation/ParameterValidator.test.d.ts +2 -0
  32. package/dist/validation/ParameterValidator.test.d.ts.map +1 -0
  33. package/dist/validation/ParameterValidator.test.js +282 -0
  34. package/dist/validation/ParameterValidator.test.js.map +1 -0
  35. package/package.json +1 -1
  36. package/src/function/GlobalToolFunction.test.ts +3 -0
  37. package/src/function/GlobalToolFunction.ts +11 -0
  38. package/src/function/ToolFunction.test.ts +3 -0
  39. package/src/function/ToolFunction.ts +19 -1
  40. package/src/logging/ToolLogger.test.ts +753 -0
  41. package/src/logging/ToolLogger.ts +177 -0
  42. package/src/service/Service.test.ts +155 -14
  43. package/src/service/Service.ts +19 -1
  44. package/src/validation/ParameterValidator.test.ts +341 -0
  45. package/src/validation/ParameterValidator.ts +153 -0
@@ -0,0 +1,646 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ToolLogger_1 = require("./ToolLogger");
4
+ const app_sdk_1 = require("@zaiusinc/app-sdk");
5
+ // Mock the logger
6
+ jest.mock('@zaiusinc/app-sdk', () => ({
7
+ logger: {
8
+ info: jest.fn()
9
+ },
10
+ LogVisibility: {
11
+ Zaius: 'zaius'
12
+ },
13
+ Headers: jest.fn(),
14
+ Response: jest.fn()
15
+ }));
16
+ describe('ToolLogger', () => {
17
+ const mockLogger = app_sdk_1.logger;
18
+ beforeEach(() => {
19
+ jest.clearAllMocks();
20
+ });
21
+ // Helper function to check JSON string logs
22
+ const expectJsonLog = (expectedData) => {
23
+ expect(mockLogger.info).toHaveBeenCalledWith(app_sdk_1.LogVisibility.Zaius, JSON.stringify(expectedData));
24
+ };
25
+ const createMockRequest = (overrides = {}) => {
26
+ const defaultRequest = {
27
+ path: '/test-tool',
28
+ bodyJSON: {
29
+ parameters: {
30
+ name: 'test',
31
+ value: 'data'
32
+ }
33
+ },
34
+ headers: {
35
+ get: jest.fn().mockReturnValue('application/json')
36
+ }
37
+ };
38
+ return { ...defaultRequest, ...overrides };
39
+ };
40
+ const createMockResponse = (status = 200, bodyJSON = {}, headers = {}) => {
41
+ const mockHeaders = {
42
+ get: jest.fn().mockImplementation((name) => {
43
+ if (name === 'content-type')
44
+ return 'application/json';
45
+ return headers[name] || null;
46
+ })
47
+ };
48
+ const response = {
49
+ status,
50
+ headers: mockHeaders,
51
+ _bodyJSON: bodyJSON
52
+ };
53
+ // Add getter for bodyJSON that returns the stored value
54
+ Object.defineProperty(response, 'bodyJSON', {
55
+ get() {
56
+ return this._bodyJSON;
57
+ },
58
+ set(value) {
59
+ this._bodyJSON = value;
60
+ },
61
+ enumerable: true
62
+ });
63
+ // Add getter for bodyAsU8Array that recalculates based on current bodyJSON
64
+ Object.defineProperty(response, 'bodyAsU8Array', {
65
+ get() {
66
+ if (this._bodyJSON !== null && this._bodyJSON !== undefined) {
67
+ // This will throw for circular references, which matches real behavior
68
+ const jsonString = JSON.stringify(this._bodyJSON);
69
+ return new Uint8Array(Buffer.from(jsonString));
70
+ }
71
+ return undefined;
72
+ },
73
+ enumerable: true
74
+ });
75
+ return response;
76
+ };
77
+ describe('logRequest', () => {
78
+ it('should log request with parameters', () => {
79
+ const req = createMockRequest();
80
+ ToolLogger_1.ToolLogger.logRequest(req);
81
+ const expectedLog = {
82
+ event: 'opal_tool_request',
83
+ path: '/test-tool',
84
+ parameters: {
85
+ name: 'test',
86
+ value: 'data'
87
+ }
88
+ };
89
+ expect(mockLogger.info).toHaveBeenCalledWith(app_sdk_1.LogVisibility.Zaius, JSON.stringify(expectedLog));
90
+ });
91
+ it('should handle request without parameters', () => {
92
+ const req = createMockRequest({
93
+ bodyJSON: null
94
+ });
95
+ ToolLogger_1.ToolLogger.logRequest(req);
96
+ expectJsonLog({
97
+ event: 'opal_tool_request',
98
+ path: '/test-tool',
99
+ parameters: null
100
+ });
101
+ });
102
+ it('should use bodyJSON as parameters when no parameters field exists', () => {
103
+ const req = createMockRequest({
104
+ bodyJSON: {
105
+ name: 'direct',
106
+ action: 'test'
107
+ }
108
+ });
109
+ ToolLogger_1.ToolLogger.logRequest(req);
110
+ expectJsonLog({
111
+ event: 'opal_tool_request',
112
+ path: '/test-tool',
113
+ parameters: {
114
+ name: 'direct',
115
+ action: 'test'
116
+ }
117
+ });
118
+ });
119
+ it('should redact all sensitive field variations', () => {
120
+ const req = createMockRequest({
121
+ bodyJSON: {
122
+ parameters: {
123
+ username: 'john',
124
+ password: 'secret123',
125
+ api_key: 'key123',
126
+ secret: 'mysecret',
127
+ token: 'abc123',
128
+ auth: 'authdata',
129
+ credentials: 'creds',
130
+ access_token: 'access123',
131
+ refresh_token: 'refresh123',
132
+ private_key: 'privatekey',
133
+ client_secret: 'clientsecret',
134
+ normal_field: 'visible'
135
+ }
136
+ }
137
+ });
138
+ ToolLogger_1.ToolLogger.logRequest(req);
139
+ expectJsonLog({
140
+ event: 'opal_tool_request',
141
+ path: '/test-tool',
142
+ parameters: {
143
+ username: 'john',
144
+ password: '[REDACTED]',
145
+ api_key: '[REDACTED]',
146
+ secret: '[REDACTED]',
147
+ token: '[REDACTED]',
148
+ auth: '[REDACTED]',
149
+ credentials: '[REDACTED]',
150
+ access_token: '[REDACTED]',
151
+ refresh_token: '[REDACTED]',
152
+ private_key: '[REDACTED]',
153
+ client_secret: '[REDACTED]',
154
+ normal_field: 'visible'
155
+ }
156
+ });
157
+ });
158
+ it('should redact sensitive fields with case variations', () => {
159
+ const req = createMockRequest({
160
+ bodyJSON: {
161
+ parameters: {
162
+ PASSWORD: 'secret1',
163
+ API_KEY: 'secret2',
164
+ clientSecret: 'secret3',
165
+ user_password: 'secret4',
166
+ oauth_token: 'secret5',
167
+ ssh_key: 'secret6',
168
+ normal_field: 'visible'
169
+ }
170
+ }
171
+ });
172
+ ToolLogger_1.ToolLogger.logRequest(req);
173
+ expectJsonLog({
174
+ event: 'opal_tool_request',
175
+ path: '/test-tool',
176
+ parameters: {
177
+ PASSWORD: '[REDACTED]',
178
+ API_KEY: '[REDACTED]',
179
+ clientSecret: '[REDACTED]',
180
+ user_password: '[REDACTED]',
181
+ oauth_token: '[REDACTED]',
182
+ ssh_key: '[REDACTED]',
183
+ normal_field: 'visible'
184
+ }
185
+ });
186
+ });
187
+ it('should truncate long string values', () => {
188
+ const longString = 'a'.repeat(150);
189
+ const req = createMockRequest({
190
+ bodyJSON: {
191
+ parameters: {
192
+ description: longString,
193
+ short_field: 'normal'
194
+ }
195
+ }
196
+ });
197
+ ToolLogger_1.ToolLogger.logRequest(req);
198
+ expectJsonLog({
199
+ event: 'opal_tool_request',
200
+ path: '/test-tool',
201
+ parameters: {
202
+ description: `${'a'.repeat(100)}... (truncated, 150 chars total)`,
203
+ short_field: 'normal'
204
+ }
205
+ });
206
+ });
207
+ it('should truncate large arrays', () => {
208
+ const largeArray = Array.from({ length: 15 }, (_, i) => `item${i}`);
209
+ const req = createMockRequest({
210
+ bodyJSON: {
211
+ parameters: {
212
+ items: largeArray,
213
+ small_array: ['a', 'b']
214
+ }
215
+ }
216
+ });
217
+ ToolLogger_1.ToolLogger.logRequest(req);
218
+ expectJsonLog({
219
+ event: 'opal_tool_request',
220
+ path: '/test-tool',
221
+ parameters: {
222
+ items: [
223
+ ...largeArray.slice(0, 10),
224
+ '... (5 more items truncated)'
225
+ ],
226
+ small_array: ['a', 'b']
227
+ }
228
+ });
229
+ });
230
+ it('should handle nested objects with sensitive fields', () => {
231
+ const req = createMockRequest({
232
+ bodyJSON: {
233
+ parameters: {
234
+ user: {
235
+ name: 'John',
236
+ email: 'john@example.com',
237
+ password: 'secret123'
238
+ },
239
+ config: {
240
+ database: {
241
+ host: 'localhost',
242
+ port: 5432,
243
+ password: 'dbpass'
244
+ },
245
+ api_key: 'apikey123'
246
+ }
247
+ }
248
+ }
249
+ });
250
+ ToolLogger_1.ToolLogger.logRequest(req);
251
+ expectJsonLog({
252
+ event: 'opal_tool_request',
253
+ path: '/test-tool',
254
+ parameters: {
255
+ user: {
256
+ name: 'John',
257
+ email: '[REDACTED]',
258
+ password: '[REDACTED]'
259
+ },
260
+ config: {
261
+ database: {
262
+ host: 'localhost',
263
+ port: 5432,
264
+ password: '[REDACTED]'
265
+ },
266
+ api_key: '[REDACTED]'
267
+ }
268
+ }
269
+ });
270
+ });
271
+ it('should handle null and undefined values', () => {
272
+ const req = createMockRequest({
273
+ bodyJSON: {
274
+ parameters: {
275
+ nullValue: null,
276
+ undefinedValue: undefined,
277
+ emptyString: '',
278
+ zero: 0,
279
+ false: false,
280
+ password: null // sensitive field with null value
281
+ }
282
+ }
283
+ });
284
+ ToolLogger_1.ToolLogger.logRequest(req);
285
+ expectJsonLog({
286
+ event: 'opal_tool_request',
287
+ path: '/test-tool',
288
+ parameters: {
289
+ nullValue: null,
290
+ emptyString: '',
291
+ zero: 0,
292
+ false: false,
293
+ password: '[REDACTED]'
294
+ }
295
+ });
296
+ });
297
+ it('should handle arrays in sensitive fields', () => {
298
+ const req = createMockRequest({
299
+ bodyJSON: {
300
+ parameters: {
301
+ credentials: ['user', 'pass', 'token'],
302
+ public_list: ['item1', 'item2']
303
+ }
304
+ }
305
+ });
306
+ ToolLogger_1.ToolLogger.logRequest(req);
307
+ expectJsonLog({
308
+ event: 'opal_tool_request',
309
+ path: '/test-tool',
310
+ parameters: {
311
+ credentials: '[REDACTED]',
312
+ public_list: ['item1', 'item2']
313
+ }
314
+ });
315
+ });
316
+ it('should handle objects in sensitive fields', () => {
317
+ const req = createMockRequest({
318
+ bodyJSON: {
319
+ parameters: {
320
+ auth: {
321
+ username: 'john',
322
+ password: 'secret'
323
+ },
324
+ public_config: {
325
+ timeout: 30,
326
+ retries: 3
327
+ }
328
+ }
329
+ }
330
+ });
331
+ ToolLogger_1.ToolLogger.logRequest(req);
332
+ expectJsonLog({
333
+ event: 'opal_tool_request',
334
+ path: '/test-tool',
335
+ parameters: {
336
+ auth: '[REDACTED]',
337
+ public_config: {
338
+ timeout: 30,
339
+ retries: 3
340
+ }
341
+ }
342
+ });
343
+ });
344
+ it('should respect max depth to prevent infinite recursion', () => {
345
+ const deepObject = { level: 0, data: 'test' };
346
+ let current = deepObject;
347
+ // Create a very deep nested object (deeper than maxDepth)
348
+ for (let i = 1; i <= 10; i++) {
349
+ current.nested = { level: i, data: `level${i}` };
350
+ current = current.nested;
351
+ }
352
+ const req = createMockRequest({
353
+ bodyJSON: { parameters: { deep: deepObject } }
354
+ });
355
+ // Should not throw error or cause infinite recursion
356
+ expect(() => ToolLogger_1.ToolLogger.logRequest(req)).not.toThrow();
357
+ expect(mockLogger.info).toHaveBeenCalled();
358
+ });
359
+ it('should replace deeply nested objects with MAX_DEPTH_EXCEEDED placeholder', () => {
360
+ // Create an object with exactly 6 levels (exceeds maxDepth of 5)
361
+ const deepObject = {
362
+ level1: {
363
+ level2: {
364
+ level3: {
365
+ level4: {
366
+ level5: {
367
+ level6: {
368
+ password: 'should-not-be-visible',
369
+ credit_card: '1234-5678-9012-3456',
370
+ data: 'sensitive-info'
371
+ }
372
+ }
373
+ }
374
+ }
375
+ }
376
+ }
377
+ };
378
+ const req = createMockRequest({
379
+ bodyJSON: { parameters: { deep: deepObject } }
380
+ });
381
+ ToolLogger_1.ToolLogger.logRequest(req);
382
+ // Verify that the deeply nested object is replaced with placeholder
383
+ const logCall = mockLogger.info.mock.calls[0];
384
+ const loggedData = JSON.parse(logCall[1]);
385
+ // Navigate to the deeply nested part that should be replaced
386
+ // At maxDepth=5, the 5th level (level4) gets replaced with the placeholder
387
+ const level4 = loggedData.parameters.deep.level1.level2.level3.level4;
388
+ expect(level4).toBe('[MAX_DEPTH_EXCEEDED]');
389
+ });
390
+ it('should handle arrays containing deeply nested objects that exceed max depth', () => {
391
+ // Create a structure where the array is shallow enough to be processed (depth 3),
392
+ // but individual objects within the array exceed the max depth
393
+ const arrayWithDeepObjects = {
394
+ level1: {
395
+ items: [
396
+ {
397
+ level2: {
398
+ level3: {
399
+ level4: {
400
+ level5: {
401
+ password: 'secret-in-deep-array-object',
402
+ credit_card: '1234-5678-9012-3456'
403
+ }
404
+ }
405
+ }
406
+ }
407
+ },
408
+ 'simple-item',
409
+ {
410
+ shallow: 'data'
411
+ },
412
+ {
413
+ level2: {
414
+ level3: {
415
+ level4: {
416
+ another: 'deep-object'
417
+ }
418
+ }
419
+ }
420
+ }
421
+ ]
422
+ }
423
+ };
424
+ const req = createMockRequest({
425
+ bodyJSON: { parameters: arrayWithDeepObjects }
426
+ });
427
+ ToolLogger_1.ToolLogger.logRequest(req);
428
+ // Verify the array structure and depth handling
429
+ const logCall = mockLogger.info.mock.calls[0];
430
+ const loggedData = JSON.parse(logCall[1]);
431
+ const items = loggedData.parameters.level1.items;
432
+ // First item: deeply nested object with inner parts replaced by placeholder
433
+ expect(items[0]).toEqual({
434
+ level2: {
435
+ level3: '[MAX_DEPTH_EXCEEDED]'
436
+ }
437
+ });
438
+ // Second item: simple string should remain unchanged
439
+ expect(items[1]).toBe('simple-item');
440
+ // Third item: shallow object should be processed normally
441
+ expect(items[2]).toEqual({ shallow: 'data' });
442
+ // Fourth item: another deeply nested object with inner parts replaced by placeholder
443
+ expect(items[3]).toEqual({
444
+ level2: {
445
+ level3: '[MAX_DEPTH_EXCEEDED]'
446
+ }
447
+ });
448
+ });
449
+ });
450
+ describe('logResponse', () => {
451
+ it('should log successful response with all details', () => {
452
+ const req = createMockRequest();
453
+ const response = createMockResponse(200, { result: 'success', data: 'test' });
454
+ ToolLogger_1.ToolLogger.logResponse(req, response, 150);
455
+ const expectedLog = {
456
+ event: 'opal_tool_response',
457
+ path: '/test-tool',
458
+ duration: '150ms',
459
+ status: 200,
460
+ contentType: 'application/json',
461
+ contentLength: 34, // JSON.stringify({ result: 'success', data: 'test' }).length
462
+ success: true
463
+ };
464
+ expect(mockLogger.info).toHaveBeenCalledWith(app_sdk_1.LogVisibility.Zaius, JSON.stringify(expectedLog));
465
+ });
466
+ it('should log error response', () => {
467
+ const req = createMockRequest();
468
+ const response = createMockResponse(400, { error: 'Bad request' });
469
+ ToolLogger_1.ToolLogger.logResponse(req, response, 75);
470
+ expectJsonLog({
471
+ event: 'opal_tool_response',
472
+ path: '/test-tool',
473
+ duration: '75ms',
474
+ status: 400,
475
+ contentType: 'application/json',
476
+ contentLength: 23,
477
+ success: false
478
+ });
479
+ });
480
+ it('should handle response without bodyJSON', () => {
481
+ const req = createMockRequest();
482
+ const response = createMockResponse(204);
483
+ response.bodyJSON = undefined;
484
+ ToolLogger_1.ToolLogger.logResponse(req, response);
485
+ expectJsonLog({
486
+ event: 'opal_tool_response',
487
+ path: '/test-tool',
488
+ status: 204,
489
+ contentType: 'application/json',
490
+ contentLength: 'unknown',
491
+ success: true
492
+ });
493
+ });
494
+ it('should handle response without processing time', () => {
495
+ const req = createMockRequest();
496
+ const response = createMockResponse(200, { data: 'test' });
497
+ ToolLogger_1.ToolLogger.logResponse(req, response);
498
+ expectJsonLog({
499
+ event: 'opal_tool_response',
500
+ path: '/test-tool',
501
+ status: 200,
502
+ contentType: 'application/json',
503
+ contentLength: 15,
504
+ success: true
505
+ });
506
+ });
507
+ it('should handle unknown content type', () => {
508
+ const req = createMockRequest();
509
+ const response = createMockResponse(200, { data: 'test' });
510
+ response.headers.get = jest.fn().mockReturnValue(null);
511
+ ToolLogger_1.ToolLogger.logResponse(req, response);
512
+ expectJsonLog({
513
+ event: 'opal_tool_response',
514
+ path: '/test-tool',
515
+ status: 200,
516
+ contentType: 'unknown',
517
+ contentLength: 15,
518
+ success: true
519
+ });
520
+ });
521
+ it('should handle content length calculation error', () => {
522
+ const req = createMockRequest();
523
+ const circularObj = { name: 'test' };
524
+ circularObj.self = circularObj; // Create circular reference
525
+ const response = createMockResponse(200, circularObj);
526
+ ToolLogger_1.ToolLogger.logResponse(req, response);
527
+ expectJsonLog({
528
+ event: 'opal_tool_response',
529
+ path: '/test-tool',
530
+ status: 200,
531
+ contentType: 'application/json',
532
+ contentLength: 'unknown',
533
+ success: true
534
+ });
535
+ });
536
+ it('should correctly identify success status codes', () => {
537
+ const req = createMockRequest();
538
+ const testCases = [
539
+ { status: 200, expected: true },
540
+ { status: 201, expected: true },
541
+ { status: 204, expected: true },
542
+ { status: 299, expected: true },
543
+ { status: 300, expected: false },
544
+ { status: 400, expected: false },
545
+ { status: 404, expected: false },
546
+ { status: 500, expected: false }
547
+ ];
548
+ testCases.forEach(({ status, expected }) => {
549
+ mockLogger.info.mockClear();
550
+ const response = createMockResponse(status);
551
+ ToolLogger_1.ToolLogger.logResponse(req, response);
552
+ expectJsonLog({
553
+ event: 'opal_tool_response',
554
+ path: '/test-tool',
555
+ status,
556
+ contentType: 'application/json',
557
+ contentLength: 2,
558
+ success: expected
559
+ });
560
+ });
561
+ });
562
+ it('should handle different content types', () => {
563
+ const req = createMockRequest();
564
+ const testCases = [
565
+ 'application/json',
566
+ 'text/plain',
567
+ 'application/xml',
568
+ 'text/html'
569
+ ];
570
+ testCases.forEach((contentType) => {
571
+ mockLogger.info.mockClear();
572
+ const response = createMockResponse(200, { data: 'test' });
573
+ response.headers.get = jest.fn().mockReturnValue(contentType);
574
+ ToolLogger_1.ToolLogger.logResponse(req, response);
575
+ expectJsonLog({
576
+ event: 'opal_tool_response',
577
+ path: '/test-tool',
578
+ status: 200,
579
+ contentType,
580
+ contentLength: 15,
581
+ success: true
582
+ });
583
+ });
584
+ });
585
+ });
586
+ describe('edge cases', () => {
587
+ it('should handle empty request bodyJSON', () => {
588
+ const req = createMockRequest({
589
+ bodyJSON: {}
590
+ });
591
+ ToolLogger_1.ToolLogger.logRequest(req);
592
+ expectJsonLog({
593
+ event: 'opal_tool_request',
594
+ path: '/test-tool',
595
+ parameters: {}
596
+ });
597
+ });
598
+ it('should handle request with only parameters field', () => {
599
+ const req = createMockRequest({
600
+ bodyJSON: {
601
+ parameters: {
602
+ field: 'value' // Changed from 'key' to 'field' to avoid sensitive field detection
603
+ }
604
+ }
605
+ });
606
+ ToolLogger_1.ToolLogger.logRequest(req);
607
+ expectJsonLog({
608
+ event: 'opal_tool_request',
609
+ path: '/test-tool',
610
+ parameters: {
611
+ field: 'value'
612
+ }
613
+ });
614
+ });
615
+ it('should handle mixed data types in parameters', () => {
616
+ const req = createMockRequest({
617
+ bodyJSON: {
618
+ parameters: {
619
+ string: 'text',
620
+ number: 42,
621
+ boolean: true,
622
+ array: [1, 2, 3],
623
+ object: { nested: 'value' },
624
+ nullValue: null,
625
+ password: 'secret'
626
+ }
627
+ }
628
+ });
629
+ ToolLogger_1.ToolLogger.logRequest(req);
630
+ expectJsonLog({
631
+ event: 'opal_tool_request',
632
+ path: '/test-tool',
633
+ parameters: {
634
+ string: 'text',
635
+ number: 42,
636
+ boolean: true,
637
+ array: [1, 2, 3],
638
+ object: { nested: 'value' },
639
+ nullValue: null,
640
+ password: '[REDACTED]'
641
+ }
642
+ });
643
+ });
644
+ });
645
+ });
646
+ //# sourceMappingURL=ToolLogger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolLogger.test.js","sourceRoot":"","sources":["../../src/logging/ToolLogger.test.ts"],"names":[],"mappings":"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"}