@newrelic/browser-agent 1.237.1 → 1.239.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 (307) hide show
  1. package/dist/cjs/common/config/state/init.js +21 -13
  2. package/dist/cjs/common/config/state/runtime.js +0 -4
  3. package/dist/cjs/common/constants/env.cdn.js +1 -1
  4. package/dist/cjs/common/constants/env.npm.js +1 -1
  5. package/dist/cjs/common/constants/runtime.js +3 -3
  6. package/dist/cjs/common/constants/shared-channel.js +3 -1
  7. package/dist/cjs/common/deny-list/deny-list.js +3 -9
  8. package/dist/cjs/common/drain/drain.js +1 -1
  9. package/dist/cjs/common/event-emitter/contextual-ee.js +24 -32
  10. package/dist/cjs/common/event-emitter/event-context.js +12 -0
  11. package/dist/cjs/common/harvest/harvest-scheduler.js +2 -4
  12. package/dist/cjs/common/harvest/harvest.js +4 -7
  13. package/dist/cjs/common/ids/bundle-id.js +19 -0
  14. package/dist/cjs/common/serialize/bel-serializer.js +1 -1
  15. package/dist/cjs/common/session/session-entity.js +16 -12
  16. package/dist/cjs/common/storage/first-party-cookies.js +5 -4
  17. package/dist/cjs/common/storage/local-storage.js +3 -2
  18. package/dist/cjs/common/timer/interaction-timer.js +14 -6
  19. package/dist/cjs/common/timing/nav-timing.js +1 -1
  20. package/dist/cjs/common/unload/eol.js +4 -30
  21. package/dist/cjs/common/util/feature-flags.js +14 -15
  22. package/dist/cjs/common/util/invoke.js +3 -1
  23. package/dist/cjs/common/util/obfuscate.js +3 -5
  24. package/dist/cjs/common/util/traverse.js +1 -0
  25. package/dist/cjs/common/window/page-visibility.js +1 -2
  26. package/dist/cjs/common/wrap/wrap-events.js +3 -2
  27. package/dist/cjs/common/wrap/wrap-fetch.js +1 -3
  28. package/dist/cjs/common/wrap/wrap-function.js +15 -46
  29. package/dist/cjs/common/wrap/wrap-jsonp.js +1 -1
  30. package/dist/cjs/common/wrap/wrap-mutation.js +1 -2
  31. package/dist/cjs/common/wrap/wrap-promise.js +2 -3
  32. package/dist/cjs/common/wrap/wrap-xhr.js +23 -27
  33. package/dist/cjs/features/ajax/aggregate/index.js +5 -7
  34. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +8 -12
  35. package/dist/cjs/features/ajax/instrument/index.js +66 -24
  36. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +0 -1
  37. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  38. package/dist/cjs/features/jserrors/aggregate/index.js +4 -5
  39. package/dist/cjs/features/metrics/aggregate/framework-detection.js +103 -7
  40. package/dist/cjs/features/metrics/aggregate/index.js +20 -37
  41. package/dist/cjs/features/metrics/instrument/index.js +0 -2
  42. package/dist/cjs/features/page_action/aggregate/index.js +17 -19
  43. package/dist/cjs/features/page_view_event/aggregate/index.js +1 -2
  44. package/dist/cjs/features/page_view_event/instrument/index.js +4 -2
  45. package/dist/cjs/features/page_view_timing/aggregate/index.js +6 -7
  46. package/dist/cjs/features/session_replay/aggregate/index.js +5 -3
  47. package/dist/cjs/features/session_trace/aggregate/index.js +22 -16
  48. package/dist/cjs/features/spa/aggregate/index.js +14 -20
  49. package/dist/cjs/features/spa/aggregate/interaction.js +0 -2
  50. package/dist/cjs/features/spa/aggregate/serializer.js +1 -1
  51. package/dist/cjs/features/utils/aggregate-base.js +4 -0
  52. package/dist/cjs/features/utils/handler-cache.js +3 -1
  53. package/dist/cjs/features/utils/instrument-base.js +24 -6
  54. package/dist/cjs/loaders/agent-base.js +23 -0
  55. package/dist/cjs/loaders/agent.js +7 -7
  56. package/dist/cjs/loaders/api/api.js +34 -4
  57. package/dist/cjs/loaders/api/apiAsync.js +19 -20
  58. package/dist/cjs/loaders/api/interaction-types.js +11 -4
  59. package/dist/cjs/loaders/configure/configure.js +3 -0
  60. package/dist/cjs/loaders/micro-agent.js +20 -3
  61. package/dist/esm/common/config/state/init.js +21 -13
  62. package/dist/esm/common/config/state/runtime.js +0 -4
  63. package/dist/esm/common/constants/env.cdn.js +1 -1
  64. package/dist/esm/common/constants/env.npm.js +1 -1
  65. package/dist/esm/common/constants/runtime.js +1 -1
  66. package/dist/esm/common/constants/shared-channel.js +3 -1
  67. package/dist/esm/common/deny-list/deny-list.js +3 -9
  68. package/dist/esm/common/drain/drain.js +1 -1
  69. package/dist/esm/common/event-emitter/contextual-ee.js +22 -29
  70. package/dist/esm/common/event-emitter/event-context.js +5 -0
  71. package/dist/esm/common/harvest/harvest-scheduler.js +2 -4
  72. package/dist/esm/common/harvest/harvest.js +4 -7
  73. package/dist/esm/common/ids/bundle-id.js +13 -0
  74. package/dist/esm/common/serialize/bel-serializer.js +1 -1
  75. package/dist/esm/common/session/session-entity.js +16 -12
  76. package/dist/esm/common/storage/first-party-cookies.js +5 -4
  77. package/dist/esm/common/storage/local-storage.js +3 -2
  78. package/dist/esm/common/timer/interaction-timer.js +14 -6
  79. package/dist/esm/common/timing/nav-timing.js +1 -1
  80. package/dist/esm/common/unload/eol.js +5 -31
  81. package/dist/esm/common/util/feature-flags.js +14 -15
  82. package/dist/esm/common/util/invoke.js +3 -1
  83. package/dist/esm/common/util/obfuscate.js +3 -5
  84. package/dist/esm/common/util/traverse.js +1 -0
  85. package/dist/esm/common/window/page-visibility.js +1 -2
  86. package/dist/esm/common/wrap/wrap-events.js +4 -3
  87. package/dist/esm/common/wrap/wrap-fetch.js +2 -4
  88. package/dist/esm/common/wrap/wrap-function.js +15 -44
  89. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  90. package/dist/esm/common/wrap/wrap-mutation.js +2 -3
  91. package/dist/esm/common/wrap/wrap-promise.js +3 -4
  92. package/dist/esm/common/wrap/wrap-xhr.js +23 -27
  93. package/dist/esm/features/ajax/aggregate/index.js +5 -7
  94. package/dist/esm/features/ajax/instrument/distributed-tracing.js +8 -12
  95. package/dist/esm/features/ajax/instrument/index.js +67 -25
  96. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +0 -1
  97. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  98. package/dist/esm/features/jserrors/aggregate/index.js +4 -5
  99. package/dist/esm/features/metrics/aggregate/framework-detection.js +103 -7
  100. package/dist/esm/features/metrics/aggregate/index.js +22 -39
  101. package/dist/esm/features/metrics/instrument/index.js +1 -3
  102. package/dist/esm/features/page_action/aggregate/index.js +17 -19
  103. package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
  104. package/dist/esm/features/page_view_event/instrument/index.js +4 -2
  105. package/dist/esm/features/page_view_timing/aggregate/index.js +7 -8
  106. package/dist/esm/features/session_replay/aggregate/index.js +4 -2
  107. package/dist/esm/features/session_trace/aggregate/index.js +22 -16
  108. package/dist/esm/features/spa/aggregate/index.js +14 -20
  109. package/dist/esm/features/spa/aggregate/interaction.js +0 -2
  110. package/dist/esm/features/spa/aggregate/serializer.js +1 -1
  111. package/dist/esm/features/utils/aggregate-base.js +4 -0
  112. package/dist/esm/features/utils/handler-cache.js +3 -1
  113. package/dist/esm/features/utils/instrument-base.js +24 -6
  114. package/dist/esm/loaders/agent-base.js +23 -0
  115. package/dist/esm/loaders/agent.js +7 -7
  116. package/dist/esm/loaders/api/api.js +34 -4
  117. package/dist/esm/loaders/api/apiAsync.js +19 -20
  118. package/dist/esm/loaders/api/interaction-types.js +11 -4
  119. package/dist/esm/loaders/configure/configure.js +3 -0
  120. package/dist/esm/loaders/features/enabled-features.js +1 -1
  121. package/dist/esm/loaders/micro-agent.js +21 -4
  122. package/dist/types/common/config/state/init.d.ts.map +1 -1
  123. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  124. package/dist/types/common/constants/runtime.d.ts +1 -1
  125. package/dist/types/common/constants/runtime.d.ts.map +1 -1
  126. package/dist/types/common/event-emitter/contextual-ee.d.ts +22 -2
  127. package/dist/types/common/event-emitter/contextual-ee.d.ts.map +1 -1
  128. package/dist/types/common/event-emitter/event-context.d.ts +5 -0
  129. package/dist/types/common/event-emitter/event-context.d.ts.map +1 -0
  130. package/dist/types/common/event-emitter/register-handler.d.ts +1 -1
  131. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  132. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  133. package/dist/types/common/ids/bundle-id.d.ts +5 -0
  134. package/dist/types/common/ids/bundle-id.d.ts.map +1 -0
  135. package/dist/types/common/session/session-entity.d.ts +12 -15
  136. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  137. package/dist/types/common/storage/first-party-cookies.d.ts +1 -1
  138. package/dist/types/common/storage/first-party-cookies.d.ts.map +1 -1
  139. package/dist/types/common/storage/local-storage.d.ts.map +1 -1
  140. package/dist/types/common/timer/interaction-timer.d.ts +3 -0
  141. package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
  142. package/dist/types/common/unload/eol.d.ts +1 -2
  143. package/dist/types/common/unload/eol.d.ts.map +1 -1
  144. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  145. package/dist/types/common/util/obfuscate.d.ts.map +1 -1
  146. package/dist/types/common/util/traverse.d.ts.map +1 -1
  147. package/dist/types/common/window/nreum.d.ts +2 -2
  148. package/dist/types/common/window/page-visibility.d.ts.map +1 -1
  149. package/dist/types/common/wrap/wrap-events.d.ts.map +1 -1
  150. package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -1
  151. package/dist/types/common/wrap/wrap-function.d.ts +1 -19
  152. package/dist/types/common/wrap/wrap-function.d.ts.map +1 -1
  153. package/dist/types/common/wrap/wrap-mutation.d.ts.map +1 -1
  154. package/dist/types/common/wrap/wrap-promise.d.ts.map +1 -1
  155. package/dist/types/common/wrap/wrap-xhr.d.ts.map +1 -1
  156. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  157. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts +1 -1
  158. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -1
  159. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  160. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -1
  161. package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
  162. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  163. package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -1
  164. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  165. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
  166. package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
  167. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  168. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  169. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  170. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  171. package/dist/types/features/session_trace/aggregate/index.d.ts +5 -0
  172. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  173. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  174. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
  175. package/dist/types/features/utils/aggregate-base.d.ts +1 -0
  176. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  177. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  178. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  179. package/dist/types/loaders/agent-base.d.ts +15 -0
  180. package/dist/types/loaders/agent-base.d.ts.map +1 -1
  181. package/dist/types/loaders/agent.d.ts +1 -1
  182. package/dist/types/loaders/agent.d.ts.map +1 -1
  183. package/dist/types/loaders/api/api.d.ts +7 -0
  184. package/dist/types/loaders/api/api.d.ts.map +1 -1
  185. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
  186. package/dist/types/loaders/api/interaction-types.d.ts +18 -7
  187. package/dist/types/loaders/api/interaction-types.d.ts.map +1 -1
  188. package/dist/types/loaders/configure/configure.d.ts +2 -0
  189. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  190. package/dist/types/loaders/features/features.d.ts +9 -9
  191. package/dist/types/loaders/micro-agent.d.ts +7 -1
  192. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  193. package/package.json +62 -38
  194. package/src/common/aggregate/aggregator.test.js +107 -0
  195. package/src/common/config/state/configurable.test.js +73 -0
  196. package/src/common/config/state/info.test.js +31 -0
  197. package/src/common/config/state/init.js +13 -12
  198. package/src/common/config/state/init.test.js +28 -0
  199. package/src/common/config/state/loader-config.test.js +21 -0
  200. package/src/common/config/state/runtime.js +0 -2
  201. package/src/common/config/state/runtime.test.js +21 -0
  202. package/src/common/constants/__mocks__/runtime.js +1 -1
  203. package/src/common/constants/runtime.js +1 -1
  204. package/src/common/constants/runtime.test.js +2 -2
  205. package/src/common/constants/shared-channel.js +1 -1
  206. package/src/common/deny-list/deny-list.js +3 -11
  207. package/src/common/deny-list/deny-list.test.js +103 -30
  208. package/src/common/drain/drain.js +1 -1
  209. package/src/common/drain/drain.test.js +74 -0
  210. package/src/common/event-emitter/{contextual-ee.test.js → contextual-ee.component-test.js} +15 -32
  211. package/src/common/event-emitter/contextual-ee.js +26 -37
  212. package/src/common/event-emitter/event-context.js +5 -0
  213. package/src/common/harvest/harvest-scheduler.js +2 -5
  214. package/src/common/harvest/harvest-scheduler.test.js +2 -6
  215. package/src/common/harvest/harvest.js +4 -7
  216. package/src/common/harvest/harvest.test.js +1 -3
  217. package/src/common/ids/__mocks__/bundle-id.js +2 -0
  218. package/src/common/ids/__mocks__/unique-id.js +17 -0
  219. package/src/common/ids/bundle-id.js +13 -0
  220. package/src/common/ids/id.test.js +6 -6
  221. package/src/common/serialize/bel-serializer.js +1 -1
  222. package/src/common/session/session-entity.component-test.js +3 -2
  223. package/src/common/session/session-entity.js +11 -9
  224. package/src/common/storage/first-party-cookies.js +5 -4
  225. package/src/common/storage/local-storage.js +3 -2
  226. package/src/common/timer/interaction-timer.component-test.js +52 -7
  227. package/src/common/timer/interaction-timer.js +15 -6
  228. package/src/common/timer/timer.test.js +0 -1
  229. package/src/common/timing/nav-timing.js +1 -1
  230. package/src/common/unload/eol.js +5 -31
  231. package/src/common/url/__mocks__/parse-url.js +15 -0
  232. package/src/common/url/{encode.component-test.js → encode.test.js} +1 -0
  233. package/src/common/util/__mocks__/get-or-set.js +5 -0
  234. package/src/common/util/__mocks__/invoke.js +1 -0
  235. package/src/common/util/data-size.test.js +0 -1
  236. package/src/common/util/feature-flags.js +15 -17
  237. package/src/common/util/feature-flags.test.js +4 -8
  238. package/src/common/util/invoke.js +1 -1
  239. package/src/common/util/obfuscate.js +3 -5
  240. package/src/common/util/submit-data.test.js +1 -1
  241. package/src/common/util/traverse.js +1 -0
  242. package/src/common/window/__mocks__/nreum.js +12 -0
  243. package/src/common/window/page-visibility.js +1 -2
  244. package/src/common/wrap/wrap-events.js +4 -3
  245. package/src/common/wrap/wrap-fetch.js +2 -4
  246. package/src/common/wrap/wrap-function.js +16 -44
  247. package/src/common/wrap/wrap-jsonp.js +1 -1
  248. package/src/common/wrap/wrap-mutation.js +2 -3
  249. package/src/common/wrap/{wrap-promise.test.js → wrap-promise.component-test.js} +2 -32
  250. package/src/common/wrap/wrap-promise.js +3 -4
  251. package/src/common/wrap/wrap-xhr.js +24 -28
  252. package/src/features/ajax/aggregate/index.js +5 -7
  253. package/src/features/ajax/instrument/distributed-tracing.js +8 -12
  254. package/src/features/ajax/instrument/distributed-tracing.test.js +375 -0
  255. package/src/features/ajax/instrument/index.js +62 -27
  256. package/src/features/jserrors/aggregate/canonical-function-name.js +0 -2
  257. package/src/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  258. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
  259. package/src/features/jserrors/aggregate/index.js +4 -5
  260. package/src/features/metrics/aggregate/framework-detection.js +129 -8
  261. package/src/features/metrics/aggregate/framework-detection.test.js +213 -82
  262. package/src/features/metrics/aggregate/index.js +22 -45
  263. package/src/features/metrics/instrument/index.js +1 -3
  264. package/src/features/page_action/aggregate/index.js +12 -13
  265. package/src/features/page_view_event/aggregate/index.js +1 -2
  266. package/src/features/page_view_event/instrument/index.js +2 -2
  267. package/src/features/page_view_timing/aggregate/index.js +7 -8
  268. package/src/features/session_replay/aggregate/index.component-test.js +3 -15
  269. package/src/features/session_replay/aggregate/index.js +4 -2
  270. package/src/features/session_trace/aggregate/index.js +22 -16
  271. package/src/features/spa/aggregate/index.js +14 -20
  272. package/src/features/spa/aggregate/interaction.js +0 -2
  273. package/src/features/spa/aggregate/serializer.js +1 -1
  274. package/src/features/utils/aggregate-base.js +5 -0
  275. package/src/features/utils/aggregate-base.test.js +2 -1
  276. package/src/features/utils/handler-cache.js +3 -2
  277. package/src/features/utils/instrument-base.js +25 -6
  278. package/src/features/utils/instrument-base.test.js +2 -2
  279. package/src/loaders/agent-base.js +23 -0
  280. package/src/loaders/agent.js +7 -7
  281. package/src/loaders/api/api.component-test.js +45 -0
  282. package/src/loaders/api/api.js +34 -4
  283. package/src/loaders/api/api.test.js +85 -0
  284. package/src/loaders/api/apiAsync.js +19 -20
  285. package/src/loaders/api/apiAsync.test.js +17 -0
  286. package/src/loaders/api/interaction-types.js +11 -4
  287. package/src/loaders/configure/configure.js +3 -0
  288. package/src/loaders/features/enabled-features.js +1 -1
  289. package/src/loaders/micro-agent.js +22 -4
  290. package/dist/cjs/features/metrics/aggregate/endpoint-map.js +0 -14
  291. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +0 -14
  292. package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +0 -53
  293. package/dist/esm/features/metrics/aggregate/endpoint-map.js +0 -7
  294. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  295. package/dist/esm/features/metrics/aggregate/polyfill-detection.js +0 -47
  296. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts +0 -8
  297. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts.map +0 -1
  298. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +0 -6
  299. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +0 -1
  300. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +0 -7
  301. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +0 -1
  302. package/src/features/metrics/aggregate/endpoint-map.js +0 -7
  303. package/src/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  304. package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -16
  305. package/src/features/metrics/aggregate/polyfill-detection.js +0 -48
  306. package/src/features/metrics/aggregate/polyfill-detection.test.js +0 -163
  307. /package/src/common/url/{protocol.component-test.js → protocol.test.js} +0 -0
@@ -1,3 +1,5 @@
1
+ /* eslint-disable n/handle-callback-err */
2
+
1
3
  import { warn } from '../common/util/console'
2
4
 
3
5
  export class AgentBase {
@@ -51,6 +53,18 @@ export class AgentBase {
51
53
  warn('Call to agent api setUserId failed. The js errors feature is not currently initialized.')
52
54
  }
53
55
 
56
+ /**
57
+ * Adds a user-defined application version string to subsequent events on the page.
58
+ * This decorates all payloads with an attribute of `application.version` which is queryable in NR1.
59
+ * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/setapplicationversion/}
60
+ * @param {string|null} value A string identifier for the application version, useful for
61
+ * tying all browser events to a specific release tag. The value parameter does not
62
+ * have to be unique. Passing a null value unsets any existing value.
63
+ */
64
+ setApplicationVersion (value) {
65
+ warn('Call to agent api setApplicationVersion failed. The agent is not currently initialized.')
66
+ }
67
+
54
68
  /**
55
69
  * Allows selective ignoring and grouping of known errors that the browser agent captures.
56
70
  * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/seterrorhandler/}
@@ -78,4 +92,13 @@ export class AgentBase {
78
92
  addRelease (name, id) {
79
93
  warn('Call to agent api addRelease failed. The agent is not currently initialized.')
80
94
  }
95
+
96
+ /**
97
+ * Starts a set of agent features if not running in "autoStart" mode
98
+ * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/start/}
99
+ * @param {string|string[]|undefined} name The feature name(s) to start. If no name(s) are passed, all features will be started
100
+ */
101
+ start (featureNames) {
102
+ warn('Call to agent api addRelease failed. The agent is not currently initialized.')
103
+ }
81
104
  }
@@ -46,7 +46,7 @@ export class Agent extends AgentBase {
46
46
 
47
47
  Object.assign(this, configure(this.agentIdentifier, options, options.loaderType || 'agent'))
48
48
 
49
- this.start()
49
+ this.run()
50
50
  }
51
51
 
52
52
  get config () {
@@ -58,20 +58,20 @@ export class Agent extends AgentBase {
58
58
  }
59
59
  }
60
60
 
61
- start () {
61
+ run () {
62
62
  const NR_FEATURES_REF_NAME = 'features'
63
63
  // Attempt to initialize all the requested features (sequentially in prio order & synchronously), with any failure aborting the whole process.
64
64
  try {
65
65
  const enabledFeatures = getEnabledFeatures(this.agentIdentifier)
66
66
  const featuresToStart = [...this.desiredFeatures]
67
67
  featuresToStart.sort((a, b) => featurePriority[a.featureName] - featurePriority[b.featureName])
68
- featuresToStart.forEach(f => {
68
+ featuresToStart.forEach(InstrumentCtor => {
69
69
  // pageViewEvent must be enabled because RUM calls are not optional. See comment in constructor and PR 428.
70
- if (enabledFeatures[f.featureName] || f.featureName === FEATURE_NAMES.pageViewEvent) {
71
- const dependencies = getFeatureDependencyNames(f.featureName)
70
+ if (enabledFeatures[InstrumentCtor.featureName] || InstrumentCtor.featureName === FEATURE_NAMES.pageViewEvent) {
71
+ const dependencies = getFeatureDependencyNames(InstrumentCtor.featureName)
72
72
  const hasAllDeps = dependencies.every(x => enabledFeatures[x])
73
- if (!hasAllDeps) warn(`${f.featureName} is enabled but one or more dependent features has been disabled (${stringify(dependencies)}). This may cause unintended consequences or missing data...`)
74
- this.features[f.featureName] = new f(this.agentIdentifier, this.sharedAggregator)
73
+ if (!hasAllDeps) warn(`${InstrumentCtor.featureName} is enabled but one or more dependent features has been disabled (${stringify(dependencies)}). This may cause unintended consequences or missing data...`)
74
+ this.features[InstrumentCtor.featureName] = new InstrumentCtor(this.agentIdentifier, this.sharedAggregator)
75
75
  }
76
76
  })
77
77
  gosNREUMInitializedAgents(this.agentIdentifier, this.features, NR_FEATURES_REF_NAME)
@@ -0,0 +1,45 @@
1
+ import { setAPI } from './api'
2
+ import { setInfo, getInfo, setConfiguration } from '../../common/config/config'
3
+
4
+ setInfo('abcd', { licenseKey: '1234', applicationID: '1234' })
5
+ setConfiguration('abcd', {})
6
+ let apiInterface
7
+ beforeEach(() => {
8
+ console.warn = jest.fn()
9
+ apiInterface = setAPI('abcd', true)
10
+ })
11
+
12
+ afterEach(() => {
13
+ jest.restoreAllMocks()
14
+ })
15
+
16
+ describe('api', () => {
17
+ describe('setApplicationVersion', () => {
18
+ test('setApplicationVersion sets and unsets ja with valid values', () => {
19
+ apiInterface.setApplicationVersion('1.2.3')
20
+ expect(getInfo('abcd').jsAttributes).toMatchObject({ 'application.version': '1.2.3' })
21
+
22
+ apiInterface.setApplicationVersion(null)
23
+ expect(getInfo('abcd').jsAttributes).toMatchObject({ })
24
+ })
25
+
26
+ test('setApplicationVersion warns if invalid data is supplied', () => {
27
+ apiInterface.setApplicationVersion(1)
28
+ expect(console.warn).toHaveBeenCalledWith('New Relic: Failed to execute setApplicationVersion. Expected <String | null>, but got <number>.')
29
+
30
+ apiInterface.setApplicationVersion(false)
31
+ expect(console.warn).toHaveBeenCalledWith('New Relic: Failed to execute setApplicationVersion. Expected <String | null>, but got <boolean>.')
32
+
33
+ apiInterface.setApplicationVersion({ version: '1.2.3' })
34
+ expect(console.warn).toHaveBeenCalledWith('New Relic: Failed to execute setApplicationVersion. Expected <String | null>, but got <object>.')
35
+ })
36
+
37
+ test('setApplicationVersion replaces existing data if called twice', () => {
38
+ apiInterface.setApplicationVersion('1.2.3')
39
+ expect(getInfo('abcd').jsAttributes).toMatchObject({ 'application.version': '1.2.3' })
40
+
41
+ apiInterface.setApplicationVersion('4.5.6')
42
+ expect(getInfo('abcd').jsAttributes).toMatchObject({ 'application.version': '4.5.6' })
43
+ })
44
+ })
45
+ })
@@ -21,7 +21,7 @@ export function setTopLevelCallers () {
21
21
  const funcs = [
22
22
  'setErrorHandler', 'finished', 'addToTrace', 'inlineHit', 'addRelease',
23
23
  'addPageAction', 'setCurrentRouteName', 'setPageViewName', 'setCustomAttribute',
24
- 'interaction', 'noticeError', 'setUserId'
24
+ 'interaction', 'noticeError', 'setUserId', 'setApplicationVersion', 'start'
25
25
  ]
26
26
  funcs.forEach(f => {
27
27
  nr[f] = (...args) => caller(f, ...args)
@@ -56,7 +56,7 @@ export function setAPI (agentIdentifier, forceDrain) {
56
56
  var spaPrefix = prefix + 'ixn-'
57
57
 
58
58
  // Setup stub functions that queue calls for later processing.
59
- asyncApiFns.forEach(fnName => apiInterface[fnName] = apiCall(prefix, fnName, true, 'api'))
59
+ asyncApiFns.forEach(fnName => { apiInterface[fnName] = apiCall(prefix, fnName, true, 'api') })
60
60
 
61
61
  apiInterface.addPageAction = apiCall(prefix, 'addPageAction', true, FEATURE_NAMES.pageAction)
62
62
  apiInterface.setCurrentRouteName = apiCall(prefix, 'routeName', true, FEATURE_NAMES.spa)
@@ -109,6 +109,36 @@ export function setAPI (agentIdentifier, forceDrain) {
109
109
  return appendJsAttribute('enduser.id', value, 'setUserId', true)
110
110
  }
111
111
 
112
+ /**
113
+ * Attach the 'applcation.version' attribute onto agent payloads. This may be used in NR queries to group all browser events by a specific customer-defined release.
114
+ * @param {string|null} value - Application version -- if null, will "unset" the value
115
+ * @returns @see apiCall
116
+ */
117
+ apiInterface.setApplicationVersion = function (value) {
118
+ if (!(typeof value === 'string' || value === null)) {
119
+ warn(`Failed to execute setApplicationVersion. Expected <String | null>, but got <${typeof value}>.`)
120
+ return
121
+ }
122
+ return appendJsAttribute('application.version', value, 'setApplicationVersion', false)
123
+ }
124
+
125
+ apiInterface.start = (features) => {
126
+ try {
127
+ const featNames = Object.values(FEATURE_NAMES)
128
+ if (features === undefined) features = featNames
129
+ else {
130
+ features = Array.isArray(features) && features.length ? features : [features]
131
+ if (features.some(f => !featNames.includes(f))) return warn(`Invalid feature name supplied. Acceptable feature names are: ${featNames}`)
132
+ if (!features.includes(FEATURE_NAMES.pageViewEvent)) features.push(FEATURE_NAMES.pageViewEvent)
133
+ }
134
+ features.forEach(feature => {
135
+ instanceEE.emit(`${feature}-opt-in`)
136
+ })
137
+ } catch (err) {
138
+ warn('An unexpected issue occurred', err)
139
+ }
140
+ }
141
+
112
142
  apiInterface.interaction = function () {
113
143
  return new InteractionHandle().get()
114
144
  }
@@ -138,7 +168,7 @@ export function setAPI (agentIdentifier, forceDrain) {
138
168
  }
139
169
  }
140
170
 
141
- void ['actionText', 'setName', 'setAttribute', 'save', 'ignore', 'onEnd', 'getContext', 'end', 'get'].forEach(name => {
171
+ ;['actionText', 'setName', 'setAttribute', 'save', 'ignore', 'onEnd', 'getContext', 'end', 'get'].forEach(name => {
142
172
  InteractionApiProto[name] = apiCall(spaPrefix, name, undefined, FEATURE_NAMES.spa)
143
173
  })
144
174
 
@@ -146,7 +176,7 @@ export function setAPI (agentIdentifier, forceDrain) {
146
176
  return function () {
147
177
  handle(SUPPORTABILITY_METRIC_CHANNEL, ['API/' + name + '/called'], undefined, FEATURE_NAMES.metrics, instanceEE)
148
178
  if (bufferGroup) handle(prefix + name, [now(), ...arguments], notSpa ? null : this, bufferGroup, instanceEE) // no bufferGroup means only the SM is emitted
149
- return notSpa ? void 0 : this
179
+ return notSpa ? undefined : this
150
180
  }
151
181
  }
152
182
 
@@ -0,0 +1,85 @@
1
+ import { setTopLevelCallers, setAPI } from './api'
2
+ import { gosCDN } from '../../common/window/nreum'
3
+
4
+ jest.enableAutomock()
5
+ jest.unmock('./api')
6
+
7
+ describe('setTopLevelCallers', () => {
8
+ beforeEach(() => {
9
+ delete gosCDN().initializedAgents
10
+ })
11
+
12
+ test('adds all api methods', () => {
13
+ setTopLevelCallers()
14
+
15
+ expect(Object.keys(gosCDN()).length).toEqual(14)
16
+ })
17
+
18
+ test('and runs the corresponding fn under every exposed agent', () => {
19
+ let newrelic = gosCDN()
20
+ newrelic.initializedAgents = {
21
+ abcd: { exposed: true, api: { noticeError: jest.fn() } },
22
+ efgh: { exposed: false, api: { noticeError: jest.fn() } },
23
+ ijkl: { exposed: true, api: { noticeError: jest.fn() } }
24
+ }
25
+
26
+ const someArgs = ['wtfish', { bop: 'it' }]
27
+ newrelic.noticeError(...someArgs)
28
+ expect(newrelic.initializedAgents.abcd.api.noticeError).toHaveBeenCalledWith(...someArgs)
29
+ expect(newrelic.initializedAgents.efgh.api.noticeError).not.toHaveBeenCalled()
30
+ expect(newrelic.initializedAgents.ijkl.api.noticeError).toHaveBeenCalledWith(...someArgs)
31
+ })
32
+
33
+ test('fn call returns right number of results based on running agent(s)', () => {
34
+ let newrelic = gosCDN()
35
+ newrelic.initializedAgents = {
36
+ abcd: { exposed: true, api: { interaction: jest.fn(() => 'duck') } }
37
+ }
38
+ let ret = newrelic.interaction()
39
+ expect(ret).toEqual('duck')
40
+
41
+ newrelic.initializedAgents.efgh = { exposed: true, api: { interaction: jest.fn(() => 'truck') } }
42
+ ret = newrelic.interaction()
43
+ expect(ret).toEqual(['duck', 'truck'])
44
+ })
45
+ })
46
+
47
+ jest.unmock('../../common/event-emitter/contextual-ee')
48
+ jest.mock('../../common/constants/runtime', () => {
49
+ return {
50
+ __esModule: true,
51
+ isBrowserScope: false
52
+ }
53
+ })
54
+
55
+ describe('setAPI', () => {
56
+ test('also adds all api methods', () => {
57
+ let apiI = setAPI('abcd', true)
58
+
59
+ expect(Object.keys(apiI).length).toEqual(14)
60
+ for (const k of Object.keys(apiI)) { expect(apiI[k]).toBeInstanceOf(Function) }
61
+ })
62
+
63
+ test('sets up spa interaction api prototype/handle', () => {
64
+ let apiI = setAPI('abcd', true)
65
+ let interactionProto = Object.getPrototypeOf(apiI.interaction())
66
+
67
+ expect(Object.keys(interactionProto).length).toEqual(10)
68
+ for (const k of Object.keys(interactionProto)) { expect(interactionProto[k]).toBeInstanceOf(Function) }
69
+ })
70
+
71
+ test('calls asyncApi setAPI as well', async () => {
72
+ jest.resetModules()
73
+ let setApiCalled
74
+ let asyncSetApi = new Promise(resolve => { setApiCalled = resolve })
75
+ jest.doMock('./apiAsync', () => {
76
+ return {
77
+ __esModule: true,
78
+ setAPI: jest.fn(id => setApiCalled(id))
79
+ }
80
+ })
81
+
82
+ setAPI('abcd', true)
83
+ await expect(asyncSetApi).resolves.toBe('abcd')
84
+ })
85
+ })
@@ -16,10 +16,10 @@ export function setAPI (agentIdentifier) {
16
16
 
17
17
  var api = {
18
18
  finished: single(finished),
19
- setErrorHandler: setErrorHandler,
20
- addToTrace: addToTrace,
21
- inlineHit: inlineHit,
22
- addRelease: addRelease
19
+ setErrorHandler,
20
+ addToTrace,
21
+ inlineHit,
22
+ addRelease
23
23
  }
24
24
 
25
25
  // Hook all of the api functions up to the queues/stubs created in loader/api.js
@@ -49,33 +49,32 @@ export function setAPI (agentIdentifier) {
49
49
  handle('bstApi', [report], undefined, FEATURE_NAMES.sessionTrace, instanceEE)
50
50
  }
51
51
 
52
- // NREUM.inlineHit(request_name, queue_time, app_time, total_be_time, dom_time, fe_time)
52
+ // NREUM.inlineHit(requestName, queueTime, appTime, totalBackEndTime, domTime, frontEndTime)
53
53
  //
54
- // request_name - the 'web page' name or service name
55
- // queue_time - the amount of time spent in the app tier queue
56
- // app_time - the amount of time spent in the application code
57
- // total_be_time - the total roundtrip time of the remote service call
58
- // dom_time - the time spent processing the result of the service call (or user defined)
59
- // fe_time - the time spent rendering the result of the service call (or user defined)
60
- function inlineHit (t, request_name, queue_time, app_time, total_be_time, dom_time, fe_time) {
54
+ // requestName - the 'web page' name or service name
55
+ // queueTime - the amount of time spent in the app tier queue
56
+ // appTime - the amount of time spent in the application code
57
+ // totalBackEndTime - the total roundtrip time of the remote service call
58
+ // domTime - the time spent processing the result of the service call (or user defined)
59
+ // frontEndTime - the time spent rendering the result of the service call (or user defined)
60
+ function inlineHit (t, requestName, queueTime, appTime, totalBackEndTime, domTime, frontEndTime) {
61
61
  if (!isBrowserScope) return
62
62
 
63
- request_name = window.encodeURIComponent(request_name)
63
+ requestName = window.encodeURIComponent(requestName)
64
64
  cycle += 1
65
65
 
66
66
  const agentInfo = getInfo(agentIdentifier)
67
- const agentRuntime = getRuntime(agentIdentifier)
68
67
  if (!agentInfo.beacon) return
69
68
 
70
69
  var url = scheme + '://' + agentInfo.beacon + '/1/' + agentInfo.licenseKey
71
70
 
72
71
  url += '?a=' + agentInfo.applicationID + '&'
73
- url += 't=' + request_name + '&'
74
- url += 'qt=' + ~~queue_time + '&'
75
- url += 'ap=' + ~~app_time + '&'
76
- url += 'be=' + ~~total_be_time + '&'
77
- url += 'dc=' + ~~dom_time + '&'
78
- url += 'fe=' + ~~fe_time + '&'
72
+ url += 't=' + requestName + '&'
73
+ url += 'qt=' + ~~queueTime + '&'
74
+ url += 'ap=' + ~~appTime + '&'
75
+ url += 'be=' + ~~totalBackEndTime + '&'
76
+ url += 'dc=' + ~~domTime + '&'
77
+ url += 'fe=' + ~~frontEndTime + '&'
79
78
  url += 'c=' + cycle
80
79
 
81
80
  submitData.xhr({ url })
@@ -0,0 +1,17 @@
1
+ import { setAPI } from './apiAsync'
2
+ import * as register from '../../common/event-emitter/register-handler'
3
+
4
+ jest.enableAutomock()
5
+ jest.unmock('./apiAsync')
6
+ jest.unmock('../../common/event-emitter/contextual-ee')
7
+
8
+ test('setAPI registers all async methods', () => {
9
+ let callSpy = jest.spyOn(register, 'registerHandler')
10
+ setAPI('abcd')
11
+
12
+ expect(callSpy).toHaveBeenCalledTimes(5)
13
+ for (let i = 0; i < 5; i++) {
14
+ expect(callSpy.mock.calls[i][0].startsWith('api-')).toBeTruthy()
15
+ expect(callSpy.mock.calls[i][1]).toBeInstanceOf(Function)
16
+ }
17
+ })
@@ -6,7 +6,7 @@
6
6
  * @property {getContext} getContext
7
7
  * @property {ignore} ignore
8
8
  * @property {onEnd} onEnd
9
- * @property {onEnd} save
9
+ * @property {save} save
10
10
  * @property {setAttribute} setAttribute
11
11
  * @property {setName} setName
12
12
  */
@@ -24,8 +24,8 @@
24
24
  * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/createtracer/}
25
25
  * @callback createTracer
26
26
  * @param {string} name This will be used as the name of the tracer.
27
- * @param {string} [callback] A callback that contains the synchronous work to run at the end of the async work. To execute this callback, call the wrapper function returned using createTracer().
28
- * @returns {Function} Returns a method that wraps the original callback. When this method is invoked, it calls the original callback and ends the async timing.
27
+ * @param {(...args: any[]) => any} [callback] A callback that contains the synchronous work to run at the end of the async work. To execute this callback, call the wrapper function returned using createTracer().
28
+ * @returns {(...args: any[]) => any} Returns a method that wraps the original callback. When this method is invoked, it calls the original callback and ends the async timing.
29
29
  */
30
30
 
31
31
  /**
@@ -43,6 +43,13 @@
43
43
  * @returns {InteractionInstance} Returns the same interaction object allowing method chaining.
44
44
  */
45
45
 
46
+ /**
47
+ * Overrides other SPA save() calls; ignores an interaction so it is not saved or sent to New Relic.
48
+ * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/ignore/}
49
+ * @callback ignore
50
+ * @returns {InteractionInstance} Returns the same interaction object allowing method chaining.
51
+ */
52
+
46
53
  /**
47
54
  * Change the values associated with a SPA interaction before the interaction is saved.
48
55
  * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/onend/}
@@ -63,7 +70,7 @@
63
70
  * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/setattribute/}
64
71
  * @callback setAttribute
65
72
  * @param {string} key Used as the attribute name on the BrowserInteraction event.
66
- * @param {any} key Used as the attribute value on the BrowserInteraction event. This can be a string, number, boolean, or object. If it is an object, New Relic serializes it to a JSON string.
73
+ * @param {any} value Used as the attribute value on the BrowserInteraction event. This can be a string, number, boolean, or object. If it is an object, New Relic serializes it to a JSON string.
67
74
  * @returns {InteractionInstance} Returns the same interaction object allowing method chaining.
68
75
  */
69
76
 
@@ -5,15 +5,18 @@ import { activatedFeatures } from '../../common/util/feature-flags'
5
5
  import { isWorkerScope } from '../../common/constants/runtime'
6
6
 
7
7
  export function configure (agentIdentifier, opts = {}, loaderType, forceDrain) {
8
+ // eslint-disable-next-line camelcase
8
9
  let { init, info, loader_config, runtime = { loaderType }, exposed = true } = opts
9
10
  const nr = gosCDN()
10
11
  if (!info) {
11
12
  init = nr.init
12
13
  info = nr.info
14
+ // eslint-disable-next-line camelcase
13
15
  loader_config = nr.loader_config
14
16
  }
15
17
 
16
18
  setConfiguration(agentIdentifier, init || {})
19
+ // eslint-disable-next-line camelcase
17
20
  setLoaderConfig(agentIdentifier, loader_config || {})
18
21
 
19
22
  info.jsAttributes ??= {}
@@ -1,5 +1,5 @@
1
1
  import { FEATURE_NAMES } from './features'
2
- import { getConfigurationValue, getRuntime } from '../../common/config/config'
2
+ import { getConfigurationValue } from '../../common/config/config'
3
3
 
4
4
  const featureNames = Object.values(FEATURE_NAMES)
5
5
 
@@ -6,7 +6,7 @@ import { configure } from './configure/configure'
6
6
  import { Aggregator } from '../common/aggregate/aggregator'
7
7
  import { gosNREUMInitializedAgents } from '../common/window/nreum'
8
8
  import { generateRandomHexString } from '../common/ids/unique-id'
9
- import { getConfiguration, getInfo, getLoaderConfig, getRuntime } from '../common/config/config'
9
+ import { getConfiguration, getConfigurationValue, getInfo, getLoaderConfig, getRuntime } from '../common/config/config'
10
10
  import { FEATURE_NAMES } from './features/features'
11
11
  import { warn } from '../common/util/console'
12
12
  import { onWindowLoad } from '../common/window/load'
@@ -37,7 +37,13 @@ export class MicroAgent extends AgentBase {
37
37
 
38
38
  Object.assign(this, configure(this.agentIdentifier, { ...options, runtime: { isolatedBacklog: true } }, options.loaderType || 'micro-agent'))
39
39
 
40
- this.start()
40
+ /**
41
+ * Starts a set of agent features if not running in "autoStart" mode
42
+ * {@link https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/start/}
43
+ * @param {string|string[]|undefined} name The feature name(s) to start. If no name(s) are passed, all features will be started
44
+ */
45
+ this.start = features => this.run(features)
46
+ this.run(nonAutoFeatures.filter(featureName => getConfigurationValue(agentIdentifier, `${featureName}.autoStart`)))
41
47
  }
42
48
 
43
49
  get config () {
@@ -49,7 +55,19 @@ export class MicroAgent extends AgentBase {
49
55
  }
50
56
  }
51
57
 
52
- start () {
58
+ run (features) {
59
+ try {
60
+ const featNames = nonAutoFeatures
61
+ if (features === undefined) features = featNames
62
+ else {
63
+ features = Array.isArray(features) && features.length ? features : [features]
64
+ if (features.some(f => !featNames.includes(f))) return warn(`Invalid feature name supplied. Acceptable feature names are: ${featNames}`)
65
+ if (!features.includes(FEATURE_NAMES.pageViewEvent)) features.push(FEATURE_NAMES.pageViewEvent)
66
+ }
67
+ } catch (err) {
68
+ warn('An unexpected issue occurred', err)
69
+ }
70
+
53
71
  try {
54
72
  const enabledFeatures = getEnabledFeatures(this.agentIdentifier)
55
73
 
@@ -63,7 +81,7 @@ export class MicroAgent extends AgentBase {
63
81
  onWindowLoad(() => {
64
82
  // these features do not import an "instrument" file, meaning they are only hooked up to the API.
65
83
  nonAutoFeatures.forEach(f => {
66
- if (enabledFeatures[f]) {
84
+ if (enabledFeatures[f] && features.includes(f)) {
67
85
  import(/* webpackChunkName: "lazy-feature-loader" */ '../features/utils/lazy-feature-loader').then(({ lazyFeatureLoader }) => {
68
86
  return lazyFeatureLoader(f, 'aggregate')
69
87
  }).then(({ Aggregate }) => {
@@ -1,14 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.endpointMap = void 0;
7
- const endpointMap = {
8
- rum: '1',
9
- events: 'Events',
10
- ins: 'Ins',
11
- jserrors: 'Jserrors',
12
- resources: 'Resources'
13
- };
14
- exports.endpointMap = endpointMap;
@@ -1,14 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getPolyfills = getPolyfills;
7
- /**
8
- * This file is used as a replacement for the polyfill-detection.es5.js
9
- * file when running the polyfills webpack build.
10
- * @returns {string[]} an empty array
11
- */
12
- function getPolyfills() {
13
- return [];
14
- }
@@ -1,53 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getPolyfills = getPolyfills;
7
- const detectionRegex = /\{ \[native code\] \}/;
8
- const POLYFILLS = {
9
- FUNCTION_BIND: 'Function.bind',
10
- FUNCTION_APPLY: 'Function.apply',
11
- FUNCTION_CALL: 'Function.call',
12
- ARRAY_INCLUDES: 'Array.includes',
13
- ARRAY_FROM: 'Array.from',
14
- ARRAY_FIND: 'Array.find',
15
- ARRAY_FLAT: 'Array.flat',
16
- ARRAY_FLATMAP: 'Array.flatMap',
17
- OBJECT_ASSIGN: 'Object.assign',
18
- OBJECT_ENTRIES: 'Object.entries',
19
- OBJECT_VALUES: 'Object.values',
20
- MAP: 'Map',
21
- SET: 'Set',
22
- WEAK_MAP: 'WeakMap',
23
- WEAK_SET: 'WeakSet'
24
- };
25
-
26
- /**
27
- * Checks for native globals to see if they have been polyfilled by customer code.
28
- * @returns {string[]} Array of methods that were detected to have been polyfilled
29
- */
30
- function getPolyfills() {
31
- const polyfills = [];
32
- const mockFunction = function () {/* noop */};
33
- try {
34
- if (typeof mockFunction.bind === 'function' && !detectionRegex.test(mockFunction.bind.toString())) polyfills.push(POLYFILLS.FUNCTION_BIND);
35
- if (typeof mockFunction.apply === 'function' && !detectionRegex.test(mockFunction.apply.toString())) polyfills.push(POLYFILLS.FUNCTION_APPLY);
36
- if (typeof mockFunction.call === 'function' && !detectionRegex.test(mockFunction.call.toString())) polyfills.push(POLYFILLS.FUNCTION_CALL);
37
- if (typeof [].includes === 'function' && !detectionRegex.test([].includes.toString())) polyfills.push(POLYFILLS.ARRAY_INCLUDES);
38
- if (typeof Array.from === 'function' && !detectionRegex.test(Array.from.toString())) polyfills.push(POLYFILLS.ARRAY_FROM);
39
- if (typeof [].find === 'function' && !detectionRegex.test([].find.toString())) polyfills.push(POLYFILLS.ARRAY_FIND);
40
- if (typeof [].flat === 'function' && !detectionRegex.test([].flat.toString())) polyfills.push(POLYFILLS.ARRAY_FLAT);
41
- if (typeof [].flatMap === 'function' && !detectionRegex.test([].flatMap.toString())) polyfills.push(POLYFILLS.ARRAY_FLATMAP);
42
- if (typeof Object.assign === 'function' && !detectionRegex.test(Object.assign.toString())) polyfills.push(POLYFILLS.OBJECT_ASSIGN);
43
- if (typeof Object.entries === 'function' && !detectionRegex.test(Object.entries.toString())) polyfills.push(POLYFILLS.OBJECT_ENTRIES);
44
- if (typeof Object.values === 'function' && !detectionRegex.test(Object.values.toString())) polyfills.push(POLYFILLS.OBJECT_VALUES);
45
- if (typeof Map === 'function' && !detectionRegex.test(Map.toString())) polyfills.push(POLYFILLS.MAP);
46
- if (typeof Set === 'function' && !detectionRegex.test(Set.toString())) polyfills.push(POLYFILLS.SET);
47
- if (typeof WeakMap === 'function' && !detectionRegex.test(WeakMap.toString())) polyfills.push(POLYFILLS.WEAK_MAP);
48
- if (typeof WeakSet === 'function' && !detectionRegex.test(WeakSet.toString())) polyfills.push(POLYFILLS.WEAK_SET);
49
- } catch (err) {
50
- // Possibly not supported
51
- }
52
- return polyfills;
53
- }
@@ -1,7 +0,0 @@
1
- export const endpointMap = {
2
- rum: '1',
3
- events: 'Events',
4
- ins: 'Ins',
5
- jserrors: 'Jserrors',
6
- resources: 'Resources'
7
- };
@@ -1,8 +0,0 @@
1
- /**
2
- * This file is used as a replacement for the polyfill-detection.es5.js
3
- * file when running the polyfills webpack build.
4
- * @returns {string[]} an empty array
5
- */
6
- export function getPolyfills() {
7
- return [];
8
- }
@@ -1,47 +0,0 @@
1
- const detectionRegex = /\{ \[native code\] \}/;
2
- const POLYFILLS = {
3
- FUNCTION_BIND: 'Function.bind',
4
- FUNCTION_APPLY: 'Function.apply',
5
- FUNCTION_CALL: 'Function.call',
6
- ARRAY_INCLUDES: 'Array.includes',
7
- ARRAY_FROM: 'Array.from',
8
- ARRAY_FIND: 'Array.find',
9
- ARRAY_FLAT: 'Array.flat',
10
- ARRAY_FLATMAP: 'Array.flatMap',
11
- OBJECT_ASSIGN: 'Object.assign',
12
- OBJECT_ENTRIES: 'Object.entries',
13
- OBJECT_VALUES: 'Object.values',
14
- MAP: 'Map',
15
- SET: 'Set',
16
- WEAK_MAP: 'WeakMap',
17
- WEAK_SET: 'WeakSet'
18
- };
19
-
20
- /**
21
- * Checks for native globals to see if they have been polyfilled by customer code.
22
- * @returns {string[]} Array of methods that were detected to have been polyfilled
23
- */
24
- export function getPolyfills() {
25
- const polyfills = [];
26
- const mockFunction = function () {/* noop */};
27
- try {
28
- if (typeof mockFunction.bind === 'function' && !detectionRegex.test(mockFunction.bind.toString())) polyfills.push(POLYFILLS.FUNCTION_BIND);
29
- if (typeof mockFunction.apply === 'function' && !detectionRegex.test(mockFunction.apply.toString())) polyfills.push(POLYFILLS.FUNCTION_APPLY);
30
- if (typeof mockFunction.call === 'function' && !detectionRegex.test(mockFunction.call.toString())) polyfills.push(POLYFILLS.FUNCTION_CALL);
31
- if (typeof [].includes === 'function' && !detectionRegex.test([].includes.toString())) polyfills.push(POLYFILLS.ARRAY_INCLUDES);
32
- if (typeof Array.from === 'function' && !detectionRegex.test(Array.from.toString())) polyfills.push(POLYFILLS.ARRAY_FROM);
33
- if (typeof [].find === 'function' && !detectionRegex.test([].find.toString())) polyfills.push(POLYFILLS.ARRAY_FIND);
34
- if (typeof [].flat === 'function' && !detectionRegex.test([].flat.toString())) polyfills.push(POLYFILLS.ARRAY_FLAT);
35
- if (typeof [].flatMap === 'function' && !detectionRegex.test([].flatMap.toString())) polyfills.push(POLYFILLS.ARRAY_FLATMAP);
36
- if (typeof Object.assign === 'function' && !detectionRegex.test(Object.assign.toString())) polyfills.push(POLYFILLS.OBJECT_ASSIGN);
37
- if (typeof Object.entries === 'function' && !detectionRegex.test(Object.entries.toString())) polyfills.push(POLYFILLS.OBJECT_ENTRIES);
38
- if (typeof Object.values === 'function' && !detectionRegex.test(Object.values.toString())) polyfills.push(POLYFILLS.OBJECT_VALUES);
39
- if (typeof Map === 'function' && !detectionRegex.test(Map.toString())) polyfills.push(POLYFILLS.MAP);
40
- if (typeof Set === 'function' && !detectionRegex.test(Set.toString())) polyfills.push(POLYFILLS.SET);
41
- if (typeof WeakMap === 'function' && !detectionRegex.test(WeakMap.toString())) polyfills.push(POLYFILLS.WEAK_MAP);
42
- if (typeof WeakSet === 'function' && !detectionRegex.test(WeakSet.toString())) polyfills.push(POLYFILLS.WEAK_SET);
43
- } catch (err) {
44
- // Possibly not supported
45
- }
46
- return polyfills;
47
- }
@@ -1,8 +0,0 @@
1
- export namespace endpointMap {
2
- let rum: string;
3
- let events: string;
4
- let ins: string;
5
- let jserrors: string;
6
- let resources: string;
7
- }
8
- //# sourceMappingURL=endpoint-map.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-map.d.ts","sourceRoot":"","sources":["../../../../../src/features/metrics/aggregate/endpoint-map.js"],"names":[],"mappings":""}