@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
@@ -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;
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.calculatePercentiles = calculatePercentiles;
8
+ exports.calculatePercentilesWithDebugInfo = calculatePercentilesWithDebugInfo;
9
+ exports.calculateTTVCPercentilesWithDebugInfo = calculateTTVCPercentilesWithDebugInfo;
8
10
  exports.default = void 0;
9
11
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
@@ -78,6 +80,69 @@ function _calculateTTVCPercentiles() {
78
80
  }));
79
81
  return _calculateTTVCPercentiles.apply(this, arguments);
80
82
  }
83
+ function calculateTTVCPercentilesWithDebugInfo(_x2) {
84
+ return _calculateTTVCPercentilesWithDebugInfo.apply(this, arguments);
85
+ }
86
+ function _calculateTTVCPercentilesWithDebugInfo() {
87
+ _calculateTTVCPercentilesWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(_ref2) {
88
+ var viewport, orderedEntries, startTime, canvas, elementMap, _iterator3, _step3, entry, rect, timePixelCounts, canvasDimensions, totalPixels;
89
+ return _regenerator.default.wrap(function _callee2$(_context2) {
90
+ while (1) switch (_context2.prev = _context2.next) {
91
+ case 0:
92
+ viewport = _ref2.viewport, orderedEntries = _ref2.orderedEntries, startTime = _ref2.startTime;
93
+ canvas = new _canvasPixel.ViewportCanvas(viewport, (0, _platformFeatureFlags.fg)('platform_ufo_canvas_heatmap_full_precision') ? 1 : 0.25);
94
+ elementMap = new Map();
95
+ _iterator3 = _createForOfIteratorHelper(orderedEntries);
96
+ _context2.prev = 4;
97
+ _iterator3.s();
98
+ case 6:
99
+ if ((_step3 = _iterator3.n()).done) {
100
+ _context2.next = 16;
101
+ break;
102
+ }
103
+ entry = _step3.value;
104
+ if ('rect' in entry.data) {
105
+ _context2.next = 10;
106
+ break;
107
+ }
108
+ return _context2.abrupt("continue", 14);
109
+ case 10:
110
+ rect = entry.data.rect;
111
+ canvas.drawRect(rect, entry.time);
112
+ if (!elementMap.has(entry.time)) {
113
+ elementMap.set(entry.time, []);
114
+ }
115
+ elementMap.get(entry.time).push(entry.data);
116
+ case 14:
117
+ _context2.next = 6;
118
+ break;
119
+ case 16:
120
+ _context2.next = 21;
121
+ break;
122
+ case 18:
123
+ _context2.prev = 18;
124
+ _context2.t0 = _context2["catch"](4);
125
+ _iterator3.e(_context2.t0);
126
+ case 21:
127
+ _context2.prev = 21;
128
+ _iterator3.f();
129
+ return _context2.finish(21);
130
+ case 24:
131
+ _context2.next = 26;
132
+ return canvas.getPixelCounts();
133
+ case 26:
134
+ timePixelCounts = _context2.sent;
135
+ canvasDimensions = canvas.getScaledDimensions();
136
+ totalPixels = canvasDimensions.width * canvasDimensions.height;
137
+ return _context2.abrupt("return", calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, totalPixels, startTime));
138
+ case 30:
139
+ case "end":
140
+ return _context2.stop();
141
+ }
142
+ }, _callee2, null, [[4, 18, 21, 24]]);
143
+ }));
144
+ return _calculateTTVCPercentilesWithDebugInfo.apply(this, arguments);
145
+ }
81
146
  var _default = exports.default = calculateTTVCPercentiles;
82
147
  function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels, startTime) {
83
148
  var results = {};
@@ -87,11 +152,11 @@ function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles,
87
152
  });
88
153
 
89
154
  // Sort entries by timestamp for consistent processing
90
- var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref2, _ref3) {
91
- var _ref4 = (0, _slicedToArray2.default)(_ref2, 1),
92
- timeA = _ref4[0];
155
+ var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref3, _ref4) {
93
156
  var _ref5 = (0, _slicedToArray2.default)(_ref3, 1),
94
- timeB = _ref5[0];
157
+ timeA = _ref5[0];
158
+ var _ref6 = (0, _slicedToArray2.default)(_ref4, 1),
159
+ timeB = _ref6[0];
95
160
  return Number(timeA) - Number(timeB);
96
161
  });
97
162
  var percentileIndex = 0;
@@ -142,4 +207,29 @@ function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles,
142
207
  previousResult = results["".concat(percentile)];
143
208
  }
144
209
  return results;
210
+ }
211
+ function calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, totalPixels, startTime) {
212
+ var results = new Array(elementMap.size);
213
+ var cumulativePixels = 0;
214
+ var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref7, _ref8) {
215
+ var _ref9 = (0, _slicedToArray2.default)(_ref7, 1),
216
+ timeA = _ref9[0];
217
+ var _ref10 = (0, _slicedToArray2.default)(_ref8, 1),
218
+ timeB = _ref10[0];
219
+ return Number(timeA) - Number(timeB);
220
+ });
221
+ for (var i = 0; i < sortedEntries.length; i++) {
222
+ var _sortedEntries$i = (0, _slicedToArray2.default)(sortedEntries[i], 2),
223
+ time = _sortedEntries$i[0],
224
+ pixelCount = _sortedEntries$i[1];
225
+ cumulativePixels += pixelCount;
226
+ var percentCovered = cumulativePixels / totalPixels * 100;
227
+ var entryDatas = elementMap.get(time) || [];
228
+ results[i] = {
229
+ time: Math.round(Number(time - startTime)),
230
+ viewportPercentage: percentCovered,
231
+ entries: Array.from(entryDatas)
232
+ };
233
+ }
234
+ return results;
145
235
  }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
5
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
6
+ var _index = require("./index");
7
+ // Test utilities
8
+ var createMockRect = function createMockRect() {
9
+ var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
10
+ var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
11
+ var width = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 100;
12
+ var height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 100;
13
+ return new MockDOMRect(x, y, width, height);
14
+ };
15
+ var createViewportEntry = function createViewportEntry(elementName) {
16
+ var rect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createMockRect();
17
+ var visible = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
18
+ var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mutation:element';
19
+ return {
20
+ elementName: elementName,
21
+ rect: rect,
22
+ visible: visible,
23
+ type: type
24
+ };
25
+ };
26
+ var createTimePixelCounts = function createTimePixelCounts(counts) {
27
+ return new Map(counts);
28
+ };
29
+ var createElementMap = function createElementMap(entries) {
30
+ return new Map(entries);
31
+ };
32
+ var createExpectedResult = function createExpectedResult(time, viewportPercentage, entries) {
33
+ return {
34
+ time: time,
35
+ viewportPercentage: viewportPercentage,
36
+ entries: entries
37
+ };
38
+ };
39
+ var MockDOMRect = /*#__PURE__*/function () {
40
+ function MockDOMRect(x, y, width, height) {
41
+ (0, _classCallCheck2.default)(this, MockDOMRect);
42
+ this.x = x;
43
+ this.y = y;
44
+ this.width = width;
45
+ this.height = height;
46
+ }
47
+ return (0, _createClass2.default)(MockDOMRect, [{
48
+ key: "bottom",
49
+ get: function get() {
50
+ return this.y + this.height;
51
+ }
52
+ }, {
53
+ key: "left",
54
+ get: function get() {
55
+ return this.x;
56
+ }
57
+ }, {
58
+ key: "right",
59
+ get: function get() {
60
+ return this.x + this.width;
61
+ }
62
+ }, {
63
+ key: "top",
64
+ get: function get() {
65
+ return this.y;
66
+ }
67
+ }, {
68
+ key: "toJSON",
69
+ value: function toJSON() {
70
+ return {
71
+ x: this.x,
72
+ y: this.y,
73
+ width: this.width,
74
+ height: this.height
75
+ };
76
+ }
77
+ }]);
78
+ }();
79
+ describe('calculatePercentilesWithDebugInfo', function () {
80
+ it('should correctly calculate percentiles with accumulated elements from timestamps', function () {
81
+ var timePixelCounts = createTimePixelCounts([[100, 10], [200, 20], [300, 10], [400, 10]]);
82
+ var elementMap = createElementMap([[100, [createViewportEntry('div'), createViewportEntry('span')]], [200, [createViewportEntry('img')]], [300, [createViewportEntry('p'), createViewportEntry('a')]], [400, [createViewportEntry('img')]]]);
83
+ var 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')])];
84
+ var result = (0, _index.calculatePercentilesWithDebugInfo)(timePixelCounts, elementMap, 50, 0);
85
+ expect(result).toEqual(expected);
86
+ });
87
+ it('should handle empty entries gracefully', function () {
88
+ var timePixelCounts = new Map();
89
+ var elementMap = new Map();
90
+ var expected = [];
91
+ var result = (0, _index.calculatePercentilesWithDebugInfo)(timePixelCounts, elementMap, 100, 0);
92
+ expect(result).toEqual(expected);
93
+ });
94
+ it('should handle non-sequential timestamps', function () {
95
+ var timePixelCounts = createTimePixelCounts([[300, 70], [100, 30]]);
96
+ var elementMap = createElementMap([[300, [createViewportEntry('p'), createViewportEntry('a')]], [100, [createViewportEntry('div')]]]);
97
+ var expected = [createExpectedResult(100, 30, [createViewportEntry('div')]), createExpectedResult(300, 100, [createViewportEntry('p'), createViewportEntry('a')])];
98
+ var result = (0, _index.calculatePercentilesWithDebugInfo)(timePixelCounts, elementMap, 100, 0);
99
+ expect(result).toEqual(expected);
100
+ });
101
+ it('should correctly calculate percentiles with startTime offset', function () {
102
+ var timePixelCounts = createTimePixelCounts([[100, 10], [200, 20], [300, 10], [400, 10]]);
103
+ var elementMap = createElementMap([[100, [createViewportEntry('div'), createViewportEntry('span')]], [200, [createViewportEntry('img')]], [300, [createViewportEntry('p'), createViewportEntry('a')]], [400, [createViewportEntry('img')]]]);
104
+ var 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')])];
105
+ var result = (0, _index.calculatePercentilesWithDebugInfo)(timePixelCounts, elementMap, 50, 50);
106
+ expect(result).toEqual(expected);
107
+ });
108
+ });
@@ -1,62 +1,21 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
- var _canvasHeatmap = _interopRequireDefault(require("./canvas-heatmap"));
11
- var _heatmap = _interopRequireDefault(require("./heatmap"));
12
- var _rectSweepingLine = _interopRequireDefault(require("./rect-sweeping-line"));
13
- function calculateTTVCPercentiles(_x) {
14
- return _calculateTTVCPercentiles.apply(this, arguments);
15
- }
16
- function _calculateTTVCPercentiles() {
17
- _calculateTTVCPercentiles = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(arg) {
18
- var algo, vcDetails, _vcDetails, _vcDetails2;
19
- return _regenerator.default.wrap(function _callee$(_context) {
20
- while (1) switch (_context.prev = _context.next) {
21
- case 0:
22
- algo = 'canvas_heatmap';
23
- if (!(algo === 'canvas_heatmap')) {
24
- _context.next = 6;
25
- break;
26
- }
27
- _context.next = 4;
28
- return (0, _canvasHeatmap.default)(arg);
29
- case 4:
30
- vcDetails = _context.sent;
31
- return _context.abrupt("return", vcDetails);
32
- case 6:
33
- if (!(algo === 'rect_sweeping')) {
34
- _context.next = 11;
35
- break;
36
- }
37
- _context.next = 9;
38
- return (0, _rectSweepingLine.default)(arg);
39
- case 9:
40
- _vcDetails = _context.sent;
41
- return _context.abrupt("return", _vcDetails);
42
- case 11:
43
- if (!(algo === 'old_heatmap')) {
44
- _context.next = 16;
45
- break;
46
- }
47
- _context.next = 14;
48
- return (0, _heatmap.default)(arg);
49
- case 14:
50
- _vcDetails2 = _context.sent;
51
- return _context.abrupt("return", _vcDetails2);
52
- case 16:
53
- throw new Error('unexpected Error algo not chosen correctly');
54
- case 17:
55
- case "end":
56
- return _context.stop();
57
- }
58
- }, _callee);
59
- }));
60
- return _calculateTTVCPercentiles.apply(this, arguments);
61
- }
62
- var _default = exports.default = calculateTTVCPercentiles;
7
+ Object.defineProperty(exports, "calculateTTVCPercentiles", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _canvasHeatmap.default;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "calculateTTVCPercentilesWithDebugInfo", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _canvasHeatmap.calculateTTVCPercentilesWithDebugInfo;
17
+ }
18
+ });
19
+ var _canvasHeatmap = _interopRequireWildcard(require("./canvas-heatmap"));
20
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
21
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }