@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.
- package/dist/cjs/common/config/state/init.js +21 -13
- package/dist/cjs/common/config/state/runtime.js +0 -4
- package/dist/cjs/common/constants/env.cdn.js +1 -1
- package/dist/cjs/common/constants/env.npm.js +1 -1
- package/dist/cjs/common/constants/runtime.js +3 -3
- package/dist/cjs/common/constants/shared-channel.js +3 -1
- package/dist/cjs/common/deny-list/deny-list.js +2 -8
- package/dist/cjs/common/drain/drain.js +1 -1
- package/dist/cjs/common/event-emitter/contextual-ee.js +6 -6
- package/dist/cjs/common/harvest/harvest-scheduler.js +2 -4
- package/dist/cjs/common/harvest/harvest.js +2 -6
- package/dist/cjs/common/serialize/bel-serializer.js +1 -1
- package/dist/cjs/common/session/session-entity.js +16 -12
- package/dist/cjs/common/storage/first-party-cookies.js +5 -4
- package/dist/cjs/common/storage/local-storage.js +3 -2
- package/dist/cjs/common/timer/interaction-timer.js +14 -6
- package/dist/cjs/common/timing/nav-timing.js +1 -1
- package/dist/cjs/common/unload/eol.js +4 -30
- package/dist/cjs/common/util/feature-flags.js +14 -15
- package/dist/cjs/common/util/invoke.js +3 -1
- package/dist/cjs/common/util/obfuscate.js +3 -5
- package/dist/cjs/common/util/traverse.js +1 -0
- package/dist/cjs/common/window/page-visibility.js +1 -2
- package/dist/cjs/common/wrap/wrap-jsonp.js +1 -1
- package/dist/cjs/features/ajax/aggregate/index.js +5 -7
- package/dist/cjs/features/ajax/instrument/distributed-tracing.js +8 -8
- package/dist/cjs/features/ajax/instrument/index.js +47 -15
- package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +0 -1
- package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +4 -4
- package/dist/cjs/features/jserrors/aggregate/index.js +4 -5
- package/dist/cjs/features/metrics/aggregate/framework-detection.js +103 -7
- package/dist/cjs/features/metrics/aggregate/index.js +20 -37
- package/dist/cjs/features/metrics/instrument/index.js +0 -2
- package/dist/cjs/features/page_action/aggregate/index.js +17 -19
- package/dist/cjs/features/page_view_event/aggregate/index.js +1 -2
- package/dist/cjs/features/page_view_event/instrument/index.js +4 -2
- package/dist/cjs/features/page_view_timing/aggregate/index.js +6 -7
- package/dist/cjs/features/session_replay/aggregate/index.js +3 -3
- package/dist/cjs/features/session_trace/aggregate/index.js +8 -8
- package/dist/cjs/features/spa/aggregate/index.js +14 -20
- package/dist/cjs/features/spa/aggregate/interaction.js +0 -2
- package/dist/cjs/features/spa/aggregate/serializer.js +1 -1
- package/dist/cjs/features/utils/aggregate-base.js +4 -0
- package/dist/cjs/features/utils/handler-cache.js +3 -1
- package/dist/cjs/features/utils/instrument-base.js +24 -6
- package/dist/cjs/loaders/agent-base.js +11 -0
- package/dist/cjs/loaders/agent.js +7 -7
- package/dist/cjs/loaders/api/api.js +21 -4
- package/dist/cjs/loaders/api/apiAsync.js +19 -20
- package/dist/cjs/loaders/configure/configure.js +3 -0
- package/dist/cjs/loaders/micro-agent.js +20 -3
- package/dist/esm/common/config/state/init.js +21 -13
- package/dist/esm/common/config/state/runtime.js +0 -4
- package/dist/esm/common/constants/env.cdn.js +1 -1
- package/dist/esm/common/constants/env.npm.js +1 -1
- package/dist/esm/common/constants/runtime.js +1 -1
- package/dist/esm/common/constants/shared-channel.js +3 -1
- package/dist/esm/common/deny-list/deny-list.js +2 -8
- package/dist/esm/common/drain/drain.js +1 -1
- package/dist/esm/common/event-emitter/contextual-ee.js +6 -6
- package/dist/esm/common/harvest/harvest-scheduler.js +2 -4
- package/dist/esm/common/harvest/harvest.js +2 -6
- package/dist/esm/common/serialize/bel-serializer.js +1 -1
- package/dist/esm/common/session/session-entity.js +16 -12
- package/dist/esm/common/storage/first-party-cookies.js +5 -4
- package/dist/esm/common/storage/local-storage.js +3 -2
- package/dist/esm/common/timer/interaction-timer.js +14 -6
- package/dist/esm/common/timing/nav-timing.js +1 -1
- package/dist/esm/common/unload/eol.js +5 -31
- package/dist/esm/common/util/feature-flags.js +14 -15
- package/dist/esm/common/util/invoke.js +3 -1
- package/dist/esm/common/util/obfuscate.js +3 -5
- package/dist/esm/common/util/traverse.js +1 -0
- package/dist/esm/common/window/page-visibility.js +1 -2
- package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
- package/dist/esm/features/ajax/aggregate/index.js +5 -7
- package/dist/esm/features/ajax/instrument/distributed-tracing.js +8 -8
- package/dist/esm/features/ajax/instrument/index.js +47 -15
- package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +0 -1
- package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +4 -4
- package/dist/esm/features/jserrors/aggregate/index.js +4 -5
- package/dist/esm/features/metrics/aggregate/framework-detection.js +103 -7
- package/dist/esm/features/metrics/aggregate/index.js +22 -39
- package/dist/esm/features/metrics/instrument/index.js +1 -3
- package/dist/esm/features/page_action/aggregate/index.js +17 -19
- package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
- package/dist/esm/features/page_view_event/instrument/index.js +4 -2
- package/dist/esm/features/page_view_timing/aggregate/index.js +7 -8
- package/dist/esm/features/session_replay/aggregate/index.js +2 -2
- package/dist/esm/features/session_trace/aggregate/index.js +8 -8
- package/dist/esm/features/spa/aggregate/index.js +14 -20
- package/dist/esm/features/spa/aggregate/interaction.js +0 -2
- package/dist/esm/features/spa/aggregate/serializer.js +1 -1
- package/dist/esm/features/utils/aggregate-base.js +4 -0
- package/dist/esm/features/utils/handler-cache.js +3 -1
- package/dist/esm/features/utils/instrument-base.js +24 -6
- package/dist/esm/loaders/agent-base.js +11 -0
- package/dist/esm/loaders/agent.js +7 -7
- package/dist/esm/loaders/api/api.js +21 -4
- package/dist/esm/loaders/api/apiAsync.js +19 -20
- package/dist/esm/loaders/configure/configure.js +3 -0
- package/dist/esm/loaders/features/enabled-features.js +1 -1
- package/dist/esm/loaders/micro-agent.js +21 -4
- package/dist/types/common/config/state/init.d.ts.map +1 -1
- package/dist/types/common/config/state/runtime.d.ts.map +1 -1
- package/dist/types/common/constants/runtime.d.ts +1 -1
- package/dist/types/common/constants/runtime.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest.d.ts.map +1 -1
- package/dist/types/common/session/session-entity.d.ts +6 -9
- package/dist/types/common/session/session-entity.d.ts.map +1 -1
- package/dist/types/common/storage/first-party-cookies.d.ts +1 -1
- package/dist/types/common/storage/first-party-cookies.d.ts.map +1 -1
- package/dist/types/common/storage/local-storage.d.ts.map +1 -1
- package/dist/types/common/timer/interaction-timer.d.ts +3 -0
- package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
- package/dist/types/common/unload/eol.d.ts +1 -2
- package/dist/types/common/unload/eol.d.ts.map +1 -1
- package/dist/types/common/util/feature-flags.d.ts.map +1 -1
- package/dist/types/common/util/obfuscate.d.ts.map +1 -1
- package/dist/types/common/util/traverse.d.ts.map +1 -1
- package/dist/types/common/window/page-visibility.d.ts.map +1 -1
- package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
- package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
- package/dist/types/features/utils/aggregate-base.d.ts +1 -0
- package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
- package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
- package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
- package/dist/types/loaders/agent-base.d.ts +6 -0
- package/dist/types/loaders/agent-base.d.ts.map +1 -1
- package/dist/types/loaders/agent.d.ts +1 -1
- package/dist/types/loaders/agent.d.ts.map +1 -1
- package/dist/types/loaders/api/api.d.ts +1 -0
- package/dist/types/loaders/api/api.d.ts.map +1 -1
- package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
- package/dist/types/loaders/configure/configure.d.ts +1 -0
- package/dist/types/loaders/configure/configure.d.ts.map +1 -1
- package/dist/types/loaders/micro-agent.d.ts +7 -1
- package/dist/types/loaders/micro-agent.d.ts.map +1 -1
- package/package.json +41 -12
- package/src/common/aggregate/aggregator.test.js +107 -0
- package/src/common/config/state/configurable.test.js +73 -0
- package/src/common/config/state/info.test.js +31 -0
- package/src/common/config/state/init.js +13 -12
- package/src/common/config/state/init.test.js +28 -0
- package/src/common/config/state/loader-config.test.js +21 -0
- package/src/common/config/state/runtime.js +0 -2
- package/src/common/config/state/runtime.test.js +21 -0
- package/src/common/constants/__mocks__/runtime.js +1 -1
- package/src/common/constants/runtime.js +1 -1
- package/src/common/constants/runtime.test.js +2 -2
- package/src/common/constants/shared-channel.js +1 -1
- package/src/common/deny-list/deny-list.js +2 -10
- package/src/common/drain/drain.js +1 -1
- package/src/common/drain/drain.test.js +74 -0
- package/src/common/event-emitter/contextual-ee.js +6 -6
- package/src/common/harvest/harvest-scheduler.js +2 -5
- package/src/common/harvest/harvest-scheduler.test.js +2 -6
- package/src/common/harvest/harvest.js +2 -6
- package/src/common/harvest/harvest.test.js +0 -2
- package/src/common/ids/id.test.js +6 -6
- package/src/common/serialize/bel-serializer.js +1 -1
- package/src/common/session/session-entity.component-test.js +3 -2
- package/src/common/session/session-entity.js +11 -9
- package/src/common/storage/first-party-cookies.js +5 -4
- package/src/common/storage/local-storage.js +3 -2
- package/src/common/timer/interaction-timer.component-test.js +52 -7
- package/src/common/timer/interaction-timer.js +15 -6
- package/src/common/timer/timer.test.js +0 -1
- package/src/common/timing/nav-timing.js +1 -1
- package/src/common/unload/eol.js +5 -31
- package/src/common/url/encode.test.js +1 -0
- package/src/common/util/__mocks__/invoke.js +1 -0
- package/src/common/util/data-size.test.js +0 -1
- package/src/common/util/feature-flags.js +15 -17
- package/src/common/util/feature-flags.test.js +4 -8
- package/src/common/util/invoke.js +1 -1
- package/src/common/util/obfuscate.js +3 -5
- package/src/common/util/submit-data.test.js +1 -1
- package/src/common/util/traverse.js +1 -0
- package/src/common/window/__mocks__/nreum.js +3 -1
- package/src/common/window/page-visibility.js +1 -2
- package/src/common/wrap/wrap-jsonp.js +1 -1
- package/src/features/ajax/aggregate/index.js +5 -7
- package/src/features/ajax/instrument/distributed-tracing.js +8 -8
- package/src/features/ajax/instrument/index.js +40 -17
- package/src/features/jserrors/aggregate/canonical-function-name.js +0 -2
- package/src/features/jserrors/aggregate/compute-stack-trace.js +4 -4
- package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
- package/src/features/jserrors/aggregate/index.js +4 -5
- package/src/features/metrics/aggregate/framework-detection.js +129 -8
- package/src/features/metrics/aggregate/framework-detection.test.js +213 -82
- package/src/features/metrics/aggregate/index.js +22 -45
- package/src/features/metrics/instrument/index.js +1 -3
- package/src/features/page_action/aggregate/index.js +12 -13
- package/src/features/page_view_event/aggregate/index.js +1 -2
- package/src/features/page_view_event/instrument/index.js +2 -2
- package/src/features/page_view_timing/aggregate/index.js +7 -8
- package/src/features/session_replay/aggregate/index.component-test.js +3 -15
- package/src/features/session_replay/aggregate/index.js +2 -2
- package/src/features/session_trace/aggregate/index.js +6 -9
- package/src/features/spa/aggregate/index.js +14 -20
- package/src/features/spa/aggregate/interaction.js +0 -2
- package/src/features/spa/aggregate/serializer.js +1 -1
- package/src/features/utils/aggregate-base.js +5 -0
- package/src/features/utils/aggregate-base.test.js +2 -1
- package/src/features/utils/handler-cache.js +3 -2
- package/src/features/utils/instrument-base.js +25 -6
- package/src/features/utils/instrument-base.test.js +2 -2
- package/src/loaders/agent-base.js +11 -0
- package/src/loaders/agent.js +7 -7
- package/src/loaders/api/api.js +21 -4
- package/src/loaders/api/api.test.js +85 -0
- package/src/loaders/api/apiAsync.js +19 -20
- package/src/loaders/api/apiAsync.test.js +17 -0
- package/src/loaders/configure/configure.js +3 -0
- package/src/loaders/features/enabled-features.js +1 -1
- package/src/loaders/micro-agent.js +22 -4
- package/dist/cjs/features/metrics/aggregate/endpoint-map.js +0 -14
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +0 -14
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +0 -53
- package/dist/esm/features/metrics/aggregate/endpoint-map.js +0 -7
- package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
- package/dist/esm/features/metrics/aggregate/polyfill-detection.js +0 -47
- package/dist/types/features/metrics/aggregate/endpoint-map.d.ts +0 -8
- package/dist/types/features/metrics/aggregate/endpoint-map.d.ts.map +0 -1
- package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +0 -6
- package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +0 -1
- package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +0 -7
- package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +0 -1
- package/src/features/metrics/aggregate/endpoint-map.js +0 -7
- package/src/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
- package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -16
- package/src/features/metrics/aggregate/polyfill-detection.js +0 -48
- 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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
}
|
package/src/loaders/agent.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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(
|
|
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[
|
|
71
|
-
const dependencies = getFeatureDependencyNames(
|
|
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(`${
|
|
74
|
-
this.features[
|
|
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)
|
package/src/loaders/api/api.js
CHANGED
|
@@ -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
|
-
|
|
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 ?
|
|
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
|
|
20
|
-
addToTrace
|
|
21
|
-
inlineHit
|
|
22
|
-
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(
|
|
52
|
+
// NREUM.inlineHit(requestName, queueTime, appTime, totalBackEndTime, domTime, frontEndTime)
|
|
53
53
|
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
function inlineHit (t,
|
|
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
|
-
|
|
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=' +
|
|
74
|
-
url += 'qt=' + ~~
|
|
75
|
-
url += 'ap=' + ~~
|
|
76
|
-
url += 'be=' + ~~
|
|
77
|
-
url += 'dc=' + ~~
|
|
78
|
-
url += 'fe=' + ~~
|
|
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 ??= {}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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,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 +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"}
|