@sentry/browser 11.0.0-alpha.1 → 11.0.0-beta.0

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 (463) hide show
  1. package/build/npm/cjs/dev/client.js +5 -5
  2. package/build/npm/cjs/dev/client.js.map +1 -1
  3. package/build/npm/cjs/dev/diagnose-sdk.js +3 -3
  4. package/build/npm/cjs/dev/diagnose-sdk.js.map +1 -1
  5. package/build/npm/cjs/dev/eventbuilder.js +25 -25
  6. package/build/npm/cjs/dev/eventbuilder.js.map +1 -1
  7. package/build/npm/cjs/dev/helpers.js +13 -12
  8. package/build/npm/cjs/dev/helpers.js.map +1 -1
  9. package/build/npm/cjs/dev/index.js +87 -84
  10. package/build/npm/cjs/dev/index.js.map +1 -1
  11. package/build/npm/cjs/dev/integrations/bfcacheMetrics.js +115 -0
  12. package/build/npm/cjs/dev/integrations/bfcacheMetrics.js.map +1 -0
  13. package/build/npm/cjs/dev/integrations/breadcrumbs.js +28 -28
  14. package/build/npm/cjs/dev/integrations/breadcrumbs.js.map +1 -1
  15. package/build/npm/cjs/dev/integrations/browserapierrors.js +16 -16
  16. package/build/npm/cjs/dev/integrations/browserapierrors.js.map +1 -1
  17. package/build/npm/cjs/dev/integrations/browsersession.js +9 -9
  18. package/build/npm/cjs/dev/integrations/browsersession.js.map +1 -1
  19. package/build/npm/cjs/dev/integrations/contextlines.js +5 -5
  20. package/build/npm/cjs/dev/integrations/contextlines.js.map +1 -1
  21. package/build/npm/cjs/dev/integrations/culturecontext.js +3 -3
  22. package/build/npm/cjs/dev/integrations/culturecontext.js.map +1 -1
  23. package/build/npm/cjs/dev/integrations/featureFlags/growthbook/integration.js +2 -2
  24. package/build/npm/cjs/dev/integrations/featureFlags/growthbook/integration.js.map +1 -1
  25. package/build/npm/cjs/dev/integrations/featureFlags/launchdarkly/integration.js +5 -5
  26. package/build/npm/cjs/dev/integrations/featureFlags/launchdarkly/integration.js.map +1 -1
  27. package/build/npm/cjs/dev/integrations/featureFlags/openfeature/integration.js +7 -7
  28. package/build/npm/cjs/dev/integrations/featureFlags/openfeature/integration.js.map +1 -1
  29. package/build/npm/cjs/dev/integrations/featureFlags/statsig/integration.js +5 -5
  30. package/build/npm/cjs/dev/integrations/featureFlags/statsig/integration.js.map +1 -1
  31. package/build/npm/cjs/dev/integrations/featureFlags/unleash/integration.js +7 -7
  32. package/build/npm/cjs/dev/integrations/featureFlags/unleash/integration.js.map +1 -1
  33. package/build/npm/cjs/dev/integrations/fetchStreamPerformance.js +11 -5
  34. package/build/npm/cjs/dev/integrations/fetchStreamPerformance.js.map +1 -1
  35. package/build/npm/cjs/dev/integrations/globalhandlers.js +17 -16
  36. package/build/npm/cjs/dev/integrations/globalhandlers.js.map +1 -1
  37. package/build/npm/cjs/dev/integrations/graphqlClient.js +28 -15
  38. package/build/npm/cjs/dev/integrations/graphqlClient.js.map +1 -1
  39. package/build/npm/cjs/dev/integrations/httpclient.js +20 -23
  40. package/build/npm/cjs/dev/integrations/httpclient.js.map +1 -1
  41. package/build/npm/cjs/dev/integrations/httpcontext.js +6 -7
  42. package/build/npm/cjs/dev/integrations/httpcontext.js.map +1 -1
  43. package/build/npm/cjs/dev/integrations/linkederrors.js +3 -3
  44. package/build/npm/cjs/dev/integrations/linkederrors.js.map +1 -1
  45. package/build/npm/cjs/dev/integrations/reportingobserver.js +10 -7
  46. package/build/npm/cjs/dev/integrations/reportingobserver.js.map +1 -1
  47. package/build/npm/cjs/dev/integrations/spotlight.js +8 -7
  48. package/build/npm/cjs/dev/integrations/spotlight.js.map +1 -1
  49. package/build/npm/cjs/dev/integrations/view-hierarchy.js +4 -3
  50. package/build/npm/cjs/dev/integrations/view-hierarchy.js.map +1 -1
  51. package/build/npm/cjs/dev/integrations/webVitals.js +3 -3
  52. package/build/npm/cjs/dev/integrations/webVitals.js.map +1 -1
  53. package/build/npm/cjs/dev/integrations/webWorker.js +18 -18
  54. package/build/npm/cjs/dev/integrations/webWorker.js.map +1 -1
  55. package/build/npm/cjs/dev/profiling/UIProfiler.js +33 -33
  56. package/build/npm/cjs/dev/profiling/UIProfiler.js.map +1 -1
  57. package/build/npm/cjs/dev/profiling/index.js +7 -7
  58. package/build/npm/cjs/dev/profiling/index.js.map +1 -1
  59. package/build/npm/cjs/dev/profiling/integration.js +8 -8
  60. package/build/npm/cjs/dev/profiling/integration.js.map +1 -1
  61. package/build/npm/cjs/dev/profiling/utils.js +16 -16
  62. package/build/npm/cjs/dev/profiling/utils.js.map +1 -1
  63. package/build/npm/cjs/dev/report-dialog.js +7 -7
  64. package/build/npm/cjs/dev/report-dialog.js.map +1 -1
  65. package/build/npm/cjs/dev/sdk.js +9 -13
  66. package/build/npm/cjs/dev/sdk.js.map +1 -1
  67. package/build/npm/cjs/dev/stack-parsers.js +10 -10
  68. package/build/npm/cjs/dev/stack-parsers.js.map +1 -1
  69. package/build/npm/cjs/dev/tracing/backgroundtab.js +7 -7
  70. package/build/npm/cjs/dev/tracing/backgroundtab.js.map +1 -1
  71. package/build/npm/cjs/dev/tracing/browserTracingIntegration.js +66 -118
  72. package/build/npm/cjs/dev/tracing/browserTracingIntegration.js.map +1 -1
  73. package/build/npm/cjs/dev/tracing/linkedTraces.js +10 -12
  74. package/build/npm/cjs/dev/tracing/linkedTraces.js.map +1 -1
  75. package/build/npm/cjs/dev/tracing/reportPageLoaded.js +2 -2
  76. package/build/npm/cjs/dev/tracing/reportPageLoaded.js.map +1 -1
  77. package/build/npm/cjs/dev/tracing/request.js +40 -32
  78. package/build/npm/cjs/dev/tracing/request.js.map +1 -1
  79. package/build/npm/cjs/dev/tracing/setActiveSpan.js +5 -5
  80. package/build/npm/cjs/dev/tracing/setActiveSpan.js.map +1 -1
  81. package/build/npm/cjs/dev/transports/fetch.js +3 -3
  82. package/build/npm/cjs/dev/transports/fetch.js.map +1 -1
  83. package/build/npm/cjs/dev/transports/offline.js +5 -5
  84. package/build/npm/cjs/dev/transports/offline.js.map +1 -1
  85. package/build/npm/cjs/dev/userfeedback.js +3 -3
  86. package/build/npm/cjs/dev/userfeedback.js.map +1 -1
  87. package/build/npm/cjs/dev/utils/detectBrowserExtension.js +4 -3
  88. package/build/npm/cjs/dev/utils/detectBrowserExtension.js.map +1 -1
  89. package/build/npm/cjs/dev/utils/lazyLoadIntegration.js +4 -3
  90. package/build/npm/cjs/dev/utils/lazyLoadIntegration.js.map +1 -1
  91. package/build/npm/cjs/prod/client.js +5 -5
  92. package/build/npm/cjs/prod/client.js.map +1 -1
  93. package/build/npm/cjs/prod/diagnose-sdk.js +3 -3
  94. package/build/npm/cjs/prod/diagnose-sdk.js.map +1 -1
  95. package/build/npm/cjs/prod/eventbuilder.js +25 -25
  96. package/build/npm/cjs/prod/eventbuilder.js.map +1 -1
  97. package/build/npm/cjs/prod/helpers.js +13 -12
  98. package/build/npm/cjs/prod/helpers.js.map +1 -1
  99. package/build/npm/cjs/prod/index.js +87 -84
  100. package/build/npm/cjs/prod/index.js.map +1 -1
  101. package/build/npm/cjs/prod/integrations/bfcacheMetrics.js +115 -0
  102. package/build/npm/cjs/prod/integrations/bfcacheMetrics.js.map +1 -0
  103. package/build/npm/cjs/prod/integrations/breadcrumbs.js +28 -28
  104. package/build/npm/cjs/prod/integrations/breadcrumbs.js.map +1 -1
  105. package/build/npm/cjs/prod/integrations/browserapierrors.js +16 -16
  106. package/build/npm/cjs/prod/integrations/browserapierrors.js.map +1 -1
  107. package/build/npm/cjs/prod/integrations/browsersession.js +9 -9
  108. package/build/npm/cjs/prod/integrations/browsersession.js.map +1 -1
  109. package/build/npm/cjs/prod/integrations/contextlines.js +5 -5
  110. package/build/npm/cjs/prod/integrations/contextlines.js.map +1 -1
  111. package/build/npm/cjs/prod/integrations/culturecontext.js +3 -3
  112. package/build/npm/cjs/prod/integrations/culturecontext.js.map +1 -1
  113. package/build/npm/cjs/prod/integrations/featureFlags/growthbook/integration.js +2 -2
  114. package/build/npm/cjs/prod/integrations/featureFlags/growthbook/integration.js.map +1 -1
  115. package/build/npm/cjs/prod/integrations/featureFlags/launchdarkly/integration.js +5 -5
  116. package/build/npm/cjs/prod/integrations/featureFlags/launchdarkly/integration.js.map +1 -1
  117. package/build/npm/cjs/prod/integrations/featureFlags/openfeature/integration.js +7 -7
  118. package/build/npm/cjs/prod/integrations/featureFlags/openfeature/integration.js.map +1 -1
  119. package/build/npm/cjs/prod/integrations/featureFlags/statsig/integration.js +5 -5
  120. package/build/npm/cjs/prod/integrations/featureFlags/statsig/integration.js.map +1 -1
  121. package/build/npm/cjs/prod/integrations/featureFlags/unleash/integration.js +7 -7
  122. package/build/npm/cjs/prod/integrations/featureFlags/unleash/integration.js.map +1 -1
  123. package/build/npm/cjs/prod/integrations/fetchStreamPerformance.js +11 -5
  124. package/build/npm/cjs/prod/integrations/fetchStreamPerformance.js.map +1 -1
  125. package/build/npm/cjs/prod/integrations/globalhandlers.js +17 -16
  126. package/build/npm/cjs/prod/integrations/globalhandlers.js.map +1 -1
  127. package/build/npm/cjs/prod/integrations/graphqlClient.js +28 -15
  128. package/build/npm/cjs/prod/integrations/graphqlClient.js.map +1 -1
  129. package/build/npm/cjs/prod/integrations/httpclient.js +20 -23
  130. package/build/npm/cjs/prod/integrations/httpclient.js.map +1 -1
  131. package/build/npm/cjs/prod/integrations/httpcontext.js +6 -7
  132. package/build/npm/cjs/prod/integrations/httpcontext.js.map +1 -1
  133. package/build/npm/cjs/prod/integrations/linkederrors.js +3 -3
  134. package/build/npm/cjs/prod/integrations/linkederrors.js.map +1 -1
  135. package/build/npm/cjs/prod/integrations/reportingobserver.js +10 -7
  136. package/build/npm/cjs/prod/integrations/reportingobserver.js.map +1 -1
  137. package/build/npm/cjs/prod/integrations/spotlight.js +8 -7
  138. package/build/npm/cjs/prod/integrations/spotlight.js.map +1 -1
  139. package/build/npm/cjs/prod/integrations/view-hierarchy.js +4 -3
  140. package/build/npm/cjs/prod/integrations/view-hierarchy.js.map +1 -1
  141. package/build/npm/cjs/prod/integrations/webVitals.js +3 -3
  142. package/build/npm/cjs/prod/integrations/webVitals.js.map +1 -1
  143. package/build/npm/cjs/prod/integrations/webWorker.js +18 -18
  144. package/build/npm/cjs/prod/integrations/webWorker.js.map +1 -1
  145. package/build/npm/cjs/prod/profiling/UIProfiler.js +33 -33
  146. package/build/npm/cjs/prod/profiling/UIProfiler.js.map +1 -1
  147. package/build/npm/cjs/prod/profiling/index.js +7 -7
  148. package/build/npm/cjs/prod/profiling/index.js.map +1 -1
  149. package/build/npm/cjs/prod/profiling/integration.js +8 -8
  150. package/build/npm/cjs/prod/profiling/integration.js.map +1 -1
  151. package/build/npm/cjs/prod/profiling/utils.js +16 -16
  152. package/build/npm/cjs/prod/profiling/utils.js.map +1 -1
  153. package/build/npm/cjs/prod/report-dialog.js +7 -7
  154. package/build/npm/cjs/prod/report-dialog.js.map +1 -1
  155. package/build/npm/cjs/prod/sdk.js +9 -13
  156. package/build/npm/cjs/prod/sdk.js.map +1 -1
  157. package/build/npm/cjs/prod/stack-parsers.js +10 -10
  158. package/build/npm/cjs/prod/stack-parsers.js.map +1 -1
  159. package/build/npm/cjs/prod/tracing/backgroundtab.js +7 -7
  160. package/build/npm/cjs/prod/tracing/backgroundtab.js.map +1 -1
  161. package/build/npm/cjs/prod/tracing/browserTracingIntegration.js +66 -118
  162. package/build/npm/cjs/prod/tracing/browserTracingIntegration.js.map +1 -1
  163. package/build/npm/cjs/prod/tracing/linkedTraces.js +10 -12
  164. package/build/npm/cjs/prod/tracing/linkedTraces.js.map +1 -1
  165. package/build/npm/cjs/prod/tracing/reportPageLoaded.js +2 -2
  166. package/build/npm/cjs/prod/tracing/reportPageLoaded.js.map +1 -1
  167. package/build/npm/cjs/prod/tracing/request.js +40 -32
  168. package/build/npm/cjs/prod/tracing/request.js.map +1 -1
  169. package/build/npm/cjs/prod/tracing/setActiveSpan.js +5 -5
  170. package/build/npm/cjs/prod/tracing/setActiveSpan.js.map +1 -1
  171. package/build/npm/cjs/prod/transports/fetch.js +3 -3
  172. package/build/npm/cjs/prod/transports/fetch.js.map +1 -1
  173. package/build/npm/cjs/prod/transports/offline.js +5 -5
  174. package/build/npm/cjs/prod/transports/offline.js.map +1 -1
  175. package/build/npm/cjs/prod/userfeedback.js +3 -3
  176. package/build/npm/cjs/prod/userfeedback.js.map +1 -1
  177. package/build/npm/cjs/prod/utils/detectBrowserExtension.js +4 -3
  178. package/build/npm/cjs/prod/utils/detectBrowserExtension.js.map +1 -1
  179. package/build/npm/cjs/prod/utils/lazyLoadIntegration.js +4 -3
  180. package/build/npm/cjs/prod/utils/lazyLoadIntegration.js.map +1 -1
  181. package/build/npm/esm/dev/client.js +1 -1
  182. package/build/npm/esm/dev/client.js.map +1 -1
  183. package/build/npm/esm/dev/diagnose-sdk.js +1 -1
  184. package/build/npm/esm/dev/diagnose-sdk.js.map +1 -1
  185. package/build/npm/esm/dev/eventbuilder.js +1 -1
  186. package/build/npm/esm/dev/eventbuilder.js.map +1 -1
  187. package/build/npm/esm/dev/helpers.js +2 -1
  188. package/build/npm/esm/dev/helpers.js.map +1 -1
  189. package/build/npm/esm/dev/index.js +5 -4
  190. package/build/npm/esm/dev/index.js.map +1 -1
  191. package/build/npm/esm/dev/integrations/bfcacheMetrics.js +111 -0
  192. package/build/npm/esm/dev/integrations/bfcacheMetrics.js.map +1 -0
  193. package/build/npm/esm/dev/integrations/breadcrumbs.js +2 -2
  194. package/build/npm/esm/dev/integrations/breadcrumbs.js.map +1 -1
  195. package/build/npm/esm/dev/integrations/browserapierrors.js +1 -1
  196. package/build/npm/esm/dev/integrations/browserapierrors.js.map +1 -1
  197. package/build/npm/esm/dev/integrations/browsersession.js +1 -1
  198. package/build/npm/esm/dev/integrations/browsersession.js.map +1 -1
  199. package/build/npm/esm/dev/integrations/contextlines.js +1 -1
  200. package/build/npm/esm/dev/integrations/contextlines.js.map +1 -1
  201. package/build/npm/esm/dev/integrations/culturecontext.js +1 -1
  202. package/build/npm/esm/dev/integrations/culturecontext.js.map +1 -1
  203. package/build/npm/esm/dev/integrations/featureFlags/growthbook/integration.js +1 -1
  204. package/build/npm/esm/dev/integrations/featureFlags/growthbook/integration.js.map +1 -1
  205. package/build/npm/esm/dev/integrations/featureFlags/launchdarkly/integration.js +1 -1
  206. package/build/npm/esm/dev/integrations/featureFlags/launchdarkly/integration.js.map +1 -1
  207. package/build/npm/esm/dev/integrations/featureFlags/openfeature/integration.js +1 -1
  208. package/build/npm/esm/dev/integrations/featureFlags/openfeature/integration.js.map +1 -1
  209. package/build/npm/esm/dev/integrations/featureFlags/statsig/integration.js +1 -1
  210. package/build/npm/esm/dev/integrations/featureFlags/statsig/integration.js.map +1 -1
  211. package/build/npm/esm/dev/integrations/featureFlags/unleash/integration.js +1 -1
  212. package/build/npm/esm/dev/integrations/featureFlags/unleash/integration.js.map +1 -1
  213. package/build/npm/esm/dev/integrations/fetchStreamPerformance.js +12 -6
  214. package/build/npm/esm/dev/integrations/fetchStreamPerformance.js.map +1 -1
  215. package/build/npm/esm/dev/integrations/globalhandlers.js +2 -1
  216. package/build/npm/esm/dev/integrations/globalhandlers.js.map +1 -1
  217. package/build/npm/esm/dev/integrations/graphqlClient.js +21 -8
  218. package/build/npm/esm/dev/integrations/graphqlClient.js.map +1 -1
  219. package/build/npm/esm/dev/integrations/httpclient.js +1 -4
  220. package/build/npm/esm/dev/integrations/httpclient.js.map +1 -1
  221. package/build/npm/esm/dev/integrations/httpcontext.js +1 -2
  222. package/build/npm/esm/dev/integrations/httpcontext.js.map +1 -1
  223. package/build/npm/esm/dev/integrations/linkederrors.js +1 -1
  224. package/build/npm/esm/dev/integrations/linkederrors.js.map +1 -1
  225. package/build/npm/esm/dev/integrations/reportingobserver.js +4 -1
  226. package/build/npm/esm/dev/integrations/reportingobserver.js.map +1 -1
  227. package/build/npm/esm/dev/integrations/spotlight.js +3 -2
  228. package/build/npm/esm/dev/integrations/spotlight.js.map +1 -1
  229. package/build/npm/esm/dev/integrations/view-hierarchy.js +2 -1
  230. package/build/npm/esm/dev/integrations/view-hierarchy.js.map +1 -1
  231. package/build/npm/esm/dev/integrations/webVitals.js +1 -1
  232. package/build/npm/esm/dev/integrations/webVitals.js.map +1 -1
  233. package/build/npm/esm/dev/integrations/webWorker.js +1 -1
  234. package/build/npm/esm/dev/integrations/webWorker.js.map +1 -1
  235. package/build/npm/esm/dev/package.json +1 -1
  236. package/build/npm/esm/dev/profiling/UIProfiler.js +1 -1
  237. package/build/npm/esm/dev/profiling/UIProfiler.js.map +1 -1
  238. package/build/npm/esm/dev/profiling/index.js +1 -1
  239. package/build/npm/esm/dev/profiling/index.js.map +1 -1
  240. package/build/npm/esm/dev/profiling/integration.js +1 -1
  241. package/build/npm/esm/dev/profiling/integration.js.map +1 -1
  242. package/build/npm/esm/dev/profiling/utils.js +1 -1
  243. package/build/npm/esm/dev/profiling/utils.js.map +1 -1
  244. package/build/npm/esm/dev/report-dialog.js +1 -1
  245. package/build/npm/esm/dev/report-dialog.js.map +1 -1
  246. package/build/npm/esm/dev/sdk.js +1 -5
  247. package/build/npm/esm/dev/sdk.js.map +1 -1
  248. package/build/npm/esm/dev/stack-parsers.js +1 -1
  249. package/build/npm/esm/dev/stack-parsers.js.map +1 -1
  250. package/build/npm/esm/dev/tracing/backgroundtab.js +1 -1
  251. package/build/npm/esm/dev/tracing/backgroundtab.js.map +1 -1
  252. package/build/npm/esm/dev/tracing/browserTracingIntegration.js +34 -85
  253. package/build/npm/esm/dev/tracing/browserTracingIntegration.js.map +1 -1
  254. package/build/npm/esm/dev/tracing/linkedTraces.js +1 -3
  255. package/build/npm/esm/dev/tracing/linkedTraces.js.map +1 -1
  256. package/build/npm/esm/dev/tracing/reportPageLoaded.js +1 -1
  257. package/build/npm/esm/dev/tracing/reportPageLoaded.js.map +1 -1
  258. package/build/npm/esm/dev/tracing/request.js +21 -13
  259. package/build/npm/esm/dev/tracing/request.js.map +1 -1
  260. package/build/npm/esm/dev/tracing/setActiveSpan.js +1 -1
  261. package/build/npm/esm/dev/tracing/setActiveSpan.js.map +1 -1
  262. package/build/npm/esm/dev/transports/fetch.js +1 -1
  263. package/build/npm/esm/dev/transports/fetch.js.map +1 -1
  264. package/build/npm/esm/dev/transports/offline.js +1 -1
  265. package/build/npm/esm/dev/transports/offline.js.map +1 -1
  266. package/build/npm/esm/dev/userfeedback.js +1 -1
  267. package/build/npm/esm/dev/userfeedback.js.map +1 -1
  268. package/build/npm/esm/dev/utils/detectBrowserExtension.js +2 -1
  269. package/build/npm/esm/dev/utils/detectBrowserExtension.js.map +1 -1
  270. package/build/npm/esm/dev/utils/lazyLoadIntegration.js +2 -1
  271. package/build/npm/esm/dev/utils/lazyLoadIntegration.js.map +1 -1
  272. package/build/npm/esm/prod/client.js +1 -1
  273. package/build/npm/esm/prod/client.js.map +1 -1
  274. package/build/npm/esm/prod/diagnose-sdk.js +1 -1
  275. package/build/npm/esm/prod/diagnose-sdk.js.map +1 -1
  276. package/build/npm/esm/prod/eventbuilder.js +1 -1
  277. package/build/npm/esm/prod/eventbuilder.js.map +1 -1
  278. package/build/npm/esm/prod/helpers.js +2 -1
  279. package/build/npm/esm/prod/helpers.js.map +1 -1
  280. package/build/npm/esm/prod/index.js +5 -4
  281. package/build/npm/esm/prod/index.js.map +1 -1
  282. package/build/npm/esm/prod/integrations/bfcacheMetrics.js +111 -0
  283. package/build/npm/esm/prod/integrations/bfcacheMetrics.js.map +1 -0
  284. package/build/npm/esm/prod/integrations/breadcrumbs.js +2 -2
  285. package/build/npm/esm/prod/integrations/breadcrumbs.js.map +1 -1
  286. package/build/npm/esm/prod/integrations/browserapierrors.js +1 -1
  287. package/build/npm/esm/prod/integrations/browserapierrors.js.map +1 -1
  288. package/build/npm/esm/prod/integrations/browsersession.js +1 -1
  289. package/build/npm/esm/prod/integrations/browsersession.js.map +1 -1
  290. package/build/npm/esm/prod/integrations/contextlines.js +1 -1
  291. package/build/npm/esm/prod/integrations/contextlines.js.map +1 -1
  292. package/build/npm/esm/prod/integrations/culturecontext.js +1 -1
  293. package/build/npm/esm/prod/integrations/culturecontext.js.map +1 -1
  294. package/build/npm/esm/prod/integrations/featureFlags/growthbook/integration.js +1 -1
  295. package/build/npm/esm/prod/integrations/featureFlags/growthbook/integration.js.map +1 -1
  296. package/build/npm/esm/prod/integrations/featureFlags/launchdarkly/integration.js +1 -1
  297. package/build/npm/esm/prod/integrations/featureFlags/launchdarkly/integration.js.map +1 -1
  298. package/build/npm/esm/prod/integrations/featureFlags/openfeature/integration.js +1 -1
  299. package/build/npm/esm/prod/integrations/featureFlags/openfeature/integration.js.map +1 -1
  300. package/build/npm/esm/prod/integrations/featureFlags/statsig/integration.js +1 -1
  301. package/build/npm/esm/prod/integrations/featureFlags/statsig/integration.js.map +1 -1
  302. package/build/npm/esm/prod/integrations/featureFlags/unleash/integration.js +1 -1
  303. package/build/npm/esm/prod/integrations/featureFlags/unleash/integration.js.map +1 -1
  304. package/build/npm/esm/prod/integrations/fetchStreamPerformance.js +12 -6
  305. package/build/npm/esm/prod/integrations/fetchStreamPerformance.js.map +1 -1
  306. package/build/npm/esm/prod/integrations/globalhandlers.js +2 -1
  307. package/build/npm/esm/prod/integrations/globalhandlers.js.map +1 -1
  308. package/build/npm/esm/prod/integrations/graphqlClient.js +21 -8
  309. package/build/npm/esm/prod/integrations/graphqlClient.js.map +1 -1
  310. package/build/npm/esm/prod/integrations/httpclient.js +1 -4
  311. package/build/npm/esm/prod/integrations/httpclient.js.map +1 -1
  312. package/build/npm/esm/prod/integrations/httpcontext.js +1 -2
  313. package/build/npm/esm/prod/integrations/httpcontext.js.map +1 -1
  314. package/build/npm/esm/prod/integrations/linkederrors.js +1 -1
  315. package/build/npm/esm/prod/integrations/linkederrors.js.map +1 -1
  316. package/build/npm/esm/prod/integrations/reportingobserver.js +4 -1
  317. package/build/npm/esm/prod/integrations/reportingobserver.js.map +1 -1
  318. package/build/npm/esm/prod/integrations/spotlight.js +3 -2
  319. package/build/npm/esm/prod/integrations/spotlight.js.map +1 -1
  320. package/build/npm/esm/prod/integrations/view-hierarchy.js +2 -1
  321. package/build/npm/esm/prod/integrations/view-hierarchy.js.map +1 -1
  322. package/build/npm/esm/prod/integrations/webVitals.js +1 -1
  323. package/build/npm/esm/prod/integrations/webVitals.js.map +1 -1
  324. package/build/npm/esm/prod/integrations/webWorker.js +1 -1
  325. package/build/npm/esm/prod/integrations/webWorker.js.map +1 -1
  326. package/build/npm/esm/prod/package.json +1 -1
  327. package/build/npm/esm/prod/profiling/UIProfiler.js +1 -1
  328. package/build/npm/esm/prod/profiling/UIProfiler.js.map +1 -1
  329. package/build/npm/esm/prod/profiling/index.js +1 -1
  330. package/build/npm/esm/prod/profiling/index.js.map +1 -1
  331. package/build/npm/esm/prod/profiling/integration.js +1 -1
  332. package/build/npm/esm/prod/profiling/integration.js.map +1 -1
  333. package/build/npm/esm/prod/profiling/utils.js +1 -1
  334. package/build/npm/esm/prod/profiling/utils.js.map +1 -1
  335. package/build/npm/esm/prod/report-dialog.js +1 -1
  336. package/build/npm/esm/prod/report-dialog.js.map +1 -1
  337. package/build/npm/esm/prod/sdk.js +1 -5
  338. package/build/npm/esm/prod/sdk.js.map +1 -1
  339. package/build/npm/esm/prod/stack-parsers.js +1 -1
  340. package/build/npm/esm/prod/stack-parsers.js.map +1 -1
  341. package/build/npm/esm/prod/tracing/backgroundtab.js +1 -1
  342. package/build/npm/esm/prod/tracing/backgroundtab.js.map +1 -1
  343. package/build/npm/esm/prod/tracing/browserTracingIntegration.js +34 -85
  344. package/build/npm/esm/prod/tracing/browserTracingIntegration.js.map +1 -1
  345. package/build/npm/esm/prod/tracing/linkedTraces.js +1 -3
  346. package/build/npm/esm/prod/tracing/linkedTraces.js.map +1 -1
  347. package/build/npm/esm/prod/tracing/reportPageLoaded.js +1 -1
  348. package/build/npm/esm/prod/tracing/reportPageLoaded.js.map +1 -1
  349. package/build/npm/esm/prod/tracing/request.js +21 -13
  350. package/build/npm/esm/prod/tracing/request.js.map +1 -1
  351. package/build/npm/esm/prod/tracing/setActiveSpan.js +1 -1
  352. package/build/npm/esm/prod/tracing/setActiveSpan.js.map +1 -1
  353. package/build/npm/esm/prod/transports/fetch.js +1 -1
  354. package/build/npm/esm/prod/transports/fetch.js.map +1 -1
  355. package/build/npm/esm/prod/transports/offline.js +1 -1
  356. package/build/npm/esm/prod/transports/offline.js.map +1 -1
  357. package/build/npm/esm/prod/userfeedback.js +1 -1
  358. package/build/npm/esm/prod/userfeedback.js.map +1 -1
  359. package/build/npm/esm/prod/utils/detectBrowserExtension.js +2 -1
  360. package/build/npm/esm/prod/utils/detectBrowserExtension.js.map +1 -1
  361. package/build/npm/esm/prod/utils/lazyLoadIntegration.js +2 -1
  362. package/build/npm/esm/prod/utils/lazyLoadIntegration.js.map +1 -1
  363. package/build/npm/types/client.d.ts +24 -2
  364. package/build/npm/types/client.d.ts.map +1 -1
  365. package/build/npm/types/eventbuilder.d.ts +1 -1
  366. package/build/npm/types/eventbuilder.d.ts.map +1 -1
  367. package/build/npm/types/exports.d.ts +3 -3
  368. package/build/npm/types/exports.d.ts.map +1 -1
  369. package/build/npm/types/helpers.d.ts +2 -2
  370. package/build/npm/types/helpers.d.ts.map +1 -1
  371. package/build/npm/types/index.bundle.logs.metrics.d.ts +1 -1
  372. package/build/npm/types/index.bundle.logs.metrics.d.ts.map +1 -1
  373. package/build/npm/types/index.bundle.replay.logs.metrics.d.ts +1 -1
  374. package/build/npm/types/index.bundle.replay.logs.metrics.d.ts.map +1 -1
  375. package/build/npm/types/index.bundle.tracing.d.ts +4 -3
  376. package/build/npm/types/index.bundle.tracing.d.ts.map +1 -1
  377. package/build/npm/types/index.bundle.tracing.logs.metrics.d.ts +5 -4
  378. package/build/npm/types/index.bundle.tracing.logs.metrics.d.ts.map +1 -1
  379. package/build/npm/types/index.bundle.tracing.replay.d.ts +4 -3
  380. package/build/npm/types/index.bundle.tracing.replay.d.ts.map +1 -1
  381. package/build/npm/types/index.bundle.tracing.replay.feedback.d.ts +4 -3
  382. package/build/npm/types/index.bundle.tracing.replay.feedback.d.ts.map +1 -1
  383. package/build/npm/types/index.bundle.tracing.replay.feedback.logs.metrics.d.ts +4 -3
  384. package/build/npm/types/index.bundle.tracing.replay.feedback.logs.metrics.d.ts.map +1 -1
  385. package/build/npm/types/index.bundle.tracing.replay.logs.metrics.d.ts +5 -4
  386. package/build/npm/types/index.bundle.tracing.replay.logs.metrics.d.ts.map +1 -1
  387. package/build/npm/types/index.d.ts +7 -5
  388. package/build/npm/types/index.d.ts.map +1 -1
  389. package/build/npm/types/integrations/bfcacheMetrics.d.ts +42 -0
  390. package/build/npm/types/integrations/bfcacheMetrics.d.ts.map +1 -0
  391. package/build/npm/types/integrations/breadcrumbs.d.ts.map +1 -1
  392. package/build/npm/types/integrations/contextlines.d.ts +1 -1
  393. package/build/npm/types/integrations/contextlines.d.ts.map +1 -1
  394. package/build/npm/types/integrations/fetchStreamPerformance.d.ts.map +1 -1
  395. package/build/npm/types/integrations/globalhandlers.d.ts +1 -1
  396. package/build/npm/types/integrations/globalhandlers.d.ts.map +1 -1
  397. package/build/npm/types/integrations/graphqlClient.d.ts.map +1 -1
  398. package/build/npm/types/integrations/interactions.d.ts +2 -0
  399. package/build/npm/types/integrations/interactions.d.ts.map +1 -0
  400. package/build/npm/types/integrations/reportingobserver.d.ts.map +1 -1
  401. package/build/npm/types/integrations/spotlight.d.ts.map +1 -1
  402. package/build/npm/types/integrations/view-hierarchy.d.ts +1 -1
  403. package/build/npm/types/integrations/view-hierarchy.d.ts.map +1 -1
  404. package/build/npm/types/integrations/webWorker.d.ts +1 -1
  405. package/build/npm/types/integrations/webWorker.d.ts.map +1 -1
  406. package/build/npm/types/integrations-bundle/index.captureconsole.d.ts +1 -1
  407. package/build/npm/types/integrations-bundle/index.captureconsole.d.ts.map +1 -1
  408. package/build/npm/types/integrations-bundle/index.dedupe.d.ts +1 -1
  409. package/build/npm/types/integrations-bundle/index.dedupe.d.ts.map +1 -1
  410. package/build/npm/types/integrations-bundle/index.extraerrordata.d.ts +1 -1
  411. package/build/npm/types/integrations-bundle/index.extraerrordata.d.ts.map +1 -1
  412. package/build/npm/types/integrations-bundle/index.feedback.d.ts +1 -1
  413. package/build/npm/types/integrations-bundle/index.feedback.d.ts.map +1 -1
  414. package/build/npm/types/integrations-bundle/index.modulemetadata.d.ts +1 -1
  415. package/build/npm/types/integrations-bundle/index.modulemetadata.d.ts.map +1 -1
  416. package/build/npm/types/integrations-bundle/index.rewriteframes.d.ts +1 -1
  417. package/build/npm/types/integrations-bundle/index.rewriteframes.d.ts.map +1 -1
  418. package/build/npm/types/pluggable-exports-bundle/index.multiplexedtransport.d.ts +1 -1
  419. package/build/npm/types/pluggable-exports-bundle/index.multiplexedtransport.d.ts.map +1 -1
  420. package/build/npm/types/profiling/UIProfiler.d.ts +1 -1
  421. package/build/npm/types/profiling/UIProfiler.d.ts.map +1 -1
  422. package/build/npm/types/profiling/index.d.ts +1 -1
  423. package/build/npm/types/profiling/index.d.ts.map +1 -1
  424. package/build/npm/types/profiling/utils.d.ts +1 -1
  425. package/build/npm/types/profiling/utils.d.ts.map +1 -1
  426. package/build/npm/types/report-dialog.d.ts +1 -1
  427. package/build/npm/types/report-dialog.d.ts.map +1 -1
  428. package/build/npm/types/sdk.d.ts +1 -1
  429. package/build/npm/types/sdk.d.ts.map +1 -1
  430. package/build/npm/types/stack-parsers.d.ts +1 -1
  431. package/build/npm/types/stack-parsers.d.ts.map +1 -1
  432. package/build/npm/types/tracing/browserTracingIntegration.d.ts +1 -10
  433. package/build/npm/types/tracing/browserTracingIntegration.d.ts.map +1 -1
  434. package/build/npm/types/tracing/linkedTraces.d.ts +2 -2
  435. package/build/npm/types/tracing/linkedTraces.d.ts.map +1 -1
  436. package/build/npm/types/tracing/reportPageLoaded.d.ts +1 -1
  437. package/build/npm/types/tracing/reportPageLoaded.d.ts.map +1 -1
  438. package/build/npm/types/tracing/request.d.ts +2 -1
  439. package/build/npm/types/tracing/request.d.ts.map +1 -1
  440. package/build/npm/types/tracing/setActiveSpan.d.ts +1 -1
  441. package/build/npm/types/tracing/setActiveSpan.d.ts.map +1 -1
  442. package/build/npm/types/transports/fetch.d.ts +1 -1
  443. package/build/npm/types/transports/fetch.d.ts.map +1 -1
  444. package/build/npm/types/transports/offline.d.ts +1 -1
  445. package/build/npm/types/transports/offline.d.ts.map +1 -1
  446. package/build/npm/types/transports/types.d.ts +1 -1
  447. package/build/npm/types/transports/types.d.ts.map +1 -1
  448. package/build/npm/types/userfeedback.d.ts +1 -1
  449. package/build/npm/types/userfeedback.d.ts.map +1 -1
  450. package/build/npm/types/utils/detectBrowserExtension.d.ts.map +1 -1
  451. package/build/npm/types/utils/lazyLoadIntegration.d.ts +2 -2
  452. package/build/npm/types/utils/lazyLoadIntegration.d.ts.map +1 -1
  453. package/package.json +10 -9
  454. package/build/npm/cjs/dev/integrations/spanstreaming.js +0 -34
  455. package/build/npm/cjs/dev/integrations/spanstreaming.js.map +0 -1
  456. package/build/npm/cjs/prod/integrations/spanstreaming.js +0 -34
  457. package/build/npm/cjs/prod/integrations/spanstreaming.js.map +0 -1
  458. package/build/npm/esm/dev/integrations/spanstreaming.js +0 -31
  459. package/build/npm/esm/dev/integrations/spanstreaming.js.map +0 -1
  460. package/build/npm/esm/prod/integrations/spanstreaming.js +0 -31
  461. package/build/npm/esm/prod/integrations/spanstreaming.js.map +0 -1
  462. package/build/npm/types/integrations/spanstreaming.d.ts +0 -5
  463. package/build/npm/types/integrations/spanstreaming.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const browser = require('@sentry/core/browser');
3
+ const core = require('@sentry/core');
4
4
  const browserUtils = require('@sentry/browser-utils');
5
5
  const debugBuild = require('../debug-build.js');
6
6
  const helpers = require('../helpers.js');
@@ -21,7 +21,7 @@ const _breadcrumbsIntegration = ((options = {}) => {
21
21
  name: INTEGRATION_NAME,
22
22
  setup(client) {
23
23
  if (_options.console) {
24
- browser.addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));
24
+ core.addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));
25
25
  }
26
26
  if (_options.dom) {
27
27
  browserUtils.addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));
@@ -30,7 +30,7 @@ const _breadcrumbsIntegration = ((options = {}) => {
30
30
  browserUtils.addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));
31
31
  }
32
32
  if (_options.fetch) {
33
- browser.addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));
33
+ core.addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));
34
34
  }
35
35
  if (_options.history) {
36
36
  browserUtils.addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));
@@ -41,18 +41,18 @@ const _breadcrumbsIntegration = ((options = {}) => {
41
41
  }
42
42
  };
43
43
  });
44
- const breadcrumbsIntegration = browser.defineIntegration(_breadcrumbsIntegration);
44
+ const breadcrumbsIntegration = core.defineIntegration(_breadcrumbsIntegration);
45
45
  function _getSentryBreadcrumbHandler(client) {
46
46
  return function addSentryBreadcrumb(event) {
47
- if (browser.getClient() !== client) {
47
+ if (core.getClient() !== client) {
48
48
  return;
49
49
  }
50
- browser.addBreadcrumb(
50
+ core.addBreadcrumb(
51
51
  {
52
52
  category: `sentry.${event.type === "transaction" ? "transaction" : "event"}`,
53
53
  event_id: event.event_id,
54
54
  level: event.level,
55
- message: browser.getEventDescription(event)
55
+ message: core.getEventDescription(event)
56
56
  },
57
57
  {
58
58
  event
@@ -62,7 +62,7 @@ function _getSentryBreadcrumbHandler(client) {
62
62
  }
63
63
  function _getDomBreadcrumbHandler(client, dom) {
64
64
  return function _innerDomBreadcrumb(handlerData) {
65
- if (browser.getClient() !== client) {
65
+ if (core.getClient() !== client) {
66
66
  return;
67
67
  }
68
68
  let target;
@@ -70,7 +70,7 @@ function _getDomBreadcrumbHandler(client, dom) {
70
70
  let keyAttrs = typeof dom === "object" ? dom.serializeAttribute : void 0;
71
71
  let maxStringLength = typeof dom === "object" && typeof dom.maxStringLength === "number" ? dom.maxStringLength : void 0;
72
72
  if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {
73
- debugBuild.DEBUG_BUILD && browser.debug.warn(
73
+ debugBuild.DEBUG_BUILD && core.debug.warn(
74
74
  `\`dom.maxStringLength\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`
75
75
  );
76
76
  maxStringLength = MAX_ALLOWED_STRING_LENGTH;
@@ -82,7 +82,7 @@ function _getDomBreadcrumbHandler(client, dom) {
82
82
  const event = handlerData.event;
83
83
  const element = _isEvent(event) ? event.target : event;
84
84
  target = browserUtils.htmlTreeAsString(element, { keyAttrs, maxStringLength });
85
- componentName = browser.getComponentName(element);
85
+ componentName = browserUtils.getComponentName(element);
86
86
  } catch {
87
87
  target = "<unknown>";
88
88
  }
@@ -96,7 +96,7 @@ function _getDomBreadcrumbHandler(client, dom) {
96
96
  if (componentName) {
97
97
  breadcrumb.data = { "ui.component_name": componentName };
98
98
  }
99
- browser.addBreadcrumb(breadcrumb, {
99
+ core.addBreadcrumb(breadcrumb, {
100
100
  event: handlerData.event,
101
101
  name: handlerData.name,
102
102
  global: handlerData.global
@@ -105,7 +105,7 @@ function _getDomBreadcrumbHandler(client, dom) {
105
105
  }
106
106
  function _getConsoleBreadcrumbHandler(client) {
107
107
  return function _consoleBreadcrumb(handlerData) {
108
- if (browser.getClient() !== client) {
108
+ if (core.getClient() !== client) {
109
109
  return;
110
110
  }
111
111
  const breadcrumb = {
@@ -114,18 +114,18 @@ function _getConsoleBreadcrumbHandler(client) {
114
114
  arguments: handlerData.args,
115
115
  logger: "console"
116
116
  },
117
- level: browser.severityLevelFromString(handlerData.level),
118
- message: browser.safeJoin(handlerData.args, " ")
117
+ level: core.severityLevelFromString(handlerData.level),
118
+ message: core.safeJoin(handlerData.args, " ")
119
119
  };
120
120
  if (handlerData.level === "assert") {
121
121
  if (handlerData.args[0] === false) {
122
- breadcrumb.message = `Assertion failed: ${browser.safeJoin(handlerData.args.slice(1), " ") || "console.assert"}`;
122
+ breadcrumb.message = `Assertion failed: ${core.safeJoin(handlerData.args.slice(1), " ") || "console.assert"}`;
123
123
  breadcrumb.data.arguments = handlerData.args.slice(1);
124
124
  } else {
125
125
  return;
126
126
  }
127
127
  }
128
- browser.addBreadcrumb(breadcrumb, {
128
+ core.addBreadcrumb(breadcrumb, {
129
129
  input: handlerData.args,
130
130
  level: handlerData.level
131
131
  });
@@ -133,7 +133,7 @@ function _getConsoleBreadcrumbHandler(client) {
133
133
  }
134
134
  function _getXhrBreadcrumbHandler(client) {
135
135
  return function _xhrBreadcrumb(handlerData) {
136
- if (browser.getClient() !== client) {
136
+ if (core.getClient() !== client) {
137
137
  return;
138
138
  }
139
139
  const { startTimestamp, endTimestamp } = handlerData;
@@ -157,15 +157,15 @@ function _getXhrBreadcrumbHandler(client) {
157
157
  category: "xhr",
158
158
  data,
159
159
  type: "http",
160
- level: browser.getBreadcrumbLogLevelFromHttpStatusCode(status_code)
160
+ level: core.getBreadcrumbLogLevelFromHttpStatusCode(status_code)
161
161
  };
162
162
  client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint);
163
- browser.addBreadcrumb(breadcrumb, hint);
163
+ core.addBreadcrumb(breadcrumb, hint);
164
164
  };
165
165
  }
166
166
  function _getFetchBreadcrumbHandler(client) {
167
167
  return function _fetchBreadcrumb(handlerData) {
168
- if (browser.getClient() !== client) {
168
+ if (core.getClient() !== client) {
169
169
  return;
170
170
  }
171
171
  const { startTimestamp, endTimestamp } = handlerData;
@@ -189,7 +189,7 @@ function _getFetchBreadcrumbHandler(client) {
189
189
  type: "http"
190
190
  };
191
191
  client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint);
192
- browser.addBreadcrumb(breadcrumb, hint);
192
+ core.addBreadcrumb(breadcrumb, hint);
193
193
  } else {
194
194
  const response = handlerData.response;
195
195
  const data = {
@@ -206,23 +206,23 @@ function _getFetchBreadcrumbHandler(client) {
206
206
  category: "fetch",
207
207
  data,
208
208
  type: "http",
209
- level: browser.getBreadcrumbLogLevelFromHttpStatusCode(data.status_code)
209
+ level: core.getBreadcrumbLogLevelFromHttpStatusCode(data.status_code)
210
210
  };
211
211
  client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint);
212
- browser.addBreadcrumb(breadcrumb, hint);
212
+ core.addBreadcrumb(breadcrumb, hint);
213
213
  }
214
214
  };
215
215
  }
216
216
  function _getHistoryBreadcrumbHandler(client) {
217
217
  return function _historyBreadcrumb(handlerData) {
218
- if (browser.getClient() !== client) {
218
+ if (core.getClient() !== client) {
219
219
  return;
220
220
  }
221
221
  let from = handlerData.from;
222
222
  let to = handlerData.to;
223
- const parsedLoc = browser.parseUrl(helpers.WINDOW.location.href);
224
- let parsedFrom = from ? browser.parseUrl(from) : void 0;
225
- const parsedTo = browser.parseUrl(to);
223
+ const parsedLoc = core.parseUrl(helpers.WINDOW.location.href);
224
+ let parsedFrom = from ? core.parseUrl(from) : void 0;
225
+ const parsedTo = core.parseUrl(to);
226
226
  if (!parsedFrom?.path) {
227
227
  parsedFrom = parsedLoc;
228
228
  }
@@ -232,7 +232,7 @@ function _getHistoryBreadcrumbHandler(client) {
232
232
  if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {
233
233
  from = parsedFrom.relative;
234
234
  }
235
- browser.addBreadcrumb({
235
+ core.addBreadcrumb({
236
236
  category: "navigation",
237
237
  data: {
238
238
  from,
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumbs.js","sources":["../../../../../src/integrations/breadcrumbs.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport type {\n Breadcrumb,\n Client,\n Event as SentryEvent,\n FetchBreadcrumbData,\n FetchBreadcrumbHint,\n HandlerDataConsole,\n HandlerDataDom,\n HandlerDataFetch,\n HandlerDataHistory,\n HandlerDataXhr,\n IntegrationFn,\n XhrBreadcrumbData,\n XhrBreadcrumbHint,\n} from '@sentry/core/browser';\nimport {\n addBreadcrumb,\n addConsoleInstrumentationHandler,\n addFetchInstrumentationHandler,\n debug,\n defineIntegration,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getComponentName,\n getEventDescription,\n parseUrl,\n safeJoin,\n severityLevelFromString,\n} from '@sentry/core/browser';\nimport type { FetchHint, XhrHint } from '@sentry/browser-utils';\nimport {\n addClickKeypressInstrumentationHandler,\n addHistoryInstrumentationHandler,\n addXhrInstrumentationHandler,\n htmlTreeAsString,\n SENTRY_XHR_DATA_KEY,\n} from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BreadcrumbsOptions {\n console: boolean;\n dom:\n | boolean\n | {\n serializeAttribute?: string | string[];\n maxStringLength?: number;\n };\n fetch: boolean;\n history: boolean;\n sentry: boolean;\n xhr: boolean;\n}\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs' as const;\n\nconst _breadcrumbsIntegration = ((options: Partial<BreadcrumbsOptions> = {}) => {\n const _options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n // TODO(v11): Remove this functionality and use `consoleIntegration` from @sentry/core instead.\n if (_options.console) {\n addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n }\n if (_options.dom) {\n addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n }\n if (_options.xhr) {\n addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n }\n if (_options.fetch) {\n addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n }\n if (_options.history) {\n addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n }\n if (_options.sentry) {\n client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n }\n },\n };\n}) satisfies IntegrationFn;\n\nexport const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => void {\n return function addSentryBreadcrumb(event: SentryEvent): void {\n if (getClient() !== client) {\n return;\n }\n\n addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n client: Client,\n dom: BreadcrumbsOptions['dom'],\n): (handlerData: HandlerDataDom) => void {\n return function _innerDomBreadcrumb(handlerData: HandlerDataDom): void {\n if (getClient() !== client) {\n return;\n }\n\n let target;\n let componentName;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n let maxStringLength =\n typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n DEBUG_BUILD &&\n debug.warn(\n `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n );\n maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n }\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n const event = handlerData.event as Event | Node;\n const element = _isEvent(event) ? event.target : event;\n\n target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n componentName = getComponentName(element);\n } catch {\n target = '<unknown>';\n }\n\n if (target.length === 0) {\n return;\n }\n\n const breadcrumb: Breadcrumb = {\n category: `ui.${handlerData.name}`,\n message: target,\n };\n\n if (componentName) {\n breadcrumb.data = { 'ui.component_name': componentName };\n }\n\n addBreadcrumb(breadcrumb, {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client: Client): (handlerData: HandlerDataConsole) => void {\n return function _consoleBreadcrumb(handlerData: HandlerDataConsole): void {\n if (getClient() !== client) {\n return;\n }\n\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client: Client): (handlerData: HandlerDataXhr) => void {\n return function _xhrBreadcrumb(handlerData: HandlerDataXhr): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n // We only capture complete, non-sentry requests\n if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n return;\n }\n\n const { method, url, status_code, body } = sentryXhrData;\n\n const data: XhrBreadcrumbData = {\n method,\n url,\n status_code,\n };\n\n const hint: XhrBreadcrumbHint = {\n xhr: handlerData.xhr,\n input: body,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'xhr',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as XhrHint);\n\n addBreadcrumb(breadcrumb, hint);\n };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client: Client): (handlerData: HandlerDataFetch) => void {\n return function _fetchBreadcrumb(handlerData: HandlerDataFetch): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n // We only capture complete fetch requests\n if (!endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n const hint: FetchBreadcrumbHint = {\n data: handlerData.error,\n input: handlerData.args,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data: handlerData.fetchData,\n level: 'error',\n type: 'http',\n } satisfies Breadcrumb;\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n } else {\n const response = handlerData.response as Response | undefined;\n const data: FetchBreadcrumbData = {\n ...handlerData.fetchData,\n status_code: response?.status,\n };\n\n const hint: FetchBreadcrumbHint = {\n input: handlerData.args,\n response,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n }\n };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client: Client): (handlerData: HandlerDataHistory) => void {\n return function _historyBreadcrumb(handlerData: HandlerDataHistory): void {\n if (getClient() !== client) {\n return;\n }\n\n let from: string | undefined = handlerData.from;\n let to: string | undefined = handlerData.to;\n const parsedLoc = parseUrl(WINDOW.location.href);\n let parsedFrom = from ? parseUrl(from) : undefined;\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom?.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n };\n}\n\nfunction _isEvent(event: unknown): event is Event {\n return !!event && !!(event as Record<string, unknown>).target;\n}\n"],"names":["addConsoleInstrumentationHandler","addClickKeypressInstrumentationHandler","addXhrInstrumentationHandler","addFetchInstrumentationHandler","addHistoryInstrumentationHandler","defineIntegration","getClient","addBreadcrumb","getEventDescription","DEBUG_BUILD","debug","htmlTreeAsString","getComponentName","severityLevelFromString","safeJoin","SENTRY_XHR_DATA_KEY","getBreadcrumbLogLevelFromHttpStatusCode","parseUrl","WINDOW"],"mappings":"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"}
1
+ {"version":3,"file":"breadcrumbs.js","sources":["../../../../../src/integrations/breadcrumbs.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport type {\n Breadcrumb,\n Client,\n Event as SentryEvent,\n FetchBreadcrumbData,\n FetchBreadcrumbHint,\n HandlerDataConsole,\n HandlerDataFetch,\n IntegrationFn,\n} from '@sentry/core';\nimport {\n addBreadcrumb,\n addConsoleInstrumentationHandler,\n addFetchInstrumentationHandler,\n debug,\n defineIntegration,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getEventDescription,\n parseUrl,\n safeJoin,\n severityLevelFromString,\n} from '@sentry/core';\nimport type { FetchHint, HandlerDataDom, HandlerDataHistory, HandlerDataXhr } from '@sentry/browser-utils';\nimport {\n addClickKeypressInstrumentationHandler,\n addHistoryInstrumentationHandler,\n addXhrInstrumentationHandler,\n htmlTreeAsString,\n getComponentName,\n SENTRY_XHR_DATA_KEY,\n} from '@sentry/browser-utils';\nimport type { XhrBreadcrumbData, XhrBreadcrumbHint } from '@sentry/core/browser';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BreadcrumbsOptions {\n console: boolean;\n dom:\n | boolean\n | {\n serializeAttribute?: string | string[];\n maxStringLength?: number;\n };\n fetch: boolean;\n history: boolean;\n sentry: boolean;\n xhr: boolean;\n}\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs' as const;\n\nconst _breadcrumbsIntegration = ((options: Partial<BreadcrumbsOptions> = {}) => {\n const _options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n // TODO(v11): Remove this functionality and use `consoleIntegration` from @sentry/core instead.\n if (_options.console) {\n addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n }\n if (_options.dom) {\n addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n }\n if (_options.xhr) {\n addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n }\n if (_options.fetch) {\n addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n }\n if (_options.history) {\n addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n }\n if (_options.sentry) {\n client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n }\n },\n };\n}) satisfies IntegrationFn;\n\nexport const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => void {\n return function addSentryBreadcrumb(event: SentryEvent): void {\n if (getClient() !== client) {\n return;\n }\n\n addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n client: Client,\n dom: BreadcrumbsOptions['dom'],\n): (handlerData: HandlerDataDom) => void {\n return function _innerDomBreadcrumb(handlerData: HandlerDataDom): void {\n if (getClient() !== client) {\n return;\n }\n\n let target;\n let componentName;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n let maxStringLength =\n typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n DEBUG_BUILD &&\n debug.warn(\n `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n );\n maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n }\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n const event = handlerData.event as Event | Node;\n const element = _isEvent(event) ? event.target : event;\n\n target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n componentName = getComponentName(element);\n } catch {\n target = '<unknown>';\n }\n\n if (target.length === 0) {\n return;\n }\n\n const breadcrumb: Breadcrumb = {\n category: `ui.${handlerData.name}`,\n message: target,\n };\n\n if (componentName) {\n breadcrumb.data = { 'ui.component_name': componentName };\n }\n\n addBreadcrumb(breadcrumb, {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client: Client): (handlerData: HandlerDataConsole) => void {\n return function _consoleBreadcrumb(handlerData: HandlerDataConsole): void {\n if (getClient() !== client) {\n return;\n }\n\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client: Client): (handlerData: HandlerDataXhr) => void {\n return function _xhrBreadcrumb(handlerData: HandlerDataXhr): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n // We only capture complete, non-sentry requests\n if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n return;\n }\n\n const { method, url, status_code, body } = sentryXhrData;\n\n const data: XhrBreadcrumbData = {\n method,\n url,\n status_code,\n };\n\n const hint: XhrBreadcrumbHint = {\n xhr: handlerData.xhr,\n input: body,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'xhr',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint);\n\n addBreadcrumb(breadcrumb, hint);\n };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client: Client): (handlerData: HandlerDataFetch) => void {\n return function _fetchBreadcrumb(handlerData: HandlerDataFetch): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n // We only capture complete fetch requests\n if (!endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n const hint: FetchBreadcrumbHint = {\n data: handlerData.error,\n input: handlerData.args,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data: handlerData.fetchData,\n level: 'error',\n type: 'http',\n } satisfies Breadcrumb;\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n } else {\n const response = handlerData.response as Response | undefined;\n const data: FetchBreadcrumbData = {\n ...handlerData.fetchData,\n status_code: response?.status,\n };\n\n const hint: FetchBreadcrumbHint = {\n input: handlerData.args,\n response,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n }\n };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client: Client): (handlerData: HandlerDataHistory) => void {\n return function _historyBreadcrumb(handlerData: HandlerDataHistory): void {\n if (getClient() !== client) {\n return;\n }\n\n let from: string | undefined = handlerData.from;\n let to: string | undefined = handlerData.to;\n const parsedLoc = parseUrl(WINDOW.location.href);\n let parsedFrom = from ? parseUrl(from) : undefined;\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom?.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n };\n}\n\nfunction _isEvent(event: unknown): event is Event {\n return !!event && !!(event as Record<string, unknown>).target;\n}\n"],"names":["addConsoleInstrumentationHandler","addClickKeypressInstrumentationHandler","addXhrInstrumentationHandler","addFetchInstrumentationHandler","addHistoryInstrumentationHandler","defineIntegration","getClient","addBreadcrumb","getEventDescription","DEBUG_BUILD","debug","htmlTreeAsString","getComponentName","severityLevelFromString","safeJoin","SENTRY_XHR_DATA_KEY","getBreadcrumbLogLevelFromHttpStatusCode","parseUrl","WINDOW"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const browser = require('@sentry/core/browser');
3
+ const core = require('@sentry/core');
4
4
  const helpers = require('../helpers.js');
5
5
 
6
6
  const DEFAULT_EVENT_TARGET = "EventTarget,Window,Node,ApplicationCache,AudioTrackList,BroadcastChannel,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(
@@ -23,16 +23,16 @@ const _browserApiErrorsIntegration = ((options = {}) => {
23
23
  // We may want to adjust this to check for client etc.
24
24
  setupOnce() {
25
25
  if (_options.setTimeout) {
26
- browser.fill(helpers.WINDOW, "setTimeout", _wrapTimeFunction);
26
+ core.fill(helpers.WINDOW, "setTimeout", _wrapTimeFunction);
27
27
  }
28
28
  if (_options.setInterval) {
29
- browser.fill(helpers.WINDOW, "setInterval", _wrapTimeFunction);
29
+ core.fill(helpers.WINDOW, "setInterval", _wrapTimeFunction);
30
30
  }
31
31
  if (_options.requestAnimationFrame) {
32
- browser.fill(helpers.WINDOW, "requestAnimationFrame", _wrapRAF);
32
+ core.fill(helpers.WINDOW, "requestAnimationFrame", _wrapRAF);
33
33
  }
34
34
  if (_options.XMLHttpRequest && "XMLHttpRequest" in helpers.WINDOW) {
35
- browser.fill(XMLHttpRequest.prototype, "send", _wrapXHR);
35
+ core.fill(XMLHttpRequest.prototype, "send", _wrapXHR);
36
36
  }
37
37
  const eventTargetOption = _options.eventTarget;
38
38
  if (eventTargetOption) {
@@ -42,14 +42,14 @@ const _browserApiErrorsIntegration = ((options = {}) => {
42
42
  }
43
43
  };
44
44
  });
45
- const browserApiErrorsIntegration = browser.defineIntegration(_browserApiErrorsIntegration);
45
+ const browserApiErrorsIntegration = core.defineIntegration(_browserApiErrorsIntegration);
46
46
  function _wrapTimeFunction(original) {
47
47
  return function(...args) {
48
48
  const originalCallback = args[0];
49
49
  args[0] = helpers.wrap(originalCallback, {
50
50
  mechanism: {
51
51
  handled: false,
52
- type: `auto.browser.browserapierrors.${browser.getFunctionName(original)}`
52
+ type: `auto.browser.browserapierrors.${core.getFunctionName(original)}`
53
53
  }
54
54
  });
55
55
  return original.apply(this, args);
@@ -61,7 +61,7 @@ function _wrapRAF(original) {
61
61
  helpers.wrap(callback, {
62
62
  mechanism: {
63
63
  data: {
64
- handler: browser.getFunctionName(original)
64
+ handler: core.getFunctionName(original)
65
65
  },
66
66
  handled: false,
67
67
  type: "auto.browser.browserapierrors.requestAnimationFrame"
@@ -76,19 +76,19 @@ function _wrapXHR(originalSend) {
76
76
  const xmlHttpRequestProps = ["onload", "onerror", "onprogress", "onreadystatechange"];
77
77
  xmlHttpRequestProps.forEach((prop) => {
78
78
  if (prop in xhr && typeof xhr[prop] === "function") {
79
- browser.fill(xhr, prop, function(original) {
79
+ core.fill(xhr, prop, function(original) {
80
80
  const wrapOptions = {
81
81
  mechanism: {
82
82
  data: {
83
- handler: browser.getFunctionName(original)
83
+ handler: core.getFunctionName(original)
84
84
  },
85
85
  handled: false,
86
86
  type: `auto.browser.browserapierrors.xhr.${prop}`
87
87
  }
88
88
  };
89
- const originalFunction = browser.getOriginalFunction(original);
89
+ const originalFunction = core.getOriginalFunction(original);
90
90
  if (originalFunction) {
91
- wrapOptions.mechanism.data.handler = browser.getFunctionName(originalFunction);
91
+ wrapOptions.mechanism.data.handler = core.getFunctionName(originalFunction);
92
92
  }
93
93
  return helpers.wrap(original, wrapOptions);
94
94
  });
@@ -103,14 +103,14 @@ function _wrapEventTarget(target, integrationOptions) {
103
103
  if (!proto?.hasOwnProperty?.("addEventListener")) {
104
104
  return;
105
105
  }
106
- browser.fill(proto, "addEventListener", function(original) {
106
+ core.fill(proto, "addEventListener", function(original) {
107
107
  return function(eventName, fn, options) {
108
108
  try {
109
109
  if (isEventListenerObject(fn)) {
110
110
  fn.handleEvent = helpers.wrap(fn.handleEvent, {
111
111
  mechanism: {
112
112
  data: {
113
- handler: browser.getFunctionName(fn),
113
+ handler: core.getFunctionName(fn),
114
114
  target
115
115
  },
116
116
  handled: false,
@@ -128,7 +128,7 @@ function _wrapEventTarget(target, integrationOptions) {
128
128
  helpers.wrap(fn, {
129
129
  mechanism: {
130
130
  data: {
131
- handler: browser.getFunctionName(fn),
131
+ handler: core.getFunctionName(fn),
132
132
  target
133
133
  },
134
134
  handled: false,
@@ -139,7 +139,7 @@ function _wrapEventTarget(target, integrationOptions) {
139
139
  ]);
140
140
  };
141
141
  });
142
- browser.fill(proto, "removeEventListener", function(originalRemoveEventListener) {
142
+ core.fill(proto, "removeEventListener", function(originalRemoveEventListener) {
143
143
  return function(eventName, fn, options) {
144
144
  try {
145
145
  if (Object.prototype.hasOwnProperty.call(fn, "__sentry_wrapped__")) {
@@ -1 +1 @@
1
- {"version":3,"file":"browserapierrors.js","sources":["../../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core/browser';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core/browser';\nimport { WINDOW, wrap } from '../helpers';\n\n// Using a comma-separated string and split for smaller bundle size vs an array literal\nconst DEFAULT_EVENT_TARGET =\n 'EventTarget,Window,Node,ApplicationCache,AudioTrackList,BroadcastChannel,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(\n ',',\n );\n\nconst INTEGRATION_NAME = 'BrowserApiErrors' as const;\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n handled: false,\n type: `auto.browser.browserapierrors.${getFunctionName(original)}`,\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'auto.browser.browserapierrors.requestAnimationFrame',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: `auto.browser.browserapierrors.xhr.${prop}`,\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.handleEvent',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.addEventListener',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n // Check via hasOwnProperty so a `__sentry_wrapped__` inherited from a wrapped\n // `Function.prototype` doesn't cause removal of the wrong handler.\n if (Object.prototype.hasOwnProperty.call(fn, '__sentry_wrapped__')) {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":["fill","WINDOW","defineIntegration","wrap","getFunctionName","getOriginalFunction"],"mappings":"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"}
1
+ {"version":3,"file":"browserapierrors.js","sources":["../../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\nimport { WINDOW, wrap } from '../helpers';\n\n// Using a comma-separated string and split for smaller bundle size vs an array literal\nconst DEFAULT_EVENT_TARGET =\n 'EventTarget,Window,Node,ApplicationCache,AudioTrackList,BroadcastChannel,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(\n ',',\n );\n\nconst INTEGRATION_NAME = 'BrowserApiErrors' as const;\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n handled: false,\n type: `auto.browser.browserapierrors.${getFunctionName(original)}`,\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'auto.browser.browserapierrors.requestAnimationFrame',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: `auto.browser.browserapierrors.xhr.${prop}`,\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.handleEvent',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.addEventListener',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n // Check via hasOwnProperty so a `__sentry_wrapped__` inherited from a wrapped\n // `Function.prototype` doesn't cause removal of the wrong handler.\n if (Object.prototype.hasOwnProperty.call(fn, '__sentry_wrapped__')) {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":["fill","WINDOW","defineIntegration","wrap","getFunctionName","getOriginalFunction"],"mappings":"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"}
@@ -1,43 +1,43 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const browser = require('@sentry/core/browser');
3
+ const core = require('@sentry/core');
4
4
  const browserUtils = require('@sentry/browser-utils');
5
5
  const debugBuild = require('../debug-build.js');
6
6
  const helpers = require('../helpers.js');
7
7
 
8
- const browserSessionIntegration = browser.defineIntegration((options = {}) => {
8
+ const browserSessionIntegration = core.defineIntegration((options = {}) => {
9
9
  const lifecycle = options.lifecycle ?? "page";
10
10
  return {
11
11
  name: "BrowserSession",
12
12
  setupOnce() {
13
13
  if (typeof helpers.WINDOW.document === "undefined") {
14
- debugBuild.DEBUG_BUILD && browser.debug.warn("Using the `browserSessionIntegration` in non-browser environments is not supported.");
14
+ debugBuild.DEBUG_BUILD && core.debug.warn("Using the `browserSessionIntegration` in non-browser environments is not supported.");
15
15
  return;
16
16
  }
17
- browser.startSession({ ignoreDuration: true });
17
+ core.startSession({ ignoreDuration: true });
18
18
  let initialSessionSent = false;
19
19
  browserUtils.whenIdleOrHidden(() => {
20
20
  if (!initialSessionSent) {
21
- browser.captureSession();
21
+ core.captureSession();
22
22
  initialSessionSent = true;
23
23
  }
24
24
  });
25
- const isolationScope = browser.getIsolationScope();
25
+ const isolationScope = core.getIsolationScope();
26
26
  let previousUser = isolationScope.getUser();
27
27
  isolationScope.addScopeListener((scope) => {
28
28
  const maybeNewUser = scope.getUser();
29
29
  if (previousUser?.id !== maybeNewUser?.id || previousUser?.ip_address !== maybeNewUser?.ip_address) {
30
30
  previousUser = maybeNewUser;
31
31
  if (initialSessionSent) {
32
- browser.captureSession();
32
+ core.captureSession();
33
33
  }
34
34
  }
35
35
  });
36
36
  if (lifecycle === "route") {
37
37
  browserUtils.addHistoryInstrumentationHandler(({ from, to }) => {
38
38
  if (from !== to) {
39
- browser.startSession({ ignoreDuration: true });
40
- browser.captureSession();
39
+ core.startSession({ ignoreDuration: true });
40
+ core.captureSession();
41
41
  initialSessionSent = true;
42
42
  }
43
43
  });
@@ -1 +1 @@
1
- {"version":3,"file":"browsersession.js","sources":["../../../../../src/integrations/browsersession.ts"],"sourcesContent":["import { captureSession, debug, defineIntegration, getIsolationScope, startSession } from '@sentry/core/browser';\nimport { addHistoryInstrumentationHandler, whenIdleOrHidden } from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BrowserSessionOptions {\n /**\n * Controls the session lifecycle - when new sessions are created.\n *\n * - `'page'`: A session is created once when the page is loaded. Session is not\n * updated on navigation. This is the default behavior.\n * - `'route'`: A session is created on page load and on every navigation.\n *\n * @default 'page'\n */\n lifecycle?: 'route' | 'page';\n}\n\n/**\n * When added, automatically creates sessions which allow you to track adoption and crashes (crash free rate) in your Releases in Sentry.\n * More information: https://docs.sentry.io/product/releases/health/\n *\n * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/\n */\nexport const browserSessionIntegration = defineIntegration((options: BrowserSessionOptions = {}) => {\n const lifecycle = options.lifecycle ?? 'page';\n\n return {\n name: 'BrowserSession' as const,\n setupOnce() {\n if (typeof WINDOW.document === 'undefined') {\n DEBUG_BUILD &&\n debug.warn('Using the `browserSessionIntegration` in non-browser environments is not supported.');\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSession({ ignoreDuration: true });\n\n // Sending the session envelope synchronously in `init()` runs the full send\n // pipeline during page load, competing with critical resources for the network and\n // adding overhead that measurably hurts LCP. We defer the initial send until the\n // browser is idle; `whenIdleOrHidden` flushes it on page-hide so we don't lose short\n // (page-view-like) sessions.\n let initialSessionSent = false;\n whenIdleOrHidden(() => {\n // A navigation (in `'route'` lifecycle) may start and send a new session before this\n // deferred callback fires. In that case the current session was already sent, so\n // re-capturing here would send it a second time - guard against that.\n if (!initialSessionSent) {\n captureSession();\n initialSessionSent = true;\n }\n });\n\n // User data can be set at any time, for example async after Sentry.init has run and the initial session\n // envelope was already sent, but still on the initial page.\n // Therefore, we have to update the ongoing session with the new user data if it exists, to send the `did`.\n // In theory, sessions, as well as user data is always put onto the isolation scope. So we listen to the\n // isolation scope for changes and update the session with the new user data if it exists.\n // This will not catch users set onto other scopes, like the current scope. For now, we'll accept this limitation.\n // The alternative is to update and capture the session from within the scope. This could be too costly or would not\n // play well with session aggregates on the server side. Since this happens in the scope class, we'd need change\n // scope behaviour in the browser.\n const isolationScope = getIsolationScope();\n let previousUser = isolationScope.getUser();\n isolationScope.addScopeListener(scope => {\n const maybeNewUser = scope.getUser();\n // sessions only care about user id and ip address, so we only need to capture the session if the user has changed\n if (previousUser?.id !== maybeNewUser?.id || previousUser?.ip_address !== maybeNewUser?.ip_address) {\n previousUser = maybeNewUser;\n // Only emit a dedicated update envelope for user data that arrives _after_ the\n // deferred initial session was sent. User data set during page load is already\n // reflected in that session (the scope writes it onto the session), so capturing\n // here would send a redundant envelope - and do so during page load, which is\n // exactly the overhead we're deferring away from.\n if (initialSessionSent) {\n captureSession();\n }\n }\n });\n\n if (lifecycle === 'route') {\n // We want to create a session for every navigation as well\n addHistoryInstrumentationHandler(({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (from !== to) {\n startSession({ ignoreDuration: true });\n captureSession();\n // A session has now been sent, so the deferred initial capture (if still pending)\n // must not re-send this navigation session.\n initialSessionSent = true;\n }\n });\n }\n },\n };\n});\n"],"names":["defineIntegration","WINDOW","DEBUG_BUILD","debug","startSession","whenIdleOrHidden","captureSession","getIsolationScope","addHistoryInstrumentationHandler"],"mappings":";;;;;;;AAwBO,MAAM,yBAAA,GAA4BA,yBAAA,CAAkB,CAAC,OAAA,GAAiC,EAAC,KAAM;AAClG,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,IAAI,OAAOC,cAAA,CAAO,QAAA,KAAa,WAAA,EAAa;AAC1C,QAAAC,sBAAA,IACEC,aAAA,CAAM,KAAK,qFAAqF,CAAA;AAClG,QAAA;AAAA,MACF;AAMA,MAAAC,oBAAA,CAAa,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAOrC,MAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,MAAAC,6BAAA,CAAiB,MAAM;AAIrB,QAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,UAAAC,sBAAA,EAAe;AACf,UAAA,kBAAA,GAAqB,IAAA;AAAA,QACvB;AAAA,MACF,CAAC,CAAA;AAWD,MAAA,MAAM,iBAAiBC,yBAAA,EAAkB;AACzC,MAAA,IAAI,YAAA,GAAe,eAAe,OAAA,EAAQ;AAC1C,MAAA,cAAA,CAAe,iBAAiB,CAAA,KAAA,KAAS;AACvC,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AAEnC,QAAA,IAAI,cAAc,EAAA,KAAO,YAAA,EAAc,MAAM,YAAA,EAAc,UAAA,KAAe,cAAc,UAAA,EAAY;AAClG,UAAA,YAAA,GAAe,YAAA;AAMf,UAAA,IAAI,kBAAA,EAAoB;AACtB,YAAAD,sBAAA,EAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,QAAAE,6CAAA,CAAiC,CAAC,EAAE,IAAA,EAAM,EAAA,EAAG,KAAM;AAEjD,UAAA,IAAI,SAAS,EAAA,EAAI;AACf,YAAAJ,oBAAA,CAAa,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AACrC,YAAAE,sBAAA,EAAe;AAGf,YAAA,kBAAA,GAAqB,IAAA;AAAA,UACvB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"browsersession.js","sources":["../../../../../src/integrations/browsersession.ts"],"sourcesContent":["import { captureSession, debug, defineIntegration, getIsolationScope, startSession } from '@sentry/core';\nimport { addHistoryInstrumentationHandler, whenIdleOrHidden } from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BrowserSessionOptions {\n /**\n * Controls the session lifecycle - when new sessions are created.\n *\n * - `'page'`: A session is created once when the page is loaded. Session is not\n * updated on navigation. This is the default behavior.\n * - `'route'`: A session is created on page load and on every navigation.\n *\n * @default 'page'\n */\n lifecycle?: 'route' | 'page';\n}\n\n/**\n * When added, automatically creates sessions which allow you to track adoption and crashes (crash free rate) in your Releases in Sentry.\n * More information: https://docs.sentry.io/product/releases/health/\n *\n * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/\n */\nexport const browserSessionIntegration = defineIntegration((options: BrowserSessionOptions = {}) => {\n const lifecycle = options.lifecycle ?? 'page';\n\n return {\n name: 'BrowserSession' as const,\n setupOnce() {\n if (typeof WINDOW.document === 'undefined') {\n DEBUG_BUILD &&\n debug.warn('Using the `browserSessionIntegration` in non-browser environments is not supported.');\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSession({ ignoreDuration: true });\n\n // Sending the session envelope synchronously in `init()` runs the full send\n // pipeline during page load, competing with critical resources for the network and\n // adding overhead that measurably hurts LCP. We defer the initial send until the\n // browser is idle; `whenIdleOrHidden` flushes it on page-hide so we don't lose short\n // (page-view-like) sessions.\n let initialSessionSent = false;\n whenIdleOrHidden(() => {\n // A navigation (in `'route'` lifecycle) may start and send a new session before this\n // deferred callback fires. In that case the current session was already sent, so\n // re-capturing here would send it a second time - guard against that.\n if (!initialSessionSent) {\n captureSession();\n initialSessionSent = true;\n }\n });\n\n // User data can be set at any time, for example async after Sentry.init has run and the initial session\n // envelope was already sent, but still on the initial page.\n // Therefore, we have to update the ongoing session with the new user data if it exists, to send the `did`.\n // In theory, sessions, as well as user data is always put onto the isolation scope. So we listen to the\n // isolation scope for changes and update the session with the new user data if it exists.\n // This will not catch users set onto other scopes, like the current scope. For now, we'll accept this limitation.\n // The alternative is to update and capture the session from within the scope. This could be too costly or would not\n // play well with session aggregates on the server side. Since this happens in the scope class, we'd need change\n // scope behaviour in the browser.\n const isolationScope = getIsolationScope();\n let previousUser = isolationScope.getUser();\n isolationScope.addScopeListener(scope => {\n const maybeNewUser = scope.getUser();\n // sessions only care about user id and ip address, so we only need to capture the session if the user has changed\n if (previousUser?.id !== maybeNewUser?.id || previousUser?.ip_address !== maybeNewUser?.ip_address) {\n previousUser = maybeNewUser;\n // Only emit a dedicated update envelope for user data that arrives _after_ the\n // deferred initial session was sent. User data set during page load is already\n // reflected in that session (the scope writes it onto the session), so capturing\n // here would send a redundant envelope - and do so during page load, which is\n // exactly the overhead we're deferring away from.\n if (initialSessionSent) {\n captureSession();\n }\n }\n });\n\n if (lifecycle === 'route') {\n // We want to create a session for every navigation as well\n addHistoryInstrumentationHandler(({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (from !== to) {\n startSession({ ignoreDuration: true });\n captureSession();\n // A session has now been sent, so the deferred initial capture (if still pending)\n // must not re-send this navigation session.\n initialSessionSent = true;\n }\n });\n }\n },\n };\n});\n"],"names":["defineIntegration","WINDOW","DEBUG_BUILD","debug","startSession","whenIdleOrHidden","captureSession","getIsolationScope","addHistoryInstrumentationHandler"],"mappings":";;;;;;;AAwBO,MAAM,yBAAA,GAA4BA,sBAAA,CAAkB,CAAC,OAAA,GAAiC,EAAC,KAAM;AAClG,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,GAAY;AACV,MAAA,IAAI,OAAOC,cAAA,CAAO,QAAA,KAAa,WAAA,EAAa;AAC1C,QAAAC,sBAAA,IACEC,UAAA,CAAM,KAAK,qFAAqF,CAAA;AAClG,QAAA;AAAA,MACF;AAMA,MAAAC,iBAAA,CAAa,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAOrC,MAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,MAAAC,6BAAA,CAAiB,MAAM;AAIrB,QAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,UAAAC,mBAAA,EAAe;AACf,UAAA,kBAAA,GAAqB,IAAA;AAAA,QACvB;AAAA,MACF,CAAC,CAAA;AAWD,MAAA,MAAM,iBAAiBC,sBAAA,EAAkB;AACzC,MAAA,IAAI,YAAA,GAAe,eAAe,OAAA,EAAQ;AAC1C,MAAA,cAAA,CAAe,iBAAiB,CAAA,KAAA,KAAS;AACvC,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AAEnC,QAAA,IAAI,cAAc,EAAA,KAAO,YAAA,EAAc,MAAM,YAAA,EAAc,UAAA,KAAe,cAAc,UAAA,EAAY;AAClG,UAAA,YAAA,GAAe,YAAA;AAMf,UAAA,IAAI,kBAAA,EAAoB;AACtB,YAAAD,mBAAA,EAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,QAAAE,6CAAA,CAAiC,CAAC,EAAE,IAAA,EAAM,EAAA,EAAG,KAAM;AAEjD,UAAA,IAAI,SAAS,EAAA,EAAI;AACf,YAAAJ,iBAAA,CAAa,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AACrC,YAAAE,mBAAA,EAAe;AAGf,YAAA,kBAAA,GAAqB,IAAA;AAAA,UACvB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACF;AACF,CAAC;;;;"}
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const browser = require('@sentry/core/browser');
3
+ const core = require('@sentry/core');
4
4
 
5
- const WINDOW = browser.GLOBAL_OBJ;
5
+ const WINDOW = core.GLOBAL_OBJ;
6
6
  const DEFAULT_LINES_OF_CONTEXT = 7;
7
7
  const INTEGRATION_NAME = "ContextLines";
8
8
  const _contextLinesIntegration = ((options = {}) => {
@@ -14,10 +14,10 @@ const _contextLinesIntegration = ((options = {}) => {
14
14
  }
15
15
  };
16
16
  });
17
- const contextLinesIntegration = browser.defineIntegration(_contextLinesIntegration);
17
+ const contextLinesIntegration = core.defineIntegration(_contextLinesIntegration);
18
18
  function addSourceContext(event, contextLines) {
19
19
  const doc = WINDOW.document;
20
- const htmlFilename = WINDOW.location && browser.stripUrlQueryAndFragment(WINDOW.location.href);
20
+ const htmlFilename = WINDOW.location && core.stripUrlQueryAndFragment(WINDOW.location.href);
21
21
  if (!doc || !htmlFilename) {
22
22
  return event;
23
23
  }
@@ -44,7 +44,7 @@ function applySourceContextToFrame(frame, htmlLines, htmlFilename, linesOfContex
44
44
  if (frame.filename !== htmlFilename || !frame.lineno || !htmlLines.length) {
45
45
  return frame;
46
46
  }
47
- browser.addContextToFrame(htmlLines, frame, linesOfContext);
47
+ core.addContextToFrame(htmlLines, frame, linesOfContext);
48
48
  return frame;
49
49
  }
50
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"contextlines.js","sources":["../../../../../src/integrations/contextlines.ts"],"sourcesContent":["import type { Event, IntegrationFn, StackFrame } from '@sentry/core/browser';\nimport { addContextToFrame, defineIntegration, GLOBAL_OBJ, stripUrlQueryAndFragment } from '@sentry/core/browser';\n\nconst WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nconst DEFAULT_LINES_OF_CONTEXT = 7;\n\nconst INTEGRATION_NAME = 'ContextLines' as const;\n\n// TODO(v11): Use `dataCollection.frameContextLines` default (5)\ninterface ContextLinesOptions {\n /**\n * Sets the number of context lines for each frame when loading a file.\n * Defaults to 7.\n *\n * Set to 0 to disable loading and inclusion of source files.\n *\n * When set, this option takes precedence over `dataCollection.frameContextLines`.\n **/\n frameContextLines?: number;\n}\n\nconst _contextLinesIntegration = ((options: ContextLinesOptions = {}) => {\n return {\n name: INTEGRATION_NAME,\n processEvent(event, _hint, client) {\n const contextLines =\n options.frameContextLines ?? client?.getDataCollectionOptions().frameContextLines ?? DEFAULT_LINES_OF_CONTEXT;\n return addSourceContext(event, contextLines);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Collects source context lines around the lines of stackframes pointing to JS embedded in\n * the current page's HTML.\n *\n * This integration DOES NOT work for stack frames pointing to JS files that are loaded by the browser.\n * For frames pointing to files, context lines are added during ingestion and symbolication\n * by attempting to download the JS files to the Sentry backend.\n *\n * Use this integration if you have inline JS code in HTML pages that can't be accessed\n * by our backend (e.g. due to a login-protected page).\n */\nexport const contextLinesIntegration = defineIntegration(_contextLinesIntegration);\n\n/**\n * Processes an event and adds context lines.\n */\nfunction addSourceContext(event: Event, contextLines: number): Event {\n const doc = WINDOW.document;\n const htmlFilename = WINDOW.location && stripUrlQueryAndFragment(WINDOW.location.href);\n if (!doc || !htmlFilename) {\n return event;\n }\n\n const exceptions = event.exception?.values;\n if (!exceptions?.length) {\n return event;\n }\n\n const html = doc.documentElement.innerHTML;\n if (!html) {\n return event;\n }\n\n const htmlLines = ['<!DOCTYPE html>', '<html>', ...html.split('\\n'), '</html>'];\n\n exceptions.forEach(exception => {\n const stacktrace = exception.stacktrace;\n if (stacktrace?.frames) {\n stacktrace.frames = stacktrace.frames.map(frame =>\n applySourceContextToFrame(frame, htmlLines, htmlFilename, contextLines),\n );\n }\n });\n\n return event;\n}\n\n/**\n * Only exported for testing\n */\nexport function applySourceContextToFrame(\n frame: StackFrame,\n htmlLines: string[],\n htmlFilename: string,\n linesOfContext: number,\n): StackFrame {\n if (frame.filename !== htmlFilename || !frame.lineno || !htmlLines.length) {\n return frame;\n }\n\n addContextToFrame(htmlLines, frame, linesOfContext);\n\n return frame;\n}\n"],"names":["GLOBAL_OBJ","defineIntegration","stripUrlQueryAndFragment","addContextToFrame"],"mappings":";;;;AAGA,MAAM,MAAA,GAASA,kBAAA;AAEf,MAAM,wBAAA,GAA2B,CAAA;AAEjC,MAAM,gBAAA,GAAmB,cAAA;AAezB,MAAM,wBAAA,IAA4B,CAAC,OAAA,GAA+B,EAAC,KAAM;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ;AACjC,MAAA,MAAM,eACJ,OAAA,CAAQ,iBAAA,IAAqB,MAAA,EAAQ,wBAAA,GAA2B,iBAAA,IAAqB,wBAAA;AACvF,MAAA,OAAO,gBAAA,CAAiB,OAAO,YAAY,CAAA;AAAA,IAC7C;AAAA,GACF;AACF,CAAA,CAAA;AAaO,MAAM,uBAAA,GAA0BC,0BAAkB,wBAAwB;AAKjF,SAAS,gBAAA,CAAiB,OAAc,YAAA,EAA6B;AACnE,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,EAAA,MAAM,eAAe,MAAA,CAAO,QAAA,IAAYC,gCAAA,CAAyB,MAAA,CAAO,SAAS,IAAI,CAAA;AACrF,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,YAAA,EAAc;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAW,MAAA;AACpC,EAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,SAAA;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,iBAAA,EAAmB,QAAA,EAAU,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,SAAS,CAAA;AAE9E,EAAA,UAAA,CAAW,QAAQ,CAAA,SAAA,KAAa;AAC9B,IAAA,MAAM,aAAa,SAAA,CAAU,UAAA;AAC7B,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,UAAA,CAAW,MAAA,GAAS,WAAW,MAAA,CAAO,GAAA;AAAA,QAAI,CAAA,KAAA,KACxC,yBAAA,CAA0B,KAAA,EAAO,SAAA,EAAW,cAAc,YAAY;AAAA,OACxE;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,yBAAA,CACd,KAAA,EACA,SAAA,EACA,YAAA,EACA,cAAA,EACY;AACZ,EAAA,IAAI,KAAA,CAAM,aAAa,YAAA,IAAgB,CAAC,MAAM,MAAA,IAAU,CAAC,UAAU,MAAA,EAAQ;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAAC,yBAAA,CAAkB,SAAA,EAAW,OAAO,cAAc,CAAA;AAElD,EAAA,OAAO,KAAA;AACT;;;;;"}
1
+ {"version":3,"file":"contextlines.js","sources":["../../../../../src/integrations/contextlines.ts"],"sourcesContent":["import type { Event, IntegrationFn, StackFrame } from '@sentry/core';\nimport { addContextToFrame, defineIntegration, GLOBAL_OBJ, stripUrlQueryAndFragment } from '@sentry/core';\n\nconst WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nconst DEFAULT_LINES_OF_CONTEXT = 7;\n\nconst INTEGRATION_NAME = 'ContextLines' as const;\n\n// TODO(v11): Use `dataCollection.frameContextLines` default (5)\ninterface ContextLinesOptions {\n /**\n * Sets the number of context lines for each frame when loading a file.\n * Defaults to 7.\n *\n * Set to 0 to disable loading and inclusion of source files.\n *\n * When set, this option takes precedence over `dataCollection.frameContextLines`.\n **/\n frameContextLines?: number;\n}\n\nconst _contextLinesIntegration = ((options: ContextLinesOptions = {}) => {\n return {\n name: INTEGRATION_NAME,\n processEvent(event, _hint, client) {\n const contextLines =\n options.frameContextLines ?? client?.getDataCollectionOptions().frameContextLines ?? DEFAULT_LINES_OF_CONTEXT;\n return addSourceContext(event, contextLines);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Collects source context lines around the lines of stackframes pointing to JS embedded in\n * the current page's HTML.\n *\n * This integration DOES NOT work for stack frames pointing to JS files that are loaded by the browser.\n * For frames pointing to files, context lines are added during ingestion and symbolication\n * by attempting to download the JS files to the Sentry backend.\n *\n * Use this integration if you have inline JS code in HTML pages that can't be accessed\n * by our backend (e.g. due to a login-protected page).\n */\nexport const contextLinesIntegration = defineIntegration(_contextLinesIntegration);\n\n/**\n * Processes an event and adds context lines.\n */\nfunction addSourceContext(event: Event, contextLines: number): Event {\n const doc = WINDOW.document;\n const htmlFilename = WINDOW.location && stripUrlQueryAndFragment(WINDOW.location.href);\n if (!doc || !htmlFilename) {\n return event;\n }\n\n const exceptions = event.exception?.values;\n if (!exceptions?.length) {\n return event;\n }\n\n const html = doc.documentElement.innerHTML;\n if (!html) {\n return event;\n }\n\n const htmlLines = ['<!DOCTYPE html>', '<html>', ...html.split('\\n'), '</html>'];\n\n exceptions.forEach(exception => {\n const stacktrace = exception.stacktrace;\n if (stacktrace?.frames) {\n stacktrace.frames = stacktrace.frames.map(frame =>\n applySourceContextToFrame(frame, htmlLines, htmlFilename, contextLines),\n );\n }\n });\n\n return event;\n}\n\n/**\n * Only exported for testing\n */\nexport function applySourceContextToFrame(\n frame: StackFrame,\n htmlLines: string[],\n htmlFilename: string,\n linesOfContext: number,\n): StackFrame {\n if (frame.filename !== htmlFilename || !frame.lineno || !htmlLines.length) {\n return frame;\n }\n\n addContextToFrame(htmlLines, frame, linesOfContext);\n\n return frame;\n}\n"],"names":["GLOBAL_OBJ","defineIntegration","stripUrlQueryAndFragment","addContextToFrame"],"mappings":";;;;AAGA,MAAM,MAAA,GAASA,eAAA;AAEf,MAAM,wBAAA,GAA2B,CAAA;AAEjC,MAAM,gBAAA,GAAmB,cAAA;AAezB,MAAM,wBAAA,IAA4B,CAAC,OAAA,GAA+B,EAAC,KAAM;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ;AACjC,MAAA,MAAM,eACJ,OAAA,CAAQ,iBAAA,IAAqB,MAAA,EAAQ,wBAAA,GAA2B,iBAAA,IAAqB,wBAAA;AACvF,MAAA,OAAO,gBAAA,CAAiB,OAAO,YAAY,CAAA;AAAA,IAC7C;AAAA,GACF;AACF,CAAA,CAAA;AAaO,MAAM,uBAAA,GAA0BC,uBAAkB,wBAAwB;AAKjF,SAAS,gBAAA,CAAiB,OAAc,YAAA,EAA6B;AACnE,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,EAAA,MAAM,eAAe,MAAA,CAAO,QAAA,IAAYC,6BAAA,CAAyB,MAAA,CAAO,SAAS,IAAI,CAAA;AACrF,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,YAAA,EAAc;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAW,MAAA;AACpC,EAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,SAAA;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,iBAAA,EAAmB,QAAA,EAAU,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,SAAS,CAAA;AAE9E,EAAA,UAAA,CAAW,QAAQ,CAAA,SAAA,KAAa;AAC9B,IAAA,MAAM,aAAa,SAAA,CAAU,UAAA;AAC7B,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,UAAA,CAAW,MAAA,GAAS,WAAW,MAAA,CAAO,GAAA;AAAA,QAAI,CAAA,KAAA,KACxC,yBAAA,CAA0B,KAAA,EAAO,SAAA,EAAW,cAAc,YAAY;AAAA,OACxE;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,yBAAA,CACd,KAAA,EACA,SAAA,EACA,YAAA,EACA,cAAA,EACY;AACZ,EAAA,IAAI,KAAA,CAAM,aAAa,YAAA,IAAgB,CAAC,MAAM,MAAA,IAAU,CAAC,UAAU,MAAA,EAAQ;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAAC,sBAAA,CAAkB,SAAA,EAAW,OAAO,cAAc,CAAA;AAElD,EAAA,OAAO,KAAA;AACT;;;;;"}