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
package/src/telemetry.js CHANGED
@@ -9,7 +9,7 @@ function Telemeter(options) {
9
9
  this.maxQueueSize = Math.max(0, Math.min(maxTelemetryEvents, MAX_EVENTS));
10
10
  }
11
11
 
12
- Telemeter.prototype.configure = function(options) {
12
+ Telemeter.prototype.configure = function (options) {
13
13
  var oldOptions = this.options;
14
14
  this.options = _.merge(oldOptions, options);
15
15
  var maxTelemetryEvents = this.options.maxTelemetryEvents || MAX_EVENTS;
@@ -22,7 +22,7 @@ Telemeter.prototype.configure = function(options) {
22
22
  this.queue.splice(0, deleteCount);
23
23
  };
24
24
 
25
- Telemeter.prototype.copyEvents = function() {
25
+ Telemeter.prototype.copyEvents = function () {
26
26
  var events = Array.prototype.slice.call(this.queue, 0);
27
27
  if (_.isFunction(this.options.filterTelemetry)) {
28
28
  try {
@@ -39,20 +39,29 @@ Telemeter.prototype.copyEvents = function() {
39
39
  return events;
40
40
  };
41
41
 
42
- Telemeter.prototype.capture = function(type, metadata, level, rollbarUUID, timestamp) {
42
+ Telemeter.prototype.capture = function (
43
+ type,
44
+ metadata,
45
+ level,
46
+ rollbarUUID,
47
+ timestamp,
48
+ ) {
43
49
  var e = {
44
50
  level: getLevel(type, level),
45
51
  type: type,
46
52
  timestamp_ms: timestamp || _.now(),
47
53
  body: metadata,
48
- source: 'client'
54
+ source: 'client',
49
55
  };
50
56
  if (rollbarUUID) {
51
57
  e.uuid = rollbarUUID;
52
58
  }
53
59
 
54
60
  try {
55
- if (_.isFunction(this.options.filterTelemetry) && this.options.filterTelemetry(e)) {
61
+ if (
62
+ _.isFunction(this.options.filterTelemetry) &&
63
+ this.options.filterTelemetry(e)
64
+ ) {
56
65
  return false;
57
66
  }
58
67
  } catch (exc) {
@@ -63,13 +72,23 @@ Telemeter.prototype.capture = function(type, metadata, level, rollbarUUID, times
63
72
  return e;
64
73
  };
65
74
 
66
- Telemeter.prototype.captureEvent = function(type, metadata, level, rollbarUUID) {
75
+ Telemeter.prototype.captureEvent = function (
76
+ type,
77
+ metadata,
78
+ level,
79
+ rollbarUUID,
80
+ ) {
67
81
  return this.capture(type, metadata, level, rollbarUUID);
68
82
  };
69
83
 
70
- Telemeter.prototype.captureError = function(err, level, rollbarUUID, timestamp) {
84
+ Telemeter.prototype.captureError = function (
85
+ err,
86
+ level,
87
+ rollbarUUID,
88
+ timestamp,
89
+ ) {
71
90
  var metadata = {
72
- message: err.message || String(err)
91
+ message: err.message || String(err),
73
92
  };
74
93
  if (err.stack) {
75
94
  metadata.stack = err.stack;
@@ -77,13 +96,29 @@ Telemeter.prototype.captureError = function(err, level, rollbarUUID, timestamp)
77
96
  return this.capture('error', metadata, level, rollbarUUID, timestamp);
78
97
  };
79
98
 
80
- Telemeter.prototype.captureLog = function(message, level, rollbarUUID, timestamp) {
81
- return this.capture('log', {
82
- message: message
83
- }, level, rollbarUUID, timestamp);
99
+ Telemeter.prototype.captureLog = function (
100
+ message,
101
+ level,
102
+ rollbarUUID,
103
+ timestamp,
104
+ ) {
105
+ return this.capture(
106
+ 'log',
107
+ {
108
+ message: message,
109
+ },
110
+ level,
111
+ rollbarUUID,
112
+ timestamp,
113
+ );
84
114
  };
85
115
 
86
- Telemeter.prototype.captureNetwork = function(metadata, subtype, rollbarUUID, requestData) {
116
+ Telemeter.prototype.captureNetwork = function (
117
+ metadata,
118
+ subtype,
119
+ rollbarUUID,
120
+ requestData,
121
+ ) {
87
122
  subtype = subtype || 'xhr';
88
123
  metadata.subtype = metadata.subtype || subtype;
89
124
  if (requestData) {
@@ -93,7 +128,7 @@ Telemeter.prototype.captureNetwork = function(metadata, subtype, rollbarUUID, re
93
128
  return this.capture('network', metadata, level, rollbarUUID);
94
129
  };
95
130
 
96
- Telemeter.prototype.levelFromStatus = function(statusCode) {
131
+ Telemeter.prototype.levelFromStatus = function (statusCode) {
97
132
  if (statusCode >= 200 && statusCode < 400) {
98
133
  return 'info';
99
134
  }
@@ -103,10 +138,16 @@ Telemeter.prototype.levelFromStatus = function(statusCode) {
103
138
  return 'info';
104
139
  };
105
140
 
106
- Telemeter.prototype.captureDom = function(subtype, element, value, checked, rollbarUUID) {
141
+ Telemeter.prototype.captureDom = function (
142
+ subtype,
143
+ element,
144
+ value,
145
+ checked,
146
+ rollbarUUID,
147
+ ) {
107
148
  var metadata = {
108
149
  subtype: subtype,
109
- element: element
150
+ element: element,
110
151
  };
111
152
  if (value !== undefined) {
112
153
  metadata.value = value;
@@ -117,31 +158,48 @@ Telemeter.prototype.captureDom = function(subtype, element, value, checked, roll
117
158
  return this.capture('dom', metadata, 'info', rollbarUUID);
118
159
  };
119
160
 
120
- Telemeter.prototype.captureNavigation = function(from, to, rollbarUUID) {
121
- return this.capture('navigation', {from: from, to: to}, 'info', rollbarUUID);
161
+ Telemeter.prototype.captureNavigation = function (from, to, rollbarUUID) {
162
+ return this.capture(
163
+ 'navigation',
164
+ { from: from, to: to },
165
+ 'info',
166
+ rollbarUUID,
167
+ );
122
168
  };
123
169
 
124
- Telemeter.prototype.captureDomContentLoaded = function(ts) {
125
- return this.capture('navigation', {subtype: 'DOMContentLoaded'}, 'info', undefined, ts && ts.getTime());
170
+ Telemeter.prototype.captureDomContentLoaded = function (ts) {
171
+ return this.capture(
172
+ 'navigation',
173
+ { subtype: 'DOMContentLoaded' },
174
+ 'info',
175
+ undefined,
176
+ ts && ts.getTime(),
177
+ );
126
178
  /**
127
179
  * If we decide to make this a dom event instead, then use the line below:
128
180
  return this.capture('dom', {subtype: 'DOMContentLoaded'}, 'info', undefined, ts && ts.getTime());
129
181
  */
130
182
  };
131
- Telemeter.prototype.captureLoad = function(ts) {
132
- return this.capture('navigation', {subtype: 'load'}, 'info', undefined, ts && ts.getTime());
183
+ Telemeter.prototype.captureLoad = function (ts) {
184
+ return this.capture(
185
+ 'navigation',
186
+ { subtype: 'load' },
187
+ 'info',
188
+ undefined,
189
+ ts && ts.getTime(),
190
+ );
133
191
  /**
134
192
  * If we decide to make this a dom event instead, then use the line below:
135
193
  return this.capture('dom', {subtype: 'load'}, 'info', undefined, ts && ts.getTime());
136
194
  */
137
195
  };
138
196
 
139
- Telemeter.prototype.captureConnectivityChange = function(type, rollbarUUID) {
140
- return this.captureNetwork({change: type}, 'connectivity', rollbarUUID);
197
+ Telemeter.prototype.captureConnectivityChange = function (type, rollbarUUID) {
198
+ return this.captureNetwork({ change: type }, 'connectivity', rollbarUUID);
141
199
  };
142
200
 
143
201
  // Only intended to be used internally by the notifier
144
- Telemeter.prototype._captureRollbarItem = function(item) {
202
+ Telemeter.prototype._captureRollbarItem = function (item) {
145
203
  if (!this.options.includeItemsInTelemetry) {
146
204
  return;
147
205
  }
@@ -152,11 +210,17 @@ Telemeter.prototype._captureRollbarItem = function(item) {
152
210
  return this.captureLog(item.message, item.level, item.uuid, item.timestamp);
153
211
  }
154
212
  if (item.custom) {
155
- return this.capture('log', item.custom, item.level, item.uuid, item.timestamp);
213
+ return this.capture(
214
+ 'log',
215
+ item.custom,
216
+ item.level,
217
+ item.uuid,
218
+ item.timestamp,
219
+ );
156
220
  }
157
221
  };
158
222
 
159
- Telemeter.prototype.push = function(e) {
223
+ Telemeter.prototype.push = function (e) {
160
224
  this.queue.push(e);
161
225
  if (this.queue.length > this.maxQueueSize) {
162
226
  this.queue.shift();
@@ -169,7 +233,7 @@ function getLevel(type, level) {
169
233
  }
170
234
  var defaultLevel = {
171
235
  error: 'error',
172
- manual: 'info'
236
+ manual: 'info',
173
237
  };
174
238
  return defaultLevel[type] || 'info';
175
239
  }
package/src/transforms.js CHANGED
@@ -42,19 +42,19 @@ function addMessageWithError(item, options, callback) {
42
42
  }
43
43
  if (trace) {
44
44
  if (!(trace.exception && trace.exception.description)) {
45
- _.set(item, tracePath+'.exception.description', item.message);
45
+ _.set(item, tracePath + '.exception.description', item.message);
46
46
  callback(null, item);
47
47
  return;
48
48
  }
49
- var extra = _.get(item, tracePath+'.extra') || {};
50
- var newExtra = _.merge(extra, {message: item.message});
51
- _.set(item, tracePath+'.extra', newExtra);
49
+ var extra = _.get(item, tracePath + '.extra') || {};
50
+ var newExtra = _.merge(extra, { message: item.message });
51
+ _.set(item, tracePath + '.extra', newExtra);
52
52
  }
53
53
  callback(null, item);
54
54
  }
55
55
 
56
56
  function userTransform(logger) {
57
- return function(item, options, callback) {
57
+ return function (item, options, callback) {
58
58
  var newItem = _.merge(item);
59
59
  var response = null;
60
60
  try {
@@ -63,23 +63,29 @@ function userTransform(logger) {
63
63
  }
64
64
  } catch (e) {
65
65
  options.transform = null;
66
- logger.error('Error while calling custom transform() function. Removing custom transform().', e);
66
+ logger.error(
67
+ 'Error while calling custom transform() function. Removing custom transform().',
68
+ e,
69
+ );
67
70
  callback(null, item);
68
71
  return;
69
72
  }
70
- if(_.isPromise(response)) {
71
- response.then(function (promisedItem) {
72
- if(promisedItem) {
73
- newItem.data = promisedItem;
74
- }
75
- callback(null, newItem);
76
- }, function (error) {
77
- callback(error, item);
78
- });
73
+ if (_.isPromise(response)) {
74
+ response.then(
75
+ function (promisedItem) {
76
+ if (promisedItem) {
77
+ newItem.data = promisedItem;
78
+ }
79
+ callback(null, newItem);
80
+ },
81
+ function (error) {
82
+ callback(error, item);
83
+ },
84
+ );
79
85
  } else {
80
86
  callback(null, newItem);
81
87
  }
82
- }
88
+ };
83
89
  }
84
90
 
85
91
  function addConfigToPayload(item, options, callback) {
@@ -94,7 +100,7 @@ function addConfigToPayload(item, options, callback) {
94
100
  }
95
101
 
96
102
  function addFunctionOption(options, name) {
97
- if(_.isFunction(options[name])) {
103
+ if (_.isFunction(options[name])) {
98
104
  options[name] = options[name].toString();
99
105
  }
100
106
  }
@@ -113,7 +119,10 @@ function addConfiguredOptions(item, options, callback) {
113
119
  }
114
120
 
115
121
  function addDiagnosticKeys(item, options, callback) {
116
- var diagnostic = _.merge(item.notifier.client.notifier.diagnostic, item.diagnostic);
122
+ var diagnostic = _.merge(
123
+ item.notifier.client.notifier.diagnostic,
124
+ item.diagnostic,
125
+ );
117
126
 
118
127
  if (_.get(item, 'err._isAnonymous')) {
119
128
  diagnostic.is_anonymous = true;
@@ -132,14 +141,17 @@ function addDiagnosticKeys(item, options, callback) {
132
141
  filename: item.err.fileName,
133
142
  line: item.err.lineNumber,
134
143
  column: item.err.columnNumber,
135
- stack: item.err.stack
144
+ stack: item.err.stack,
136
145
  };
137
146
  } catch (e) {
138
147
  diagnostic.raw_error = { failed: String(e) };
139
148
  }
140
149
  }
141
150
 
142
- item.data.notifier.diagnostic = _.merge(item.data.notifier.diagnostic, diagnostic);
151
+ item.data.notifier.diagnostic = _.merge(
152
+ item.data.notifier.diagnostic,
153
+ diagnostic,
154
+ );
143
155
  callback(null, item);
144
156
  }
145
157
 
@@ -151,5 +163,5 @@ module.exports = {
151
163
  userTransform: userTransform,
152
164
  addConfigToPayload: addConfigToPayload,
153
165
  addConfiguredOptions: addConfiguredOptions,
154
- addDiagnosticKeys: addDiagnosticKeys
166
+ addDiagnosticKeys: addDiagnosticKeys,
155
167
  };
package/src/truncation.js CHANGED
@@ -14,7 +14,7 @@ function selectFrames(frames, range) {
14
14
  }
15
15
 
16
16
  function truncateFrames(payload, jsonBackup, range) {
17
- range = (typeof range === 'undefined') ? 30 : range;
17
+ range = typeof range === 'undefined' ? 30 : range;
18
18
  var body = payload.data.body;
19
19
  var frames;
20
20
  if (body.trace_chain) {
@@ -61,7 +61,10 @@ function truncateStrings(len, payload, jsonBackup) {
61
61
  function truncateTraceData(traceData) {
62
62
  if (traceData.exception) {
63
63
  delete traceData.exception.description;
64
- traceData.exception.message = maybeTruncateValue(255, traceData.exception.message);
64
+ traceData.exception.message = maybeTruncateValue(
65
+ 255,
66
+ traceData.exception.message,
67
+ );
65
68
  }
66
69
  traceData.frames = selectFrames(traceData.frames, 1);
67
70
  return traceData;
@@ -85,14 +88,14 @@ function needsTruncation(payload, maxSize) {
85
88
  }
86
89
 
87
90
  function truncate(payload, jsonBackup, maxSize) {
88
- maxSize = (typeof maxSize === 'undefined') ? (512 * 1024) : maxSize;
91
+ maxSize = typeof maxSize === 'undefined' ? 512 * 1024 : maxSize;
89
92
  var strategies = [
90
93
  raw,
91
94
  truncateFrames,
92
95
  truncateStrings.bind(null, 1024),
93
96
  truncateStrings.bind(null, 512),
94
97
  truncateStrings.bind(null, 256),
95
- minBody
98
+ minBody,
96
99
  ];
97
100
  var strategy, results, result;
98
101
 
@@ -114,5 +117,5 @@ module.exports = {
114
117
  raw: raw,
115
118
  truncateFrames: truncateFrames,
116
119
  truncateStrings: truncateStrings,
117
- maybeTruncateValue: maybeTruncateValue
120
+ maybeTruncateValue: maybeTruncateValue,
118
121
  };
@@ -18,77 +18,77 @@ function headers(headers) {
18
18
 
19
19
  function normalizeName(name) {
20
20
  if (typeof name !== 'string') {
21
- name = String(name)
21
+ name = String(name);
22
22
  }
23
- return name.toLowerCase()
23
+ return name.toLowerCase();
24
24
  }
25
25
 
26
26
  function normalizeValue(value) {
27
27
  if (typeof value !== 'string') {
28
- value = String(value)
28
+ value = String(value);
29
29
  }
30
- return value
30
+ return value;
31
31
  }
32
32
 
33
33
  function iteratorFor(items) {
34
34
  var iterator = {
35
- next: function() {
36
- var value = items.shift()
37
- return {done: value === undefined, value: value}
38
- }
39
- }
35
+ next: function () {
36
+ var value = items.shift();
37
+ return { done: value === undefined, value: value };
38
+ },
39
+ };
40
40
 
41
- return iterator
41
+ return iterator;
42
42
  }
43
43
 
44
44
  function FetchHeaders(headers) {
45
- this.map = {}
45
+ this.map = {};
46
46
 
47
47
  if (headers instanceof FetchHeaders) {
48
- headers.forEach(function(value, name) {
49
- this.append(name, value)
50
- }, this)
48
+ headers.forEach(function (value, name) {
49
+ this.append(name, value);
50
+ }, this);
51
51
  } else if (Array.isArray(headers)) {
52
- headers.forEach(function(header) {
53
- this.append(header[0], header[1])
54
- }, this)
52
+ headers.forEach(function (header) {
53
+ this.append(header[0], header[1]);
54
+ }, this);
55
55
  } else if (headers) {
56
- Object.getOwnPropertyNames(headers).forEach(function(name) {
57
- this.append(name, headers[name])
58
- }, this)
56
+ Object.getOwnPropertyNames(headers).forEach(function (name) {
57
+ this.append(name, headers[name]);
58
+ }, this);
59
59
  }
60
60
  }
61
61
 
62
- FetchHeaders.prototype.append = function(name, value) {
63
- name = normalizeName(name)
64
- value = normalizeValue(value)
65
- var oldValue = this.map[name]
66
- this.map[name] = oldValue ? oldValue + ', ' + value : value
67
- }
62
+ FetchHeaders.prototype.append = function (name, value) {
63
+ name = normalizeName(name);
64
+ value = normalizeValue(value);
65
+ var oldValue = this.map[name];
66
+ this.map[name] = oldValue ? oldValue + ', ' + value : value;
67
+ };
68
68
 
69
- FetchHeaders.prototype.get = function(name) {
70
- name = normalizeName(name)
71
- return this.has(name) ? this.map[name] : null
72
- }
69
+ FetchHeaders.prototype.get = function (name) {
70
+ name = normalizeName(name);
71
+ return this.has(name) ? this.map[name] : null;
72
+ };
73
73
 
74
- FetchHeaders.prototype.has = function(name) {
75
- return this.map.hasOwnProperty(normalizeName(name))
76
- }
74
+ FetchHeaders.prototype.has = function (name) {
75
+ return this.map.hasOwnProperty(normalizeName(name));
76
+ };
77
77
 
78
- FetchHeaders.prototype.forEach = function(callback, thisArg) {
78
+ FetchHeaders.prototype.forEach = function (callback, thisArg) {
79
79
  for (var name in this.map) {
80
80
  if (this.map.hasOwnProperty(name)) {
81
- callback.call(thisArg, this.map[name], name, this)
81
+ callback.call(thisArg, this.map[name], name, this);
82
82
  }
83
83
  }
84
- }
84
+ };
85
85
 
86
- FetchHeaders.prototype.entries = function() {
87
- var items = []
88
- this.forEach(function(value, name) {
89
- items.push([name, value])
90
- })
91
- return iteratorFor(items)
92
- }
86
+ FetchHeaders.prototype.entries = function () {
87
+ var items = [];
88
+ this.forEach(function (value, name) {
89
+ items.push([name, value]);
90
+ });
91
+ return iteratorFor(items);
92
+ };
93
93
 
94
94
  module.exports = headers;
@@ -0,0 +1,9 @@
1
+ function replace(obj, name, replacement, replacements, type) {
2
+ var orig = obj[name];
3
+ obj[name] = replacement(orig);
4
+ if (replacements) {
5
+ replacements[type].push([obj, name, orig]);
6
+ }
7
+ }
8
+
9
+ module.exports = replace;
@@ -8,7 +8,7 @@ function traverse(obj, func, seen) {
8
8
  var seenIndex;
9
9
 
10
10
  // Best might be to use Map here with `obj` as the keys, but we want to support IE < 11.
11
- seen = seen || { obj: [], mapped: []};
11
+ seen = seen || { obj: [], mapped: [] };
12
12
 
13
13
  if (isObj) {
14
14
  seenIndex = seen.obj.indexOf(obj);