@atlaskit/react-ufo 5.4.0 → 5.4.2

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 (37) hide show
  1. package/AGENTS.md +20 -9
  2. package/CHANGELOG.md +16 -0
  3. package/api-reference.md +899 -456
  4. package/dist/cjs/config/index.js +13 -6
  5. package/dist/cjs/create-interaction-extra-metrics-payload/index.js +19 -18
  6. package/dist/cjs/create-payload/index.js +2 -2
  7. package/dist/cjs/ignore-holds/index.js +5 -3
  8. package/dist/cjs/segment/segment.js +5 -3
  9. package/dist/cjs/segment/third-party-segment.js +4 -3
  10. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +23 -18
  11. package/dist/es2019/config/index.js +12 -8
  12. package/dist/es2019/create-interaction-extra-metrics-payload/index.js +6 -5
  13. package/dist/es2019/create-payload/index.js +1 -1
  14. package/dist/es2019/ignore-holds/index.js +5 -3
  15. package/dist/es2019/segment/segment.js +5 -3
  16. package/dist/es2019/segment/third-party-segment.js +3 -2
  17. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +7 -2
  18. package/dist/esm/config/index.js +12 -6
  19. package/dist/esm/create-interaction-extra-metrics-payload/index.js +20 -19
  20. package/dist/esm/create-payload/index.js +2 -2
  21. package/dist/esm/ignore-holds/index.js +4 -2
  22. package/dist/esm/segment/segment.js +4 -2
  23. package/dist/esm/segment/third-party-segment.js +3 -2
  24. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +21 -16
  25. package/dist/types/common/react-ufo-payload-schema.d.ts +1 -1
  26. package/dist/types/config/index.d.ts +2 -1
  27. package/dist/types/ignore-holds/index.d.ts +5 -1
  28. package/dist/types/segment/segment.d.ts +5 -1
  29. package/dist/types/segment/third-party-segment.d.ts +4 -1
  30. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +1 -0
  31. package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +1 -1
  32. package/dist/types-ts4.5/config/index.d.ts +2 -1
  33. package/dist/types-ts4.5/ignore-holds/index.d.ts +5 -1
  34. package/dist/types-ts4.5/segment/segment.d.ts +5 -1
  35. package/dist/types-ts4.5/segment/third-party-segment.d.ts +4 -1
  36. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +1 -0
  37. package/package.json +7 -1
@@ -5,7 +5,10 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
5
5
  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; }
6
6
  import { fg } from '@atlaskit/platform-feature-flags';
7
7
  var config;
8
- export var DEFAULT_TTVC_REVISION = 'fy25.03';
8
+ export var DEFAULT_TTVC_REVISION = 'fy26.04';
9
+ export function getDefaultTTVCRevision() {
10
+ return fg('ufo_update_and_enforce_ttvc_v4_default_version') ? DEFAULT_TTVC_REVISION : 'fy25.03';
11
+ }
9
12
  export var UNKNOWN_INTERACTION_RATE = 1000;
10
13
 
11
14
  // Defensively typed, since this is directly user-editable
@@ -16,13 +19,16 @@ export function setUFOConfig(newConfig) {
16
19
  // Handle edge cases with `enabledVCRevisions`
17
20
  var _ref = (_newConfig$vc = newConfig === null || newConfig === void 0 ? void 0 : newConfig.vc) !== null && _newConfig$vc !== void 0 ? _newConfig$vc : {},
18
21
  enabledVCRevisions = _ref.enabledVCRevisions;
19
- if (_typeof(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.byExperience) === 'object') {
22
+ if (fg('ufo_update_and_enforce_ttvc_v4_default_version') ? enabledVCRevisions : _typeof(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.byExperience) === 'object') {
23
+ var _enabledVCRevisions$a;
24
+ var byExperience = _typeof(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.byExperience) === 'object' ? enabledVCRevisions.byExperience : {};
20
25
  config = _objectSpread(_objectSpread({}, newConfig), {}, {
21
26
  vc: _objectSpread(_objectSpread({}, newConfig.vc), {}, {
22
27
  enabledVCRevisions: {
23
- // enforce axiom about `enabledVCRevisions.all` config
24
- all: Array.from(new Set([DEFAULT_TTVC_REVISION].concat(_toConsumableArray(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.all), _toConsumableArray(Object.values(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.byExperience).flat())))),
25
- byExperience: _objectSpread({}, enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.byExperience)
28
+ // enforce axiom about `enabledVCRevisions.all` config:
29
+ // DEFAULT_TTVC_REVISION must always be present in `all`
30
+ all: Array.from(new Set([getDefaultTTVCRevision()].concat(_toConsumableArray((_enabledVCRevisions$a = enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.all) !== null && _enabledVCRevisions$a !== void 0 ? _enabledVCRevisions$a : []), _toConsumableArray(Object.values(byExperience).flat())))),
31
+ byExperience: byExperience
26
32
  }
27
33
  })
28
34
  });
@@ -73,7 +79,7 @@ export function getEnabledVCRevisions() {
73
79
  if (isValidConfigArray(enabledVCRevisions === null || enabledVCRevisions === void 0 ? void 0 : enabledVCRevisions.all)) {
74
80
  return enabledVCRevisions.all;
75
81
  }
76
- return [DEFAULT_TTVC_REVISION];
82
+ return [getDefaultTTVCRevision()];
77
83
  }
78
84
  return [];
79
85
  } catch (_unused) {
@@ -8,7 +8,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
8
8
  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; }
9
9
  import { fg } from '@atlaskit/platform-feature-flags';
10
10
  import coinflip from '../coinflip';
11
- import { DEFAULT_TTVC_REVISION, getConfig, getExtraInteractionRate } from '../config';
11
+ import { DEFAULT_TTVC_REVISION, getConfig, getDefaultTTVCRevision, getExtraInteractionRate, getMostRecentVCRevision } from '../config';
12
12
  import { buildSegmentTree, getOldSegmentsLabelStack, optimizeLabelStack, sanitizeUfoName } from '../create-payload/common/utils';
13
13
  import { getMoreAccuratePageVisibilityUpToTTAI } from '../create-payload/utils/get-more-accurate-page-visibility-up-to-ttai';
14
14
  import getPageVisibilityUpToTTAI from '../create-payload/utils/get-page-visibility-up-to-ttai';
@@ -29,8 +29,8 @@ function createInteractionExtraLogPayload(_x, _x2, _x3, _x4) {
29
29
  }
30
30
  function _createInteractionExtraLogPayload() {
31
31
  _createInteractionExtraLogPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(interactionId, interaction, lastInteractionFinish, lastInteractionFinishVCResult) {
32
- var _getTTAI, _lastInteractionFinis, _getTTAI2, _window$location;
33
- var config, end, start, ufoName, rate, type, abortReason, routeName, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, knownSegments, minorInteractions, sanitisedUfoName, configRate, pageVisibilityAtTTAI, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTAI, extraTTAI, newUFOName, finalVCMetrics, vcRevisionPayload, effectiveVCRevisionPayload, normalTTAI, lastInteractionFinishStart, lastInteractionFinishEnd, lastInteractionFinishVC90, lastInteractionFinishVCClean, lastInteractionFinishVCRev, lastInteractionFinishRevision, isThirdParty, filteredData, getDetailedInteractionMetrics, segments3p, segmentTree, payload;
32
+ var _getTTAI, _getMostRecentVCRevis, _lastInteractionFinis, _getTTAI2, _window$location;
33
+ var config, end, start, ufoName, rate, type, abortReason, routeName, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, knownSegments, minorInteractions, sanitisedUfoName, configRate, pageVisibilityAtTTAI, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTAI, extraTTAI, newUFOName, finalVCMetrics, vcRevisionPayload, effectiveRevision, effectiveVCRevisionPayload, normalTTAI, lastInteractionFinishStart, lastInteractionFinishEnd, lastInteractionFinishVC90, lastInteractionFinishVCClean, lastInteractionFinishVCRev, lastInteractionFinishRevision, isThirdParty, filteredData, getDetailedInteractionMetrics, segments3p, segmentTree, payload;
34
34
  return _regeneratorRuntime.wrap(function _callee$(_context) {
35
35
  while (1) switch (_context.prev = _context.next) {
36
36
  case 0:
@@ -68,56 +68,57 @@ function _createInteractionExtraLogPayload() {
68
68
  finalVCMetrics = _context.sent;
69
69
  // Check if VC is clean and has valid metric
70
70
  vcRevisionPayload = finalVCMetrics === null || finalVCMetrics === void 0 ? void 0 : finalVCMetrics['ufo:vc:rev'];
71
+ effectiveRevision = fg('ufo_update_and_enforce_ttvc_v4_default_version') ? (_getMostRecentVCRevis = getMostRecentVCRevision(ufoName)) !== null && _getMostRecentVCRevis !== void 0 ? _getMostRecentVCRevis : DEFAULT_TTVC_REVISION : getDefaultTTVCRevision();
71
72
  effectiveVCRevisionPayload = vcRevisionPayload === null || vcRevisionPayload === void 0 ? void 0 : vcRevisionPayload.find(function (_ref) {
72
73
  var revision = _ref.revision;
73
- return revision === DEFAULT_TTVC_REVISION;
74
+ return revision === effectiveRevision;
74
75
  });
75
76
  if (!(!(effectiveVCRevisionPayload !== null && effectiveVCRevisionPayload !== void 0 && effectiveVCRevisionPayload.clean) || (effectiveVCRevisionPayload === null || effectiveVCRevisionPayload === void 0 ? void 0 : effectiveVCRevisionPayload['metric:vc90']) === undefined || typeof (effectiveVCRevisionPayload === null || effectiveVCRevisionPayload === void 0 ? void 0 : effectiveVCRevisionPayload['metric:vc90']) !== 'number' || extraTTAI === undefined || typeof extraTTAI !== 'number' || interaction.errors.length > 0)) {
76
- _context.next = 23;
77
+ _context.next = 24;
77
78
  break;
78
79
  }
79
80
  return _context.abrupt("return", null);
80
- case 23:
81
+ case 24:
81
82
  if (!(!lastInteractionFinish || lastInteractionFinish !== null && lastInteractionFinish !== void 0 && lastInteractionFinish.abortReason || lastInteractionFinish !== null && lastInteractionFinish !== void 0 && (_lastInteractionFinis = lastInteractionFinish.errors) !== null && _lastInteractionFinis !== void 0 && _lastInteractionFinis.length)) {
82
- _context.next = 25;
83
+ _context.next = 26;
83
84
  break;
84
85
  }
85
86
  return _context.abrupt("return", null);
86
- case 25:
87
+ case 26:
87
88
  normalTTAI = (_getTTAI2 = getTTAI(lastInteractionFinish)) !== null && _getTTAI2 !== void 0 ? _getTTAI2 : undefined;
88
89
  lastInteractionFinishStart = typeof lastInteractionFinish.start === 'number' ? Math.round(lastInteractionFinish.start) : undefined;
89
90
  lastInteractionFinishEnd = typeof lastInteractionFinish.end === 'number' ? Math.round(lastInteractionFinish.end) : undefined;
90
91
  lastInteractionFinishVC90 = null;
91
92
  lastInteractionFinishVCClean = false;
92
93
  if (!lastInteractionFinishVCResult) {
93
- _context.next = 41;
94
+ _context.next = 42;
94
95
  break;
95
96
  }
96
97
  lastInteractionFinishVCRev = lastInteractionFinishVCResult['ufo:vc:rev'];
97
98
  lastInteractionFinishRevision = lastInteractionFinishVCRev === null || lastInteractionFinishVCRev === void 0 ? void 0 : lastInteractionFinishVCRev.find(function (_ref2) {
98
99
  var revision = _ref2.revision;
99
- return revision === DEFAULT_TTVC_REVISION;
100
+ return revision === effectiveRevision;
100
101
  });
101
102
  if (!(lastInteractionFinishRevision !== null && lastInteractionFinishRevision !== void 0 && lastInteractionFinishRevision.clean)) {
102
- _context.next = 38;
103
+ _context.next = 39;
103
104
  break;
104
105
  }
105
106
  lastInteractionFinishVCClean = true;
106
107
  lastInteractionFinishVC90 = lastInteractionFinishRevision['metric:vc90'];
107
- _context.next = 39;
108
+ _context.next = 40;
108
109
  break;
109
- case 38:
110
- return _context.abrupt("return", null);
111
110
  case 39:
112
- _context.next = 42;
111
+ return _context.abrupt("return", null);
112
+ case 40:
113
+ _context.next = 43;
113
114
  break;
114
- case 41:
115
+ case 42:
115
116
  if (normalTTAI !== undefined && typeof normalTTAI === 'number' && normalTTAI === extraTTAI) {
116
117
  // Because TTAI is equal between with and without 3p, we can assume VC90 is also equal
117
118
  lastInteractionFinishVC90 = effectiveVCRevisionPayload === null || effectiveVCRevisionPayload === void 0 ? void 0 : effectiveVCRevisionPayload['metric:vc90'];
118
119
  lastInteractionFinishVCClean = effectiveVCRevisionPayload === null || effectiveVCRevisionPayload === void 0 ? void 0 : effectiveVCRevisionPayload.clean;
119
120
  }
120
- case 42:
121
+ case 43:
121
122
  // Helper function to check if labelStack contains third-party type
122
123
  isThirdParty = function isThirdParty(labelStack) {
123
124
  var _labelStack$some;
@@ -223,7 +224,7 @@ function _createInteractionExtraLogPayload() {
223
224
  reactProfilerTimings: optimizeReactProfilerTimings(filteredData.reactProfilerTimings, start, getReactUFOPayloadVersion(interaction.type)),
224
225
  customData: filteredData.customData
225
226
  }, getDetailedInteractionMetrics()),
226
- 'vc:effective:revision': DEFAULT_TTVC_REVISION,
227
+ 'vc:effective:revision': effectiveRevision,
227
228
  lastInteractionFinish: {
228
229
  start: lastInteractionFinishStart,
229
230
  end: lastInteractionFinishEnd,
@@ -236,7 +237,7 @@ function _createInteractionExtraLogPayload() {
236
237
  };
237
238
  payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
238
239
  return _context.abrupt("return", payload);
239
- case 51:
240
+ case 52:
240
241
  case "end":
241
242
  return _context.stop();
242
243
  }
@@ -9,9 +9,9 @@ try{return acc+item.cssRules.length;}catch(_unused3){return acc;}},0);var styleE
9
9
  getInitialPageLoadSSRMetrics=function getInitialPageLoadSSRMetrics(){var _config$ssr;if(!isPageLoad){return{};}var config=getConfig();var SSRDoneTimeValue=getSSRDoneTimeValue(config);var SSRDoneTime=SSRDoneTimeValue!==undefined?{SSRDoneTime:Math.round(SSRDoneTimeValue)}:{};var isBM3ConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp;var isUFOConfigSSRDoneAsFmp=interaction.metaData.__legacy__bm3ConfigSSRDoneAsFmp||!!(config!==null&&config!==void 0&&(_config$ssr=config.ssr)!==null&&_config$ssr!==void 0&&_config$ssr.getSSRDoneTime);if(!experimental&&(isBM3ConfigSSRDoneAsFmp||isUFOConfigSSRDoneAsFmp)&&SSRDoneTimeValue!==undefined){try{performance.mark("FMP",{startTime:SSRDoneTimeValue,detail:{devtools:{dataType:'marker'}}});}catch(_unused6){}}return _objectSpread(_objectSpread({},SSRDoneTime),{},{isBM3ConfigSSRDoneAsFmp:isBM3ConfigSSRDoneAsFmp,isUFOConfigSSRDoneAsFmp:isUFOConfigSSRDoneAsFmp});};pageLoadInteractionMetrics=getInitialPageLoadSSRMetrics();// Detailed payload. Page visibility = visible
10
10
  getDetailedInteractionMetrics=function getDetailedInteractionMetrics(resourceTimings){if(experimental||window.__UFO_COMPACT_PAYLOAD__||!isDetailedPayload){return{};}var spans=[].concat(_toConsumableArray(interaction.spans),_toConsumableArray(atlaskitInteractionSpans));atlaskitInteractionSpans.length=0;var shouldInclude3pHolds=shouldUseRawDataThirdPartyBehavior(ufoName,type);var basePayload={errors:interaction.errors.map(function(_ref2){var labelStack=_ref2.labelStack,others=_objectWithoutProperties(_ref2,_excluded);return _objectSpread(_objectSpread({},others),{},{labelStack:labelStack&&optimizeLabelStack(labelStack,getReactUFOPayloadVersion(interaction.type))});}),holdActive:_toConsumableArray(interaction.holdActive.values()),redirects:optimizeRedirects(interaction.redirects,start),holdInfo:optimizeHoldInfo(experimental?interaction.holdExpInfo:interaction.holdInfo,start,getReactUFOPayloadVersion(interaction.type)),spans:optimizeSpans(spans,start,getReactUFOPayloadVersion(interaction.type)),requestInfo:optimizeRequestInfo(interaction.requestInfo,start,getReactUFOPayloadVersion(interaction.type)),customTimings:optimizeCustomTimings(interaction.customTimings,start),bundleEvalTimings:objectToArray(getBundleEvalTimings(start)),resourceTimings:objectToArray(resourceTimings)};// Include third-party holds when feature flag is active
11
11
  if(shouldInclude3pHolds){var _interaction$hold3pIn;return _objectSpread(_objectSpread({},basePayload),{},{hold3pActive:interaction.hold3pActive?_toConsumableArray(interaction.hold3pActive.values()):[],hold3pInfo:optimizeHoldInfo((_interaction$hold3pIn=interaction.hold3pInfo)!==null&&_interaction$hold3pIn!==void 0?_interaction$hold3pIn:[],start,getReactUFOPayloadVersion(interaction.type))});}return basePayload;};// Page load & detailed payload
12
- getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$ssr2,_config$ssr2$getSSRTi;if(!isPageLoad||!isDetailedPayload){return{};}var initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());var config=getConfig();var defaultSSRTimings=objectToArray(ssr.getSSRTimings());var ssrTimingsFromConfig=config===null||config===void 0||(_config$ssr2=config.ssr)===null||_config$ssr2===void 0||(_config$ssr2$getSSRTi=_config$ssr2.getSSRTimings)===null||_config$ssr2$getSSRTi===void 0?void 0:_config$ssr2$getSSRTi.call(_config$ssr2);return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:ssrTimingsFromConfig?[].concat(_toConsumableArray(ssrTimingsFromConfig),_toConsumableArray(defaultSSRTimings)):defaultSSRTimings};};if(experimental){expTTAI=getTTAI(interaction);}else{regularTTAI=getTTAI(interaction);}newUFOName=sanitizeUfoName(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=29;break;}_context.next=28;return getVCMetrics(interaction);case 28:_context.t1=_context.sent;case 29:_context.t2=_context.t1;_context.t3=experimental?getExperimentalVCMetrics(interaction):Promise.resolve(undefined);_context.t4=getPaintMetricsToLegacyFormat(type,end);_context.t5=getBatteryInfoToLegacyFormat();_context.t6=[_context.t2,_context.t3,_context.t4,_context.t5];_context.next=36;return _context.t0.all.call(_context.t0,_context.t6);case 36:_yield$Promise$all=_context.sent;_yield$Promise$all2=_slicedToArray(_yield$Promise$all,4);finalVCMetrics=_yield$Promise$all2[0];experimentalMetrics=_yield$Promise$all2[1];paintMetrics=_yield$Promise$all2[2];batteryInfo=_yield$Promise$all2[3];if(!experimental){addPerformanceMeasures(interaction.start,_toConsumableArray((finalVCMetrics===null||finalVCMetrics===void 0?void 0:finalVCMetrics['ufo:vc:rev'])||[]));}getReactHydrationStats=function getReactHydrationStats(){if(!hydration){return{};}return{hydration:hydration};};payload={actionSubject:'experience',action:'measured',eventType:'operational',source:'measured',tags:['observability'],attributes:{properties:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({// basic
12
+ getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$ssr2,_config$ssr2$getSSRTi;if(!isPageLoad||!isDetailedPayload){return{};}var initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());var config=getConfig();var defaultSSRTimings=objectToArray(ssr.getSSRTimings());var ssrTimingsFromConfig=config===null||config===void 0||(_config$ssr2=config.ssr)===null||_config$ssr2===void 0||(_config$ssr2$getSSRTi=_config$ssr2.getSSRTimings)===null||_config$ssr2$getSSRTi===void 0?void 0:_config$ssr2$getSSRTi.call(_config$ssr2);return{initialPageLoadExtraTimings:initialPageLoadExtraTimings,SSRTimings:ssrTimingsFromConfig?[].concat(_toConsumableArray(ssrTimingsFromConfig),_toConsumableArray(defaultSSRTimings)):defaultSSRTimings};};if(experimental){expTTAI=getTTAI(interaction);}else{regularTTAI=getTTAI(interaction);}newUFOName=sanitizeUfoName(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=29;break;}_context.next=28;return getVCMetrics(interaction);case 28:_context.t1=_context.sent;case 29:_context.t2=_context.t1;_context.t3=experimental?getExperimentalVCMetrics(interaction):Promise.resolve(undefined);_context.t4=getPaintMetricsToLegacyFormat(type,end);_context.t5=getBatteryInfoToLegacyFormat();_context.t6=[_context.t2,_context.t3,_context.t4,_context.t5];_context.next=36;return _context.t0.all.call(_context.t0,_context.t6);case 36:_yield$Promise$all=_context.sent;_yield$Promise$all2=_slicedToArray(_yield$Promise$all,4);finalVCMetrics=_yield$Promise$all2[0];experimentalMetrics=_yield$Promise$all2[1];paintMetrics=_yield$Promise$all2[2];batteryInfo=_yield$Promise$all2[3];if(!experimental){addPerformanceMeasures(interaction.start,_toConsumableArray((finalVCMetrics===null||finalVCMetrics===void 0?void 0:finalVCMetrics['ufo:vc:rev'])||[]));}getReactHydrationStats=function getReactHydrationStats(){if(!hydration){return{};}return{hydration:hydration};};payload={actionSubject:'experience',action:'measured',eventType:'operational',source:'measured',tags:['observability'],attributes:{properties:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({// basic
13
13
  'event:hostname':((_window$location=window.location)===null||_window$location===void 0?void 0:_window$location.hostname)||'unknown','event:product':config.product,'event:population':config.population,'event:schema':'1.0.0','event:sizeInKb':0,'event:source':{name:'react-ufo/web',version:getReactUFOPayloadVersion(interaction.type)},'event:region':config.region||'unknown','experience:key':experimental?'custom.experimental-interaction-metrics':'custom.interaction-metrics','experience:name':newUFOName,// Include CPU usage monitoring data
14
- 'event:cpu:usage':createPressureStateReport(interaction.start,interaction.end),'event:memory:usage':createMemoryStateReport(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),{},{'ufo:pageVisibilityHiddenTimestamp':getEarliestHiddenTiming(interaction.start,interaction.end),'ufo:wasPageHiddenBeforeInit':getHasHiddenTimingBeforeSetup(),'ufo:isOpenedInBackground':isOpenedInBackground(interaction.type),'ufo:isTabThrottled':isTabThrottled(start,end)},fg('platform_ufo_page_visibility_timeline')?{'ufo:pageVisibilityTimeline':getPageVisibilityTimeline(start,end)}:{}),fg('ufo_detect_aborting_interaction_during_ssr')?{'ufo:hasAbortingInteractionDuringSSR':getHasAbortingEventDuringSSR()}:{}),getBrowserMetadataToLegacyFormat()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),getNavigationMetricsToLegacyFormat(type)),finalVCMetrics),experimentalMetrics),(_config$additionalPay=config.additionalPayloadData)===null||_config$additionalPay===void 0?void 0:_config$additionalPay.call(config,interaction)),getTracingContextData(interaction)),getStylesheetMetrics()),getErrorCounts(interaction)),getReactHydrationStats()),{},{interactionMetrics:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId:interactionId,pageVisibilityAtTTI:pageVisibilityAtTTI,pageVisibilityAtTTAI:pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
14
+ 'event:cpu:usage':createPressureStateReport(interaction.start,interaction.end),'event:memory:usage':createMemoryStateReport(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),{},{'ufo:pageVisibilityHiddenTimestamp':getEarliestHiddenTiming(interaction.start,interaction.end),'ufo:wasPageHiddenBeforeInit':getHasHiddenTimingBeforeSetup(),'ufo:isOpenedInBackground':isOpenedInBackground(interaction.type),'ufo:isTabThrottled':isTabThrottled(start,end),'ufo:pageVisibilityTimeline':getPageVisibilityTimeline(start,end)},fg('ufo_detect_aborting_interaction_during_ssr')?{'ufo:hasAbortingInteractionDuringSSR':getHasAbortingEventDuringSSR()}:{}),getBrowserMetadataToLegacyFormat()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),getNavigationMetricsToLegacyFormat(type)),finalVCMetrics),experimentalMetrics),(_config$additionalPay=config.additionalPayloadData)===null||_config$additionalPay===void 0?void 0:_config$additionalPay.call(config,interaction)),getTracingContextData(interaction)),getStylesheetMetrics()),getErrorCounts(interaction)),getReactHydrationStats()),{},{interactionMetrics:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId:interactionId,pageVisibilityAtTTI:pageVisibilityAtTTI,pageVisibilityAtTTAI:pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
15
15
  rate:rate,routeName:routeName,type:type,abortReason:abortReason,featureFlags:featureFlags,previousInteractionName:previousInteractionName,isPreviousInteractionAborted:isPreviousInteractionAborted,abortedByInteractionName:abortedByInteractionName,// performance
16
16
  apdex:optimizeApdex(interaction.apdex,getReactUFOPayloadVersion(interaction.type)),end:Math.round(end)},interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),{},{start:Math.round(start),segments:getReactUFOPayloadVersion(interaction.type)==='2.0.0'?segmentTree:getOldSegmentsLabelStack(segments,interaction.type),marks:optimizeMarks(interaction.marks,getReactUFOPayloadVersion(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:optimizeReactProfilerTimings(interaction.reactProfilerTimings,start,getReactUFOPayloadVersion(interaction.type)),minorInteractions:interaction.minorInteractions},responsiveness?{responsiveness:responsiveness}:{}),labelStack),pageLoadInteractionMetrics),getDetailedInteractionMetrics(resourceTimings)),getPageLoadDetailedInteractionMetrics()),getBm3TrackerTimings(interaction)),{},{'metric:ttai':experimental?regularTTAI||expTTAI:undefined,'metric:experimental:ttai':expTTAI},unknownElementName?{unknownElementName:unknownElementName}:{}),unknownElementHierarchy?{unknownElementHierarchy:unknownElementHierarchy}:{}),'ufo:payloadTime':roundEpsilon(performance.now()-interactionPayloadStart)})}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if(fg('platform_ufo_enable_vc_raw_data')){size=getPayloadSize(payload.attributes.properties);vcRev=payload.attributes.properties['ufo:vc:rev'];rawData=vcRev.find(function(item){return item.revision==='raw-handler';});if(rawData){rawDataSize=getPayloadSize(rawData);payload.attributes.properties['ufo:vc:raw:size']=rawDataSize;if(size>MAX_PAYLOAD_SIZE&&Array.isArray(vcRev)&&vcRev.length>0){payload.attributes.properties['ufo:vc:rev']=vcRev.filter(function(item){return item.revision!=='raw-handler';});payload.attributes.properties['ufo:vc:raw:removed']=true;}}payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}// in order of importance, first one being least important
17
17
  // we can add more fields as necessary
@@ -22,7 +22,7 @@ import InteractionContext from '@atlaskit/interaction-context';
22
22
  * Has an `ignore` prop, to allow you to use it conditionally
23
23
  * Has a `reason` prop, to specify why the hold is being ignored
24
24
  */
25
- export default function UFOIgnoreHolds(_ref) {
25
+ var UFOIgnoreHolds = function UFOIgnoreHolds(_ref) {
26
26
  var children = _ref.children,
27
27
  _ref$ignore = _ref.ignore,
28
28
  ignore = _ref$ignore === void 0 ? true : _ref$ignore;
@@ -48,4 +48,6 @@ export default function UFOIgnoreHolds(_ref) {
48
48
  return /*#__PURE__*/React.createElement(InteractionContext.Provider, {
49
49
  value: ignoredInteractionContext
50
50
  }, kids);
51
- }
51
+ };
52
+ UFOIgnoreHolds.displayName = 'UFOIgnoreHolds';
53
+ export default UFOIgnoreHolds;
@@ -21,7 +21,7 @@ var tryCompleteHandle;
21
21
  var hasMarkedFirstSegmentLoad = false;
22
22
 
23
23
  /** A portion of the page we apply measurement to */
24
- export default function UFOSegment(_ref) {
24
+ var UFOSegment = function UFOSegment(_ref) {
25
25
  var segmentName = _ref.name,
26
26
  children = _ref.children,
27
27
  _ref$mode = _ref.mode,
@@ -293,4 +293,6 @@ export default function UFOSegment(_ref) {
293
293
  }, ufoSegment);
294
294
  }
295
295
  return ufoSegment;
296
- }
296
+ };
297
+ UFOSegment.displayName = 'UFOSegment';
298
+ export default UFOSegment;
@@ -5,7 +5,7 @@ import React from 'react';
5
5
  import { fg } from '@atlaskit/platform-feature-flags';
6
6
  import UFOIgnoreHolds from '../ignore-holds';
7
7
  import UFOSegment from './segment';
8
- export function UFOThirdPartySegment(props) {
8
+ export var UFOThirdPartySegment = function UFOThirdPartySegment(props) {
9
9
  var children = props.children,
10
10
  otherProps = _objectWithoutProperties(props, _excluded);
11
11
  return fg('platform_ufo_enable_ttai_with_3p') ? /*#__PURE__*/React.createElement(UFOSegment, _extends({
@@ -16,4 +16,5 @@ export function UFOThirdPartySegment(props) {
16
16
  ignore: fg('platform_ufo_exclude_3p_elements_from_ttai'),
17
17
  reason: "third-party-element"
18
18
  }, children));
19
- }
19
+ };
20
+ UFOThirdPartySegment.displayName = 'UFOThirdPartySegment';
@@ -268,7 +268,7 @@ var ViewportObserver = /*#__PURE__*/function () {
268
268
  _context2.prev = 4;
269
269
  _loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop() {
270
270
  var _this$getSSRState, _this$intersectionObs;
271
- var addedNodeRef, addedNode, hasSameDeletedNode, _checkWithinComponent, isWithinThirdPartySegment, isWithinSmartAnswersSegment, isTargetReactRoot;
271
+ var addedNodeRef, addedNode, hasSameDeletedNode, _ref7, isWithinThirdPartySegment, isWithinSmartAnswersSegment, isTargetReactRoot;
272
272
  return _regeneratorRuntime.wrap(function _loop$(_context) {
273
273
  while (1) switch (_context.prev = _context.next) {
274
274
  case 0:
@@ -287,7 +287,9 @@ var ViewportObserver = /*#__PURE__*/function () {
287
287
  }
288
288
  return n.isEqualNode(addedNode);
289
289
  });
290
- _checkWithinComponent = checkWithinComponent(addedNode, 'UFOThirdPartySegment', _this.mapIs3pResult), isWithinThirdPartySegment = _checkWithinComponent.isWithin;
290
+ _ref7 = _this.enableThirdPartyTracking ? checkWithinComponent(addedNode, 'UFOThirdPartySegment', _this.mapIs3pResult) : {
291
+ isWithin: false
292
+ }, isWithinThirdPartySegment = _ref7.isWithin;
291
293
  isWithinSmartAnswersSegment = Boolean(_this.shouldCheckSmartAnswersMutations() && isContainedWithinSmartAnswers(addedNode));
292
294
  isTargetReactRoot = targetNode === ((_this$getSSRState = _this.getSSRState) === null || _this$getSSRState === void 0 || (_this$getSSRState = _this$getSSRState.call(_this)) === null || _this$getSSRState === void 0 ? void 0 : _this$getSSRState.reactRootElement);
293
295
  (_this$intersectionObs = _this.intersectionObserver) === null || _this$intersectionObs === void 0 || _this$intersectionObs.watchAndTag(addedNode, (_this.trackLayoutShiftOffenders ? createElementMutationsWatcherNew : createElementMutationsWatcher)(removedNodeRects, isWithinThirdPartySegment, isWithinSmartAnswersSegment, !!hasSameDeletedNode, timestamp, isTargetReactRoot, _this.getSSRState, _this.getSSRPlaceholderHandler));
@@ -334,16 +336,16 @@ var ViewportObserver = /*#__PURE__*/function () {
334
336
  return _ref6.apply(this, arguments);
335
337
  };
336
338
  }());
337
- _defineProperty(this, "handleAttributeMutation", function (_ref7) {
339
+ _defineProperty(this, "handleAttributeMutation", function (_ref8) {
338
340
  var _this$intersectionObs2;
339
- var target = _ref7.target,
340
- attributeName = _ref7.attributeName,
341
- oldValue = _ref7.oldValue,
342
- newValue = _ref7.newValue,
343
- timestamp = _ref7.timestamp;
344
- (_this$intersectionObs2 = _this.intersectionObserver) === null || _this$intersectionObs2 === void 0 || _this$intersectionObs2.watchAndTag(target, function (_ref8) {
345
- var target = _ref8.target,
346
- rect = _ref8.rect;
341
+ var target = _ref8.target,
342
+ attributeName = _ref8.attributeName,
343
+ oldValue = _ref8.oldValue,
344
+ newValue = _ref8.newValue,
345
+ timestamp = _ref8.timestamp;
346
+ (_this$intersectionObs2 = _this.intersectionObserver) === null || _this$intersectionObs2 === void 0 || _this$intersectionObs2.watchAndTag(target, function (_ref9) {
347
+ var target = _ref9.target,
348
+ rect = _ref9.rect;
347
349
  if (isContainedWithinMediaWrapper(target)) {
348
350
  return {
349
351
  type: 'mutation:media',
@@ -356,8 +358,10 @@ var ViewportObserver = /*#__PURE__*/function () {
356
358
  };
357
359
  }
358
360
  if (fg('platform_ufo_exclude_3p_attribute_changes')) {
359
- var _checkWithinComponent2 = checkWithinComponent(target, 'UFOThirdPartySegment', _this.mapIs3pResult),
360
- isWithinThirdPartySegment = _checkWithinComponent2.isWithin;
361
+ var _ref0 = _this.enableThirdPartyTracking ? checkWithinComponent(target, 'UFOThirdPartySegment', _this.mapIs3pResult) : {
362
+ isWithin: false
363
+ },
364
+ isWithinThirdPartySegment = _ref0.isWithin;
361
365
  if (isWithinThirdPartySegment) {
362
366
  return {
363
367
  type: 'mutation:third-party-attribute',
@@ -462,9 +466,9 @@ var ViewportObserver = /*#__PURE__*/function () {
462
466
  };
463
467
  });
464
468
  });
465
- _defineProperty(this, "handleLayoutShift", function (_ref9) {
466
- var time = _ref9.time,
467
- changedRects = _ref9.changedRects;
469
+ _defineProperty(this, "handleLayoutShift", function (_ref1) {
470
+ var time = _ref1.time,
471
+ changedRects = _ref1.changedRects;
468
472
  var _iterator2 = _createForOfIteratorHelper(changedRects),
469
473
  _step2;
470
474
  try {
@@ -506,6 +510,7 @@ var ViewportObserver = /*#__PURE__*/function () {
506
510
  this.getSSRState = getSSRState;
507
511
  this.getSSRPlaceholderHandler = getSSRPlaceholderHandler;
508
512
  this.searchPageConfig = searchPageConfig;
513
+ this.enableThirdPartyTracking = fg('platform_ufo_reenable_3p_tracking');
509
514
  }
510
515
  return _createClass(ViewportObserver, [{
511
516
  key: "initializeObservers",
@@ -121,7 +121,7 @@ export type ReactUFOPayload = {
121
121
  'ufo:wasPageHiddenBeforeInit'?: boolean;
122
122
  'ufo:isOpenedInBackground'?: boolean;
123
123
  'ufo:isTabThrottled'?: boolean;
124
- 'ufo:pageVisibilityTimeline'?: HiddenTimingItem[];
124
+ 'ufo:pageVisibilityTimeline': HiddenTimingItem[];
125
125
  interactionMetrics: {
126
126
  namePrefix: string;
127
127
  segmentPrefix: string;
@@ -36,7 +36,8 @@ type Rates = {
36
36
  readonly [key: string]: number;
37
37
  };
38
38
  export type TTVCRevision = 'fy25.01' | 'fy25.02' | 'fy25.03' | 'fy26.04' | 'next';
39
- export declare const DEFAULT_TTVC_REVISION = "fy25.03";
39
+ export declare const DEFAULT_TTVC_REVISION = "fy26.04";
40
+ export declare function getDefaultTTVCRevision(): TTVCRevision;
40
41
  export declare const UNKNOWN_INTERACTION_RATE = 1000;
41
42
  export type ReactHydrationStats = {
42
43
  /**
@@ -24,4 +24,8 @@ export type UFOIgnoreHoldsProps = {
24
24
  * Has an `ignore` prop, to allow you to use it conditionally
25
25
  * Has a `reason` prop, to specify why the hold is being ignored
26
26
  */
27
- export default function UFOIgnoreHolds({ children, ignore, }: UFOIgnoreHoldsProps): React.JSX.Element;
27
+ declare const UFOIgnoreHolds: {
28
+ (props: UFOIgnoreHoldsProps): React.JSX.Element;
29
+ displayName: string;
30
+ };
31
+ export default UFOIgnoreHolds;
@@ -7,4 +7,8 @@ export type Props = {
7
7
  type?: UFOSegmentType;
8
8
  };
9
9
  /** A portion of the page we apply measurement to */
10
- export default function UFOSegment({ name: segmentName, children, mode, type, }: Props): React.JSX.Element;
10
+ declare const UFOSegment: {
11
+ (props: Props): React.JSX.Element;
12
+ displayName: string;
13
+ };
14
+ export default UFOSegment;
@@ -1,3 +1,6 @@
1
1
  import React from 'react';
2
2
  import { type Props as SegmentProps } from './segment';
3
- export declare function UFOThirdPartySegment(props: Omit<SegmentProps, 'type'>): React.JSX.Element;
3
+ export declare const UFOThirdPartySegment: {
4
+ (props: Omit<SegmentProps, 'type'>): React.JSX.Element;
5
+ displayName: string;
6
+ };
@@ -26,6 +26,7 @@ export default class ViewportObserver {
26
26
  private isStarted;
27
27
  private trackLayoutShiftOffenders;
28
28
  private searchPageConfig;
29
+ private enableThirdPartyTracking;
29
30
  private getSSRState?;
30
31
  private getSSRPlaceholderHandler?;
31
32
  constructor({ onChange, getSSRState, getSSRPlaceholderHandler, trackLayoutShiftOffenders, searchPageConfig, }: ViewPortObserverConstructorArgs);
@@ -123,7 +123,7 @@ export type ReactUFOPayload = {
123
123
  'ufo:wasPageHiddenBeforeInit'?: boolean;
124
124
  'ufo:isOpenedInBackground'?: boolean;
125
125
  'ufo:isTabThrottled'?: boolean;
126
- 'ufo:pageVisibilityTimeline'?: HiddenTimingItem[];
126
+ 'ufo:pageVisibilityTimeline': HiddenTimingItem[];
127
127
  interactionMetrics: {
128
128
  namePrefix: string;
129
129
  segmentPrefix: string;
@@ -36,7 +36,8 @@ type Rates = {
36
36
  readonly [key: string]: number;
37
37
  };
38
38
  export type TTVCRevision = 'fy25.01' | 'fy25.02' | 'fy25.03' | 'fy26.04' | 'next';
39
- export declare const DEFAULT_TTVC_REVISION = "fy25.03";
39
+ export declare const DEFAULT_TTVC_REVISION = "fy26.04";
40
+ export declare function getDefaultTTVCRevision(): TTVCRevision;
40
41
  export declare const UNKNOWN_INTERACTION_RATE = 1000;
41
42
  export type ReactHydrationStats = {
42
43
  /**
@@ -24,4 +24,8 @@ export type UFOIgnoreHoldsProps = {
24
24
  * Has an `ignore` prop, to allow you to use it conditionally
25
25
  * Has a `reason` prop, to specify why the hold is being ignored
26
26
  */
27
- export default function UFOIgnoreHolds({ children, ignore, }: UFOIgnoreHoldsProps): React.JSX.Element;
27
+ declare const UFOIgnoreHolds: {
28
+ (props: UFOIgnoreHoldsProps): React.JSX.Element;
29
+ displayName: string;
30
+ };
31
+ export default UFOIgnoreHolds;
@@ -7,4 +7,8 @@ export type Props = {
7
7
  type?: UFOSegmentType;
8
8
  };
9
9
  /** A portion of the page we apply measurement to */
10
- export default function UFOSegment({ name: segmentName, children, mode, type, }: Props): React.JSX.Element;
10
+ declare const UFOSegment: {
11
+ (props: Props): React.JSX.Element;
12
+ displayName: string;
13
+ };
14
+ export default UFOSegment;
@@ -1,3 +1,6 @@
1
1
  import React from 'react';
2
2
  import { type Props as SegmentProps } from './segment';
3
- export declare function UFOThirdPartySegment(props: Omit<SegmentProps, 'type'>): React.JSX.Element;
3
+ export declare const UFOThirdPartySegment: {
4
+ (props: Omit<SegmentProps, 'type'>): React.JSX.Element;
5
+ displayName: string;
6
+ };
@@ -26,6 +26,7 @@ export default class ViewportObserver {
26
26
  private isStarted;
27
27
  private trackLayoutShiftOffenders;
28
28
  private searchPageConfig;
29
+ private enableThirdPartyTracking;
29
30
  private getSSRState?;
30
31
  private getSSRPlaceholderHandler?;
31
32
  constructor({ onChange, getSSRState, getSSRPlaceholderHandler, trackLayoutShiftOffenders, searchPageConfig, }: ViewPortObserverConstructorArgs);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/react-ufo",
3
- "version": "5.4.0",
3
+ "version": "5.4.2",
4
4
  "description": "Parts of React UFO that are publicly available",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -206,8 +206,14 @@
206
206
  "platform_ufo_enable_killswitch_config": {
207
207
  "type": "boolean"
208
208
  },
209
+ "ufo_update_and_enforce_ttvc_v4_default_version": {
210
+ "type": "boolean"
211
+ },
209
212
  "platform_ufo_page_visibility_timeline": {
210
213
  "type": "boolean"
214
+ },
215
+ "platform_ufo_reenable_3p_tracking": {
216
+ "type": "boolean"
211
217
  }
212
218
  }
213
219
  }