rollbar 2.26.2 → 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 (117) 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 +51 -71
  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 +5699 -5052
  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 +5704 -5062
  16. package/dist/rollbar.named-amd.js.map +1 -1
  17. package/dist/rollbar.named-amd.min.js +1 -1
  18. package/dist/rollbar.named-amd.min.js.map +1 -1
  19. package/dist/rollbar.noconflict.umd.js +5693 -5052
  20. package/dist/rollbar.noconflict.umd.js.map +1 -1
  21. package/dist/rollbar.noconflict.umd.min.js +1 -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 +5704 -5063
  25. package/dist/rollbar.umd.js.map +1 -1
  26. package/dist/rollbar.umd.min.js +1 -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 +16 -34
  32. package/package.json +21 -17
  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 +573 -354
  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 +76 -0
  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 -43
  115. package/.gitmodules +0 -3
  116. package/browserstack.browsers.js +0 -153
  117. package/browserstack.browsers.json +0 -4384
@@ -13,7 +13,7 @@ var localsFixtures = require('./fixtures/locals.fixtures');
13
13
  var nodeMajorVersion = process.versions.node.split('.')[0];
14
14
 
15
15
  async function wait(ms) {
16
- return new Promise(resolve => {
16
+ return new Promise((resolve) => {
17
17
  setTimeout(resolve, ms);
18
18
  });
19
19
  }
@@ -50,7 +50,7 @@ async function nodeThrowAndCatch(rollbar, callback) {
50
50
 
51
51
  function nestedError(nestedMessage, _password) {
52
52
  var nestedError = new Error(nestedMessage);
53
- throw(nestedError);
53
+ throw nestedError;
54
54
  }
55
55
 
56
56
  async function nodeThrowNested(rollbar, callback) {
@@ -61,7 +61,7 @@ async function nodeThrowNested(rollbar, callback) {
61
61
 
62
62
  try {
63
63
  var newMessage = 'nested ' + message;
64
- nestedError(newMessage, password)
64
+ nestedError(newMessage, password);
65
65
  } catch (e) {
66
66
  err.nested = e;
67
67
  }
@@ -86,13 +86,12 @@ function fakeSessionPostHandler(responses) {
86
86
  setTimeout(function () {
87
87
  callback(error, response);
88
88
  }, 1);
89
- }
89
+ };
90
90
  }
91
91
 
92
-
93
92
  async function nodeThrowWithNestedLocals(rollbar, callback) {
94
93
  setTimeout(function () {
95
- var arr = [{ zero: [0, 0]}, { one: 1}, { two: 2}, { three: 3}];
94
+ var arr = [{ zero: [0, 0] }, { one: 1 }, { two: 2 }, { three: 3 }];
96
95
  var obj = { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e', f: 'f' };
97
96
  var password = 'password';
98
97
  var sym = Symbol('foo');
@@ -107,7 +106,7 @@ function recurse(curr, limit) {
107
106
  if (curr < limit) {
108
107
  recurse(curr + 1, limit);
109
108
  } else {
110
- throw new Error('deep stack error, limit='+limit);
109
+ throw new Error('deep stack error, limit=' + limit);
111
110
  }
112
111
  }
113
112
 
@@ -131,16 +130,30 @@ function verifyThrownError(r) {
131
130
  assert.isTrue(addItemStub.called);
132
131
  var data = addItemStub.getCall(0).args[3].data;
133
132
  assert.equal(data.body.trace_chain[0].exception.message, 'node error');
134
- if (nodeMajorVersion >= 10) {
135
- // Node 10+; locals enabled
136
- var length = data.body.trace_chain[0].frames.length;
137
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.error, '<Error object>');
138
- assert.equal(data.body.trace_chain[0].frames[length-2].locals.timer, '<Timeout object>');
133
+ var length = data.body.trace_chain[0].frames.length;
134
+ assert.ok(length > 1);
135
+
136
+ if (nodeMajorVersion >= 18) {
137
+ // Node >=18; locals only in top frame
138
+ assert.equal(
139
+ data.body.trace_chain[0].frames[length - 1].locals.error,
140
+ '<Error object>',
141
+ );
142
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
143
+ } else if (nodeMajorVersion >= 10) {
144
+ // Node >=10; locals enabled
145
+ assert.equal(
146
+ data.body.trace_chain[0].frames[length - 1].locals.error,
147
+ '<Error object>',
148
+ );
149
+ assert.equal(
150
+ data.body.trace_chain[0].frames[length - 2].locals.timer,
151
+ '<Timeout object>',
152
+ );
139
153
  } else {
140
- // Node 8; locals disabled
141
- var length = data.body.trace_chain[0].frames.length;
142
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
143
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
154
+ // Node <=8; locals disabled
155
+ assert.equal(data.body.trace_chain[0].frames[length - 1].locals, undefined);
156
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
144
157
  }
145
158
  addItemStub.restore();
146
159
  }
@@ -151,15 +164,29 @@ function verifyCaughtError(r) {
151
164
  assert.isTrue(addItemStub.called);
152
165
  var data = addItemStub.getCall(0).args[3].data;
153
166
  assert.equal(data.body.trace_chain[0].exception.message, 'caught error');
154
- if (nodeMajorVersion >= 10) {
155
- // Node 10+; locals enabled
156
- var length = data.body.trace_chain[0].frames.length;
157
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.error, '<Error object>');
158
- assert.equal(data.body.trace_chain[0].frames[length-2].locals.timer, '<Timeout object>');
167
+ var length = data.body.trace_chain[0].frames.length;
168
+ assert.ok(length > 1);
169
+
170
+ if (nodeMajorVersion >= 18) {
171
+ // Node >=18; locals only in top frame
172
+ assert.equal(
173
+ data.body.trace_chain[0].frames[length - 1].locals.error,
174
+ '<Error object>',
175
+ );
176
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
177
+ } else if (nodeMajorVersion >= 10) {
178
+ // Node 10..<18; locals enabled
179
+ assert.equal(
180
+ data.body.trace_chain[0].frames[length - 1].locals.error,
181
+ '<Error object>',
182
+ );
183
+ assert.equal(
184
+ data.body.trace_chain[0].frames[length - 2].locals.timer,
185
+ '<Timeout object>',
186
+ );
159
187
  } else {
160
- var length = data.body.trace_chain[0].frames.length;
161
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
162
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
188
+ assert.equal(data.body.trace_chain[0].frames[length - 1].locals, undefined);
189
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
163
190
  }
164
191
  addItemStub.restore();
165
192
  }
@@ -171,25 +198,86 @@ function verifyNestedError(r) {
171
198
  var data = addItemStub.getCall(0).args[3].data;
172
199
  assert.equal(data.body.trace_chain[0].exception.message, 'test error');
173
200
  assert.equal(data.body.trace_chain[1].exception.message, 'nested test error');
174
- if (nodeMajorVersion >= 10) {
175
- // Node 10+; locals enabled
176
- var length = data.body.trace_chain[0].frames.length;
177
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.err, '<Error object>');
178
- assert.equal(data.body.trace_chain[0].frames[length-2].locals.timer, '<Timeout object>');
201
+ var length = data.body.trace_chain[0].frames.length;
202
+ assert.ok(length > 1);
203
+
204
+ if (nodeMajorVersion >= 18) {
205
+ // Node >=18; locals only in top frame
206
+ assert.equal(
207
+ data.body.trace_chain[0].frames[length - 1].locals.message,
208
+ 'test error',
209
+ );
210
+ assert.equal(
211
+ data.body.trace_chain[0].frames[length - 1].locals.password,
212
+ '********',
213
+ );
214
+ assert.equal(
215
+ data.body.trace_chain[0].frames[length - 1].locals.err,
216
+ '<Error object>',
217
+ );
218
+ assert.equal(
219
+ data.body.trace_chain[0].frames[length - 1].locals.newMessage,
220
+ 'nested test error',
221
+ );
222
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
179
223
 
180
224
  length = data.body.trace_chain[1].frames.length;
181
- assert.equal(data.body.trace_chain[1].frames[length-1].locals.nestedMessage, 'nested test error');
182
- assert.equal(data.body.trace_chain[1].frames[length-1].locals.nestedError, '<Error object>');
183
- assert.equal(data.body.trace_chain[1].frames[length-2].locals.message, 'test error');
184
- assert.equal(data.body.trace_chain[1].frames[length-2].locals.password, '********');
185
- assert.equal(data.body.trace_chain[1].frames[length-2].locals.err, '<Error object>');
186
- assert.equal(data.body.trace_chain[1].frames[length-2].locals.newMessage, 'nested test error');
225
+ assert.ok(length > 1);
226
+ assert.equal(
227
+ data.body.trace_chain[1].frames[length - 1].locals.nestedMessage,
228
+ 'nested test error',
229
+ );
230
+ assert.equal(
231
+ data.body.trace_chain[1].frames[length - 1].locals._password,
232
+ '123456',
233
+ );
234
+ assert.equal(
235
+ data.body.trace_chain[1].frames[length - 1].locals.nestedError,
236
+ '<Error object>',
237
+ );
238
+ assert.equal(data.body.trace_chain[1].frames[length - 2].locals, undefined);
239
+ } else if (nodeMajorVersion >= 10) {
240
+ // Node >=10; locals enabled
241
+ assert.equal(
242
+ data.body.trace_chain[0].frames[length - 1].locals.err,
243
+ '<Error object>',
244
+ );
245
+ assert.equal(
246
+ data.body.trace_chain[0].frames[length - 2].locals.timer,
247
+ '<Timeout object>',
248
+ );
249
+
250
+ length = data.body.trace_chain[1].frames.length;
251
+ assert.ok(length > 1);
252
+ assert.equal(
253
+ data.body.trace_chain[1].frames[length - 1].locals.nestedMessage,
254
+ 'nested test error',
255
+ );
256
+ assert.equal(
257
+ data.body.trace_chain[1].frames[length - 1].locals.nestedError,
258
+ '<Error object>',
259
+ );
260
+ assert.equal(
261
+ data.body.trace_chain[1].frames[length - 2].locals.message,
262
+ 'test error',
263
+ );
264
+ assert.equal(
265
+ data.body.trace_chain[1].frames[length - 2].locals.password,
266
+ '********',
267
+ );
268
+ assert.equal(
269
+ data.body.trace_chain[1].frames[length - 2].locals.err,
270
+ '<Error object>',
271
+ );
272
+ assert.equal(
273
+ data.body.trace_chain[1].frames[length - 2].locals.newMessage,
274
+ 'nested test error',
275
+ );
187
276
  } else {
188
- // Node 8; locals disabled
189
- var length = data.body.trace_chain[0].frames.length;
190
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
191
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
192
- }
277
+ // Node <=8; locals disabled
278
+ assert.equal(data.body.trace_chain[0].frames[length - 1].locals, undefined);
279
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
280
+ }
193
281
  addItemStub.restore();
194
282
  }
195
283
 
@@ -199,19 +287,47 @@ function verifyRejectedPromise(r) {
199
287
  assert.isTrue(addItemStub.called);
200
288
  var data = addItemStub.getCall(0).args[3].data;
201
289
  assert.equal(data.body.trace_chain[0].exception.message, 'promise reject');
202
- if (nodeMajorVersion >= 10) {
203
- // Node 10+; locals enabled
204
- var length = data.body.trace_chain[0].frames.length;
205
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.error, '<Error object>');
206
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.rollbar, '<Rollbar object>');
207
- assert.equal(data.body.trace_chain[0].frames[length-2].locals.notifier, '<Notifier object>');
208
- assert.equal(data.body.trace_chain[0].frames[length-2].locals.r, '<Rollbar object>');
290
+ var length = data.body.trace_chain[0].frames.length;
291
+ assert.ok(length > 1);
292
+
293
+ if (nodeMajorVersion >= 18) {
294
+ // Node >=18; locals only in top frame
295
+ assert.equal(
296
+ data.body.trace_chain[0].frames[length - 1].locals.error,
297
+ '<Error object>',
298
+ );
299
+ assert.equal(
300
+ data.body.trace_chain[0].frames[length - 1].locals.callback,
301
+ '<Function object>',
302
+ );
303
+ assert.equal(
304
+ data.body.trace_chain[0].frames[length - 1].locals.rollbar,
305
+ '<Rollbar object>',
306
+ );
307
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
308
+ } else if (nodeMajorVersion >= 10) {
309
+ // Node >=10; locals enabled
310
+ assert.equal(
311
+ data.body.trace_chain[0].frames[length - 1].locals.error,
312
+ '<Error object>',
313
+ );
314
+ assert.equal(
315
+ data.body.trace_chain[0].frames[length - 1].locals.rollbar,
316
+ '<Rollbar object>',
317
+ );
318
+ assert.equal(
319
+ data.body.trace_chain[0].frames[length - 2].locals.notifier,
320
+ '<Notifier object>',
321
+ );
322
+ assert.equal(
323
+ data.body.trace_chain[0].frames[length - 2].locals.r,
324
+ '<Rollbar object>',
325
+ );
209
326
  } else {
210
- // Node 8; locals disabled
211
- var length = data.body.trace_chain[0].frames.length;
212
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
213
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
214
- }
327
+ // Node <=8; locals disabled
328
+ assert.equal(data.body.trace_chain[0].frames[length - 1].locals, undefined);
329
+ assert.equal(data.body.trace_chain[0].frames[length - 2].locals, undefined);
330
+ }
215
331
  addItemStub.restore();
216
332
  }
217
333
 
@@ -223,276 +339,362 @@ function verifyDefaultOptions(options) {
223
339
  assert.equal(options.maxArray, 5);
224
340
  }
225
341
 
226
- vows.describe('locals')
342
+ vows
343
+ .describe('locals')
227
344
  .addBatch({
228
- 'enabled': {
229
- topic: function() {
345
+ enabled: {
346
+ topic: function () {
230
347
  var rollbar = new Rollbar({
231
348
  accessToken: 'abc123',
232
349
  captureUncaught: true,
233
350
  captureUnhandledRejections: true,
234
- locals: { module: Locals, uncaughtOnly: true, depth: 0 }
351
+ locals: { module: Locals, uncaughtOnly: true, depth: 0 },
235
352
  });
236
353
  var notifier = rollbar.client.notifier;
237
354
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
238
355
 
239
356
  nodeThrow(rollbar, this.callback);
240
357
  },
241
- 'should include locals': function(_err, r) {
358
+ 'should include locals': function (_err, r) {
242
359
  verifyThrownError(r);
243
360
  },
244
361
  'then disabled': {
245
- topic: function(_err, r) {
246
- r.configure({ locals: { enabled: false }});
362
+ topic: function (_err, r) {
363
+ r.configure({ locals: { enabled: false } });
247
364
  var notifier = r.client.notifier;
365
+ assert.ok(notifier);
248
366
  r.addItemStub = sinon.stub(notifier.queue, 'addItem');
249
367
 
250
368
  nodeThrowNested(r, this.callback);
251
369
  },
252
- 'should not include locals': function(_err, r) {
370
+ 'should not include locals': function (_err, r) {
253
371
  var addItemStub = r.addItemStub;
372
+ assert.ok(addItemStub);
254
373
 
255
374
  assert.isTrue(addItemStub.called);
256
375
  var data = addItemStub.getCall(0).args[3].data;
257
- assert.equal(data.body.trace_chain[0].exception.message, 'test error');
258
- assert.equal(data.body.trace_chain[1].exception.message, 'nested test error');
376
+ assert.equal(
377
+ data.body.trace_chain[0].exception.message,
378
+ 'test error',
379
+ );
380
+ assert.equal(
381
+ data.body.trace_chain[1].exception.message,
382
+ 'nested test error',
383
+ );
259
384
  var length = data.body.trace_chain[0].frames.length;
260
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
261
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
385
+ assert.ok(length > 1);
386
+ assert.equal(
387
+ data.body.trace_chain[0].frames[length - 1].locals,
388
+ undefined,
389
+ );
390
+ assert.equal(
391
+ data.body.trace_chain[0].frames[length - 2].locals,
392
+ undefined,
393
+ );
262
394
  addItemStub.restore();
263
395
  },
264
396
  'then enabled': {
265
- topic: function(_err, r) {
266
- r.configure({ locals: { enabled: true, uncaughtOnly: false }});
397
+ topic: function (_err, r) {
398
+ r.configure({ locals: { enabled: true, uncaughtOnly: false } });
267
399
  var notifier = r.client.notifier;
268
400
  r.addItemStub = sinon.stub(notifier.queue, 'addItem');
269
401
 
270
402
  promiseReject(r, this.callback);
271
403
  },
272
- 'should include locals': function(_err, r) {
404
+ 'should include locals': function (_err, r) {
273
405
  verifyRejectedPromise(r);
274
406
  },
275
- }
276
- }
277
- }
407
+ },
408
+ },
409
+ },
278
410
  })
279
411
 
280
412
  .addBatch({
281
413
  'on caught error': {
282
414
  'uncaughtOnly: true': {
283
- topic: function() {
415
+ topic: function () {
284
416
  var rollbar = new Rollbar({
285
417
  accessToken: 'abc123',
286
418
  captureUncaught: true,
287
419
  captureUnhandledRejections: true,
288
- locals: { module: Locals, uncaughtOnly:true, depth: 0 }
420
+ locals: { module: Locals, uncaughtOnly: true, depth: 0 },
289
421
  });
290
422
  var notifier = rollbar.client.notifier;
291
423
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
292
424
 
293
425
  nodeThrowAndCatch(rollbar, this.callback);
294
426
  },
295
- 'should not include locals': function(_err, r) {
427
+ 'should not include locals': function (_err, r) {
296
428
  var addItemStub = r.addItemStub;
297
429
 
298
430
  assert.isTrue(addItemStub.called);
299
431
  var data = addItemStub.getCall(0).args[3].data;
300
- assert.equal(data.body.trace_chain[0].exception.message, 'caught error');
432
+ assert.equal(
433
+ data.body.trace_chain[0].exception.message,
434
+ 'caught error',
435
+ );
301
436
  var length = data.body.trace_chain[0].frames.length;
302
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
303
- assert.equal(data.body.trace_chain[0].frames[length-2].locals, undefined);
437
+ assert.ok(length > 1);
438
+ assert.equal(
439
+ data.body.trace_chain[0].frames[length - 1].locals,
440
+ undefined,
441
+ );
442
+ assert.equal(
443
+ data.body.trace_chain[0].frames[length - 2].locals,
444
+ undefined,
445
+ );
304
446
 
305
447
  addItemStub.restore();
306
448
  },
307
449
  'then uncaughtOnly: false': {
308
- topic: function(_err, r) {
309
- r.configure({ locals: { uncaughtOnly: false }});
450
+ topic: function (_err, r) {
451
+ r.configure({ locals: { uncaughtOnly: false } });
310
452
  var notifier = r.client.notifier;
311
453
  r.addItemStub = sinon.stub(notifier.queue, 'addItem');
312
454
 
313
455
  nodeThrowAndCatch(r, this.callback);
314
456
  },
315
- 'should include locals': function(_err, r) {
457
+ 'should include locals': function (_err, r) {
316
458
  verifyCaughtError(r);
317
- }
318
- }
319
- }
320
- }
459
+ },
460
+ },
461
+ },
462
+ },
321
463
  })
322
464
 
323
465
  .addBatch({
324
466
  'on exception': {
325
- 'uncaught': {
326
- topic: function() {
467
+ uncaught: {
468
+ topic: function () {
327
469
  var rollbar = new Rollbar({
328
470
  accessToken: 'abc123',
329
471
  captureUncaught: true,
330
472
  captureUnhandledRejections: true,
331
- locals: { module: Locals, uncaughtOnly: true, depth: 0 }
473
+ locals: { module: Locals, uncaughtOnly: true, depth: 0 },
332
474
  });
333
475
  var notifier = rollbar.client.notifier;
334
476
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
335
477
 
336
478
  nodeThrow(rollbar, this.callback);
337
479
  },
338
- 'should include locals': function(_err, r) {
480
+ 'should include locals': function (_err, r) {
339
481
  verifyThrownError(r);
340
- }
341
- }
342
- }
482
+ },
483
+ },
484
+ },
343
485
  })
344
486
 
345
487
  .addBatch({
346
488
  'on exception': {
347
- 'nested': {
348
- topic: function() {
489
+ nested: {
490
+ topic: function () {
349
491
  var rollbar = new Rollbar({
350
492
  accessToken: 'abc123',
351
493
  captureUncaught: true,
352
- locals: { module: Locals, uncaughtOnly: false, depth: 0 }
494
+ locals: { module: Locals, uncaughtOnly: false, depth: 0 },
353
495
  });
354
496
  var notifier = rollbar.client.notifier;
355
497
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
356
498
 
357
499
  nodeThrowNested(rollbar, this.callback);
358
500
  },
359
- 'should include locals': function(_err, r) {
501
+ 'should include locals': function (_err, r) {
360
502
  verifyNestedError(r);
361
503
  },
362
- }
363
- }
504
+ },
505
+ },
364
506
  })
365
507
 
366
508
  .addBatch({
367
509
  'on exception': {
368
510
  'promise rejection': {
369
- topic: function() {
511
+ topic: function () {
370
512
  var r = new Rollbar({
371
513
  accessToken: 'abc123',
372
514
  captureUnhandledRejections: true,
373
- locals: { module: Locals, uncaughtOnly: false, depth: 0 }
515
+ locals: { module: Locals, uncaughtOnly: false, depth: 0 },
374
516
  });
375
517
  var notifier = r.client.notifier;
376
518
  r.addItemStub = sinon.stub(notifier.queue, 'addItem');
377
519
 
378
520
  promiseReject(r, this.callback);
379
521
  },
380
- 'should include locals': function(_err, r) {
522
+ 'should include locals': function (_err, r) {
381
523
  verifyRejectedPromise(r);
382
524
  },
383
- }
384
- }
525
+ },
526
+ },
385
527
  })
386
528
 
387
529
  .addBatch({
388
530
  'on exception': {
389
531
  'with custom options': {
390
- topic: function() {
532
+ topic: function () {
391
533
  var rollbar = new Rollbar({
392
534
  accessToken: 'abc123',
393
535
  captureUncaught: true,
394
- locals: { module: Locals, depth: 2, maxProperties: 5, maxArray: 2 }
536
+ locals: { module: Locals, depth: 2, maxProperties: 5, maxArray: 2 },
395
537
  });
396
538
  var notifier = rollbar.client.notifier;
397
539
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
398
540
 
399
541
  nodeThrowWithNestedLocals(rollbar, this.callback);
400
542
  },
401
- 'should include locals': function(_err, r) {
543
+ 'should include locals': function (_err, r) {
402
544
  var addItemStub = r.addItemStub;
403
545
 
404
546
  assert.isTrue(addItemStub.called);
405
547
  var data = addItemStub.getCall(0).args[3].data;
406
- assert.equal(data.body.trace_chain[0].exception.message, 'node error');
548
+ assert.equal(
549
+ data.body.trace_chain[0].exception.message,
550
+ 'node error',
551
+ );
407
552
  if (nodeMajorVersion < 10) {
408
553
  // Node 8; locals disabled
409
554
  var length = data.body.trace_chain[0].frames.length;
410
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
555
+ assert.equal(
556
+ data.body.trace_chain[0].frames[length - 1].locals,
557
+ undefined,
558
+ );
411
559
  } else {
412
560
  var length = data.body.trace_chain[0].frames.length;
413
- assert.equal(Object.keys(data.body.trace_chain[0].frames[length-1].locals.obj).length, 5);
414
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals.obj, { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e' });
415
- assert.equal(data.body.trace_chain[0].frames[length-1].locals.arr.length, 2);
416
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals.arr[0], { zero: '<Array object>' });
417
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals.arr[1], { one: 1 });
418
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals.password, '********');
419
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals.sym, 'Symbol(foo)');
561
+ assert.equal(
562
+ Object.keys(
563
+ data.body.trace_chain[0].frames[length - 1].locals.obj,
564
+ ).length,
565
+ 5,
566
+ );
567
+ assert.deepEqual(
568
+ data.body.trace_chain[0].frames[length - 1].locals.obj,
569
+ { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e' },
570
+ );
571
+ assert.equal(
572
+ data.body.trace_chain[0].frames[length - 1].locals.arr.length,
573
+ 2,
574
+ );
575
+ assert.deepEqual(
576
+ data.body.trace_chain[0].frames[length - 1].locals.arr[0],
577
+ { zero: '<Array object>' },
578
+ );
579
+ assert.deepEqual(
580
+ data.body.trace_chain[0].frames[length - 1].locals.arr[1],
581
+ { one: 1 },
582
+ );
583
+ assert.deepEqual(
584
+ data.body.trace_chain[0].frames[length - 1].locals.password,
585
+ '********',
586
+ );
587
+ assert.deepEqual(
588
+ data.body.trace_chain[0].frames[length - 1].locals.sym,
589
+ 'Symbol(foo)',
590
+ );
420
591
  }
421
592
  addItemStub.reset();
422
593
  Locals.session = undefined;
423
- }
424
- }
425
- }
594
+ },
595
+ },
596
+ },
426
597
  })
427
598
 
428
599
  .addBatch({
429
600
  'on exception': {
430
601
  'with recursive stack': {
431
- topic: function() {
602
+ topic: function () {
432
603
  var rollbar = new Rollbar({
433
604
  accessToken: 'abc123',
434
605
  captureUncaught: true,
435
- locals: Locals
606
+ locals: Locals,
436
607
  });
437
608
  var notifier = rollbar.client.notifier;
438
609
  rollbar.addItemStub = sinon.stub(notifier.queue, 'addItem');
439
610
 
440
611
  nodeThrowRecursionError(rollbar, this.callback);
441
612
  },
442
- 'should include locals': function(_err, r) {
613
+ 'should include locals': function (_err, r) {
443
614
  var addItemStub = r.addItemStub;
444
615
 
445
616
  assert.isTrue(addItemStub.called);
446
617
  var data = addItemStub.getCall(0).args[3].data;
447
- assert.equal(data.body.trace_chain[0].exception.message, 'deep stack error, limit=3');
448
- if (nodeMajorVersion < 10) {
449
- // Node 8; locals disabled
450
- var length = data.body.trace_chain[0].frames.length;
451
- assert.equal(data.body.trace_chain[0].frames[length-1].locals, undefined);
618
+ assert.equal(
619
+ data.body.trace_chain[0].exception.message,
620
+ 'deep stack error, limit=3',
621
+ );
622
+ var length = data.body.trace_chain[0].frames.length;
623
+ assert.ok(length > 1);
624
+
625
+ if (nodeMajorVersion >= 18) {
626
+ // Node >=18; locals only in top frame
627
+ assert.deepEqual(
628
+ data.body.trace_chain[0].frames[length - 1].locals,
629
+ { curr: 3, limit: 3 },
630
+ );
631
+ assert.equal(
632
+ data.body.trace_chain[0].frames[length - 2].locals,
633
+ undefined,
634
+ );
635
+ assert.equal(
636
+ data.body.trace_chain[0].frames[length - 3].locals,
637
+ undefined,
638
+ );
639
+ } else if (nodeMajorVersion >= 10) {
640
+ // Node >=10; locals enabled
641
+ assert.deepEqual(
642
+ data.body.trace_chain[0].frames[length - 1].locals,
643
+ { curr: 3, limit: 3 },
644
+ );
645
+ assert.deepEqual(
646
+ data.body.trace_chain[0].frames[length - 2].locals,
647
+ { curr: 2, limit: 3 },
648
+ );
649
+ assert.deepEqual(
650
+ data.body.trace_chain[0].frames[length - 3].locals,
651
+ { curr: 1, limit: 3 },
652
+ );
452
653
  } else {
453
- var length = data.body.trace_chain[0].frames.length;
454
- assert.deepEqual(data.body.trace_chain[0].frames[length-1].locals, { curr: 3, limit: 3 });
455
- assert.deepEqual(data.body.trace_chain[0].frames[length-2].locals, { curr: 2, limit: 3 });
456
- assert.deepEqual(data.body.trace_chain[0].frames[length-3].locals, { curr: 1, limit: 3 });
654
+ // Node <=8; locals disabled
655
+ assert.equal(
656
+ data.body.trace_chain[0].frames[length - 1].locals,
657
+ undefined,
658
+ );
457
659
  }
458
660
  addItemStub.reset();
459
661
  Locals.session = undefined;
460
- }
461
- }
462
- }
662
+ },
663
+ },
664
+ },
463
665
  })
464
666
 
465
667
  .addBatch({
466
- 'constructor': {
668
+ constructor: {
467
669
  'passing true boolean': {
468
- topic: function() {
670
+ topic: function () {
469
671
  return new Locals(true, logger);
470
672
  },
471
- 'should use defaults': function(locals) {
673
+ 'should use defaults': function (locals) {
472
674
  verifyDefaultOptions(locals.options);
473
- }
675
+ },
474
676
  },
475
677
  'passing false boolean': {
476
- topic: function() {
678
+ topic: function () {
477
679
  return new Locals(false, logger);
478
680
  },
479
- 'should use defaults': function(locals) {
681
+ 'should use defaults': function (locals) {
480
682
  verifyDefaultOptions(locals.options);
481
- }
683
+ },
482
684
  },
483
685
  'passing empty object': {
484
- topic: function() {
686
+ topic: function () {
485
687
  return new Locals({}, logger);
486
688
  },
487
- 'should use defaults': function(locals) {
689
+ 'should use defaults': function (locals) {
488
690
  verifyDefaultOptions(locals.options);
489
- }
691
+ },
490
692
  },
491
693
  'passing depth option': {
492
- topic: function() {
694
+ topic: function () {
493
695
  return new Locals({ depth: 0 }, logger);
494
696
  },
495
- 'should use updated depth with remaining defaults': function(locals) {
697
+ 'should use updated depth with remaining defaults': function (locals) {
496
698
  var options = locals.options;
497
699
 
498
700
  assert.equal(options.enabled, true);
@@ -500,13 +702,15 @@ vows.describe('locals')
500
702
  assert.equal(options.depth, 0);
501
703
  assert.equal(options.maxProperties, 30);
502
704
  assert.equal(options.maxArray, 5);
503
- }
705
+ },
504
706
  },
505
707
  'passing enabled option': {
506
- topic: function() {
708
+ topic: function () {
507
709
  return new Locals({ enabled: false }, logger);
508
710
  },
509
- 'should use updated enabled with remaining defaults': function(locals) {
711
+ 'should use updated enabled with remaining defaults': function (
712
+ locals,
713
+ ) {
510
714
  var options = locals.options;
511
715
 
512
716
  assert.equal(options.enabled, false);
@@ -514,13 +718,15 @@ vows.describe('locals')
514
718
  assert.equal(options.depth, 1);
515
719
  assert.equal(options.maxProperties, 30);
516
720
  assert.equal(options.maxArray, 5);
517
- }
721
+ },
518
722
  },
519
723
  'passing uncaughtOnly option': {
520
- topic: function() {
724
+ topic: function () {
521
725
  return new Locals({ uncaughtOnly: false }, logger);
522
726
  },
523
- 'should use updated uncaughtOnly with remaining defaults': function(locals) {
727
+ 'should use updated uncaughtOnly with remaining defaults': function (
728
+ locals,
729
+ ) {
524
730
  var options = locals.options;
525
731
 
526
732
  assert.equal(options.enabled, true);
@@ -528,19 +734,22 @@ vows.describe('locals')
528
734
  assert.equal(options.depth, 1);
529
735
  assert.equal(options.maxProperties, 30);
530
736
  assert.equal(options.maxArray, 5);
531
- }
737
+ },
532
738
  },
533
739
  'passing all options': {
534
- topic: function() {
535
- return new Locals({
536
- enabled: false,
537
- uncaughtOnly: false,
538
- depth: 2,
539
- maxProperties: 15,
540
- maxArray: 10
541
- }, logger);
740
+ topic: function () {
741
+ return new Locals(
742
+ {
743
+ enabled: false,
744
+ uncaughtOnly: false,
745
+ depth: 2,
746
+ maxProperties: 15,
747
+ maxArray: 10,
748
+ },
749
+ logger,
750
+ );
542
751
  },
543
- 'should use updated options': function(locals) {
752
+ 'should use updated options': function (locals) {
544
753
  var options = locals.options;
545
754
 
546
755
  assert.equal(options.enabled, false);
@@ -548,16 +757,16 @@ vows.describe('locals')
548
757
  assert.equal(options.depth, 2);
549
758
  assert.equal(options.maxProperties, 15);
550
759
  assert.equal(options.maxArray, 10);
551
- }
552
- }
553
- }
760
+ },
761
+ },
762
+ },
554
763
  })
555
764
 
556
765
  // The following tests stub a singleton (Locals.session.post()), and need to run sequentially.
557
766
  // One way to do this in vows is to put each in a separate batch.
558
767
  .addBatch({
559
768
  'mergeLocals returns error from session.post()': {
560
- topic: function() {
769
+ topic: function () {
561
770
  var locals = new Locals({}, logger);
562
771
  var err = new Error('post error');
563
772
  sinon.stub(Locals.session, 'post').yields(err);
@@ -570,13 +779,13 @@ vows.describe('locals')
570
779
 
571
780
  locals.mergeLocals(localsMap, stack, key, this.callback);
572
781
  },
573
- 'should callback with error': function(err) {
782
+ 'should callback with error': function (err) {
574
783
  assert.instanceOf(err, Error);
575
784
  assert.isTrue(err.stack.startsWith('Error: post error'));
576
785
  assert.equal(err.message, 'post error');
577
786
  sinon.restore();
578
- }
579
- }
787
+ },
788
+ },
580
789
  })
581
790
  .addBatch({
582
791
  'mergeLocals called with multiple/complex locals maps present': {
@@ -585,7 +794,7 @@ vows.describe('locals')
585
794
  // * Intended locals map key isn't the first or only entry.
586
795
  // * Other scopes besides type: 'local' are present.
587
796
  // * Transpiled code (Typescript) present in stack
588
- topic: function() {
797
+ topic: function () {
589
798
  var getPropertiesResponses = {
590
799
  objectId1: [
591
800
  localsFixtures.locals.object1,
@@ -599,10 +808,12 @@ vows.describe('locals')
599
808
  localsFixtures.locals.string1,
600
809
  localsFixtures.locals.array1,
601
810
  ],
602
- }
811
+ };
603
812
 
604
813
  var locals = new Locals({ depth: 0 }, logger);
605
- sinon.stub(Locals.session, 'post').callsFake(fakeSessionPostHandler(getPropertiesResponses));
814
+ sinon
815
+ .stub(Locals.session, 'post')
816
+ .callsFake(fakeSessionPostHandler(getPropertiesResponses));
606
817
 
607
818
  var key1 = 'key1';
608
819
  var key2 = 'key2';
@@ -615,11 +826,11 @@ vows.describe('locals')
615
826
  var stack = cloneStack(localsFixtures.stacks.complex);
616
827
 
617
828
  var self = this;
618
- locals.mergeLocals(localsMap, stack, key2, function(err) {
829
+ locals.mergeLocals(localsMap, stack, key2, function (err) {
619
830
  self.callback(err, stack);
620
831
  });
621
832
  },
622
- 'should callback with merged locals': function(err, stack) {
833
+ 'should callback with merged locals': function (err, stack) {
623
834
  if (err) {
624
835
  // Ensure unexpected error can be seen.
625
836
  console.log(err);
@@ -634,21 +845,23 @@ vows.describe('locals')
634
845
  assert.equal(stack[2].locals.bar, '<BarClass object>');
635
846
 
636
847
  sinon.restore();
637
- }
638
- }
848
+ },
849
+ },
639
850
  })
640
851
  .addBatch({
641
852
  'mergeLocals called with simple locals maps present': {
642
- topic: function() {
853
+ topic: function () {
643
854
  var getPropertiesResponses = {
644
855
  objectId1: [
645
856
  localsFixtures.locals.object1,
646
857
  localsFixtures.locals.object2,
647
- ]
648
- }
858
+ ],
859
+ };
649
860
 
650
861
  var locals = new Locals({ depth: 0 }, logger);
651
- sinon.stub(Locals.session, 'post').callsFake(fakeSessionPostHandler(getPropertiesResponses));
862
+ sinon
863
+ .stub(Locals.session, 'post')
864
+ .callsFake(fakeSessionPostHandler(getPropertiesResponses));
652
865
 
653
866
  var key = 'key';
654
867
  var localsMap = new Map();
@@ -658,11 +871,11 @@ vows.describe('locals')
658
871
  var stack = cloneStack(localsFixtures.stacks.simple);
659
872
 
660
873
  var self = this;
661
- locals.mergeLocals(localsMap, stack, key, function(err) {
874
+ locals.mergeLocals(localsMap, stack, key, function (err) {
662
875
  self.callback(err, stack);
663
876
  });
664
877
  },
665
- 'should callback with merged locals': function(err, stack) {
878
+ 'should callback with merged locals': function (err, stack) {
666
879
  if (err) {
667
880
  // Ensure unexpected error can be seen.
668
881
  console.log(err);
@@ -673,12 +886,12 @@ vows.describe('locals')
673
886
  assert.equal(stack[0].locals.bar, '<BarClass object>');
674
887
 
675
888
  sinon.restore();
676
- }
677
- }
889
+ },
890
+ },
678
891
  })
679
892
  .addBatch({
680
893
  'mergeLocals called with depth = 1': {
681
- topic: function() {
894
+ topic: function () {
682
895
  var getPropertiesResponses = {
683
896
  objectId1: [
684
897
  localsFixtures.locals.object1,
@@ -693,11 +906,13 @@ vows.describe('locals')
693
906
  localsFixtures.locals.array1,
694
907
  localsFixtures.locals.null1,
695
908
  localsFixtures.locals.function2,
696
- ]
697
- }
909
+ ],
910
+ };
698
911
 
699
912
  var locals = new Locals({ depth: 1 }, logger);
700
- sinon.stub(Locals.session, 'post').callsFake(fakeSessionPostHandler(getPropertiesResponses));
913
+ sinon
914
+ .stub(Locals.session, 'post')
915
+ .callsFake(fakeSessionPostHandler(getPropertiesResponses));
701
916
 
702
917
  var key = 'key';
703
918
  var localsMap = new Map();
@@ -707,27 +922,35 @@ vows.describe('locals')
707
922
  var stack = cloneStack(localsFixtures.stacks.simple);
708
923
 
709
924
  var self = this;
710
- locals.mergeLocals(localsMap, stack, key, function(err) {
925
+ locals.mergeLocals(localsMap, stack, key, function (err) {
711
926
  self.callback(err, stack);
712
927
  });
713
928
  },
714
- 'should callback with merged locals': function(err, stack) {
929
+ 'should callback with merged locals': function (err, stack) {
715
930
  if (err) {
716
931
  // Ensure unexpected error can be seen.
717
932
  console.log(err);
718
933
  }
719
934
  assert.isNull(err);
720
935
 
721
- assert.deepEqual(stack[0].locals.foo, { response: 'success', old: false, func: '<Function object>' });
722
- assert.deepEqual(stack[0].locals.bar, { args: '<Array object>', parent: null, asyncFunc: '<AsyncFunction object>' });
936
+ assert.deepEqual(stack[0].locals.foo, {
937
+ response: 'success',
938
+ old: false,
939
+ func: '<Function object>',
940
+ });
941
+ assert.deepEqual(stack[0].locals.bar, {
942
+ args: '<Array object>',
943
+ parent: null,
944
+ asyncFunc: '<AsyncFunction object>',
945
+ });
723
946
 
724
947
  sinon.restore();
725
- }
726
- }
948
+ },
949
+ },
727
950
  })
728
951
  .addBatch({
729
952
  'mergeLocals called with no locals maps present': {
730
- topic: function() {
953
+ topic: function () {
731
954
  var getPropertiesResponses = {
732
955
  objectId1: [
733
956
  localsFixtures.locals.object1,
@@ -741,10 +964,12 @@ vows.describe('locals')
741
964
  localsFixtures.locals.string1,
742
965
  localsFixtures.locals.array1,
743
966
  ],
744
- }
967
+ };
745
968
 
746
969
  var locals = new Locals({}, logger);
747
- sinon.stub(Locals.session, 'post').callsFake(fakeSessionPostHandler(getPropertiesResponses));
970
+ sinon
971
+ .stub(Locals.session, 'post')
972
+ .callsFake(fakeSessionPostHandler(getPropertiesResponses));
748
973
 
749
974
  // Test with no maps present. 'key' won't match anything.
750
975
  var key = 'key';
@@ -753,11 +978,11 @@ vows.describe('locals')
753
978
  var stack = cloneStack(localsFixtures.stacks.complex);
754
979
 
755
980
  var self = this;
756
- locals.mergeLocals(localsMap, stack, key, function(err) {
981
+ locals.mergeLocals(localsMap, stack, key, function (err) {
757
982
  self.callback(err, stack);
758
983
  });
759
984
  },
760
- 'should succeed without merged locals': function(err, stack) {
985
+ 'should succeed without merged locals': function (err, stack) {
761
986
  if (err) {
762
987
  // Ensure unexpected error can be seen.
763
988
  console.log(err);
@@ -769,12 +994,12 @@ vows.describe('locals')
769
994
  assert.equal(stack[2].locals, undefined);
770
995
 
771
996
  sinon.restore();
772
- }
773
- }
997
+ },
998
+ },
774
999
  })
775
1000
  .addBatch({
776
1001
  'mergeLocals called with no local scopes in map': {
777
- topic: function() {
1002
+ topic: function () {
778
1003
  var getPropertiesResponses = {
779
1004
  objectId1: [
780
1005
  localsFixtures.locals.object1,
@@ -788,10 +1013,12 @@ vows.describe('locals')
788
1013
  localsFixtures.locals.string1,
789
1014
  localsFixtures.locals.array1,
790
1015
  ],
791
- }
1016
+ };
792
1017
 
793
1018
  var locals = new Locals({}, logger);
794
- sinon.stub(Locals.session, 'post').callsFake(fakeSessionPostHandler(getPropertiesResponses));
1019
+ sinon
1020
+ .stub(Locals.session, 'post')
1021
+ .callsFake(fakeSessionPostHandler(getPropertiesResponses));
795
1022
 
796
1023
  var key = 'key';
797
1024
  var localsMap = new Map();
@@ -801,11 +1028,11 @@ vows.describe('locals')
801
1028
  var stack = cloneStack(localsFixtures.stacks.complex);
802
1029
 
803
1030
  var self = this;
804
- locals.mergeLocals(localsMap, stack, key, function(err) {
1031
+ locals.mergeLocals(localsMap, stack, key, function (err) {
805
1032
  self.callback(err, stack);
806
1033
  });
807
1034
  },
808
- 'should succeed without merged locals': function(err, stack) {
1035
+ 'should succeed without merged locals': function (err, stack) {
809
1036
  if (err) {
810
1037
  // Ensure unexpected error can be seen.
811
1038
  console.log(err);
@@ -817,12 +1044,12 @@ vows.describe('locals')
817
1044
  assert.equal(stack[2].locals, undefined);
818
1045
 
819
1046
  sinon.restore();
820
- }
821
- }
1047
+ },
1048
+ },
822
1049
  })
823
1050
  .addBatch({
824
1051
  'currentLocalsMap called with no local scopes in map': {
825
- topic: function() {
1052
+ topic: function () {
826
1053
  var locals = new Locals({}, logger);
827
1054
 
828
1055
  // Ensure empty map, as vows uses the same class object between tests.
@@ -830,12 +1057,12 @@ vows.describe('locals')
830
1057
 
831
1058
  return locals;
832
1059
  },
833
- 'should return empty map': function(locals) {
1060
+ 'should return empty map': function (locals) {
834
1061
  var localsMap = locals.currentLocalsMap();
835
1062
 
836
1063
  assert.instanceOf(localsMap, Map);
837
1064
  assert.equal(localsMap.size, 0);
838
- }
839
- }
1065
+ },
1066
+ },
840
1067
  })
841
- .export(module, {error: false});
1068
+ .export(module, { error: false });