@atlaskit/react-ufo 2.14.2 → 2.15.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 (71) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/create-payload/index.js +11 -0
  3. package/dist/cjs/experience-trace-id-context/index.js +5 -1
  4. package/dist/cjs/segment/segment.js +7 -1
  5. package/dist/cjs/vc/vc-observer/heatmap/heatmap.js +275 -0
  6. package/dist/cjs/vc/vc-observer/index.js +133 -29
  7. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  8. package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +52 -0
  9. package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +39 -0
  10. package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
  11. package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
  12. package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
  13. package/dist/es2019/create-payload/index.js +11 -0
  14. package/dist/es2019/experience-trace-id-context/index.js +4 -0
  15. package/dist/es2019/segment/segment.js +11 -3
  16. package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +238 -0
  17. package/dist/es2019/vc/vc-observer/index.js +115 -7
  18. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  19. package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +35 -0
  20. package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +21 -0
  21. package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
  22. package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
  23. package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
  24. package/dist/esm/create-payload/index.js +11 -0
  25. package/dist/esm/experience-trace-id-context/index.js +4 -0
  26. package/dist/esm/segment/segment.js +7 -1
  27. package/dist/esm/vc/vc-observer/heatmap/heatmap.js +268 -0
  28. package/dist/esm/vc/vc-observer/index.js +133 -29
  29. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  30. package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +45 -0
  31. package/dist/esm/vc/vc-observer/revisions/fy24_01.js +32 -0
  32. package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
  33. package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
  34. package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
  35. package/dist/types/common/vc/types.d.ts +28 -9
  36. package/dist/types/create-payload/index.d.ts +16 -0
  37. package/dist/types/experience-trace-id-context/index.d.ts +1 -0
  38. package/dist/types/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
  39. package/dist/types/label/UFOLabel.d.ts +2 -2
  40. package/dist/types/load-hold/UFOLoadHold.d.ts +2 -2
  41. package/dist/types/placeholder/Placeholder.d.ts +2 -2
  42. package/dist/types/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
  43. package/dist/types/segment/segment-highlight.d.ts +2 -2
  44. package/dist/types/segment/segment.d.ts +2 -2
  45. package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  46. package/dist/types/vc/vc-observer/index.d.ts +6 -1
  47. package/dist/types/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
  48. package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  49. package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  50. package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  51. package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
  52. package/dist/types/vc/vc-observer/revisions/types.d.ts +5 -0
  53. package/dist/types-ts4.5/common/vc/types.d.ts +28 -9
  54. package/dist/types-ts4.5/create-payload/index.d.ts +16 -0
  55. package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
  56. package/dist/types-ts4.5/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
  57. package/dist/types-ts4.5/label/UFOLabel.d.ts +2 -2
  58. package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +2 -2
  59. package/dist/types-ts4.5/placeholder/Placeholder.d.ts +2 -2
  60. package/dist/types-ts4.5/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
  61. package/dist/types-ts4.5/segment/segment-highlight.d.ts +2 -2
  62. package/dist/types-ts4.5/segment/segment.d.ts +2 -2
  63. package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  64. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +16 -1
  65. package/dist/types-ts4.5/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
  66. package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  67. package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  68. package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  69. package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
  70. package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +5 -0
  71. package/package.json +17 -6
@@ -8,7 +8,6 @@ exports.SSRPlaceholderHandlers = void 0;
8
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
11
  var EQUALITY_THRESHOLD = 0.1;
13
12
  var ANCESTOR_LOOKUP_LIMIT = 10;
14
13
  var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/function () {
@@ -36,20 +35,15 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
36
35
  return;
37
36
  }
38
37
  var rect = _this.staticPlaceholders.get(staticKey);
39
- if ((0, _platformFeatureFlags.fg)('platform_ufo_ssr_ttvc_use_target_rect')) {
40
- var hasSameSizePosition = _this.hasSameSizePosition(rect, boundingClientRect);
41
- if (hasSameSizePosition || _this.isDummyRect(rect)) {
42
- _resolve(hasSameSizePosition);
43
- } else {
44
- requestAnimationFrame(function () {
45
- var targetRect = target.getBoundingClientRect();
46
- var hasSameSizePosition = _this.hasSameSizePosition(rect, targetRect);
47
- _resolve(hasSameSizePosition);
48
- });
49
- }
38
+ var hasSameSizePosition = _this.hasSameSizePosition(rect, boundingClientRect);
39
+ if (hasSameSizePosition || _this.isDummyRect(rect)) {
40
+ _resolve(hasSameSizePosition);
50
41
  } else {
51
- var _hasSameSizePosition = _this.hasSameSizePosition(rect, boundingClientRect);
52
- _resolve(_hasSameSizePosition);
42
+ requestAnimationFrame(function () {
43
+ var targetRect = target.getBoundingClientRect();
44
+ var hasSameSizePosition = _this.hasSameSizePosition(rect, targetRect);
45
+ _resolve(hasSameSizePosition);
46
+ });
53
47
  }
54
48
  _this.callbacks.delete(staticKey);
55
49
  }
@@ -60,20 +54,15 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
60
54
  return;
61
55
  }
62
56
  var _rect = _this.staticPlaceholders.get(key);
63
- if ((0, _platformFeatureFlags.fg)('platform_ufo_ssr_ttvc_use_target_rect')) {
64
- var _hasSameSizePosition2 = _this.hasSameSizePosition(_rect, boundingClientRect);
65
- if (_hasSameSizePosition2 || _this.isDummyRect(_rect)) {
66
- _resolve2(_hasSameSizePosition2);
67
- } else {
68
- requestAnimationFrame(function () {
69
- var targetRect = target.getBoundingClientRect();
70
- var hasSameSizePosition = _this.hasSameSizePosition(_rect, targetRect);
71
- _resolve2(hasSameSizePosition);
72
- });
73
- }
57
+ var _hasSameSizePosition = _this.hasSameSizePosition(_rect, boundingClientRect);
58
+ if (_hasSameSizePosition || _this.isDummyRect(_rect)) {
59
+ _resolve2(_hasSameSizePosition);
74
60
  } else {
75
- var _hasSameSizePosition3 = _this.hasSameSizePosition(_rect, boundingClientRect);
76
- _resolve2(_hasSameSizePosition3);
61
+ requestAnimationFrame(function () {
62
+ var targetRect = target.getBoundingClientRect();
63
+ var hasSameSizePosition = _this.hasSameSizePosition(_rect, targetRect);
64
+ _resolve2(hasSameSizePosition);
65
+ });
77
66
  }
78
67
  _this.staticPlaceholders.delete(staticKey);
79
68
  _this.reactValidateCallbacks.delete(staticKey);
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ViewportUpdateClassifier = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var ViewportUpdateClassifier = exports.ViewportUpdateClassifier = /*#__PURE__*/function () {
13
+ function ViewportUpdateClassifier() {
14
+ (0, _classCallCheck2.default)(this, ViewportUpdateClassifier);
15
+ (0, _defineProperty2.default)(this, "types", []);
16
+ (0, _defineProperty2.default)(this, "filters", []);
17
+ (0, _defineProperty2.default)(this, "removedFilters", []);
18
+ (0, _defineProperty2.default)(this, "__combinedTypes", []);
19
+ (0, _defineProperty2.default)(this, "__combinedFilters", []);
20
+ }
21
+ return (0, _createClass2.default)(ViewportUpdateClassifier, [{
22
+ key: "mergeConfig",
23
+ value: function mergeConfig() {
24
+ var _this = this;
25
+ this.__combinedTypes = [].concat((0, _toConsumableArray2.default)(this.types), (0, _toConsumableArray2.default)((this === null || this === void 0 ? void 0 : this.__combinedTypes) || []));
26
+ var previousFilters = this.removedFilters.length === 0 ? this.__combinedFilters : this.__combinedFilters.filter(function (filter) {
27
+ return !_this.removedFilters.includes(filter.name);
28
+ });
29
+ this.__combinedFilters = [].concat((0, _toConsumableArray2.default)(this.filters), (0, _toConsumableArray2.default)(previousFilters));
30
+ }
31
+ }, {
32
+ key: "classifyUpdate",
33
+ value: function classifyUpdate(_ref) {
34
+ var element = _ref.element,
35
+ type = _ref.type,
36
+ tags = _ref.tags,
37
+ ignoreReason = _ref.ignoreReason;
38
+ if (!this.__combinedTypes.includes(type)) {
39
+ return false;
40
+ }
41
+ return this.__combinedFilters.every(function (_ref2) {
42
+ var filter = _ref2.filter,
43
+ name = _ref2.name;
44
+ return filter({
45
+ type: type,
46
+ tags: tags,
47
+ ignoreReason: ignoreReason
48
+ });
49
+ });
50
+ }
51
+ }]);
52
+ }();
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.revFY24_01Classifier = exports.FY24_01Classifier = void 0;
8
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
11
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _ViewportUpdateClassifier = require("./ViewportUpdateClassifier");
15
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
16
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
+ var legacyIgnoreReasons = ['image', 'ssr-hydration', 'editor-lazy-node-view', 'editor-container-mutation'];
18
+ var FY24_01Classifier = exports.FY24_01Classifier = /*#__PURE__*/function (_ViewportUpdateClassi) {
19
+ function FY24_01Classifier() {
20
+ var _this;
21
+ (0, _classCallCheck2.default)(this, FY24_01Classifier);
22
+ _this = _callSuper(this, FY24_01Classifier);
23
+ (0, _defineProperty2.default)(_this, "revision", 'fy24.01');
24
+ (0, _defineProperty2.default)(_this, "types", ['html', 'text']);
25
+ (0, _defineProperty2.default)(_this, "filters", [{
26
+ name: 'default-ignore-reasons',
27
+ filter: function filter(_ref) {
28
+ var type = _ref.type,
29
+ ignoreReason = _ref.ignoreReason;
30
+ return !ignoreReason || !legacyIgnoreReasons.includes(ignoreReason);
31
+ }
32
+ }]);
33
+ _this.mergeConfig();
34
+ return _this;
35
+ }
36
+ (0, _inherits2.default)(FY24_01Classifier, _ViewportUpdateClassi);
37
+ return (0, _createClass2.default)(FY24_01Classifier);
38
+ }(_ViewportUpdateClassifier.ViewportUpdateClassifier);
39
+ var revFY24_01Classifier = exports.revFY24_01Classifier = new FY24_01Classifier();
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.revFY25_01Classifier = exports.FY25_01Classifier = void 0;
8
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
11
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _fy24_ = require("./fy24_01");
15
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
16
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
+ var FY25_01Classifier = exports.FY25_01Classifier = /*#__PURE__*/function (_FY24_01Classifier) {
18
+ function FY25_01Classifier() {
19
+ var _this;
20
+ (0, _classCallCheck2.default)(this, FY25_01Classifier);
21
+ _this = _callSuper(this, FY25_01Classifier);
22
+ (0, _defineProperty2.default)(_this, "revision", 'fy25.01');
23
+ (0, _defineProperty2.default)(_this, "types", ['attr']);
24
+ (0, _defineProperty2.default)(_this, "filters", [{
25
+ name: 'not-visible',
26
+ filter: function filter(_ref) {
27
+ var type = _ref.type,
28
+ ignoreReason = _ref.ignoreReason;
29
+ return !(ignoreReason !== null && ignoreReason !== void 0 && ignoreReason.includes('not-visible'));
30
+ }
31
+ }]);
32
+ (0, _defineProperty2.default)(_this, "removedFilters", []);
33
+ _this.mergeConfig();
34
+ return _this;
35
+ }
36
+ (0, _inherits2.default)(FY25_01Classifier, _FY24_01Classifier);
37
+ return (0, _createClass2.default)(FY25_01Classifier);
38
+ }(_fy24_.FY24_01Classifier);
39
+ var revFY25_01Classifier = exports.revFY25_01Classifier = new FY25_01Classifier();
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getRevisions = void 0;
7
+ var _fy24_ = require("./fy24_01");
8
+ var _fy25_ = require("./fy25_01");
9
+ var Revisions = [{
10
+ name: 'fy24.01',
11
+ classifier: _fy24_.revFY24_01Classifier
12
+ }, {
13
+ name: 'fy25.01',
14
+ classifier: _fy25_.revFY25_01Classifier
15
+ }];
16
+ var revisionResultCache = null;
17
+ var getRevisions = exports.getRevisions = function getRevisions() {
18
+ if (revisionResultCache !== null) {
19
+ return revisionResultCache;
20
+ }
21
+ revisionResultCache = [].concat(Revisions);
22
+ return revisionResultCache;
23
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -201,6 +201,16 @@ const getVCMetrics = interaction => {
201
201
  if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
202
202
  return result;
203
203
  }
204
+ if (fg('ufo_vc_multiheatmap')) {
205
+ var _result;
206
+ (_result = result[`${prefix}:vc:rev`]) === null || _result === void 0 ? void 0 : _result.forEach(element => {
207
+ var _element$vcDetails, _element$vcDetails$;
208
+ if ((_element$vcDetails = element.vcDetails) !== null && _element$vcDetails !== void 0 && (_element$vcDetails$ = _element$vcDetails['90']) !== null && _element$vcDetails$ !== void 0 && _element$vcDetails$.t) {
209
+ var _element$vcDetails$2;
210
+ element['metric:vc90'] = (_element$vcDetails$2 = element.vcDetails['90']) === null || _element$vcDetails$2 === void 0 ? void 0 : _element$vcDetails$2.t;
211
+ }
212
+ });
213
+ }
204
214
  return {
205
215
  ...result,
206
216
  'metric:vc90': VC['90']
@@ -615,6 +625,7 @@ function getPayloadSize(payload) {
615
625
  return Math.round(new TextEncoder().encode(JSON.stringify(payload)).length / 1024);
616
626
  }
617
627
  function getStylesheetMetrics() {
628
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
618
629
  if (!fg('ufo_capture_stylesheet_metrics')) {
619
630
  return {};
620
631
  }
@@ -28,4 +28,8 @@ export const getActiveTraceHttpRequestHeaders = _url => {
28
28
  spanId
29
29
  } = state.context;
30
30
  return makeTraceHttpRequestHeaders(traceId, spanId);
31
+ };
32
+ export const getActiveTraceAsQueryParams = _url => {
33
+ const traceHeaders = getActiveTraceHttpRequestHeaders(_url);
34
+ return traceHeaders ? new URLSearchParams(traceHeaders).toString().toLowerCase() : null;
31
35
  };
@@ -1,6 +1,7 @@
1
1
  import React, { lazy, Profiler, Suspense, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
2
2
  import { unstable_NormalPriority as NormalPriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
3
3
  import { v4 as createUUID } from 'uuid';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import coinflip from '../coinflip';
5
6
  import { getConfig, getInteractionRate } from '../config';
6
7
  import { getActiveTrace, setInteractionActiveTrace } from '../experience-trace-id-context';
@@ -31,7 +32,9 @@ export default function UFOSegment({
31
32
  }], [parentContext, segmentName, segmentId]);
32
33
  const interactionId = useContext(UFOInteractionIDContext);
33
34
  const interactionContext = useMemo(() => {
34
- addSegment(labelStack);
35
+ if (!fg('platform-ufo-add-segment-use-effect')) {
36
+ addSegment(labelStack);
37
+ }
35
38
  let lastCompleteEndTime = 0;
36
39
  function complete(endTime = performance.now()) {
37
40
  if (interactionId.current) {
@@ -205,8 +208,13 @@ export default function UFOSegment({
205
208
  interactionContext.onRender(phase, actualDuration, baseDuration, startTime, commitTime);
206
209
  }
207
210
  }, [interactionContext]);
208
- useEffect(() => () => {
209
- removeSegment(labelStack);
211
+ useEffect(() => {
212
+ if (fg('platform-ufo-add-segment-use-effect')) {
213
+ addSegment(labelStack);
214
+ }
215
+ return () => {
216
+ removeSegment(labelStack);
217
+ };
210
218
  }, [interactionId, parentContext, interactionContext, labelStack]);
211
219
  const reactProfilerId = useMemo(() => labelStack.map(l => l.name).join('/'), [labelStack]);
212
220
  const enableSegmentHighlighting = (_getConfig2 = getConfig()) === null || _getConfig2 === void 0 ? void 0 : _getConfig2.enableSegmentHighlighting;
@@ -0,0 +1,238 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ const UNUSED_SECTOR = 0;
3
+ export class MultiRevisionHeatmap {
4
+ constructor({
5
+ viewport,
6
+ revisions,
7
+ arraySize,
8
+ devToolsEnabled
9
+ }) {
10
+ _defineProperty(this, "arraySize", {
11
+ w: 200,
12
+ h: 200
13
+ });
14
+ _defineProperty(this, "mapPixelsToHeatmap", (left, top, width, height) => {
15
+ const {
16
+ w,
17
+ h
18
+ } = this.viewport;
19
+ const l = Math.floor(left / w * this.arraySize.w);
20
+ const t = Math.floor(top / h * this.arraySize.h);
21
+ const r = Math.ceil((left + width) / w * this.arraySize.w);
22
+ const b = Math.ceil((top + height) / h * this.arraySize.h);
23
+
24
+ // correct values to min - 0, max - arraySize
25
+ const result = {
26
+ l: Math.max(0, l),
27
+ t: Math.max(0, t),
28
+ r: Math.min(this.arraySize.w, r),
29
+ b: Math.min(this.arraySize.h, b)
30
+ };
31
+ return result;
32
+ });
33
+ _defineProperty(this, "getElementRatio", mappedValues => {
34
+ const {
35
+ r,
36
+ l,
37
+ b,
38
+ t
39
+ } = mappedValues;
40
+ return (r - l) * (b - t) / (this.arraySize.w * this.arraySize.h);
41
+ });
42
+ this.viewport = viewport;
43
+ this.revisions = revisions;
44
+ if (arraySize) {
45
+ this.arraySize = arraySize;
46
+ }
47
+ this.heatmaps = new Array(revisions.length);
48
+ this.componentsLogs = new Array(revisions.length);
49
+ this.vcRatios = new Array(revisions.length);
50
+ this.devToolsEnabled = devToolsEnabled || false;
51
+ revisions.forEach(({}, i) => {
52
+ this.heatmaps[i] = this.getCleanHeatmap();
53
+ this.componentsLogs[i] = {};
54
+ this.vcRatios[i] = {};
55
+ });
56
+ }
57
+ handleUpdate({
58
+ time,
59
+ type,
60
+ classification,
61
+ intersectionRect,
62
+ element,
63
+ targetName,
64
+ ignoreReason,
65
+ onError
66
+ }) {
67
+ const mappedValues = this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
68
+ const result = this.applyChangesToHeatMap(mappedValues, time, classification);
69
+ if (result !== true) {
70
+ onError(result);
71
+ }
72
+ const componentRatio = this.getElementRatio(mappedValues);
73
+ this.revisions.forEach((_, i) => {
74
+ if (classification[i]) {
75
+ this.vcRatios[i][targetName] = componentRatio;
76
+ }
77
+ if (!this.componentsLogs[i][time]) {
78
+ this.componentsLogs[i][time] = [];
79
+ }
80
+ this.componentsLogs[i][time].push({
81
+ __debug__element: this.devToolsEnabled ? new WeakRef(element) : null,
82
+ intersectionRect,
83
+ targetName,
84
+ ignoreReason
85
+ });
86
+ });
87
+ }
88
+ getData() {
89
+ return {
90
+ heatmaps: this.heatmaps
91
+ };
92
+ }
93
+ getPayloadShapedData(args) {
94
+ const result = this.processData(args);
95
+ const payload = this.revisions.map((rev, i) => {
96
+ const vcDetails = {};
97
+ args.VCParts.forEach(VCPart => {
98
+ vcDetails[VCPart] = {
99
+ t: result[i].VC[VCPart] || 0,
100
+ e: Array.from(result[i].VCBox[VCPart] || [])
101
+ };
102
+ });
103
+ return {
104
+ revision: rev.name,
105
+ vcDetails,
106
+ clean: args.clean,
107
+ 'metric:vc90': null // will be set or not in the payload generator
108
+ };
109
+ });
110
+ return payload;
111
+ }
112
+ processData({
113
+ VCParts,
114
+ ssr = UNUSED_SECTOR
115
+ }) {
116
+ return this.heatmaps.map((heatmap, i) => {
117
+ const lastUpdate = {};
118
+ let totalPainted = 0;
119
+ let componentsLog = this.componentsLogs[i];
120
+ if (ssr !== UNUSED_SECTOR) {
121
+ var _window$document;
122
+ const element = {
123
+ __debug__element: new WeakRef((_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.body),
124
+ intersectionRect: {
125
+ top: 0,
126
+ left: 0,
127
+ right: 0,
128
+ bottom: 0,
129
+ x: 0,
130
+ y: 0,
131
+ width: this.viewport.w,
132
+ height: this.viewport.h,
133
+ toJSON() {
134
+ return {};
135
+ }
136
+ },
137
+ targetName: 'SSR'
138
+ };
139
+ if (!componentsLog[ssr]) {
140
+ componentsLog[ssr] = [];
141
+ }
142
+ componentsLog[ssr].push(element);
143
+ }
144
+ for (let i = 0; i < heatmap.length; i++) {
145
+ const rounded = Math.floor(heatmap[i] === UNUSED_SECTOR && ssr !== UNUSED_SECTOR ? ssr : heatmap[i]);
146
+ totalPainted += rounded !== UNUSED_SECTOR ? 1 : 0;
147
+ if (rounded !== UNUSED_SECTOR) {
148
+ lastUpdate[rounded] = lastUpdate[rounded] ? lastUpdate[rounded] + 1 : 1;
149
+ }
150
+ }
151
+ const entries = Object.entries(lastUpdate).map(a => [parseInt(a[0], 10), a[1]]).sort((a, b) => a[0] > b[0] ? 1 : -1);
152
+ const VC = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
153
+ const VCBox = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
154
+ entries.reduce((acc = 0, v) => {
155
+ const VCRatio = v[1] / totalPainted + acc;
156
+ const time = v[0];
157
+ VCParts.forEach(value => {
158
+ if ((VC[value] === null || VC[value] === undefined) && VCRatio >= value / 100) {
159
+ var _componentsLog$time;
160
+ VC[value] = time;
161
+ VCBox[value] = new Set();
162
+ (_componentsLog$time = componentsLog[time]) === null || _componentsLog$time === void 0 ? void 0 : _componentsLog$time.forEach(v => {
163
+ var _VCBox$value;
164
+ return (_VCBox$value = VCBox[value]) === null || _VCBox$value === void 0 ? void 0 : _VCBox$value.add(v.targetName);
165
+ });
166
+ }
167
+ });
168
+ return VCRatio;
169
+ }, 0);
170
+ const VCEntries = entries.reduce((acc, [timestamp, entryPainted], i) => {
171
+ var _acc$abs, _componentsLog$timest;
172
+ const currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
173
+ const currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
174
+ const logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(v => v.targetName);
175
+ acc.abs.push([timestamp, currentlyPainted]);
176
+ acc.rel.push({
177
+ time: timestamp,
178
+ vc: currentlyPaintedRatio,
179
+ elements: logEntry
180
+ });
181
+ return acc;
182
+ }, {
183
+ abs: [],
184
+ rel: []
185
+ });
186
+ return {
187
+ VC,
188
+ VCBox,
189
+ VCEntries,
190
+ totalPainted
191
+ };
192
+ });
193
+ }
194
+ applyChangesToHeatMap(a, time, classification) {
195
+ const {
196
+ l,
197
+ t,
198
+ r,
199
+ b
200
+ } = a;
201
+ const size = classification.length;
202
+ for (let row = t; row < b; row++) {
203
+ if (this.heatmaps[0][row] === undefined) {
204
+ try {
205
+ return {
206
+ error: `index - ${row}`,
207
+ time
208
+ };
209
+ } catch (e) {
210
+ return {
211
+ error: 'row error',
212
+ time
213
+ };
214
+ }
215
+ } else {
216
+ for (let heatmapIndex = 0; heatmapIndex < size; heatmapIndex++) {
217
+ if (classification[heatmapIndex]) {
218
+ this.heatmaps[heatmapIndex].fill(time, this.getIndex(l, row), this.getIndex(r, row));
219
+ }
220
+ }
221
+ }
222
+ }
223
+ return true;
224
+ }
225
+ getIndex(x, y) {
226
+ return x + this.arraySize.w * y;
227
+ }
228
+ getCleanHeatmap() {
229
+ return new Uint32Array(this.arraySize.w * this.arraySize.h);
230
+ }
231
+ static makeVCReturnObj(VCParts) {
232
+ const vc = {};
233
+ VCParts.forEach(v => {
234
+ vc[v] = null;
235
+ });
236
+ return vc;
237
+ }
238
+ }