@cloudcare/browser-core 1.1.3 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/cjs/{cookie.js → browser/cookie.js} +6 -37
  2. package/cjs/browser/fetchObservable.js +91 -0
  3. package/cjs/browser/xhrObservable.js +118 -0
  4. package/cjs/configuration/configuration.js +70 -0
  5. package/cjs/configuration/transportConfiguration.js +64 -0
  6. package/cjs/console/consoleObservable.js +84 -0
  7. package/cjs/dataMap.js +26 -21
  8. package/cjs/error/trackRuntimeError.js +27 -0
  9. package/cjs/helper/catchUserErrors.js +20 -0
  10. package/cjs/helper/contextHistory.js +134 -0
  11. package/cjs/helper/createEventRateLimiter.js +47 -0
  12. package/cjs/helper/deviceInfo.js +8 -25
  13. package/cjs/helper/display.js +31 -0
  14. package/cjs/helper/enums.js +28 -2
  15. package/cjs/helper/errorTools.js +63 -2
  16. package/cjs/helper/instrumentMethod.js +93 -0
  17. package/cjs/helper/lifeCycle.js +5 -3
  18. package/cjs/helper/observable.js +40 -2
  19. package/cjs/helper/tools.js +185 -9
  20. package/cjs/index.js +153 -23
  21. package/cjs/init.js +17 -27
  22. package/cjs/report/reportObservable.js +112 -0
  23. package/cjs/session/sessionConstants.js +13 -0
  24. package/cjs/session/sessionCookieStore.js +188 -0
  25. package/cjs/session/sessionManagement.js +96 -0
  26. package/cjs/session/sessionStore.js +150 -0
  27. package/cjs/synthetics/syntheticsWorkerValues.js +32 -0
  28. package/cjs/synthetics/usr.js +32 -0
  29. package/cjs/tracekit/computeStackTrace.js +73 -563
  30. package/cjs/tracekit/index.js +3 -15
  31. package/cjs/tracekit/tracekit.js +113 -0
  32. package/cjs/transport/batch.js +332 -0
  33. package/cjs/transport/httpRequest.js +112 -0
  34. package/cjs/transport/index.js +29 -0
  35. package/cjs/transport/sendWithRetryStrategy.js +177 -0
  36. package/cjs/transport/startBatchWithReplica.js +24 -0
  37. package/esm/{cookie.js → browser/cookie.js} +4 -35
  38. package/esm/browser/fetchObservable.js +77 -0
  39. package/esm/browser/xhrObservable.js +106 -0
  40. package/esm/configuration/configuration.js +55 -0
  41. package/esm/configuration/transportConfiguration.js +54 -0
  42. package/esm/console/consoleObservable.js +70 -0
  43. package/esm/dataMap.js +26 -21
  44. package/esm/error/trackRuntimeError.js +16 -0
  45. package/esm/helper/catchUserErrors.js +12 -0
  46. package/esm/helper/contextHistory.js +106 -0
  47. package/esm/helper/createEventRateLimiter.js +38 -0
  48. package/esm/helper/deviceInfo.js +6 -25
  49. package/esm/helper/display.js +21 -0
  50. package/esm/helper/enums.js +25 -1
  51. package/esm/helper/errorTools.js +58 -3
  52. package/esm/helper/instrumentMethod.js +81 -0
  53. package/esm/helper/lifeCycle.js +5 -3
  54. package/esm/helper/observable.js +39 -3
  55. package/esm/helper/tools.js +147 -1
  56. package/esm/index.js +17 -7
  57. package/esm/init.js +17 -22
  58. package/esm/report/reportObservable.js +98 -0
  59. package/esm/session/sessionConstants.js +3 -0
  60. package/esm/session/sessionCookieStore.js +168 -0
  61. package/esm/session/sessionManagement.js +78 -0
  62. package/esm/session/sessionStore.js +139 -0
  63. package/esm/synthetics/syntheticsWorkerValues.js +15 -0
  64. package/esm/synthetics/usr.js +18 -0
  65. package/esm/tracekit/computeStackTrace.js +73 -557
  66. package/esm/tracekit/index.js +1 -1
  67. package/esm/tracekit/tracekit.js +103 -0
  68. package/esm/transport/batch.js +316 -0
  69. package/esm/transport/httpRequest.js +104 -0
  70. package/esm/transport/index.js +3 -0
  71. package/esm/transport/sendWithRetryStrategy.js +165 -0
  72. package/esm/transport/startBatchWithReplica.js +15 -0
  73. package/package.json +2 -2
  74. package/src/.DS_Store +0 -0
  75. package/src/{cookie.js → browser/cookie.js} +6 -34
  76. package/src/browser/fetchObservable.js +86 -0
  77. package/src/browser/xhrObservable.js +102 -0
  78. package/src/configuration/configuration.js +61 -0
  79. package/src/configuration/transportConfiguration.js +42 -0
  80. package/src/console/consoleObservable.js +65 -0
  81. package/src/dataMap.js +26 -21
  82. package/src/error/trackRuntimeError.js +19 -0
  83. package/src/helper/catchUserErrors.js +12 -0
  84. package/src/helper/contextHistory.js +85 -0
  85. package/src/helper/createEventRateLimiter.js +37 -0
  86. package/src/helper/deviceInfo.js +5 -51
  87. package/src/helper/display.js +21 -0
  88. package/src/helper/enums.js +38 -14
  89. package/src/helper/errorTools.js +76 -12
  90. package/src/helper/instrumentMethod.js +97 -0
  91. package/src/helper/lifeCycle.js +5 -3
  92. package/src/helper/observable.js +33 -2
  93. package/src/helper/tools.js +135 -4
  94. package/src/index.js +18 -7
  95. package/src/init.js +17 -18
  96. package/src/report/reportObservable.js +113 -0
  97. package/src/session/sessionConstants.js +3 -0
  98. package/src/session/sessionCookieStore.js +159 -0
  99. package/src/session/sessionManagement.js +89 -0
  100. package/src/session/sessionStore.js +139 -0
  101. package/src/synthetics/syntheticsWorkerValues.js +22 -0
  102. package/src/synthetics/usr.js +18 -0
  103. package/src/tracekit/computeStackTrace.js +75 -551
  104. package/src/tracekit/index.js +1 -1
  105. package/src/tracekit/tracekit.js +100 -0
  106. package/src/transport/batch.js +289 -0
  107. package/src/transport/httpRequest.js +109 -0
  108. package/src/transport/index.js +3 -0
  109. package/src/transport/sendWithRetryStrategy.js +186 -0
  110. package/src/transport/startBatchWithReplica.js +26 -0
  111. package/cjs/configuration.js +0 -193
  112. package/cjs/errorCollection.js +0 -167
  113. package/cjs/fetchProxy.js +0 -161
  114. package/cjs/helper/errorFilter.js +0 -47
  115. package/cjs/sessionManagement.js +0 -221
  116. package/cjs/tracekit/report.js +0 -289
  117. package/cjs/transport.js +0 -373
  118. package/cjs/xhrProxy.js +0 -122
  119. package/esm/configuration.js +0 -176
  120. package/esm/errorCollection.js +0 -141
  121. package/esm/fetchProxy.js +0 -115
  122. package/esm/helper/errorFilter.js +0 -38
  123. package/esm/sessionManagement.js +0 -195
  124. package/esm/tracekit/report.js +0 -273
  125. package/esm/transport.js +0 -357
  126. package/esm/xhrProxy.js +0 -110
  127. package/src/configuration.js +0 -161
  128. package/src/errorCollection.js +0 -170
  129. package/src/fetchProxy.js +0 -108
  130. package/src/helper/errorFilter.js +0 -38
  131. package/src/sessionManagement.js +0 -224
  132. package/src/tracekit/report.js +0 -284
  133. package/src/transport.js +0 -380
  134. package/src/xhrProxy.js +0 -106
@@ -3,589 +3,141 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
7
6
  exports.computeStackTrace = computeStackTrace;
8
- exports.computeStackTraceFromStackProp = computeStackTraceFromStackProp;
9
- exports.computeStackTraceOfCaller = computeStackTraceOfCaller;
10
7
 
11
- var _report = require("./report");
8
+ var _tools = require("../helper/tools");
12
9
 
13
10
  function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
14
11
 
15
12
  var UNKNOWN_FUNCTION = '?';
16
- /**
17
- * computeStackTrace: cross-browser stack traces in JavaScript
18
- *
19
- * Syntax:
20
- * ```js
21
- * s = computeStackTraceOfCaller([depth])
22
- * s = computeStackTrace(exception) // consider using report instead (see below)
23
- * ```
24
- *
25
- * Supports:
26
- * - Firefox: full stack trace with line numbers and unreliable column
27
- * number on top frame
28
- * - Opera 10: full stack trace with line and column numbers
29
- * - Opera 9-: full stack trace with line numbers
30
- * - Chrome: full stack trace with line and column numbers
31
- * - Safari: line and column number for the topmost stacktrace element
32
- * only
33
- * - IE: no line numbers whatsoever
34
- *
35
- * Tries to guess names of anonymous functions by looking for assignments
36
- * in the source code. In IE and Safari, we have to guess source file names
37
- * by searching for function bodies inside all page scripts. This will not
38
- * work for scripts that are loaded cross-domain.
39
- * Here be dragons: some function names may be guessed incorrectly, and
40
- * duplicate functions may be mismatched.
41
- *
42
- * computeStackTrace should only be used for tracing purposes.
43
- * Logging of unhandled exceptions should be done with report,
44
- * which builds on top of computeStackTrace and provides better
45
- * IE support by utilizing the window.onerror event to retrieve information
46
- * about the top of the stack.
47
- *
48
- * Note: In IE and Safari, no stack trace is recorded on the Error object,
49
- * so computeStackTrace instead walks its *own* chain of callers.
50
- * This means that:
51
- * * in Safari, some methods may be missing from the stack trace;
52
- * * in IE, the topmost function in the stack trace will always be the
53
- * caller of computeStackTrace.
54
- *
55
- * This is okay for tracing (because you are likely to be calling
56
- * computeStackTrace from the function you want to be the topmost element
57
- * of the stack trace anyway), but not okay for logging unhandled
58
- * exceptions (because your catch block will likely be far away from the
59
- * inner function that actually caused the exception).
60
- *
61
- * Tracing example:
62
- * ```js
63
- * function trace(message) {
64
- * let stackInfo = computeStackTrace.ofCaller();
65
- * let data = message + "\n";
66
- * for(let i in stackInfo.stack) {
67
- * let item = stackInfo.stack[i];
68
- * data += (item.func || '[anonymous]') + "() in " + item.url + ":" + (item.line || '0') + "\n";
69
- * }
70
- * if (window.console)
71
- * console.info(data);
72
- * else
73
- * alert(data);
74
- * }
75
- * ```
76
- * @memberof TraceKit
77
- * @namespace
78
- */
79
-
80
13
  /**
81
14
  * Computes a stack trace for an exception.
82
- * @param {Error} ex
83
- * @param {(string|number)=} depth
84
- * @memberof computeStackTrace
85
15
  */
86
16
 
87
- function computeStackTrace(ex, depth) {
88
- var stack;
89
- var normalizedDepth = depth === undefined ? 0 : +depth;
90
-
91
- try {
92
- // This must be tried first because Opera 10 *destroys*
93
- // its stacktrace property if you try to access the stack
94
- // property first!!
95
- stack = computeStackTraceFromStacktraceProp(ex);
96
-
97
- if (stack) {
98
- return stack;
99
- }
100
- } catch (e) {
101
- if (debug) {
102
- throw e;
103
- }
104
- }
105
-
106
- try {
107
- stack = computeStackTraceFromStackProp(ex);
108
-
109
- if (stack) {
110
- return stack;
111
- }
112
- } catch (e) {
113
- if (debug) {
114
- throw e;
115
- }
116
- }
117
-
118
- try {
119
- stack = computeStackTraceFromOperaMultiLineMessage(ex);
17
+ function computeStackTrace(ex) {
18
+ var stack = [];
19
+ var stackProperty = tryToGetString(ex, 'stack');
120
20
 
121
- if (stack) {
122
- return stack;
123
- }
124
- } catch (e) {
125
- if (debug) {
126
- throw e;
127
- }
128
- }
21
+ if (stackProperty) {
22
+ (0, _tools.each)(stackProperty.split('\n'), function (line) {
23
+ var stackFrame = parseChromeLine(line) || parseChromeAnonymousLine(line) || parseWinLine(line) || parseGeckoLine(line);
129
24
 
130
- try {
131
- stack = computeStackTraceByWalkingCallerChain(ex, normalizedDepth + 1);
25
+ if (stackFrame) {
26
+ if (!stackFrame.func && stackFrame.line) {
27
+ stackFrame.func = UNKNOWN_FUNCTION;
28
+ }
132
29
 
133
- if (stack) {
134
- return stack;
135
- }
136
- } catch (e) {
137
- if (debug) {
138
- throw e;
139
- }
30
+ stack.push(stackFrame);
31
+ }
32
+ });
140
33
  }
141
34
 
142
35
  return {
143
36
  message: tryToGetString(ex, 'message'),
144
37
  name: tryToGetString(ex, 'name'),
145
- stack: []
38
+ stack: stack
146
39
  };
147
40
  }
148
41
 
149
- var debug = false; // Contents of Exception in various browsers.
150
- //
151
- // SAFARI:
152
- // ex.message = Can't find variable: qq
153
- // ex.line = 59
154
- // ex.sourceId = 580238192
155
- // ex.sourceURL = http://...
156
- // ex.expressionBeginOffset = 96
157
- // ex.expressionCaretOffset = 98
158
- // ex.expressionEndOffset = 98
159
- // ex.name = ReferenceError
160
- //
161
- // FIREFOX:
162
- // ex.message = qq is not defined
163
- // ex.fileName = http://...
164
- // ex.lineNumber = 59
165
- // ex.columnNumber = 69
166
- // ex.stack = ...stack trace... (see the example below)
167
- // ex.name = ReferenceError
168
- //
169
- // CHROME:
170
- // ex.message = qq is not defined
171
- // ex.name = ReferenceError
172
- // ex.type = not_defined
173
- // ex.arguments = ['aa']
174
- // ex.stack = ...stack trace...
175
- //
176
- // INTERNET EXPLORER:
177
- // ex.message = ...
178
- // ex.name = ReferenceError
179
- //
180
- // OPERA:
181
- // ex.message = ...message... (see the example below)
182
- // ex.name = ReferenceError
183
- // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)
184
- // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'
42
+ var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)';
43
+ var filePosition = '(?::(\\d+))';
44
+ var CHROME_LINE_RE = new RegExp('^\\s*at (.*?) ?\\(' + fileUrl + filePosition + '?' + filePosition + '?\\)?\\s*$', 'i');
45
+ var CHROME_EVAL_RE = new RegExp('\\((\\S*)' + filePosition + filePosition + '\\)');
185
46
 
186
- /**
187
- * Computes stack trace information from the stack property.
188
- * Chrome and Gecko use this property.
189
- * @param {Error} ex
190
- * @return {?StackTrace} Stack trace information.
191
- * @memberof computeStackTrace
192
- */
193
-
194
- function computeStackTraceFromStackProp(ex) {
195
- var stacktrace = tryToGetString(ex, 'stack');
47
+ function parseChromeLine(line) {
48
+ var parts = CHROME_LINE_RE.exec(line);
196
49
 
197
- if (!stacktrace) {
50
+ if (!parts) {
198
51
  return;
199
- } // eslint-disable-next-line max-len
200
-
201
-
202
- var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; // eslint-disable-next-line max-len
203
-
204
- var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; // eslint-disable-next-line max-len
205
-
206
- var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; // Used to additionally parse URL/line/column from eval frames
207
-
208
- var isEval;
209
- var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
210
- var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
211
- var lines = stacktrace.split('\n');
212
- var stack = [];
213
- var submatch;
214
- var parts;
215
- var element;
216
-
217
- for (var i = 0, j = lines.length; i < j; i += 1) {
218
- if (chrome.exec(lines[i])) {
219
- parts = chrome.exec(lines[i]);
220
- var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
221
-
222
- isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
223
-
224
- submatch = chromeEval.exec(parts[2]);
52
+ }
225
53
 
226
- if (isEval && submatch) {
227
- // throw out eval line/column and use top-most line/column number
228
- parts[2] = submatch[1]; // url
54
+ var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
229
55
 
230
- parts[3] = submatch[2]; // line
56
+ var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
231
57
 
232
- parts[4] = submatch[3]; // column
233
- }
58
+ var submatch = CHROME_EVAL_RE.exec(parts[2]);
234
59
 
235
- element = {
236
- args: isNative ? [parts[2]] : [],
237
- column: parts[4] ? +parts[4] : undefined,
238
- func: parts[1] || UNKNOWN_FUNCTION,
239
- line: parts[3] ? +parts[3] : undefined,
240
- url: !isNative ? parts[2] : undefined
241
- };
242
- } else if (winjs.exec(lines[i])) {
243
- parts = winjs.exec(lines[i]);
244
- element = {
245
- args: [],
246
- column: parts[4] ? +parts[4] : undefined,
247
- func: parts[1] || UNKNOWN_FUNCTION,
248
- line: +parts[3],
249
- url: parts[2]
250
- };
251
- } else if (gecko.exec(lines[i])) {
252
- parts = gecko.exec(lines[i]);
253
- isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
254
- submatch = geckoEval.exec(parts[3]);
255
-
256
- if (isEval && submatch) {
257
- // throw out eval line/column and use top-most line number
258
- parts[3] = submatch[1];
259
- parts[4] = submatch[2];
260
- parts[5] = undefined; // no column when eval
261
- } else if (i === 0 && !parts[5] && !isUndefined(ex.columnNumber)) {
262
- // FireFox uses this awesome columnNumber property for its top frame
263
- // Also note, Firefox's column number is 0-based and everything else expects 1-based,
264
- // so adding 1
265
- // NOTE: this hack doesn't work if top-most frame is eval
266
- stack[0].column = ex.columnNumber + 1;
267
- }
60
+ if (isEval && submatch) {
61
+ // throw out eval line/column and use top-most line/column number
62
+ parts[2] = submatch[1]; // url
268
63
 
269
- element = {
270
- args: parts[2] ? parts[2].split(',') : [],
271
- column: parts[5] ? +parts[5] : undefined,
272
- func: parts[1] || UNKNOWN_FUNCTION,
273
- line: parts[4] ? +parts[4] : undefined,
274
- url: parts[3]
275
- };
276
- } else {
277
- continue;
278
- }
279
-
280
- if (!element.func && element.line) {
281
- element.func = UNKNOWN_FUNCTION;
282
- }
283
-
284
- stack.push(element);
285
- }
64
+ parts[3] = submatch[2]; // line
286
65
 
287
- if (!stack.length) {
288
- return;
66
+ parts[4] = submatch[3]; // column
289
67
  }
290
68
 
291
69
  return {
292
- stack: stack,
293
- message: tryToGetString(ex, 'message'),
294
- name: tryToGetString(ex, 'name')
70
+ args: isNative ? [parts[2]] : [],
71
+ column: parts[4] ? +parts[4] : undefined,
72
+ func: parts[1] || UNKNOWN_FUNCTION,
73
+ line: parts[3] ? +parts[3] : undefined,
74
+ url: !isNative ? parts[2] : undefined
295
75
  };
296
76
  }
297
- /**
298
- * Computes stack trace information from the stacktrace property.
299
- * Opera 10+ uses this property.
300
- * @param {Error} ex
301
- * @return {?StackTrace} Stack trace information.
302
- * @memberof computeStackTrace
303
- */
304
77
 
78
+ var CHROME_ANONYMOUS_FUNCTION_RE = new RegExp('^\\s*at ?' + fileUrl + filePosition + '?' + filePosition + '??\\s*$', 'i');
305
79
 
306
- function computeStackTraceFromStacktraceProp(ex) {
307
- // Access and store the stacktrace property before doing ANYTHING
308
- // else to it because Opera is not very good at providing it
309
- // reliably in other circumstances.
310
- var stacktrace = tryToGetString(ex, 'stacktrace');
80
+ function parseChromeAnonymousLine(line) {
81
+ var parts = CHROME_ANONYMOUS_FUNCTION_RE.exec(line);
311
82
 
312
- if (!stacktrace) {
313
- return;
314
- }
315
-
316
- var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; // eslint-disable-next-line max-len
317
-
318
- var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
319
- var lines = stacktrace.split('\n');
320
- var stack = [];
321
- var parts;
322
-
323
- for (var line = 0; line < lines.length; line += 2) {
324
- var element;
325
-
326
- if (opera10Regex.exec(lines[line])) {
327
- parts = opera10Regex.exec(lines[line]);
328
- element = {
329
- args: [],
330
- column: undefined,
331
- func: parts[3],
332
- line: +parts[1],
333
- url: parts[2]
334
- };
335
- } else if (opera11Regex.exec(lines[line])) {
336
- parts = opera11Regex.exec(lines[line]);
337
- element = {
338
- args: parts[5] ? parts[5].split(',') : [],
339
- column: +parts[2],
340
- func: parts[3] || parts[4],
341
- line: +parts[1],
342
- url: parts[6]
343
- };
344
- }
345
-
346
- if (element) {
347
- if (!element.func && element.line) {
348
- element.func = UNKNOWN_FUNCTION;
349
- }
350
-
351
- element.context = [lines[line + 1]];
352
- stack.push(element);
353
- }
354
- }
355
-
356
- if (!stack.length) {
83
+ if (!parts) {
357
84
  return;
358
85
  }
359
86
 
360
87
  return {
361
- stack: stack,
362
- message: tryToGetString(ex, 'message'),
363
- name: tryToGetString(ex, 'name')
88
+ args: [],
89
+ column: parts[3] ? +parts[3] : undefined,
90
+ func: UNKNOWN_FUNCTION,
91
+ line: parts[2] ? +parts[2] : undefined,
92
+ url: parts[1]
364
93
  };
365
94
  }
366
- /**
367
- * NOT TESTED.
368
- * Computes stack trace information from an error message that includes
369
- * the stack trace.
370
- * Opera 9 and earlier use this method if the option to show stack
371
- * traces is turned on in opera:config.
372
- * @param {Error} ex
373
- * @return {?StackTrace} Stack information.
374
- * @memberof computeStackTrace
375
- */
376
95
 
96
+ var WINJS_LINE_RE = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
377
97
 
378
- function computeStackTraceFromOperaMultiLineMessage(ex) {
379
- // TODO: Clean this function up
380
- // Opera includes a stack trace into the exception message. An example is:
381
- //
382
- // Statement on line 3: Undefined variable: undefinedFunc
383
- // Backtrace:
384
- // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js:
385
- // In function zzz
386
- // undefinedFunc(a);
387
- // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html:
388
- // In function yyy
389
- // zzz(x, y, z);
390
- // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html:
391
- // In function xxx
392
- // yyy(a, a, a);
393
- // Line 1 of function script
394
- // try { xxx('hi'); return false; } catch(ex) { report(ex); }
395
- // ...
396
- var message = tryToGetString(ex, 'message');
397
-
398
- if (!message) {
399
- return;
400
- }
401
-
402
- var lines = message.split('\n');
98
+ function parseWinLine(line) {
99
+ var parts = WINJS_LINE_RE.exec(line);
403
100
 
404
- if (lines.length < 4) {
101
+ if (!parts) {
405
102
  return;
406
103
  }
407
104
 
408
- var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i;
409
- var lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i;
410
- var lineRE3 = /^\s*Line (\d+) of function script\s*$/i;
411
- var stack = [];
412
- var scripts = window && window.document && window.document.getElementsByTagName('script');
413
- var inlineScriptBlocks = [];
414
- var parts;
415
-
416
- for (var s in scripts) {
417
- if (has(scripts, s) && !scripts[s].src) {
418
- inlineScriptBlocks.push(scripts[s]);
419
- }
420
- }
421
-
422
- for (var line = 2; line < lines.length; line += 2) {
423
- var item;
424
-
425
- if (lineRE1.exec(lines[line])) {
426
- parts = lineRE1.exec(lines[line]);
427
- item = {
428
- args: [],
429
- column: undefined,
430
- func: parts[3],
431
- line: +parts[1],
432
- url: parts[2]
433
- };
434
- } else if (lineRE2.exec(lines[line])) {
435
- parts = lineRE2.exec(lines[line]);
436
- item = {
437
- args: [],
438
- column: undefined,
439
- // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.
440
- func: parts[4],
441
- line: +parts[1],
442
- url: parts[3]
443
- };
444
- } else if (lineRE3.exec(lines[line])) {
445
- parts = lineRE3.exec(lines[line]);
446
- var url = window.location.href.replace(/#.*$/, '');
447
- item = {
448
- url: url,
449
- args: [],
450
- column: undefined,
451
- func: '',
452
- line: +parts[1]
453
- };
454
- }
455
-
456
- if (item) {
457
- if (!item.func) {
458
- item.func = UNKNOWN_FUNCTION;
459
- }
460
-
461
- item.context = [lines[line + 1]];
462
- stack.push(item);
463
- }
464
- }
465
-
466
- if (!stack.length) {
467
- return; // could not parse multiline exception message as Opera stack trace
468
- }
469
-
470
105
  return {
471
- stack: stack,
472
- message: lines[0],
473
- name: tryToGetString(ex, 'name')
106
+ args: [],
107
+ column: parts[4] ? +parts[4] : undefined,
108
+ func: parts[1] || UNKNOWN_FUNCTION,
109
+ line: +parts[3],
110
+ url: parts[2]
474
111
  };
475
112
  }
476
- /**
477
- * Adds information about the first frame to incomplete stack traces.
478
- * Safari and IE require this to get complete data on the first frame.
479
- * @param {StackTrace} stackInfo Stack trace information from
480
- * one of the compute* methods.
481
- * @param {string=} url The URL of the script that caused an error.
482
- * @param {(number|string)=} lineNo The line number of the script that
483
- * caused an error.
484
- * @param {string=} message The error generated by the browser, which
485
- * hopefully contains the name of the object that caused the error.
486
- * @return {boolean} Whether or not the stack information was
487
- * augmented.
488
- * @memberof computeStackTrace
489
- */
490
113
 
114
+ var GECKO_LINE_RE = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
115
+ var GECKO_EVAL_RE = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
491
116
 
492
- function augmentStackTraceWithInitialElement(stackInfo, url, lineNo) {
493
- var initial = {
494
- url: url,
495
- line: lineNo ? +lineNo : undefined
496
- };
497
-
498
- if (initial.url && initial.line) {
499
- stackInfo.incomplete = false;
500
- var stack = stackInfo.stack;
501
-
502
- if (stack.length > 0) {
503
- if (stack[0].url === initial.url) {
504
- if (stack[0].line === initial.line) {
505
- return false; // already in stack trace
506
- }
117
+ function parseGeckoLine(line) {
118
+ var parts = GECKO_LINE_RE.exec(line);
507
119
 
508
- if (!stack[0].line && stack[0].func === initial.func) {
509
- stack[0].line = initial.line;
510
- stack[0].context = initial.context;
511
- return false;
512
- }
513
- }
514
- }
515
-
516
- stack.unshift(initial);
517
- stackInfo.partial = true;
518
- return true;
120
+ if (!parts) {
121
+ return;
519
122
  }
520
123
 
521
- stackInfo.incomplete = true;
522
- return false;
523
- }
524
- /**
525
- * Computes stack trace information by walking the arguments.caller
526
- * chain at the time the exception occurred. This will cause earlier
527
- * frames to be missed but is the only way to get any stack trace in
528
- * Safari and IE. The top frame is restored by
529
- * {@link augmentStackTraceWithInitialElement}.
530
- * @param {Error} ex
531
- * @param {number} depth
532
- * @return {StackTrace} Stack trace information.
533
- * @memberof computeStackTrace
534
- */
535
-
536
-
537
- function computeStackTraceByWalkingCallerChain(ex, depth) {
538
- var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i;
539
- var stack = [];
540
- var funcs = {};
541
- var recursion = false;
542
- var parts;
543
- var item;
544
-
545
- for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {
546
- if (curr === computeStackTrace || curr === _report.report) {
547
- continue;
548
- }
549
-
550
- item = {
551
- args: [],
552
- column: undefined,
553
- func: UNKNOWN_FUNCTION,
554
- line: undefined,
555
- url: undefined
556
- };
557
- parts = functionName.exec(curr.toString());
558
-
559
- if (curr.name) {
560
- item.func = curr.name;
561
- } else if (parts) {
562
- item.func = parts[1];
563
- }
564
-
565
- if (typeof item.func === 'undefined') {
566
- item.func = parts ? parts.input.substring(0, parts.input.indexOf('{')) : undefined;
567
- }
568
-
569
- if (funcs[curr.toString()]) {
570
- recursion = true;
571
- } else {
572
- funcs[curr.toString()] = true;
573
- }
574
-
575
- stack.push(item);
576
- }
124
+ var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
125
+ var submatch = GECKO_EVAL_RE.exec(parts[3]);
577
126
 
578
- if (depth) {
579
- stack.splice(0, depth);
127
+ if (isEval && submatch) {
128
+ // throw out eval line/column and use top-most line number
129
+ parts[3] = submatch[1];
130
+ parts[4] = submatch[2];
131
+ parts[5] = undefined; // no column when eval
580
132
  }
581
133
 
582
- var result = {
583
- stack: stack,
584
- message: tryToGetString(ex, 'message'),
585
- name: tryToGetString(ex, 'name')
134
+ return {
135
+ args: parts[2] ? parts[2].split(',') : [],
136
+ column: parts[5] ? +parts[5] : undefined,
137
+ func: parts[1] || UNKNOWN_FUNCTION,
138
+ line: parts[4] ? +parts[4] : undefined,
139
+ url: parts[3]
586
140
  };
587
- augmentStackTraceWithInitialElement(result, tryToGetString(ex, 'sourceURL') || tryToGetString(ex, 'fileName'), tryToGetString(ex, 'line') || tryToGetString(ex, 'lineNumber'));
588
- return result;
589
141
  }
590
142
 
591
143
  function tryToGetString(candidate, property) {
@@ -595,46 +147,4 @@ function tryToGetString(candidate, property) {
595
147
 
596
148
  var value = candidate[property];
597
149
  return typeof value === 'string' ? value : undefined;
598
- }
599
- /**
600
- * Logs a stacktrace starting from the previous call and working down.
601
- * @param {(number|string)=} depth How many frames deep to trace.
602
- * @return {StackTrace} Stack trace information.
603
- * @memberof computeStackTrace
604
- */
605
-
606
-
607
- function computeStackTraceOfCaller(depth) {
608
- var currentDepth = (depth === undefined ? 0 : +depth) + 1; // "+ 1" because "ofCaller" should drop one frame
609
-
610
- try {
611
- throw new Error();
612
- } catch (ex) {
613
- return computeStackTrace(ex, currentDepth + 1);
614
- }
615
- }
616
- /**
617
- * A better form of hasOwnProperty<br/>
618
- * Example: `has(MainHostObject, property) === true/false`
619
- *
620
- * @param {Object} object to check property
621
- * @param {string} key to check
622
- * @return {Boolean} true if the object has the key and it is not inherited
623
- */
624
-
625
-
626
- function has(object, key) {
627
- return Object.prototype.hasOwnProperty.call(object, key);
628
- }
629
- /**
630
- * Returns true if the parameter is undefined<br/>
631
- * Example: `isUndefined(val) === true/false`
632
- *
633
- * @param {*} what Value to check
634
- * @return {Boolean} true if undefined and false otherwise
635
- */
636
-
637
-
638
- function isUndefined(what) {
639
- return typeof what === 'undefined';
640
150
  }