@sentry/browser-utils 10.58.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 (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/build/cjs/debug-build.js +6 -0
  4. package/build/cjs/debug-build.js.map +1 -0
  5. package/build/cjs/getNativeImplementation.js +51 -0
  6. package/build/cjs/getNativeImplementation.js.map +1 -0
  7. package/build/cjs/htmlTreeAsString.js +110 -0
  8. package/build/cjs/htmlTreeAsString.js.map +1 -0
  9. package/build/cjs/index.js +54 -0
  10. package/build/cjs/index.js.map +1 -0
  11. package/build/cjs/instrument/dom.js +137 -0
  12. package/build/cjs/instrument/dom.js.map +1 -0
  13. package/build/cjs/instrument/history.js +56 -0
  14. package/build/cjs/instrument/history.js.map +1 -0
  15. package/build/cjs/instrument/xhr.js +108 -0
  16. package/build/cjs/instrument/xhr.js.map +1 -0
  17. package/build/cjs/is.js +15 -0
  18. package/build/cjs/is.js.map +1 -0
  19. package/build/cjs/metrics/browserMetrics.js +535 -0
  20. package/build/cjs/metrics/browserMetrics.js.map +1 -0
  21. package/build/cjs/metrics/cls.js +64 -0
  22. package/build/cjs/metrics/cls.js.map +1 -0
  23. package/build/cjs/metrics/elementTiming.js +72 -0
  24. package/build/cjs/metrics/elementTiming.js.map +1 -0
  25. package/build/cjs/metrics/inp.js +170 -0
  26. package/build/cjs/metrics/inp.js.map +1 -0
  27. package/build/cjs/metrics/instrument.js +152 -0
  28. package/build/cjs/metrics/instrument.js.map +1 -0
  29. package/build/cjs/metrics/lcp.js +77 -0
  30. package/build/cjs/metrics/lcp.js.map +1 -0
  31. package/build/cjs/metrics/resourceTiming.js +44 -0
  32. package/build/cjs/metrics/resourceTiming.js.map +1 -0
  33. package/build/cjs/metrics/utils.js +137 -0
  34. package/build/cjs/metrics/utils.js.map +1 -0
  35. package/build/cjs/metrics/web-vitals/getCLS.js +46 -0
  36. package/build/cjs/metrics/web-vitals/getCLS.js.map +1 -0
  37. package/build/cjs/metrics/web-vitals/getINP.js +60 -0
  38. package/build/cjs/metrics/web-vitals/getINP.js.map +1 -0
  39. package/build/cjs/metrics/web-vitals/getLCP.js +62 -0
  40. package/build/cjs/metrics/web-vitals/getLCP.js.map +1 -0
  41. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js +87 -0
  42. package/build/cjs/metrics/web-vitals/lib/InteractionManager.js.map +1 -0
  43. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js +11 -0
  44. package/build/cjs/metrics/web-vitals/lib/LCPEntryManager.js.map +1 -0
  45. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js +27 -0
  46. package/build/cjs/metrics/web-vitals/lib/LayoutShiftManager.js.map +1 -0
  47. package/build/cjs/metrics/web-vitals/lib/bindReporter.js +31 -0
  48. package/build/cjs/metrics/web-vitals/lib/bindReporter.js.map +1 -0
  49. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js +8 -0
  50. package/build/cjs/metrics/web-vitals/lib/generateUniqueID.js.map +1 -0
  51. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js +11 -0
  52. package/build/cjs/metrics/web-vitals/lib/getActivationStart.js.map +1 -0
  53. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js +17 -0
  54. package/build/cjs/metrics/web-vitals/lib/getNavigationEntry.js.map +1 -0
  55. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js +48 -0
  56. package/build/cjs/metrics/web-vitals/lib/getVisibilityWatcher.js.map +1 -0
  57. package/build/cjs/metrics/web-vitals/lib/globalListeners.js +18 -0
  58. package/build/cjs/metrics/web-vitals/lib/globalListeners.js.map +1 -0
  59. package/build/cjs/metrics/web-vitals/lib/initMetric.js +34 -0
  60. package/build/cjs/metrics/web-vitals/lib/initMetric.js.map +1 -0
  61. package/build/cjs/metrics/web-vitals/lib/initUnique.js +16 -0
  62. package/build/cjs/metrics/web-vitals/lib/initUnique.js.map +1 -0
  63. package/build/cjs/metrics/web-vitals/lib/observe.js +20 -0
  64. package/build/cjs/metrics/web-vitals/lib/observe.js.map +1 -0
  65. package/build/cjs/metrics/web-vitals/lib/onHidden.js +17 -0
  66. package/build/cjs/metrics/web-vitals/lib/onHidden.js.map +1 -0
  67. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +32 -0
  68. package/build/cjs/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +1 -0
  69. package/build/cjs/metrics/web-vitals/lib/runOnce.js +14 -0
  70. package/build/cjs/metrics/web-vitals/lib/runOnce.js.map +1 -0
  71. package/build/cjs/metrics/web-vitals/lib/whenActivated.js +14 -0
  72. package/build/cjs/metrics/web-vitals/lib/whenActivated.js.map +1 -0
  73. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js +24 -0
  74. package/build/cjs/metrics/web-vitals/lib/whenIdleOrHidden.js.map +1 -0
  75. package/build/cjs/metrics/web-vitals/onFCP.js +37 -0
  76. package/build/cjs/metrics/web-vitals/onFCP.js.map +1 -0
  77. package/build/cjs/metrics/web-vitals/onTTFB.js +35 -0
  78. package/build/cjs/metrics/web-vitals/onTTFB.js.map +1 -0
  79. package/build/cjs/metrics/webVitalSpans.js +199 -0
  80. package/build/cjs/metrics/webVitalSpans.js.map +1 -0
  81. package/build/cjs/networkUtils.js +70 -0
  82. package/build/cjs/networkUtils.js.map +1 -0
  83. package/build/cjs/types.js +8 -0
  84. package/build/cjs/types.js.map +1 -0
  85. package/build/esm/debug-build.js +4 -0
  86. package/build/esm/debug-build.js.map +1 -0
  87. package/build/esm/getNativeImplementation.js +46 -0
  88. package/build/esm/getNativeImplementation.js.map +1 -0
  89. package/build/esm/htmlTreeAsString.js +108 -0
  90. package/build/esm/htmlTreeAsString.js.map +1 -0
  91. package/build/esm/index.js +15 -0
  92. package/build/esm/index.js.map +1 -0
  93. package/build/esm/instrument/dom.js +134 -0
  94. package/build/esm/instrument/dom.js.map +1 -0
  95. package/build/esm/instrument/history.js +53 -0
  96. package/build/esm/instrument/history.js.map +1 -0
  97. package/build/esm/instrument/xhr.js +104 -0
  98. package/build/esm/instrument/xhr.js.map +1 -0
  99. package/build/esm/is.js +13 -0
  100. package/build/esm/is.js.map +1 -0
  101. package/build/esm/metrics/browserMetrics.js +524 -0
  102. package/build/esm/metrics/browserMetrics.js.map +1 -0
  103. package/build/esm/metrics/cls.js +61 -0
  104. package/build/esm/metrics/cls.js.map +1 -0
  105. package/build/esm/metrics/elementTiming.js +69 -0
  106. package/build/esm/metrics/elementTiming.js.map +1 -0
  107. package/build/esm/metrics/inp.js +162 -0
  108. package/build/esm/metrics/inp.js.map +1 -0
  109. package/build/esm/metrics/instrument.js +145 -0
  110. package/build/esm/metrics/instrument.js.map +1 -0
  111. package/build/esm/metrics/lcp.js +72 -0
  112. package/build/esm/metrics/lcp.js.map +1 -0
  113. package/build/esm/metrics/resourceTiming.js +42 -0
  114. package/build/esm/metrics/resourceTiming.js.map +1 -0
  115. package/build/esm/metrics/utils.js +128 -0
  116. package/build/esm/metrics/utils.js.map +1 -0
  117. package/build/esm/metrics/web-vitals/getCLS.js +43 -0
  118. package/build/esm/metrics/web-vitals/getCLS.js.map +1 -0
  119. package/build/esm/metrics/web-vitals/getINP.js +57 -0
  120. package/build/esm/metrics/web-vitals/getINP.js.map +1 -0
  121. package/build/esm/metrics/web-vitals/getLCP.js +59 -0
  122. package/build/esm/metrics/web-vitals/getLCP.js.map +1 -0
  123. package/build/esm/metrics/web-vitals/lib/InteractionManager.js +85 -0
  124. package/build/esm/metrics/web-vitals/lib/InteractionManager.js.map +1 -0
  125. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js +9 -0
  126. package/build/esm/metrics/web-vitals/lib/LCPEntryManager.js.map +1 -0
  127. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js +25 -0
  128. package/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js.map +1 -0
  129. package/build/esm/metrics/web-vitals/lib/bindReporter.js +29 -0
  130. package/build/esm/metrics/web-vitals/lib/bindReporter.js.map +1 -0
  131. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js +6 -0
  132. package/build/esm/metrics/web-vitals/lib/generateUniqueID.js.map +1 -0
  133. package/build/esm/metrics/web-vitals/lib/getActivationStart.js +9 -0
  134. package/build/esm/metrics/web-vitals/lib/getActivationStart.js.map +1 -0
  135. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js +15 -0
  136. package/build/esm/metrics/web-vitals/lib/getNavigationEntry.js.map +1 -0
  137. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js +46 -0
  138. package/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js.map +1 -0
  139. package/build/esm/metrics/web-vitals/lib/globalListeners.js +15 -0
  140. package/build/esm/metrics/web-vitals/lib/globalListeners.js.map +1 -0
  141. package/build/esm/metrics/web-vitals/lib/initMetric.js +32 -0
  142. package/build/esm/metrics/web-vitals/lib/initMetric.js.map +1 -0
  143. package/build/esm/metrics/web-vitals/lib/initUnique.js +14 -0
  144. package/build/esm/metrics/web-vitals/lib/initUnique.js.map +1 -0
  145. package/build/esm/metrics/web-vitals/lib/observe.js +18 -0
  146. package/build/esm/metrics/web-vitals/lib/observe.js.map +1 -0
  147. package/build/esm/metrics/web-vitals/lib/onHidden.js +15 -0
  148. package/build/esm/metrics/web-vitals/lib/onHidden.js.map +1 -0
  149. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js +29 -0
  150. package/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js.map +1 -0
  151. package/build/esm/metrics/web-vitals/lib/runOnce.js +12 -0
  152. package/build/esm/metrics/web-vitals/lib/runOnce.js.map +1 -0
  153. package/build/esm/metrics/web-vitals/lib/whenActivated.js +12 -0
  154. package/build/esm/metrics/web-vitals/lib/whenActivated.js.map +1 -0
  155. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js +22 -0
  156. package/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js.map +1 -0
  157. package/build/esm/metrics/web-vitals/onFCP.js +34 -0
  158. package/build/esm/metrics/web-vitals/onFCP.js.map +1 -0
  159. package/build/esm/metrics/web-vitals/onTTFB.js +32 -0
  160. package/build/esm/metrics/web-vitals/onTTFB.js.map +1 -0
  161. package/build/esm/metrics/webVitalSpans.js +191 -0
  162. package/build/esm/metrics/webVitalSpans.js.map +1 -0
  163. package/build/esm/networkUtils.js +64 -0
  164. package/build/esm/networkUtils.js.map +1 -0
  165. package/build/esm/package.json +1 -0
  166. package/build/esm/types.js +6 -0
  167. package/build/esm/types.js.map +1 -0
  168. package/build/types/debug-build.d.ts +7 -0
  169. package/build/types/debug-build.d.ts.map +1 -0
  170. package/build/types/getNativeImplementation.d.ts +69 -0
  171. package/build/types/getNativeImplementation.d.ts.map +1 -0
  172. package/build/types/htmlTreeAsString.d.ts +11 -0
  173. package/build/types/htmlTreeAsString.d.ts.map +1 -0
  174. package/build/types/index.d.ts +15 -0
  175. package/build/types/index.d.ts.map +1 -0
  176. package/build/types/instrument/dom.d.ts +11 -0
  177. package/build/types/instrument/dom.d.ts.map +1 -0
  178. package/build/types/instrument/history.d.ts +15 -0
  179. package/build/types/instrument/history.d.ts.map +1 -0
  180. package/build/types/instrument/xhr.d.ts +14 -0
  181. package/build/types/instrument/xhr.d.ts.map +1 -0
  182. package/build/types/is.d.ts +7 -0
  183. package/build/types/is.d.ts.map +1 -0
  184. package/build/types/metrics/browserMetrics.d.ts +116 -0
  185. package/build/types/metrics/browserMetrics.d.ts.map +1 -0
  186. package/build/types/metrics/cls.d.ts +17 -0
  187. package/build/types/metrics/cls.d.ts.map +1 -0
  188. package/build/types/metrics/elementTiming.d.ts +19 -0
  189. package/build/types/metrics/elementTiming.d.ts.map +1 -0
  190. package/build/types/metrics/inp.d.ts +35 -0
  191. package/build/types/metrics/inp.d.ts.map +1 -0
  192. package/build/types/metrics/instrument.d.ts +121 -0
  193. package/build/types/metrics/instrument.d.ts.map +1 -0
  194. package/build/types/metrics/lcp.d.ts +22 -0
  195. package/build/types/metrics/lcp.d.ts.map +1 -0
  196. package/build/types/metrics/resourceTiming.d.ts +13 -0
  197. package/build/types/metrics/resourceTiming.d.ts.map +1 -0
  198. package/build/types/metrics/utils.d.ts +73 -0
  199. package/build/types/metrics/utils.d.ts.map +1 -0
  200. package/build/types/metrics/web-vitals/getCLS.d.ts +26 -0
  201. package/build/types/metrics/web-vitals/getCLS.d.ts.map +1 -0
  202. package/build/types/metrics/web-vitals/getINP.d.ts +34 -0
  203. package/build/types/metrics/web-vitals/getINP.d.ts.map +1 -0
  204. package/build/types/metrics/web-vitals/getLCP.d.ts +16 -0
  205. package/build/types/metrics/web-vitals/getLCP.d.ts.map +1 -0
  206. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts +37 -0
  207. package/build/types/metrics/web-vitals/lib/InteractionManager.d.ts.map +1 -0
  208. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts +5 -0
  209. package/build/types/metrics/web-vitals/lib/LCPEntryManager.d.ts.map +1 -0
  210. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts +7 -0
  211. package/build/types/metrics/web-vitals/lib/LayoutShiftManager.d.ts.map +1 -0
  212. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts +7 -0
  213. package/build/types/metrics/web-vitals/lib/bindReporter.d.ts.map +1 -0
  214. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts +7 -0
  215. package/build/types/metrics/web-vitals/lib/generateUniqueID.d.ts.map +1 -0
  216. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts +2 -0
  217. package/build/types/metrics/web-vitals/lib/getActivationStart.d.ts.map +1 -0
  218. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts +2 -0
  219. package/build/types/metrics/web-vitals/lib/getNavigationEntry.d.ts.map +1 -0
  220. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +5 -0
  221. package/build/types/metrics/web-vitals/lib/getVisibilityWatcher.d.ts.map +1 -0
  222. package/build/types/metrics/web-vitals/lib/globalListeners.d.ts +11 -0
  223. package/build/types/metrics/web-vitals/lib/globalListeners.d.ts.map +1 -0
  224. package/build/types/metrics/web-vitals/lib/initMetric.d.ts +21 -0
  225. package/build/types/metrics/web-vitals/lib/initMetric.d.ts.map +1 -0
  226. package/build/types/metrics/web-vitals/lib/initUnique.d.ts +7 -0
  227. package/build/types/metrics/web-vitals/lib/initUnique.d.ts.map +1 -0
  228. package/build/types/metrics/web-vitals/lib/observe.d.ts +23 -0
  229. package/build/types/metrics/web-vitals/lib/observe.d.ts.map +1 -0
  230. package/build/types/metrics/web-vitals/lib/onHidden.d.ts +27 -0
  231. package/build/types/metrics/web-vitals/lib/onHidden.d.ts.map +1 -0
  232. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +15 -0
  233. package/build/types/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts.map +1 -0
  234. package/build/types/metrics/web-vitals/lib/runOnce.d.ts +2 -0
  235. package/build/types/metrics/web-vitals/lib/runOnce.d.ts.map +1 -0
  236. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts +2 -0
  237. package/build/types/metrics/web-vitals/lib/whenActivated.d.ts.map +1 -0
  238. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +6 -0
  239. package/build/types/metrics/web-vitals/lib/whenIdleOrHidden.d.ts.map +1 -0
  240. package/build/types/metrics/web-vitals/onFCP.d.ts +11 -0
  241. package/build/types/metrics/web-vitals/onFCP.d.ts.map +1 -0
  242. package/build/types/metrics/web-vitals/onTTFB.d.ts +20 -0
  243. package/build/types/metrics/web-vitals/onTTFB.d.ts.map +1 -0
  244. package/build/types/metrics/web-vitals/types/base.d.ts +103 -0
  245. package/build/types/metrics/web-vitals/types/base.d.ts.map +1 -0
  246. package/build/types/metrics/web-vitals/types/cls.d.ts +58 -0
  247. package/build/types/metrics/web-vitals/types/cls.d.ts.map +1 -0
  248. package/build/types/metrics/web-vitals/types/fcp.d.ts +47 -0
  249. package/build/types/metrics/web-vitals/types/fcp.d.ts.map +1 -0
  250. package/build/types/metrics/web-vitals/types/inp.d.ts +150 -0
  251. package/build/types/metrics/web-vitals/types/inp.d.ts.map +1 -0
  252. package/build/types/metrics/web-vitals/types/lcp.d.ts +74 -0
  253. package/build/types/metrics/web-vitals/types/lcp.d.ts.map +1 -0
  254. package/build/types/metrics/web-vitals/types/ttfb.d.ts +60 -0
  255. package/build/types/metrics/web-vitals/types/ttfb.d.ts.map +1 -0
  256. package/build/types/metrics/web-vitals/types.d.ts +78 -0
  257. package/build/types/metrics/web-vitals/types.d.ts.map +1 -0
  258. package/build/types/metrics/webVitalSpans.d.ts +65 -0
  259. package/build/types/metrics/webVitalSpans.d.ts.map +1 -0
  260. package/build/types/networkUtils.d.ts +25 -0
  261. package/build/types/networkUtils.d.ts.map +1 -0
  262. package/build/types/types.d.ts +15 -0
  263. package/build/types/types.d.ts.map +1 -0
  264. package/build/types-ts3.8/debug-build.d.ts +7 -0
  265. package/build/types-ts3.8/getNativeImplementation.d.ts +69 -0
  266. package/build/types-ts3.8/htmlTreeAsString.d.ts +11 -0
  267. package/build/types-ts3.8/index.d.ts +15 -0
  268. package/build/types-ts3.8/instrument/dom.d.ts +11 -0
  269. package/build/types-ts3.8/instrument/history.d.ts +15 -0
  270. package/build/types-ts3.8/instrument/xhr.d.ts +14 -0
  271. package/build/types-ts3.8/is.d.ts +7 -0
  272. package/build/types-ts3.8/metrics/browserMetrics.d.ts +119 -0
  273. package/build/types-ts3.8/metrics/cls.d.ts +17 -0
  274. package/build/types-ts3.8/metrics/elementTiming.d.ts +19 -0
  275. package/build/types-ts3.8/metrics/inp.d.ts +35 -0
  276. package/build/types-ts3.8/metrics/instrument.d.ts +121 -0
  277. package/build/types-ts3.8/metrics/lcp.d.ts +22 -0
  278. package/build/types-ts3.8/metrics/resourceTiming.d.ts +13 -0
  279. package/build/types-ts3.8/metrics/utils.d.ts +73 -0
  280. package/build/types-ts3.8/metrics/web-vitals/getCLS.d.ts +26 -0
  281. package/build/types-ts3.8/metrics/web-vitals/getINP.d.ts +34 -0
  282. package/build/types-ts3.8/metrics/web-vitals/getLCP.d.ts +16 -0
  283. package/build/types-ts3.8/metrics/web-vitals/lib/InteractionManager.d.ts +37 -0
  284. package/build/types-ts3.8/metrics/web-vitals/lib/LCPEntryManager.d.ts +5 -0
  285. package/build/types-ts3.8/metrics/web-vitals/lib/LayoutShiftManager.d.ts +7 -0
  286. package/build/types-ts3.8/metrics/web-vitals/lib/bindReporter.d.ts +7 -0
  287. package/build/types-ts3.8/metrics/web-vitals/lib/generateUniqueID.d.ts +7 -0
  288. package/build/types-ts3.8/metrics/web-vitals/lib/getActivationStart.d.ts +2 -0
  289. package/build/types-ts3.8/metrics/web-vitals/lib/getNavigationEntry.d.ts +2 -0
  290. package/build/types-ts3.8/metrics/web-vitals/lib/getVisibilityWatcher.d.ts +5 -0
  291. package/build/types-ts3.8/metrics/web-vitals/lib/globalListeners.d.ts +11 -0
  292. package/build/types-ts3.8/metrics/web-vitals/lib/initMetric.d.ts +21 -0
  293. package/build/types-ts3.8/metrics/web-vitals/lib/initUnique.d.ts +7 -0
  294. package/build/types-ts3.8/metrics/web-vitals/lib/observe.d.ts +23 -0
  295. package/build/types-ts3.8/metrics/web-vitals/lib/onHidden.d.ts +27 -0
  296. package/build/types-ts3.8/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.d.ts +15 -0
  297. package/build/types-ts3.8/metrics/web-vitals/lib/runOnce.d.ts +2 -0
  298. package/build/types-ts3.8/metrics/web-vitals/lib/whenActivated.d.ts +2 -0
  299. package/build/types-ts3.8/metrics/web-vitals/lib/whenIdleOrHidden.d.ts +6 -0
  300. package/build/types-ts3.8/metrics/web-vitals/onFCP.d.ts +11 -0
  301. package/build/types-ts3.8/metrics/web-vitals/onTTFB.d.ts +20 -0
  302. package/build/types-ts3.8/metrics/web-vitals/types/base.d.ts +106 -0
  303. package/build/types-ts3.8/metrics/web-vitals/types/cls.d.ts +58 -0
  304. package/build/types-ts3.8/metrics/web-vitals/types/fcp.d.ts +47 -0
  305. package/build/types-ts3.8/metrics/web-vitals/types/inp.d.ts +150 -0
  306. package/build/types-ts3.8/metrics/web-vitals/types/lcp.d.ts +74 -0
  307. package/build/types-ts3.8/metrics/web-vitals/types/ttfb.d.ts +60 -0
  308. package/build/types-ts3.8/metrics/web-vitals/types.d.ts +78 -0
  309. package/build/types-ts3.8/metrics/webVitalSpans.d.ts +65 -0
  310. package/build/types-ts3.8/networkUtils.d.ts +28 -0
  311. package/build/types-ts3.8/types.d.ts +15 -0
  312. package/package.json +69 -0
@@ -0,0 +1,191 @@
1
+ import { browserPerformanceTimeOrigin, debug, timestampInSeconds, getCurrentScope, spanToStreamedSpanJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, startInactiveSpan, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, getActiveSpan, getRootSpan } from '@sentry/core';
2
+ import { DEBUG_BUILD } from '../debug-build.js';
3
+ import { htmlTreeAsString } from '../htmlTreeAsString.js';
4
+ import { WINDOW } from '../types.js';
5
+ import { MAX_PLAUSIBLE_INP_DURATION, INP_ENTRY_MAP, getCachedInteractionContext } from './inp.js';
6
+ import { addClsInstrumentationHandler, addInpInstrumentationHandler, addLcpInstrumentationHandler } from './instrument.js';
7
+ import { isValidLcpMetric } from './lcp.js';
8
+ import { supportsWebVital, listenForWebVitalReportEvents, getBrowserPerformanceAPI, msToSec } from './utils.js';
9
+
10
+ function _emitWebVitalSpan(options) {
11
+ const {
12
+ name,
13
+ op,
14
+ origin,
15
+ metricName,
16
+ value,
17
+ attributes: passedAttributes,
18
+ parentSpan,
19
+ reportEvent,
20
+ startTime,
21
+ endTime
22
+ } = options;
23
+ const routeName = getCurrentScope().getScopeData().transactionName;
24
+ const attributes = {
25
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin,
26
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op,
27
+ [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: 0,
28
+ [`browser.web_vital.${metricName}.value`]: value,
29
+ "sentry.transaction": routeName,
30
+ // Web vital score calculation relies on the user agent
31
+ "user_agent.original": WINDOW.navigator?.userAgent,
32
+ ...passedAttributes
33
+ };
34
+ if (parentSpan && spanToStreamedSpanJSON(parentSpan).attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] === "pageload") {
35
+ attributes["sentry.pageload.span_id"] = parentSpan.spanContext().spanId;
36
+ }
37
+ if (reportEvent) {
38
+ attributes[`browser.web_vital.${metricName}.report_event`] = reportEvent;
39
+ }
40
+ const span = startInactiveSpan({
41
+ name,
42
+ attributes,
43
+ startTime,
44
+ // if we have a pageload span, we let the web vital span start as its parent. This ensures that
45
+ // it is not started as a segment span, without having to manually set it to a "standalone" v2 span
46
+ // that has `segment: false` but no actual parent span.
47
+ parentSpan
48
+ });
49
+ if (span) {
50
+ span.end(endTime ?? startTime);
51
+ }
52
+ }
53
+ function trackLcpAsSpan(client) {
54
+ let lcpValue = 0;
55
+ let lcpEntry;
56
+ if (!supportsWebVital("largest-contentful-paint")) {
57
+ return;
58
+ }
59
+ const cleanupLcpHandler = addLcpInstrumentationHandler(({ metric }) => {
60
+ const entry = metric.entries[metric.entries.length - 1];
61
+ if (!entry || !isValidLcpMetric(metric.value)) {
62
+ return;
63
+ }
64
+ lcpValue = metric.value;
65
+ lcpEntry = entry;
66
+ }, true);
67
+ listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan) => {
68
+ _sendLcpSpan(lcpValue, lcpEntry, pageloadSpan, reportEvent);
69
+ cleanupLcpHandler();
70
+ });
71
+ }
72
+ function _sendLcpSpan(lcpValue, entry, pageloadSpan, reportEvent) {
73
+ if (!isValidLcpMetric(lcpValue)) {
74
+ return;
75
+ }
76
+ DEBUG_BUILD && debug.log(`Sending LCP span (${lcpValue})`);
77
+ const performanceTimeOrigin = browserPerformanceTimeOrigin() || 0;
78
+ const timeOrigin = msToSec(performanceTimeOrigin);
79
+ const endTime = msToSec(performanceTimeOrigin + (entry?.startTime || 0));
80
+ const name = entry ? htmlTreeAsString(entry.element) : "Largest contentful paint";
81
+ const attributes = {};
82
+ entry?.element && (attributes["browser.web_vital.lcp.element"] = htmlTreeAsString(entry.element));
83
+ entry?.id && (attributes["browser.web_vital.lcp.id"] = entry.id);
84
+ entry?.url && (attributes["browser.web_vital.lcp.url"] = entry.url);
85
+ entry?.loadTime != null && (attributes["browser.web_vital.lcp.load_time"] = entry.loadTime);
86
+ entry?.renderTime != null && (attributes["browser.web_vital.lcp.render_time"] = entry.renderTime);
87
+ entry?.size != null && (attributes["browser.web_vital.lcp.size"] = entry.size);
88
+ _emitWebVitalSpan({
89
+ name,
90
+ op: "ui.webvital.lcp",
91
+ origin: "auto.http.browser.lcp",
92
+ metricName: "lcp",
93
+ value: lcpValue,
94
+ attributes,
95
+ parentSpan: pageloadSpan,
96
+ reportEvent,
97
+ startTime: timeOrigin,
98
+ endTime
99
+ });
100
+ }
101
+ function trackClsAsSpan(client) {
102
+ let clsValue = 0;
103
+ let clsEntry;
104
+ if (!supportsWebVital("layout-shift")) {
105
+ return;
106
+ }
107
+ const cleanupClsHandler = addClsInstrumentationHandler(({ metric }) => {
108
+ const entry = metric.entries[metric.entries.length - 1];
109
+ if (!entry) {
110
+ return;
111
+ }
112
+ clsValue = metric.value;
113
+ clsEntry = entry;
114
+ }, true);
115
+ listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan) => {
116
+ _sendClsSpan(clsValue, clsEntry, pageloadSpan, reportEvent);
117
+ cleanupClsHandler();
118
+ });
119
+ }
120
+ function _sendClsSpan(clsValue, entry, pageloadSpan, reportEvent) {
121
+ DEBUG_BUILD && debug.log(`Sending CLS span (${clsValue})`);
122
+ const startTime = entry ? msToSec((browserPerformanceTimeOrigin() || 0) + entry.startTime) : timestampInSeconds();
123
+ const name = entry ? htmlTreeAsString(entry.sources[0]?.node) : "Layout shift";
124
+ const attributes = {};
125
+ if (entry?.sources) {
126
+ entry.sources.forEach((source, index) => {
127
+ attributes[`browser.web_vital.cls.source.${index + 1}`] = htmlTreeAsString(source.node);
128
+ });
129
+ }
130
+ _emitWebVitalSpan({
131
+ name,
132
+ op: "ui.webvital.cls",
133
+ origin: "auto.http.browser.cls",
134
+ metricName: "cls",
135
+ value: clsValue,
136
+ attributes,
137
+ parentSpan: pageloadSpan,
138
+ reportEvent,
139
+ startTime
140
+ });
141
+ }
142
+ function trackInpAsSpan() {
143
+ const performance = getBrowserPerformanceAPI();
144
+ if (!performance || !browserPerformanceTimeOrigin()) {
145
+ return;
146
+ }
147
+ const onInp = ({ metric }) => {
148
+ if (metric.value == null) {
149
+ return;
150
+ }
151
+ const duration = msToSec(metric.value);
152
+ if (duration > MAX_PLAUSIBLE_INP_DURATION) {
153
+ return;
154
+ }
155
+ const entry = metric.entries.find((e) => e.duration === metric.value && INP_ENTRY_MAP[e.name]);
156
+ if (!entry) {
157
+ return;
158
+ }
159
+ _sendInpSpan(metric.value, entry);
160
+ };
161
+ addInpInstrumentationHandler(onInp);
162
+ }
163
+ function _sendInpSpan(inpValue, entry) {
164
+ DEBUG_BUILD && debug.log(`Sending INP span (${inpValue})`);
165
+ const startTime = msToSec(browserPerformanceTimeOrigin() + entry.startTime);
166
+ const duration = msToSec(inpValue);
167
+ const interactionType = INP_ENTRY_MAP[entry.name];
168
+ const cachedContext = getCachedInteractionContext(entry.interactionId);
169
+ const activeSpan = getActiveSpan();
170
+ const rootSpan = activeSpan ? getRootSpan(activeSpan) : void 0;
171
+ const spanToUse = cachedContext?.span || rootSpan;
172
+ const routeName = spanToUse ? spanToStreamedSpanJSON(spanToUse).name : getCurrentScope().getScopeData().transactionName;
173
+ const name = cachedContext?.elementName || htmlTreeAsString(entry.target);
174
+ _emitWebVitalSpan({
175
+ name,
176
+ op: `ui.interaction.${interactionType}`,
177
+ origin: "auto.http.browser.inp",
178
+ metricName: "inp",
179
+ value: inpValue,
180
+ attributes: {
181
+ [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry.duration,
182
+ "sentry.transaction": routeName
183
+ },
184
+ startTime,
185
+ endTime: startTime + duration,
186
+ parentSpan: spanToUse
187
+ });
188
+ }
189
+
190
+ export { _emitWebVitalSpan, _sendClsSpan, _sendInpSpan, _sendLcpSpan, trackClsAsSpan, trackInpAsSpan, trackLcpAsSpan };
191
+ //# sourceMappingURL=webVitalSpans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webVitalSpans.js","sources":["../../../src/metrics/webVitalSpans.ts"],"sourcesContent":["import type { Client, Span, SpanAttributes } from '@sentry/core';\nimport {\n browserPerformanceTimeOrigin,\n debug,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanToStreamedSpanJSON,\n startInactiveSpan,\n timestampInSeconds,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { htmlTreeAsString } from '../htmlTreeAsString';\nimport { WINDOW } from '../types';\nimport { getCachedInteractionContext, INP_ENTRY_MAP, MAX_PLAUSIBLE_INP_DURATION } from './inp';\nimport type { InstrumentationHandlerCallback } from './instrument';\nimport { addClsInstrumentationHandler, addInpInstrumentationHandler, addLcpInstrumentationHandler } from './instrument';\nimport { isValidLcpMetric } from './lcp';\nimport type { WebVitalReportEvent } from './utils';\nimport { getBrowserPerformanceAPI, listenForWebVitalReportEvents, msToSec, supportsWebVital } from './utils';\nimport type { PerformanceEventTiming } from './instrument';\n\n// Locally-defined interfaces to avoid leaking bare global type references into the\n// generated .d.ts. The `declare global` augmentations in web-vitals/types.ts make these\n// available during this package's compilation but are NOT carried to consumers.\n// This mirrors the pattern used for PerformanceEventTiming in instrument.ts.\nexport interface LayoutShift extends PerformanceEntry {\n value: number;\n sources: Array<{ node: Node | null }>;\n hadRecentInput: boolean;\n}\n\nexport interface LargestContentfulPaint extends PerformanceEntry {\n readonly renderTime: DOMHighResTimeStamp;\n readonly loadTime: DOMHighResTimeStamp;\n readonly size: number;\n readonly id: string;\n readonly url: string;\n readonly element: Element | null;\n}\n\ninterface WebVitalSpanOptions {\n name: string;\n op: string;\n origin: string;\n metricName: 'lcp' | 'cls' | 'inp';\n value: number;\n attributes?: SpanAttributes;\n parentSpan?: Span;\n reportEvent?: WebVitalReportEvent;\n startTime: number;\n endTime?: number;\n}\n\n/**\n * Emits a web vital span that flows through the span streaming pipeline.\n */\nexport function _emitWebVitalSpan(options: WebVitalSpanOptions): void {\n const {\n name,\n op,\n origin,\n metricName,\n value,\n attributes: passedAttributes,\n parentSpan,\n reportEvent,\n startTime,\n endTime,\n } = options;\n\n const routeName = getCurrentScope().getScopeData().transactionName;\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op,\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: 0,\n [`browser.web_vital.${metricName}.value`]: value,\n 'sentry.transaction': routeName,\n // Web vital score calculation relies on the user agent\n 'user_agent.original': WINDOW.navigator?.userAgent,\n ...passedAttributes,\n };\n\n if (parentSpan && spanToStreamedSpanJSON(parentSpan).attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'pageload') {\n // for LCP and CLS, we collect the pageload span id as an attribute\n attributes['sentry.pageload.span_id'] = parentSpan.spanContext().spanId;\n }\n\n if (reportEvent) {\n attributes[`browser.web_vital.${metricName}.report_event`] = reportEvent;\n }\n\n const span = startInactiveSpan({\n name,\n attributes,\n startTime,\n // if we have a pageload span, we let the web vital span start as its parent. This ensures that\n // it is not started as a segment span, without having to manually set it to a \"standalone\" v2 span\n // that has `segment: false` but no actual parent span.\n parentSpan: parentSpan,\n });\n\n if (span) {\n span.end(endTime ?? startTime);\n }\n}\n\n/**\n * Tracks LCP as a streamed span.\n */\nexport function trackLcpAsSpan(client: Client): void {\n let lcpValue = 0;\n let lcpEntry: LargestContentfulPaint | undefined;\n\n if (!supportsWebVital('largest-contentful-paint')) {\n return;\n }\n\n const cleanupLcpHandler = addLcpInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\n if (!entry || !isValidLcpMetric(metric.value)) {\n return;\n }\n lcpValue = metric.value;\n lcpEntry = entry;\n }, true);\n\n listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan) => {\n _sendLcpSpan(lcpValue, lcpEntry, pageloadSpan, reportEvent);\n cleanupLcpHandler();\n });\n}\n\n/**\n * Exported only for testing.\n */\nexport function _sendLcpSpan(\n lcpValue: number,\n entry: LargestContentfulPaint | undefined,\n pageloadSpan?: Span,\n reportEvent?: WebVitalReportEvent,\n): void {\n if (!isValidLcpMetric(lcpValue)) {\n return;\n }\n\n DEBUG_BUILD && debug.log(`Sending LCP span (${lcpValue})`);\n\n const performanceTimeOrigin = browserPerformanceTimeOrigin() || 0;\n const timeOrigin = msToSec(performanceTimeOrigin);\n const endTime = msToSec(performanceTimeOrigin + (entry?.startTime || 0));\n const name = entry ? htmlTreeAsString(entry.element) : 'Largest contentful paint';\n\n const attributes: SpanAttributes = {};\n\n entry?.element && (attributes['browser.web_vital.lcp.element'] = htmlTreeAsString(entry.element));\n entry?.id && (attributes['browser.web_vital.lcp.id'] = entry.id);\n entry?.url && (attributes['browser.web_vital.lcp.url'] = entry.url);\n entry?.loadTime != null && (attributes['browser.web_vital.lcp.load_time'] = entry.loadTime);\n entry?.renderTime != null && (attributes['browser.web_vital.lcp.render_time'] = entry.renderTime);\n entry?.size != null && (attributes['browser.web_vital.lcp.size'] = entry.size);\n\n _emitWebVitalSpan({\n name,\n op: 'ui.webvital.lcp',\n origin: 'auto.http.browser.lcp',\n metricName: 'lcp',\n value: lcpValue,\n attributes,\n parentSpan: pageloadSpan,\n reportEvent,\n startTime: timeOrigin,\n endTime,\n });\n}\n\n/**\n * Tracks CLS as a streamed span.\n */\nexport function trackClsAsSpan(client: Client): void {\n let clsValue = 0;\n let clsEntry: LayoutShift | undefined;\n\n if (!supportsWebVital('layout-shift')) {\n return;\n }\n\n const cleanupClsHandler = addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] as LayoutShift | undefined;\n if (!entry) {\n return;\n }\n clsValue = metric.value;\n clsEntry = entry;\n }, true);\n\n listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan) => {\n _sendClsSpan(clsValue, clsEntry, pageloadSpan, reportEvent);\n cleanupClsHandler();\n });\n}\n\n/**\n * Exported only for testing.\n */\nexport function _sendClsSpan(\n clsValue: number,\n entry: LayoutShift | undefined,\n pageloadSpan?: Span,\n reportEvent?: WebVitalReportEvent,\n): void {\n DEBUG_BUILD && debug.log(`Sending CLS span (${clsValue})`);\n\n const startTime = entry ? msToSec((browserPerformanceTimeOrigin() || 0) + entry.startTime) : timestampInSeconds();\n const name = entry ? htmlTreeAsString(entry.sources[0]?.node) : 'Layout shift';\n\n const attributes: SpanAttributes = {};\n\n if (entry?.sources) {\n entry.sources.forEach((source, index) => {\n attributes[`browser.web_vital.cls.source.${index + 1}`] = htmlTreeAsString(source.node);\n });\n }\n\n _emitWebVitalSpan({\n name,\n op: 'ui.webvital.cls',\n origin: 'auto.http.browser.cls',\n metricName: 'cls',\n value: clsValue,\n attributes,\n parentSpan: pageloadSpan,\n reportEvent,\n startTime,\n });\n}\n\n/**\n * Tracks INP as a streamed span.\n *\n * This mirrors the standalone INP tracking logic (`startTrackingINP`) but emits\n * spans through the streaming pipeline instead of as standalone spans.\n * Requires `registerInpInteractionListener()` to be called separately for\n * cached element names and root spans per interaction.\n */\nexport function trackInpAsSpan(): void {\n const performance = getBrowserPerformanceAPI();\n if (!performance || !browserPerformanceTimeOrigin()) {\n return;\n }\n\n const onInp: InstrumentationHandlerCallback = ({ metric }) => {\n if (metric.value == null) {\n return;\n }\n\n const duration = msToSec(metric.value);\n\n if (duration > MAX_PLAUSIBLE_INP_DURATION) {\n return;\n }\n\n const entry = metric.entries.find(e => e.duration === metric.value && INP_ENTRY_MAP[e.name]);\n\n if (!entry) {\n return;\n }\n\n _sendInpSpan(metric.value, entry);\n };\n\n addInpInstrumentationHandler(onInp);\n}\n\n/**\n * Exported only for testing.\n */\nexport function _sendInpSpan(inpValue: number, entry: PerformanceEventTiming): void {\n DEBUG_BUILD && debug.log(`Sending INP span (${inpValue})`);\n\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(inpValue);\n const interactionType = INP_ENTRY_MAP[entry.name];\n\n const cachedContext = getCachedInteractionContext(entry.interactionId);\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n const spanToUse = cachedContext?.span || rootSpan;\n const routeName = spanToUse\n ? spanToStreamedSpanJSON(spanToUse).name\n : getCurrentScope().getScopeData().transactionName;\n const name = cachedContext?.elementName || htmlTreeAsString(entry.target);\n\n _emitWebVitalSpan({\n name,\n op: `ui.interaction.${interactionType}`,\n origin: 'auto.http.browser.inp',\n metricName: 'inp',\n value: inpValue,\n attributes: {\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry.duration,\n 'sentry.transaction': routeName,\n },\n startTime,\n endTime: startTime + duration,\n parentSpan: spanToUse,\n });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { debug } from '@sentry/core';
2
+ import { DEBUG_BUILD } from './debug-build.js';
3
+
4
+ const ORIGINAL_REQ_BODY = /* @__PURE__ */ Symbol.for("sentry__originalRequestBody");
5
+ function serializeFormData(formData) {
6
+ return new URLSearchParams(formData).toString();
7
+ }
8
+ function getBodyString(body, _debug = debug) {
9
+ try {
10
+ if (typeof body === "string") {
11
+ return [body];
12
+ }
13
+ if (body instanceof URLSearchParams) {
14
+ return [body.toString()];
15
+ }
16
+ if (body instanceof FormData) {
17
+ return [serializeFormData(body)];
18
+ }
19
+ if (!body) {
20
+ return [void 0];
21
+ }
22
+ } catch (error) {
23
+ DEBUG_BUILD && _debug.error(error, "Failed to serialize body", body);
24
+ return [void 0, "BODY_PARSE_ERROR"];
25
+ }
26
+ DEBUG_BUILD && _debug.log("Skipping network body because of body type", body);
27
+ return [void 0, "UNPARSEABLE_BODY_TYPE"];
28
+ }
29
+ function getFetchRequestArgBody(fetchArgs = []) {
30
+ if (fetchArgs.length >= 2 && fetchArgs[1] && typeof fetchArgs[1] === "object" && "body" in fetchArgs[1]) {
31
+ return fetchArgs[1].body;
32
+ }
33
+ if (fetchArgs.length >= 1 && fetchArgs[0] instanceof Request) {
34
+ const request = fetchArgs[0];
35
+ const originalBody = request[ORIGINAL_REQ_BODY];
36
+ if (originalBody !== void 0) {
37
+ return originalBody;
38
+ }
39
+ return void 0;
40
+ }
41
+ return void 0;
42
+ }
43
+ function parseXhrResponseHeaders(xhr) {
44
+ let headers;
45
+ try {
46
+ headers = xhr.getAllResponseHeaders();
47
+ } catch (error) {
48
+ DEBUG_BUILD && debug.error(error, "Failed to get xhr response headers", xhr);
49
+ return {};
50
+ }
51
+ if (!headers) {
52
+ return {};
53
+ }
54
+ return headers.split("\r\n").reduce((acc, line) => {
55
+ const [key, value] = line.split(": ");
56
+ if (value) {
57
+ acc[key.toLowerCase()] = value;
58
+ }
59
+ return acc;
60
+ }, {});
61
+ }
62
+
63
+ export { ORIGINAL_REQ_BODY, getBodyString, getFetchRequestArgBody, parseXhrResponseHeaders, serializeFormData };
64
+ //# sourceMappingURL=networkUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkUtils.js","sources":["../../src/networkUtils.ts"],"sourcesContent":["import { debug } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { NetworkMetaWarning } from './types';\n\n// Symbol used by e.g. the Replay integration to store original body on Request objects\nexport const ORIGINAL_REQ_BODY = Symbol.for('sentry__originalRequestBody');\n\n/**\n * Serializes FormData.\n *\n * This is a bit simplified, but gives us a decent estimate.\n * This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'.\n *\n */\nexport function serializeFormData(formData: FormData): string {\n // @ts-expect-error passing FormData to URLSearchParams actually works\n return new URLSearchParams(formData).toString();\n}\n\n/** Get the string representation of a body. */\nexport function getBodyString(body: unknown, _debug: typeof debug = debug): [string | undefined, NetworkMetaWarning?] {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof URLSearchParams) {\n return [body.toString()];\n }\n\n if (body instanceof FormData) {\n return [serializeFormData(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && _debug.error(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && _debug.log('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/**\n * Parses the fetch arguments to extract the request payload.\n *\n * In case of a Request object, this function attempts to retrieve the original body by looking for a Sentry-patched symbol.\n */\nexport function getFetchRequestArgBody(fetchArgs: unknown[] = []): RequestInit['body'] | undefined {\n // Second argument with body options takes precedence\n if (fetchArgs.length >= 2 && fetchArgs[1] && typeof fetchArgs[1] === 'object' && 'body' in fetchArgs[1]) {\n return (fetchArgs[1] as RequestInit).body;\n }\n\n if (fetchArgs.length >= 1 && fetchArgs[0] instanceof Request) {\n const request = fetchArgs[0];\n /* The Request interface's body is a ReadableStream, which we cannot directly access.\n Some integrations (e.g. Replay) patch the Request object to store the original body. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const originalBody = (request as any)[ORIGINAL_REQ_BODY];\n if (originalBody !== undefined) {\n return originalBody;\n }\n\n return undefined; // Fall back to returning undefined (as we don't want to return a ReadableStream)\n }\n\n return undefined;\n}\n\n/**\n * Parses XMLHttpRequest response headers into a Record.\n * Extracted from replay internals to be reusable.\n */\nexport function parseXhrResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n let headers: string | undefined;\n try {\n headers = xhr.getAllResponseHeaders();\n } catch (error) {\n DEBUG_BUILD && debug.error(error, 'Failed to get xhr response headers', xhr);\n return {};\n }\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ') as [string, string | undefined];\n if (value) {\n acc[key.toLowerCase()] = value;\n }\n return acc;\n }, {});\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,iBAAA,mBAAoB,MAAA,CAAO,GAAA,CAAI,6BAA6B;AASlE,SAAS,kBAAkB,QAAA,EAA4B;AAE5D,EAAA,OAAO,IAAI,eAAA,CAAgB,QAAQ,CAAA,CAAE,QAAA,EAAS;AAChD;AAGO,SAAS,aAAA,CAAc,IAAA,EAAe,MAAA,GAAuB,KAAA,EAAkD;AACpH,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,MAAA,OAAO,CAAC,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,OAAO,CAAC,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,CAAC,KAAA,CAAS,CAAA;AAAA,IACnB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,0BAAA,EAA4B,IAAI,CAAA;AACnE,IAAA,OAAO,CAAC,QAAW,kBAAkB,CAAA;AAAA,EACvC;AAEA,EAAA,WAAA,IAAe,MAAA,CAAO,GAAA,CAAI,4CAAA,EAA8C,IAAI,CAAA;AAE5E,EAAA,OAAO,CAAC,QAAW,uBAAuB,CAAA;AAC5C;AAOO,SAAS,sBAAA,CAAuB,SAAA,GAAuB,EAAC,EAAoC;AAEjG,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,IAAK,OAAO,SAAA,CAAU,CAAC,CAAA,KAAM,QAAA,IAAY,MAAA,IAAU,SAAA,CAAU,CAAC,CAAA,EAAG;AACvG,IAAA,OAAQ,SAAA,CAAU,CAAC,CAAA,CAAkB,IAAA;AAAA,EACvC;AAEA,EAAA,IAAI,UAAU,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,CAAC,aAAa,OAAA,EAAS;AAC5D,IAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAI3B,IAAA,MAAM,YAAA,GAAgB,QAAgB,iBAAiB,CAAA;AACvD,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,wBAAwB,GAAA,EAA6C;AACnF,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,IAAI,qBAAA,EAAsB;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,oCAAA,EAAsC,GAAG,CAAA;AAC3E,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,QAAQ,KAAA,CAAM,MAAM,EAAE,MAAA,CAAO,CAAC,KAA6B,IAAA,KAAiB;AACjF,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,IAC3B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AACP;;;;"}
@@ -0,0 +1 @@
1
+ {"type":"module","version":"10.58.0","sideEffects":false}
@@ -0,0 +1,6 @@
1
+ import { GLOBAL_OBJ } from '@sentry/core';
2
+
3
+ const WINDOW = GLOBAL_OBJ;
4
+
5
+ export { WINDOW };
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../src/types.ts"],"sourcesContent":["import type {\n FetchBreadcrumbHint,\n HandlerDataFetch,\n SentryWrappedXMLHttpRequest,\n XhrBreadcrumbHint,\n} from '@sentry/core';\nimport { GLOBAL_OBJ } from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ &\n // document is not available in all browser environments (webworkers). We make it optional so you have to explicitly check for it\n Omit<Window, 'document'> &\n Partial<Pick<Window, 'document'>>;\n\nexport type NetworkMetaWarning =\n | 'MAYBE_JSON_TRUNCATED'\n | 'TEXT_TRUNCATED'\n | 'URL_SKIPPED'\n | 'BODY_PARSE_ERROR'\n | 'BODY_PARSE_TIMEOUT'\n | 'UNPARSEABLE_BODY_TYPE';\n\ntype RequestBody = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\nexport type XhrHint = XhrBreadcrumbHint & {\n xhr: XMLHttpRequest & SentryWrappedXMLHttpRequest;\n input?: RequestBody;\n};\nexport type FetchHint = FetchBreadcrumbHint & {\n input: HandlerDataFetch['args'];\n response: Response;\n};\n"],"names":[],"mappings":";;AAQO,MAAM,MAAA,GAAS;;;;"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.
3
+ *
4
+ * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.
5
+ */
6
+ export declare const DEBUG_BUILD: boolean;
7
+ //# sourceMappingURL=debug-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-build.d.ts","sourceRoot":"","sources":["../../src/debug-build.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAkB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { WINDOW } from './types';
2
+ /**
3
+ * We generally want to use window.fetch / window.setTimeout.
4
+ * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),
5
+ * so we try to get an unpatched version of this from a sandboxed iframe.
6
+ */
7
+ interface CacheableImplementations {
8
+ setTimeout: typeof WINDOW.setTimeout;
9
+ fetch: typeof WINDOW.fetch;
10
+ }
11
+ /**
12
+ * Get the native implementation of a browser function.
13
+ *
14
+ * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.
15
+ *
16
+ * The following methods can be retrieved:
17
+ * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.
18
+ * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.
19
+ */
20
+ export declare function getNativeImplementation<T extends keyof CacheableImplementations>(name: T): CacheableImplementations[T];
21
+ /** Clear a cached implementation. */
22
+ export declare function clearCachedImplementation(name: keyof CacheableImplementations): void;
23
+ /**
24
+ * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.
25
+ * Whenever someone wraps the Fetch API and returns the wrong promise chain,
26
+ * this chain becomes orphaned and there is no possible way to capture it's rejections
27
+ * other than allowing it bubble up to this very handler. eg.
28
+ *
29
+ * const f = window.fetch;
30
+ * window.fetch = function () {
31
+ * const p = f.apply(this, arguments);
32
+ *
33
+ * p.then(function() {
34
+ * console.log('hi.');
35
+ * });
36
+ *
37
+ * return p;
38
+ * }
39
+ *
40
+ * `p.then(function () { ... })` is producing a completely separate promise chain,
41
+ * however, what's returned is `p` - the result of original `fetch` call.
42
+ *
43
+ * This mean, that whenever we use the Fetch API to send our own requests, _and_
44
+ * some ad-blocker blocks it, this orphaned chain will _always_ reject,
45
+ * effectively causing another event to be captured.
46
+ * This makes a whole process become an infinite loop, which we need to somehow
47
+ * deal with, and break it in one way or another.
48
+ *
49
+ * To deal with this issue, we are making sure that we _always_ use the real
50
+ * browser Fetch API, instead of relying on what `window.fetch` exposes.
51
+ * The only downside to this would be missing our own requests as breadcrumbs,
52
+ * but because we are already not doing this, it should be just fine.
53
+ *
54
+ * Possible failed fetch error messages per-browser:
55
+ *
56
+ * Chrome: Failed to fetch
57
+ * Edge: Failed to Fetch
58
+ * Firefox: NetworkError when attempting to fetch resource
59
+ * Safari: resource blocked by content blocker
60
+ */
61
+ export declare function fetch(...rest: Parameters<typeof WINDOW.fetch>): ReturnType<typeof WINDOW.fetch>;
62
+ /**
63
+ * Get an unwrapped `setTimeout` method.
64
+ * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,
65
+ * avoiding triggering change detection.
66
+ */
67
+ export declare function setTimeout(...rest: Parameters<typeof WINDOW.setTimeout>): ReturnType<typeof WINDOW.setTimeout>;
68
+ export {};
69
+ //# sourceMappingURL=getNativeImplementation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNativeImplementation.d.ts","sourceRoot":"","sources":["../../src/getNativeImplementation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC;;;;GAIG;AAEH,UAAU,wBAAwB;IAChC,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IACrC,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC;CAC5B;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,wBAAwB,EAC9E,IAAI,EAAE,CAAC,GACN,wBAAwB,CAAC,CAAC,CAAC,CAsC7B;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,wBAAwB,GAAG,IAAI,CAEpF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAE/F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAE9G"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Given a child DOM element, returns a query-selector statement describing that
3
+ * and its ancestors
4
+ * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
5
+ * @returns generated DOM path
6
+ */
7
+ export declare function htmlTreeAsString(elem: unknown, options?: string[] | {
8
+ keyAttrs?: string[];
9
+ maxStringLength?: number;
10
+ }): string;
11
+ //# sourceMappingURL=htmlTreeAsString.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlTreeAsString.d.ts","sourceRoot":"","sources":["../../src/htmlTreeAsString.ts"],"names":[],"mappings":"AAgDA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,MAAM,EAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,MAAM,CAyCR"}
@@ -0,0 +1,15 @@
1
+ export { addPerformanceInstrumentationHandler, addClsInstrumentationHandler, addTtfbInstrumentationHandler, addLcpInstrumentationHandler, addInpInstrumentationHandler, } from './metrics/instrument';
2
+ export { addPerformanceEntries, addWebVitalsToSpan, startTrackingInteractions, startTrackingLongTasks, startTrackingLongAnimationFrames, startTrackingWebVitals, startTrackingINP, registerInpInteractionListener, } from './metrics/browserMetrics';
3
+ export { elementTimingIntegration, startTrackingElementTiming } from './metrics/elementTiming';
4
+ export { extractNetworkProtocol } from './metrics/utils';
5
+ export { trackClsAsSpan, trackInpAsSpan, trackLcpAsSpan } from './metrics/webVitalSpans';
6
+ export { addClickKeypressInstrumentationHandler } from './instrument/dom';
7
+ export { addHistoryInstrumentationHandler } from './instrument/history';
8
+ export { fetch, setTimeout, clearCachedImplementation, getNativeImplementation } from './getNativeImplementation';
9
+ export { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY } from './instrument/xhr';
10
+ export { getBodyString, getFetchRequestArgBody, serializeFormData, parseXhrResponseHeaders } from './networkUtils';
11
+ export { resourceTimingToSpanAttributes } from './metrics/resourceTiming';
12
+ export { htmlTreeAsString } from './htmlTreeAsString';
13
+ export { isElement } from './is';
14
+ export type { FetchHint, NetworkMetaWarning, XhrHint } from './types';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,gCAAgC,EAChC,sBAAsB,EACtB,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EAAE,sCAAsC,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAElH,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEnH,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { HandlerDataDom } from '@sentry/core';
2
+ /**
3
+ * Add an instrumentation handler for when a click or a keypress happens.
4
+ *
5
+ * Use at your own risk, this might break without changelog notice, only used internally.
6
+ * @hidden
7
+ */
8
+ export declare function addClickKeypressInstrumentationHandler(handler: (data: HandlerDataDom) => void): void;
9
+ /** Exported for tests only. */
10
+ export declare function instrumentDOM(): void;
11
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../../src/instrument/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAiCnD;;;;;GAKG;AACH,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAIpG;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,IAAI,IAAI,CAuFpC"}
@@ -0,0 +1,15 @@
1
+ import type { HandlerDataHistory } from '@sentry/core';
2
+ /**
3
+ * Add an instrumentation handler for when a fetch request happens.
4
+ * The handler function is called once when the request starts and once when it ends,
5
+ * which can be identified by checking if it has an `endTimestamp`.
6
+ *
7
+ * Use at your own risk, this might break without changelog notice, only used internally.
8
+ * @hidden
9
+ */
10
+ export declare function addHistoryInstrumentationHandler(handler: (data: HandlerDataHistory) => void): void;
11
+ /**
12
+ * Exported just for testing
13
+ */
14
+ export declare function instrumentHistory(): void;
15
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/instrument/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMvD;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAIlG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAmDxC"}
@@ -0,0 +1,14 @@
1
+ import type { HandlerDataXhr } from '@sentry/core';
2
+ export declare const SENTRY_XHR_DATA_KEY = "__sentry_xhr_v3__";
3
+ /**
4
+ * Add an instrumentation handler for when an XHR request happens.
5
+ * The handler function is called once when the request starts and once when it ends,
6
+ * which can be identified by checking if it has an `endTimestamp`.
7
+ *
8
+ * Use at your own risk, this might break without changelog notice, only used internally.
9
+ * @hidden
10
+ */
11
+ export declare function addXhrInstrumentationHandler(handler: (data: HandlerDataXhr) => void): void;
12
+ /** Exported only for tests. */
13
+ export declare function instrumentXHR(): void;
14
+ //# sourceMappingURL=xhr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhr.d.ts","sourceRoot":"","sources":["../../../src/instrument/xhr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,cAAc,CAAC;AAIhF,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAIvD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAI1F;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,IAAI,IAAI,CAkIpC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Checks whether given value's type is an Element instance.
3
+ *
4
+ * Returns false if `Element` is not available in the current runtime.
5
+ */
6
+ export declare function isElement(wat: unknown): boolean;
7
+ //# sourceMappingURL=is.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.d.ts","sourceRoot":"","sources":["../../src/is.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS/C"}
@@ -0,0 +1,116 @@
1
+ import type { Client, Span, SpanAttributes } from '@sentry/core';
2
+ interface StartTrackingWebVitalsOptions {
3
+ /**
4
+ * When `true`, CLS is tracked as a standalone span. When `false`, CLS is
5
+ * recorded as a measurement on the pageload span. When `undefined`, CLS
6
+ * tracking is skipped entirely (e.g. because span streaming handles it).
7
+ */
8
+ recordClsStandaloneSpans: boolean | undefined;
9
+ /**
10
+ * When `true`, LCP is tracked as a standalone span. When `false`, LCP is
11
+ * recorded as a measurement on the pageload span. When `undefined`, LCP
12
+ * tracking is skipped entirely (e.g. because span streaming handles it).
13
+ */
14
+ recordLcpStandaloneSpans: boolean | undefined;
15
+ client: Client;
16
+ }
17
+ /**
18
+ * Start tracking web vitals.
19
+ * The callback returned by this function can be used to stop tracking & ensure all measurements are final & captured.
20
+ *
21
+ * @deprecated this function will be removed and streamlined once we stop supporting standalone v1
22
+ * @returns A function that forces web vitals collection
23
+ */
24
+ export declare function startTrackingWebVitals({ recordClsStandaloneSpans, recordLcpStandaloneSpans, client, }: StartTrackingWebVitalsOptions): () => void;
25
+ /**
26
+ * Start tracking long tasks.
27
+ */
28
+ export declare function startTrackingLongTasks(): void;
29
+ /**
30
+ * Start tracking long animation frames.
31
+ */
32
+ export declare function startTrackingLongAnimationFrames(): void;
33
+ /**
34
+ * Start tracking interaction events.
35
+ */
36
+ export declare function startTrackingInteractions(): void;
37
+ export { registerInpInteractionListener, startTrackingINP } from './inp';
38
+ interface AddPerformanceEntriesOptions {
39
+ /**
40
+ * Resource spans with `op`s matching strings in the array will not be emitted.
41
+ *
42
+ * Default: []
43
+ */
44
+ ignoreResourceSpans: Array<'resouce.script' | 'resource.css' | 'resource.img' | 'resource.other' | string>;
45
+ /**
46
+ * Performance spans created from browser Performance APIs,
47
+ * `performance.mark(...)` nand `performance.measure(...)`
48
+ * with `name`s matching strings in the array will not be emitted.
49
+ *
50
+ * Default: []
51
+ */
52
+ ignorePerformanceApiSpans: Array<string | RegExp>;
53
+ /**
54
+ * Whether span streaming is enabled.
55
+ */
56
+ spanStreamingEnabled?: boolean;
57
+ }
58
+ interface AddWebVitalsToSpanOptions {
59
+ /**
60
+ * Flag to determine if CLS should be recorded as a measurement on the pageload span or
61
+ * sent as a standalone span instead.
62
+ * Sending it as a standalone span will yield more accurate LCP values.
63
+ *
64
+ * Default: `false` for backwards compatibility.
65
+ */
66
+ recordClsOnPageloadSpan: boolean;
67
+ /**
68
+ * Flag to determine if LCP should be recorded as a measurement on the pageload span or
69
+ * sent as a standalone span instead.
70
+ * Sending it as a standalone span will yield more accurate LCP values.
71
+ *
72
+ * Default: `false` for backwards compatibility.
73
+ */
74
+ recordLcpOnPageloadSpan: boolean;
75
+ /**
76
+ * Whether span streaming is enabled.
77
+ */
78
+ spanStreamingEnabled?: boolean;
79
+ }
80
+ /** Add performance related spans to a transaction */
81
+ export declare function addPerformanceEntries(span: Span, options: AddPerformanceEntriesOptions): void;
82
+ /**
83
+ * Writes the collected web vitals (LCP, CLS, INP, TTFB, FP, FCP) onto the pageload span,
84
+ * either as measurements/attributes (v1) or as web vital attributes (span streaming).
85
+ *
86
+ * This should be called when the pageload span ends, after the web vitals have been finalized.
87
+ * It is a no-op for non-pageload spans, but always resets the collected web vital state so it
88
+ * doesn't leak into a subsequent navigation.
89
+ */
90
+ export declare function addWebVitalsToSpan(span: Span, options: AddWebVitalsToSpanOptions): void;
91
+ /**
92
+ * Create measure related spans.
93
+ * Exported only for tests.
94
+ */
95
+ export declare function _addMeasureSpans(span: Span, entry: PerformanceEntry, startTime: number, duration: number, timeOrigin: number, ignorePerformanceApiSpans: AddPerformanceEntriesOptions['ignorePerformanceApiSpans']): void;
96
+ /**
97
+ * Instrument navigation entries
98
+ * exported only for tests
99
+ */
100
+ export declare function _addNavigationSpans(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void;
101
+ /**
102
+ * Create resource-related spans.
103
+ * Exported only for tests.
104
+ */
105
+ export declare function _addResourceSpans(span: Span, entry: PerformanceResourceTiming, resourceUrl: string, startTime: number, duration: number, timeOrigin: number, ignoredResourceSpanOps?: Array<string>): void;
106
+ type ExperimentalResourceTimingProperty = 'renderBlockingStatus' | 'deliveryType' | 'responseStatus';
107
+ /**
108
+ * Use this to set any attributes we can take directly form the PerformanceResourceTiming entry.
109
+ *
110
+ * This is just a mapping function for entry->attribute to keep bundle-size minimal.
111
+ * Experimental properties are also accepted (see {@link ExperimentalResourceTimingProperty}).
112
+ * Assumes that all entry properties might be undefined for browser-specific differences.
113
+ * Only accepts string and number values for now and also sets 0-values.
114
+ */
115
+ export declare function _setResourceRequestAttributes(entry: Partial<PerformanceResourceTiming> & Partial<Record<ExperimentalResourceTimingProperty, number | string>>, attributes: SpanAttributes, properties: [keyof PerformanceResourceTiming | ExperimentalResourceTimingProperty, string][]): void;
116
+ //# sourceMappingURL=browserMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserMetrics.d.ts","sourceRoot":"","sources":["../../../src/metrics/browserMetrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAgB,IAAI,EAAE,cAAc,EAAwC,MAAM,cAAc,CAAC;AA4ErH,UAAU,6BAA6B;IACrC;;;;OAIG;IACH,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,wBAAwB,EACxB,wBAAwB,EACxB,MAAM,GACP,EAAE,6BAA6B,GAAG,MAAM,IAAI,CAgC5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CA8B7C;AAED;;GAEG;AACH,wBAAgB,gCAAgC,IAAI,IAAI,CAsDvD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA6BhD;AAED,OAAO,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AA0DzE,UAAU,4BAA4B;IACpC;;;;OAIG;IACH,mBAAmB,EAAE,KAAK,CAAC,gBAAgB,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG,MAAM,CAAC,CAAC;IAE3G;;;;;;OAMG;IACH,yBAAyB,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAElD;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,UAAU,yBAAyB;IACjC;;;;;;OAMG;IACH,uBAAuB,EAAE,OAAO,CAAC;IAEjC;;;;;;OAMG;IACH,uBAAuB,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,GAAG,IAAI,CA4D7F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAmEvF;AA0BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,yBAAyB,EAAE,4BAA4B,CAAC,2BAA2B,CAAC,GACnF,IAAI,CA+CN;AA8CD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAS5G;AAmFD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,yBAAyB,EAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,sBAAsB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GACrC,IAAI,CAqDN;AAgGD,KAAK,kCAAkC,GACnC,sBAAsB,GACtB,cAAc,GAKd,gBAAgB,CAAC;AAErB;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,kCAAkC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EAChH,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,CAAC,MAAM,yBAAyB,GAAG,kCAAkC,EAAE,MAAM,CAAC,EAAE,GAC3F,IAAI,CAUN"}