@atlaskit/react-ufo 3.12.4 → 3.12.5

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 (92) hide show
  1. package/CHANGELOG.md +8 -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 +59 -33
  7. package/dist/cjs/vc/vc-observer-new/index.js +13 -7
  8. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
  9. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  10. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -4
  11. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +108 -0
  12. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +16 -57
  13. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +15 -5
  14. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  15. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -1
  16. package/dist/es2019/create-payload/utils/get-vc-metrics.js +1 -0
  17. package/dist/es2019/vc/index.js +4 -2
  18. package/dist/es2019/vc/vc-observer/getVCRevisionDebugDetails.js +32 -0
  19. package/dist/es2019/vc/vc-observer/index.js +30 -1
  20. package/dist/es2019/vc/vc-observer-new/index.js +12 -6
  21. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +115 -17
  22. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  23. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +44 -1
  24. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +75 -0
  25. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -20
  26. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +15 -5
  27. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  28. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +2 -1
  29. package/dist/esm/create-payload/utils/get-vc-metrics.js +2 -1
  30. package/dist/esm/vc/index.js +4 -2
  31. package/dist/esm/vc/vc-observer/getVCRevisionDebugDetails.js +35 -0
  32. package/dist/esm/vc/vc-observer/index.js +59 -33
  33. package/dist/esm/vc/vc-observer-new/index.js +13 -7
  34. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
  35. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
  36. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -5
  37. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +106 -0
  38. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -55
  39. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +15 -5
  40. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
  41. package/dist/types/vc/types.d.ts +1 -0
  42. package/dist/types/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
  43. package/dist/types/vc/vc-observer/index.d.ts +1 -1
  44. package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
  45. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  46. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
  47. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
  48. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
  49. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
  50. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  51. package/dist/types/vc/vc-observer-new/types.d.ts +5 -1
  52. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  53. package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
  54. package/dist/types-ts4.5/vc/types.d.ts +1 -0
  55. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
  56. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +1 -1
  57. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
  58. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  59. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
  60. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
  61. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
  62. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
  63. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  64. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +5 -1
  65. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  66. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
  67. package/package.json +4 -1
  68. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -367
  69. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -398
  70. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -5
  71. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -152
  72. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -108
  73. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -248
  74. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -263
  75. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
  76. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -99
  77. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -60
  78. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -361
  79. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -391
  80. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
  81. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -145
  82. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -101
  83. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
  84. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
  85. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
  86. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
  87. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
  88. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
  89. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
  90. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
  91. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
  92. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 3.12.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#156815](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/156815)
8
+ [`a6856b45ef58f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a6856b45ef58f) -
9
+ make ttvc v3 more debugable
10
+
3
11
  ## 3.12.4
4
12
 
5
13
  ### Patch Changes
@@ -112,7 +112,8 @@ function _getExperimentalVCMetrics() {
112
112
  isEventAborted: !!interaction.abortReason,
113
113
  prefix: prefix,
114
114
  vc: interaction.vc,
115
- experienceKey: interaction.ufoName
115
+ experienceKey: interaction.ufoName,
116
+ interactionId: interaction.id
116
117
  });
117
118
  case 4:
118
119
  result = _context.sent;
@@ -65,7 +65,8 @@ function _getVCMetrics() {
65
65
  prefix: prefix,
66
66
  vc: interaction.vc,
67
67
  isEventAborted: interactionStatus.originalInteractionStatus !== 'SUCCEEDED',
68
- experienceKey: interaction.ufoName
68
+ experienceKey: interaction.ufoName,
69
+ interactionId: interaction.id
69
70
  }, ssr));
70
71
  case 18:
71
72
  result = _context.sent;
@@ -131,7 +131,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
131
131
  _context.next = 13;
132
132
  return (_this$newVCObserver5 = this.newVCObserver) === null || _this$newVCObserver5 === void 0 ? void 0 : _this$newVCObserver5.getVCResult({
133
133
  start: param.start,
134
- stop: param.stop
134
+ stop: param.stop,
135
+ interactionId: param.interactionId
135
136
  });
136
137
  case 13:
137
138
  _context.t1 = _context.sent;
@@ -158,7 +159,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
158
159
  _context.next = 28;
159
160
  return (_this$newVCObserver6 = this.newVCObserver) === null || _this$newVCObserver6 === void 0 ? void 0 : _this$newVCObserver6.getVCResult({
160
161
  start: param.start,
161
- stop: param.stop
162
+ stop: param.stop,
163
+ interactionId: param.interactionId
162
164
  });
163
165
  case 28:
164
166
  newResult = _context.sent;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getVCRevisionDebugDetails = getVCRevisionDebugDetails;
7
+ function getVCRevisionDebugDetails(_ref) {
8
+ var revision = _ref.revision,
9
+ isClean = _ref.isClean,
10
+ abortReason = _ref.abortReason,
11
+ VCEntries = _ref.VCEntries,
12
+ componentsLog = _ref.componentsLog,
13
+ interactionId = _ref.interactionId;
14
+ return {
15
+ revision: revision,
16
+ isClean: isClean,
17
+ abortReason: abortReason,
18
+ vcLogs: VCEntries.map(function (entry) {
19
+ return {
20
+ time: entry.time,
21
+ viewportPercentage: entry.vc,
22
+ entries: entry.elements.map(function (element) {
23
+ var _componentsLog$entry$;
24
+ var logEntry = (_componentsLog$entry$ = componentsLog[entry.time]) === null || _componentsLog$entry$ === void 0 ? void 0 : _componentsLog$entry$.find(function (log) {
25
+ return log.targetName === element;
26
+ });
27
+ return {
28
+ elementName: element,
29
+ type: logEntry === null || logEntry === void 0 ? void 0 : logEntry.type,
30
+ rect: logEntry === null || logEntry === void 0 ? void 0 : logEntry.intersectionRect,
31
+ visible: true,
32
+ attributeName: logEntry === null || logEntry === void 0 ? void 0 : logEntry.attributeName,
33
+ oldValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.oldValue,
34
+ newValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.newValue
35
+ };
36
+ })
37
+ };
38
+ }),
39
+ interactionId: interactionId
40
+ };
41
+ }
@@ -17,6 +17,7 @@ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
17
17
  var _config = require("../../config");
18
18
  var _interactionMetrics = require("../../interaction-metrics");
19
19
  var _attachAbortListeners = require("./attachAbortListeners");
20
+ var _getVCRevisionDebugDetails = require("./getVCRevisionDebugDetails");
20
21
  var _getVCRevisionsData = require("./getVCRevisionsData");
21
22
  var _getViewport = require("./getViewport");
22
23
  var _heatmap = require("./heatmap/heatmap");
@@ -106,11 +107,11 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
106
107
  });
107
108
  (0, _defineProperty2.default)(this, "getVCResult", /*#__PURE__*/function () {
108
109
  var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref3) {
109
- 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;
110
+ 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;
110
111
  return _regenerator.default.wrap(function _callee$(_context) {
111
112
  while (1) switch (_context.prev = _context.next) {
112
113
  case 0:
113
- start = _ref3.start, stop = _ref3.stop, tti = _ref3.tti, prefix = _ref3.prefix, ssr = _ref3.ssr, vc = _ref3.vc, isEventAborted = _ref3.isEventAborted, experienceKey = _ref3.experienceKey;
114
+ 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;
114
115
  startTime = performance.now(); // add local measurement
115
116
  fullPrefix = prefix !== undefined && prefix !== '' ? "".concat(prefix, ":") : '';
116
117
  rawData = vc !== undefined ? vc : _this.getVCRawData();
@@ -287,6 +288,31 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
287
288
  entries: isTTVCv1Disabled ? vcNext.VCEntries.rel : VCEntries.rel
288
289
  }
289
290
  }));
291
+
292
+ // Add devtool callback for both v1 and v2
293
+ if (typeof window.__ufo_devtool_onVCRevisionReady__ === 'function' && (0, _platformFeatureFlags.fg)('platform_ufo_ttvc_v3_devtool')) {
294
+ // Handle v1 if not disabled
295
+ if (!isTTVCv1Disabled) {
296
+ (_ufo_devtool_onVCRev = (_ref9 = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev === void 0 || _ufo_devtool_onVCRev.call(_ref9, (0, _getVCRevisionDebugDetails.getVCRevisionDebugDetails)({
297
+ revision: 'fy25.01',
298
+ isClean: !abortReasonInfo,
299
+ abortReason: abortReason.reason,
300
+ VCEntries: VCEntries.rel,
301
+ componentsLog: componentsLog,
302
+ interactionId: interactionId
303
+ }));
304
+ }
305
+
306
+ // Handle v2
307
+ (_ufo_devtool_onVCRev2 = (_ref10 = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev2 === void 0 || _ufo_devtool_onVCRev2.call(_ref10, (0, _getVCRevisionDebugDetails.getVCRevisionDebugDetails)({
308
+ revision: 'fy25.02',
309
+ isClean: !abortReasonInfo,
310
+ abortReason: abortReason.reason,
311
+ VCEntries: vcNext.VCEntries.rel,
312
+ componentsLog: componentsLog,
313
+ interactionId: interactionId
314
+ }));
315
+ }
290
316
  }
291
317
  } catch (e) {
292
318
  /* do nothing */
@@ -387,16 +413,16 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
387
413
  });
388
414
  }
389
415
  });
390
- (0, _defineProperty2.default)(this, "onViewportChangeDetected", function (_ref9) {
391
- var element = _ref9.element,
392
- type = _ref9.type,
393
- ignoreReason = _ref9.ignoreReason,
394
- timestamp = _ref9.timestamp,
395
- targetName = _ref9.targetName,
396
- intersectionRect = _ref9.intersectionRect,
397
- attributeName = _ref9.attributeName,
398
- oldValue = _ref9.oldValue,
399
- newValue = _ref9.newValue;
416
+ (0, _defineProperty2.default)(this, "onViewportChangeDetected", function (_ref11) {
417
+ var element = _ref11.element,
418
+ type = _ref11.type,
419
+ ignoreReason = _ref11.ignoreReason,
420
+ timestamp = _ref11.timestamp,
421
+ targetName = _ref11.targetName,
422
+ intersectionRect = _ref11.intersectionRect,
423
+ attributeName = _ref11.attributeName,
424
+ oldValue = _ref11.oldValue,
425
+ newValue = _ref11.newValue;
400
426
  if (_this.multiHeatmap === null) {
401
427
  return;
402
428
  }
@@ -481,10 +507,10 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
481
507
  var unbinds = (0, _attachAbortListeners.attachAbortListeners)(window, _this.viewport, _this.abortReasonCallback);
482
508
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__) {
483
509
  var _window2;
484
- Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref10) {
485
- var _ref11 = (0, _slicedToArray2.default)(_ref10, 2),
486
- key = _ref11[0],
487
- time = _ref11[1];
510
+ Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref12) {
511
+ var _ref13 = (0, _slicedToArray2.default)(_ref12, 2),
512
+ key = _ref13[0],
513
+ time = _ref13[1];
488
514
  if (time) {
489
515
  _this.abortReasonCallback(key, time);
490
516
  }
@@ -517,8 +543,8 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
517
543
  }
518
544
  return (0, _createClass2.default)(VCObserver, [{
519
545
  key: "start",
520
- value: function start(_ref12) {
521
- var startTime = _ref12.startTime;
546
+ value: function start(_ref14) {
547
+ var startTime = _ref14.startTime;
522
548
  this.active = true;
523
549
  if (this.observers.isBrowserSupported()) {
524
550
  this.setViewportSize();
@@ -540,12 +566,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
540
566
  }, {
541
567
  key: "getIgnoredElements",
542
568
  value: function getIgnoredElements(componentsLog) {
543
- return Object.values(componentsLog).flat().filter(function (_ref13) {
544
- var ignoreReason = _ref13.ignoreReason;
569
+ return Object.values(componentsLog).flat().filter(function (_ref15) {
570
+ var ignoreReason = _ref15.ignoreReason;
545
571
  return Boolean(ignoreReason);
546
- }).map(function (_ref14) {
547
- var targetName = _ref14.targetName,
548
- ignoreReason = _ref14.ignoreReason;
572
+ }).map(function (_ref16) {
573
+ var targetName = _ref16.targetName,
574
+ ignoreReason = _ref16.ignoreReason;
549
575
  return {
550
576
  targetName: targetName,
551
577
  ignoreReason: ignoreReason
@@ -668,12 +694,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
668
694
  }
669
695
  }], [{
670
696
  key: "calculateVC",
671
- value: function calculateVC(_ref15) {
672
- var heatmap = _ref15.heatmap,
673
- _ref15$ssr = _ref15.ssr,
674
- ssr = _ref15$ssr === void 0 ? UNUSED_SECTOR : _ref15$ssr,
675
- componentsLog = _ref15.componentsLog,
676
- viewport = _ref15.viewport;
697
+ value: function calculateVC(_ref17) {
698
+ var heatmap = _ref17.heatmap,
699
+ _ref17$ssr = _ref17.ssr,
700
+ ssr = _ref17$ssr === void 0 ? UNUSED_SECTOR : _ref17$ssr,
701
+ componentsLog = _ref17.componentsLog,
702
+ viewport = _ref17.viewport;
677
703
  var lastUpdate = {};
678
704
  var totalPainted = 0;
679
705
  if (ssr !== UNUSED_SECTOR) {
@@ -739,11 +765,11 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
739
765
  });
740
766
  return VCRatio;
741
767
  }, 0);
742
- var VCEntries = entries.reduce(function (acc, _ref16, i) {
768
+ var VCEntries = entries.reduce(function (acc, _ref18, i) {
743
769
  var _acc$abs, _componentsLog$timest, _acc$rel$vc, _acc$rel;
744
- var _ref17 = (0, _slicedToArray2.default)(_ref16, 2),
745
- timestamp = _ref17[0],
746
- entryPainted = _ref17[1];
770
+ var _ref19 = (0, _slicedToArray2.default)(_ref18, 2),
771
+ timestamp = _ref19[0],
772
+ entryPainted = _ref19[1];
747
773
  var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
748
774
  var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
749
775
  var logEntry = (0, _toConsumableArray2.default)(new Set((_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.filter(function (v) {
@@ -24,12 +24,14 @@ var DEFAULT_SELECTOR_CONFIG = {
24
24
  };
25
25
  var VCObserverNew = exports.default = /*#__PURE__*/function () {
26
26
  function VCObserverNew(config) {
27
- var _config$selectorConfi,
27
+ var _config$isPostInterac,
28
+ _config$selectorConfi,
28
29
  _this = this;
29
30
  (0, _classCallCheck2.default)(this, VCObserverNew);
30
31
  (0, _defineProperty2.default)(this, "viewportObserver", null);
31
32
  (0, _defineProperty2.default)(this, "windowEventObserver", null);
32
33
  this.entriesTimeline = new _entriesTimeline.default();
34
+ this.isPostInteraction = (_config$isPostInterac = config.isPostInteraction) !== null && _config$isPostInterac !== void 0 ? _config$isPostInterac : false;
33
35
  this.selectorConfig = (_config$selectorConfi = config.selectorConfig) !== null && _config$selectorConfi !== void 0 ? _config$selectorConfi : DEFAULT_SELECTOR_CONFIG;
34
36
  this.viewportObserver = new _viewportObserver.default({
35
37
  onChange: function onChange(onChangeArg) {
@@ -47,13 +49,15 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
47
49
  }
48
50
  _this.entriesTimeline.push({
49
51
  time: time,
50
- type: type,
51
52
  data: {
53
+ type: type,
52
54
  elementName: elementName,
53
55
  rect: rect,
54
56
  previousRect: previousRect,
55
57
  visible: visible,
56
- attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName
58
+ attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName,
59
+ oldValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.oldValue,
60
+ newValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.newValue
57
61
  }
58
62
  });
59
63
  }
@@ -64,8 +68,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
64
68
  type = _ref.type;
65
69
  _this.entriesTimeline.push({
66
70
  time: time,
67
- type: 'window:event',
68
71
  data: {
72
+ type: 'window:event',
69
73
  eventType: type
70
74
  }
71
75
  });
@@ -92,11 +96,11 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
92
96
  key: "getVCResult",
93
97
  value: function () {
94
98
  var _getVCResult = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(param) {
95
- var start, stop, results, calculator_fy25_03, orderedEntries, fy25_03;
99
+ var start, stop, interactionId, results, calculator_fy25_03, orderedEntries, fy25_03;
96
100
  return _regenerator.default.wrap(function _callee$(_context) {
97
101
  while (1) switch (_context.prev = _context.next) {
98
102
  case 0:
99
- start = param.start, stop = param.stop;
103
+ start = param.start, stop = param.stop, interactionId = param.interactionId;
100
104
  results = [];
101
105
  calculator_fy25_03 = new _fy25_.default();
102
106
  orderedEntries = this.entriesTimeline.getOrderedEntries({
@@ -107,7 +111,9 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
107
111
  return calculator_fy25_03.calculate({
108
112
  orderedEntries: orderedEntries,
109
113
  startTime: start,
110
- stopTime: stop
114
+ stopTime: stop,
115
+ interactionId: interactionId,
116
+ isPostInteraction: this.isPostInteraction
111
117
  });
112
118
  case 6:
113
119
  fy25_03 = _context.sent;
@@ -10,85 +10,260 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
12
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
- var _percentileCalc = _interopRequireDefault(require("./percentile-calc"));
13
+ var _percentileCalc = require("./percentile-calc");
14
14
  var _getViewportHeight = _interopRequireDefault(require("./utils/get-viewport-height"));
15
15
  var _getViewportWidth = _interopRequireDefault(require("./utils/get-viewport-width"));
16
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
17
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
18
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16
19
  var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
17
20
  function AbstractVCCalculatorBase(revisionNo) {
18
21
  (0, _classCallCheck2.default)(this, AbstractVCCalculatorBase);
19
22
  this.revisionNo = revisionNo;
20
23
  }
21
24
  return (0, _createClass2.default)(AbstractVCCalculatorBase, [{
25
+ key: "filterViewportEntries",
26
+ value: function filterViewportEntries(entries) {
27
+ return entries.filter(function (entry) {
28
+ return 'rect' in entry.data;
29
+ });
30
+ }
31
+ }, {
32
+ key: "calculateBasic",
33
+ value: function () {
34
+ var _calculateBasic = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(filteredEntries, startTime, stopTime) {
35
+ var percentiles, viewportEntries, vcLogs;
36
+ return _regenerator.default.wrap(function _callee$(_context) {
37
+ while (1) switch (_context.prev = _context.next) {
38
+ case 0:
39
+ percentiles = [25, 50, 75, 80, 85, 90, 95, 98, 99];
40
+ viewportEntries = this.filterViewportEntries(filteredEntries);
41
+ _context.next = 4;
42
+ return (0, _percentileCalc.calculateTTVCPercentiles)({
43
+ viewport: {
44
+ width: (0, _getViewportWidth.default)(),
45
+ height: (0, _getViewportHeight.default)()
46
+ },
47
+ startTime: startTime,
48
+ stopTime: stopTime,
49
+ orderedEntries: viewportEntries,
50
+ percentiles: percentiles
51
+ });
52
+ case 4:
53
+ vcLogs = _context.sent;
54
+ return _context.abrupt("return", vcLogs);
55
+ case 6:
56
+ case "end":
57
+ return _context.stop();
58
+ }
59
+ }, _callee, this);
60
+ }));
61
+ function calculateBasic(_x, _x2, _x3) {
62
+ return _calculateBasic.apply(this, arguments);
63
+ }
64
+ return calculateBasic;
65
+ }()
66
+ }, {
67
+ key: "calculateWithDebugInfo",
68
+ value: function () {
69
+ var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason) {
70
+ var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator, _step, _entry, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, _ufo_devtool_onVCRev, _ref;
71
+ return _regenerator.default.wrap(function _callee2$(_context2) {
72
+ while (1) switch (_context2.prev = _context2.next) {
73
+ case 0:
74
+ percentiles = [25, 50, 75, 80, 85, 90, 95, 98, 99];
75
+ viewportEntries = this.filterViewportEntries(filteredEntries);
76
+ _context2.next = 4;
77
+ return (0, _percentileCalc.calculateTTVCPercentilesWithDebugInfo)({
78
+ viewport: {
79
+ width: (0, _getViewportWidth.default)(),
80
+ height: (0, _getViewportHeight.default)()
81
+ },
82
+ startTime: startTime,
83
+ stopTime: stopTime,
84
+ orderedEntries: viewportEntries
85
+ });
86
+ case 4:
87
+ vcLogs = _context2.sent;
88
+ vcDetails = {};
89
+ percentileIndex = 0;
90
+ entryDataBuffer = new Set();
91
+ if (!vcLogs) {
92
+ _context2.next = 28;
93
+ break;
94
+ }
95
+ _iterator = _createForOfIteratorHelper(vcLogs);
96
+ _context2.prev = 10;
97
+ _iterator.s();
98
+ case 12:
99
+ if ((_step = _iterator.n()).done) {
100
+ _context2.next = 20;
101
+ break;
102
+ }
103
+ _entry = _step.value;
104
+ time = _entry.time, viewportPercentage = _entry.viewportPercentage, entries = _entry.entries; // Only process entries if we haven't reached all percentiles
105
+ if (!(percentileIndex >= percentiles.length)) {
106
+ _context2.next = 17;
107
+ break;
108
+ }
109
+ return _context2.abrupt("break", 20);
110
+ case 17:
111
+ // Check if this entry matches any checkpoint percentiles
112
+ if (viewportPercentage >= percentiles[percentileIndex]) {
113
+ elementNames = entries.map(function (e) {
114
+ return e.elementName;
115
+ }); // Process all matching percentiles in one go
116
+ while (percentileIndex < percentiles.length && viewportPercentage >= percentiles[percentileIndex]) {
117
+ vcDetails["".concat(percentiles[percentileIndex])] = {
118
+ t: Math.round(time),
119
+ e: elementNames
120
+ };
121
+ percentileIndex++;
122
+ }
123
+
124
+ // Clear buffer after processing all matching percentiles
125
+ entryDataBuffer.clear();
126
+ } else {
127
+ // Only add to buffer if we haven't reached all percentiles
128
+ entries.forEach(function (e) {
129
+ return entryDataBuffer.add(e);
130
+ });
131
+ }
132
+ case 18:
133
+ _context2.next = 12;
134
+ break;
135
+ case 20:
136
+ _context2.next = 25;
137
+ break;
138
+ case 22:
139
+ _context2.prev = 22;
140
+ _context2.t0 = _context2["catch"](10);
141
+ _iterator.e(_context2.t0);
142
+ case 25:
143
+ _context2.prev = 25;
144
+ _iterator.f();
145
+ return _context2.finish(25);
146
+ case 28:
147
+ // Fill in any missing percentiles with the last known values
148
+ previousResult = {
149
+ t: 0,
150
+ e: []
151
+ };
152
+ for (i = 0; i < percentiles.length; i++) {
153
+ percentile = percentiles[i];
154
+ if (!(percentile in vcDetails)) {
155
+ vcDetails["".concat(percentile)] = previousResult;
156
+ } else {
157
+ previousResult = vcDetails["".concat(percentile)];
158
+ }
159
+ }
160
+
161
+ // Handle devtool callback
162
+ if (!isPostInteraction && typeof window !== 'undefined' && typeof window.__ufo_devtool_onVCRevisionReady__ === 'function' && (0, _platformFeatureFlags.fg)('platform_ufo_ttvc_v3_devtool')) {
163
+ try {
164
+ (_ufo_devtool_onVCRev = (_ref = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev === void 0 || _ufo_devtool_onVCRev.call(_ref, {
165
+ revision: this.revisionNo,
166
+ isClean: isVCClean,
167
+ abortReason: dirtyReason,
168
+ vcLogs: vcLogs,
169
+ interactionId: interactionId
170
+ });
171
+ } catch (e) {
172
+ // if any error communicating with devtool, we don't want to break the app
173
+ // eslint-disable-next-line no-console
174
+ console.error('Error in onVCRevisionReady', e);
175
+ }
176
+ }
177
+ return _context2.abrupt("return", vcDetails);
178
+ case 32:
179
+ case "end":
180
+ return _context2.stop();
181
+ }
182
+ }, _callee2, this, [[10, 22, 25, 28]]);
183
+ }));
184
+ function calculateWithDebugInfo(_x4, _x5, _x6, _x7, _x8, _x9, _x10) {
185
+ return _calculateWithDebugInfo.apply(this, arguments);
186
+ }
187
+ return calculateWithDebugInfo;
188
+ }()
189
+ }, {
22
190
  key: "calculate",
23
191
  value: function () {
24
- var _calculate = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
192
+ var _calculate = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(_ref2) {
25
193
  var _this = this,
26
194
  _vcDetails$90$t,
27
195
  _vcDetails$;
28
- var startTime, stopTime, orderedEntries, filteredEntries, _this$getVCCleanStatu, _isVCClean, dirtyReason, _isVCClean2, vcDetails;
29
- return _regenerator.default.wrap(function _callee$(_context) {
30
- while (1) switch (_context.prev = _context.next) {
196
+ var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, useDebugInfo, vcDetails;
197
+ return _regenerator.default.wrap(function _callee3$(_context3) {
198
+ while (1) switch (_context3.prev = _context3.next) {
31
199
  case 0:
32
- startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries;
200
+ startTime = _ref2.startTime, stopTime = _ref2.stopTime, orderedEntries = _ref2.orderedEntries, interactionId = _ref2.interactionId, isPostInteraction = _ref2.isPostInteraction;
33
201
  filteredEntries = orderedEntries.filter(function (entry) {
34
202
  return _this.isEntryIncluded(entry);
35
203
  });
36
204
  if (!(0, _platformFeatureFlags.fg)('platform_ufo_add_vc_abort_reason_by_revisions')) {
37
- _context.next = 8;
205
+ _context3.next = 10;
38
206
  break;
39
207
  }
40
- _this$getVCCleanStatu = this.getVCCleanStatus(filteredEntries), _isVCClean = _this$getVCCleanStatu.isVCClean, dirtyReason = _this$getVCCleanStatu.dirtyReason;
41
- if (_isVCClean) {
42
- _context.next = 6;
208
+ getVCCleanStatusResult = this.getVCCleanStatus(filteredEntries);
209
+ isVCClean = getVCCleanStatusResult.isVCClean;
210
+ dirtyReason = getVCCleanStatusResult.dirtyReason;
211
+ if (isVCClean) {
212
+ _context3.next = 8;
43
213
  break;
44
214
  }
45
- return _context.abrupt("return", {
215
+ return _context3.abrupt("return", {
46
216
  revision: this.revisionNo,
47
217
  'metric:vc90': null,
48
218
  clean: false,
49
219
  abortReason: dirtyReason
50
220
  });
51
- case 6:
52
- _context.next = 11;
53
- break;
54
221
  case 8:
55
- _isVCClean2 = this.isVCClean(filteredEntries);
56
- if (_isVCClean2) {
57
- _context.next = 11;
222
+ _context3.next = 13;
223
+ break;
224
+ case 10:
225
+ isVCClean = this.isVCClean(filteredEntries);
226
+ if (isVCClean) {
227
+ _context3.next = 13;
58
228
  break;
59
229
  }
60
- return _context.abrupt("return", {
230
+ return _context3.abrupt("return", {
61
231
  revision: this.revisionNo,
62
232
  'metric:vc90': null,
63
233
  clean: false
64
234
  });
65
- case 11:
66
- _context.next = 13;
67
- return (0, _percentileCalc.default)({
68
- viewport: {
69
- width: (0, _getViewportWidth.default)(),
70
- height: (0, _getViewportHeight.default)()
71
- },
72
- startTime: startTime,
73
- stopTime: stopTime,
74
- orderedEntries: filteredEntries,
75
- percentiles: [25, 50, 75, 80, 85, 90, 95, 98, 99]
76
- });
77
235
  case 13:
78
- vcDetails = _context.sent;
79
- return _context.abrupt("return", {
236
+ useDebugInfo = (0, _platformFeatureFlags.fg)('platform_ufo_ttvc_v3_devtool');
237
+ if (!useDebugInfo) {
238
+ _context3.next = 20;
239
+ break;
240
+ }
241
+ _context3.next = 17;
242
+ return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason);
243
+ case 17:
244
+ _context3.t0 = _context3.sent;
245
+ _context3.next = 23;
246
+ break;
247
+ case 20:
248
+ _context3.next = 22;
249
+ return this.calculateBasic(filteredEntries, startTime, stopTime);
250
+ case 22:
251
+ _context3.t0 = _context3.sent;
252
+ case 23:
253
+ vcDetails = _context3.t0;
254
+ return _context3.abrupt("return", {
80
255
  revision: this.revisionNo,
81
256
  clean: true,
82
257
  'metric:vc90': (_vcDetails$90$t = vcDetails === null || vcDetails === void 0 || (_vcDetails$ = vcDetails['90']) === null || _vcDetails$ === void 0 ? void 0 : _vcDetails$.t) !== null && _vcDetails$90$t !== void 0 ? _vcDetails$90$t : null,
83
258
  vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
84
259
  });
85
- case 15:
260
+ case 25:
86
261
  case "end":
87
- return _context.stop();
262
+ return _context3.stop();
88
263
  }
89
- }, _callee, this);
264
+ }, _callee3, this);
90
265
  }));
91
- function calculate(_x) {
266
+ function calculate(_x11) {
92
267
  return _calculate.apply(this, arguments);
93
268
  }
94
269
  return calculate;
@@ -31,10 +31,10 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
31
31
  return (0, _createClass2.default)(VCCalculator_FY25_03, [{
32
32
  key: "isEntryIncluded",
33
33
  value: function isEntryIncluded(entry) {
34
- if (!CONSIDERED_ENTRY_TYPE.includes(entry.type)) {
34
+ if (!CONSIDERED_ENTRY_TYPE.includes(entry.data.type)) {
35
35
  return false;
36
36
  }
37
- if (entry.type === 'mutation:attribute') {
37
+ if (entry.data.type === 'mutation:attribute') {
38
38
  var entryData = entry.data;
39
39
  var attributeName = entryData.attributeName;
40
40
  if (!attributeName || KNOWN_ATTRIBUTES_THAT_DOES_NOT_CAUSE_LAYOUT_SHIFTS.includes(attributeName)) {
@@ -51,7 +51,7 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
51
51
  key: "isVCClean",
52
52
  value: function isVCClean(filteredEntries) {
53
53
  var hasAbortEvent = filteredEntries.some(function (entry) {
54
- if (entry.type === 'window:event') {
54
+ if (entry.data.type === 'window:event') {
55
55
  var data = entry.data;
56
56
  if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
57
57
  return true;
@@ -66,7 +66,7 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
66
66
  value: function getVCCleanStatus(filteredEntries) {
67
67
  var dirtyReason = '';
68
68
  var hasAbortEvent = filteredEntries.some(function (entry) {
69
- if (entry.type === 'window:event') {
69
+ if (entry.data.type === 'window:event') {
70
70
  var data = entry.data;
71
71
  if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
72
72
  dirtyReason = data.eventType === 'keydown' ? 'keypress' : data.eventType;