@sentry/browser 7.0.0-beta.0 → 7.0.0-beta.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 (186) hide show
  1. package/README.md +2 -3
  2. package/cjs/client.js +125 -102
  3. package/cjs/client.js.map +1 -1
  4. package/cjs/eventbuilder.js +225 -165
  5. package/cjs/eventbuilder.js.map +1 -1
  6. package/cjs/exports.js +55 -59
  7. package/cjs/exports.js.map +1 -1
  8. package/cjs/flags.js +7 -3
  9. package/cjs/flags.js.map +1 -1
  10. package/cjs/helpers.js +123 -96
  11. package/cjs/helpers.js.map +1 -1
  12. package/cjs/index.js +77 -10
  13. package/cjs/index.js.map +1 -1
  14. package/cjs/integrations/breadcrumbs.js +222 -174
  15. package/cjs/integrations/breadcrumbs.js.map +1 -1
  16. package/cjs/integrations/dedupe.js +184 -142
  17. package/cjs/integrations/dedupe.js.map +1 -1
  18. package/cjs/integrations/globalhandlers.js +211 -170
  19. package/cjs/integrations/globalhandlers.js.map +1 -1
  20. package/cjs/integrations/httpcontext.js +51 -0
  21. package/cjs/integrations/httpcontext.js.map +1 -0
  22. package/cjs/integrations/index.js +18 -14
  23. package/cjs/integrations/index.js.map +1 -1
  24. package/cjs/integrations/linkederrors.js +81 -50
  25. package/cjs/integrations/linkederrors.js.map +1 -1
  26. package/cjs/integrations/trycatch.js +247 -208
  27. package/cjs/integrations/trycatch.js.map +1 -1
  28. package/cjs/sdk.js +166 -125
  29. package/cjs/sdk.js.map +1 -1
  30. package/cjs/stack-parsers.js +143 -93
  31. package/cjs/stack-parsers.js.map +1 -1
  32. package/cjs/transports/fetch.js +30 -15
  33. package/cjs/transports/fetch.js.map +1 -1
  34. package/cjs/transports/index.js +10 -6
  35. package/cjs/transports/index.js.map +1 -1
  36. package/cjs/transports/utils.js +56 -51
  37. package/cjs/transports/utils.js.map +1 -1
  38. package/cjs/transports/xhr.js +40 -30
  39. package/cjs/transports/xhr.js.map +1 -1
  40. package/esm/client.js +124 -101
  41. package/esm/client.js.map +1 -1
  42. package/esm/eventbuilder.js +218 -158
  43. package/esm/eventbuilder.js.map +1 -1
  44. package/esm/exports.js +12 -8
  45. package/esm/exports.js.map +1 -1
  46. package/esm/flags.js +5 -2
  47. package/esm/flags.js.map +1 -1
  48. package/esm/helpers.js +122 -95
  49. package/esm/helpers.js.map +1 -1
  50. package/esm/index.js +27 -7
  51. package/esm/index.js.map +1 -1
  52. package/esm/integrations/breadcrumbs.js +218 -171
  53. package/esm/integrations/breadcrumbs.js.map +1 -1
  54. package/esm/integrations/dedupe.js +181 -139
  55. package/esm/integrations/dedupe.js.map +1 -1
  56. package/esm/integrations/globalhandlers.js +208 -167
  57. package/esm/integrations/globalhandlers.js.map +1 -1
  58. package/esm/integrations/httpcontext.js +49 -0
  59. package/esm/integrations/httpcontext.js.map +1 -0
  60. package/esm/integrations/index.js +7 -7
  61. package/esm/integrations/index.js.map +1 -1
  62. package/esm/integrations/linkederrors.js +77 -46
  63. package/esm/integrations/linkederrors.js.map +1 -1
  64. package/esm/integrations/trycatch.js +244 -205
  65. package/esm/integrations/trycatch.js.map +1 -1
  66. package/esm/sdk.js +163 -123
  67. package/esm/sdk.js.map +1 -1
  68. package/esm/stack-parsers.js +134 -91
  69. package/esm/stack-parsers.js.map +1 -1
  70. package/esm/transports/fetch.js +28 -13
  71. package/esm/transports/fetch.js.map +1 -1
  72. package/esm/transports/index.js +3 -3
  73. package/esm/transports/index.js.map +1 -1
  74. package/esm/transports/utils.js +55 -50
  75. package/esm/transports/utils.js.map +1 -1
  76. package/esm/transports/xhr.js +38 -28
  77. package/esm/transports/xhr.js.map +1 -1
  78. package/package.json +4 -4
  79. package/types/client.d.ts +3 -2
  80. package/types/client.d.ts.map +1 -1
  81. package/types/exports.d.ts +3 -4
  82. package/types/exports.d.ts.map +1 -1
  83. package/types/index.d.ts +1 -1
  84. package/types/integrations/{useragent.d.ts → httpcontext.d.ts} +3 -3
  85. package/types/integrations/httpcontext.d.ts.map +1 -0
  86. package/types/integrations/index.d.ts +1 -1
  87. package/types/integrations/index.d.ts.map +1 -1
  88. package/types/sdk.d.ts +2 -2
  89. package/types/sdk.d.ts.map +1 -1
  90. package/types/transports/fetch.d.ts +3 -5
  91. package/types/transports/fetch.d.ts.map +1 -1
  92. package/types/transports/types.d.ts +10 -0
  93. package/types/transports/types.d.ts.map +1 -0
  94. package/types/transports/xhr.d.ts +3 -7
  95. package/types/transports/xhr.d.ts.map +1 -1
  96. package/cjs/client.d.ts +0 -63
  97. package/cjs/client.d.ts.map +0 -1
  98. package/cjs/eventbuilder.d.ts +0 -37
  99. package/cjs/eventbuilder.d.ts.map +0 -1
  100. package/cjs/exports.d.ts +0 -11
  101. package/cjs/exports.d.ts.map +0 -1
  102. package/cjs/flags.d.ts +0 -3
  103. package/cjs/flags.d.ts.map +0 -1
  104. package/cjs/helpers.d.ts +0 -47
  105. package/cjs/helpers.d.ts.map +0 -1
  106. package/cjs/index.d.ts +0 -15
  107. package/cjs/index.d.ts.map +0 -1
  108. package/cjs/integrations/breadcrumbs.d.ts +0 -46
  109. package/cjs/integrations/breadcrumbs.d.ts.map +0 -1
  110. package/cjs/integrations/dedupe.d.ts +0 -21
  111. package/cjs/integrations/dedupe.d.ts.map +0 -1
  112. package/cjs/integrations/globalhandlers.d.ts +0 -30
  113. package/cjs/integrations/globalhandlers.d.ts.map +0 -1
  114. package/cjs/integrations/index.d.ts +0 -7
  115. package/cjs/integrations/index.d.ts.map +0 -1
  116. package/cjs/integrations/linkederrors.d.ts +0 -42
  117. package/cjs/integrations/linkederrors.d.ts.map +0 -1
  118. package/cjs/integrations/trycatch.d.ts +0 -33
  119. package/cjs/integrations/trycatch.d.ts.map +0 -1
  120. package/cjs/integrations/useragent.d.ts +0 -17
  121. package/cjs/integrations/useragent.d.ts.map +0 -1
  122. package/cjs/integrations/useragent.js +0 -40
  123. package/cjs/integrations/useragent.js.map +0 -1
  124. package/cjs/sdk.d.ts +0 -112
  125. package/cjs/sdk.d.ts.map +0 -1
  126. package/cjs/stack-parsers.d.ts +0 -9
  127. package/cjs/stack-parsers.d.ts.map +0 -1
  128. package/cjs/transports/fetch.d.ts +0 -10
  129. package/cjs/transports/fetch.d.ts.map +0 -1
  130. package/cjs/transports/index.d.ts +0 -3
  131. package/cjs/transports/index.d.ts.map +0 -1
  132. package/cjs/transports/utils.d.ts +0 -48
  133. package/cjs/transports/utils.d.ts.map +0 -1
  134. package/cjs/transports/xhr.d.ts +0 -11
  135. package/cjs/transports/xhr.d.ts.map +0 -1
  136. package/cjs/version.d.ts +0 -2
  137. package/cjs/version.d.ts.map +0 -1
  138. package/cjs/version.js +0 -4
  139. package/cjs/version.js.map +0 -1
  140. package/esm/client.d.ts +0 -63
  141. package/esm/client.d.ts.map +0 -1
  142. package/esm/eventbuilder.d.ts +0 -37
  143. package/esm/eventbuilder.d.ts.map +0 -1
  144. package/esm/exports.d.ts +0 -11
  145. package/esm/exports.d.ts.map +0 -1
  146. package/esm/flags.d.ts +0 -3
  147. package/esm/flags.d.ts.map +0 -1
  148. package/esm/helpers.d.ts +0 -47
  149. package/esm/helpers.d.ts.map +0 -1
  150. package/esm/index.d.ts +0 -15
  151. package/esm/index.d.ts.map +0 -1
  152. package/esm/integrations/breadcrumbs.d.ts +0 -46
  153. package/esm/integrations/breadcrumbs.d.ts.map +0 -1
  154. package/esm/integrations/dedupe.d.ts +0 -21
  155. package/esm/integrations/dedupe.d.ts.map +0 -1
  156. package/esm/integrations/globalhandlers.d.ts +0 -30
  157. package/esm/integrations/globalhandlers.d.ts.map +0 -1
  158. package/esm/integrations/index.d.ts +0 -7
  159. package/esm/integrations/index.d.ts.map +0 -1
  160. package/esm/integrations/linkederrors.d.ts +0 -42
  161. package/esm/integrations/linkederrors.d.ts.map +0 -1
  162. package/esm/integrations/trycatch.d.ts +0 -33
  163. package/esm/integrations/trycatch.d.ts.map +0 -1
  164. package/esm/integrations/useragent.d.ts +0 -17
  165. package/esm/integrations/useragent.d.ts.map +0 -1
  166. package/esm/integrations/useragent.js +0 -38
  167. package/esm/integrations/useragent.js.map +0 -1
  168. package/esm/sdk.d.ts +0 -112
  169. package/esm/sdk.d.ts.map +0 -1
  170. package/esm/stack-parsers.d.ts +0 -9
  171. package/esm/stack-parsers.d.ts.map +0 -1
  172. package/esm/transports/fetch.d.ts +0 -10
  173. package/esm/transports/fetch.d.ts.map +0 -1
  174. package/esm/transports/index.d.ts +0 -3
  175. package/esm/transports/index.d.ts.map +0 -1
  176. package/esm/transports/utils.d.ts +0 -48
  177. package/esm/transports/utils.d.ts.map +0 -1
  178. package/esm/transports/xhr.d.ts +0 -11
  179. package/esm/transports/xhr.d.ts.map +0 -1
  180. package/esm/version.d.ts +0 -2
  181. package/esm/version.d.ts.map +0 -1
  182. package/esm/version.js +0 -3
  183. package/esm/version.js.map +0 -1
  184. package/types/integrations/useragent.d.ts.map +0 -1
  185. package/types/version.d.ts +0 -2
  186. package/types/version.d.ts.map +0 -1
@@ -1,99 +1,139 @@
1
1
  import { createStackParser } from '@sentry/utils';
2
+
2
3
  // global reference to slice
3
- const UNKNOWN_FUNCTION = '?';
4
- const OPERA10_PRIORITY = 10;
5
- const OPERA11_PRIORITY = 20;
6
- const CHROME_PRIORITY = 30;
7
- const WINJS_PRIORITY = 40;
8
- const GECKO_PRIORITY = 50;
4
+ var UNKNOWN_FUNCTION = '?';
5
+
6
+ var OPERA10_PRIORITY = 10;
7
+ var OPERA11_PRIORITY = 20;
8
+ var CHROME_PRIORITY = 30;
9
+ var WINJS_PRIORITY = 40;
10
+ var GECKO_PRIORITY = 50;
11
+
9
12
  function createFrame(filename, func, lineno, colno) {
10
- const frame = {
11
- filename,
12
- function: func,
13
- // All browser frames are considered in_app
14
- in_app: true,
15
- };
16
- if (lineno !== undefined) {
17
- frame.lineno = lineno;
18
- }
19
- if (colno !== undefined) {
20
- frame.colno = colno;
21
- }
22
- return frame;
13
+ var frame = {
14
+ filename,
15
+ function: func,
16
+ // All browser frames are considered in_app
17
+ in_app: true,
18
+ };
19
+
20
+ if (lineno !== undefined) {
21
+ frame.lineno = lineno;
22
+ }
23
+
24
+ if (colno !== undefined) {
25
+ frame.colno = colno;
26
+ }
27
+
28
+ return frame;
23
29
  }
30
+
24
31
  // Chromium based browsers: Chrome, Brave, new Opera, new Edge
25
- const chromeRegex = /^\s*at (?:(.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
26
- const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
27
- const chrome = line => {
28
- const parts = chromeRegex.exec(line);
29
- if (parts) {
30
- const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
31
- if (isEval) {
32
- const subMatch = chromeEvalRegex.exec(parts[2]);
33
- if (subMatch) {
34
- // throw out eval line/column and use top-most line/column number
35
- parts[2] = subMatch[1]; // url
36
- parts[3] = subMatch[2]; // line
37
- parts[4] = subMatch[3]; // column
38
- }
39
- }
40
- // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now
41
- // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)
42
- const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);
43
- return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);
32
+ var chromeRegex =
33
+ /^\s*at (?:(.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
34
+ var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
35
+
36
+ var chrome = line => {
37
+ var parts = chromeRegex.exec(line);
38
+
39
+ if (parts) {
40
+ var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
41
+
42
+ if (isEval) {
43
+ var subMatch = chromeEvalRegex.exec(parts[2]);
44
+
45
+ if (subMatch) {
46
+ // throw out eval line/column and use top-most line/column number
47
+ parts[2] = subMatch[1]; // url
48
+ parts[3] = subMatch[2]; // line
49
+ parts[4] = subMatch[3]; // column
50
+ }
44
51
  }
45
- return;
52
+
53
+ // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now
54
+ // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)
55
+ const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);
56
+
57
+ return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);
58
+ }
59
+
60
+ return;
46
61
  };
47
- export const chromeStackLineParser = [CHROME_PRIORITY, chrome];
62
+
63
+ var chromeStackLineParser = [CHROME_PRIORITY, chrome];
64
+
48
65
  // gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
49
66
  // generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
50
67
  // We need this specific case for now because we want no other regex to match.
51
- const geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
52
- const geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
53
- const gecko = line => {
54
- const parts = geckoREgex.exec(line);
55
- if (parts) {
56
- const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
57
- if (isEval) {
58
- const subMatch = geckoEvalRegex.exec(parts[3]);
59
- if (subMatch) {
60
- // throw out eval line/column and use top-most line number
61
- parts[1] = parts[1] || 'eval';
62
- parts[3] = subMatch[1];
63
- parts[4] = subMatch[2];
64
- parts[5] = ''; // no column when eval
65
- }
66
- }
67
- let filename = parts[3];
68
- let func = parts[1] || UNKNOWN_FUNCTION;
69
- [func, filename] = extractSafariExtensionDetails(func, filename);
70
- return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);
68
+ var geckoREgex =
69
+ /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
70
+ var geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
71
+
72
+ var gecko = line => {
73
+ var parts = geckoREgex.exec(line);
74
+
75
+ if (parts) {
76
+ var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
77
+ if (isEval) {
78
+ var subMatch = geckoEvalRegex.exec(parts[3]);
79
+
80
+ if (subMatch) {
81
+ // throw out eval line/column and use top-most line number
82
+ parts[1] = parts[1] || 'eval';
83
+ parts[3] = subMatch[1];
84
+ parts[4] = subMatch[2];
85
+ parts[5] = ''; // no column when eval
86
+ }
71
87
  }
72
- return;
88
+
89
+ let filename = parts[3];
90
+ let func = parts[1] || UNKNOWN_FUNCTION;
91
+ [func, filename] = extractSafariExtensionDetails(func, filename);
92
+
93
+ return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);
94
+ }
95
+
96
+ return;
73
97
  };
74
- export const geckoStackLineParser = [GECKO_PRIORITY, gecko];
75
- const winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
76
- const winjs = line => {
77
- const parts = winjsRegex.exec(line);
78
- return parts
79
- ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)
80
- : undefined;
98
+
99
+ var geckoStackLineParser = [GECKO_PRIORITY, gecko];
100
+
101
+ var winjsRegex =
102
+ /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
103
+
104
+ var winjs = line => {
105
+ var parts = winjsRegex.exec(line);
106
+
107
+ return parts
108
+ ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)
109
+ : undefined;
81
110
  };
82
- export const winjsStackLineParser = [WINJS_PRIORITY, winjs];
83
- const opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
84
- const opera10 = line => {
85
- const parts = opera10Regex.exec(line);
86
- return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;
111
+
112
+ var winjsStackLineParser = [WINJS_PRIORITY, winjs];
113
+
114
+ var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
115
+
116
+ var opera10 = line => {
117
+ var parts = opera10Regex.exec(line);
118
+ return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;
87
119
  };
88
- export const opera10StackLineParser = [OPERA10_PRIORITY, opera10];
89
- const opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i;
90
- const opera11 = line => {
91
- const parts = opera11Regex.exec(line);
92
- return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;
120
+
121
+ var opera10StackLineParser = [OPERA10_PRIORITY, opera10];
122
+
123
+ var opera11Regex =
124
+ / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i;
125
+
126
+ var opera11 = line => {
127
+ var parts = opera11Regex.exec(line);
128
+ return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;
93
129
  };
94
- export const opera11StackLineParser = [OPERA11_PRIORITY, opera11];
95
- export const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];
96
- export const defaultStackParser = createStackParser(...defaultStackLineParsers);
130
+
131
+ var opera11StackLineParser = [OPERA11_PRIORITY, opera11];
132
+
133
+ var defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];
134
+
135
+ var defaultStackParser = createStackParser(...defaultStackLineParsers);
136
+
97
137
  /**
98
138
  * Safari web extensions, starting version unknown, can produce "frames-only" stacktraces.
99
139
  * What it means, is that instead of format like:
@@ -114,14 +154,17 @@ export const defaultStackParser = createStackParser(...defaultStackLineParsers);
114
154
  * Unfortunately "just" changing RegExp is too complicated now and making it pass all tests
115
155
  * and fix this case seems like an impossible, or at least way too time-consuming task.
116
156
  */
117
- const extractSafariExtensionDetails = (func, filename) => {
118
- const isSafariExtension = func.indexOf('safari-extension') !== -1;
119
- const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;
120
- return isSafariExtension || isSafariWebExtension
121
- ? [
122
- func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,
123
- isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,
124
- ]
125
- : [func, filename];
157
+ var extractSafariExtensionDetails = (func, filename) => {
158
+ var isSafariExtension = func.indexOf('safari-extension') !== -1;
159
+ var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;
160
+
161
+ return isSafariExtension || isSafariWebExtension
162
+ ? [
163
+ func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,
164
+ isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,
165
+ ]
166
+ : [func, filename];
126
167
  };
127
- //# sourceMappingURL=stack-parsers.js.map
168
+
169
+ export { chromeStackLineParser, defaultStackLineParsers, defaultStackParser, geckoStackLineParser, opera10StackLineParser, opera11StackLineParser, winjsStackLineParser };
170
+ //# sourceMappingURL=stack-parsers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stack-parsers.js","sourceRoot":"","sources":["../../../src/stack-parsers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,4BAA4B;AAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,SAAS,WAAW,CAAC,QAAgB,EAAE,IAAY,EAAE,MAAe,EAAE,KAAc;IAClF,MAAM,KAAK,GAAe;QACxB,QAAQ;QACR,QAAQ,EAAE,IAAI;QACd,2CAA2C;QAC3C,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;KACvB;IAED,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;KACrB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8DAA8D;AAC9D,MAAM,WAAW,GACf,4KAA4K,CAAC;AAC/K,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAExD,MAAM,MAAM,GAAsB,IAAI,CAAC,EAAE;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,KAAK,EAAE;QACT,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB;QAE3E,IAAI,MAAM,EAAE;YACV,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhD,IAAI,QAAQ,EAAE;gBACZ,iEAAiE;gBACjE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;gBAC/B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aAClC;SACF;QAED,kHAAkH;QAClH,oFAAoF;QACpF,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/F,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;KACxG;IAED,OAAO;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAEhF,8HAA8H;AAC9H,qGAAqG;AACrG,8EAA8E;AAC9E,MAAM,UAAU,GACd,iMAAiM,CAAC;AACpM,MAAM,cAAc,GAAG,+CAA+C,CAAC;AAEvE,MAAM,KAAK,GAAsB,IAAI,CAAC,EAAE;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,KAAK,EAAE;QACT,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE;YACV,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/C,IAAI,QAAQ,EAAE;gBACZ,0DAA0D;gBAC1D,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;gBAC9B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACvB,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACvB,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,sBAAsB;aACtC;SACF;QAED,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC;QACxC,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,6BAA6B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEjE,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;KACxG;IAED,OAAO;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAoB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAE7E,MAAM,UAAU,GACd,+GAA+G,CAAC;AAElH,MAAM,KAAK,GAAsB,IAAI,CAAC,EAAE;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpC,OAAO,KAAK;QACV,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAoB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAE7E,MAAM,YAAY,GAAG,6DAA6D,CAAC;AAEnF,MAAM,OAAO,GAAsB,IAAI,CAAC,EAAE;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAoB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAEnF,MAAM,YAAY,GAChB,mGAAmG,CAAC;AAEtG,MAAM,OAAO,GAAsB,IAAI,CAAC,EAAE;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACnH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAoB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;AAE3G,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,uBAAuB,CAAC,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,6BAA6B,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAoB,EAAE;IACzF,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzE,OAAO,iBAAiB,IAAI,oBAAoB;QAC9C,CAAC,CAAC;YACE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;YAChE,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC,CAAC,wBAAwB,QAAQ,EAAE;SACxF;QACH,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC","sourcesContent":["import { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/types';\nimport { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n // All browser frames are considered in_app\n in_app: true,\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nconst chrome: StackLineParserFn = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n"]}
1
+ {"version":3,"file":"stack-parsers.js","sources":["../../../src/stack-parsers.ts"],"sourcesContent":["import { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/types';\nimport { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n // All browser frames are considered in_app\n in_app: true,\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nconst chrome: StackLineParserFn = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;"}
@@ -1,18 +1,33 @@
1
1
  import { createTransport } from '@sentry/core';
2
- import { getNativeFetchImplementation } from './utils';
2
+ import { getNativeFetchImplementation } from './utils.js';
3
+
3
4
  /**
4
5
  * Creates a Transport that uses the Fetch API to send events to Sentry.
5
6
  */
6
- export function makeFetchTransport(options, nativeFetch = getNativeFetchImplementation()) {
7
- function makeRequest(request) {
8
- const requestOptions = Object.assign({ body: request.body, method: 'POST', referrerPolicy: 'origin' }, options.requestOptions);
9
- return nativeFetch(options.url, requestOptions).then(response => ({
10
- headers: {
11
- 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
12
- 'retry-after': response.headers.get('Retry-After'),
13
- },
14
- }));
15
- }
16
- return createTransport(options, makeRequest);
7
+ function makeFetchTransport(
8
+ options,
9
+ nativeFetch = getNativeFetchImplementation(),
10
+ ) {
11
+ function makeRequest(request) {
12
+ var requestOptions = {
13
+ body: request.body,
14
+ method: 'POST',
15
+ referrerPolicy: 'origin',
16
+ headers: options.headers,
17
+ ...options.fetchOptions,
18
+ };
19
+
20
+ return nativeFetch(options.url, requestOptions).then(response => ({
21
+ statusCode: response.status,
22
+ headers: {
23
+ 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
24
+ 'retry-after': response.headers.get('Retry-After'),
25
+ },
26
+ }));
27
+ }
28
+
29
+ return createTransport(options, makeRequest);
17
30
  }
18
- //# sourceMappingURL=fetch.js.map
31
+
32
+ export { makeFetchTransport };
33
+ //# sourceMappingURL=fetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/transports/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAa,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAMlE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA8B,EAC9B,cAAyB,4BAA4B,EAAE;IAEvD,SAAS,WAAW,CAAC,OAAyB;QAC5C,MAAM,cAAc,mBAClB,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,QAAQ,IACrB,OAAO,CAAC,cAAc,CAC1B,CAAC;QAEF,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE;gBACP,sBAAsB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;gBACpE,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;aACnD;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import { createTransport } from '@sentry/core';\nimport { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\n\nimport { FetchImpl, getNativeFetchImplementation } from './utils';\n\nexport interface FetchTransportOptions extends BaseTransportOptions {\n requestOptions?: RequestInit;\n}\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n options: FetchTransportOptions,\n nativeFetch: FetchImpl = getNativeFetchImplementation(),\n): Transport {\n function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n const requestOptions: RequestInit = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n ...options.requestOptions,\n };\n\n return nativeFetch(options.url, requestOptions).then(response => ({\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n }));\n }\n\n return createTransport(options, makeRequest);\n}\n"]}
1
+ {"version":3,"file":"fetch.js","sources":["../../../../src/transports/fetch.ts"],"sourcesContent":["import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\n\nimport { BrowserTransportOptions } from './types';\nimport { FetchImpl, getNativeFetchImplementation } from './utils';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n options: BrowserTransportOptions,\n nativeFetch: FetchImpl = getNativeFetchImplementation(),\n): Transport {\n function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n const requestOptions: RequestInit = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n headers: options.headers,\n ...options.fetchOptions,\n };\n\n return nativeFetch(options.url, requestOptions).then(response => ({\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n }));\n }\n\n return createTransport(options, makeRequest);\n}\n"],"names":[],"mappings":";;;AAMA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;"}
@@ -1,3 +1,3 @@
1
- export { makeFetchTransport } from './fetch';
2
- export { makeXHRTransport } from './xhr';
3
- //# sourceMappingURL=index.js.map
1
+ export { makeFetchTransport } from './fetch.js';
2
+ export { makeXHRTransport } from './xhr.js';
3
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/transports/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { makeFetchTransport } from './fetch';\nexport { makeXHRTransport } from './xhr';\n"]}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,16 +1,18 @@
1
1
  import { getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';
2
- import { IS_DEBUG_BUILD } from '../flags';
3
- const global = getGlobalObject();
2
+ import { IS_DEBUG_BUILD } from '../flags.js';
3
+
4
+ var global = getGlobalObject();
4
5
  let cachedFetchImpl;
6
+
5
7
  /**
6
8
  * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.
7
9
  * Whenever someone wraps the Fetch API and returns the wrong promise chain,
8
10
  * this chain becomes orphaned and there is no possible way to capture it's rejections
9
11
  * other than allowing it bubble up to this very handler. eg.
10
12
  *
11
- * const f = window.fetch;
13
+ * var f = window.fetch;
12
14
  * window.fetch = function () {
13
- * const p = f.apply(this, arguments);
15
+ * var p = f.apply(this, arguments);
14
16
  *
15
17
  * p.then(function() {
16
18
  * console.log('hi.');
@@ -40,59 +42,62 @@ let cachedFetchImpl;
40
42
  * Firefox: NetworkError when attempting to fetch resource
41
43
  * Safari: resource blocked by content blocker
42
44
  */
43
- export function getNativeFetchImplementation() {
44
- if (cachedFetchImpl) {
45
- return cachedFetchImpl;
46
- }
47
- /* eslint-disable @typescript-eslint/unbound-method */
48
- // Fast path to avoid DOM I/O
49
- if (isNativeFetch(global.fetch)) {
50
- return (cachedFetchImpl = global.fetch.bind(global));
51
- }
52
- const document = global.document;
53
- let fetchImpl = global.fetch;
54
- // eslint-disable-next-line deprecation/deprecation
45
+ function getNativeFetchImplementation() {
46
+ if (cachedFetchImpl) {
47
+ return cachedFetchImpl;
48
+ }
49
+
50
+ // Fast path to avoid DOM I/O
51
+ if (isNativeFetch(global.fetch)) {
52
+ return (cachedFetchImpl = global.fetch.bind(global));
53
+ }
54
+
55
+ var document = global.document;
56
+ let fetchImpl = global.fetch;
55
57
  if (document && typeof document.createElement === 'function') {
56
- try {
57
- const sandbox = document.createElement('iframe');
58
- sandbox.hidden = true;
59
- document.head.appendChild(sandbox);
60
- const contentWindow = sandbox.contentWindow;
61
- if (contentWindow && contentWindow.fetch) {
62
- fetchImpl = contentWindow.fetch;
63
- }
64
- document.head.removeChild(sandbox);
65
- }
66
- catch (e) {
67
- IS_DEBUG_BUILD &&
68
- logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);
69
- }
58
+ try {
59
+ var sandbox = document.createElement('iframe');
60
+ sandbox.hidden = true;
61
+ document.head.appendChild(sandbox);
62
+ var contentWindow = sandbox.contentWindow;
63
+ if (contentWindow && contentWindow.fetch) {
64
+ fetchImpl = contentWindow.fetch;
65
+ }
66
+ document.head.removeChild(sandbox);
67
+ } catch (e) {
68
+ IS_DEBUG_BUILD &&
69
+ logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);
70
70
  }
71
- return (cachedFetchImpl = fetchImpl.bind(global));
72
- /* eslint-enable @typescript-eslint/unbound-method */
71
+ }
72
+
73
+ return (cachedFetchImpl = fetchImpl.bind(global));
74
+ /* eslint-enable @typescript-eslint/unbound-method */
73
75
  }
76
+
74
77
  /**
75
78
  * Sends sdk client report using sendBeacon or fetch as a fallback if available
76
79
  *
77
80
  * @param url report endpoint
78
81
  * @param body report payload
79
82
  */
80
- export function sendReport(url, body) {
81
- const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';
82
- const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';
83
- if (hasSendBeacon) {
84
- // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
85
- const sendBeacon = global.navigator.sendBeacon.bind(global.navigator);
86
- sendBeacon(url, body);
87
- }
88
- else if (supportsFetch()) {
89
- const fetch = getNativeFetchImplementation();
90
- fetch(url, {
91
- body,
92
- method: 'POST',
93
- credentials: 'omit',
94
- keepalive: true,
95
- }).then(null, error => logger.error(error));
96
- }
83
+ function sendReport(url, body) {
84
+ var isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';
85
+ var hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';
86
+
87
+ if (hasSendBeacon) {
88
+ // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
89
+ var sendBeacon = global.navigator.sendBeacon.bind(global.navigator);
90
+ sendBeacon(url, body);
91
+ } else if (supportsFetch()) {
92
+ var fetch = getNativeFetchImplementation();
93
+ fetch(url, {
94
+ body,
95
+ method: 'POST',
96
+ credentials: 'omit',
97
+ keepalive: true,
98
+ }).then(null, error => logger.error(error));
99
+ }
97
100
  }
98
- //# sourceMappingURL=utils.js.map
101
+
102
+ export { getNativeFetchImplementation, sendReport };
103
+ //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/transports/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,MAAM,GAAG,eAAe,EAAU,CAAC;AACzC,IAAI,eAA0B,CAAC;AAI/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,UAAU,4BAA4B;IAC1C,IAAI,eAAe,EAAE;QACnB,OAAO,eAAe,CAAC;KACxB;IAED,sDAAsD;IAEtD,6BAA6B;IAC7B,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC/B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;KACtD;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7B,mDAAmD;IACnD,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,UAAU,EAAE;QAC5D,IAAI;YACF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAC5C,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,EAAE;gBACxC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;aACjC;YACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACpC;QAAC,OAAO,CAAC,EAAE;YACV,cAAc;gBACZ,MAAM,CAAC,IAAI,CAAC,iFAAiF,EAAE,CAAC,CAAC,CAAC;SACrG;KACF;IAED,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,qDAAqD;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAY;IAClD,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,oBAAoB,CAAC;IAC5G,MAAM,aAAa,GAAG,eAAe,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,KAAK,UAAU,CAAC;IAE3F,IAAI,aAAa,EAAE;QACjB,wHAAwH;QACxH,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KACvB;SAAM,IAAI,aAAa,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,4BAA4B,EAAE,CAAC;QAC7C,KAAK,CAAC,GAAG,EAAE;YACT,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAC7C;AACH,CAAC","sourcesContent":["import { getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\n\nimport { IS_DEBUG_BUILD } from '../flags';\n\nconst global = getGlobalObject<Window>();\nlet cachedFetchImpl: FetchImpl;\n\nexport type FetchImpl = typeof fetch;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nexport function getNativeFetchImplementation(): FetchImpl {\n if (cachedFetchImpl) {\n return cachedFetchImpl;\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Fast path to avoid DOM I/O\n if (isNativeFetch(global.fetch)) {\n return (cachedFetchImpl = global.fetch.bind(global));\n }\n\n const document = global.document;\n let fetchImpl = global.fetch;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow.fetch) {\n fetchImpl = contentWindow.fetch;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n IS_DEBUG_BUILD &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return (cachedFetchImpl = fetchImpl.bind(global));\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url: string, body: string): void {\n const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n\n if (hasSendBeacon) {\n // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n const sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n sendBeacon(url, body);\n } else if (supportsFetch()) {\n const fetch = getNativeFetchImplementation();\n fetch(url, {\n body,\n method: 'POST',\n credentials: 'omit',\n keepalive: true,\n }).then(null, error => logger.error(error));\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/transports/utils.ts"],"sourcesContent":["import { getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\n\nimport { IS_DEBUG_BUILD } from '../flags';\n\nconst global = getGlobalObject<Window>();\nlet cachedFetchImpl: FetchImpl;\n\nexport type FetchImpl = typeof fetch;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nexport function getNativeFetchImplementation(): FetchImpl {\n if (cachedFetchImpl) {\n return cachedFetchImpl;\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Fast path to avoid DOM I/O\n if (isNativeFetch(global.fetch)) {\n return (cachedFetchImpl = global.fetch.bind(global));\n }\n\n const document = global.document;\n let fetchImpl = global.fetch;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow.fetch) {\n fetchImpl = contentWindow.fetch;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n IS_DEBUG_BUILD &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return (cachedFetchImpl = fetchImpl.bind(global));\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url: string, body: string): void {\n const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n\n if (hasSendBeacon) {\n // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n const sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n sendBeacon(url, body);\n } else if (supportsFetch()) {\n const fetch = getNativeFetchImplementation();\n fetch(url, {\n body,\n method: 'POST',\n credentials: 'omit',\n keepalive: true,\n }).then(null, error => logger.error(error));\n }\n}\n"],"names":[],"mappings":";;;AAIA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { createTransport } from '@sentry/core';
2
2
  import { SyncPromise } from '@sentry/utils';
3
+
3
4
  /**
4
5
  * The DONE ready state for XmlHttpRequest
5
6
  *
@@ -8,35 +9,44 @@ import { SyncPromise } from '@sentry/utils';
8
9
  *
9
10
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}
10
11
  */
11
- const XHR_READYSTATE_DONE = 4;
12
+ var XHR_READYSTATE_DONE = 4;
13
+
12
14
  /**
13
15
  * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.
14
16
  */
15
- export function makeXHRTransport(options) {
16
- function makeRequest(request) {
17
- return new SyncPromise((resolve, reject) => {
18
- const xhr = new XMLHttpRequest();
19
- xhr.onerror = reject;
20
- xhr.onreadystatechange = () => {
21
- if (xhr.readyState === XHR_READYSTATE_DONE) {
22
- const response = {
23
- headers: {
24
- 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),
25
- 'retry-after': xhr.getResponseHeader('Retry-After'),
26
- },
27
- };
28
- resolve(response);
29
- }
30
- };
31
- xhr.open('POST', options.url);
32
- for (const header in options.headers) {
33
- if (Object.prototype.hasOwnProperty.call(options.headers, header)) {
34
- xhr.setRequestHeader(header, options.headers[header]);
35
- }
36
- }
37
- xhr.send(request.body);
38
- });
39
- }
40
- return createTransport(options, makeRequest);
17
+ function makeXHRTransport(options) {
18
+ function makeRequest(request) {
19
+ return new SyncPromise((resolve, reject) => {
20
+ var xhr = new XMLHttpRequest();
21
+
22
+ xhr.onerror = reject;
23
+
24
+ xhr.onreadystatechange = () => {
25
+ if (xhr.readyState === XHR_READYSTATE_DONE) {
26
+ resolve({
27
+ statusCode: xhr.status,
28
+ headers: {
29
+ 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),
30
+ 'retry-after': xhr.getResponseHeader('Retry-After'),
31
+ },
32
+ });
33
+ }
34
+ };
35
+
36
+ xhr.open('POST', options.url);
37
+
38
+ for (var header in options.headers) {
39
+ if (Object.prototype.hasOwnProperty.call(options.headers, header)) {
40
+ xhr.setRequestHeader(header, options.headers[header]);
41
+ }
42
+ }
43
+
44
+ xhr.send(request.body);
45
+ });
46
+ }
47
+
48
+ return createTransport(options, makeRequest);
41
49
  }
42
- //# sourceMappingURL=xhr.js.map
50
+
51
+ export { makeXHRTransport };
52
+ //# sourceMappingURL=xhr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../../../src/transports/xhr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAM9B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA4B;IAC3D,SAAS,WAAW,CAAC,OAAyB;QAC5C,OAAO,IAAI,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;YAEjC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;YAErB,GAAG,CAAC,kBAAkB,GAAG,GAAS,EAAE;gBAClC,IAAI,GAAG,CAAC,UAAU,KAAK,mBAAmB,EAAE;oBAC1C,MAAM,QAAQ,GAAG;wBACf,OAAO,EAAE;4BACP,sBAAsB,EAAE,GAAG,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;4BACrE,aAAa,EAAE,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC;yBACpD;qBACF,CAAC;oBACF,OAAO,CAAC,QAAQ,CAAC,CAAC;iBACnB;YACH,CAAC,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE;gBACpC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;oBACjE,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;iBACvD;aACF;YAED,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import { createTransport } from '@sentry/core';\nimport { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nconst XHR_READYSTATE_DONE = 4;\n\nexport interface XHRTransportOptions extends BaseTransportOptions {\n headers?: { [key: string]: string };\n}\n\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nexport function makeXHRTransport(options: XHRTransportOptions): Transport {\n function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n return new SyncPromise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onerror = reject;\n\n xhr.onreadystatechange = (): void => {\n if (xhr.readyState === XHR_READYSTATE_DONE) {\n const response = {\n headers: {\n 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': xhr.getResponseHeader('Retry-After'),\n },\n };\n resolve(response);\n }\n };\n\n xhr.open('POST', options.url);\n\n for (const header in options.headers) {\n if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n xhr.setRequestHeader(header, options.headers[header]);\n }\n }\n\n xhr.send(request.body);\n });\n }\n\n return createTransport(options, makeRequest);\n}\n"]}
1
+ {"version":3,"file":"xhr.js","sources":["../../../../src/transports/xhr.ts"],"sourcesContent":["import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\nimport { BrowserTransportOptions } from './types';\n\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nconst XHR_READYSTATE_DONE = 4;\n\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nexport function makeXHRTransport(options: BrowserTransportOptions): Transport {\n function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n return new SyncPromise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onerror = reject;\n\n xhr.onreadystatechange = (): void => {\n if (xhr.readyState === XHR_READYSTATE_DONE) {\n resolve({\n statusCode: xhr.status,\n headers: {\n 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': xhr.getResponseHeader('Retry-After'),\n },\n });\n }\n };\n\n xhr.open('POST', options.url);\n\n for (const header in options.headers) {\n if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n xhr.setRequestHeader(header, options.headers[header]);\n }\n }\n\n xhr.send(request.body);\n });\n }\n\n return createTransport(options, makeRequest);\n}\n"],"names":[],"mappings":";;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;"}