@newrelic/browser-agent 1.241.0 → 1.243.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 (132) hide show
  1. package/CHANGELOG.md +1465 -0
  2. package/dist/cjs/cdn/polyfills/lite.js +13 -1
  3. package/dist/cjs/cdn/polyfills/pro.js +17 -1
  4. package/dist/cjs/cdn/polyfills/spa.js +18 -1
  5. package/dist/cjs/common/config/state/init.js +32 -5
  6. package/dist/cjs/common/constants/env.cdn.js +1 -1
  7. package/dist/cjs/common/constants/env.npm.js +1 -1
  8. package/dist/cjs/common/dom/query-selector.js +16 -0
  9. package/dist/cjs/common/session/session-entity.js +20 -2
  10. package/dist/cjs/common/wrap/wrap-function.js +1 -1
  11. package/dist/cjs/features/ajax/aggregate/index.js +1 -1
  12. package/dist/cjs/features/session_replay/aggregate/index.js +84 -50
  13. package/dist/cjs/features/utils/feature-base.js +1 -2
  14. package/dist/cjs/features/utils/instrument-base.js +1 -0
  15. package/dist/cjs/loaders/api/api.js +2 -2
  16. package/dist/cjs/loaders/api/apiAsync.js +0 -37
  17. package/dist/cjs/loaders/configure/configure.js +1 -1
  18. package/dist/cjs/loaders/configure/public-path.js +6 -3
  19. package/dist/esm/cdn/polyfills/lite.js +8 -1
  20. package/dist/esm/cdn/polyfills/pro.js +13 -2
  21. package/dist/esm/cdn/polyfills/spa.js +13 -1
  22. package/dist/esm/common/config/state/init.js +32 -5
  23. package/dist/esm/common/constants/env.cdn.js +1 -1
  24. package/dist/esm/common/constants/env.npm.js +1 -1
  25. package/dist/esm/common/dom/query-selector.js +9 -0
  26. package/dist/esm/common/session/session-entity.js +18 -1
  27. package/dist/esm/common/wrap/wrap-function.js +1 -1
  28. package/dist/esm/features/ajax/aggregate/index.js +1 -1
  29. package/dist/esm/features/session_replay/aggregate/index.js +83 -50
  30. package/dist/esm/features/utils/feature-base.js +1 -2
  31. package/dist/esm/features/utils/instrument-base.js +1 -0
  32. package/dist/esm/loaders/api/api.js +2 -2
  33. package/dist/esm/loaders/api/apiAsync.js +1 -36
  34. package/dist/esm/loaders/configure/configure.js +1 -1
  35. package/dist/esm/loaders/configure/public-path.js +6 -3
  36. package/dist/types/common/config/state/init.d.ts.map +1 -1
  37. package/dist/types/common/dom/query-selector.d.ts +2 -0
  38. package/dist/types/common/dom/query-selector.d.ts.map +1 -0
  39. package/dist/types/common/session/session-entity.d.ts +5 -0
  40. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  41. package/dist/types/features/session_replay/aggregate/index.d.ts +11 -14
  42. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  43. package/dist/types/features/utils/feature-base.d.ts.map +1 -1
  44. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  45. package/dist/types/loaders/api/api.d.ts.map +1 -1
  46. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
  47. package/dist/types/loaders/configure/public-path.d.ts +1 -1
  48. package/dist/types/loaders/configure/public-path.d.ts.map +1 -1
  49. package/package.json +2 -2
  50. package/src/cdn/polyfills/lite.js +14 -1
  51. package/src/cdn/polyfills/pro.js +23 -2
  52. package/src/cdn/polyfills/spa.js +24 -1
  53. package/src/common/config/state/init.js +33 -4
  54. package/src/common/dom/query-selector.js +9 -0
  55. package/src/common/session/session-entity.js +20 -1
  56. package/src/common/wrap/wrap-function.js +1 -1
  57. package/src/features/ajax/aggregate/index.js +2 -2
  58. package/src/features/session_replay/aggregate/index.js +82 -34
  59. package/src/features/utils/feature-base.js +1 -2
  60. package/src/features/utils/instrument-base.js +1 -0
  61. package/src/loaders/api/api.js +1 -2
  62. package/src/loaders/api/apiAsync.js +1 -39
  63. package/src/loaders/configure/configure.js +1 -1
  64. package/src/loaders/configure/public-path.js +6 -3
  65. package/src/common/aggregate/aggregator.test.js +0 -107
  66. package/src/common/config/state/configurable.test.js +0 -73
  67. package/src/common/config/state/info.test.js +0 -31
  68. package/src/common/config/state/init.test.js +0 -28
  69. package/src/common/config/state/loader-config.test.js +0 -21
  70. package/src/common/config/state/runtime.test.js +0 -21
  71. package/src/common/constants/env.cdn.test.js +0 -7
  72. package/src/common/constants/env.npm.test.js +0 -7
  73. package/src/common/constants/env.test.js +0 -7
  74. package/src/common/constants/runtime.test.js +0 -176
  75. package/src/common/deny-list/deny-list.test.js +0 -104
  76. package/src/common/drain/drain.test.js +0 -74
  77. package/src/common/event-emitter/contextual-ee.component-test.js +0 -293
  78. package/src/common/event-emitter/handle.test.js +0 -56
  79. package/src/common/event-emitter/register-handler.test.js +0 -61
  80. package/src/common/harvest/harvest-scheduler.test.js +0 -492
  81. package/src/common/harvest/harvest.test.js +0 -813
  82. package/src/common/ids/id.test.js +0 -92
  83. package/src/common/ids/unique-id.test.js +0 -58
  84. package/src/common/session/session-entity.component-test.js +0 -346
  85. package/src/common/storage/local-storage.test.js +0 -17
  86. package/src/common/timer/interaction-timer.component-test.js +0 -212
  87. package/src/common/timer/timer.test.js +0 -99
  88. package/src/common/timing/nav-timing.test.js +0 -161
  89. package/src/common/url/canonicalize-url.test.js +0 -45
  90. package/src/common/url/clean-url.test.js +0 -25
  91. package/src/common/url/encode.test.js +0 -81
  92. package/src/common/url/location.test.js +0 -15
  93. package/src/common/url/parse-url.test.js +0 -110
  94. package/src/common/url/protocol.test.js +0 -17
  95. package/src/common/util/console.test.js +0 -34
  96. package/src/common/util/data-size.test.js +0 -56
  97. package/src/common/util/feature-flags.test.js +0 -94
  98. package/src/common/util/get-or-set.test.js +0 -58
  99. package/src/common/util/invoke.test.js +0 -65
  100. package/src/common/util/map-own.test.js +0 -52
  101. package/src/common/util/obfuscate.component-test.js +0 -173
  102. package/src/common/util/stringify.test.js +0 -49
  103. package/src/common/util/submit-data.test.js +0 -183
  104. package/src/common/util/traverse.test.js +0 -50
  105. package/src/common/vitals/cumulative-layout-shift.test.js +0 -71
  106. package/src/common/vitals/first-contentful-paint.test.js +0 -124
  107. package/src/common/vitals/first-input-delay.test.js +0 -88
  108. package/src/common/vitals/first-paint.test.js +0 -127
  109. package/src/common/vitals/interaction-to-next-paint.test.js +0 -74
  110. package/src/common/vitals/largest-contentful-paint.test.js +0 -94
  111. package/src/common/vitals/long-task.test.js +0 -122
  112. package/src/common/vitals/time-to-first-byte.test.js +0 -147
  113. package/src/common/vitals/vital-metric.test.js +0 -171
  114. package/src/common/wrap/wrap-promise.component-test.js +0 -110
  115. package/src/features/ajax/instrument/distributed-tracing.test.js +0 -375
  116. package/src/features/jserrors/aggregate/canonical-function-name.test.js +0 -13
  117. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +0 -414
  118. package/src/features/jserrors/aggregate/format-stack-trace.test.js +0 -39
  119. package/src/features/jserrors/aggregate/string-hash-code.test.js +0 -12
  120. package/src/features/metrics/aggregate/framework-detection.test.js +0 -332
  121. package/src/features/page_view_timing/aggregate/index.component-test.js +0 -86
  122. package/src/features/session_replay/aggregate/index.component-test.js +0 -317
  123. package/src/features/spa/aggregate/interaction-node.test.js +0 -17
  124. package/src/features/utils/agent-session.test.js +0 -194
  125. package/src/features/utils/aggregate-base.test.js +0 -123
  126. package/src/features/utils/feature-base.test.js +0 -45
  127. package/src/features/utils/handler-cache.test.js +0 -72
  128. package/src/features/utils/instrument-base.test.js +0 -216
  129. package/src/features/utils/lazy-feature-loader.test.js +0 -37
  130. package/src/loaders/api/api.component-test.js +0 -45
  131. package/src/loaders/api/api.test.js +0 -85
  132. package/src/loaders/api/apiAsync.test.js +0 -17
@@ -1,293 +0,0 @@
1
- import { faker } from '@faker-js/faker'
2
-
3
- let mockNREUM
4
- let runtime
5
-
6
- beforeEach(() => {
7
- mockNREUM = {}
8
- runtime = {}
9
-
10
- jest.doMock('../window/nreum', () => ({
11
- __esModule: true,
12
- gosNREUM: jest.fn(() => mockNREUM)
13
- }))
14
-
15
- jest.doMock('../config/config', () => ({
16
- __esModule: true,
17
- getRuntime: jest.fn(() => runtime)
18
- }))
19
- })
20
-
21
- afterEach(() => {
22
- jest.resetModules()
23
- jest.resetAllMocks()
24
- })
25
-
26
- describe('global event-emitter', () => {
27
- test('it sets the global event-emitter on window.NREUM when it does not already exist', async () => {
28
- const { ee } = await import('./contextual-ee')
29
-
30
- expect(ee).toEqual(mockNREUM.ee)
31
- })
32
-
33
- test('it does not set the global event-emitter on window.NREUM when it already exists', async () => {
34
- mockNREUM.ee = {}
35
-
36
- const { ee } = await import('./contextual-ee')
37
-
38
- expect(ee).not.toEqual(mockNREUM.ee)
39
- })
40
- })
41
-
42
- describe('scoping event-emitter', () => {
43
- test('it creates a new child event-emitter', async () => {
44
- const { ee } = await import('./contextual-ee')
45
-
46
- const childName = faker.datatype.uuid()
47
- const result = ee.get(childName)
48
-
49
- expect(result).not.toEqual(mockNREUM.ee)
50
- expect(result).toEqual(ee.get(childName)) // Should always return the same event-emitter
51
- expect(result.debugId).toEqual(childName)
52
- })
53
-
54
- test('it creates a child event-emitter with an isolated backlog', async () => {
55
- const childName = faker.random.alphaNumeric(16)
56
-
57
- jest.doMock('../config/config', () => ({
58
- __esModule: true,
59
- getRuntime: jest.fn(id => {
60
- if (id === childName) {
61
- return { isolatedBacklog: true }
62
- }
63
-
64
- return runtime
65
- })
66
- }))
67
-
68
- const { ee } = await import('./contextual-ee')
69
- const result = ee.get(childName)
70
-
71
- expect(ee.backlog).not.toBe(result.backlog)
72
- })
73
- })
74
-
75
- describe('event-emitter context', () => {
76
- test('it returns a new context', async () => {
77
- const { ee } = await import('./contextual-ee')
78
-
79
- const result = ee.context()
80
-
81
- expect(result).toEqual(expect.objectContaining({
82
- contextId: expect.stringContaining('nr@context:')
83
- }))
84
- })
85
-
86
- test('it returns the same context', async () => {
87
- const { ee } = await import('./contextual-ee')
88
-
89
- const result = ee.context()
90
-
91
- expect(result).toBe(ee.context(result))
92
- })
93
-
94
- test('it adds the context to the provided object', async () => {
95
- const { ee } = await import('./contextual-ee')
96
-
97
- const obj = {}
98
- const result = ee.context(obj)
99
- const ctxKey = Object.getOwnPropertyNames(obj).find(k => k.startsWith('nr@context'))
100
-
101
- expect(result).toBe(obj[ctxKey])
102
- })
103
- })
104
-
105
- describe('event-emitter buffer', () => {
106
- test('it should create a new buffer for the given group', async () => {
107
- const { ee } = await import('./contextual-ee')
108
- const eventType = faker.datatype.uuid()
109
- const group = faker.datatype.uuid()
110
-
111
- ee.buffer([eventType], group)
112
-
113
- expect(ee.backlog).toEqual(expect.objectContaining({
114
- [group]: []
115
- }))
116
- expect(ee.isBuffering(eventType)).toEqual(true)
117
- })
118
-
119
- test('it should default group to "feature"', async () => {
120
- const { ee } = await import('./contextual-ee')
121
- const eventType = faker.datatype.uuid()
122
-
123
- ee.buffer([eventType])
124
-
125
- expect(ee.backlog).toEqual(expect.objectContaining({
126
- feature: []
127
- }))
128
- expect(ee.isBuffering(eventType)).toEqual(true)
129
- })
130
-
131
- test('it should not create buffer if event-emitter is aborted', async () => {
132
- const { ee } = await import('./contextual-ee')
133
- const eventType = faker.datatype.uuid()
134
- const group = faker.datatype.uuid()
135
-
136
- ee.backlog = {
137
- api: ['foo', 'bar', 'baz']
138
- }
139
- ee.abort()
140
- ee.buffer([eventType], group)
141
-
142
- expect(ee.backlog).toEqual({})
143
- expect(ee.isBuffering(eventType)).toEqual(false)
144
- })
145
- })
146
-
147
- describe('event-emitter abort', () => {
148
- test('it aborts if there is an API backlog', async () => {
149
- const { ee } = await import('./contextual-ee')
150
-
151
- ee.backlog = {
152
- api: ['foo', 'bar', 'baz']
153
- }
154
- ee.abort()
155
-
156
- expect(ee.aborted).toEqual(true)
157
- expect(ee.backlog).toEqual({})
158
- })
159
-
160
- test('it aborts if there is a feature backlog', async () => {
161
- const { ee } = await import('./contextual-ee')
162
-
163
- ee.backlog = {
164
- feature: ['foo', 'bar', 'baz']
165
- }
166
- ee.abort()
167
-
168
- expect(ee.aborted).toEqual(true)
169
- expect(ee.backlog).toEqual({})
170
- })
171
- })
172
-
173
- describe('event-emitter emit', () => {
174
- test('should execute the listener', async () => {
175
- const { ee } = await import('./contextual-ee')
176
- const mockListener = jest.fn()
177
- const eventType = faker.datatype.uuid()
178
- const eventArgs = ['a', 'b', 'c']
179
-
180
- ee.on(eventType, mockListener)
181
- ee.emit(eventType, eventArgs)
182
-
183
- expect(mockListener).toHaveBeenCalledWith(eventArgs[0], eventArgs[1], eventArgs[2])
184
- })
185
-
186
- test('should not execute the listener after removal', async () => {
187
- const { ee } = await import('./contextual-ee')
188
- const mockListener = jest.fn()
189
- const eventType = faker.datatype.uuid()
190
- const eventArgs = ['a', 'b', 'c']
191
-
192
- ee.on(eventType, mockListener)
193
- ee.emit(eventType, eventArgs)
194
- ee.removeEventListener(eventType, mockListener)
195
- ee.emit(eventType, eventArgs)
196
-
197
- expect(mockListener).toHaveBeenCalledTimes(1)
198
- })
199
-
200
- test('should return early if global event-emitter is aborted', async () => {
201
- const { ee } = await import('./contextual-ee')
202
- const mockListener = jest.fn()
203
- const eventType = faker.datatype.uuid()
204
- const eventArgs = ['a', 'b', 'c']
205
-
206
- ee.backlog = {
207
- api: ['foo', 'bar', 'baz']
208
- }
209
- ee.abort()
210
- ee.on(eventType, mockListener)
211
- ee.emit(eventType, eventArgs)
212
-
213
- expect(mockListener).toHaveBeenCalledTimes(0)
214
- })
215
-
216
- test('should still emit if global event-emitter is aborted but force flag is true', async () => {
217
- const { ee } = await import('./contextual-ee')
218
- const scopeEE = ee.get(faker.datatype.uuid())
219
- const mockScopeListener = jest.fn()
220
- const eventType = faker.datatype.uuid()
221
- const eventArgs = ['a', 'b', 'c']
222
-
223
- ee.backlog = {
224
- api: ['foo', 'bar', 'baz']
225
- }
226
- ee.abort()
227
- scopeEE.on(eventType, mockScopeListener)
228
- scopeEE.emit(eventType, eventArgs, {}, true)
229
-
230
- expect(mockScopeListener).toHaveBeenCalledTimes(1)
231
- })
232
-
233
- test('should bubble the event if bubble flag is true', async () => {
234
- const { ee } = await import('./contextual-ee')
235
- const scopeEE = ee.get(faker.datatype.uuid())
236
- const mockListener = jest.fn()
237
- const mockScopeListener = jest.fn()
238
- const eventType = faker.datatype.uuid()
239
- const eventArgs = ['a', 'b', 'c']
240
-
241
- ee.on(eventType, mockListener)
242
- scopeEE.on(eventType, mockScopeListener)
243
- scopeEE.emit(eventType, eventArgs, {}, false, true)
244
-
245
- expect(mockScopeListener).toHaveBeenCalledTimes(1)
246
- expect(mockListener).toHaveBeenCalledTimes(1)
247
- })
248
-
249
- test('should not bubble the event if bubble flag is false', async () => {
250
- const { ee } = await import('./contextual-ee')
251
- const scopeEE = ee.get(faker.datatype.uuid())
252
- const mockListener = jest.fn()
253
- const mockScopeListener = jest.fn()
254
- const eventType = faker.datatype.uuid()
255
- const eventArgs = ['a', 'b', 'c']
256
-
257
- ee.on(eventType, mockListener)
258
- scopeEE.on(eventType, mockScopeListener)
259
- scopeEE.emit(eventType, eventArgs, {}, false, false)
260
-
261
- expect(mockScopeListener).toHaveBeenCalledTimes(1)
262
- expect(mockListener).not.toHaveBeenCalled()
263
- })
264
-
265
- test('should buffer the event on the scoped event-emitter', async () => {
266
- const { ee } = await import('./contextual-ee')
267
- const scopeEE = ee.get(faker.datatype.uuid())
268
- const mockListener = jest.fn()
269
- const mockScopeListener = jest.fn()
270
- const eventType = faker.datatype.uuid()
271
- const eventArgs = ['a', 'b', 'c']
272
-
273
- ee.on(eventType, mockListener)
274
- ee.buffer([eventType])
275
- scopeEE.on(eventType, mockScopeListener)
276
- scopeEE.buffer([eventType])
277
- scopeEE.emit(eventType, eventArgs, {}, false, false)
278
-
279
- expect(mockScopeListener).toHaveBeenCalledTimes(1)
280
- expect(mockListener).not.toHaveBeenCalled()
281
- expect(scopeEE.backlog.feature).toEqual(expect.arrayContaining([
282
- expect.arrayContaining([
283
- scopeEE,
284
- eventType,
285
- eventArgs,
286
- expect.objectContaining({
287
- contextId: expect.stringContaining('nr@context:')
288
- })
289
- ])
290
- ]))
291
- expect(ee.backlog.feature).toEqual(scopeEE.backlog.feature)
292
- })
293
- })
@@ -1,56 +0,0 @@
1
- import { faker } from '@faker-js/faker'
2
-
3
- jest.mock('./contextual-ee', () => ({
4
- __esModule: true,
5
- ee: {
6
- buffer: jest.fn(),
7
- emit: jest.fn(),
8
- get: jest.fn(() => ({
9
- buffer: jest.fn(),
10
- emit: jest.fn()
11
- }))
12
- }
13
- }))
14
-
15
- afterEach(() => {
16
- jest.resetModules()
17
- jest.resetAllMocks()
18
- })
19
-
20
- test('it should create and use a default event-emitter', async () => {
21
- const { ee } = await import('./contextual-ee')
22
- const { handle } = await import('./handle')
23
-
24
- const handleEE = jest.mocked(ee.get).mock.results[0].value
25
- const eventType = faker.datatype.uuid()
26
- const eventArgs = ['a', 'b', 'c']
27
- const eventContext = {}
28
- const eventGroup = faker.datatype.uuid()
29
-
30
- handle(eventType, eventArgs, eventContext, eventGroup)
31
-
32
- expect(handleEE.buffer).toHaveBeenCalledWith([eventType], eventGroup)
33
- expect(handleEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext)
34
- })
35
-
36
- test('it should use the provided scoped event-emitter', async () => {
37
- const { ee } = await import('./contextual-ee')
38
- const { handle } = await import('./handle')
39
- const scopedEE = {
40
- buffer: jest.fn(),
41
- emit: jest.fn()
42
- }
43
-
44
- const handleEE = jest.mocked(ee.get).mock.results[0].value
45
- const eventType = faker.datatype.uuid()
46
- const eventArgs = ['a', 'b', 'c']
47
- const eventContext = {}
48
- const eventGroup = faker.datatype.uuid()
49
-
50
- handle(eventType, eventArgs, eventContext, eventGroup, scopedEE)
51
-
52
- expect(handleEE.buffer).not.toHaveBeenCalled()
53
- expect(handleEE.emit).not.toHaveBeenCalled()
54
- expect(scopedEE.buffer).toHaveBeenCalledWith([eventType], eventGroup)
55
- expect(scopedEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext)
56
- })
@@ -1,61 +0,0 @@
1
- import { faker } from '@faker-js/faker'
2
-
3
- jest.mock('./handle', () => ({
4
- __esModule: true,
5
- handleEE: {}
6
- }))
7
-
8
- afterEach(() => {
9
- jest.resetModules()
10
- jest.resetAllMocks()
11
- })
12
-
13
- test('should default group to "feature"', async () => {
14
- const { handleEE } = await import('./handle')
15
- const { registerHandler } = await import('./register-handler')
16
-
17
- const eventType = faker.datatype.uuid()
18
- const eventHandler = jest.fn()
19
-
20
- registerHandler(eventType, eventHandler)
21
-
22
- expect(registerHandler.handlers.feature).toEqual(expect.objectContaining({
23
- [eventType]: [expect.arrayContaining([
24
- handleEE, eventHandler
25
- ])]
26
- }))
27
- })
28
-
29
- test('should use the provided group', async () => {
30
- const { handleEE } = await import('./handle')
31
- const { registerHandler } = await import('./register-handler')
32
-
33
- const eventType = faker.datatype.uuid()
34
- const eventGroup = faker.datatype.uuid()
35
- const eventHandler = jest.fn()
36
-
37
- registerHandler(eventType, eventHandler, eventGroup)
38
-
39
- expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
40
- [eventType]: [expect.arrayContaining([
41
- handleEE, eventHandler
42
- ])]
43
- }))
44
- })
45
-
46
- test('should use the provided event-emitter', async () => {
47
- const { registerHandler } = await import('./register-handler')
48
-
49
- const scopedEE = {}
50
- const eventType = faker.datatype.uuid()
51
- const eventGroup = faker.datatype.uuid()
52
- const eventHandler = jest.fn()
53
-
54
- registerHandler(eventType, eventHandler, eventGroup, scopedEE)
55
-
56
- expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
57
- [eventType]: [expect.arrayContaining([
58
- scopedEE, eventHandler
59
- ])]
60
- }))
61
- })