@newrelic/browser-agent 1.238.0 → 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 (249) 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 +2 -8
  8. package/dist/cjs/common/drain/drain.js +1 -1
  9. package/dist/cjs/common/event-emitter/contextual-ee.js +6 -6
  10. package/dist/cjs/common/harvest/harvest-scheduler.js +2 -4
  11. package/dist/cjs/common/harvest/harvest.js +2 -6
  12. package/dist/cjs/common/serialize/bel-serializer.js +1 -1
  13. package/dist/cjs/common/session/session-entity.js +16 -12
  14. package/dist/cjs/common/storage/first-party-cookies.js +5 -4
  15. package/dist/cjs/common/storage/local-storage.js +3 -2
  16. package/dist/cjs/common/timer/interaction-timer.js +14 -6
  17. package/dist/cjs/common/timing/nav-timing.js +1 -1
  18. package/dist/cjs/common/unload/eol.js +4 -30
  19. package/dist/cjs/common/util/feature-flags.js +14 -15
  20. package/dist/cjs/common/util/invoke.js +3 -1
  21. package/dist/cjs/common/util/obfuscate.js +3 -5
  22. package/dist/cjs/common/util/traverse.js +1 -0
  23. package/dist/cjs/common/window/page-visibility.js +1 -2
  24. package/dist/cjs/common/wrap/wrap-jsonp.js +1 -1
  25. package/dist/cjs/features/ajax/aggregate/index.js +5 -7
  26. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +8 -8
  27. package/dist/cjs/features/ajax/instrument/index.js +47 -15
  28. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +0 -1
  29. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  30. package/dist/cjs/features/jserrors/aggregate/index.js +4 -5
  31. package/dist/cjs/features/metrics/aggregate/framework-detection.js +103 -7
  32. package/dist/cjs/features/metrics/aggregate/index.js +20 -37
  33. package/dist/cjs/features/metrics/instrument/index.js +0 -2
  34. package/dist/cjs/features/page_action/aggregate/index.js +17 -19
  35. package/dist/cjs/features/page_view_event/aggregate/index.js +1 -2
  36. package/dist/cjs/features/page_view_event/instrument/index.js +4 -2
  37. package/dist/cjs/features/page_view_timing/aggregate/index.js +6 -7
  38. package/dist/cjs/features/session_replay/aggregate/index.js +3 -3
  39. package/dist/cjs/features/session_trace/aggregate/index.js +8 -8
  40. package/dist/cjs/features/spa/aggregate/index.js +14 -20
  41. package/dist/cjs/features/spa/aggregate/interaction.js +0 -2
  42. package/dist/cjs/features/spa/aggregate/serializer.js +1 -1
  43. package/dist/cjs/features/utils/aggregate-base.js +4 -0
  44. package/dist/cjs/features/utils/handler-cache.js +3 -1
  45. package/dist/cjs/features/utils/instrument-base.js +24 -6
  46. package/dist/cjs/loaders/agent-base.js +11 -0
  47. package/dist/cjs/loaders/agent.js +7 -7
  48. package/dist/cjs/loaders/api/api.js +21 -4
  49. package/dist/cjs/loaders/api/apiAsync.js +19 -20
  50. package/dist/cjs/loaders/configure/configure.js +3 -0
  51. package/dist/cjs/loaders/micro-agent.js +20 -3
  52. package/dist/esm/common/config/state/init.js +21 -13
  53. package/dist/esm/common/config/state/runtime.js +0 -4
  54. package/dist/esm/common/constants/env.cdn.js +1 -1
  55. package/dist/esm/common/constants/env.npm.js +1 -1
  56. package/dist/esm/common/constants/runtime.js +1 -1
  57. package/dist/esm/common/constants/shared-channel.js +3 -1
  58. package/dist/esm/common/deny-list/deny-list.js +2 -8
  59. package/dist/esm/common/drain/drain.js +1 -1
  60. package/dist/esm/common/event-emitter/contextual-ee.js +6 -6
  61. package/dist/esm/common/harvest/harvest-scheduler.js +2 -4
  62. package/dist/esm/common/harvest/harvest.js +2 -6
  63. package/dist/esm/common/serialize/bel-serializer.js +1 -1
  64. package/dist/esm/common/session/session-entity.js +16 -12
  65. package/dist/esm/common/storage/first-party-cookies.js +5 -4
  66. package/dist/esm/common/storage/local-storage.js +3 -2
  67. package/dist/esm/common/timer/interaction-timer.js +14 -6
  68. package/dist/esm/common/timing/nav-timing.js +1 -1
  69. package/dist/esm/common/unload/eol.js +5 -31
  70. package/dist/esm/common/util/feature-flags.js +14 -15
  71. package/dist/esm/common/util/invoke.js +3 -1
  72. package/dist/esm/common/util/obfuscate.js +3 -5
  73. package/dist/esm/common/util/traverse.js +1 -0
  74. package/dist/esm/common/window/page-visibility.js +1 -2
  75. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  76. package/dist/esm/features/ajax/aggregate/index.js +5 -7
  77. package/dist/esm/features/ajax/instrument/distributed-tracing.js +8 -8
  78. package/dist/esm/features/ajax/instrument/index.js +47 -15
  79. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +0 -1
  80. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  81. package/dist/esm/features/jserrors/aggregate/index.js +4 -5
  82. package/dist/esm/features/metrics/aggregate/framework-detection.js +103 -7
  83. package/dist/esm/features/metrics/aggregate/index.js +22 -39
  84. package/dist/esm/features/metrics/instrument/index.js +1 -3
  85. package/dist/esm/features/page_action/aggregate/index.js +17 -19
  86. package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
  87. package/dist/esm/features/page_view_event/instrument/index.js +4 -2
  88. package/dist/esm/features/page_view_timing/aggregate/index.js +7 -8
  89. package/dist/esm/features/session_replay/aggregate/index.js +2 -2
  90. package/dist/esm/features/session_trace/aggregate/index.js +8 -8
  91. package/dist/esm/features/spa/aggregate/index.js +14 -20
  92. package/dist/esm/features/spa/aggregate/interaction.js +0 -2
  93. package/dist/esm/features/spa/aggregate/serializer.js +1 -1
  94. package/dist/esm/features/utils/aggregate-base.js +4 -0
  95. package/dist/esm/features/utils/handler-cache.js +3 -1
  96. package/dist/esm/features/utils/instrument-base.js +24 -6
  97. package/dist/esm/loaders/agent-base.js +11 -0
  98. package/dist/esm/loaders/agent.js +7 -7
  99. package/dist/esm/loaders/api/api.js +21 -4
  100. package/dist/esm/loaders/api/apiAsync.js +19 -20
  101. package/dist/esm/loaders/configure/configure.js +3 -0
  102. package/dist/esm/loaders/features/enabled-features.js +1 -1
  103. package/dist/esm/loaders/micro-agent.js +21 -4
  104. package/dist/types/common/config/state/init.d.ts.map +1 -1
  105. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  106. package/dist/types/common/constants/runtime.d.ts +1 -1
  107. package/dist/types/common/constants/runtime.d.ts.map +1 -1
  108. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  109. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  110. package/dist/types/common/session/session-entity.d.ts +6 -9
  111. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  112. package/dist/types/common/storage/first-party-cookies.d.ts +1 -1
  113. package/dist/types/common/storage/first-party-cookies.d.ts.map +1 -1
  114. package/dist/types/common/storage/local-storage.d.ts.map +1 -1
  115. package/dist/types/common/timer/interaction-timer.d.ts +3 -0
  116. package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
  117. package/dist/types/common/unload/eol.d.ts +1 -2
  118. package/dist/types/common/unload/eol.d.ts.map +1 -1
  119. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  120. package/dist/types/common/util/obfuscate.d.ts.map +1 -1
  121. package/dist/types/common/util/traverse.d.ts.map +1 -1
  122. package/dist/types/common/window/page-visibility.d.ts.map +1 -1
  123. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  124. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  125. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -1
  126. package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
  127. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  128. package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -1
  129. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  130. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
  131. package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
  132. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  133. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  134. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  135. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  136. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  137. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  138. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
  139. package/dist/types/features/utils/aggregate-base.d.ts +1 -0
  140. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  141. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  142. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  143. package/dist/types/loaders/agent-base.d.ts +6 -0
  144. package/dist/types/loaders/agent-base.d.ts.map +1 -1
  145. package/dist/types/loaders/agent.d.ts +1 -1
  146. package/dist/types/loaders/agent.d.ts.map +1 -1
  147. package/dist/types/loaders/api/api.d.ts +1 -0
  148. package/dist/types/loaders/api/api.d.ts.map +1 -1
  149. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
  150. package/dist/types/loaders/configure/configure.d.ts +1 -0
  151. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  152. package/dist/types/loaders/micro-agent.d.ts +7 -1
  153. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  154. package/package.json +41 -12
  155. package/src/common/aggregate/aggregator.test.js +107 -0
  156. package/src/common/config/state/configurable.test.js +73 -0
  157. package/src/common/config/state/info.test.js +31 -0
  158. package/src/common/config/state/init.js +13 -12
  159. package/src/common/config/state/init.test.js +28 -0
  160. package/src/common/config/state/loader-config.test.js +21 -0
  161. package/src/common/config/state/runtime.js +0 -2
  162. package/src/common/config/state/runtime.test.js +21 -0
  163. package/src/common/constants/__mocks__/runtime.js +1 -1
  164. package/src/common/constants/runtime.js +1 -1
  165. package/src/common/constants/runtime.test.js +2 -2
  166. package/src/common/constants/shared-channel.js +1 -1
  167. package/src/common/deny-list/deny-list.js +2 -10
  168. package/src/common/drain/drain.js +1 -1
  169. package/src/common/drain/drain.test.js +74 -0
  170. package/src/common/event-emitter/contextual-ee.js +6 -6
  171. package/src/common/harvest/harvest-scheduler.js +2 -5
  172. package/src/common/harvest/harvest-scheduler.test.js +2 -6
  173. package/src/common/harvest/harvest.js +2 -6
  174. package/src/common/harvest/harvest.test.js +0 -2
  175. package/src/common/ids/id.test.js +6 -6
  176. package/src/common/serialize/bel-serializer.js +1 -1
  177. package/src/common/session/session-entity.component-test.js +3 -2
  178. package/src/common/session/session-entity.js +11 -9
  179. package/src/common/storage/first-party-cookies.js +5 -4
  180. package/src/common/storage/local-storage.js +3 -2
  181. package/src/common/timer/interaction-timer.component-test.js +52 -7
  182. package/src/common/timer/interaction-timer.js +15 -6
  183. package/src/common/timer/timer.test.js +0 -1
  184. package/src/common/timing/nav-timing.js +1 -1
  185. package/src/common/unload/eol.js +5 -31
  186. package/src/common/url/encode.test.js +1 -0
  187. package/src/common/util/__mocks__/invoke.js +1 -0
  188. package/src/common/util/data-size.test.js +0 -1
  189. package/src/common/util/feature-flags.js +15 -17
  190. package/src/common/util/feature-flags.test.js +4 -8
  191. package/src/common/util/invoke.js +1 -1
  192. package/src/common/util/obfuscate.js +3 -5
  193. package/src/common/util/submit-data.test.js +1 -1
  194. package/src/common/util/traverse.js +1 -0
  195. package/src/common/window/__mocks__/nreum.js +3 -1
  196. package/src/common/window/page-visibility.js +1 -2
  197. package/src/common/wrap/wrap-jsonp.js +1 -1
  198. package/src/features/ajax/aggregate/index.js +5 -7
  199. package/src/features/ajax/instrument/distributed-tracing.js +8 -8
  200. package/src/features/ajax/instrument/index.js +40 -17
  201. package/src/features/jserrors/aggregate/canonical-function-name.js +0 -2
  202. package/src/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  203. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
  204. package/src/features/jserrors/aggregate/index.js +4 -5
  205. package/src/features/metrics/aggregate/framework-detection.js +129 -8
  206. package/src/features/metrics/aggregate/framework-detection.test.js +213 -82
  207. package/src/features/metrics/aggregate/index.js +22 -45
  208. package/src/features/metrics/instrument/index.js +1 -3
  209. package/src/features/page_action/aggregate/index.js +12 -13
  210. package/src/features/page_view_event/aggregate/index.js +1 -2
  211. package/src/features/page_view_event/instrument/index.js +2 -2
  212. package/src/features/page_view_timing/aggregate/index.js +7 -8
  213. package/src/features/session_replay/aggregate/index.component-test.js +3 -15
  214. package/src/features/session_replay/aggregate/index.js +2 -2
  215. package/src/features/session_trace/aggregate/index.js +6 -9
  216. package/src/features/spa/aggregate/index.js +14 -20
  217. package/src/features/spa/aggregate/interaction.js +0 -2
  218. package/src/features/spa/aggregate/serializer.js +1 -1
  219. package/src/features/utils/aggregate-base.js +5 -0
  220. package/src/features/utils/aggregate-base.test.js +2 -1
  221. package/src/features/utils/handler-cache.js +3 -2
  222. package/src/features/utils/instrument-base.js +25 -6
  223. package/src/features/utils/instrument-base.test.js +2 -2
  224. package/src/loaders/agent-base.js +11 -0
  225. package/src/loaders/agent.js +7 -7
  226. package/src/loaders/api/api.js +21 -4
  227. package/src/loaders/api/api.test.js +85 -0
  228. package/src/loaders/api/apiAsync.js +19 -20
  229. package/src/loaders/api/apiAsync.test.js +17 -0
  230. package/src/loaders/configure/configure.js +3 -0
  231. package/src/loaders/features/enabled-features.js +1 -1
  232. package/src/loaders/micro-agent.js +22 -4
  233. package/dist/cjs/features/metrics/aggregate/endpoint-map.js +0 -14
  234. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +0 -14
  235. package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +0 -53
  236. package/dist/esm/features/metrics/aggregate/endpoint-map.js +0 -7
  237. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  238. package/dist/esm/features/metrics/aggregate/polyfill-detection.js +0 -47
  239. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts +0 -8
  240. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts.map +0 -1
  241. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +0 -6
  242. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +0 -1
  243. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +0 -7
  244. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +0 -1
  245. package/src/features/metrics/aggregate/endpoint-map.js +0 -7
  246. package/src/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  247. package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -16
  248. package/src/features/metrics/aggregate/polyfill-detection.js +0 -48
  249. package/src/features/metrics/aggregate/polyfill-detection.test.js +0 -163
@@ -31,19 +31,24 @@ export class InstrumentBase extends FeatureBase {
31
31
  this.auto = auto
32
32
 
33
33
  /** @type {Function | undefined} This should be set by any derived Instrument class if it has things to do when feature fails or is killed. */
34
- this.abortHandler
34
+ this.abortHandler = undefined
35
+
35
36
  /**
36
37
  * @type {Class} Holds the reference to the feature's aggregate module counterpart, if and after it has been initialized. This may not be assigned until after page loads!
37
38
  * The only purpose of this for now is to expose it to the NREUM interface, as the feature's instrument instance is already exposed.
38
39
  */
39
- this.featAggregate
40
+ this.featAggregate = undefined
41
+
40
42
  /**
41
43
  * @type {Promise} Assigned immediately after @see importAggregator runs. Serves as a signal for when the inner async fn finishes execution. Useful for features to await
42
44
  * one another if there are inter-features dependencies.
43
45
  */
44
- this.onAggregateImported
46
+ this.onAggregateImported = undefined
45
47
 
46
- if (auto) registerDrain(agentIdentifier, featureName)
48
+ /** used in conjunction with newrelic.start() to defer harvesting in features */
49
+ if (getConfigurationValue(this.agentIdentifier, `${this.featureName}.autoStart`) === false) this.auto = false
50
+ /** if the feature requires opt-in (!auto-start), it will get registered once the api has been called */
51
+ if (this.auto) registerDrain(agentIdentifier, featureName)
47
52
  }
48
53
 
49
54
  /**
@@ -53,7 +58,21 @@ export class InstrumentBase extends FeatureBase {
53
58
  * @returns void
54
59
  */
55
60
  importAggregator (argsObjFromInstrument = {}) {
56
- if (this.featAggregate || !this.auto) return
61
+ if (this.featAggregate) return
62
+
63
+ if (!this.auto) {
64
+ // this feature requires an opt in...
65
+ // wait for API to be called
66
+ this.ee.on(`${this.featureName}-opt-in`, () => {
67
+ // register the feature to drain only once the API has been called, it will drain when importAggregator finishes for all the features
68
+ // called by the api in that cycle
69
+ registerDrain(this.agentIdentifier, this.featureName)
70
+ this.auto = true
71
+ this.importAggregator()
72
+ })
73
+ return
74
+ }
75
+
57
76
  const enableSessionTracking = isBrowserScope && getConfigurationValue(this.agentIdentifier, 'privacy.cookies_enabled') === true
58
77
  let loadedSuccessfully
59
78
  this.onAggregateImported = new Promise(resolve => {
@@ -72,7 +91,7 @@ export class InstrumentBase extends FeatureBase {
72
91
  }
73
92
 
74
93
  /**
75
- * Note this try-catch differs from the one in Agent.start() in that it's placed later in a page's lifecycle and
94
+ * Note this try-catch differs from the one in Agent.run() in that it's placed later in a page's lifecycle and
76
95
  * it's only responsible for aborting its one specific feature, rather than all.
77
96
  */
78
97
  try {
@@ -33,7 +33,7 @@ jest.mock('../../common/config/config', () => ({
33
33
  }))
34
34
  jest.mock('../../common/config/config', () => ({
35
35
  __esModule: true,
36
- getConfigurationValue: jest.fn(),
36
+ getConfigurationValue: jest.fn().mockReturnValue({}),
37
37
  originals: {
38
38
  MO: jest.fn()
39
39
  }
@@ -79,7 +79,7 @@ test('should construct a new instrument', () => {
79
79
  })
80
80
 
81
81
  test('should not immediately drain', () => {
82
- const instrument = new InstrumentBase(agentIdentifier, aggregator, featureName, false)
82
+ new InstrumentBase(agentIdentifier, aggregator, featureName, false)
83
83
 
84
84
  expect(registerDrain).not.toHaveBeenCalled()
85
85
  })
@@ -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 {
@@ -90,4 +92,13 @@ export class AgentBase {
90
92
  addRelease (name, id) {
91
93
  warn('Call to agent api addRelease failed. The agent is not currently initialized.')
92
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
+ }
93
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)
@@ -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', 'setApplicationVersion'
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)
@@ -122,6 +122,23 @@ export function setAPI (agentIdentifier, forceDrain) {
122
122
  return appendJsAttribute('application.version', value, 'setApplicationVersion', false)
123
123
  }
124
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
+
125
142
  apiInterface.interaction = function () {
126
143
  return new InteractionHandle().get()
127
144
  }
@@ -151,7 +168,7 @@ export function setAPI (agentIdentifier, forceDrain) {
151
168
  }
152
169
  }
153
170
 
154
- void ['actionText', 'setName', 'setAttribute', 'save', 'ignore', 'onEnd', 'getContext', 'end', 'get'].forEach(name => {
171
+ ;['actionText', 'setName', 'setAttribute', 'save', 'ignore', 'onEnd', 'getContext', 'end', 'get'].forEach(name => {
155
172
  InteractionApiProto[name] = apiCall(spaPrefix, name, undefined, FEATURE_NAMES.spa)
156
173
  })
157
174
 
@@ -159,7 +176,7 @@ export function setAPI (agentIdentifier, forceDrain) {
159
176
  return function () {
160
177
  handle(SUPPORTABILITY_METRIC_CHANNEL, ['API/' + name + '/called'], undefined, FEATURE_NAMES.metrics, instanceEE)
161
178
  if (bufferGroup) handle(prefix + name, [now(), ...arguments], notSpa ? null : this, bufferGroup, instanceEE) // no bufferGroup means only the SM is emitted
162
- return notSpa ? void 0 : this
179
+ return notSpa ? undefined : this
163
180
  }
164
181
  }
165
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
+ })
@@ -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
- const rum: string;
3
- const events: string;
4
- const ins: string;
5
- const jserrors: string;
6
- const 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":""}
@@ -1,6 +0,0 @@
1
- /**
2
- * Checks for native globals to see if they have been polyfilled by customer code.
3
- * @returns {string[]} Array of methods that were detected to have been polyfilled
4
- */
5
- export function getPolyfills(): string[];
6
- //# sourceMappingURL=polyfill-detection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"polyfill-detection.d.ts","sourceRoot":"","sources":["../../../../../src/features/metrics/aggregate/polyfill-detection.js"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,gCAFa,MAAM,EAAE,CA0BpB"}
@@ -1,7 +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(): string[];
7
- //# sourceMappingURL=polyfill-detection.es5.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"polyfill-detection.es5.d.ts","sourceRoot":"","sources":["../../../../../src/features/metrics/aggregate/polyfill-detection.es5.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,gCAFa,MAAM,EAAE,CAIpB"}
@@ -1,7 +0,0 @@
1
- export const endpointMap = {
2
- rum: '1',
3
- events: 'Events',
4
- ins: 'Ins',
5
- jserrors: 'Jserrors',
6
- resources: 'Resources'
7
- }