@atlaskit/react-ufo 3.12.4 → 3.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +2 -1
- package/dist/cjs/create-payload/utils/get-vc-metrics.js +2 -1
- package/dist/cjs/vc/index.js +4 -2
- package/dist/cjs/vc/vc-observer/getVCRevisionDebugDetails.js +41 -0
- package/dist/cjs/vc/vc-observer/index.js +59 -33
- package/dist/cjs/vc/vc-observer-new/index.js +13 -7
- package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
- package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -4
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +108 -0
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +16 -57
- package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +15 -5
- package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
- package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -1
- package/dist/es2019/create-payload/utils/get-vc-metrics.js +1 -0
- package/dist/es2019/vc/index.js +4 -2
- package/dist/es2019/vc/vc-observer/getVCRevisionDebugDetails.js +32 -0
- package/dist/es2019/vc/vc-observer/index.js +30 -1
- package/dist/es2019/vc/vc-observer-new/index.js +12 -6
- package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +115 -17
- package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +44 -1
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +75 -0
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -20
- package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +15 -5
- package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
- package/dist/esm/create-experimental-interaction-metrics-payload/index.js +2 -1
- package/dist/esm/create-payload/utils/get-vc-metrics.js +2 -1
- package/dist/esm/vc/index.js +4 -2
- package/dist/esm/vc/vc-observer/getVCRevisionDebugDetails.js +35 -0
- package/dist/esm/vc/vc-observer/index.js +59 -33
- package/dist/esm/vc/vc-observer-new/index.js +13 -7
- package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +211 -36
- package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +4 -4
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +94 -5
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.js +106 -0
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +2 -55
- package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +15 -5
- package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +3 -1
- package/dist/types/vc/types.d.ts +1 -0
- package/dist/types/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
- package/dist/types/vc/vc-observer/index.d.ts +1 -1
- package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
- package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
- package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
- package/dist/types/vc/vc-observer-new/types.d.ts +5 -1
- package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
- package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
- package/dist/types-ts4.5/vc/types.d.ts +1 -0
- package/dist/types-ts4.5/vc/vc-observer/getVCRevisionDebugDetails.d.ts +30 -0
- package/dist/types-ts4.5/vc/vc-observer/index.d.ts +1 -1
- package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +5 -1
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/test-with-debug-info.d.ts +1 -0
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +2 -4
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +20 -2
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +5 -1
- package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +2 -0
- package/package.json +4 -1
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -367
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -398
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -5
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -152
- package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -108
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -248
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -263
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -99
- package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -60
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +0 -361
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +0 -391
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +0 -1
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +0 -145
- package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +0 -101
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
- package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +0 -39
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +0 -10
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +0 -43
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +0 -12
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +0 -25
package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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
|
|
3
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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; }
|
|
@@ -123,7 +123,9 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
|
|
|
123
123
|
(0, _defineProperty2.default)(this, "handleAttributeMutation", function (_ref5) {
|
|
124
124
|
var _this$intersectionObs4;
|
|
125
125
|
var target = _ref5.target,
|
|
126
|
-
attributeName = _ref5.attributeName
|
|
126
|
+
attributeName = _ref5.attributeName,
|
|
127
|
+
oldValue = _ref5.oldValue,
|
|
128
|
+
newValue = _ref5.newValue;
|
|
127
129
|
(_this$intersectionObs4 = _this.intersectionObserver) === null || _this$intersectionObs4 === void 0 || _this$intersectionObs4.watchAndTag(target, function (_ref6) {
|
|
128
130
|
var target = _ref6.target,
|
|
129
131
|
rect = _ref6.rect;
|
|
@@ -131,7 +133,9 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
|
|
|
131
133
|
return {
|
|
132
134
|
type: 'mutation:media',
|
|
133
135
|
mutationData: {
|
|
134
|
-
attributeName: attributeName
|
|
136
|
+
attributeName: attributeName,
|
|
137
|
+
oldValue: oldValue,
|
|
138
|
+
newValue: newValue
|
|
135
139
|
}
|
|
136
140
|
};
|
|
137
141
|
}
|
|
@@ -143,7 +147,9 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
|
|
|
143
147
|
return {
|
|
144
148
|
type: 'mutation:attribute:non-visual-style',
|
|
145
149
|
mutationData: {
|
|
146
|
-
attributeName: attributeName
|
|
150
|
+
attributeName: attributeName,
|
|
151
|
+
oldValue: oldValue,
|
|
152
|
+
newValue: newValue
|
|
147
153
|
}
|
|
148
154
|
};
|
|
149
155
|
}
|
|
@@ -152,14 +158,18 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
|
|
|
152
158
|
return {
|
|
153
159
|
type: 'mutation:attribute:no-layout-shift',
|
|
154
160
|
mutationData: {
|
|
155
|
-
attributeName: attributeName
|
|
161
|
+
attributeName: attributeName,
|
|
162
|
+
oldValue: oldValue,
|
|
163
|
+
newValue: newValue
|
|
156
164
|
}
|
|
157
165
|
};
|
|
158
166
|
}
|
|
159
167
|
return {
|
|
160
168
|
type: 'mutation:attribute',
|
|
161
169
|
mutationData: {
|
|
162
|
-
attributeName: attributeName
|
|
170
|
+
attributeName: attributeName,
|
|
171
|
+
oldValue: oldValue,
|
|
172
|
+
newValue: newValue
|
|
163
173
|
}
|
|
164
174
|
};
|
|
165
175
|
});
|
|
@@ -42,7 +42,9 @@ function createMutationObserver(_ref) {
|
|
|
42
42
|
var _mut$attributeName;
|
|
43
43
|
onAttributeMutation({
|
|
44
44
|
target: mut.target,
|
|
45
|
-
attributeName: (_mut$attributeName = mut.attributeName) !== null && _mut$attributeName !== void 0 ? _mut$attributeName : 'unknown'
|
|
45
|
+
attributeName: (_mut$attributeName = mut.attributeName) !== null && _mut$attributeName !== void 0 ? _mut$attributeName : 'unknown',
|
|
46
|
+
oldValue: oldValue,
|
|
47
|
+
newValue: newValue
|
|
46
48
|
});
|
|
47
49
|
}
|
|
48
50
|
continue;
|
|
@@ -68,7 +68,8 @@ export async function getExperimentalVCMetrics(interaction) {
|
|
|
68
68
|
isEventAborted: !!interaction.abortReason,
|
|
69
69
|
prefix,
|
|
70
70
|
vc: interaction.vc,
|
|
71
|
-
experienceKey: interaction.ufoName
|
|
71
|
+
experienceKey: interaction.ufoName,
|
|
72
|
+
interactionId: interaction.id
|
|
72
73
|
});
|
|
73
74
|
const VC = result === null || result === void 0 ? void 0 : result['metrics:vc'];
|
|
74
75
|
if (!VC || !(result !== null && result !== void 0 && result[`${prefix}:vc:clean`])) {
|
|
@@ -36,6 +36,7 @@ async function getVCMetrics(interaction) {
|
|
|
36
36
|
vc: interaction.vc,
|
|
37
37
|
isEventAborted: interactionStatus.originalInteractionStatus !== 'SUCCEEDED',
|
|
38
38
|
experienceKey: interaction.ufoName,
|
|
39
|
+
interactionId: interaction.id,
|
|
39
40
|
...ssr
|
|
40
41
|
});
|
|
41
42
|
if ((_config$experimentalI = config.experimentalInteractionMetrics) !== null && _config$experimentalI !== void 0 && _config$experimentalI.enabled) {
|
package/dist/es2019/vc/index.js
CHANGED
|
@@ -82,7 +82,8 @@ export class VCObserverWrapper {
|
|
|
82
82
|
const v1v2Result = isVCRevisionEnabled('fy25.01', experienceKey) || isVCRevisionEnabled('fy25.02', experienceKey) ? await ((_this$oldVCObserver6 = this.oldVCObserver) === null || _this$oldVCObserver6 === void 0 ? void 0 : _this$oldVCObserver6.getVCResult(param)) : {};
|
|
83
83
|
const v3Result = isVCRevisionEnabled('fy25.03', experienceKey) ? await ((_this$newVCObserver5 = this.newVCObserver) === null || _this$newVCObserver5 === void 0 ? void 0 : _this$newVCObserver5.getVCResult({
|
|
84
84
|
start: param.start,
|
|
85
|
-
stop: param.stop
|
|
85
|
+
stop: param.stop,
|
|
86
|
+
interactionId: param.interactionId
|
|
86
87
|
})) : [];
|
|
87
88
|
if (!v3Result) {
|
|
88
89
|
return v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {};
|
|
@@ -96,7 +97,8 @@ export class VCObserverWrapper {
|
|
|
96
97
|
const oldResult = await ((_this$oldVCObserver7 = this.oldVCObserver) === null || _this$oldVCObserver7 === void 0 ? void 0 : _this$oldVCObserver7.getVCResult(param));
|
|
97
98
|
const newResult = await ((_this$newVCObserver6 = this.newVCObserver) === null || _this$newVCObserver6 === void 0 ? void 0 : _this$newVCObserver6.getVCResult({
|
|
98
99
|
start: param.start,
|
|
99
|
-
stop: param.stop
|
|
100
|
+
stop: param.stop,
|
|
101
|
+
interactionId: param.interactionId
|
|
100
102
|
}));
|
|
101
103
|
if (oldResult && !newResult) {
|
|
102
104
|
return oldResult;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function getVCRevisionDebugDetails({
|
|
2
|
+
revision,
|
|
3
|
+
isClean,
|
|
4
|
+
abortReason,
|
|
5
|
+
VCEntries,
|
|
6
|
+
componentsLog,
|
|
7
|
+
interactionId
|
|
8
|
+
}) {
|
|
9
|
+
return {
|
|
10
|
+
revision,
|
|
11
|
+
isClean,
|
|
12
|
+
abortReason,
|
|
13
|
+
vcLogs: VCEntries.map(entry => ({
|
|
14
|
+
time: entry.time,
|
|
15
|
+
viewportPercentage: entry.vc,
|
|
16
|
+
entries: entry.elements.map(element => {
|
|
17
|
+
var _componentsLog$entry$;
|
|
18
|
+
const logEntry = (_componentsLog$entry$ = componentsLog[entry.time]) === null || _componentsLog$entry$ === void 0 ? void 0 : _componentsLog$entry$.find(log => log.targetName === element);
|
|
19
|
+
return {
|
|
20
|
+
elementName: element,
|
|
21
|
+
type: logEntry === null || logEntry === void 0 ? void 0 : logEntry.type,
|
|
22
|
+
rect: logEntry === null || logEntry === void 0 ? void 0 : logEntry.intersectionRect,
|
|
23
|
+
visible: true,
|
|
24
|
+
attributeName: logEntry === null || logEntry === void 0 ? void 0 : logEntry.attributeName,
|
|
25
|
+
oldValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.oldValue,
|
|
26
|
+
newValue: logEntry === null || logEntry === void 0 ? void 0 : logEntry.newValue
|
|
27
|
+
};
|
|
28
|
+
})
|
|
29
|
+
})),
|
|
30
|
+
interactionId
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -3,6 +3,7 @@ import { fg } from '@atlaskit/platform-feature-flags';
|
|
|
3
3
|
import { isVCRevisionEnabled } from '../../config';
|
|
4
4
|
import { getActiveInteraction } from '../../interaction-metrics';
|
|
5
5
|
import { attachAbortListeners } from './attachAbortListeners';
|
|
6
|
+
import { getVCRevisionDebugDetails } from './getVCRevisionDebugDetails';
|
|
6
7
|
import { getVCRevisionsData } from './getVCRevisionsData';
|
|
7
8
|
import { getViewportHeight, getViewportWidth } from './getViewport';
|
|
8
9
|
import { MultiRevisionHeatmap } from './heatmap/heatmap';
|
|
@@ -96,7 +97,8 @@ export class VCObserver {
|
|
|
96
97
|
ssr,
|
|
97
98
|
vc,
|
|
98
99
|
isEventAborted,
|
|
99
|
-
experienceKey
|
|
100
|
+
experienceKey,
|
|
101
|
+
interactionId
|
|
100
102
|
}) => {
|
|
101
103
|
const startTime = performance.now();
|
|
102
104
|
// add local measurement
|
|
@@ -298,6 +300,33 @@ export class VCObserver {
|
|
|
298
300
|
entries: isTTVCv1Disabled ? vcNext.VCEntries.rel : VCEntries.rel
|
|
299
301
|
}
|
|
300
302
|
}));
|
|
303
|
+
|
|
304
|
+
// Add devtool callback for both v1 and v2
|
|
305
|
+
if (typeof window.__ufo_devtool_onVCRevisionReady__ === 'function' && fg('platform_ufo_ttvc_v3_devtool')) {
|
|
306
|
+
var _ufo_devtool_onVCRev2, _ref2;
|
|
307
|
+
// Handle v1 if not disabled
|
|
308
|
+
if (!isTTVCv1Disabled) {
|
|
309
|
+
var _ufo_devtool_onVCRev, _ref;
|
|
310
|
+
(_ufo_devtool_onVCRev = (_ref = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev === void 0 ? void 0 : _ufo_devtool_onVCRev.call(_ref, getVCRevisionDebugDetails({
|
|
311
|
+
revision: 'fy25.01',
|
|
312
|
+
isClean: !abortReasonInfo,
|
|
313
|
+
abortReason: abortReason.reason,
|
|
314
|
+
VCEntries: VCEntries.rel,
|
|
315
|
+
componentsLog,
|
|
316
|
+
interactionId
|
|
317
|
+
}));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Handle v2
|
|
321
|
+
(_ufo_devtool_onVCRev2 = (_ref2 = window).__ufo_devtool_onVCRevisionReady__) === null || _ufo_devtool_onVCRev2 === void 0 ? void 0 : _ufo_devtool_onVCRev2.call(_ref2, getVCRevisionDebugDetails({
|
|
322
|
+
revision: 'fy25.02',
|
|
323
|
+
isClean: !abortReasonInfo,
|
|
324
|
+
abortReason: abortReason.reason,
|
|
325
|
+
VCEntries: vcNext.VCEntries.rel,
|
|
326
|
+
componentsLog,
|
|
327
|
+
interactionId
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
301
330
|
}
|
|
302
331
|
} catch (e) {
|
|
303
332
|
/* do nothing */
|
|
@@ -13,10 +13,11 @@ const DEFAULT_SELECTOR_CONFIG = {
|
|
|
13
13
|
};
|
|
14
14
|
export default class VCObserverNew {
|
|
15
15
|
constructor(config) {
|
|
16
|
-
var _config$selectorConfi;
|
|
16
|
+
var _config$isPostInterac, _config$selectorConfi;
|
|
17
17
|
_defineProperty(this, "viewportObserver", null);
|
|
18
18
|
_defineProperty(this, "windowEventObserver", null);
|
|
19
19
|
this.entriesTimeline = new EntriesTimeline();
|
|
20
|
+
this.isPostInteraction = (_config$isPostInterac = config.isPostInteraction) !== null && _config$isPostInterac !== void 0 ? _config$isPostInterac : false;
|
|
20
21
|
this.selectorConfig = (_config$selectorConfi = config.selectorConfig) !== null && _config$selectorConfi !== void 0 ? _config$selectorConfi : DEFAULT_SELECTOR_CONFIG;
|
|
21
22
|
this.viewportObserver = new ViewportObserver({
|
|
22
23
|
onChange: onChangeArg => {
|
|
@@ -36,13 +37,15 @@ export default class VCObserverNew {
|
|
|
36
37
|
}
|
|
37
38
|
this.entriesTimeline.push({
|
|
38
39
|
time,
|
|
39
|
-
type,
|
|
40
40
|
data: {
|
|
41
|
+
type,
|
|
41
42
|
elementName,
|
|
42
43
|
rect,
|
|
43
44
|
previousRect,
|
|
44
45
|
visible,
|
|
45
|
-
attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName
|
|
46
|
+
attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName,
|
|
47
|
+
oldValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.oldValue,
|
|
48
|
+
newValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.newValue
|
|
46
49
|
}
|
|
47
50
|
});
|
|
48
51
|
}
|
|
@@ -54,8 +57,8 @@ export default class VCObserverNew {
|
|
|
54
57
|
}) => {
|
|
55
58
|
this.entriesTimeline.push({
|
|
56
59
|
time,
|
|
57
|
-
type: 'window:event',
|
|
58
60
|
data: {
|
|
61
|
+
type: 'window:event',
|
|
59
62
|
eventType: type
|
|
60
63
|
}
|
|
61
64
|
});
|
|
@@ -78,7 +81,8 @@ export default class VCObserverNew {
|
|
|
78
81
|
async getVCResult(param) {
|
|
79
82
|
const {
|
|
80
83
|
start,
|
|
81
|
-
stop
|
|
84
|
+
stop,
|
|
85
|
+
interactionId
|
|
82
86
|
} = param;
|
|
83
87
|
const results = [];
|
|
84
88
|
const calculator_fy25_03 = new VCCalculator_FY25_03();
|
|
@@ -89,7 +93,9 @@ export default class VCObserverNew {
|
|
|
89
93
|
const fy25_03 = await calculator_fy25_03.calculate({
|
|
90
94
|
orderedEntries,
|
|
91
95
|
startTime: start,
|
|
92
|
-
stopTime: stop
|
|
96
|
+
stopTime: stop,
|
|
97
|
+
interactionId,
|
|
98
|
+
isPostInteraction: this.isPostInteraction
|
|
93
99
|
});
|
|
94
100
|
if (fy25_03) {
|
|
95
101
|
results.push(fy25_03);
|