@atlaskit/react-ufo 3.12.4 → 3.13.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 (109) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +2 -1
  3. package/dist/cjs/create-payload/utils/get-vc-metrics.js +2 -1
  4. package/dist/cjs/vc/index.js +4 -2
  5. package/dist/cjs/vc/vc-observer/getVCRevisionDebugDetails.js +41 -0
  6. package/dist/cjs/vc/vc-observer/index.js +63 -33
  7. package/dist/cjs/vc/vc-observer/observers/index.js +3 -2
  8. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +38 -12
  9. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/ssr-scripts/collectSSRPlaceholderDimensions.js +9 -0
  10. package/dist/cjs/vc/vc-observer-new/index.js +13 -7
  11. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
  12. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  13. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -4
  14. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +108 -0
  15. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +16 -57
  16. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +15 -5
  17. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  18. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -1
  19. package/dist/es2019/create-payload/utils/get-vc-metrics.js +1 -0
  20. package/dist/es2019/vc/index.js +4 -2
  21. package/dist/es2019/vc/vc-observer/getVCRevisionDebugDetails.js +32 -0
  22. package/dist/es2019/vc/vc-observer/index.js +36 -1
  23. package/dist/es2019/vc/vc-observer/observers/index.js +2 -1
  24. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +38 -13
  25. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/ssr-scripts/collectSSRPlaceholderDimensions.js +9 -1
  26. package/dist/es2019/vc/vc-observer-new/index.js +12 -6
  27. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +115 -17
  28. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  29. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +44 -1
  30. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +75 -0
  31. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -20
  32. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +15 -5
  33. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  34. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +2 -1
  35. package/dist/esm/create-payload/utils/get-vc-metrics.js +2 -1
  36. package/dist/esm/vc/index.js +4 -2
  37. package/dist/esm/vc/vc-observer/getVCRevisionDebugDetails.js +35 -0
  38. package/dist/esm/vc/vc-observer/index.js +63 -33
  39. package/dist/esm/vc/vc-observer/observers/index.js +3 -2
  40. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +38 -12
  41. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/ssr-scripts/collectSSRPlaceholderDimensions.js +9 -0
  42. package/dist/esm/vc/vc-observer-new/index.js +13 -7
  43. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
  44. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  45. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -5
  46. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +106 -0
  47. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -55
  48. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +15 -5
  49. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  50. package/dist/types/config/index.d.ts +1 -0
  51. package/dist/types/vc/types.d.ts +2 -0
  52. package/dist/types/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
  53. package/dist/types/vc/vc-observer/index.d.ts +1 -1
  54. package/dist/types/vc/vc-observer/observers/index.d.ts +3 -0
  55. package/dist/types/vc/vc-observer/observers/ssr-placeholders/index.d.ts +4 -1
  56. package/dist/types/vc/vc-observer/observers/ssr-placeholders/ssr-scripts/collectSSRPlaceholderDimensions.d.ts +1 -1
  57. package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
  58. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  59. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
  60. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
  61. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
  62. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
  63. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  64. package/dist/types/vc/vc-observer-new/types.d.ts +5 -1
  65. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  66. package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
  67. package/dist/types-ts4.5/config/index.d.ts +1 -0
  68. package/dist/types-ts4.5/vc/types.d.ts +2 -0
  69. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
  70. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +1 -1
  71. package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +3 -0
  72. package/dist/types-ts4.5/vc/vc-observer/observers/ssr-placeholders/index.d.ts +4 -1
  73. package/dist/types-ts4.5/vc/vc-observer/observers/ssr-placeholders/ssr-scripts/collectSSRPlaceholderDimensions.d.ts +1 -1
  74. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
  75. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  76. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
  77. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
  78. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
  79. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
  80. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  81. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +5 -1
  82. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  83. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
  84. package/package.json +4 -1
  85. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -367
  86. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -398
  87. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -5
  88. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -152
  89. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -108
  90. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -248
  91. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -263
  92. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
  93. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -99
  94. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -60
  95. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -361
  96. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -391
  97. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
  98. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -145
  99. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -101
  100. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
  101. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
  102. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
  103. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
  104. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
  105. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
  106. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
  107. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
  108. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
  109. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
@@ -27,6 +27,31 @@ async function calculateTTVCPercentiles({
27
27
  const totalPixels = canvasDimenstions.width * canvasDimenstions.height;
28
28
  return calculatePercentiles(timePixelCounts, elementMap, percentiles, totalPixels, startTime);
29
29
  }
30
+ async function calculateTTVCPercentilesWithDebugInfo({
31
+ viewport,
32
+ orderedEntries,
33
+ startTime
34
+ }) {
35
+ const canvas = new ViewportCanvas(viewport, fg('platform_ufo_canvas_heatmap_full_precision') ? 1 : 0.25);
36
+ const elementMap = new Map();
37
+ for (const entry of orderedEntries) {
38
+ if (!('rect' in entry.data)) {
39
+ continue;
40
+ }
41
+ const rect = entry.data.rect;
42
+ canvas.drawRect(rect, entry.time);
43
+ if (!elementMap.has(entry.time)) {
44
+ elementMap.set(entry.time, []);
45
+ }
46
+ elementMap.get(entry.time).push(entry.data);
47
+ }
48
+
49
+ // Get pixel counts
50
+ const timePixelCounts = await canvas.getPixelCounts();
51
+ const canvasDimensions = canvas.getScaledDimensions();
52
+ const totalPixels = canvasDimensions.width * canvasDimensions.height;
53
+ return calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, totalPixels, startTime);
54
+ }
30
55
  export default calculateTTVCPercentiles;
31
56
  export function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels, startTime) {
32
57
  const results = {};
@@ -70,4 +95,22 @@ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPerce
70
95
  previousResult = results[`${percentile}`];
71
96
  }
72
97
  return results;
73
- }
98
+ }
99
+ export function calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, totalPixels, startTime) {
100
+ const results = new Array(elementMap.size);
101
+ let cumulativePixels = 0;
102
+ const sortedEntries = Array.from(timePixelCounts.entries()).sort(([timeA], [timeB]) => Number(timeA) - Number(timeB));
103
+ for (let i = 0; i < sortedEntries.length; i++) {
104
+ const [time, pixelCount] = sortedEntries[i];
105
+ cumulativePixels += pixelCount;
106
+ const percentCovered = cumulativePixels / totalPixels * 100;
107
+ const entryDatas = elementMap.get(time) || [];
108
+ results[i] = {
109
+ time: Math.round(Number(time - startTime)),
110
+ viewportPercentage: percentCovered,
111
+ entries: Array.from(entryDatas)
112
+ };
113
+ }
114
+ return results;
115
+ }
116
+ export { calculateTTVCPercentilesWithDebugInfo };
@@ -0,0 +1,75 @@
1
+ import { calculatePercentilesWithDebugInfo } from './index';
2
+
3
+ // Test utilities
4
+ const createMockRect = (x = 0, y = 0, width = 100, height = 100) => new MockDOMRect(x, y, width, height);
5
+ const createViewportEntry = (elementName, rect = createMockRect(), visible = true, type = 'mutation:element') => ({
6
+ elementName,
7
+ rect,
8
+ visible,
9
+ type
10
+ });
11
+ const createTimePixelCounts = counts => new Map(counts);
12
+ const createElementMap = entries => new Map(entries);
13
+ const createExpectedResult = (time, viewportPercentage, entries) => ({
14
+ time,
15
+ viewportPercentage,
16
+ entries
17
+ });
18
+ class MockDOMRect {
19
+ constructor(x, y, width, height) {
20
+ this.x = x;
21
+ this.y = y;
22
+ this.width = width;
23
+ this.height = height;
24
+ }
25
+ get bottom() {
26
+ return this.y + this.height;
27
+ }
28
+ get left() {
29
+ return this.x;
30
+ }
31
+ get right() {
32
+ return this.x + this.width;
33
+ }
34
+ get top() {
35
+ return this.y;
36
+ }
37
+ toJSON() {
38
+ return {
39
+ x: this.x,
40
+ y: this.y,
41
+ width: this.width,
42
+ height: this.height
43
+ };
44
+ }
45
+ }
46
+ describe('calculatePercentilesWithDebugInfo', () => {
47
+ it('should correctly calculate percentiles with accumulated elements from timestamps', () => {
48
+ const timePixelCounts = createTimePixelCounts([[100, 10], [200, 20], [300, 10], [400, 10]]);
49
+ const elementMap = createElementMap([[100, [createViewportEntry('div'), createViewportEntry('span')]], [200, [createViewportEntry('img')]], [300, [createViewportEntry('p'), createViewportEntry('a')]], [400, [createViewportEntry('img')]]]);
50
+ const expected = [createExpectedResult(100, 20, [createViewportEntry('div'), createViewportEntry('span')]), createExpectedResult(200, 60, [createViewportEntry('img')]), createExpectedResult(300, 80, [createViewportEntry('p'), createViewportEntry('a')]), createExpectedResult(400, 100, [createViewportEntry('img')])];
51
+ const result = calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, 50, 0);
52
+ expect(result).toEqual(expected);
53
+ });
54
+ it('should handle empty entries gracefully', () => {
55
+ const timePixelCounts = new Map();
56
+ const elementMap = new Map();
57
+ const expected = [];
58
+ const result = calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, 100, 0);
59
+ expect(result).toEqual(expected);
60
+ });
61
+ it('should handle non-sequential timestamps', () => {
62
+ const timePixelCounts = createTimePixelCounts([[300, 70], [100, 30]]);
63
+ const elementMap = createElementMap([[300, [createViewportEntry('p'), createViewportEntry('a')]], [100, [createViewportEntry('div')]]]);
64
+ const expected = [createExpectedResult(100, 30, [createViewportEntry('div')]), createExpectedResult(300, 100, [createViewportEntry('p'), createViewportEntry('a')])];
65
+ const result = calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, 100, 0);
66
+ expect(result).toEqual(expected);
67
+ });
68
+ it('should correctly calculate percentiles with startTime offset', () => {
69
+ const timePixelCounts = createTimePixelCounts([[100, 10], [200, 20], [300, 10], [400, 10]]);
70
+ const elementMap = createElementMap([[100, [createViewportEntry('div'), createViewportEntry('span')]], [200, [createViewportEntry('img')]], [300, [createViewportEntry('p'), createViewportEntry('a')]], [400, [createViewportEntry('img')]]]);
71
+ const expected = [createExpectedResult(50, 20, [createViewportEntry('div'), createViewportEntry('span')]), createExpectedResult(150, 60, [createViewportEntry('img')]), createExpectedResult(250, 80, [createViewportEntry('p'), createViewportEntry('a')]), createExpectedResult(350, 100, [createViewportEntry('img')])];
72
+ const result = calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, 50, 50);
73
+ expect(result).toEqual(expected);
74
+ });
75
+ });
@@ -1,20 +1,2 @@
1
- import calcUsingCanvas from './canvas-heatmap';
2
- import calcUsingOldHeatmap from './heatmap';
3
- import calcUsingRectSweepingLine from './rect-sweeping-line';
4
- async function calculateTTVCPercentiles(arg) {
5
- const algo = 'canvas_heatmap';
6
- if (algo === 'canvas_heatmap') {
7
- const vcDetails = await calcUsingCanvas(arg);
8
- return vcDetails;
9
- }
10
- if (algo === 'rect_sweeping') {
11
- const vcDetails = await calcUsingRectSweepingLine(arg);
12
- return vcDetails;
13
- }
14
- if (algo === 'old_heatmap') {
15
- const vcDetails = await calcUsingOldHeatmap(arg);
16
- return vcDetails;
17
- }
18
- throw new Error('unexpected Error algo not chosen correctly');
19
- }
20
- export default calculateTTVCPercentiles;
1
+ export { default as calculateTTVCPercentiles } from './canvas-heatmap';
2
+ export { calculateTTVCPercentilesWithDebugInfo } from './canvas-heatmap';
@@ -108,7 +108,9 @@ export default class ViewportObserver {
108
108
  });
109
109
  _defineProperty(this, "handleAttributeMutation", ({
110
110
  target,
111
- attributeName
111
+ attributeName,
112
+ oldValue,
113
+ newValue
112
114
  }) => {
113
115
  var _this$intersectionObs4;
114
116
  (_this$intersectionObs4 = this.intersectionObserver) === null || _this$intersectionObs4 === void 0 ? void 0 : _this$intersectionObs4.watchAndTag(target, ({
@@ -119,7 +121,9 @@ export default class ViewportObserver {
119
121
  return {
120
122
  type: 'mutation:media',
121
123
  mutationData: {
122
- attributeName
124
+ attributeName,
125
+ oldValue,
126
+ newValue
123
127
  }
124
128
  };
125
129
  }
@@ -131,7 +135,9 @@ export default class ViewportObserver {
131
135
  return {
132
136
  type: 'mutation:attribute:non-visual-style',
133
137
  mutationData: {
134
- attributeName
138
+ attributeName,
139
+ oldValue,
140
+ newValue
135
141
  }
136
142
  };
137
143
  }
@@ -140,14 +146,18 @@ export default class ViewportObserver {
140
146
  return {
141
147
  type: 'mutation:attribute:no-layout-shift',
142
148
  mutationData: {
143
- attributeName
149
+ attributeName,
150
+ oldValue,
151
+ newValue
144
152
  }
145
153
  };
146
154
  }
147
155
  return {
148
156
  type: 'mutation:attribute',
149
157
  mutationData: {
150
- attributeName
158
+ attributeName,
159
+ oldValue,
160
+ newValue
151
161
  }
152
162
  };
153
163
  });
@@ -30,7 +30,9 @@ function createMutationObserver({
30
30
  var _mut$attributeName;
31
31
  onAttributeMutation({
32
32
  target: mut.target,
33
- attributeName: (_mut$attributeName = mut.attributeName) !== null && _mut$attributeName !== void 0 ? _mut$attributeName : 'unknown'
33
+ attributeName: (_mut$attributeName = mut.attributeName) !== null && _mut$attributeName !== void 0 ? _mut$attributeName : 'unknown',
34
+ oldValue,
35
+ newValue
34
36
  });
35
37
  }
36
38
  continue;
@@ -101,7 +101,8 @@ function _getExperimentalVCMetrics() {
101
101
  isEventAborted: !!interaction.abortReason,
102
102
  prefix: prefix,
103
103
  vc: interaction.vc,
104
- experienceKey: interaction.ufoName
104
+ experienceKey: interaction.ufoName,
105
+ interactionId: interaction.id
105
106
  });
106
107
  case 4:
107
108
  result = _context.sent;
@@ -58,7 +58,8 @@ function _getVCMetrics() {
58
58
  prefix: prefix,
59
59
  vc: interaction.vc,
60
60
  isEventAborted: interactionStatus.originalInteractionStatus !== 'SUCCEEDED',
61
- experienceKey: interaction.ufoName
61
+ experienceKey: interaction.ufoName,
62
+ interactionId: interaction.id
62
63
  }, ssr));
63
64
  case 18:
64
65
  result = _context.sent;
@@ -122,7 +122,8 @@ export var VCObserverWrapper = /*#__PURE__*/function () {
122
122
  _context.next = 13;
123
123
  return (_this$newVCObserver5 = this.newVCObserver) === null || _this$newVCObserver5 === void 0 ? void 0 : _this$newVCObserver5.getVCResult({
124
124
  start: param.start,
125
- stop: param.stop
125
+ stop: param.stop,
126
+ interactionId: param.interactionId
126
127
  });
127
128
  case 13:
128
129
  _context.t1 = _context.sent;
@@ -149,7 +150,8 @@ export var VCObserverWrapper = /*#__PURE__*/function () {
149
150
  _context.next = 28;
150
151
  return (_this$newVCObserver6 = this.newVCObserver) === null || _this$newVCObserver6 === void 0 ? void 0 : _this$newVCObserver6.getVCResult({
151
152
  start: param.start,
152
- stop: param.stop
153
+ stop: param.stop,
154
+ interactionId: param.interactionId
153
155
  });
154
156
  case 28:
155
157
  newResult = _context.sent;
@@ -0,0 +1,35 @@
1
+ export function getVCRevisionDebugDetails(_ref) {
2
+ var revision = _ref.revision,
3
+ isClean = _ref.isClean,
4
+ abortReason = _ref.abortReason,
5
+ VCEntries = _ref.VCEntries,
6
+ componentsLog = _ref.componentsLog,
7
+ interactionId = _ref.interactionId;
8
+ return {
9
+ revision: revision,
10
+ isClean: isClean,
11
+ abortReason: abortReason,
12
+ vcLogs: VCEntries.map(function (entry) {
13
+ return {
14
+ time: entry.time,
15
+ viewportPercentage: entry.vc,
16
+ entries: entry.elements.map(function (element) {
17
+ var _componentsLog$entry$;
18
+ var logEntry = (_componentsLog$entry$ = componentsLog[entry.time]) === null || _componentsLog$entry$ === void 0 ? void 0 : _componentsLog$entry$.find(function (log) {
19
+ return log.targetName === element;
20
+ });
21
+ return {
22
+ elementName: element,
23
+ type: logEntry === null || logEntry === void 0 ? void 0 : logEntry.type,
24
+ rect: logEntry === null || logEntry === void 0 ? void 0 : logEntry.intersectionRect,
25
+ visible: true,
26
+ attributeName: logEntry === null || logEntry === void 0 ? void 0 : logEntry.attributeName,
27
+ oldValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.oldValue,
28
+ newValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.newValue
29
+ };
30
+ })
31
+ };
32
+ }),
33
+ interactionId: interactionId
34
+ };
35
+ }
@@ -13,6 +13,7 @@ import { fg } from '@atlaskit/platform-feature-flags';
13
13
  import { isVCRevisionEnabled } from '../../config';
14
14
  import { getActiveInteraction } from '../../interaction-metrics';
15
15
  import { attachAbortListeners } from './attachAbortListeners';
16
+ import { getVCRevisionDebugDetails } from './getVCRevisionDebugDetails';
16
17
  import { getVCRevisionsData } from './getVCRevisionsData';
17
18
  import { getViewportHeight, getViewportWidth } from './getViewport';
18
19
  import { MultiRevisionHeatmap } from './heatmap/heatmap';
@@ -99,11 +100,11 @@ export var VCObserver = /*#__PURE__*/function () {
99
100
  });
100
101
  _defineProperty(this, "getVCResult", /*#__PURE__*/function () {
101
102
  var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref3) {
102
- var start, stop, tti, prefix, ssr, vc, isEventAborted, experienceKey, startTime, fullPrefix, rawData, abortReason, abortReasonInfo, heatmap, heatmapNext, outOfBoundaryInfo, totalTime, componentsLog, viewport, devToolsEnabled, ratios, multiHeatmap, isTTVCv1Disabled, vcAbortedResultWithRevisions, ttvcV1Result, VC, VCBox, VCEntries, totalPainted, _componentsLog, vcNext, outOfBoundary, stopTime, ttvcV1DevToolInfo, ttvcV2DevToolInfo, isVCClean, revisionsData, speedIndex, isTTVCv3Enabled;
103
+ var start, stop, tti, prefix, ssr, vc, isEventAborted, experienceKey, interactionId, startTime, fullPrefix, rawData, abortReason, abortReasonInfo, heatmap, heatmapNext, outOfBoundaryInfo, totalTime, componentsLog, viewport, devToolsEnabled, ratios, multiHeatmap, isTTVCv1Disabled, vcAbortedResultWithRevisions, ttvcV1Result, VC, VCBox, VCEntries, totalPainted, _componentsLog, vcNext, outOfBoundary, stopTime, ttvcV1DevToolInfo, ttvcV2DevToolInfo, _ufo_devtool_onVCRev2, _ref10, _ufo_devtool_onVCRev, _ref9, isVCClean, revisionsData, speedIndex, isTTVCv3Enabled;
103
104
  return _regeneratorRuntime.wrap(function _callee$(_context) {
104
105
  while (1) switch (_context.prev = _context.next) {
105
106
  case 0:
106
- start = _ref3.start, stop = _ref3.stop, tti = _ref3.tti, prefix = _ref3.prefix, ssr = _ref3.ssr, vc = _ref3.vc, isEventAborted = _ref3.isEventAborted, experienceKey = _ref3.experienceKey;
107
+ start = _ref3.start, stop = _ref3.stop, tti = _ref3.tti, prefix = _ref3.prefix, ssr = _ref3.ssr, vc = _ref3.vc, isEventAborted = _ref3.isEventAborted, experienceKey = _ref3.experienceKey, interactionId = _ref3.interactionId;
107
108
  startTime = performance.now(); // add local measurement
108
109
  fullPrefix = prefix !== undefined && prefix !== '' ? "".concat(prefix, ":") : '';
109
110
  rawData = vc !== undefined ? vc : _this.getVCRawData();
@@ -280,6 +281,31 @@ export var VCObserver = /*#__PURE__*/function () {
280
281
  entries: isTTVCv1Disabled ? vcNext.VCEntries.rel : VCEntries.rel
281
282
  }
282
283
  }));
284
+
285
+ // Add devtool callback for both v1 and v2
286
+ if (typeof window.__ufo_devtool_onVCRevisionReady__ === 'function' && fg('platform_ufo_ttvc_v3_devtool')) {
287
+ // Handle v1 if not disabled
288
+ if (!isTTVCv1Disabled) {
289
+ (_ufo_devtool_onVCRev = (_ref9 = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev === void 0 || _ufo_devtool_onVCRev.call(_ref9, getVCRevisionDebugDetails({
290
+ revision: 'fy25.01',
291
+ isClean: !abortReasonInfo,
292
+ abortReason: abortReason.reason,
293
+ VCEntries: VCEntries.rel,
294
+ componentsLog: componentsLog,
295
+ interactionId: interactionId
296
+ }));
297
+ }
298
+
299
+ // Handle v2
300
+ (_ufo_devtool_onVCRev2 = (_ref10 = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev2 === void 0 || _ufo_devtool_onVCRev2.call(_ref10, getVCRevisionDebugDetails({
301
+ revision: 'fy25.02',
302
+ isClean: !abortReasonInfo,
303
+ abortReason: abortReason.reason,
304
+ VCEntries: vcNext.VCEntries.rel,
305
+ componentsLog: componentsLog,
306
+ interactionId: interactionId
307
+ }));
308
+ }
283
309
  }
284
310
  } catch (e) {
285
311
  /* do nothing */
@@ -380,16 +406,16 @@ export var VCObserver = /*#__PURE__*/function () {
380
406
  });
381
407
  }
382
408
  });
383
- _defineProperty(this, "onViewportChangeDetected", function (_ref9) {
384
- var element = _ref9.element,
385
- type = _ref9.type,
386
- ignoreReason = _ref9.ignoreReason,
387
- timestamp = _ref9.timestamp,
388
- targetName = _ref9.targetName,
389
- intersectionRect = _ref9.intersectionRect,
390
- attributeName = _ref9.attributeName,
391
- oldValue = _ref9.oldValue,
392
- newValue = _ref9.newValue;
409
+ _defineProperty(this, "onViewportChangeDetected", function (_ref11) {
410
+ var element = _ref11.element,
411
+ type = _ref11.type,
412
+ ignoreReason = _ref11.ignoreReason,
413
+ timestamp = _ref11.timestamp,
414
+ targetName = _ref11.targetName,
415
+ intersectionRect = _ref11.intersectionRect,
416
+ attributeName = _ref11.attributeName,
417
+ oldValue = _ref11.oldValue,
418
+ newValue = _ref11.newValue;
393
419
  if (_this.multiHeatmap === null) {
394
420
  return;
395
421
  }
@@ -474,10 +500,10 @@ export var VCObserver = /*#__PURE__*/function () {
474
500
  var unbinds = attachAbortListeners(window, _this.viewport, _this.abortReasonCallback);
475
501
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__) {
476
502
  var _window2;
477
- Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref10) {
478
- var _ref11 = _slicedToArray(_ref10, 2),
479
- key = _ref11[0],
480
- time = _ref11[1];
503
+ Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref12) {
504
+ var _ref13 = _slicedToArray(_ref12, 2),
505
+ key = _ref13[0],
506
+ time = _ref13[1];
481
507
  if (time) {
482
508
  _this.abortReasonCallback(key, time);
483
509
  }
@@ -490,6 +516,7 @@ export var VCObserver = /*#__PURE__*/function () {
490
516
  this.arraySize = options.heatmapSize || 200;
491
517
  this.devToolsEnabled = options.devToolsEnabled || false;
492
518
  this.oldDomUpdatesEnabled = options.oldDomUpdates || false;
519
+ var ssrEnablePageLayoutPlaceholder = options.ssrEnablePageLayoutPlaceholder;
493
520
  this.observers = new Observers({
494
521
  selectorConfig: options.selectorConfig || {
495
522
  id: false,
@@ -497,6 +524,9 @@ export var VCObserver = /*#__PURE__*/function () {
497
524
  role: false,
498
525
  className: true,
499
526
  dataVC: true
527
+ },
528
+ SSRConfig: {
529
+ enablePageLayoutPlaceholder: ssrEnablePageLayoutPlaceholder || false
500
530
  }
501
531
  });
502
532
  this.heatmap = !isVCRevisionEnabled('fy25.01') ? [] : this.getCleanHeatmap();
@@ -510,8 +540,8 @@ export var VCObserver = /*#__PURE__*/function () {
510
540
  }
511
541
  return _createClass(VCObserver, [{
512
542
  key: "start",
513
- value: function start(_ref12) {
514
- var startTime = _ref12.startTime;
543
+ value: function start(_ref14) {
544
+ var startTime = _ref14.startTime;
515
545
  this.active = true;
516
546
  if (this.observers.isBrowserSupported()) {
517
547
  this.setViewportSize();
@@ -533,12 +563,12 @@ export var VCObserver = /*#__PURE__*/function () {
533
563
  }, {
534
564
  key: "getIgnoredElements",
535
565
  value: function getIgnoredElements(componentsLog) {
536
- return Object.values(componentsLog).flat().filter(function (_ref13) {
537
- var ignoreReason = _ref13.ignoreReason;
566
+ return Object.values(componentsLog).flat().filter(function (_ref15) {
567
+ var ignoreReason = _ref15.ignoreReason;
538
568
  return Boolean(ignoreReason);
539
- }).map(function (_ref14) {
540
- var targetName = _ref14.targetName,
541
- ignoreReason = _ref14.ignoreReason;
569
+ }).map(function (_ref16) {
570
+ var targetName = _ref16.targetName,
571
+ ignoreReason = _ref16.ignoreReason;
542
572
  return {
543
573
  targetName: targetName,
544
574
  ignoreReason: ignoreReason
@@ -661,12 +691,12 @@ export var VCObserver = /*#__PURE__*/function () {
661
691
  }
662
692
  }], [{
663
693
  key: "calculateVC",
664
- value: function calculateVC(_ref15) {
665
- var heatmap = _ref15.heatmap,
666
- _ref15$ssr = _ref15.ssr,
667
- ssr = _ref15$ssr === void 0 ? UNUSED_SECTOR : _ref15$ssr,
668
- componentsLog = _ref15.componentsLog,
669
- viewport = _ref15.viewport;
694
+ value: function calculateVC(_ref17) {
695
+ var heatmap = _ref17.heatmap,
696
+ _ref17$ssr = _ref17.ssr,
697
+ ssr = _ref17$ssr === void 0 ? UNUSED_SECTOR : _ref17$ssr,
698
+ componentsLog = _ref17.componentsLog,
699
+ viewport = _ref17.viewport;
670
700
  var lastUpdate = {};
671
701
  var totalPainted = 0;
672
702
  if (ssr !== UNUSED_SECTOR) {
@@ -732,11 +762,11 @@ export var VCObserver = /*#__PURE__*/function () {
732
762
  });
733
763
  return VCRatio;
734
764
  }, 0);
735
- var VCEntries = entries.reduce(function (acc, _ref16, i) {
765
+ var VCEntries = entries.reduce(function (acc, _ref18, i) {
736
766
  var _acc$abs, _componentsLog$timest, _acc$rel$vc, _acc$rel;
737
- var _ref17 = _slicedToArray(_ref16, 2),
738
- timestamp = _ref17[0],
739
- entryPainted = _ref17[1];
767
+ var _ref19 = _slicedToArray(_ref18, 2),
768
+ timestamp = _ref19[0],
769
+ entryPainted = _ref19[1];
740
770
  var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
741
771
  var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
742
772
  var logEntry = _toConsumableArray(new Set((_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.filter(function (v) {
@@ -24,7 +24,8 @@ function isElementVisible(target) {
24
24
  }
25
25
  export var Observers = /*#__PURE__*/function () {
26
26
  function Observers(opts) {
27
- var _this = this;
27
+ var _this = this,
28
+ _opts$SSRConfig;
28
29
  _classCallCheck(this, Observers);
29
30
  _defineProperty(this, "observedMutations", new WeakMap());
30
31
  _defineProperty(this, "elementsInView", new Set());
@@ -64,7 +65,7 @@ export var Observers = /*#__PURE__*/function () {
64
65
  this.selectorConfig = _objectSpread(_objectSpread({}, this.selectorConfig), opts.selectorConfig);
65
66
  this.intersectionObserver = this.getIntersectionObserver();
66
67
  this.mutationObserver = this.getMutationObserver();
67
- this.ssrPlaceholderHandler = new SSRPlaceholderHandlers();
68
+ this.ssrPlaceholderHandler = new SSRPlaceholderHandlers((_opts$SSRConfig = opts.SSRConfig) === null || _opts$SSRConfig === void 0 ? void 0 : _opts$SSRConfig.enablePageLayoutPlaceholder);
68
69
  }
69
70
  return _createClass(Observers, [{
70
71
  key: "isBrowserSupported",
@@ -2,15 +2,39 @@ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
2
  import _createClass from "@babel/runtime/helpers/createClass";
3
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
4
  var ANCESTOR_LOOKUP_LIMIT = 10;
5
+ var PAGE_LAYOUT_ID = 'page-layout.root';
5
6
  export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
6
7
  function SSRPlaceholderHandlers() {
7
8
  var _this = this;
9
+ var enablePageLayoutPlaceholder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
8
10
  _classCallCheck(this, SSRPlaceholderHandlers);
9
11
  _defineProperty(this, "staticPlaceholders", new Map());
10
12
  _defineProperty(this, "callbacks", new Map());
11
13
  _defineProperty(this, "getSizeCallbacks", new Map());
12
14
  _defineProperty(this, "reactValidateCallbacks", new Map());
13
15
  _defineProperty(this, "EQUALITY_THRESHOLD", 1);
16
+ _defineProperty(this, "getPlaceholderId", function (el) {
17
+ var _el$dataset;
18
+ var ssrPlaceholderId = el === null || el === void 0 || (_el$dataset = el.dataset) === null || _el$dataset === void 0 ? void 0 : _el$dataset.ssrPlaceholder;
19
+ if (!!ssrPlaceholderId) {
20
+ return ssrPlaceholderId;
21
+ }
22
+ if (_this.enablePageLayoutPlaceholder && (el === null || el === void 0 ? void 0 : el.dataset.testid) === PAGE_LAYOUT_ID) {
23
+ return PAGE_LAYOUT_ID;
24
+ }
25
+ return '';
26
+ });
27
+ _defineProperty(this, "getPlaceholderReplacementId", function (el) {
28
+ var _el$dataset2;
29
+ var ssrPlaceholderReplaceId = el === null || el === void 0 || (_el$dataset2 = el.dataset) === null || _el$dataset2 === void 0 ? void 0 : _el$dataset2.ssrPlaceholderReplace;
30
+ if (!!ssrPlaceholderReplaceId) {
31
+ return ssrPlaceholderReplaceId;
32
+ }
33
+ if (_this.enablePageLayoutPlaceholder && (el === null || el === void 0 ? void 0 : el.dataset.testid) === PAGE_LAYOUT_ID) {
34
+ return PAGE_LAYOUT_ID;
35
+ }
36
+ return '';
37
+ });
14
38
  _defineProperty(this, "intersectionObserverCallback", function (_ref) {
15
39
  var _this$intersectionObs;
16
40
  var target = _ref.target,
@@ -20,7 +44,7 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
20
44
  // impossible case - keep typescript healthy
21
45
  return;
22
46
  }
23
- var staticKey = target.dataset.ssrPlaceholder || '';
47
+ var staticKey = _this.getPlaceholderId(target);
24
48
  if (staticKey) {
25
49
  if (_this.staticPlaceholders.has(staticKey) && _this.callbacks.has(staticKey)) {
26
50
  // validation
@@ -42,7 +66,7 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
42
66
  _this.callbacks.delete(staticKey);
43
67
  }
44
68
  } else {
45
- var key = target.dataset.ssrPlaceholderReplace || '';
69
+ var key = _this.getPlaceholderReplacementId(target);
46
70
  var _resolve2 = _this.reactValidateCallbacks.get(key);
47
71
  if (!_resolve2) {
48
72
  return;
@@ -70,25 +94,27 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
70
94
  }).forEach(_this.intersectionObserverCallback);
71
95
  });
72
96
  }
97
+ this.enablePageLayoutPlaceholder = enablePageLayoutPlaceholder;
73
98
  if (window.document) {
74
99
  try {
75
- var existingElements = document.querySelectorAll('[data-ssr-placeholder]');
100
+ var selector = this.enablePageLayoutPlaceholder ? '[data-ssr-placeholder],[data-testid="page-layout.root"]' : '[data-ssr-placeholder]';
101
+ var existingElements = document.querySelectorAll(selector);
76
102
  existingElements.forEach(function (el) {
77
- var _el$dataset;
78
- if (el instanceof HTMLElement && el !== null && el !== void 0 && (_el$dataset = el.dataset) !== null && _el$dataset !== void 0 && _el$dataset.ssrPlaceholder) {
103
+ var placeholderId = el instanceof HTMLElement && _this.getPlaceholderId(el);
104
+ if (placeholderId) {
79
105
  var _window$__SSR_PLACEHO, _this$intersectionObs2;
80
106
  var width = -1;
81
107
  var height = -1;
82
108
  var x = -1;
83
109
  var y = -1;
84
- var boundingClientRect = (_window$__SSR_PLACEHO = window.__SSR_PLACEHOLDERS_DIMENSIONS__) === null || _window$__SSR_PLACEHO === void 0 ? void 0 : _window$__SSR_PLACEHO[el.dataset.ssrPlaceholder];
110
+ var boundingClientRect = (_window$__SSR_PLACEHO = window.__SSR_PLACEHOLDERS_DIMENSIONS__) === null || _window$__SSR_PLACEHO === void 0 ? void 0 : _window$__SSR_PLACEHO[placeholderId];
85
111
  if (boundingClientRect) {
86
112
  width = boundingClientRect.width;
87
113
  height = boundingClientRect.height;
88
114
  x = boundingClientRect.x;
89
115
  y = boundingClientRect.y;
90
116
  }
91
- _this.staticPlaceholders.set(el.dataset.ssrPlaceholder, {
117
+ _this.staticPlaceholders.set(placeholderId, {
92
118
  width: width,
93
119
  height: height,
94
120
  x: x,
@@ -113,12 +139,12 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
113
139
  }, {
114
140
  key: "isPlaceholder",
115
141
  value: function isPlaceholder(element) {
116
- return Boolean(element.dataset.ssrPlaceholder);
142
+ return Boolean(this.getPlaceholderId(element));
117
143
  }
118
144
  }, {
119
145
  key: "isPlaceholderReplacement",
120
146
  value: function isPlaceholderReplacement(element) {
121
- return Boolean(element.dataset.ssrPlaceholderReplace);
147
+ return Boolean(this.getPlaceholderReplacementId(element));
122
148
  }
123
149
  }, {
124
150
  key: "isPlaceholderIgnored",
@@ -148,7 +174,7 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
148
174
  value: function checkIfExistedAndSizeMatching(el) {
149
175
  var _this2 = this;
150
176
  el = this.findNearestPlaceholderContainerIfIgnored(el);
151
- var id = el.dataset.ssrPlaceholder || '';
177
+ var id = this.getPlaceholderId(el);
152
178
  return new Promise(function (resolve) {
153
179
  if (!_this2.staticPlaceholders.has(id)) {
154
180
  resolve(false);
@@ -166,7 +192,7 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
166
192
  var _this3 = this;
167
193
  return new Promise(function (resolve) {
168
194
  var _this3$intersectionOb;
169
- _this3.getSizeCallbacks.set(el.dataset.ssrPlaceholder || '', resolve);
195
+ _this3.getSizeCallbacks.set(_this3.getPlaceholderId(el), resolve);
170
196
  (_this3$intersectionOb = _this3.intersectionObserver) === null || _this3$intersectionOb === void 0 || _this3$intersectionOb.observe(el);
171
197
  });
172
198
  }
@@ -175,7 +201,7 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
175
201
  value: function validateReactComponentMatchToPlaceholder(el) {
176
202
  var _this4 = this;
177
203
  el = this.findNearestPlaceholderContainerIfIgnored(el);
178
- var id = el.dataset.ssrPlaceholderReplace || '';
204
+ var id = this.getPlaceholderReplacementId(el);
179
205
  return new Promise(function (resolve) {
180
206
  if (!_this4.staticPlaceholders.has(id)) {
181
207
  resolve(false);
@@ -2,6 +2,7 @@
2
2
  // and save their size/positions in a map __SSR_PLACEHOLDERS_DIMENSIONS__ on the Window object. Each placeholderId is
3
3
  // unique and maps to its corresponding elements bounding client rectangle dimensions.
4
4
  export function collectSSRPlaceholderDimensions(document, window) {
5
+ var enablePageLayoutPlaceholder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
5
6
  var ssrPlaceholders = document === null || document === void 0 ? void 0 : document.querySelectorAll('[data-ssr-placeholder]');
6
7
  ssrPlaceholders.forEach(function (elem) {
7
8
  var placeholderId = elem.getAttribute('data-ssr-placeholder');
@@ -11,4 +12,12 @@ export function collectSSRPlaceholderDimensions(document, window) {
11
12
  window.__SSR_PLACEHOLDERS_DIMENSIONS__[placeholderId] = boundingClient;
12
13
  }
13
14
  });
15
+ if (enablePageLayoutPlaceholder) {
16
+ var pageLayoutRoot = document === null || document === void 0 ? void 0 : document.getElementById('unsafe-design-system-page-layout-root');
17
+ if (pageLayoutRoot) {
18
+ var boundingClient = pageLayoutRoot.getBoundingClientRect();
19
+ window.__SSR_PLACEHOLDERS_DIMENSIONS__ = window.__SSR_PLACEHOLDERS_DIMENSIONS__ || {};
20
+ window.__SSR_PLACEHOLDERS_DIMENSIONS__['page-layout.root'] = boundingClient;
21
+ }
22
+ }
14
23
  }