@atlaskit/react-ufo 3.14.3 → 3.14.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.
Files changed (114) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/create-payload/critical-metrics-payload/index.js +38 -0
  3. package/dist/cjs/create-payload/critical-metrics-payload/root-metrics.js +180 -0
  4. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +251 -0
  5. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +9 -0
  6. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +15 -0
  7. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +59 -0
  8. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +17 -0
  9. package/dist/cjs/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +11 -0
  10. package/dist/cjs/create-payload/critical-metrics-payload/types.js +5 -0
  11. package/dist/cjs/create-payload/index.js +122 -214
  12. package/dist/cjs/create-payload/utils/find-matching-legacy-metric.js +15 -0
  13. package/dist/cjs/create-payload/utils/get-browser-metadata.js +87 -0
  14. package/dist/cjs/create-payload/utils/get-fmp.js +52 -0
  15. package/dist/cjs/create-payload/utils/get-navigation-metrics.js +66 -0
  16. package/dist/cjs/create-payload/utils/get-paint-metrics.js +124 -0
  17. package/dist/cjs/create-payload/utils/get-payload-size.js +17 -0
  18. package/dist/cjs/create-payload/utils/get-react-ufo-payload-version.js +3 -1
  19. package/dist/cjs/create-payload/utils/get-ssr-success.js +15 -0
  20. package/dist/cjs/create-payload/utils/get-ttai.js +14 -0
  21. package/dist/cjs/create-payload/utils/get-tti.js +38 -0
  22. package/dist/cjs/interaction-metrics/index.js +25 -0
  23. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -0
  24. package/dist/es2019/create-payload/critical-metrics-payload/index.js +6 -0
  25. package/dist/es2019/create-payload/critical-metrics-payload/root-metrics.js +166 -0
  26. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +155 -0
  27. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  28. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  29. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +40 -0
  30. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  31. package/dist/es2019/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  32. package/dist/es2019/create-payload/critical-metrics-payload/types.js +1 -0
  33. package/dist/es2019/create-payload/index.js +55 -151
  34. package/dist/es2019/create-payload/utils/find-matching-legacy-metric.js +7 -0
  35. package/dist/es2019/create-payload/utils/get-browser-metadata.js +79 -0
  36. package/dist/es2019/create-payload/utils/get-fmp.js +47 -0
  37. package/dist/es2019/create-payload/utils/get-navigation-metrics.js +59 -0
  38. package/dist/es2019/create-payload/utils/get-paint-metrics.js +78 -0
  39. package/dist/es2019/create-payload/utils/get-payload-size.js +11 -0
  40. package/dist/es2019/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  41. package/dist/es2019/create-payload/utils/get-ssr-success.js +7 -0
  42. package/dist/es2019/create-payload/utils/get-ttai.js +9 -0
  43. package/dist/es2019/create-payload/utils/get-tti.js +35 -0
  44. package/dist/es2019/interaction-metrics/index.js +24 -0
  45. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -0
  46. package/dist/esm/create-payload/critical-metrics-payload/index.js +31 -0
  47. package/dist/esm/create-payload/critical-metrics-payload/root-metrics.js +174 -0
  48. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.js +244 -0
  49. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.js +3 -0
  50. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.js +9 -0
  51. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.js +52 -0
  52. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.js +10 -0
  53. package/dist/esm/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.js +5 -0
  54. package/dist/esm/create-payload/critical-metrics-payload/types.js +1 -0
  55. package/dist/esm/create-payload/index.js +121 -210
  56. package/dist/esm/create-payload/utils/find-matching-legacy-metric.js +9 -0
  57. package/dist/esm/create-payload/utils/get-browser-metadata.js +79 -0
  58. package/dist/esm/create-payload/utils/get-fmp.js +47 -0
  59. package/dist/esm/create-payload/utils/get-navigation-metrics.js +59 -0
  60. package/dist/esm/create-payload/utils/get-paint-metrics.js +119 -0
  61. package/dist/esm/create-payload/utils/get-payload-size.js +11 -0
  62. package/dist/esm/create-payload/utils/get-react-ufo-payload-version.js +2 -1
  63. package/dist/esm/create-payload/utils/get-ssr-success.js +7 -0
  64. package/dist/esm/create-payload/utils/get-ttai.js +7 -0
  65. package/dist/esm/create-payload/utils/get-tti.js +33 -0
  66. package/dist/esm/interaction-metrics/index.js +24 -0
  67. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +3 -0
  68. package/dist/types/common/common/types.d.ts +1 -1
  69. package/dist/types/common/react-ufo-payload-schema.d.ts +23 -2
  70. package/dist/types/create-payload/critical-metrics-payload/index.d.ts +6 -0
  71. package/dist/types/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  72. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  73. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  74. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  75. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  76. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  77. package/dist/types/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  78. package/dist/types/create-payload/critical-metrics-payload/types.d.ts +128 -0
  79. package/dist/types/create-payload/index.d.ts +339 -834
  80. package/dist/types/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  81. package/dist/types/create-payload/utils/get-browser-metadata.d.ts +21 -0
  82. package/dist/types/create-payload/utils/get-fmp.d.ts +6 -0
  83. package/dist/types/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  84. package/dist/types/create-payload/utils/get-paint-metrics.d.ts +13 -0
  85. package/dist/types/create-payload/utils/get-payload-size.d.ts +1 -0
  86. package/dist/types/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  87. package/dist/types/create-payload/utils/get-ssr-success.d.ts +2 -0
  88. package/dist/types/create-payload/utils/get-ttai.d.ts +2 -0
  89. package/dist/types/create-payload/utils/get-tti.d.ts +7 -0
  90. package/dist/types/interaction-metrics/index.d.ts +1 -0
  91. package/dist/types-ts4.5/common/common/types.d.ts +1 -1
  92. package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +23 -2
  93. package/dist/types-ts4.5/create-payload/critical-metrics-payload/index.d.ts +6 -0
  94. package/dist/types-ts4.5/create-payload/critical-metrics-payload/root-metrics.d.ts +7 -0
  95. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/create-segment-metrics.d.ts +3 -0
  96. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-is-root-segment.d.ts +2 -0
  97. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-id.d.ts +2 -0
  98. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/get-segment-status.d.ts +7 -0
  99. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/has-segment-failed.d.ts +2 -0
  100. package/dist/types-ts4.5/create-payload/critical-metrics-payload/segment-metrics/is-label-stack-under-segment.d.ts +2 -0
  101. package/dist/types-ts4.5/create-payload/critical-metrics-payload/types.d.ts +130 -0
  102. package/dist/types-ts4.5/create-payload/index.d.ts +339 -834
  103. package/dist/types-ts4.5/create-payload/utils/find-matching-legacy-metric.d.ts +5 -0
  104. package/dist/types-ts4.5/create-payload/utils/get-browser-metadata.d.ts +21 -0
  105. package/dist/types-ts4.5/create-payload/utils/get-fmp.d.ts +6 -0
  106. package/dist/types-ts4.5/create-payload/utils/get-navigation-metrics.d.ts +29 -0
  107. package/dist/types-ts4.5/create-payload/utils/get-paint-metrics.d.ts +13 -0
  108. package/dist/types-ts4.5/create-payload/utils/get-payload-size.d.ts +1 -0
  109. package/dist/types-ts4.5/create-payload/utils/get-react-ufo-payload-version.d.ts +2 -1
  110. package/dist/types-ts4.5/create-payload/utils/get-ssr-success.d.ts +2 -0
  111. package/dist/types-ts4.5/create-payload/utils/get-ttai.d.ts +2 -0
  112. package/dist/types-ts4.5/create-payload/utils/get-tti.d.ts +7 -0
  113. package/dist/types-ts4.5/interaction-metrics/index.d.ts +1 -0
  114. package/package.json +8 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 3.14.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#179205](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/179205)
8
+ [`69957bbb117c8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/69957bbb117c8) -
9
+ Enable media as part of TTVC v3 calculation
10
+
11
+ ## 3.14.4
12
+
13
+ ### Patch Changes
14
+
15
+ - [#175348](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/175348)
16
+ [`1efcee7c6bc60`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1efcee7c6bc60) -
17
+ AFO-4012 react ufo to produce ciritical metrics payload
18
+
3
19
  ## 3.14.3
4
20
 
5
21
  ### Patch Changes
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createCriticalMetricsPayloads = createCriticalMetricsPayloads;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _rootMetrics = require("./root-metrics");
13
+ var _createSegmentMetrics = require("./segment-metrics/create-segment-metrics");
14
+ function createCriticalMetricsPayloads(_x, _x2, _x3) {
15
+ return _createCriticalMetricsPayloads.apply(this, arguments);
16
+ }
17
+ function _createCriticalMetricsPayloads() {
18
+ _createCriticalMetricsPayloads = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interactionId, interaction, vcMetrics) {
19
+ var _yield$Promise$all, _yield$Promise$all2, rootPayload, segmentPayloads;
20
+ return _regenerator.default.wrap(function _callee$(_context) {
21
+ while (1) switch (_context.prev = _context.next) {
22
+ case 0:
23
+ _context.next = 2;
24
+ return Promise.all([(0, _rootMetrics.createRootCriticalMetricsPayload)(interactionId, interaction, vcMetrics), (0, _createSegmentMetrics.createSegmentMetricsPayloads)(interactionId, interaction)]);
25
+ case 2:
26
+ _yield$Promise$all = _context.sent;
27
+ _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2);
28
+ rootPayload = _yield$Promise$all2[0];
29
+ segmentPayloads = _yield$Promise$all2[1];
30
+ return _context.abrupt("return", [rootPayload].concat((0, _toConsumableArray2.default)(segmentPayloads)));
31
+ case 7:
32
+ case "end":
33
+ return _context.stop();
34
+ }
35
+ }, _callee);
36
+ }));
37
+ return _createCriticalMetricsPayloads.apply(this, arguments);
38
+ }
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createRootCriticalMetricsPayload = createRootCriticalMetricsPayload;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _additionalPayload = require("../../additional-payload");
12
+ var _config = require("../../config");
13
+ var _hiddenTiming = require("../../hidden-timing");
14
+ var _utils = require("../common/utils");
15
+ var _getBrowserMetadata = _interopRequireDefault(require("../utils/get-browser-metadata"));
16
+ var _getFmp = require("../utils/get-fmp");
17
+ var _getInteractionStatus = _interopRequireDefault(require("../utils/get-interaction-status"));
18
+ var _getNavigationMetrics = _interopRequireDefault(require("../utils/get-navigation-metrics"));
19
+ var _getPageVisibilityUpToTtai = _interopRequireDefault(require("../utils/get-page-visibility-up-to-ttai"));
20
+ var _getPaintMetrics = _interopRequireDefault(require("../utils/get-paint-metrics"));
21
+ var _getReactUfoPayloadVersion = require("../utils/get-react-ufo-payload-version");
22
+ var _getSsrSuccess = _interopRequireDefault(require("../utils/get-ssr-success"));
23
+ var _getTtai = _interopRequireDefault(require("../utils/get-ttai"));
24
+ var _getTti = require("../utils/get-tti");
25
+ var _getVcMetrics = _interopRequireDefault(require("../utils/get-vc-metrics"));
26
+ 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; }
27
+ 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; }
28
+ // Re-export types for convenience
29
+
30
+ // Local utility functions
31
+ function getPageVisibilityUpToTTI(interaction) {
32
+ var _interaction$apdex$0$, _interaction$apdex;
33
+ var start = interaction.start;
34
+ var bm3EndTimeOrInteractionEndTime = (_interaction$apdex$0$ = (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 || (_interaction$apdex = _interaction$apdex[0]) === null || _interaction$apdex === void 0 ? void 0 : _interaction$apdex.stopTime) !== null && _interaction$apdex$0$ !== void 0 ? _interaction$apdex$0$ : interaction.end;
35
+ return (0, _hiddenTiming.getPageVisibilityState)(start, bm3EndTimeOrInteractionEndTime);
36
+ }
37
+
38
+ // TODO Write tests for this function
39
+ function createRootCriticalMetricsPayload(_x, _x2, _x3) {
40
+ return _createRootCriticalMetricsPayload.apply(this, arguments);
41
+ }
42
+ function _createRootCriticalMetricsPayload() {
43
+ _createRootCriticalMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interactionId, interaction, vcMetrics) {
44
+ var _finalVCMetrics$ufoV, _interaction$cohortin, _window$location;
45
+ var config, end, start, ufoName, rate, type, abortReason, routeName, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, holdInfo, responsiveness, pageVisibilityAtTTI, pageVisibilityAtTTAI, interactionStatus, newUFOName, ttai, paintMetrics, navigationMetrics, ssrSuccess, tti, fmp, browserMetadata, lighthouseMetrics, finalVCMetrics, ttvc, earliestHold, cohortingCustomData, properties, payload;
46
+ return _regenerator.default.wrap(function _callee$(_context) {
47
+ while (1) switch (_context.prev = _context.next) {
48
+ case 0:
49
+ config = (0, _config.getConfig)();
50
+ if (config) {
51
+ _context.next = 3;
52
+ break;
53
+ }
54
+ throw Error('UFO Configuration not provided');
55
+ case 3:
56
+ end = interaction.end, start = interaction.start, ufoName = interaction.ufoName, rate = interaction.rate, type = interaction.type, abortReason = interaction.abortReason, routeName = interaction.routeName, previousInteractionName = interaction.previousInteractionName, isPreviousInteractionAborted = interaction.isPreviousInteractionAborted, abortedByInteractionName = interaction.abortedByInteractionName, holdInfo = interaction.holdInfo, responsiveness = interaction.responsiveness;
57
+ pageVisibilityAtTTI = getPageVisibilityUpToTTI(interaction);
58
+ pageVisibilityAtTTAI = (0, _getPageVisibilityUpToTtai.default)(interaction);
59
+ interactionStatus = (0, _getInteractionStatus.default)(interaction);
60
+ newUFOName = (0, _utils.sanitizeUfoName)(ufoName); // Get performance metrics
61
+ ttai = (0, _getTtai.default)(interaction);
62
+ _context.next = 11;
63
+ return (0, _getPaintMetrics.default)(type, end);
64
+ case 11:
65
+ paintMetrics = _context.sent;
66
+ navigationMetrics = (0, _getNavigationMetrics.default)(type);
67
+ ssrSuccess = (0, _getSsrSuccess.default)(type); // Calculate BM3 metrics (TTI and FMP) directly
68
+ tti = (0, _getTti.getTTI)(interaction, newUFOName);
69
+ fmp = (0, _getFmp.getFMP)(interaction, newUFOName); // Get browser metadata (using compact nested format)
70
+ browserMetadata = (0, _getBrowserMetadata.default)();
71
+ lighthouseMetrics = (0, _additionalPayload.getLighthouseMetrics)({
72
+ start: start,
73
+ stop: end
74
+ }); // Use provided vcMetrics or calculate if not provided
75
+ _context.t0 = vcMetrics;
76
+ if (_context.t0) {
77
+ _context.next = 23;
78
+ break;
79
+ }
80
+ _context.next = 22;
81
+ return (0, _getVcMetrics.default)(interaction);
82
+ case 22:
83
+ _context.t0 = _context.sent;
84
+ case 23:
85
+ finalVCMetrics = _context.t0;
86
+ ttvc = (_finalVCMetrics$ufoV = finalVCMetrics['ufo:vc:rev']) === null || _finalVCMetrics$ufoV === void 0 ? void 0 : _finalVCMetrics$ufoV.map(function (revision) {
87
+ if (revision['metric:vc90'] === null || revision.clean !== true) {
88
+ return null;
89
+ }
90
+ return {
91
+ revision: revision.revision,
92
+ vc90: revision['metric:vc90']
93
+ };
94
+ }).filter(function (revision) {
95
+ return revision != null;
96
+ }); // find earliest hold
97
+ earliestHold = holdInfo === null || holdInfo === void 0 ? void 0 : holdInfo.reduce(function (a, b) {
98
+ if (a && a.start < b.start) {
99
+ return a;
100
+ }
101
+ return b;
102
+ }, null); // Process cohorting custom data
103
+ cohortingCustomData = (_interaction$cohortin = interaction.cohortingCustomData) !== null && _interaction$cohortin !== void 0 && _interaction$cohortin.size ? Object.fromEntries(interaction.cohortingCustomData) : undefined;
104
+ properties = _objectSpread(_objectSpread({
105
+ // Basic metadata
106
+ 'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
107
+ 'event:product': config.product,
108
+ 'event:schema': '1.0.0',
109
+ 'event:region': config.region || 'unknown',
110
+ 'event:source': {
111
+ name: 'react-ufo/web',
112
+ version: _getReactUfoPayloadVersion.LATEST_REACT_UFO_PAYLOAD_VERSION
113
+ },
114
+ 'experience:key': 'custom.ufo.critical-metrics',
115
+ 'experience:name': newUFOName,
116
+ // Browser metadata (compact nested format)
117
+ browser: browserMetadata.browser,
118
+ device: browserMetadata.device,
119
+ network: browserMetadata.network,
120
+ time: browserMetadata.time,
121
+ metrics: _objectSpread({
122
+ fp: paintMetrics.fp,
123
+ fcp: paintMetrics.fcp,
124
+ lcp: paintMetrics.lcp,
125
+ ttai: ttai,
126
+ tti: tti,
127
+ fmp: fmp,
128
+ tbt: lighthouseMetrics['metric:tbt'],
129
+ tbtObserved: lighthouseMetrics['metric:tbt:observed'],
130
+ cls: lighthouseMetrics['metric:cls'],
131
+ ttvc: ttvc !== null && ttvc !== void 0 ? ttvc : undefined,
132
+ earliestHoldStart: earliestHold !== null && earliestHold !== void 0 && earliestHold.start ? Math.round(earliestHold.start - start) : undefined,
133
+ // for interaction response
134
+ inputDelay: responsiveness !== null && responsiveness !== void 0 && responsiveness.inputDelay ? Math.round(responsiveness.inputDelay) : undefined,
135
+ inp: responsiveness !== null && responsiveness !== void 0 && responsiveness.experimentalInputToNextPaint ? Math.round(responsiveness.experimentalInputToNextPaint) : undefined
136
+ }, navigationMetrics && {
137
+ navigation: navigationMetrics
138
+ })
139
+ }, ssrSuccess !== undefined && {
140
+ ssrSuccess: ssrSuccess
141
+ }), {}, {
142
+ interactionId: interactionId,
143
+ type: type,
144
+ rate: rate,
145
+ routeName: routeName !== null && routeName !== void 0 ? routeName : undefined,
146
+ // Performance timings
147
+ start: Math.round(start),
148
+ end: Math.round(end),
149
+ // Status and outcome
150
+ status: interactionStatus.originalInteractionStatus,
151
+ abortReason: abortReason,
152
+ previousInteractionName: previousInteractionName,
153
+ isPreviousInteractionAborted: isPreviousInteractionAborted,
154
+ abortedByInteractionName: abortedByInteractionName,
155
+ pageVisibilityAtTTI: pageVisibilityAtTTI !== null && pageVisibilityAtTTI !== void 0 ? pageVisibilityAtTTI : undefined,
156
+ pageVisibilityAtTTAI: pageVisibilityAtTTAI,
157
+ // Basic error count (not detailed error count)
158
+ errorCount: interaction.errors.length
159
+ }, Object.keys(cohortingCustomData || {}).length > 0 && {
160
+ cohortingCustomData: cohortingCustomData
161
+ });
162
+ payload = {
163
+ actionSubject: 'experience',
164
+ action: 'measured',
165
+ eventType: 'operational',
166
+ source: 'measured',
167
+ tags: ['observability'],
168
+ attributes: {
169
+ properties: properties
170
+ }
171
+ };
172
+ return _context.abrupt("return", payload);
173
+ case 30:
174
+ case "end":
175
+ return _context.stop();
176
+ }
177
+ }, _callee);
178
+ }));
179
+ return _createRootCriticalMetricsPayload.apply(this, arguments);
180
+ }
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createSegmentMetricsPayloads = createSegmentMetricsPayloads;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _config = require("../../../config");
12
+ var _getBrowserMetadata = _interopRequireDefault(require("../../utils/get-browser-metadata"));
13
+ var _getPageVisibilityUpToTtai = _interopRequireDefault(require("../../utils/get-page-visibility-up-to-ttai"));
14
+ var _getReactUfoPayloadVersion = require("../../utils/get-react-ufo-payload-version");
15
+ var _getIsRootSegment = _interopRequireDefault(require("./get-is-root-segment"));
16
+ var _getSegmentId = _interopRequireDefault(require("./get-segment-id"));
17
+ var _getSegmentStatus2 = _interopRequireDefault(require("./get-segment-status"));
18
+ 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; }
19
+ 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; }
20
+ 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; } } }; }
21
+ 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; } }
22
+ 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; }
23
+ function createSegmentMetricsPayloads(_x, _x2) {
24
+ return _createSegmentMetricsPayloads.apply(this, arguments);
25
+ }
26
+ function _createSegmentMetricsPayloads() {
27
+ _createSegmentMetricsPayloads = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interactionId, interaction) {
28
+ var _interaction$cohortin;
29
+ var config, browserMetadata, cohortingCustomData, pageVisibilityAtTTAI, knownSegments, reactProfilerTimings, rate, routeName, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, segmentsByName, _iterator, _step, _loop, _ret, payloads, _iterator2, _step2, _loop2;
30
+ return _regenerator.default.wrap(function _callee$(_context3) {
31
+ while (1) switch (_context3.prev = _context3.next) {
32
+ case 0:
33
+ config = (0, _config.getConfig)();
34
+ if (config) {
35
+ _context3.next = 3;
36
+ break;
37
+ }
38
+ throw Error('UFO Configuration not provided');
39
+ case 3:
40
+ // Get browser metadata (using compact nested format)
41
+ browserMetadata = (0, _getBrowserMetadata.default)(); // Process cohorting custom data
42
+ cohortingCustomData = (_interaction$cohortin = interaction.cohortingCustomData) !== null && _interaction$cohortin !== void 0 && _interaction$cohortin.size ? Object.fromEntries(interaction.cohortingCustomData) : undefined;
43
+ pageVisibilityAtTTAI = (0, _getPageVisibilityUpToTtai.default)(interaction);
44
+ knownSegments = interaction.knownSegments, reactProfilerTimings = interaction.reactProfilerTimings, rate = interaction.rate, routeName = interaction.routeName, previousInteractionName = interaction.previousInteractionName, isPreviousInteractionAborted = interaction.isPreviousInteractionAborted, abortedByInteractionName = interaction.abortedByInteractionName; // Group segments by name and select the first segment for each name
45
+ segmentsByName = new Map();
46
+ _iterator = _createForOfIteratorHelper(knownSegments);
47
+ _context3.prev = 9;
48
+ _loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
49
+ var segment, segmentId, name, isRootSegment, segmentProfilerTimings, firstMountTiming, firstMountTime, existingEntry;
50
+ return _regenerator.default.wrap(function _loop$(_context) {
51
+ while (1) switch (_context.prev = _context.next) {
52
+ case 0:
53
+ segment = _step.value;
54
+ segmentId = (0, _getSegmentId.default)(segment.labelStack); // skip if no segmentId
55
+ if (segmentId) {
56
+ _context.next = 4;
57
+ break;
58
+ }
59
+ return _context.abrupt("return", 0);
60
+ case 4:
61
+ name = segment.labelStack[segment.labelStack.length - 1].name;
62
+ isRootSegment = (0, _getIsRootSegment.default)(segment.labelStack);
63
+ segmentProfilerTimings = reactProfilerTimings.filter(function (timing) {
64
+ var timingSegmentId = (0, _getSegmentId.default)(timing.labelStack);
65
+ // check if labelStack matches exactly
66
+ return timingSegmentId === segmentId;
67
+ }).sort(function (a, b) {
68
+ return a.startTime - b.startTime;
69
+ });
70
+ firstMountTiming = segmentProfilerTimings.find(function (timing) {
71
+ return timing.type === 'mount';
72
+ });
73
+ if (firstMountTiming) {
74
+ _context.next = 10;
75
+ break;
76
+ }
77
+ return _context.abrupt("return", 0);
78
+ case 10:
79
+ firstMountTime = isRootSegment ? interaction.start : firstMountTiming.startTime; // Check if we already have a segment with this name
80
+ existingEntry = segmentsByName.get(name);
81
+ if (!existingEntry || firstMountTime < existingEntry.firstMountTime) {
82
+ // Either first time seeing this name, or this segment mounted earlier
83
+ segmentsByName.set(name, {
84
+ segment: segment,
85
+ firstMountTime: firstMountTime
86
+ });
87
+ }
88
+ case 13:
89
+ case "end":
90
+ return _context.stop();
91
+ }
92
+ }, _loop);
93
+ });
94
+ _iterator.s();
95
+ case 12:
96
+ if ((_step = _iterator.n()).done) {
97
+ _context3.next = 19;
98
+ break;
99
+ }
100
+ return _context3.delegateYield(_loop(), "t0", 14);
101
+ case 14:
102
+ _ret = _context3.t0;
103
+ if (!(_ret === 0)) {
104
+ _context3.next = 17;
105
+ break;
106
+ }
107
+ return _context3.abrupt("continue", 17);
108
+ case 17:
109
+ _context3.next = 12;
110
+ break;
111
+ case 19:
112
+ _context3.next = 24;
113
+ break;
114
+ case 21:
115
+ _context3.prev = 21;
116
+ _context3.t1 = _context3["catch"](9);
117
+ _iterator.e(_context3.t1);
118
+ case 24:
119
+ _context3.prev = 24;
120
+ _iterator.f();
121
+ return _context3.finish(24);
122
+ case 27:
123
+ // Create payloads only for the selected segments (first one per name)
124
+ payloads = [];
125
+ _iterator2 = _createForOfIteratorHelper(segmentsByName.values());
126
+ _context3.prev = 29;
127
+ _loop2 = /*#__PURE__*/_regenerator.default.mark(function _loop2() {
128
+ var _window$location;
129
+ var segment, segmentId, name, isRootSegment, segmentProfilerTimings, firstMountTiming, lastTiming, startTime, endTime, ttai, _getSegmentStatus, status, segmentAbortReason, properties, payload;
130
+ return _regenerator.default.wrap(function _loop2$(_context2) {
131
+ while (1) switch (_context2.prev = _context2.next) {
132
+ case 0:
133
+ segment = _step2.value.segment;
134
+ segmentId = (0, _getSegmentId.default)(segment.labelStack);
135
+ name = segment.labelStack[segment.labelStack.length - 1].name;
136
+ isRootSegment = (0, _getIsRootSegment.default)(segment.labelStack);
137
+ segmentProfilerTimings = reactProfilerTimings.filter(function (timing) {
138
+ var timingSegmentId = (0, _getSegmentId.default)(timing.labelStack);
139
+ // check if labelStack matches exactly
140
+ return timingSegmentId === segmentId;
141
+ }).sort(function (a, b) {
142
+ return a.startTime - b.startTime;
143
+ });
144
+ firstMountTiming = segmentProfilerTimings.find(function (timing) {
145
+ return timing.type === 'mount';
146
+ }); // We already checked this exists in the grouping phase
147
+ if (firstMountTiming) {
148
+ _context2.next = 8;
149
+ break;
150
+ }
151
+ return _context2.abrupt("return", 1);
152
+ case 8:
153
+ lastTiming = segmentProfilerTimings[segmentProfilerTimings.length - 1];
154
+ startTime = isRootSegment ? interaction.start : firstMountTiming.startTime;
155
+ endTime = lastTiming.commitTime;
156
+ ttai = Math.round(endTime - startTime);
157
+ _getSegmentStatus = (0, _getSegmentStatus2.default)(interaction, segment), status = _getSegmentStatus.status, segmentAbortReason = _getSegmentStatus.abortReason;
158
+ properties = _objectSpread({
159
+ // Basic metadata
160
+ 'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
161
+ 'event:product': config.product,
162
+ 'event:schema': '1.0.0',
163
+ 'event:region': config.region || 'unknown',
164
+ 'event:source': {
165
+ name: 'react-ufo/web',
166
+ version: _getReactUfoPayloadVersion.LATEST_REACT_UFO_PAYLOAD_VERSION
167
+ },
168
+ 'experience:key': 'custom.ufo.critical-metrics',
169
+ 'experience:name': name,
170
+ // Browser metadata (compact nested format)
171
+ browser: browserMetadata.browser,
172
+ device: browserMetadata.device,
173
+ network: browserMetadata.network,
174
+ time: browserMetadata.time,
175
+ metrics: {
176
+ ttai: ttai,
177
+ tti: ttai
178
+ },
179
+ interactionId: interactionId,
180
+ type: 'page_segment_load',
181
+ rate: rate,
182
+ routeName: routeName !== null && routeName !== void 0 ? routeName : undefined,
183
+ // Performance timings
184
+ start: Math.round(startTime),
185
+ end: Math.round(endTime),
186
+ // Status and outcome
187
+ status: status,
188
+ abortReason: segmentAbortReason,
189
+ previousInteractionName: previousInteractionName,
190
+ isPreviousInteractionAborted: isPreviousInteractionAborted,
191
+ abortedByInteractionName: abortedByInteractionName,
192
+ pageVisibilityAtTTAI: pageVisibilityAtTTAI,
193
+ // Basic error count (not detailed error count)
194
+ errorCount: interaction.errors.length
195
+ }, Object.keys(cohortingCustomData || {}).length > 0 && {
196
+ cohortingCustomData: cohortingCustomData
197
+ });
198
+ payload = {
199
+ actionSubject: 'experience',
200
+ action: 'measured',
201
+ eventType: 'operational',
202
+ source: 'measured',
203
+ tags: ['observability'],
204
+ attributes: {
205
+ properties: properties
206
+ }
207
+ };
208
+ payloads.push(payload);
209
+ case 16:
210
+ case "end":
211
+ return _context2.stop();
212
+ }
213
+ }, _loop2);
214
+ });
215
+ _iterator2.s();
216
+ case 32:
217
+ if ((_step2 = _iterator2.n()).done) {
218
+ _context3.next = 38;
219
+ break;
220
+ }
221
+ return _context3.delegateYield(_loop2(), "t2", 34);
222
+ case 34:
223
+ if (!_context3.t2) {
224
+ _context3.next = 36;
225
+ break;
226
+ }
227
+ return _context3.abrupt("continue", 36);
228
+ case 36:
229
+ _context3.next = 32;
230
+ break;
231
+ case 38:
232
+ _context3.next = 43;
233
+ break;
234
+ case 40:
235
+ _context3.prev = 40;
236
+ _context3.t3 = _context3["catch"](29);
237
+ _iterator2.e(_context3.t3);
238
+ case 43:
239
+ _context3.prev = 43;
240
+ _iterator2.f();
241
+ return _context3.finish(43);
242
+ case 46:
243
+ return _context3.abrupt("return", payloads);
244
+ case 47:
245
+ case "end":
246
+ return _context3.stop();
247
+ }
248
+ }, _callee, null, [[9, 21, 24, 27], [29, 40, 43, 46]]);
249
+ }));
250
+ return _createSegmentMetricsPayloads.apply(this, arguments);
251
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getIsRootSegment;
7
+ function getIsRootSegment(labelStack) {
8
+ return labelStack.length === 1;
9
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getSegmentId;
7
+ function getSegmentId(labelStack) {
8
+ for (var i = labelStack.length - 1; i >= 0; i--) {
9
+ var label = labelStack[i];
10
+ if ('segmentId' in label) {
11
+ return label.segmentId;
12
+ }
13
+ }
14
+ return undefined;
15
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = getSegmentStatus;
8
+ var _getInteractionStatus = _interopRequireDefault(require("../../utils/get-interaction-status"));
9
+ var _getSegmentId = _interopRequireDefault(require("./get-segment-id"));
10
+ var _hasSegmentFailed = _interopRequireDefault(require("./has-segment-failed"));
11
+ var _isLabelStackUnderSegment = _interopRequireDefault(require("./is-label-stack-under-segment"));
12
+ 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; } } }; }
13
+ 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; } }
14
+ 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; }
15
+ function getSegmentStatus(interaction, segment) {
16
+ var segmentId = (0, _getSegmentId.default)(segment.labelStack);
17
+
18
+ // Get the root interaction status info
19
+ var rootInteractionStatus = (0, _getInteractionStatus.default)(interaction);
20
+ var rootStatus = rootInteractionStatus.originalInteractionStatus;
21
+ var rootAbortReason = interaction.abortReason;
22
+ var isInteractionsAbortedByNewInteraction = rootStatus === 'ABORTED' && rootAbortReason === 'new_interaction';
23
+ var isInteractionsAbortedByTransition = rootStatus === 'ABORTED' && rootAbortReason === 'transition';
24
+ var status = 'SUCCEEDED';
25
+ var abortReason;
26
+
27
+ // Check if this specific segment has failed
28
+ if (segmentId && (0, _hasSegmentFailed.default)(interaction.errors, segmentId)) {
29
+ status = 'FAILED';
30
+ } else if (isInteractionsAbortedByNewInteraction) {
31
+ status = 'ABORTED';
32
+ abortReason = 'new_interaction';
33
+ } else if (isInteractionsAbortedByTransition) {
34
+ status = 'ABORTED';
35
+ abortReason = 'transition';
36
+ } else if (segmentId) {
37
+ // Check for active holds that are under this segment
38
+ var _iterator = _createForOfIteratorHelper(interaction.holdActive.values()),
39
+ _step;
40
+ try {
41
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
42
+ var activeHold = _step.value;
43
+ if ((0, _isLabelStackUnderSegment.default)(activeHold.labelStack, segmentId)) {
44
+ status = 'ABORTED';
45
+ abortReason = 'timeout';
46
+ break;
47
+ }
48
+ }
49
+ } catch (err) {
50
+ _iterator.e(err);
51
+ } finally {
52
+ _iterator.f();
53
+ }
54
+ }
55
+ return {
56
+ status: status,
57
+ abortReason: abortReason
58
+ };
59
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = hasSegmentFailed;
8
+ var _getSegmentId = _interopRequireDefault(require("./get-segment-id"));
9
+ function hasSegmentFailed(errors, segmentId) {
10
+ return errors.some(function (error) {
11
+ if (!error.labelStack) {
12
+ return false;
13
+ }
14
+ var errorSegmentId = (0, _getSegmentId.default)(error.labelStack);
15
+ return errorSegmentId === segmentId;
16
+ });
17
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = isLabelStackUnderSegment;
7
+ function isLabelStackUnderSegment(labelStack, segmentId) {
8
+ return labelStack.some(function (label) {
9
+ return 'segmentId' in label && label.segmentId === segmentId;
10
+ });
11
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });