@atlaskit/react-ufo 4.1.12 → 4.1.13

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 4.1.13
4
+
5
+ ### Patch Changes
6
+
7
+ - [#195513](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/195513)
8
+ [`49b7bf5d4e698`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/49b7bf5d4e698) -
9
+ Added reactUFO as marks to Dev Tools
10
+
3
11
  ## 4.1.12
4
12
 
5
13
  ### Patch Changes
@@ -33,6 +33,7 @@ var _roundNumber = require("../round-number");
33
33
  var ssr = _interopRequireWildcard(require("../ssr"));
34
34
  var _utils = require("./common/utils");
35
35
  var _criticalMetricsPayload = require("./critical-metrics-payload");
36
+ var _addPerformanceMeasures = require("./utils/add-performance-measures");
36
37
  var _getBrowserMetadata = require("./utils/get-browser-metadata");
37
38
  var _getInteractionStatus = _interopRequireDefault(require("./utils/get-interaction-status"));
38
39
  var _getNavigationMetrics = require("./utils/get-navigation-metrics");
@@ -201,7 +202,7 @@ function getPPSMetrics(interaction) {
201
202
  function getSSRProperties(type) {
202
203
  var ssrPhases = getSSRPhaseSuccess(type);
203
204
  return _objectSpread(_objectSpread({
204
- 'ssr:success': (0, _getSsrSuccess.default)(type),
205
+ 'ssr:success': (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.done) != null ? ssrPhases.done : (0, _getSsrSuccess.default)(type),
205
206
  'ssr:featureFlags': getSSRFeatureFlags(type)
206
207
  }, (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.earlyFlush) != null ? {
207
208
  'ssr:earlyflush:success': ssrPhases.earlyFlush
@@ -619,9 +620,23 @@ function _createInteractionMetricsPayload() {
619
620
  var SSRDoneTime = SSRDoneTimeValue !== undefined ? {
620
621
  SSRDoneTime: Math.round(SSRDoneTimeValue)
621
622
  } : {};
623
+ var isBM3ConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;
624
+ var isUFOConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime);
625
+ if (!experimental && (isBM3ConfigSSRDoneAsFmp || isUFOConfigSSRDoneAsFmp) && SSRDoneTimeValue !== undefined && (0, _platformFeatureFlags.fg)('ufo_chrome_devtools_uplift')) {
626
+ try {
627
+ performance.mark("FMP", {
628
+ startTime: SSRDoneTimeValue,
629
+ detail: {
630
+ devtools: {
631
+ dataType: 'marker'
632
+ }
633
+ }
634
+ });
635
+ } catch (e) {}
636
+ }
622
637
  return _objectSpread(_objectSpread({}, SSRDoneTime), {}, {
623
- isBM3ConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp,
624
- isUFOConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime)
638
+ isBM3ConfigSSRDoneAsFmp: isBM3ConfigSSRDoneAsFmp,
639
+ isUFOConfigSSRDoneAsFmp: isUFOConfigSSRDoneAsFmp
625
640
  });
626
641
  };
627
642
  pageLoadInteractionMetrics = getInitialPageLoadSSRMetrics(); // Detailed payload. Page visibility = visible
@@ -690,6 +705,9 @@ function _createInteractionMetricsPayload() {
690
705
  finalVCMetrics = _yield$Promise$all2[0];
691
706
  experimentalMetrics = _yield$Promise$all2[1];
692
707
  paintMetrics = _yield$Promise$all2[2];
708
+ if (!experimental) {
709
+ (0, _platformFeatureFlags.fg)('ufo_chrome_devtools_uplift') && (0, _addPerformanceMeasures.addPerformanceMeasures)(interaction.start, (0, _toConsumableArray2.default)((finalVCMetrics === null || finalVCMetrics === void 0 ? void 0 : finalVCMetrics['ufo:vc:rev']) || []));
710
+ }
693
711
  payload = {
694
712
  actionSubject: 'experience',
695
713
  action: 'measured',
@@ -768,7 +786,7 @@ function _createInteractionMetricsPayload() {
768
786
  }
769
787
  payload.attributes.properties['event:sizeInKb'] = (0, _getPayloadSize.default)(payload.attributes.properties);
770
788
  return _context.abrupt("return", payload);
771
- case 43:
789
+ case 44:
772
790
  case "end":
773
791
  return _context.stop();
774
792
  }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addPerformanceMeasures = void 0;
7
+ var addPerformanceMeasures = exports.addPerformanceMeasures = function addPerformanceMeasures(start, measures) {
8
+ try {
9
+ measures.sort(function (a, b) {
10
+ return b.revision.localeCompare(a.revision);
11
+ }).slice(0, 2).forEach(function (entry) {
12
+ var _entry$vcDetails;
13
+ if (((_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 || (_entry$vcDetails = _entry$vcDetails['90']) === null || _entry$vcDetails === void 0 ? void 0 : _entry$vcDetails.t) !== undefined) {
14
+ var _entry$vcDetails2;
15
+ performance.mark("VC90 (".concat(entry.revision, ")"), {
16
+ startTime: start + ((_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 || (_entry$vcDetails2 = _entry$vcDetails2['90']) === null || _entry$vcDetails2 === void 0 ? void 0 : _entry$vcDetails2.t),
17
+ detail: {
18
+ devtools: {
19
+ dataType: 'marker'
20
+ }
21
+ }
22
+ });
23
+ }
24
+ });
25
+ measures.forEach(function (entry) {
26
+ var _entry$vcDetails3;
27
+ if (!entry || !entry.vcDetails) {
28
+ return;
29
+ }
30
+ var VCParts = Object.keys(entry.vcDetails);
31
+ performance.measure("VC90 (".concat(entry.revision, ")"), {
32
+ start: start,
33
+ duration: (_entry$vcDetails3 = entry.vcDetails) === null || _entry$vcDetails3 === void 0 || (_entry$vcDetails3 = _entry$vcDetails3['90']) === null || _entry$vcDetails3 === void 0 ? void 0 : _entry$vcDetails3.t,
34
+ detail: {
35
+ devtools: {
36
+ track: "main metrics",
37
+ trackGroup: '🛸 reactUFO metrics',
38
+ color: 'tertiary'
39
+ }
40
+ }
41
+ });
42
+ VCParts.forEach(function (key) {
43
+ var _entry$vcDetails4;
44
+ var duration = (_entry$vcDetails4 = entry.vcDetails) === null || _entry$vcDetails4 === void 0 ? void 0 : _entry$vcDetails4[key].t;
45
+ if (typeof duration !== 'number') {
46
+ return;
47
+ }
48
+ performance.measure("VC".concat(key), {
49
+ start: start,
50
+ duration: duration,
51
+ detail: {
52
+ devtools: {
53
+ track: "VC ".concat(entry.revision),
54
+ trackGroup: '🛸 reactUFO metrics',
55
+ color: key === '90' ? 'tertiary' : 'primary-light'
56
+ }
57
+ }
58
+ });
59
+ });
60
+ });
61
+ } catch (error) {}
62
+ };
@@ -621,6 +621,7 @@ function finishInteraction(id, data) {
621
621
  data.end = endTime;
622
622
  try {
623
623
  // for Firefox 102 and older
624
+
624
625
  if ((0, _platformFeatureFlags.fg)('ufo_chrome_devtools_uplift')) {
625
626
  performance.measure("\uD83D\uDEF8 [".concat(data.type, "] ").concat(data.ufoName, " [ttai]"), {
626
627
  start: data.start,
@@ -633,6 +634,14 @@ function finishInteraction(id, data) {
633
634
  }
634
635
  }
635
636
  });
637
+ performance.mark("TTAI", {
638
+ startTime: data.end,
639
+ detail: {
640
+ devtools: {
641
+ dataType: 'marker'
642
+ }
643
+ }
644
+ });
636
645
  } else {
637
646
  performance.measure("\uD83D\uDEF8 [".concat(data.type, "] ").concat(data.ufoName, " [ttai]"), {
638
647
  start: data.start,
@@ -1074,6 +1083,14 @@ function addApdexToAll(apdex) {
1074
1083
  }
1075
1084
  }
1076
1085
  });
1086
+ performance.mark("[bm3] TTI", {
1087
+ startTime: apdex.stopTime,
1088
+ detail: {
1089
+ devtools: {
1090
+ dataType: 'marker'
1091
+ }
1092
+ }
1093
+ });
1077
1094
  } else {
1078
1095
  var _apdex$startTime2;
1079
1096
  performance.measure("\uD83D\uDEF8 ".concat(apdex.key, " [bm3_tti]"), {
@@ -1108,6 +1125,14 @@ function addApdex(interactionId, apdexInfo) {
1108
1125
  }
1109
1126
  }
1110
1127
  });
1128
+ performance.mark("[bm3] TTI", {
1129
+ startTime: apdexInfo.stopTime,
1130
+ detail: {
1131
+ devtools: {
1132
+ dataType: 'marker'
1133
+ }
1134
+ }
1135
+ });
1111
1136
  } else {
1112
1137
  var _apdexInfo$startTime2;
1113
1138
  performance.measure("\uD83D\uDEF8 ".concat(apdexInfo.key, " [bm3_tti]"), {
@@ -14,7 +14,6 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
14
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
15
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
16
16
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
17
  var _config = require("../config");
19
18
  var _noOpVcObserver = require("./no-op-vc-observer");
20
19
  var _vcObserver = require("./vc-observer");
@@ -169,17 +168,16 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
169
168
  _context.t1 = [];
170
169
  case 16:
171
170
  v3Result = _context.t1;
172
- (0, _platformFeatureFlags.fg)('ufo_chrome_devtools_uplift') && this.addPerformanceMeasures(param.start, [].concat((0, _toConsumableArray2.default)((v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) || []), (0, _toConsumableArray2.default)(v3Result !== null && v3Result !== void 0 ? v3Result : [])));
173
171
  if (v3Result) {
174
- _context.next = 20;
172
+ _context.next = 19;
175
173
  break;
176
174
  }
177
175
  return _context.abrupt("return", v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {});
178
- case 20:
176
+ case 19:
179
177
  return _context.abrupt("return", _objectSpread(_objectSpread({}, v1v2Result), {}, {
180
178
  'ufo:vc:rev': [].concat((0, _toConsumableArray2.default)((_ref2 = v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) !== null && _ref2 !== void 0 ? _ref2 : []), (0, _toConsumableArray2.default)(v3Result !== null && v3Result !== void 0 ? v3Result : []))
181
179
  }));
182
- case 21:
180
+ case 20:
183
181
  case "end":
184
182
  return _context.stop();
185
183
  }
@@ -216,48 +214,6 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
216
214
  value: function collectSSRPlaceholders() {
217
215
  this.ssrPlaceholderHandler.collectExistingPlaceholders();
218
216
  }
219
- }, {
220
- key: "addPerformanceMeasures",
221
- value: function addPerformanceMeasures(start, measures) {
222
- try {
223
- measures.forEach(function (entry) {
224
- var _entry$vcDetails;
225
- if (!entry || !entry.vcDetails) {
226
- return;
227
- }
228
- var VCParts = Object.keys(entry.vcDetails);
229
- performance.measure("VC90 (".concat(entry.revision, ")"), {
230
- start: start,
231
- duration: (_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 || (_entry$vcDetails = _entry$vcDetails['90']) === null || _entry$vcDetails === void 0 ? void 0 : _entry$vcDetails.t,
232
- detail: {
233
- devtools: {
234
- track: "main metrics",
235
- trackGroup: '🛸 reactUFO metrics',
236
- color: 'tertiary'
237
- }
238
- }
239
- });
240
- VCParts.forEach(function (key) {
241
- var _entry$vcDetails2;
242
- var duration = (_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 ? void 0 : _entry$vcDetails2[key].t;
243
- if (typeof duration !== 'number') {
244
- return;
245
- }
246
- performance.measure("VC".concat(key), {
247
- start: start,
248
- duration: duration,
249
- detail: {
250
- devtools: {
251
- track: "VC ".concat(entry.revision),
252
- trackGroup: '🛸 reactUFO metrics',
253
- color: key === '90' ? 'tertiary' : 'primary-light'
254
- }
255
- }
256
- });
257
- });
258
- });
259
- } catch (error) {}
260
- }
261
217
  }]);
262
218
  }(); // Some products set this variable to indicate it is running in SSR
263
219
  var isServer = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.__SERVER__);
@@ -21,6 +21,7 @@ import { roundEpsilon } from '../round-number';
21
21
  import * as ssr from '../ssr';
22
22
  import { buildSegmentTree, labelStackStartWith, optimizeLabelStack, sanitizeUfoName, stringifyLabelStackFully } from './common/utils';
23
23
  import { createCriticalMetricsPayloads } from './critical-metrics-payload';
24
+ import { addPerformanceMeasures } from './utils/add-performance-measures';
24
25
  import { getBrowserMetadataToLegacyFormat } from './utils/get-browser-metadata';
25
26
  import getInteractionStatus from './utils/get-interaction-status';
26
27
  import { getNavigationMetricsToLegacyFormat } from './utils/get-navigation-metrics';
@@ -186,7 +187,7 @@ function getPPSMetrics(interaction) {
186
187
  function getSSRProperties(type) {
187
188
  const ssrPhases = getSSRPhaseSuccess(type);
188
189
  return {
189
- 'ssr:success': getSSRSuccessUtil(type),
190
+ 'ssr:success': (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.done) != null ? ssrPhases.done : getSSRSuccessUtil(type),
190
191
  'ssr:featureFlags': getSSRFeatureFlags(type),
191
192
  ...((ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.earlyFlush) != null ? {
192
193
  'ssr:earlyflush:success': ssrPhases.earlyFlush
@@ -622,10 +623,24 @@ async function createInteractionMetricsPayload(interaction, interactionId, exper
622
623
  const SSRDoneTime = SSRDoneTimeValue !== undefined ? {
623
624
  SSRDoneTime: Math.round(SSRDoneTimeValue)
624
625
  } : {};
626
+ const isBM3ConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;
627
+ const isUFOConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime);
628
+ if (!experimental && (isBM3ConfigSSRDoneAsFmp || isUFOConfigSSRDoneAsFmp) && SSRDoneTimeValue !== undefined && fg('ufo_chrome_devtools_uplift')) {
629
+ try {
630
+ performance.mark(`FMP`, {
631
+ startTime: SSRDoneTimeValue,
632
+ detail: {
633
+ devtools: {
634
+ dataType: 'marker'
635
+ }
636
+ }
637
+ });
638
+ } catch (e) {}
639
+ }
625
640
  return {
626
641
  ...SSRDoneTime,
627
- isBM3ConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp,
628
- isUFOConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime)
642
+ isBM3ConfigSSRDoneAsFmp,
643
+ isUFOConfigSSRDoneAsFmp
629
644
  };
630
645
  };
631
646
  const pageLoadInteractionMetrics = getInitialPageLoadSSRMetrics();
@@ -675,6 +690,9 @@ async function createInteractionMetricsPayload(interaction, interactionId, exper
675
690
  const newUFOName = sanitizeUfoName(ufoName);
676
691
  const resourceTimings = getResourceTimings(start, end);
677
692
  const [finalVCMetrics, experimentalMetrics, paintMetrics] = await Promise.all([vcMetrics || (await getVCMetrics(interaction)), experimental ? getExperimentalVCMetrics(interaction) : Promise.resolve(undefined), getPaintMetricsToLegacyFormat(type, end)]);
693
+ if (!experimental) {
694
+ fg('ufo_chrome_devtools_uplift') && addPerformanceMeasures(interaction.start, [...((finalVCMetrics === null || finalVCMetrics === void 0 ? void 0 : finalVCMetrics['ufo:vc:rev']) || [])]);
695
+ }
678
696
  const payload = {
679
697
  actionSubject: 'experience',
680
698
  action: 'measured',
@@ -0,0 +1,54 @@
1
+ export const addPerformanceMeasures = (start, measures) => {
2
+ try {
3
+ measures.sort((a, b) => b.revision.localeCompare(a.revision)).slice(0, 2).forEach(entry => {
4
+ var _entry$vcDetails, _entry$vcDetails$;
5
+ if (((_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 ? void 0 : (_entry$vcDetails$ = _entry$vcDetails['90']) === null || _entry$vcDetails$ === void 0 ? void 0 : _entry$vcDetails$.t) !== undefined) {
6
+ var _entry$vcDetails2, _entry$vcDetails2$;
7
+ performance.mark(`VC90 (${entry.revision})`, {
8
+ startTime: start + ((_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 ? void 0 : (_entry$vcDetails2$ = _entry$vcDetails2['90']) === null || _entry$vcDetails2$ === void 0 ? void 0 : _entry$vcDetails2$.t),
9
+ detail: {
10
+ devtools: {
11
+ dataType: 'marker'
12
+ }
13
+ }
14
+ });
15
+ }
16
+ });
17
+ measures.forEach(entry => {
18
+ var _entry$vcDetails3, _entry$vcDetails3$;
19
+ if (!entry || !entry.vcDetails) {
20
+ return;
21
+ }
22
+ const VCParts = Object.keys(entry.vcDetails);
23
+ performance.measure(`VC90 (${entry.revision})`, {
24
+ start,
25
+ duration: (_entry$vcDetails3 = entry.vcDetails) === null || _entry$vcDetails3 === void 0 ? void 0 : (_entry$vcDetails3$ = _entry$vcDetails3['90']) === null || _entry$vcDetails3$ === void 0 ? void 0 : _entry$vcDetails3$.t,
26
+ detail: {
27
+ devtools: {
28
+ track: `main metrics`,
29
+ trackGroup: '🛸 reactUFO metrics',
30
+ color: 'tertiary'
31
+ }
32
+ }
33
+ });
34
+ VCParts.forEach(key => {
35
+ var _entry$vcDetails4;
36
+ const duration = (_entry$vcDetails4 = entry.vcDetails) === null || _entry$vcDetails4 === void 0 ? void 0 : _entry$vcDetails4[key].t;
37
+ if (typeof duration !== 'number') {
38
+ return;
39
+ }
40
+ performance.measure(`VC${key}`, {
41
+ start,
42
+ duration,
43
+ detail: {
44
+ devtools: {
45
+ track: `VC ${entry.revision}`,
46
+ trackGroup: '🛸 reactUFO metrics',
47
+ color: key === '90' ? 'tertiary' : 'primary-light'
48
+ }
49
+ }
50
+ });
51
+ });
52
+ });
53
+ } catch (error) {}
54
+ };
@@ -539,6 +539,7 @@ function finishInteraction(id, data, endTime = performance.now()) {
539
539
  data.end = endTime;
540
540
  try {
541
541
  // for Firefox 102 and older
542
+
542
543
  if (fg('ufo_chrome_devtools_uplift')) {
543
544
  performance.measure(`🛸 [${data.type}] ${data.ufoName} [ttai]`, {
544
545
  start: data.start,
@@ -551,6 +552,14 @@ function finishInteraction(id, data, endTime = performance.now()) {
551
552
  }
552
553
  }
553
554
  });
555
+ performance.mark(`TTAI`, {
556
+ startTime: data.end,
557
+ detail: {
558
+ devtools: {
559
+ dataType: 'marker'
560
+ }
561
+ }
562
+ });
554
563
  } else {
555
564
  performance.measure(`🛸 [${data.type}] ${data.ufoName} [ttai]`, {
556
565
  start: data.start,
@@ -949,6 +958,14 @@ export function addApdexToAll(apdex) {
949
958
  }
950
959
  }
951
960
  });
961
+ performance.mark(`[bm3] TTI`, {
962
+ startTime: apdex.stopTime,
963
+ detail: {
964
+ devtools: {
965
+ dataType: 'marker'
966
+ }
967
+ }
968
+ });
952
969
  } else {
953
970
  var _apdex$startTime2;
954
971
  performance.measure(`🛸 ${apdex.key} [bm3_tti]`, {
@@ -983,6 +1000,14 @@ export function addApdex(interactionId, apdexInfo) {
983
1000
  }
984
1001
  }
985
1002
  });
1003
+ performance.mark(`[bm3] TTI`, {
1004
+ startTime: apdexInfo.stopTime,
1005
+ detail: {
1006
+ devtools: {
1007
+ dataType: 'marker'
1008
+ }
1009
+ }
1010
+ });
986
1011
  } else {
987
1012
  var _apdexInfo$startTime2;
988
1013
  performance.measure(`🛸 ${apdexInfo.key} [bm3_tti]`, {
@@ -1,5 +1,4 @@
1
1
  var _process, _process$env;
2
- import { fg } from '@atlaskit/platform-feature-flags';
3
2
  import { isVCRevisionEnabled } from '../config';
4
3
  import { VCObserverNOOP } from './no-op-vc-observer';
5
4
  import { VCObserver } from './vc-observer';
@@ -112,7 +111,6 @@ export class VCObserverWrapper {
112
111
  interactionId: param.interactionId,
113
112
  ssr: param.includeSSRInV3 ? param.ssr : undefined
114
113
  })) : [];
115
- fg('ufo_chrome_devtools_uplift') && this.addPerformanceMeasures(param.start, [...((v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) || []), ...(v3Result !== null && v3Result !== void 0 ? v3Result : [])]);
116
114
  if (!v3Result) {
117
115
  return v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {};
118
116
  }
@@ -139,46 +137,6 @@ export class VCObserverWrapper {
139
137
  collectSSRPlaceholders() {
140
138
  this.ssrPlaceholderHandler.collectExistingPlaceholders();
141
139
  }
142
- addPerformanceMeasures(start, measures) {
143
- try {
144
- measures.forEach(entry => {
145
- var _entry$vcDetails, _entry$vcDetails$;
146
- if (!entry || !entry.vcDetails) {
147
- return;
148
- }
149
- const VCParts = Object.keys(entry.vcDetails);
150
- performance.measure(`VC90 (${entry.revision})`, {
151
- start,
152
- duration: (_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 ? void 0 : (_entry$vcDetails$ = _entry$vcDetails['90']) === null || _entry$vcDetails$ === void 0 ? void 0 : _entry$vcDetails$.t,
153
- detail: {
154
- devtools: {
155
- track: `main metrics`,
156
- trackGroup: '🛸 reactUFO metrics',
157
- color: 'tertiary'
158
- }
159
- }
160
- });
161
- VCParts.forEach(key => {
162
- var _entry$vcDetails2;
163
- const duration = (_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 ? void 0 : _entry$vcDetails2[key].t;
164
- if (typeof duration !== 'number') {
165
- return;
166
- }
167
- performance.measure(`VC${key}`, {
168
- start,
169
- duration,
170
- detail: {
171
- devtools: {
172
- track: `VC ${entry.revision}`,
173
- trackGroup: '🛸 reactUFO metrics',
174
- color: key === '90' ? 'tertiary' : 'primary-light'
175
- }
176
- }
177
- });
178
- });
179
- });
180
- } catch (error) {}
181
- }
182
140
  }
183
141
 
184
142
  // Some products set this variable to indicate it is running in SSR
@@ -33,6 +33,7 @@ import { roundEpsilon } from '../round-number';
33
33
  import * as ssr from '../ssr';
34
34
  import { buildSegmentTree, labelStackStartWith, optimizeLabelStack, sanitizeUfoName, stringifyLabelStackFully } from './common/utils';
35
35
  import { createCriticalMetricsPayloads } from './critical-metrics-payload';
36
+ import { addPerformanceMeasures } from './utils/add-performance-measures';
36
37
  import { getBrowserMetadataToLegacyFormat } from './utils/get-browser-metadata';
37
38
  import getInteractionStatus from './utils/get-interaction-status';
38
39
  import { getNavigationMetricsToLegacyFormat } from './utils/get-navigation-metrics';
@@ -194,7 +195,7 @@ function getPPSMetrics(interaction) {
194
195
  function getSSRProperties(type) {
195
196
  var ssrPhases = getSSRPhaseSuccess(type);
196
197
  return _objectSpread(_objectSpread({
197
- 'ssr:success': getSSRSuccessUtil(type),
198
+ 'ssr:success': (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.done) != null ? ssrPhases.done : getSSRSuccessUtil(type),
198
199
  'ssr:featureFlags': getSSRFeatureFlags(type)
199
200
  }, (ssrPhases === null || ssrPhases === void 0 ? void 0 : ssrPhases.earlyFlush) != null ? {
200
201
  'ssr:earlyflush:success': ssrPhases.earlyFlush
@@ -612,9 +613,23 @@ function _createInteractionMetricsPayload() {
612
613
  var SSRDoneTime = SSRDoneTimeValue !== undefined ? {
613
614
  SSRDoneTime: Math.round(SSRDoneTimeValue)
614
615
  } : {};
616
+ var isBM3ConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;
617
+ var isUFOConfigSSRDoneAsFmp = interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime);
618
+ if (!experimental && (isBM3ConfigSSRDoneAsFmp || isUFOConfigSSRDoneAsFmp) && SSRDoneTimeValue !== undefined && fg('ufo_chrome_devtools_uplift')) {
619
+ try {
620
+ performance.mark("FMP", {
621
+ startTime: SSRDoneTimeValue,
622
+ detail: {
623
+ devtools: {
624
+ dataType: 'marker'
625
+ }
626
+ }
627
+ });
628
+ } catch (e) {}
629
+ }
615
630
  return _objectSpread(_objectSpread({}, SSRDoneTime), {}, {
616
- isBM3ConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp,
617
- isUFOConfigSSRDoneAsFmp: interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp || !!(config !== null && config !== void 0 && (_config$ssr = config.ssr) !== null && _config$ssr !== void 0 && _config$ssr.getSSRDoneTime)
631
+ isBM3ConfigSSRDoneAsFmp: isBM3ConfigSSRDoneAsFmp,
632
+ isUFOConfigSSRDoneAsFmp: isUFOConfigSSRDoneAsFmp
618
633
  });
619
634
  };
620
635
  pageLoadInteractionMetrics = getInitialPageLoadSSRMetrics(); // Detailed payload. Page visibility = visible
@@ -683,6 +698,9 @@ function _createInteractionMetricsPayload() {
683
698
  finalVCMetrics = _yield$Promise$all2[0];
684
699
  experimentalMetrics = _yield$Promise$all2[1];
685
700
  paintMetrics = _yield$Promise$all2[2];
701
+ if (!experimental) {
702
+ fg('ufo_chrome_devtools_uplift') && addPerformanceMeasures(interaction.start, _toConsumableArray((finalVCMetrics === null || finalVCMetrics === void 0 ? void 0 : finalVCMetrics['ufo:vc:rev']) || []));
703
+ }
686
704
  payload = {
687
705
  actionSubject: 'experience',
688
706
  action: 'measured',
@@ -761,7 +779,7 @@ function _createInteractionMetricsPayload() {
761
779
  }
762
780
  payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
763
781
  return _context.abrupt("return", payload);
764
- case 43:
782
+ case 44:
765
783
  case "end":
766
784
  return _context.stop();
767
785
  }
@@ -0,0 +1,56 @@
1
+ export var addPerformanceMeasures = function addPerformanceMeasures(start, measures) {
2
+ try {
3
+ measures.sort(function (a, b) {
4
+ return b.revision.localeCompare(a.revision);
5
+ }).slice(0, 2).forEach(function (entry) {
6
+ var _entry$vcDetails;
7
+ if (((_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 || (_entry$vcDetails = _entry$vcDetails['90']) === null || _entry$vcDetails === void 0 ? void 0 : _entry$vcDetails.t) !== undefined) {
8
+ var _entry$vcDetails2;
9
+ performance.mark("VC90 (".concat(entry.revision, ")"), {
10
+ startTime: start + ((_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 || (_entry$vcDetails2 = _entry$vcDetails2['90']) === null || _entry$vcDetails2 === void 0 ? void 0 : _entry$vcDetails2.t),
11
+ detail: {
12
+ devtools: {
13
+ dataType: 'marker'
14
+ }
15
+ }
16
+ });
17
+ }
18
+ });
19
+ measures.forEach(function (entry) {
20
+ var _entry$vcDetails3;
21
+ if (!entry || !entry.vcDetails) {
22
+ return;
23
+ }
24
+ var VCParts = Object.keys(entry.vcDetails);
25
+ performance.measure("VC90 (".concat(entry.revision, ")"), {
26
+ start: start,
27
+ duration: (_entry$vcDetails3 = entry.vcDetails) === null || _entry$vcDetails3 === void 0 || (_entry$vcDetails3 = _entry$vcDetails3['90']) === null || _entry$vcDetails3 === void 0 ? void 0 : _entry$vcDetails3.t,
28
+ detail: {
29
+ devtools: {
30
+ track: "main metrics",
31
+ trackGroup: '🛸 reactUFO metrics',
32
+ color: 'tertiary'
33
+ }
34
+ }
35
+ });
36
+ VCParts.forEach(function (key) {
37
+ var _entry$vcDetails4;
38
+ var duration = (_entry$vcDetails4 = entry.vcDetails) === null || _entry$vcDetails4 === void 0 ? void 0 : _entry$vcDetails4[key].t;
39
+ if (typeof duration !== 'number') {
40
+ return;
41
+ }
42
+ performance.measure("VC".concat(key), {
43
+ start: start,
44
+ duration: duration,
45
+ detail: {
46
+ devtools: {
47
+ track: "VC ".concat(entry.revision),
48
+ trackGroup: '🛸 reactUFO metrics',
49
+ color: key === '90' ? 'tertiary' : 'primary-light'
50
+ }
51
+ }
52
+ });
53
+ });
54
+ });
55
+ } catch (error) {}
56
+ };
@@ -575,6 +575,7 @@ function finishInteraction(id, data) {
575
575
  data.end = endTime;
576
576
  try {
577
577
  // for Firefox 102 and older
578
+
578
579
  if (fg('ufo_chrome_devtools_uplift')) {
579
580
  performance.measure("\uD83D\uDEF8 [".concat(data.type, "] ").concat(data.ufoName, " [ttai]"), {
580
581
  start: data.start,
@@ -587,6 +588,14 @@ function finishInteraction(id, data) {
587
588
  }
588
589
  }
589
590
  });
591
+ performance.mark("TTAI", {
592
+ startTime: data.end,
593
+ detail: {
594
+ devtools: {
595
+ dataType: 'marker'
596
+ }
597
+ }
598
+ });
590
599
  } else {
591
600
  performance.measure("\uD83D\uDEF8 [".concat(data.type, "] ").concat(data.ufoName, " [ttai]"), {
592
601
  start: data.start,
@@ -1028,6 +1037,14 @@ export function addApdexToAll(apdex) {
1028
1037
  }
1029
1038
  }
1030
1039
  });
1040
+ performance.mark("[bm3] TTI", {
1041
+ startTime: apdex.stopTime,
1042
+ detail: {
1043
+ devtools: {
1044
+ dataType: 'marker'
1045
+ }
1046
+ }
1047
+ });
1031
1048
  } else {
1032
1049
  var _apdex$startTime2;
1033
1050
  performance.measure("\uD83D\uDEF8 ".concat(apdex.key, " [bm3_tti]"), {
@@ -1062,6 +1079,14 @@ export function addApdex(interactionId, apdexInfo) {
1062
1079
  }
1063
1080
  }
1064
1081
  });
1082
+ performance.mark("[bm3] TTI", {
1083
+ startTime: apdexInfo.stopTime,
1084
+ detail: {
1085
+ devtools: {
1086
+ dataType: 'marker'
1087
+ }
1088
+ }
1089
+ });
1065
1090
  } else {
1066
1091
  var _apdexInfo$startTime2;
1067
1092
  performance.measure("\uD83D\uDEF8 ".concat(apdexInfo.key, " [bm3_tti]"), {
@@ -7,7 +7,6 @@ var _process;
7
7
  import _regeneratorRuntime from "@babel/runtime/regenerator";
8
8
  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; }
9
9
  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) { _defineProperty(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; }
10
- import { fg } from '@atlaskit/platform-feature-flags';
11
10
  import { isVCRevisionEnabled } from '../config';
12
11
  import { VCObserverNOOP } from './no-op-vc-observer';
13
12
  import { VCObserver } from './vc-observer';
@@ -159,17 +158,16 @@ export var VCObserverWrapper = /*#__PURE__*/function () {
159
158
  _context.t1 = [];
160
159
  case 16:
161
160
  v3Result = _context.t1;
162
- fg('ufo_chrome_devtools_uplift') && this.addPerformanceMeasures(param.start, [].concat(_toConsumableArray((v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) || []), _toConsumableArray(v3Result !== null && v3Result !== void 0 ? v3Result : [])));
163
161
  if (v3Result) {
164
- _context.next = 20;
162
+ _context.next = 19;
165
163
  break;
166
164
  }
167
165
  return _context.abrupt("return", v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {});
168
- case 20:
166
+ case 19:
169
167
  return _context.abrupt("return", _objectSpread(_objectSpread({}, v1v2Result), {}, {
170
168
  'ufo:vc:rev': [].concat(_toConsumableArray((_ref2 = v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) !== null && _ref2 !== void 0 ? _ref2 : []), _toConsumableArray(v3Result !== null && v3Result !== void 0 ? v3Result : []))
171
169
  }));
172
- case 21:
170
+ case 20:
173
171
  case "end":
174
172
  return _context.stop();
175
173
  }
@@ -206,48 +204,6 @@ export var VCObserverWrapper = /*#__PURE__*/function () {
206
204
  value: function collectSSRPlaceholders() {
207
205
  this.ssrPlaceholderHandler.collectExistingPlaceholders();
208
206
  }
209
- }, {
210
- key: "addPerformanceMeasures",
211
- value: function addPerformanceMeasures(start, measures) {
212
- try {
213
- measures.forEach(function (entry) {
214
- var _entry$vcDetails;
215
- if (!entry || !entry.vcDetails) {
216
- return;
217
- }
218
- var VCParts = Object.keys(entry.vcDetails);
219
- performance.measure("VC90 (".concat(entry.revision, ")"), {
220
- start: start,
221
- duration: (_entry$vcDetails = entry.vcDetails) === null || _entry$vcDetails === void 0 || (_entry$vcDetails = _entry$vcDetails['90']) === null || _entry$vcDetails === void 0 ? void 0 : _entry$vcDetails.t,
222
- detail: {
223
- devtools: {
224
- track: "main metrics",
225
- trackGroup: '🛸 reactUFO metrics',
226
- color: 'tertiary'
227
- }
228
- }
229
- });
230
- VCParts.forEach(function (key) {
231
- var _entry$vcDetails2;
232
- var duration = (_entry$vcDetails2 = entry.vcDetails) === null || _entry$vcDetails2 === void 0 ? void 0 : _entry$vcDetails2[key].t;
233
- if (typeof duration !== 'number') {
234
- return;
235
- }
236
- performance.measure("VC".concat(key), {
237
- start: start,
238
- duration: duration,
239
- detail: {
240
- devtools: {
241
- track: "VC ".concat(entry.revision),
242
- trackGroup: '🛸 reactUFO metrics',
243
- color: key === '90' ? 'tertiary' : 'primary-light'
244
- }
245
- }
246
- });
247
- });
248
- });
249
- } catch (error) {}
250
- }
251
207
  }]);
252
208
  }();
253
209
 
@@ -0,0 +1,2 @@
1
+ import type { RevisionPayload } from '../../common/vc/types';
2
+ export declare const addPerformanceMeasures: (start: number, measures: RevisionPayload) => void;
@@ -12,7 +12,8 @@ export type SSRFeatureFlags = {
12
12
  };
13
13
  export type SSRConfig = {
14
14
  /**
15
- * Used to represent whether SSR as a whole was considered successful. You can consider this the success of the "render" phase success
15
+ * Used to represent whether SSR as a whole was considered successful. You can consider this the success of the "render" phase success.
16
+ * Also may be used as the FMP mark
16
17
  */
17
18
  getDoneMark: () => number | null;
18
19
  /**
@@ -31,6 +32,10 @@ export type SSRConfig = {
31
32
  * This is generally expected to be earlier than / independant of the prefetch data and may even be non-visual (eg: <link rel="preload" href="..."> tags).
32
33
  */
33
34
  earlyFlush?: boolean;
35
+ /**
36
+ * "done" if present can override the presence / absence of the done mark in the overral SSR success status ('ssr:success').
37
+ */
38
+ done?: boolean;
34
39
  };
35
40
  getFeatureFlags: () => SSRFeatureFlags | null;
36
41
  getTimings?: () => ReportedTimings | null;
@@ -41,6 +46,7 @@ export declare function getSSRSuccess(): boolean;
41
46
  export declare function getSSRPhaseSuccess(): {
42
47
  prefetch?: boolean;
43
48
  earlyFlush?: boolean;
49
+ done?: boolean;
44
50
  } | undefined;
45
51
  export declare function getSSRDoneTime(): number | undefined;
46
52
  export declare function getSSRFeatureFlags(): SSRFeatureFlags | undefined;
@@ -21,7 +21,6 @@ export declare class VCObserverWrapper implements VCObserverInterface {
21
21
  setReactRootRenderStart(startTime: number): void;
22
22
  setReactRootRenderStop(stopTime: number): void;
23
23
  collectSSRPlaceholders(): void;
24
- private addPerformanceMeasures;
25
24
  }
26
25
  export declare function isEnvironmentSupported(): boolean;
27
26
  export declare function getVCObserver(opts?: VCObserverOptions): VCObserverInterface;
@@ -0,0 +1,2 @@
1
+ import type { RevisionPayload } from '../../common/vc/types';
2
+ export declare const addPerformanceMeasures: (start: number, measures: RevisionPayload) => void;
@@ -12,7 +12,8 @@ export type SSRFeatureFlags = {
12
12
  };
13
13
  export type SSRConfig = {
14
14
  /**
15
- * Used to represent whether SSR as a whole was considered successful. You can consider this the success of the "render" phase success
15
+ * Used to represent whether SSR as a whole was considered successful. You can consider this the success of the "render" phase success.
16
+ * Also may be used as the FMP mark
16
17
  */
17
18
  getDoneMark: () => number | null;
18
19
  /**
@@ -31,6 +32,10 @@ export type SSRConfig = {
31
32
  * This is generally expected to be earlier than / independant of the prefetch data and may even be non-visual (eg: <link rel="preload" href="..."> tags).
32
33
  */
33
34
  earlyFlush?: boolean;
35
+ /**
36
+ * "done" if present can override the presence / absence of the done mark in the overral SSR success status ('ssr:success').
37
+ */
38
+ done?: boolean;
34
39
  };
35
40
  getFeatureFlags: () => SSRFeatureFlags | null;
36
41
  getTimings?: () => ReportedTimings | null;
@@ -41,6 +46,7 @@ export declare function getSSRSuccess(): boolean;
41
46
  export declare function getSSRPhaseSuccess(): {
42
47
  prefetch?: boolean;
43
48
  earlyFlush?: boolean;
49
+ done?: boolean;
44
50
  } | undefined;
45
51
  export declare function getSSRDoneTime(): number | undefined;
46
52
  export declare function getSSRFeatureFlags(): SSRFeatureFlags | undefined;
@@ -21,7 +21,6 @@ export declare class VCObserverWrapper implements VCObserverInterface {
21
21
  setReactRootRenderStart(startTime: number): void;
22
22
  setReactRootRenderStop(stopTime: number): void;
23
23
  collectSSRPlaceholders(): void;
24
- private addPerformanceMeasures;
25
24
  }
26
25
  export declare function isEnvironmentSupported(): boolean;
27
26
  export declare function getVCObserver(opts?: VCObserverOptions): VCObserverInterface;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/react-ufo",
3
- "version": "4.1.12",
3
+ "version": "4.1.13",
4
4
  "description": "Parts of React UFO that are publicly available",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",