@atlaskit/react-ufo 2.14.3 → 2.16.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 (73) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/assets/index.js +96 -0
  3. package/dist/cjs/assets/utils.js +32 -0
  4. package/dist/cjs/common/assets/types.js +5 -0
  5. package/dist/cjs/create-payload/index.js +42 -5
  6. package/dist/cjs/experience-trace-id-context/index.js +5 -1
  7. package/dist/cjs/segment/segment.js +7 -1
  8. package/dist/cjs/vc/vc-observer/heatmap/heatmap.js +264 -0
  9. package/dist/cjs/vc/vc-observer/index.js +119 -26
  10. package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +60 -0
  11. package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +71 -0
  12. package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
  13. package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
  14. package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
  15. package/dist/es2019/assets/index.js +82 -0
  16. package/dist/es2019/assets/utils.js +26 -0
  17. package/dist/es2019/common/assets/types.js +1 -0
  18. package/dist/es2019/create-payload/index.js +43 -3
  19. package/dist/es2019/experience-trace-id-context/index.js +4 -0
  20. package/dist/es2019/segment/segment.js +11 -3
  21. package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +230 -0
  22. package/dist/es2019/vc/vc-observer/index.js +97 -3
  23. package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +41 -0
  24. package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +50 -0
  25. package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
  26. package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
  27. package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
  28. package/dist/esm/assets/index.js +89 -0
  29. package/dist/esm/assets/utils.js +26 -0
  30. package/dist/esm/common/assets/types.js +1 -0
  31. package/dist/esm/create-payload/index.js +42 -5
  32. package/dist/esm/experience-trace-id-context/index.js +4 -0
  33. package/dist/esm/segment/segment.js +7 -1
  34. package/dist/esm/vc/vc-observer/heatmap/heatmap.js +257 -0
  35. package/dist/esm/vc/vc-observer/index.js +119 -26
  36. package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +53 -0
  37. package/dist/esm/vc/vc-observer/revisions/fy24_01.js +64 -0
  38. package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
  39. package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
  40. package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
  41. package/dist/types/assets/index.d.ts +25 -0
  42. package/dist/types/assets/utils.d.ts +6 -0
  43. package/dist/types/common/assets/types.d.ts +18 -0
  44. package/dist/types/common/index.d.ts +1 -0
  45. package/dist/types/common/vc/types.d.ts +27 -8
  46. package/dist/types/config/index.d.ts +2 -1
  47. package/dist/types/create-payload/index.d.ts +11616 -0
  48. package/dist/types/experience-trace-id-context/index.d.ts +1 -0
  49. package/dist/types/resource-timing/index.d.ts +1 -1
  50. package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +72 -0
  51. package/dist/types/vc/vc-observer/index.d.ts +5 -1
  52. package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +30 -0
  53. package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +13 -0
  54. package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  55. package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
  56. package/dist/types/vc/vc-observer/revisions/types.d.ts +23 -0
  57. package/dist/types-ts4.5/assets/index.d.ts +25 -0
  58. package/dist/types-ts4.5/assets/utils.d.ts +6 -0
  59. package/dist/types-ts4.5/common/assets/types.d.ts +18 -0
  60. package/dist/types-ts4.5/common/index.d.ts +1 -0
  61. package/dist/types-ts4.5/common/vc/types.d.ts +27 -8
  62. package/dist/types-ts4.5/config/index.d.ts +2 -1
  63. package/dist/types-ts4.5/create-payload/index.d.ts +11616 -0
  64. package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
  65. package/dist/types-ts4.5/resource-timing/index.d.ts +1 -1
  66. package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +72 -0
  67. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +15 -1
  68. package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +30 -0
  69. package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +13 -0
  70. package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  71. package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
  72. package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +23 -0
  73. package/package.json +11 -2
@@ -0,0 +1,89 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
+ import { calculateTransferType, DISK_KEY, MEMORY_KEY, NETWORK_KEY, round } from './utils';
6
+ export var CHRSummary = /*#__PURE__*/function () {
7
+ function CHRSummary() {
8
+ _classCallCheck(this, CHRSummary);
9
+ _defineProperty(this, "bundles", _defineProperty(_defineProperty(_defineProperty({}, MEMORY_KEY, 0), DISK_KEY, 0), NETWORK_KEY, 0));
10
+ _defineProperty(this, "bundlesCount", 0);
11
+ _defineProperty(this, "size", _defineProperty(_defineProperty(_defineProperty({}, MEMORY_KEY, 0), DISK_KEY, 0), NETWORK_KEY, 0));
12
+ _defineProperty(this, "sizeTotal", 0);
13
+ }
14
+ return _createClass(CHRSummary, [{
15
+ key: "add",
16
+ value: function add(asset) {
17
+ var size = 'size' in asset ? asset.size : undefined;
18
+ var encodedSize = 'encodedSize' in asset ? Number(asset.encodedSize) : 0;
19
+ var type = calculateTransferType(asset.type, asset.duration, size);
20
+ if (type === null) {
21
+ return;
22
+ }
23
+ this.bundles[type] += 1;
24
+ this.bundlesCount += 1;
25
+ this.size[type] += encodedSize;
26
+ this.sizeTotal += encodedSize;
27
+ }
28
+ }], [{
29
+ key: "makePayload",
30
+ value: function makePayload(summary) {
31
+ var size = summary.size,
32
+ bundlesCount = summary.bundlesCount,
33
+ sizeTotal = summary.sizeTotal;
34
+ var cachedSize = size[MEMORY_KEY] + size[DISK_KEY];
35
+ var sizeRatio = round(cachedSize / summary.sizeTotal);
36
+ return {
37
+ size: sizeTotal,
38
+ chr: sizeRatio,
39
+ count: bundlesCount
40
+ };
41
+ }
42
+ }]);
43
+ }();
44
+ export var CHRReporter = /*#__PURE__*/function () {
45
+ function CHRReporter() {
46
+ _classCallCheck(this, CHRReporter);
47
+ _defineProperty(this, "all", new CHRSummary());
48
+ _defineProperty(this, "allAtlassian", new CHRSummary());
49
+ _defineProperty(this, "preloaded", new CHRSummary());
50
+ }
51
+ return _createClass(CHRReporter, [{
52
+ key: "get",
53
+ value: function get(resourceTimings, assetsClassification) {
54
+ var _this = this;
55
+ try {
56
+ Object.entries(resourceTimings).map(function (_ref) {
57
+ var _ref2 = _slicedToArray(_ref, 2),
58
+ label = _ref2[0],
59
+ entry = _ref2[1];
60
+ if (assetsClassification.all) {
61
+ _this.all.add(entry);
62
+ }
63
+ if (assetsClassification.allAtlassian({
64
+ label: label,
65
+ entry: entry
66
+ })) {
67
+ _this.allAtlassian.add(entry);
68
+ }
69
+ if (assetsClassification.preloaded({
70
+ label: label,
71
+ entry: entry
72
+ })) {
73
+ _this.preloaded.add(entry);
74
+ }
75
+ });
76
+ if (this.all.bundlesCount === 0) {
77
+ return null;
78
+ }
79
+ return {
80
+ all: CHRSummary.makePayload(this.all),
81
+ allAtlassian: CHRSummary.makePayload(this.allAtlassian),
82
+ preloaded: CHRSummary.makePayload(this.preloaded)
83
+ };
84
+ } catch (error) {
85
+ return null;
86
+ }
87
+ }
88
+ }]);
89
+ }();
@@ -0,0 +1,26 @@
1
+ /* Borrowed from https://bitbucket.org/atlassian/atlassian-frontend/src/master/packages/performance/browser-metrics/src/plugins/timings/resource.ts */
2
+ export var cacheableTypes = ['script', 'link'];
3
+ export var MEMORY_KEY = 'mem';
4
+ export var DISK_KEY = 'disk';
5
+ export var NETWORK_KEY = 'net';
6
+ export var calculateTransferType = function calculateTransferType(type, duration, size) {
7
+ if (!cacheableTypes.includes(type)) {
8
+ return null;
9
+ }
10
+ if ((size === undefined || size === 0) && duration === 0) {
11
+ return MEMORY_KEY;
12
+ }
13
+ if (size === 0 && duration > 0) {
14
+ return DISK_KEY;
15
+ }
16
+ if (size === undefined) {
17
+ return null;
18
+ }
19
+ return NETWORK_KEY;
20
+ };
21
+ export var round = function round(n) {
22
+ if (isNaN(n)) {
23
+ return 0;
24
+ }
25
+ return Math.round(n * 10000) / 10000;
26
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -11,6 +11,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
11
11
  import Bowser from 'bowser-ultralight';
12
12
  import { fg } from '@atlaskit/platform-feature-flags';
13
13
  import { getLighthouseMetrics } from '../additional-payload';
14
+ import { CHRReporter } from '../assets';
14
15
  import * as bundleEvalTiming from '../bundle-eval-timing';
15
16
  import coinflip from '../coinflip';
16
17
  import { REACT_UFO_VERSION } from '../common/constants';
@@ -211,6 +212,16 @@ var getVCMetrics = function getVCMetrics(interaction) {
211
212
  if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
212
213
  return result;
213
214
  }
215
+ if (fg('ufo_vc_multiheatmap')) {
216
+ var _result;
217
+ (_result = result["".concat(prefix, ":vc:rev")]) === null || _result === void 0 || _result.forEach(function (element) {
218
+ var _element$vcDetails;
219
+ if ((_element$vcDetails = element.vcDetails) !== null && _element$vcDetails !== void 0 && (_element$vcDetails = _element$vcDetails['90']) !== null && _element$vcDetails !== void 0 && _element$vcDetails.t) {
220
+ var _element$vcDetails$;
221
+ element['metric:vc90'] = (_element$vcDetails$ = element.vcDetails['90']) === null || _element$vcDetails$ === void 0 ? void 0 : _element$vcDetails$.t;
222
+ }
223
+ });
224
+ }
214
225
  return _objectSpread(_objectSpread({}, result), {}, {
215
226
  'metric:vc90': VC['90']
216
227
  });
@@ -294,6 +305,31 @@ function getSSRProperties(type) {
294
305
  'ssr:featureFlags': getSSRFeatureFlags(type)
295
306
  };
296
307
  }
308
+ var getAssetsMetrics = function getAssetsMetrics(interaction, resourceTimings) {
309
+ try {
310
+ var config = getConfig();
311
+ var type = interaction.type;
312
+ var isCHREnabled = fg('ufo_chr_config');
313
+ var allowedTypes = ['page_load', 'transition'];
314
+ var assetsClassification = config === null || config === void 0 ? void 0 : config.assetsClassification;
315
+ if (!isCHREnabled || !allowedTypes.includes(type) || !assetsClassification) {
316
+ // Skip if: FG disabled, not allowed type or assetsClassification isn't configured
317
+ return {};
318
+ }
319
+ var reporter = new CHRReporter();
320
+ var assets = reporter.get(resourceTimings, assetsClassification);
321
+ if (assets) {
322
+ // Only add assets in case it exists
323
+ return {
324
+ 'event:assets': assets
325
+ };
326
+ }
327
+ return {};
328
+ } catch (error) {
329
+ // Skip CHR in case of error
330
+ return {};
331
+ }
332
+ };
297
333
  var getBrowserMetadata = function getBrowserMetadata() {
298
334
  var data = {};
299
335
  var now = new Date();
@@ -708,7 +744,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
708
744
  });
709
745
  };
710
746
  // Detailed payload. Page visibility = visible
711
- var getDetailedInteractionMetrics = function getDetailedInteractionMetrics() {
747
+ var getDetailedInteractionMetrics = function getDetailedInteractionMetrics(resourceTimings) {
712
748
  if (experimental || window.__UFO_COMPACT_PAYLOAD__ || !isDetailedPayload) {
713
749
  return {};
714
750
  }
@@ -729,7 +765,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
729
765
  requestInfo: optimizeRequestInfo(interaction.requestInfo, start),
730
766
  customTimings: optimizeCustomTimings(interaction.customTimings, start),
731
767
  bundleEvalTimings: objectToArray(getBundleEvalTimings(start)),
732
- resourceTimings: objectToArray(getResourceTimings(start, end))
768
+ resourceTimings: objectToArray(resourceTimings)
733
769
  };
734
770
  };
735
771
  // Page load & detailed payload
@@ -750,6 +786,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
750
786
  regularTTAI = getTTAI(interaction);
751
787
  }
752
788
  var newUFOName = sanitizeUfoName(ufoName);
789
+ var resourceTimings = getResourceTimings(start, end);
753
790
  var payload = {
754
791
  actionSubject: 'experience',
755
792
  action: 'measured',
@@ -757,7 +794,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
757
794
  source: 'measured',
758
795
  tags: ['observability'],
759
796
  attributes: {
760
- properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
797
+ properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
761
798
  // basic
762
799
  'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
763
800
  'event:product': config.product,
@@ -771,7 +808,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
771
808
  'event:region': config.region || 'unknown',
772
809
  'experience:key': experimental ? 'custom.experimental-interaction-metrics' : 'custom.interaction-metrics',
773
810
  'experience:name': newUFOName
774
- }, getBrowserMetadata()), getSSRProperties(type)), getPPSMetrics(interaction)), getPaintMetrics(type)), getNavigationMetrics(type)), getVCMetrics(interaction)), experimental ? getExperimentalVCMetrics(interaction) : undefined), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
811
+ }, getBrowserMetadata()), getSSRProperties(type)), getAssetsMetrics(interaction, resourceTimings)), getPPSMetrics(interaction)), getPaintMetrics(type)), getNavigationMetrics(type)), getVCMetrics(interaction)), experimental ? getExperimentalVCMetrics(interaction) : undefined), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
775
812
  interactionMetrics: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
776
813
  namePrefix: config.namePrefix || '',
777
814
  segmentPrefix: config.segmentPrefix || '',
@@ -803,7 +840,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
803
840
  marks: optimizeMarks(interaction.marks),
804
841
  customData: optimizeCustomData(interaction),
805
842
  reactProfilerTimings: optimizeReactProfilerTimings(interaction.reactProfilerTimings, start)
806
- }, labelStack), getPageLoadInteractionMetrics()), getDetailedInteractionMetrics()), getPageLoadDetailedInteractionMetrics()), getBm3TrackerTimings(interaction)), {}, {
843
+ }, labelStack), getPageLoadInteractionMetrics()), getDetailedInteractionMetrics(resourceTimings)), getPageLoadDetailedInteractionMetrics()), getBm3TrackerTimings(interaction)), {}, {
807
844
  'metric:ttai': experimental ? regularTTAI || expTTAI : undefined,
808
845
  'metric:experimental:ttai': expTTAI
809
846
  }),
@@ -31,4 +31,8 @@ export var getActiveTraceHttpRequestHeaders = function getActiveTraceHttpRequest
31
31
  traceId = _state$context.traceId,
32
32
  spanId = _state$context.spanId;
33
33
  return makeTraceHttpRequestHeaders(traceId, spanId);
34
+ };
35
+ export var getActiveTraceAsQueryParams = function getActiveTraceAsQueryParams(_url) {
36
+ var traceHeaders = getActiveTraceHttpRequestHeaders(_url);
37
+ return traceHeaders ? new URLSearchParams(traceHeaders).toString().toLowerCase() : null;
34
38
  };
@@ -5,6 +5,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
5
5
  import React, { lazy, Profiler, Suspense, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
6
6
  import { unstable_NormalPriority as NormalPriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
7
7
  import { v4 as createUUID } from 'uuid';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
8
9
  import coinflip from '../coinflip';
9
10
  import { getConfig, getInteractionRate } from '../config';
10
11
  import { getActiveTrace, setInteractionActiveTrace } from '../experience-trace-id-context';
@@ -42,7 +43,9 @@ export default function UFOSegment(_ref) {
42
43
  }, [parentContext, segmentName, segmentId]);
43
44
  var interactionId = useContext(UFOInteractionIDContext);
44
45
  var interactionContext = useMemo(function () {
45
- addSegment(labelStack);
46
+ if (!fg('platform-ufo-add-segment-use-effect')) {
47
+ addSegment(labelStack);
48
+ }
46
49
  var lastCompleteEndTime = 0;
47
50
  function complete() {
48
51
  var endTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
@@ -221,6 +224,9 @@ export default function UFOSegment(_ref) {
221
224
  }
222
225
  }, [interactionContext]);
223
226
  useEffect(function () {
227
+ if (fg('platform-ufo-add-segment-use-effect')) {
228
+ addSegment(labelStack);
229
+ }
224
230
  return function () {
225
231
  removeSegment(labelStack);
226
232
  };
@@ -0,0 +1,257 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _objectDestructuringEmpty from "@babel/runtime/helpers/objectDestructuringEmpty";
3
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
+ import _createClass from "@babel/runtime/helpers/createClass";
5
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
6
+ var UNUSED_SECTOR = 0;
7
+ export var MultiRevisionHeatmap = /*#__PURE__*/function () {
8
+ function MultiRevisionHeatmap(_ref) {
9
+ var _this = this;
10
+ var viewport = _ref.viewport,
11
+ revisions = _ref.revisions,
12
+ arraySize = _ref.arraySize,
13
+ devToolsEnabled = _ref.devToolsEnabled;
14
+ _classCallCheck(this, MultiRevisionHeatmap);
15
+ _defineProperty(this, "arraySize", {
16
+ w: 200,
17
+ h: 200
18
+ });
19
+ _defineProperty(this, "mapPixelsToHeatmap", function (left, top, width, height) {
20
+ var _this$viewport = _this.viewport,
21
+ w = _this$viewport.w,
22
+ h = _this$viewport.h;
23
+ var l = Math.floor(left / w * _this.arraySize.w);
24
+ var t = Math.floor(top / h * _this.arraySize.h);
25
+ var r = Math.ceil((left + width) / w * _this.arraySize.w);
26
+ var b = Math.ceil((top + height) / h * _this.arraySize.h);
27
+
28
+ // correct values to min - 0, max - arraySize
29
+ var result = {
30
+ l: Math.max(0, l),
31
+ t: Math.max(0, t),
32
+ r: Math.min(_this.arraySize.w, r),
33
+ b: Math.min(_this.arraySize.h, b)
34
+ };
35
+ return result;
36
+ });
37
+ _defineProperty(this, "getElementRatio", function (mappedValues) {
38
+ var r = mappedValues.r,
39
+ l = mappedValues.l,
40
+ b = mappedValues.b,
41
+ t = mappedValues.t;
42
+ return (r - l) * (b - t) / (_this.arraySize.w * _this.arraySize.h);
43
+ });
44
+ this.viewport = viewport;
45
+ this.revisions = revisions;
46
+ if (arraySize) {
47
+ this.arraySize = arraySize;
48
+ }
49
+ this.heatmaps = new Array(revisions.length);
50
+ this.componentsLogs = new Array(revisions.length);
51
+ this.vcRatios = new Array(revisions.length);
52
+ this.devToolsEnabled = devToolsEnabled || false;
53
+ revisions.forEach(function (_ref2, i) {
54
+ _objectDestructuringEmpty(_ref2);
55
+ _this.heatmaps[i] = _this.getCleanHeatmap();
56
+ _this.componentsLogs[i] = {};
57
+ _this.vcRatios[i] = {};
58
+ });
59
+ }
60
+ return _createClass(MultiRevisionHeatmap, [{
61
+ key: "handleUpdate",
62
+ value: function handleUpdate(_ref3) {
63
+ var _this2 = this;
64
+ var time = _ref3.time,
65
+ type = _ref3.type,
66
+ classification = _ref3.classification,
67
+ intersectionRect = _ref3.intersectionRect,
68
+ element = _ref3.element,
69
+ targetName = _ref3.targetName,
70
+ ignoreReason = _ref3.ignoreReason,
71
+ onError = _ref3.onError;
72
+ var mappedValues = this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
73
+ var result = this.applyChangesToHeatMap(mappedValues, time, classification);
74
+ if (result !== true) {
75
+ onError(result);
76
+ }
77
+ var componentRatio = this.getElementRatio(mappedValues);
78
+ this.revisions.forEach(function (_, i) {
79
+ if (classification[i]) {
80
+ _this2.vcRatios[i][targetName] = componentRatio;
81
+ }
82
+ if (!_this2.componentsLogs[i][time]) {
83
+ _this2.componentsLogs[i][time] = [];
84
+ }
85
+ _this2.componentsLogs[i][time].push({
86
+ __debug__element: _this2.devToolsEnabled ? new WeakRef(element) : null,
87
+ intersectionRect: intersectionRect,
88
+ targetName: targetName,
89
+ ignoreReason: ignoreReason
90
+ });
91
+ });
92
+ }
93
+ }, {
94
+ key: "getData",
95
+ value: function getData() {
96
+ return {
97
+ heatmaps: this.heatmaps
98
+ };
99
+ }
100
+ }, {
101
+ key: "getPayloadShapedData",
102
+ value: function getPayloadShapedData(args) {
103
+ var result = this.processData(args);
104
+ var payload = this.revisions.map(function (rev, i) {
105
+ var vcDetails = {};
106
+ args.VCParts.forEach(function (VCPart) {
107
+ vcDetails[VCPart] = {
108
+ t: result[i].VC[VCPart] || 0,
109
+ e: Array.from(result[i].VCBox[VCPart] || [])
110
+ };
111
+ });
112
+ return {
113
+ revision: rev.name,
114
+ vcDetails: vcDetails,
115
+ clean: args.clean,
116
+ 'metric:vc90': null // will be set or not in the payload generator
117
+ };
118
+ });
119
+ return payload;
120
+ }
121
+ }, {
122
+ key: "processData",
123
+ value: function processData(_ref4) {
124
+ var _this3 = this;
125
+ var VCParts = _ref4.VCParts,
126
+ VCCalculationMethods = _ref4.VCCalculationMethods,
127
+ _ref4$ssr = _ref4.ssr,
128
+ ssr = _ref4$ssr === void 0 ? UNUSED_SECTOR : _ref4$ssr;
129
+ return this.heatmaps.map(function (heatmap, i) {
130
+ var lastUpdate = {};
131
+ var totalPainted = 0;
132
+ var componentsLog = _this3.componentsLogs[i];
133
+ if (ssr !== UNUSED_SECTOR) {
134
+ var _window$document;
135
+ var element = {
136
+ __debug__element: new WeakRef((_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.body),
137
+ intersectionRect: {
138
+ top: 0,
139
+ left: 0,
140
+ right: 0,
141
+ bottom: 0,
142
+ x: 0,
143
+ y: 0,
144
+ width: _this3.viewport.w,
145
+ height: _this3.viewport.h,
146
+ toJSON: function toJSON() {
147
+ return {};
148
+ }
149
+ },
150
+ targetName: 'SSR'
151
+ };
152
+ if (!componentsLog[ssr]) {
153
+ componentsLog[ssr] = [];
154
+ }
155
+ componentsLog[ssr].push(element);
156
+ }
157
+ for (var _i = 0; _i < heatmap.length; _i++) {
158
+ var rounded = Math.floor(heatmap[_i] === UNUSED_SECTOR && ssr !== UNUSED_SECTOR ? ssr : heatmap[_i]);
159
+ totalPainted += rounded !== UNUSED_SECTOR ? 1 : 0;
160
+ if (rounded !== UNUSED_SECTOR) {
161
+ lastUpdate[rounded] = lastUpdate[rounded] ? lastUpdate[rounded] + 1 : 1;
162
+ }
163
+ }
164
+ var entries = Object.entries(lastUpdate).map(function (a) {
165
+ return [parseInt(a[0], 10), a[1]];
166
+ }).sort(function (a, b) {
167
+ return a[0] > b[0] ? 1 : -1;
168
+ });
169
+ var _VCCalculationMethods = VCCalculationMethods[i]({
170
+ VCParts: VCParts,
171
+ componentsLog: componentsLog,
172
+ entries: entries,
173
+ totalPainted: totalPainted
174
+ }),
175
+ VC = _VCCalculationMethods.VC,
176
+ VCBox = _VCCalculationMethods.VCBox;
177
+ var VCEntries = entries.reduce(function (acc, _ref5, i) {
178
+ var _acc$abs, _componentsLog$timest;
179
+ var _ref6 = _slicedToArray(_ref5, 2),
180
+ timestamp = _ref6[0],
181
+ entryPainted = _ref6[1];
182
+ var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
183
+ var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
184
+ var logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(function (v) {
185
+ return v.targetName;
186
+ });
187
+ acc.abs.push([timestamp, currentlyPainted]);
188
+ acc.rel.push({
189
+ time: timestamp,
190
+ vc: currentlyPaintedRatio,
191
+ elements: logEntry
192
+ });
193
+ return acc;
194
+ }, {
195
+ abs: [],
196
+ rel: []
197
+ });
198
+ return {
199
+ VC: VC,
200
+ VCBox: VCBox,
201
+ VCEntries: VCEntries,
202
+ totalPainted: totalPainted
203
+ };
204
+ });
205
+ }
206
+ }, {
207
+ key: "applyChangesToHeatMap",
208
+ value: function applyChangesToHeatMap(a, time, classification) {
209
+ var l = a.l,
210
+ t = a.t,
211
+ r = a.r,
212
+ b = a.b;
213
+ var size = classification.length;
214
+ for (var row = t; row < b; row++) {
215
+ if (this.heatmaps[0][row] === undefined) {
216
+ try {
217
+ return {
218
+ error: "index - ".concat(row),
219
+ time: time
220
+ };
221
+ } catch (e) {
222
+ return {
223
+ error: 'row error',
224
+ time: time
225
+ };
226
+ }
227
+ } else {
228
+ for (var heatmapIndex = 0; heatmapIndex < size; heatmapIndex++) {
229
+ if (classification[heatmapIndex]) {
230
+ this.heatmaps[heatmapIndex].fill(time, this.getIndex(l, row), this.getIndex(r, row));
231
+ }
232
+ }
233
+ }
234
+ }
235
+ return true;
236
+ }
237
+ }, {
238
+ key: "getIndex",
239
+ value: function getIndex(x, y) {
240
+ return x + this.arraySize.w * y;
241
+ }
242
+ }, {
243
+ key: "getCleanHeatmap",
244
+ value: function getCleanHeatmap() {
245
+ return new Uint32Array(this.arraySize.w * this.arraySize.h);
246
+ }
247
+ }], [{
248
+ key: "makeVCReturnObj",
249
+ value: function makeVCReturnObj(VCParts) {
250
+ var vc = {};
251
+ VCParts.forEach(function (v) {
252
+ vc[v] = null;
253
+ });
254
+ return vc;
255
+ }
256
+ }]);
257
+ }();