rollbar 2.26.3 → 2.26.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/.github/workflows/ci.yml +32 -10
  2. package/.lgtm.yml +7 -7
  3. package/.prettierignore +18 -0
  4. package/.vscode/settings.json +39 -0
  5. package/CHANGELOG.md +121 -35
  6. package/Gruntfile.js +48 -38
  7. package/README.md +2 -4
  8. package/bower.json +1 -3
  9. package/defaults.js +17 -5
  10. package/dist/plugins/jquery.min.js +1 -1
  11. package/dist/rollbar.js +5710 -5070
  12. package/dist/rollbar.js.map +1 -1
  13. package/dist/rollbar.min.js +1 -1
  14. package/dist/rollbar.min.js.map +1 -1
  15. package/dist/rollbar.named-amd.js +5716 -5081
  16. package/dist/rollbar.named-amd.js.map +1 -1
  17. package/dist/rollbar.named-amd.min.js +2 -1
  18. package/dist/rollbar.named-amd.min.js.map +1 -1
  19. package/dist/rollbar.noconflict.umd.js +5702 -5068
  20. package/dist/rollbar.noconflict.umd.js.map +1 -1
  21. package/dist/rollbar.noconflict.umd.min.js +2 -1
  22. package/dist/rollbar.noconflict.umd.min.js.map +1 -1
  23. package/dist/rollbar.snippet.js +1 -1
  24. package/dist/rollbar.umd.js +5716 -5082
  25. package/dist/rollbar.umd.js.map +1 -1
  26. package/dist/rollbar.umd.min.js +2 -1
  27. package/dist/rollbar.umd.min.js.map +1 -1
  28. package/docs/extension-exceptions.md +35 -30
  29. package/docs/migration_v0_to_v1.md +41 -38
  30. package/index.d.ts +270 -231
  31. package/karma.conf.js +15 -15
  32. package/package.json +3 -2
  33. package/prettier.config.js +7 -0
  34. package/src/api.js +21 -10
  35. package/src/apiUtility.js +12 -8
  36. package/src/browser/core.js +103 -65
  37. package/src/browser/defaults/scrubFields.js +3 -3
  38. package/src/browser/detection.js +7 -8
  39. package/src/browser/domUtility.js +18 -8
  40. package/src/browser/globalSetup.js +12 -6
  41. package/src/browser/logger.js +1 -1
  42. package/src/browser/plugins/jquery.js +35 -35
  43. package/src/browser/predicates.js +1 -1
  44. package/src/browser/rollbar.js +1 -1
  45. package/src/browser/rollbarWrapper.js +8 -5
  46. package/src/browser/shim.js +43 -19
  47. package/src/browser/snippet_callback.js +6 -4
  48. package/src/browser/telemetry.js +570 -358
  49. package/src/browser/transforms.js +46 -27
  50. package/src/browser/transport/fetch.js +16 -14
  51. package/src/browser/transport/xhr.js +29 -13
  52. package/src/browser/transport.js +82 -25
  53. package/src/browser/url.js +16 -8
  54. package/src/browser/wrapGlobals.js +27 -8
  55. package/src/defaults.js +3 -3
  56. package/src/errorParser.js +14 -11
  57. package/src/merge.js +32 -23
  58. package/src/notifier.js +16 -13
  59. package/src/predicates.js +43 -23
  60. package/src/queue.js +71 -39
  61. package/src/rateLimiter.js +59 -18
  62. package/src/react-native/logger.js +1 -1
  63. package/src/react-native/rollbar.js +59 -55
  64. package/src/react-native/transforms.js +13 -9
  65. package/src/react-native/transport.js +44 -34
  66. package/src/rollbar.js +22 -13
  67. package/src/scrub.js +0 -1
  68. package/src/server/locals.js +69 -39
  69. package/src/server/logger.js +4 -4
  70. package/src/server/parser.js +72 -47
  71. package/src/server/rollbar.js +133 -55
  72. package/src/server/sourceMap/stackTrace.js +33 -18
  73. package/src/server/telemetry/urlHelpers.js +9 -11
  74. package/src/server/telemetry.js +68 -45
  75. package/src/server/transforms.js +37 -21
  76. package/src/server/transport.js +62 -32
  77. package/src/telemetry.js +92 -28
  78. package/src/transforms.js +33 -21
  79. package/src/truncation.js +8 -5
  80. package/src/utility/headers.js +43 -43
  81. package/src/utility/replace.js +9 -0
  82. package/src/utility/traverse.js +1 -1
  83. package/src/utility.js +89 -52
  84. package/test/api.test.js +31 -29
  85. package/test/apiUtility.test.js +43 -44
  86. package/test/browser.core.test.js +141 -131
  87. package/test/browser.domUtility.test.js +52 -35
  88. package/test/browser.predicates.test.js +13 -13
  89. package/test/browser.rollbar.test.js +597 -503
  90. package/test/browser.telemetry.test.js +45 -38
  91. package/test/browser.transforms.test.js +146 -128
  92. package/test/browser.transport.test.js +54 -46
  93. package/test/browser.url.test.js +12 -11
  94. package/test/fixtures/locals.fixtures.js +245 -126
  95. package/test/notifier.test.js +90 -78
  96. package/test/predicates.test.js +260 -214
  97. package/test/queue.test.js +230 -214
  98. package/test/rateLimiter.test.js +50 -42
  99. package/test/react-native.rollbar.test.js +149 -115
  100. package/test/react-native.transforms.test.js +21 -23
  101. package/test/react-native.transport.test.js +23 -11
  102. package/test/server.lambda.test.js +70 -53
  103. package/test/server.locals.test.js +437 -210
  104. package/test/server.parser.test.js +32 -26
  105. package/test/server.predicates.test.js +45 -43
  106. package/test/server.rollbar.test.js +311 -259
  107. package/test/server.telemetry.test.js +208 -83
  108. package/test/server.transforms.test.js +455 -361
  109. package/test/server.transport.test.js +144 -76
  110. package/test/telemetry.test.js +46 -37
  111. package/test/transforms.test.js +68 -66
  112. package/test/truncation.test.js +55 -53
  113. package/test/utility.test.js +266 -222
  114. package/webpack.config.js +46 -42
  115. package/.gitmodules +0 -3
@@ -9,9 +9,11 @@ var https = require('https');
9
9
 
10
10
  process.env.NODE_ENV = process.env.NODE_ENV || 'test-node-env';
11
11
  var Rollbar = require('../src/server/rollbar');
12
+ var { mergeOptions } = require('../src/server/telemetry/urlHelpers');
13
+ const { URL } = require('url');
12
14
 
13
15
  function wait(ms) {
14
- return new Promise(resolve => {
16
+ return new Promise((resolve) => {
15
17
  setTimeout(resolve, ms);
16
18
  });
17
19
  }
@@ -31,14 +33,16 @@ async function message(rollbar) {
31
33
  }
32
34
 
33
35
  function request(transport, url, options, body) {
34
- return new Promise ((resolve, reject) => {
35
- var req = url ? transport.request(url, options) : transport.request(options);
36
+ return new Promise((resolve, reject) => {
37
+ var req = url
38
+ ? transport.request(url, options)
39
+ : transport.request(options);
36
40
 
37
- req.on('response', res => {
41
+ req.on('response', (res) => {
38
42
  resolve(res);
39
43
  });
40
44
 
41
- req.on('error', err => {
45
+ req.on('error', (err) => {
42
46
  reject(err);
43
47
  });
44
48
 
@@ -51,12 +55,12 @@ function request(transport, url, options, body) {
51
55
  }
52
56
 
53
57
  function requestWithCallback(transport, options, body) {
54
- return new Promise ((resolve, reject) => {
55
- var req = transport.request(options, function(res){
58
+ return new Promise((resolve, reject) => {
59
+ var req = transport.request(options, function (res) {
56
60
  resolve(res);
57
61
  });
58
62
 
59
- req.on('error', err => {
63
+ req.on('error', (err) => {
60
64
  reject(err);
61
65
  });
62
66
 
@@ -69,61 +73,77 @@ function requestWithCallback(transport, options, body) {
69
73
  }
70
74
 
71
75
  function stubPostWithResponse(url, status, headers, body) {
72
- return nock(url)
73
- .post('/api/users')
74
- .reply(status, body, headers);
76
+ return nock(url).post('/api/users').reply(status, body, headers);
75
77
  }
76
78
 
77
79
  function stubGetWithResponse(url, status, headers, body) {
78
- return nock(url)
79
- .get('/api/users')
80
- .reply(status, body, headers);
80
+ return nock(url).get('/api/users').reply(status, body, headers);
81
81
  }
82
82
 
83
83
  function stubGetWithError(url) {
84
- return nock(url)
85
- .get('/api/users')
86
- .replyWithError('dns error');
84
+ return nock(url).get('/api/users').replyWithError('dns error');
87
85
  }
88
86
 
89
- var testHeaders1 = { 'Content-Type': 'application/json', 'X-access-token': '123' }
90
- var testHeaders2 = { 'authorization': 'abc', foo: '456' }
91
- var testHeaders3 = { 'content-type': 'application/json', foo: '123' }
92
- var testHeaders4 = { 'authorization': 'abc', bar: '456' }
87
+ var testHeaders1 = {
88
+ 'Content-Type': 'application/json',
89
+ 'X-access-token': '123',
90
+ };
91
+ var testHeaders2 = { authorization: 'abc', foo: '456' };
92
+ var testHeaders3 = { 'content-type': 'application/json', foo: '123' };
93
+ var testHeaders4 = { authorization: 'abc', bar: '456' };
93
94
  var testBody1 = 'test body 1';
94
95
  var testBody2 = 'test body 2';
95
96
  var testMessage1 = 'test console message';
96
97
  var testMessage2 = 'test console error message';
97
98
  var testMessagePart = ', extra part';
98
99
 
99
- vows.describe('telemetry')
100
+ vows
101
+ .describe('telemetry')
100
102
  .addBatch({
101
103
  'with log and network capture enabled': {
102
- topic: function() {
104
+ topic: function () {
103
105
  var rollbar = new Rollbar({
104
106
  accessToken: 'abc123',
105
107
  captureUncaught: true,
106
- autoInstrument: true
108
+ autoInstrument: true,
107
109
  });
108
110
  rollbar.testData = {};
109
111
  var notifier = rollbar.client.notifier;
110
112
  rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
111
- rollbar.testData.getStub = stubGetWithResponse('http://example.com', 200, testHeaders3, testBody1);
112
- rollbar.testData.postStub = stubPostWithResponse('https://example.com', 201, testHeaders4, testBody2);
113
-
114
- var func = async function(callback) {
113
+ rollbar.testData.getStub = stubGetWithResponse(
114
+ 'http://example.com',
115
+ 200,
116
+ testHeaders3,
117
+ testBody1,
118
+ );
119
+ rollbar.testData.postStub = stubPostWithResponse(
120
+ 'https://example.com',
121
+ 201,
122
+ testHeaders4,
123
+ testBody2,
124
+ );
125
+
126
+ var func = async function (callback) {
115
127
  // Invoke telemetry events
116
128
  console.info(testMessage1, testMessagePart);
117
- rollbar.testData.response1 = await request(http, 'http://example.com/api/users', { method: 'GET', headers: testHeaders1 });
129
+ rollbar.testData.response1 = await request(
130
+ http,
131
+ 'http://example.com/api/users',
132
+ { method: 'GET', headers: testHeaders1 },
133
+ );
118
134
  console.error(testMessage2);
119
- rollbar.testData.response2 = await request(https, 'https://example.com/api/users', { method: 'POST', headers: testHeaders2 });
135
+ rollbar.testData.response2 = await request(
136
+ https,
137
+ 'https://example.com/api/users',
138
+ { method: 'POST', headers: testHeaders2 },
139
+ );
120
140
 
121
141
  await uncaught(rollbar);
122
142
  callback(rollbar);
123
- }
143
+ };
124
144
  func(this.callback);
125
145
  },
126
- 'exception payload should have telemetry': function(r) {
146
+ 'exception payload should have telemetry': function (r) {
127
147
  var addItemStub = r.testData.addItemStub;
128
148
  var response1 = r.testData.response1;
129
149
  var response2 = r.testData.response2;
@@ -140,23 +160,35 @@ vows.describe('telemetry')
140
160
  // Verify telemetry items and order
141
161
  assert.deepStrictEqual(telemetry[0].level, 'info');
142
162
  assert.deepStrictEqual(telemetry[0].type, 'log');
143
- assert.deepStrictEqual(telemetry[0].body.message, 'test console message , extra part\n');
163
+ assert.deepStrictEqual(
164
+ telemetry[0].body.message,
165
+ 'test console message , extra part\n',
166
+ );
144
167
 
145
168
  assert.deepStrictEqual(telemetry[1].level, 'info');
146
169
  assert.deepStrictEqual(telemetry[1].type, 'network');
147
170
  assert.deepStrictEqual(telemetry[1].body.method, 'GET');
148
- assert.deepStrictEqual(telemetry[1].body.url, 'http://example.com/api/users');
171
+ assert.deepStrictEqual(
172
+ telemetry[1].body.url,
173
+ 'http://example.com/api/users',
174
+ );
149
175
  assert.deepStrictEqual(telemetry[1].body.status_code, 200);
150
176
  assert.deepStrictEqual(telemetry[1].body.subtype, 'http');
151
177
 
152
178
  assert.deepStrictEqual(telemetry[2].level, 'error');
153
179
  assert.deepStrictEqual(telemetry[2].type, 'log');
154
- assert.deepStrictEqual(telemetry[2].body.message, 'test console error message\n');
180
+ assert.deepStrictEqual(
181
+ telemetry[2].body.message,
182
+ 'test console error message\n',
183
+ );
155
184
 
156
185
  assert.deepStrictEqual(telemetry[3].level, 'info');
157
186
  assert.deepStrictEqual(telemetry[3].type, 'network');
158
187
  assert.deepStrictEqual(telemetry[3].body.method, 'POST');
159
- assert.deepStrictEqual(telemetry[3].body.url, 'https://example.com/api/users');
188
+ assert.deepStrictEqual(
189
+ telemetry[3].body.url,
190
+ 'https://example.com/api/users',
191
+ );
160
192
  assert.deepStrictEqual(telemetry[3].body.status_code, 201);
161
193
  assert.deepStrictEqual(telemetry[3].body.subtype, 'http');
162
194
 
@@ -167,81 +199,129 @@ vows.describe('telemetry')
167
199
  assert.deepEqual(telemetry[3].body.response.headers, undefined);
168
200
 
169
201
  addItemStub.restore();
170
- }
171
- }
202
+ },
203
+ },
172
204
  })
173
205
  .addBatch({
174
206
  'with log and network capture enabled with headers enabled': {
175
- topic: function() {
207
+ topic: function () {
176
208
  var rollbar = new Rollbar({
177
209
  accessToken: 'abc123',
178
210
  captureUncaught: true,
179
211
  autoInstrument: {
180
212
  network: true,
181
213
  networkResponseHeaders: true,
182
- networkRequestHeaders: true
183
- }
214
+ networkRequestHeaders: true,
215
+ },
184
216
  });
185
217
  rollbar.testData = {};
186
218
  var notifier = rollbar.client.notifier;
187
219
  rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
188
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
189
- rollbar.testData.postStub = stubPostWithResponse('http://example.com', 201, testHeaders4, testBody2);
190
-
191
- var func = async function(callback) {
220
+ rollbar.testData.getStub = stubGetWithResponse(
221
+ 'https://example.com',
222
+ 200,
223
+ testHeaders3,
224
+ testBody1,
225
+ );
226
+ rollbar.testData.postStub = stubPostWithResponse(
227
+ 'http://example.com',
228
+ 201,
229
+ testHeaders4,
230
+ testBody2,
231
+ );
232
+
233
+ var func = async function (callback) {
192
234
  // Invoke telemetry events
193
235
  console.info(testMessage1, testMessagePart);
194
- rollbar.testData.response1 = await request(https, 'https://example.com/api/users', { method: 'GET', headers: testHeaders1 });
236
+ rollbar.testData.response1 = await request(
237
+ https,
238
+ 'https://example.com/api/users',
239
+ { method: 'GET', headers: testHeaders1 },
240
+ );
195
241
  console.error(testMessage2);
196
- rollbar.testData.response2 = await request(http, 'http://example.com/api/users', { method: 'POST', headers: testHeaders2 });
242
+ rollbar.testData.response2 = await request(
243
+ http,
244
+ 'http://example.com/api/users',
245
+ { method: 'POST', headers: testHeaders2 },
246
+ );
197
247
 
198
248
  await message(rollbar);
199
249
  callback(rollbar);
200
- }
250
+ };
201
251
  func(this.callback);
202
252
  },
203
- 'message payload should have telemetry': function(r) {
253
+ 'message payload should have telemetry': function (r) {
204
254
  var addItemStub = r.testData.addItemStub;
205
255
 
206
256
  assert.isTrue(addItemStub.called);
207
257
  var telemetry = addItemStub.getCall(0).args[3].data.body.telemetry;
208
258
 
209
259
  // Verify headers captures, with scrubbing
210
- assert.deepStrictEqual(telemetry[1].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
211
- assert.deepStrictEqual(telemetry[1].body.response.headers, { 'content-type': 'application/json', foo: '123' });
212
- assert.deepStrictEqual(telemetry[3].body.request_headers, { authorization: '********', foo: '456' });
213
- assert.deepStrictEqual(telemetry[3].body.response.headers, { authorization: '********', bar: '456' });
260
+ assert.deepStrictEqual(telemetry[1].body.request_headers, {
261
+ 'Content-Type': 'application/json',
262
+ 'X-access-token': '********',
263
+ });
264
+ assert.deepStrictEqual(telemetry[1].body.response.headers, {
265
+ 'content-type': 'application/json',
266
+ foo: '123',
267
+ });
268
+ assert.deepStrictEqual(telemetry[3].body.request_headers, {
269
+ authorization: '********',
270
+ foo: '456',
271
+ });
272
+ assert.deepStrictEqual(telemetry[3].body.response.headers, {
273
+ authorization: '********',
274
+ bar: '456',
275
+ });
214
276
 
215
277
  addItemStub.restore();
216
- }
217
- }
278
+ },
279
+ },
218
280
  })
219
281
  .addBatch({
220
282
  'with telemetry disabled': {
221
- topic: function() {
283
+ topic: function () {
222
284
  var rollbar = new Rollbar({
223
285
  accessToken: 'abc123',
224
- captureUncaught: true
286
+ captureUncaught: true,
225
287
  });
226
288
  rollbar.testData = {};
227
289
  var notifier = rollbar.client.notifier;
228
290
  rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
229
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
230
- rollbar.testData.postStub = stubPostWithResponse('https://example.com', 201, testHeaders4, testBody2);
231
-
232
- var func = async function(callback) {
291
+ rollbar.testData.getStub = stubGetWithResponse(
292
+ 'https://example.com',
293
+ 200,
294
+ testHeaders3,
295
+ testBody1,
296
+ );
297
+ rollbar.testData.postStub = stubPostWithResponse(
298
+ 'https://example.com',
299
+ 201,
300
+ testHeaders4,
301
+ testBody2,
302
+ );
303
+
304
+ var func = async function (callback) {
233
305
  // Invoke telemetry events
234
306
  console.info(testMessage1, testMessagePart);
235
- rollbar.testData.response1 = await request(https, 'https://example.com/api/users', { method: 'GET', headers: testHeaders1 });
307
+ rollbar.testData.response1 = await request(
308
+ https,
309
+ 'https://example.com/api/users',
310
+ { method: 'GET', headers: testHeaders1 },
311
+ );
236
312
  console.error(testMessage2);
237
- rollbar.testData.response2 = await request(https, 'https://example.com/api/users', { method: 'POST', headers: testHeaders2 });
313
+ rollbar.testData.response2 = await request(
314
+ https,
315
+ 'https://example.com/api/users',
316
+ { method: 'POST', headers: testHeaders2 },
317
+ );
238
318
 
239
319
  await message(rollbar);
240
320
  callback(rollbar);
241
- }
321
+ };
242
322
  func(this.callback);
243
323
  },
244
- 'payload should not have telemetry': function(r) {
324
+ 'payload should not have telemetry': function (r) {
245
325
  var addItemStub = r.testData.addItemStub;
246
326
 
247
327
  assert.isTrue(addItemStub.called);
@@ -249,26 +329,26 @@ vows.describe('telemetry')
249
329
 
250
330
  // Verify telemetry is empty
251
331
  assert.deepEqual(telemetry, []);
252
- }
253
- }
332
+ },
333
+ },
254
334
  })
255
335
  .addBatch({
256
336
  'with callback request and error response': {
257
- topic: function() {
337
+ topic: function () {
258
338
  var rollbar = new Rollbar({
259
339
  accessToken: 'abc123',
260
340
  captureUncaught: true,
261
341
  autoInstrument: {
262
342
  network: true,
263
343
  networkResponseHeaders: true,
264
- networkRequestHeaders: true
265
- }
344
+ networkRequestHeaders: true,
345
+ },
266
346
  });
267
347
  var notifier = rollbar.client.notifier;
268
348
  rollbar.testData = {};
269
349
  rollbar.testData.addItemStub = sinon.stub(notifier.queue, 'addItem');
270
350
 
271
- var func = async function(callback) {
351
+ var func = async function (callback) {
272
352
  var options = {
273
353
  method: 'GET',
274
354
  protocol: 'https:',
@@ -279,18 +359,29 @@ vows.describe('telemetry')
279
359
 
280
360
  // Invoke telemetry events
281
361
  console.info(testMessage1, testMessagePart);
282
- rollbar.testData.getStub = stubGetWithResponse('https://example.com', 200, testHeaders3, testBody1);
283
- rollbar.testData.response1 = await requestWithCallback(https, options).catch((e) => e);
362
+ rollbar.testData.getStub = stubGetWithResponse(
363
+ 'https://example.com',
364
+ 200,
365
+ testHeaders3,
366
+ testBody1,
367
+ );
368
+ rollbar.testData.response1 = await requestWithCallback(
369
+ https,
370
+ options,
371
+ ).catch((e) => e);
284
372
  console.error(testMessage2);
285
373
  rollbar.testData.errorStub = stubGetWithError('https://example.com');
286
- rollbar.testData.response2 = await requestWithCallback(https, options).catch((e) => e);
374
+ rollbar.testData.response2 = await requestWithCallback(
375
+ https,
376
+ options,
377
+ ).catch((e) => e);
287
378
 
288
379
  await message(rollbar);
289
380
  callback(rollbar);
290
- }
381
+ };
291
382
  func(this.callback);
292
383
  },
293
- 'message payload should have telemetry or error info': function(r) {
384
+ 'message payload should have telemetry or error info': function (r) {
294
385
  var addItemStub = r.testData.addItemStub;
295
386
  var response1 = r.testData.response1;
296
387
  var response2 = r.testData.response2;
@@ -304,15 +395,49 @@ vows.describe('telemetry')
304
395
  assert(response2 instanceof Error);
305
396
 
306
397
  // Verify telemetry
307
- assert.deepStrictEqual(telemetry[1].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
308
- assert.deepStrictEqual(telemetry[1].body.response.headers, { 'content-type': 'application/json', foo: '123' });
309
- assert.deepStrictEqual(telemetry[3].body.request_headers, { 'Content-Type': 'application/json', 'X-access-token': '********' });
398
+ assert.deepStrictEqual(telemetry[1].body.request_headers, {
399
+ 'Content-Type': 'application/json',
400
+ 'X-access-token': '********',
401
+ });
402
+ assert.deepStrictEqual(telemetry[1].body.response.headers, {
403
+ 'content-type': 'application/json',
404
+ foo: '123',
405
+ });
406
+ assert.deepStrictEqual(telemetry[3].body.request_headers, {
407
+ 'Content-Type': 'application/json',
408
+ 'X-access-token': '********',
409
+ });
310
410
  assert.deepStrictEqual(telemetry[3].body.response, undefined);
311
411
  assert.deepStrictEqual(telemetry[3].body.status_code, 0);
312
412
  assert.deepStrictEqual(telemetry[3].body.error, 'Error: dns error');
313
413
 
314
-
315
414
  addItemStub.restore();
316
- }
317
- }
318
- }).export(module, {error: false});
415
+ },
416
+ },
417
+ })
418
+ .addBatch({
419
+ 'while using autoinstrument': {
420
+ topic: function () {
421
+ const optionsUsingStringUrl = mergeOptions(
422
+ 'http://example.com/api/users',
423
+ { method: 'GET', headers: testHeaders1 },
424
+ );
425
+ const optionsUsingClassUrl = mergeOptions(
426
+ new URL('http://example.com/api/users'),
427
+ { method: 'GET', headers: testHeaders1 },
428
+ );
429
+
430
+ return {
431
+ optionsUsingStringUrl,
432
+ optionsUsingClassUrl,
433
+ };
434
+ },
435
+ 'mergeOptions should correctly handle URL and options': function ({
436
+ optionsUsingStringUrl,
437
+ optionsUsingClassUrl,
438
+ }) {
439
+ assert.deepStrictEqual(optionsUsingStringUrl, optionsUsingClassUrl);
440
+ },
441
+ },
442
+ })
443
+ .export(module, { error: false });