@atlaskit/react-ufo 3.1.4 → 3.3.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 (179) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +11 -0
  3. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +52 -25
  4. package/dist/cjs/create-payload/index.js +290 -231
  5. package/dist/cjs/interaction-metrics/index.js +61 -23
  6. package/dist/cjs/interaction-metrics/post-interaction-log.js +63 -34
  7. package/dist/cjs/interaction-metrics-init/index.js +26 -7
  8. package/dist/cjs/segment/schedule-on-paint.js +35 -0
  9. package/dist/cjs/segment/segment.js +10 -1
  10. package/dist/cjs/vc/index.js +105 -1
  11. package/dist/cjs/vc/types.js +5 -0
  12. package/dist/cjs/vc/vc-observer/index.js +198 -208
  13. package/dist/cjs/vc/vc-observer-new/entries-timeline/index.js +56 -0
  14. package/dist/cjs/vc/vc-observer-new/get-element-name.js +68 -0
  15. package/dist/cjs/vc/vc-observer-new/index.js +132 -0
  16. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +75 -0
  17. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +60 -0
  18. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +274 -0
  19. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +151 -0
  20. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +367 -0
  21. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +397 -0
  22. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +5 -0
  23. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +61 -0
  24. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +151 -0
  25. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +107 -0
  26. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +5 -0
  27. package/dist/cjs/vc/vc-observer-new/metric-calculator/types.js +5 -0
  28. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +16 -0
  29. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +16 -0
  30. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +16 -0
  31. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/task-yield.js +45 -0
  32. package/dist/cjs/vc/vc-observer-new/types.js +5 -0
  33. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +195 -0
  34. package/dist/cjs/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +71 -0
  35. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +65 -0
  36. package/dist/cjs/vc/vc-observer-new/viewport-observer/performance-observer/index.js +58 -0
  37. package/dist/cjs/vc/vc-observer-new/viewport-observer/types.js +1 -0
  38. package/dist/cjs/vc/vc-observer-new/window-event-observer/index.js +54 -0
  39. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -2
  40. package/dist/es2019/create-payload/index.js +8 -7
  41. package/dist/es2019/interaction-metrics/index.js +3 -3
  42. package/dist/es2019/interaction-metrics/post-interaction-log.js +5 -5
  43. package/dist/es2019/interaction-metrics-init/index.js +26 -7
  44. package/dist/es2019/segment/schedule-on-paint.js +29 -0
  45. package/dist/es2019/segment/segment.js +9 -1
  46. package/dist/es2019/vc/index.js +56 -1
  47. package/dist/es2019/vc/types.js +1 -0
  48. package/dist/es2019/vc/vc-observer/index.js +1 -4
  49. package/dist/es2019/vc/vc-observer-new/entries-timeline/index.js +34 -0
  50. package/dist/es2019/vc/vc-observer-new/get-element-name.js +62 -0
  51. package/dist/es2019/vc/vc-observer-new/index.js +98 -0
  52. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +38 -0
  53. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +39 -0
  54. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +194 -0
  55. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +69 -0
  56. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +248 -0
  57. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +261 -0
  58. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +1 -0
  59. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +19 -0
  60. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +98 -0
  61. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +58 -0
  62. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +1 -0
  63. package/dist/es2019/vc/vc-observer-new/metric-calculator/types.js +1 -0
  64. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +9 -0
  65. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +9 -0
  66. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +10 -0
  67. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/task-yield.js +17 -0
  68. package/dist/es2019/vc/vc-observer-new/types.js +1 -0
  69. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +168 -0
  70. package/dist/es2019/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +65 -0
  71. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +48 -0
  72. package/dist/es2019/vc/vc-observer-new/viewport-observer/performance-observer/index.js +41 -0
  73. package/dist/es2019/vc/vc-observer-new/viewport-observer/types.js +0 -0
  74. package/dist/es2019/vc/vc-observer-new/window-event-observer/index.js +36 -0
  75. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +52 -25
  76. package/dist/esm/create-payload/index.js +290 -231
  77. package/dist/esm/interaction-metrics/index.js +61 -23
  78. package/dist/esm/interaction-metrics/post-interaction-log.js +63 -34
  79. package/dist/esm/interaction-metrics-init/index.js +26 -7
  80. package/dist/esm/segment/schedule-on-paint.js +29 -0
  81. package/dist/esm/segment/segment.js +10 -1
  82. package/dist/esm/vc/index.js +104 -1
  83. package/dist/esm/vc/types.js +1 -0
  84. package/dist/esm/vc/vc-observer/index.js +198 -208
  85. package/dist/esm/vc/vc-observer-new/entries-timeline/index.js +50 -0
  86. package/dist/esm/vc/vc-observer-new/get-element-name.js +62 -0
  87. package/dist/esm/vc/vc-observer-new/index.js +126 -0
  88. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +69 -0
  89. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +54 -0
  90. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +268 -0
  91. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +143 -0
  92. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +361 -0
  93. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +390 -0
  94. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +1 -0
  95. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +54 -0
  96. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +144 -0
  97. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +100 -0
  98. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +1 -0
  99. package/dist/esm/vc/vc-observer-new/metric-calculator/types.js +1 -0
  100. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +10 -0
  101. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +10 -0
  102. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +10 -0
  103. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/task-yield.js +38 -0
  104. package/dist/esm/vc/vc-observer-new/types.js +1 -0
  105. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +189 -0
  106. package/dist/esm/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +65 -0
  107. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +59 -0
  108. package/dist/esm/vc/vc-observer-new/viewport-observer/performance-observer/index.js +51 -0
  109. package/dist/esm/vc/vc-observer-new/viewport-observer/types.js +0 -0
  110. package/dist/esm/vc/vc-observer-new/window-event-observer/index.js +48 -0
  111. package/dist/types/common/index.d.ts +1 -0
  112. package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +3 -2
  113. package/dist/types/create-payload/index.d.ts +4 -4
  114. package/dist/types/interaction-metrics/post-interaction-log.d.ts +3 -2
  115. package/dist/types/segment/schedule-on-paint.d.ts +2 -0
  116. package/dist/types/vc/index.d.ts +3 -3
  117. package/dist/types/vc/types.d.ts +34 -0
  118. package/dist/types/vc/vc-observer/index.d.ts +5 -21
  119. package/dist/types/vc/vc-observer-new/entries-timeline/index.d.ts +13 -0
  120. package/dist/types/vc/vc-observer-new/get-element-name.d.ts +8 -0
  121. package/dist/types/vc/vc-observer-new/index.d.ts +18 -0
  122. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +9 -0
  123. package/dist/types/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +7 -0
  124. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +91 -0
  125. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +4 -0
  126. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +39 -0
  127. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +8 -0
  128. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +43 -0
  129. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +3 -0
  130. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +11 -0
  131. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +23 -0
  132. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +9 -0
  133. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +20 -0
  134. package/dist/types/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.d.ts +1 -0
  135. package/dist/types/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.d.ts +1 -0
  136. package/dist/types/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.d.ts +2 -0
  137. package/dist/types/vc/vc-observer-new/metric-calculator/utils/task-yield.d.ts +1 -0
  138. package/dist/types/vc/vc-observer-new/types.d.ts +21 -0
  139. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +22 -0
  140. package/dist/types/vc/vc-observer-new/viewport-observer/intersection-observer/index.d.ts +30 -0
  141. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +14 -0
  142. package/dist/types/vc/vc-observer-new/viewport-observer/performance-observer/index.d.ts +14 -0
  143. package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +10 -0
  144. package/dist/types/vc/vc-observer-new/window-event-observer/index.d.ts +17 -0
  145. package/dist/types-ts4.5/common/index.d.ts +1 -0
  146. package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +3 -2
  147. package/dist/types-ts4.5/create-payload/index.d.ts +4 -4
  148. package/dist/types-ts4.5/interaction-metrics/post-interaction-log.d.ts +3 -2
  149. package/dist/types-ts4.5/segment/schedule-on-paint.d.ts +2 -0
  150. package/dist/types-ts4.5/vc/index.d.ts +3 -3
  151. package/dist/types-ts4.5/vc/types.d.ts +34 -0
  152. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +5 -21
  153. package/dist/types-ts4.5/vc/vc-observer-new/entries-timeline/index.d.ts +13 -0
  154. package/dist/types-ts4.5/vc/vc-observer-new/get-element-name.d.ts +8 -0
  155. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +18 -0
  156. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +9 -0
  157. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +7 -0
  158. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +91 -0
  159. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +4 -0
  160. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +39 -0
  161. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +8 -0
  162. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +43 -0
  163. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +3 -0
  164. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +11 -0
  165. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +23 -0
  166. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +9 -0
  167. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +20 -0
  168. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.d.ts +1 -0
  169. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.d.ts +1 -0
  170. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.d.ts +2 -0
  171. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/task-yield.d.ts +1 -0
  172. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +21 -0
  173. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +22 -0
  174. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/intersection-observer/index.d.ts +30 -0
  175. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +14 -0
  176. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/performance-observer/index.d.ts +14 -0
  177. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +10 -0
  178. package/dist/types-ts4.5/vc/vc-observer-new/window-event-observer/index.d.ts +17 -0
  179. package/package.json +13 -1
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.calculatePercentiles = calculatePercentiles;
8
+ exports.default = calculateTTVCPercentiles;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
+ var _canvasPixel = require("./canvas-pixel");
14
+ 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; } } }; }
15
+ 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; } }
16
+ 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; }
17
+ function calculateTTVCPercentiles(_x) {
18
+ return _calculateTTVCPercentiles.apply(this, arguments);
19
+ }
20
+ function _calculateTTVCPercentiles() {
21
+ _calculateTTVCPercentiles = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
22
+ var viewport, orderedEntries, percentiles, canvas, elementMap, _iterator3, _step3, entry, rect, elementName, timePixelCounts, viewportTotalPixels;
23
+ return _regenerator.default.wrap(function _callee$(_context) {
24
+ while (1) switch (_context.prev = _context.next) {
25
+ case 0:
26
+ viewport = _ref.viewport, orderedEntries = _ref.orderedEntries, percentiles = _ref.percentiles;
27
+ canvas = new _canvasPixel.ViewportCanvas(viewport, (0, _platformFeatureFlags.fg)('platform_ufo_canvas_heatmap_full_precision') ? 1 : 0.25);
28
+ elementMap = new Map();
29
+ _iterator3 = _createForOfIteratorHelper(orderedEntries);
30
+ _context.prev = 4;
31
+ _iterator3.s();
32
+ case 6:
33
+ if ((_step3 = _iterator3.n()).done) {
34
+ _context.next = 17;
35
+ break;
36
+ }
37
+ entry = _step3.value;
38
+ if ('rect' in entry.data) {
39
+ _context.next = 10;
40
+ break;
41
+ }
42
+ return _context.abrupt("continue", 15);
43
+ case 10:
44
+ rect = entry.data.rect;
45
+ elementName = entry.data.elementName;
46
+ canvas.drawRect(rect, entry.time);
47
+ if (!elementMap.has(entry.time)) {
48
+ elementMap.set(entry.time, new Set());
49
+ }
50
+ elementMap.get(entry.time).add(elementName);
51
+ case 15:
52
+ _context.next = 6;
53
+ break;
54
+ case 17:
55
+ _context.next = 22;
56
+ break;
57
+ case 19:
58
+ _context.prev = 19;
59
+ _context.t0 = _context["catch"](4);
60
+ _iterator3.e(_context.t0);
61
+ case 22:
62
+ _context.prev = 22;
63
+ _iterator3.f();
64
+ return _context.finish(22);
65
+ case 25:
66
+ _context.next = 27;
67
+ return canvas.getPixelCounts();
68
+ case 27:
69
+ timePixelCounts = _context.sent;
70
+ viewportTotalPixels = viewport.width * viewport.height;
71
+ return _context.abrupt("return", calculatePercentiles(timePixelCounts, elementMap, percentiles, viewportTotalPixels));
72
+ case 30:
73
+ case "end":
74
+ return _context.stop();
75
+ }
76
+ }, _callee, null, [[4, 19, 22, 25]]);
77
+ }));
78
+ return _calculateTTVCPercentiles.apply(this, arguments);
79
+ }
80
+ function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels) {
81
+ var results = {};
82
+ var cumulativePixels = 0;
83
+ var percentiles = unorderedPercentiles.sort(function (a, b) {
84
+ return a - b;
85
+ });
86
+
87
+ // Sort entries by timestamp for consistent processing
88
+ var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref2, _ref3) {
89
+ var _ref4 = (0, _slicedToArray2.default)(_ref2, 1),
90
+ timeA = _ref4[0];
91
+ var _ref5 = (0, _slicedToArray2.default)(_ref3, 1),
92
+ timeB = _ref5[0];
93
+ return Number(timeA) - Number(timeB);
94
+ });
95
+ var percentileIndex = 0;
96
+ var domElementsBuffer = new Set();
97
+ var _iterator = _createForOfIteratorHelper(sortedEntries),
98
+ _step;
99
+ try {
100
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
101
+ var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
102
+ time = _step$value[0],
103
+ pixelCount = _step$value[1];
104
+ cumulativePixels += pixelCount;
105
+ var percentCovered = cumulativePixels / totalPixels * 100;
106
+ var elementNames = elementMap.get(time) || new Set();
107
+ elementNames.forEach(function (elName) {
108
+ return domElementsBuffer.add(elName);
109
+ });
110
+ var matchesAnyCheckpoints = false;
111
+ while (percentileIndex < percentiles.length && percentCovered >= percentiles[percentileIndex]) {
112
+ results["".concat(percentiles[percentileIndex])] = {
113
+ t: Number(time),
114
+ e: Array.from(domElementsBuffer)
115
+ };
116
+ percentileIndex++;
117
+ matchesAnyCheckpoints = true;
118
+ }
119
+ if (matchesAnyCheckpoints) {
120
+ domElementsBuffer.clear();
121
+ }
122
+ if (percentileIndex >= percentiles.length) {
123
+ break;
124
+ }
125
+ }
126
+
127
+ // Fill in any missing percentiles
128
+ } catch (err) {
129
+ _iterator.e(err);
130
+ } finally {
131
+ _iterator.f();
132
+ }
133
+ var _iterator2 = _createForOfIteratorHelper(percentiles),
134
+ _step2;
135
+ try {
136
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
137
+ var percentile = _step2.value;
138
+ if (!(percentile in results)) {
139
+ results["".concat(percentile)] = {
140
+ t: 0,
141
+ e: []
142
+ };
143
+ }
144
+ }
145
+ } catch (err) {
146
+ _iterator2.e(err);
147
+ } finally {
148
+ _iterator2.f();
149
+ }
150
+ return results;
151
+ }
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14
+ var _isViewportEntryData = _interopRequireDefault(require("../../utils/is-viewport-entry-data"));
15
+ var _taskYield = _interopRequireDefault(require("../../utils/task-yield"));
16
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
+ var MAX_HEATMAP_SIZE = 1000;
19
+ function createEmptyHeatmapEntry() {
20
+ return {
21
+ head: null,
22
+ previousEntries: []
23
+ };
24
+ }
25
+ function createEmptyMap(heatmapWidth, heatmapHeight) {
26
+ return Array.from({
27
+ length: heatmapHeight
28
+ }).map(function () {
29
+ return Array.from({
30
+ length: heatmapWidth
31
+ }).map(createEmptyHeatmapEntry);
32
+ });
33
+ }
34
+ function isRectInside(a, b) {
35
+ if (!a || !b) {
36
+ return false;
37
+ }
38
+
39
+ // Check if all corners of rectangle a are within the bounds of rectangle b
40
+ return a.left >= b.left && a.right <= b.right && a.top >= b.top && a.bottom <= b.bottom;
41
+ }
42
+ var Heatmap = exports.default = /*#__PURE__*/function () {
43
+ /**
44
+ * Heatmap Width
45
+ */
46
+
47
+ /**
48
+ * Heatmap Height
49
+ */
50
+
51
+ /**
52
+ * Heatmap Area (width * height)
53
+ */
54
+
55
+ function Heatmap(_ref) {
56
+ var viewport = _ref.viewport,
57
+ heatmapSize = _ref.heatmapSize;
58
+ (0, _classCallCheck2.default)(this, Heatmap);
59
+ // TODO timeOrigin? do we need? for SSR??
60
+ this.viewport = viewport;
61
+ var safeSize = Math.min(heatmapSize, MAX_HEATMAP_SIZE);
62
+ if (viewport.width === 0 || viewport.height === 0) {
63
+ this.width = safeSize;
64
+ this.height = safeSize;
65
+ this.scaleX = 1;
66
+ this.scaleY = 1;
67
+ this.heatmapAreaSize = 0;
68
+ this.map = createEmptyMap(safeSize, safeSize);
69
+ return;
70
+ }
71
+ var aspectRatio = viewport.width / viewport.height;
72
+ if (aspectRatio > 1) {
73
+ // Landscape orientation
74
+ this.width = safeSize;
75
+ this.height = Math.round(safeSize / aspectRatio);
76
+ } else {
77
+ // Portrait orientation
78
+ this.width = safeSize;
79
+ this.height = Math.round(safeSize * aspectRatio);
80
+ }
81
+ this.scaleX = this.width / viewport.width;
82
+ this.scaleY = this.height / viewport.height;
83
+ this.heatmapAreaSize = this.width * this.height;
84
+ this.map = createEmptyMap(this.width, this.height);
85
+ }
86
+ return (0, _createClass2.default)(Heatmap, [{
87
+ key: "getHeatmap",
88
+ value: function getHeatmap() {
89
+ return this.map;
90
+ }
91
+ }, {
92
+ key: "getCell",
93
+ value: function getCell(row, col) {
94
+ var _this$map$row;
95
+ return (_this$map$row = this.map[row]) === null || _this$map$row === void 0 ? void 0 : _this$map$row[col];
96
+ }
97
+
98
+ /**
99
+ * Map Dom Rect to Heatmap Rect, rounded up to occupy full cell.
100
+ * @param rect DOM Rect
101
+ * @returns
102
+ */
103
+ }, {
104
+ key: "mapDOMRectToHeatmap",
105
+ value: function mapDOMRectToHeatmap(rect) {
106
+ var scaledX = rect.x * this.scaleX;
107
+ var scaledY = rect.y * this.scaleY;
108
+ var scaledWidth = rect.width * this.scaleX;
109
+ var scaledHeight = rect.height * this.scaleY;
110
+ return {
111
+ left: Math.floor(scaledX),
112
+ right: Math.ceil(scaledX + scaledWidth),
113
+ top: Math.floor(scaledY),
114
+ bottom: Math.ceil(scaledY + scaledHeight)
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Calculate the ratio of a HeatmapRect compared to the full heatmap
120
+ *
121
+ * This function determines what fraction of the heatmap is covered by the given heatmap rectangle.
122
+ *
123
+ * @param rect
124
+ */
125
+ }, {
126
+ key: "getRatio",
127
+ value: function getRatio(rect) {
128
+ if (this.viewport.width === 0 || this.viewport.height === 0) {
129
+ return 0;
130
+ }
131
+ var right = rect.right,
132
+ left = rect.left,
133
+ bottom = rect.bottom,
134
+ top = rect.top;
135
+ var rectWidth = right - left;
136
+ var rectHeight = bottom - top;
137
+ var rectArea = rectWidth * rectHeight;
138
+ var ratio = rectArea / this.heatmapAreaSize;
139
+ if (ratio > 1) {
140
+ return 1;
141
+ }
142
+ return ratio;
143
+ }
144
+ }, {
145
+ key: "applyEntriesToHeatmap",
146
+ value: function () {
147
+ var _applyEntriesToHeatmap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(entries) {
148
+ var i, entry, time, type, data, rect, ratio, heatmapEntryData, roundedTop, roundedBottom, roundedLeft, roundedRight, row, col, cell, previousEntry;
149
+ return _regenerator.default.wrap(function _callee$(_context) {
150
+ while (1) switch (_context.prev = _context.next) {
151
+ case 0:
152
+ i = 0;
153
+ case 1:
154
+ if (!(i < entries.length)) {
155
+ _context.next = 37;
156
+ break;
157
+ }
158
+ entry = entries[i];
159
+ time = entry.time, type = entry.type, data = entry.data;
160
+ if (!(0, _isViewportEntryData.default)(data)) {
161
+ _context.next = 31;
162
+ break;
163
+ }
164
+ rect = this.mapDOMRectToHeatmap(data.rect);
165
+ ratio = this.getRatio(rect);
166
+ heatmapEntryData = {
167
+ time: time,
168
+ elementName: data.elementName,
169
+ ratio: ratio !== null && ratio !== void 0 ? ratio : null,
170
+ rect: rect,
171
+ source: type
172
+ };
173
+ roundedTop = Math.floor(rect.top);
174
+ roundedBottom = Math.min(rect.bottom, this.height);
175
+ roundedLeft = Math.floor(rect.left);
176
+ roundedRight = Math.min(rect.right, this.width);
177
+ row = roundedTop;
178
+ case 13:
179
+ if (!(row < roundedBottom)) {
180
+ _context.next = 31;
181
+ break;
182
+ }
183
+ col = roundedLeft;
184
+ case 15:
185
+ if (!(col < roundedRight)) {
186
+ _context.next = 28;
187
+ break;
188
+ }
189
+ cell = this.getCell(row, col);
190
+ if (cell) {
191
+ _context.next = 19;
192
+ break;
193
+ }
194
+ return _context.abrupt("continue", 25);
195
+ case 19:
196
+ previousEntry = cell.head; // When elements are added at the same time
197
+ // we try to keep the inner element changes as the head
198
+ if (!((previousEntry === null || previousEntry === void 0 ? void 0 : previousEntry.time) === entry.time && isRectInside(previousEntry.rect, heatmapEntryData.rect))) {
199
+ _context.next = 23;
200
+ break;
201
+ }
202
+ cell.previousEntries.push(_objectSpread(_objectSpread({}, heatmapEntryData), {}, {
203
+ source: 'mutation:parent-mounted'
204
+ }));
205
+ return _context.abrupt("continue", 25);
206
+ case 23:
207
+ cell.head = _objectSpread(_objectSpread({}, heatmapEntryData), {}, {
208
+ source: heatmapEntryData.source || null
209
+ });
210
+ if (previousEntry !== null) {
211
+ cell.previousEntries.push(previousEntry);
212
+ }
213
+ case 25:
214
+ col++;
215
+ _context.next = 15;
216
+ break;
217
+ case 28:
218
+ row++;
219
+ _context.next = 13;
220
+ break;
221
+ case 31:
222
+ if (!(i % 100 === 0)) {
223
+ _context.next = 34;
224
+ break;
225
+ }
226
+ _context.next = 34;
227
+ return (0, _taskYield.default)();
228
+ case 34:
229
+ i++;
230
+ _context.next = 1;
231
+ break;
232
+ case 37:
233
+ case "end":
234
+ return _context.stop();
235
+ }
236
+ }, _callee, this);
237
+ }));
238
+ function applyEntriesToHeatmap(_x) {
239
+ return _applyEntriesToHeatmap.apply(this, arguments);
240
+ }
241
+ return applyEntriesToHeatmap;
242
+ }()
243
+ }, {
244
+ key: "getVCPercentMetrics",
245
+ value: function () {
246
+ var _getVCPercentMetrics = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(vcPercentCheckpoint) {
247
+ var sortedCheckpoints, flattenHeatmap, totalCells, timestampMap, i, _cellHead$time, _timestampMap$get, cell, cellHead, timestamp, elementName, curr, sortedTimings, totalCellPainted, result, domElementsBuffer, _i, _timestamp, timestampInfo, cellCount, domElements, currVCRatio, currVCPercent, matchesAnyCheckpoints, checkpoint, _domElements;
248
+ return _regenerator.default.wrap(function _callee2$(_context2) {
249
+ while (1) switch (_context2.prev = _context2.next) {
250
+ case 0:
251
+ sortedCheckpoints = (0, _toConsumableArray2.default)(vcPercentCheckpoint).sort(function (a, b) {
252
+ return a - b;
253
+ });
254
+ flattenHeatmap = this.map.flat();
255
+ totalCells = flattenHeatmap.length;
256
+ timestampMap = new Map();
257
+ i = 0;
258
+ case 5:
259
+ if (!(i < flattenHeatmap.length)) {
260
+ _context2.next = 20;
261
+ break;
262
+ }
263
+ cell = flattenHeatmap[i];
264
+ cellHead = cell.head;
265
+ timestamp = Math.trunc((_cellHead$time = cellHead === null || cellHead === void 0 ? void 0 : cellHead.time) !== null && _cellHead$time !== void 0 ? _cellHead$time : 0);
266
+ elementName = cellHead === null || cellHead === void 0 ? void 0 : cellHead.elementName;
267
+ curr = (_timestampMap$get = timestampMap.get(timestamp)) !== null && _timestampMap$get !== void 0 ? _timestampMap$get : {
268
+ cellCount: 0,
269
+ domElements: new Set()
270
+ };
271
+ curr.cellCount += 1;
272
+ if (elementName) {
273
+ curr.domElements.add(elementName);
274
+ }
275
+ timestampMap.set(timestamp, curr);
276
+
277
+ // Every 10000 heatmap entries processed
278
+ // we give the browser the power
279
+ // to process any other high priority task
280
+ if (!(i > 10000 && i % 10000 === 0)) {
281
+ _context2.next = 17;
282
+ break;
283
+ }
284
+ _context2.next = 17;
285
+ return (0, _taskYield.default)();
286
+ case 17:
287
+ i++;
288
+ _context2.next = 5;
289
+ break;
290
+ case 20:
291
+ sortedTimings = (0, _toConsumableArray2.default)(timestampMap.keys()).sort(function (a, b) {
292
+ return a - b;
293
+ });
294
+ totalCellPainted = 0;
295
+ result = {};
296
+ domElementsBuffer = new Set();
297
+ _i = 0;
298
+ case 25:
299
+ if (!(_i < sortedTimings.length)) {
300
+ _context2.next = 52;
301
+ break;
302
+ }
303
+ _timestamp = sortedTimings[_i];
304
+ timestampInfo = timestampMap.get(_timestamp);
305
+ if (timestampInfo) {
306
+ _context2.next = 30;
307
+ break;
308
+ }
309
+ throw new Error('unexpected timestampInfo not found');
310
+ case 30:
311
+ cellCount = timestampInfo.cellCount, domElements = timestampInfo.domElements;
312
+ totalCellPainted += cellCount;
313
+ currVCRatio = totalCellPainted / totalCells;
314
+ currVCPercent = Math.round(currVCRatio * 100);
315
+ domElements.forEach(function (domElement) {
316
+ domElementsBuffer.add(domElement);
317
+ });
318
+ matchesAnyCheckpoints = false;
319
+ case 36:
320
+ if (!(sortedCheckpoints.length > 0 && currVCPercent >= sortedCheckpoints[0])) {
321
+ _context2.next = 45;
322
+ break;
323
+ }
324
+ checkpoint = sortedCheckpoints.shift();
325
+ _domElements = (0, _toConsumableArray2.default)(domElementsBuffer);
326
+ if (checkpoint) {
327
+ _context2.next = 41;
328
+ break;
329
+ }
330
+ return _context2.abrupt("break", 45);
331
+ case 41:
332
+ matchesAnyCheckpoints = true;
333
+ result[checkpoint.toString()] = {
334
+ t: _timestamp,
335
+ e: _domElements
336
+ };
337
+ _context2.next = 36;
338
+ break;
339
+ case 45:
340
+ if (matchesAnyCheckpoints) {
341
+ domElementsBuffer.clear();
342
+ }
343
+ if (!(_i % 500 === 0)) {
344
+ _context2.next = 49;
345
+ break;
346
+ }
347
+ _context2.next = 49;
348
+ return (0, _taskYield.default)();
349
+ case 49:
350
+ _i++;
351
+ _context2.next = 25;
352
+ break;
353
+ case 52:
354
+ return _context2.abrupt("return", result);
355
+ case 53:
356
+ case "end":
357
+ return _context2.stop();
358
+ }
359
+ }, _callee2, this);
360
+ }));
361
+ function getVCPercentMetrics(_x2) {
362
+ return _getVCPercentMetrics.apply(this, arguments);
363
+ }
364
+ return getVCPercentMetrics;
365
+ }()
366
+ }]);
367
+ }();