@atlaskit/react-ufo 5.2.9 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/create-payload/index.js +6 -5
  3. package/dist/cjs/hidden-timing/index.js +52 -0
  4. package/dist/cjs/interaction-metrics/index.js +1 -0
  5. package/dist/cjs/interaction-metrics-init/index.js +2 -1
  6. package/dist/cjs/vc/index.js +4 -2
  7. package/dist/cjs/vc/vc-observer-new/index.js +10 -4
  8. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +84 -29
  9. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/detect-layout-shift-cause.js +164 -0
  10. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +173 -34
  11. package/dist/cjs/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +1 -1
  12. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +2 -1
  13. package/dist/es2019/create-payload/index.js +5 -3
  14. package/dist/es2019/hidden-timing/index.js +51 -0
  15. package/dist/es2019/interaction-metrics/index.js +1 -0
  16. package/dist/es2019/interaction-metrics-init/index.js +2 -1
  17. package/dist/es2019/vc/index.js +4 -2
  18. package/dist/es2019/vc/vc-observer-new/index.js +10 -5
  19. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +61 -7
  20. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/detect-layout-shift-cause.js +138 -0
  21. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +145 -10
  22. package/dist/es2019/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +1 -1
  23. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +2 -1
  24. package/dist/esm/create-payload/index.js +7 -6
  25. package/dist/esm/hidden-timing/index.js +51 -0
  26. package/dist/esm/interaction-metrics/index.js +1 -0
  27. package/dist/esm/interaction-metrics-init/index.js +2 -1
  28. package/dist/esm/vc/index.js +4 -2
  29. package/dist/esm/vc/vc-observer-new/index.js +10 -4
  30. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +84 -29
  31. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/detect-layout-shift-cause.js +158 -0
  32. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +173 -34
  33. package/dist/esm/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +1 -1
  34. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +2 -1
  35. package/dist/types/common/react-ufo-payload-schema.d.ts +2 -0
  36. package/dist/types/common/vc/types.d.ts +55 -0
  37. package/dist/types/config/index.d.ts +1 -0
  38. package/dist/types/hidden-timing/index.d.ts +9 -0
  39. package/dist/types/vc/types.d.ts +2 -0
  40. package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
  41. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  42. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +1 -0
  43. package/dist/types/vc/vc-observer-new/metric-calculator/utils/detect-layout-shift-cause.d.ts +31 -0
  44. package/dist/types/vc/vc-observer-new/types.d.ts +2 -0
  45. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +3 -1
  46. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +1 -0
  47. package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +5 -2
  48. package/dist/types-ts4.5/common/react-ufo-payload-schema.d.ts +2 -0
  49. package/dist/types-ts4.5/common/vc/types.d.ts +55 -0
  50. package/dist/types-ts4.5/config/index.d.ts +1 -0
  51. package/dist/types-ts4.5/hidden-timing/index.d.ts +9 -0
  52. package/dist/types-ts4.5/vc/types.d.ts +2 -0
  53. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
  54. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  55. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +1 -0
  56. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/detect-layout-shift-cause.d.ts +31 -0
  57. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +2 -0
  58. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +3 -1
  59. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +1 -0
  60. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +5 -2
  61. package/package.json +4 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 5.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`f3d9985c540ec`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f3d9985c540ec) -
8
+ Add page visibility timeline to UFO payload behind platform_ufo_page_visibility_timeline feature
9
+ gate. New getPageVisibilityTimeline export from hidden-timing module returns visibility state
10
+ transitions within a time window.
11
+
12
+ ## 5.2.10
13
+
14
+ ### Patch Changes
15
+
16
+ - [`06d7af199b6c7`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/06d7af199b6c7) -
17
+ Added experimental API to track VC offenders
18
+
3
19
  ## 5.2.9
4
20
 
5
21
  ### Patch Changes
@@ -5,19 +5,20 @@ return{'event:assets':assets};}return{};}catch(_unused2){// Skip CHR in case of
5
5
  return{};}}function getTracingContextData(interaction){var trace=interaction.trace,start=interaction.start;var tracingContextData={};if(trace){tracingContextData={'ufo:tracingContext':{'X-B3-TraceId':trace.traceId,'X-B3-SpanId':trace.spanId,// eslint-disable-next-line compat/compat
6
6
  browserTimeOrigin:+(performance.timeOrigin+start).toFixed(2)}};}return tracingContextData;}function optimizeCustomData(interaction){var customData=interaction.customData,cohortingCustomData=interaction.cohortingCustomData,legacyMetrics=interaction.legacyMetrics;var customDataMap=customData.reduce(function(result,_ref){var _result$get$data,_result$get;var labelStack=_ref.labelStack,data=_ref.data;var label=(0,_utils.stringifyLabelStackFully)(labelStack);var value=(_result$get$data=(_result$get=result.get(label))===null||_result$get===void 0?void 0:_result$get.data)!==null&&_result$get$data!==void 0?_result$get$data:{};result.set(label,{labelStack:(0,_utils.optimizeLabelStack)(labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),data:Object.assign(value,data)});return result;},new Map());// Merge cohorting custom data into the same map
7
7
  if(cohortingCustomData&&cohortingCustomData.size>0){var _interaction$labelSta,_customDataMap$get$da,_customDataMap$get,_interaction$labelSta2;var label=(0,_utils.stringifyLabelStackFully)((_interaction$labelSta=interaction.labelStack)!==null&&_interaction$labelSta!==void 0?_interaction$labelSta:[]);var value=(_customDataMap$get$da=(_customDataMap$get=customDataMap.get(label))===null||_customDataMap$get===void 0?void 0:_customDataMap$get.data)!==null&&_customDataMap$get$da!==void 0?_customDataMap$get$da:{};customDataMap.set(label,{labelStack:(0,_utils.optimizeLabelStack)((_interaction$labelSta2=interaction.labelStack)!==null&&_interaction$labelSta2!==void 0?_interaction$labelSta2:[],(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),data:Object.assign(value,Object.fromEntries(cohortingCustomData))});}if(legacyMetrics){var legacyMetricsFiltered=legacyMetrics.filter(function(item){return item.type==='PAGE_LOAD';}).reduce(function(result,currentValue){for(var _i=0,_Object$entries=Object.entries(currentValue.custom||{});_i<_Object$entries.length;_i++){var _result$get$data2,_result$get2;var _Object$entries$_i=(0,_slicedToArray2.default)(_Object$entries[_i],2),key=_Object$entries$_i[0],_value=_Object$entries$_i[1];var _label=(0,_utils.stringifyLabelStackFully)([]);var labelValue=(_result$get$data2=(_result$get2=result.get(_label))===null||_result$get2===void 0?void 0:_result$get2.data)!==null&&_result$get$data2!==void 0?_result$get$data2:{};result.set(_label,{labelStack:(0,_utils.optimizeLabelStack)([],(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),data:Object.assign(labelValue,(0,_defineProperty2.default)({},key,_value))});}return result;},new Map());return[].concat((0,_toConsumableArray2.default)(customDataMap.values()),(0,_toConsumableArray2.default)(legacyMetricsFiltered.values()));}return(0,_toConsumableArray2.default)(customDataMap.values());}function optimizeRedirects(redirects,interactionStart){var lastRedirectTime=interactionStart;var updatedRedirects=redirects.sort(function(a,b){return a.time-b.time;}).reduce(function(result,redirect){var fromInteractionName=redirect.fromInteractionName,time=redirect.time;if(lastRedirectTime>=interactionStart){result.push({labelStack:[{n:fromInteractionName}],startTime:Math.round(lastRedirectTime),endTime:Math.round(time)});}lastRedirectTime=time;return result;},[]);return updatedRedirects;}function objectToArray(){var obj=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return Object.keys(obj).reduce(function(result,key){result.push({label:key,data:obj[key]});return result;},[]);}function getBM3SubmetricsTimings(submetrics){if(!submetrics){return null;}var submetricsTimings=submetrics.filter(function(item){return typeof item.stop==='number'&&!!item.key&&typeof item.start==='number';}).map(function(item){var childSubmetrics;var newKey="include/".concat(item.key);if(item.submetrics){childSubmetrics=getBM3SubmetricsTimings(item.submetrics);}return _objectSpread((0,_defineProperty2.default)({},newKey,{endTime:item.stop-item.start,startTime:item.start}),childSubmetrics?childSubmetrics:{});});return submetricsTimings;}function getBm3TrackerTimings(interaction){var interactionLegacyMetrics=interaction.legacyMetrics;if(!interactionLegacyMetrics){return{};}var legacyMetrics=interactionLegacyMetrics.map(function(item){var _item$config,_item$config2,_item$marks;return{key:item.key,startTime:item.start,stopTime:item.stop,type:(_item$config=item.config)===null||_item$config===void 0?void 0:_item$config.type,reactUFOName:(_item$config2=item.config)===null||_item$config2===void 0?void 0:_item$config2.reactUFOName,fmp:((_item$marks=item.marks)===null||_item$marks===void 0?void 0:_item$marks['fmp'])||item.stop,source:'bm3',timings:(0,_customTimings.getBm3Timings)(item.marks,item.config.timings),submetrics:getBM3SubmetricsTimings(item.submetrics),pageVisibleState:item.pageVisibleState};}).filter(function(item){return!!item.type;});return{legacyMetrics:legacyMetrics};}function getStylesheetMetrics(){try{var doc=(0,_browserApis.getDocument)();if(!doc){return{};}var stylesheets=Array.from(doc.styleSheets);var stylesheetCount=stylesheets.length;var cssrules=Array.from(doc.styleSheets).reduce(function(acc,item){// Other domain stylesheets throw a SecurityError
8
- try{return acc+item.cssRules.length;}catch(_unused3){return acc;}},0);var styleElements=doc.querySelectorAll('style').length;var styleProps=doc.querySelectorAll('[style]');var styleDeclarations=Array.from(doc.querySelectorAll('[style]')).reduce(function(acc,item){try{if('style'in item){return acc+item.style.length;}else{return acc;}}catch(_unused4){return acc;}},0);return{'ufo:stylesheets':stylesheetCount,'ufo:styleElements':styleElements,'ufo:styleProps':styleProps.length,'ufo:styleDeclarations':styleDeclarations,'ufo:cssrules':cssrules};}catch(_unused5){return{};}}var regularTTAI;var expTTAI;function getErrorCounts(interaction){return{'ufo:errors:globalCount':(0,_globalErrorHandler.getGlobalErrorCount)(),'ufo:errors:count':interaction.errors.length};}function createInteractionMetricsPayload(_x,_x2,_x3,_x4,_x5){return _createInteractionMetricsPayload.apply(this,arguments);}function _createInteractionMetricsPayload(){_createInteractionMetricsPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(interaction,interactionId,experimental,criticalPayloadCount,vcMetrics){var _config$enableBetterP,_window$location,_config$additionalPay;var interactionPayloadStart,config,end,start,ufoName,knownSegments,rate,type,abortReason,routeName,featureFlags,previousInteractionName,isPreviousInteractionAborted,abortedByInteractionName,responsiveness,unknownElementName,unknownElementHierarchy,hydration,pageVisibilityAtTTI,pageVisibilityAtTTAI,segments,segmentTree,isDetailedPayload,isPageLoadEvent,isPageLoad,calculatePageVisibilityFromTheStartOfPageLoad,moreAccuratePageVisibilityAtTTI,moreAccuratePageVisibilityAtTTAI,labelStack,getInitialPageLoadSSRMetrics,pageLoadInteractionMetrics,getDetailedInteractionMetrics,getPageLoadDetailedInteractionMetrics,newUFOName,resourceTimings,_yield$Promise$all,_yield$Promise$all2,finalVCMetrics,experimentalMetrics,paintMetrics,batteryInfo,getReactHydrationStats,payload,size,vcRev,rawData,rawDataSize,interactionMetricsFieldsToTrim,properties,interactionMetrics,_iterator,_step,field,trimmedFields,isVCRevisionTrimEnabled;return _regenerator.default.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:interactionPayloadStart=performance.now();config=(0,_config.getConfig)();if(config){_context.next=4;break;}throw Error('UFO Configuration not provided');case 4:end=interaction.end,start=interaction.start,ufoName=interaction.ufoName,knownSegments=interaction.knownSegments,rate=interaction.rate,type=interaction.type,abortReason=interaction.abortReason,routeName=interaction.routeName,featureFlags=interaction.featureFlags,previousInteractionName=interaction.previousInteractionName,isPreviousInteractionAborted=interaction.isPreviousInteractionAborted,abortedByInteractionName=interaction.abortedByInteractionName,responsiveness=interaction.responsiveness,unknownElementName=interaction.unknownElementName,unknownElementHierarchy=interaction.unknownElementHierarchy,hydration=interaction.hydration;pageVisibilityAtTTI=getPageVisibilityUpToTTI(interaction);pageVisibilityAtTTAI=(0,_getPageVisibilityUpToTtai.default)(interaction);segments=!(0,_platformFeatureFlags.fg)('platform_ufo_remove_deprecated_config_fields')&&config.killswitchNestedSegments?[]:knownSegments;segmentTree=(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?(0,_utils.buildSegmentTree)(segments.map(function(segment){return segment.labelStack;})):{};isDetailedPayload=pageVisibilityAtTTAI==='visible';isPageLoadEvent=type==='page_load'||type==='transition';isPageLoad=type==='page_load';calculatePageVisibilityFromTheStartOfPageLoad=((_config$enableBetterP=config.enableBetterPageVisibilityApi)!==null&&_config$enableBetterP!==void 0?_config$enableBetterP:(0,_platformFeatureFlags.fg)('platform_enable_better_page_visibility'))&&isPageLoadEvent;moreAccuratePageVisibilityAtTTI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTI(interaction):null;moreAccuratePageVisibilityAtTTAI=calculatePageVisibilityFromTheStartOfPageLoad?(0,_getMoreAccuratePageVisibilityUpToTtai.getMoreAccuratePageVisibilityUpToTTAI)(interaction):null;labelStack=interaction.labelStack?{labelStack:(0,_utils.optimizeLabelStack)(interaction.labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type))}:{};// Page Load
8
+ try{return acc+item.cssRules.length;}catch(_unused3){return acc;}},0);var styleElements=doc.querySelectorAll('style').length;var styleProps=doc.querySelectorAll('[style]');var styleDeclarations=Array.from(doc.querySelectorAll('[style]')).reduce(function(acc,item){try{if('style'in item){return acc+item.style.length;}else{return acc;}}catch(_unused4){return acc;}},0);return{'ufo:stylesheets':stylesheetCount,'ufo:styleElements':styleElements,'ufo:styleProps':styleProps.length,'ufo:styleDeclarations':styleDeclarations,'ufo:cssrules':cssrules};}catch(_unused5){return{};}}var regularTTAI;var expTTAI;function getErrorCounts(interaction){return{'ufo:errors:globalCount':(0,_globalErrorHandler.getGlobalErrorCount)(),'ufo:errors:count':interaction.errors.length};}function createInteractionMetricsPayload(_x,_x2,_x3,_x4,_x5){return _createInteractionMetricsPayload.apply(this,arguments);}function _createInteractionMetricsPayload(){_createInteractionMetricsPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(interaction,interactionId,experimental,criticalPayloadCount,vcMetrics){var _config$enableBetterP,_window$location,_config$additionalPay;var interactionPayloadStart,config,end,start,ufoName,knownSegments,rate,type,abortReason,routeName,featureFlags,previousInteractionName,isPreviousInteractionAborted,abortedByInteractionName,responsiveness,unknownElementName,unknownElementHierarchy,hydration,pageVisibilityAtTTI,pageVisibilityAtTTAI,segments,segmentTree,isDetailedPayload,isPageLoadEvent,isPageLoad,calculatePageVisibilityFromTheStartOfPageLoad,moreAccuratePageVisibilityAtTTI,moreAccuratePageVisibilityAtTTAI,labelStack,getInitialPageLoadSSRMetrics,pageLoadInteractionMetrics,getDetailedInteractionMetrics,getPageLoadDetailedInteractionMetrics,newUFOName,resourceTimings,_yield$Promise$all,_yield$Promise$all2,finalVCMetrics,experimentalMetrics,paintMetrics,batteryInfo,getReactHydrationStats,payload,size,vcRev,rawData,rawDataSize,interactionMetricsFieldsToTrim,topLevelFieldsToTrim,properties,interactionMetrics,_iterator,_step,field,trimmedFields,_i2,_topLevelFieldsToTrim,_field,_trimmedFields,isVCRevisionTrimEnabled;return _regenerator.default.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:interactionPayloadStart=performance.now();config=(0,_config.getConfig)();if(config){_context.next=4;break;}throw Error('UFO Configuration not provided');case 4:end=interaction.end,start=interaction.start,ufoName=interaction.ufoName,knownSegments=interaction.knownSegments,rate=interaction.rate,type=interaction.type,abortReason=interaction.abortReason,routeName=interaction.routeName,featureFlags=interaction.featureFlags,previousInteractionName=interaction.previousInteractionName,isPreviousInteractionAborted=interaction.isPreviousInteractionAborted,abortedByInteractionName=interaction.abortedByInteractionName,responsiveness=interaction.responsiveness,unknownElementName=interaction.unknownElementName,unknownElementHierarchy=interaction.unknownElementHierarchy,hydration=interaction.hydration;pageVisibilityAtTTI=getPageVisibilityUpToTTI(interaction);pageVisibilityAtTTAI=(0,_getPageVisibilityUpToTtai.default)(interaction);segments=!(0,_platformFeatureFlags.fg)('platform_ufo_remove_deprecated_config_fields')&&config.killswitchNestedSegments?[]:knownSegments;segmentTree=(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?(0,_utils.buildSegmentTree)(segments.map(function(segment){return segment.labelStack;})):{};isDetailedPayload=pageVisibilityAtTTAI==='visible';isPageLoadEvent=type==='page_load'||type==='transition';isPageLoad=type==='page_load';calculatePageVisibilityFromTheStartOfPageLoad=((_config$enableBetterP=config.enableBetterPageVisibilityApi)!==null&&_config$enableBetterP!==void 0?_config$enableBetterP:(0,_platformFeatureFlags.fg)('platform_enable_better_page_visibility'))&&isPageLoadEvent;moreAccuratePageVisibilityAtTTI=calculatePageVisibilityFromTheStartOfPageLoad?getMoreAccuratePageVisibilityUpToTTI(interaction):null;moreAccuratePageVisibilityAtTTAI=calculatePageVisibilityFromTheStartOfPageLoad?(0,_getMoreAccuratePageVisibilityUpToTtai.getMoreAccuratePageVisibilityUpToTTAI)(interaction):null;labelStack=interaction.labelStack?{labelStack:(0,_utils.optimizeLabelStack)(interaction.labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type))}:{};// Page Load
9
9
  getInitialPageLoadSSRMetrics=function getInitialPageLoadSSRMetrics(){var _config$ssr;if(!isPageLoad){return{};}var config=(0,_config.getConfig)();var SSRDoneTimeValue=(0,_getSsrDoneTimeValue.default)(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((0,_toConsumableArray2.default)(interaction.spans),(0,_toConsumableArray2.default)(_interactionMetrics.interactionSpans));_interactionMetrics.interactionSpans.length=0;var shouldInclude3pHolds=(0,_config.shouldUseRawDataThirdPartyBehavior)(ufoName,type);var basePayload={errors:interaction.errors.map(function(_ref2){var labelStack=_ref2.labelStack,others=(0,_objectWithoutProperties2.default)(_ref2,_excluded);return _objectSpread(_objectSpread({},others),{},{labelStack:labelStack&&(0,_utils.optimizeLabelStack)(labelStack,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type))});}),holdActive:(0,_toConsumableArray2.default)(interaction.holdActive.values()),redirects:optimizeRedirects(interaction.redirects,start),holdInfo:(0,_optimizeHoldInfo.optimizeHoldInfo)(experimental?interaction.holdExpInfo:interaction.holdInfo,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),spans:(0,_optimizeSpans.optimizeSpans)(spans,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),requestInfo:(0,_optimizeRequestInfo.optimizeRequestInfo)(interaction.requestInfo,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),customTimings:(0,_optimizeCustomTimings.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?(0,_toConsumableArray2.default)(interaction.hold3pActive.values()):[],hold3pInfo:(0,_optimizeHoldInfo.optimizeHoldInfo)((_interaction$hold3pIn=interaction.hold3pInfo)!==null&&_interaction$hold3pIn!==void 0?_interaction$hold3pIn:[],start,(0,_getReactUfoPayloadVersion.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=(0,_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((0,_toConsumableArray2.default)(ssrTimingsFromConfig),(0,_toConsumableArray2.default)(defaultSSRTimings)):defaultSSRTimings};};if(experimental){expTTAI=(0,_getTtai.default)(interaction);}else{regularTTAI=(0,_getTtai.default)(interaction);}newUFOName=(0,_utils.sanitizeUfoName)(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=29;break;}_context.next=28;return(0,_getVcMetrics.default)(interaction);case 28:_context.t1=_context.sent;case 29:_context.t2=_context.t1;_context.t3=experimental?(0,_createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction):Promise.resolve(undefined);_context.t4=(0,_getPaintMetrics.getPaintMetricsToLegacyFormat)(type,end);_context.t5=(0,_getBatteryInfo.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=(0,_slicedToArray2.default)(_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){(0,_addPerformanceMeasures.addPerformanceMeasures)(interaction.start,(0,_toConsumableArray2.default)((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
12
+ getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMetrics(){var _config$ssr2,_config$ssr2$getSSRTi;if(!isPageLoad||!isDetailedPayload){return{};}var initialPageLoadExtraTimings=objectToArray(initialPageLoadExtraTiming.getTimings());var config=(0,_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((0,_toConsumableArray2.default)(ssrTimingsFromConfig),(0,_toConsumableArray2.default)(defaultSSRTimings)):defaultSSRTimings};};if(experimental){expTTAI=(0,_getTtai.default)(interaction);}else{regularTTAI=(0,_getTtai.default)(interaction);}newUFOName=(0,_utils.sanitizeUfoName)(ufoName);resourceTimings=getResourceTimings(start,end);_context.t0=Promise;_context.t1=vcMetrics;if(_context.t1){_context.next=29;break;}_context.next=28;return(0,_getVcMetrics.default)(interaction);case 28:_context.t1=_context.sent;case 29:_context.t2=_context.t1;_context.t3=experimental?(0,_createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction):Promise.resolve(undefined);_context.t4=(0,_getPaintMetrics.getPaintMetricsToLegacyFormat)(type,end);_context.t5=(0,_getBatteryInfo.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=(0,_slicedToArray2.default)(_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){(0,_addPerformanceMeasures.addPerformanceMeasures)(interaction.start,(0,_toConsumableArray2.default)((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
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:(0,_getReactUfoPayloadVersion.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':(0,_machineUtilisation.createPressureStateReport)(interaction.start,interaction.end),'event:memory:usage':(0,_machineUtilisation.createMemoryStateReport)(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),{},{'ufo:pageVisibilityHiddenTimestamp':(0,_hiddenTiming.getEarliestHiddenTiming)(interaction.start,interaction.end),'ufo:wasPageHiddenBeforeInit':(0,_hiddenTiming.getHasHiddenTimingBeforeSetup)(),'ufo:isOpenedInBackground':(0,_hiddenTiming.isOpenedInBackground)(interaction.type),'ufo:isTabThrottled':(0,_hiddenTiming.isTabThrottled)(start,end)},(0,_platformFeatureFlags.fg)('ufo_detect_aborting_interaction_during_ssr')?{'ufo:hasAbortingInteractionDuringSSR':(0,_vcObserverNew.getHasAbortingEventDuringSSR)()}:{}),(0,_getBrowserMetadata.getBrowserMetadataToLegacyFormat)()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),(0,_getNavigationMetrics.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':(0,_machineUtilisation.createPressureStateReport)(interaction.start,interaction.end),'event:memory:usage':(0,_machineUtilisation.createMemoryStateReport)(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),{},{'ufo:pageVisibilityHiddenTimestamp':(0,_hiddenTiming.getEarliestHiddenTiming)(interaction.start,interaction.end),'ufo:wasPageHiddenBeforeInit':(0,_hiddenTiming.getHasHiddenTimingBeforeSetup)(),'ufo:isOpenedInBackground':(0,_hiddenTiming.isOpenedInBackground)(interaction.type),'ufo:isTabThrottled':(0,_hiddenTiming.isTabThrottled)(start,end)},(0,_platformFeatureFlags.fg)('platform_ufo_page_visibility_timeline')?{'ufo:pageVisibilityTimeline':(0,_hiddenTiming.getPageVisibilityTimeline)(start,end)}:{}),(0,_platformFeatureFlags.fg)('ufo_detect_aborting_interaction_during_ssr')?{'ufo:hasAbortingInteractionDuringSSR':(0,_vcObserverNew.getHasAbortingEventDuringSSR)()}:{}),(0,_getBrowserMetadata.getBrowserMetadataToLegacyFormat)()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),(0,_getNavigationMetrics.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:(0,_optimizeApdex.optimizeApdex)(interaction.apdex,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),end:Math.round(end)},interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),{},{start:Math.round(start),segments:(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?segmentTree:(0,_utils.getOldSegmentsLabelStack)(segments,interaction.type),marks:(0,_optimizeMarks.optimizeMarks)(interaction.marks,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:(0,_optimizeReactProfilerTimings.optimizeReactProfilerTimings)(interaction.reactProfilerTimings,start,(0,_getReactUfoPayloadVersion.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':(0,_roundNumber.roundEpsilon)(performance.now()-interactionPayloadStart)})}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if((0,_platformFeatureFlags.fg)('platform_ufo_enable_vc_raw_data')){size=(0,_getPayloadSize.default)(payload.attributes.properties);vcRev=payload.attributes.properties['ufo:vc:rev'];rawData=vcRev.find(function(item){return item.revision==='raw-handler';});if(rawData){rawDataSize=(0,_getPayloadSize.default)(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']=(0,_getPayloadSize.default)(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=(0,_getPayloadSize.default)(payload.attributes.properties);}// in order of importance, first one being least important
17
17
  // we can add more fields as necessary
18
- interactionMetricsFieldsToTrim=(0,_platformFeatureFlags.fg)('ufo_remove_featureflags_from_trimmed_fields')?['requestInfo','resourceTimings']:['requestInfo','featureFlags','resourceTimings'];properties=payload.attributes.properties;interactionMetrics=properties.interactionMetrics;if(!interactionMetrics){_context.next=74;break;}_iterator=_createForOfIteratorHelper(interactionMetricsFieldsToTrim);_context.prev=52;_iterator.s();case 54:if((_step=_iterator.n()).done){_context.next=66;break;}field=_step.value;if(!((0,_getPayloadSize.default)(properties)<=MAX_PAYLOAD_SIZE)){_context.next=58;break;}return _context.abrupt("continue",64);case 58:interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push("interactionMetrics.".concat(field));properties['event:trimmedFields']=trimmedFields;case 64:_context.next=54;break;case 66:_context.next=71;break;case 68:_context.prev=68;_context.t7=_context["catch"](52);_iterator.e(_context.t7);case 71:_context.prev=71;_iterator.f();return _context.finish(71);case 74:// If the payload size continues to exceed the limit and interactionMetrics is already trimmed,
18
+ interactionMetricsFieldsToTrim=(0,_platformFeatureFlags.fg)('ufo_remove_featureflags_from_trimmed_fields')?['requestInfo','resourceTimings']:['requestInfo','featureFlags','resourceTimings'];// Top-level properties that can be trimmed if payload exceeds size limit
19
+ topLevelFieldsToTrim=['ufo:pageVisibilityTimeline'];properties=payload.attributes.properties;interactionMetrics=properties.interactionMetrics;if(!interactionMetrics){_context.next=75;break;}_iterator=_createForOfIteratorHelper(interactionMetricsFieldsToTrim);_context.prev=53;_iterator.s();case 55:if((_step=_iterator.n()).done){_context.next=67;break;}field=_step.value;if(!((0,_getPayloadSize.default)(properties)<=MAX_PAYLOAD_SIZE)){_context.next=59;break;}return _context.abrupt("continue",65);case 59:interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push("interactionMetrics.".concat(field));properties['event:trimmedFields']=trimmedFields;case 65:_context.next=55;break;case 67:_context.next=72;break;case 69:_context.prev=69;_context.t7=_context["catch"](53);_iterator.e(_context.t7);case 72:_context.prev=72;_iterator.f();return _context.finish(72);case 75:_i2=0,_topLevelFieldsToTrim=topLevelFieldsToTrim;case 76:if(!(_i2<_topLevelFieldsToTrim.length)){_context.next=89;break;}_field=_topLevelFieldsToTrim[_i2];if(!((0,_getPayloadSize.default)(properties)<=MAX_PAYLOAD_SIZE)){_context.next=80;break;}return _context.abrupt("continue",86);case 80:properties[_field]=undefined;properties['event:isTrimmed']=true;_trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(_trimmedFields)){_trimmedFields=[];}_trimmedFields.push(_field);properties['event:trimmedFields']=_trimmedFields;case 86:_i2++;_context.next=76;break;case 89:// If the payload size continues to exceed the limit and interactionMetrics is already trimmed,
19
20
  // trim VC debug data (early viewport checkpoints). PIR-30543 - AFO-5033
20
- isVCRevisionTrimEnabled=(0,_platformFeatureFlags.fg)('ufo_vc_revision_trim_enabled');(0,_trimVcDebugData.trimVcDebugData)(properties,(0,_getPayloadSize.default)(properties),MAX_PAYLOAD_SIZE,isVCRevisionTrimEnabled);return _context.abrupt("return",payload);case 77:case"end":return _context.stop();}},_callee,null,[[52,68,71,74]]);}));return _createInteractionMetricsPayload.apply(this,arguments);}function createPayloads(_x6,_x7){return _createPayloads.apply(this,arguments);}function _createPayloads(){_createPayloads=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(interactionId,interaction){var ufoNameOverride,modifiedInteraction,payloads,isCriticalMetricsEnabled,vcMetrics,criticalMetricsPayloads,criticalPayloadCount,interactionMetricsPayload;return _regenerator.default.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:ufoNameOverride=getUfoNameOverride(interaction);modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{ufoName:ufoNameOverride});payloads=[];isCriticalMetricsEnabled=(0,_platformFeatureFlags.fg)('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
21
+ isVCRevisionTrimEnabled=(0,_platformFeatureFlags.fg)('ufo_vc_revision_trim_enabled');(0,_trimVcDebugData.trimVcDebugData)(properties,(0,_getPayloadSize.default)(properties),MAX_PAYLOAD_SIZE,isVCRevisionTrimEnabled);return _context.abrupt("return",payload);case 92:case"end":return _context.stop();}},_callee,null,[[53,69,72,75]]);}));return _createInteractionMetricsPayload.apply(this,arguments);}function createPayloads(_x6,_x7){return _createPayloads.apply(this,arguments);}function _createPayloads(){_createPayloads=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(interactionId,interaction){var ufoNameOverride,modifiedInteraction,payloads,isCriticalMetricsEnabled,vcMetrics,criticalMetricsPayloads,criticalPayloadCount,interactionMetricsPayload;return _regenerator.default.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:ufoNameOverride=getUfoNameOverride(interaction);modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{ufoName:ufoNameOverride});payloads=[];isCriticalMetricsEnabled=(0,_platformFeatureFlags.fg)('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
21
22
  _context2.next=6;return(0,_getVcMetrics.default)(interaction);case 6:vcMetrics=_context2.sent;if(!isCriticalMetricsEnabled){_context2.next=13;break;}_context2.next=10;return(0,_criticalMetricsPayload.createCriticalMetricsPayloads)(interactionId,interaction,vcMetrics);case 10:_context2.t0=_context2.sent;_context2.next=14;break;case 13:_context2.t0=[];case 14:criticalMetricsPayloads=_context2.t0;payloads.push.apply(payloads,(0,_toConsumableArray2.default)(criticalMetricsPayloads));criticalPayloadCount=isCriticalMetricsEnabled?criticalMetricsPayloads.length:undefined;_context2.next=19;return createInteractionMetricsPayload(modifiedInteraction,interactionId,undefined,criticalPayloadCount,vcMetrics);case 19:interactionMetricsPayload=_context2.sent;payloads.push(interactionMetricsPayload);return _context2.abrupt("return",payloads.filter(Boolean));case 22:case"end":return _context2.stop();}},_callee2);}));return _createPayloads.apply(this,arguments);}function createExperimentalMetricsPayload(_x8,_x9){return _createExperimentalMetricsPayload.apply(this,arguments);}function _createExperimentalMetricsPayload(){_createExperimentalMetricsPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3(interactionId,interaction){var config,ufoName,rate,pageVisibilityState,result;return _regenerator.default.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:config=(0,_config.getConfig)();if(config){_context3.next=3;break;}throw Error('UFO Configuration not provided');case 3:ufoName=(0,_utils.sanitizeUfoName)(interaction.ufoName);rate=(0,_config.getExperimentalInteractionRate)(ufoName,interaction.type);if((0,_coinflip.default)(rate)){_context3.next=7;break;}return _context3.abrupt("return",null);case 7:pageVisibilityState=(0,_hiddenTiming.getPageVisibilityState)(interaction.start,interaction.end);if(!(pageVisibilityState!=='visible')){_context3.next=10;break;}return _context3.abrupt("return",null);case 10:_context3.next=12;return createInteractionMetricsPayload(interaction,interactionId,true);case 12:result=_context3.sent;return _context3.abrupt("return",result);case 14:case"end":return _context3.stop();}},_callee3);}));return _createExperimentalMetricsPayload.apply(this,arguments);}function createExtraSearchPageInteractionPayload(_x0,_x1){return _createExtraSearchPageInteractionPayload.apply(this,arguments);}function _createExtraSearchPageInteractionPayload(){_createExtraSearchPageInteractionPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4(interactionId,interaction){var SAIN_HOLD_NAMES,NAME_OVERRIDE,SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL,newInteractionId,newEnd,holdInfo,reactProfilerTimings,lastHold,isLastHoldSAIN,lastFilteredTime,filteredReactProfilerTimings,lastTiming,modifiedInteraction,payloads,vcMetrics,interactionMetricsPayload;return _regenerator.default.wrap(function _callee4$(_context4){while(1)switch(_context4.prev=_context4.next){case 0:SAIN_HOLD_NAMES=['search-ai-dialog-visible-text-loading','search-ai-dialog-all-text-loading'];NAME_OVERRIDE='search-page-ignoring-smart-answers';SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL='search-page-smart-answers';newInteractionId="".concat(interactionId,"-ignoring-smart-answers");// Calculate a new end time which excludes SAIN holds
22
23
  holdInfo=interaction.holdInfo,reactProfilerTimings=interaction.reactProfilerTimings;lastHold=holdInfo.at(-1);isLastHoldSAIN=Boolean(lastHold&&SAIN_HOLD_NAMES.includes(lastHold.name));// A new end time is only calculated if the last hold is a SAIN hold
23
24
  if(isLastHoldSAIN){lastFilteredTime=null;filteredReactProfilerTimings=reactProfilerTimings.filter(function(timing){if(timing.commitTime===lastFilteredTime){return false;}var isTimingSmartAnswersInSearch=timing.labelStack.some(function(label){return label.name===SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL;});if(isTimingSmartAnswersInSearch){lastFilteredTime=timing.commitTime;return false;}return true;});lastTiming=filteredReactProfilerTimings.at(-1);if(lastTiming){newEnd=lastTiming.commitTime;}}modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{end:newEnd!==null&&newEnd!==void 0?newEnd:interaction.end,holdInfo:[],knownSegments:[],reactProfilerTimings:[],ufoName:NAME_OVERRIDE});payloads=[];_context4.next=12;return(0,_getVcMetrics.default)(interaction,false,true);case 12:vcMetrics=_context4.sent;_context4.next=15;return createInteractionMetricsPayload(modifiedInteraction,newInteractionId,undefined,undefined,vcMetrics);case 15:interactionMetricsPayload=_context4.sent;payloads.push(interactionMetricsPayload);return _context4.abrupt("return",payloads.filter(Boolean));case 18:case"end":return _context4.stop();}},_callee4);}));return _createExtraSearchPageInteractionPayload.apply(this,arguments);}
@@ -7,6 +7,7 @@ exports.__injectThrottleMeasurementForTesting = __injectThrottleMeasurementForTe
7
7
  exports.getEarliestHiddenTiming = getEarliestHiddenTiming;
8
8
  exports.getHasHiddenTimingBeforeSetup = getHasHiddenTimingBeforeSetup;
9
9
  exports.getPageVisibilityState = getPageVisibilityState;
10
+ exports.getPageVisibilityTimeline = getPageVisibilityTimeline;
10
11
  exports.getThrottleMeasurements = getThrottleMeasurements;
11
12
  exports.isOpenedInBackground = isOpenedInBackground;
12
13
  exports.isTabThrottled = isTabThrottled;
@@ -291,6 +292,57 @@ function __injectThrottleMeasurementForTesting(measurement) {
291
292
  throttleInsertIndex = (throttleInsertIndex + 1) % THROTTLE_BUFFER_SIZE;
292
293
  }
293
294
 
295
+ /**
296
+ * Returns the page visibility timeline entries within the specified time window.
297
+ * Each entry contains the time (relative to startTime) and whether the page was hidden.
298
+ *
299
+ * @param startTime - The start timestamp of the window (DOMHighResTimeStamp)
300
+ * @param endTime - The end timestamp of the window (DOMHighResTimeStamp)
301
+ * @returns Array of HiddenTimingItem entries within the time window, with times relative to startTime
302
+ */
303
+ function getPageVisibilityTimeline(startTime, endTime) {
304
+ // Input validation
305
+ if (!Number.isFinite(startTime) || !Number.isFinite(endTime) || startTime >= endTime) {
306
+ return [];
307
+ }
308
+ if (timings.length === 0) {
309
+ return [];
310
+ }
311
+ var result = [];
312
+
313
+ // Find the most recent entry at or before startTime to establish initial state
314
+ var initialEntry;
315
+ var currentSize = timings.length;
316
+ for (var i = 0; i < currentSize; i++) {
317
+ var idx = (insertIndex + i) % currentSize;
318
+ var entry = timings[idx];
319
+ if (entry && entry.time <= startTime) {
320
+ initialEntry = entry;
321
+ }
322
+ }
323
+
324
+ // Add the initial visibility state at the start of the window
325
+ if (initialEntry) {
326
+ result.push({
327
+ time: 0,
328
+ hidden: initialEntry.hidden
329
+ });
330
+ }
331
+
332
+ // Add all entries within the time window
333
+ for (var _i = 0; _i < currentSize; _i++) {
334
+ var _idx = (insertIndex + _i) % currentSize;
335
+ var _entry = timings[_idx];
336
+ if (_entry && _entry.time > startTime && _entry.time <= endTime) {
337
+ result.push({
338
+ time: Math.round(_entry.time - startTime),
339
+ hidden: _entry.hidden
340
+ });
341
+ }
342
+ }
343
+ return result;
344
+ }
345
+
294
346
  // Expose testing API on window for integration tests
295
347
  if (typeof window !== 'undefined') {
296
348
  window.__reactUfoHiddenTiming = {
@@ -1194,6 +1194,7 @@ function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelS
1194
1194
  devToolsEnabled: config.vc.devToolsEnabled,
1195
1195
  selectorConfig: config.vc.selectorConfig,
1196
1196
  ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder,
1197
+ trackLayoutShiftOffenders: config.vc.trackLayoutShiftOffenders,
1197
1198
  searchPageConfig: searchPageConfig
1198
1199
  };
1199
1200
  vcObserver = (0, _vc.newVCObserver)(vcOptions);
@@ -182,7 +182,8 @@ function init(analyticsWebClientAsync, config) {
182
182
  oldDomUpdates: config.vc.oldDomUpdates,
183
183
  devToolsEnabled: config.vc.devToolsEnabled,
184
184
  selectorConfig: config.vc.selectorConfig,
185
- ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder
185
+ ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder,
186
+ trackLayoutShiftOffenders: config.vc.trackLayoutShiftOffenders
186
187
  };
187
188
  _interactionMetrics.postInteractionLog.initializeVCObserver(vcOptions);
188
189
  if (config !== null && config !== void 0 && (_config$experimentalI = config.experimentalInteractionMetrics) !== null && _config$experimentalI !== void 0 && _config$experimentalI.enabled) {
@@ -36,7 +36,7 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
36
36
  enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa !== void 0 ? _opts$ssrEnablePageLa : false
37
37
  });
38
38
  if ((0, _config.isVCRevisionEnabled)('fy25.03') || (0, _config.isVCRevisionEnabled)('fy26.04')) {
39
- var _opts$ssrEnablePageLa2;
39
+ var _opts$ssrEnablePageLa2, _opts$trackLayoutShif;
40
40
  this.newVCObserver = new _vcObserverNew.default({
41
41
  selectorConfig: opts.selectorConfig,
42
42
  isPostInteraction: opts.isPostInteraction,
@@ -44,6 +44,7 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
44
44
  enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa2 = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa2 !== void 0 ? _opts$ssrEnablePageLa2 : false
45
45
  },
46
46
  ssrPlaceholderHandler: this.ssrPlaceholderHandler,
47
+ trackLayoutShiftOffenders: (_opts$trackLayoutShif = opts.trackLayoutShiftOffenders) !== null && _opts$trackLayoutShif !== void 0 ? _opts$trackLayoutShif : false,
47
48
  searchPageConfig: opts.searchPageConfig
48
49
  });
49
50
  }
@@ -160,7 +161,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
160
161
  interactionAbortReason: param.interactionAbortReason,
161
162
  includeRawData: includeRawData,
162
163
  includeSSRInV3: param.includeSSRInV3,
163
- rawDataStopTime: param.rawDataStopTime
164
+ rawDataStopTime: param.rawDataStopTime,
165
+ reportLayoutShiftOffenders: param.reportLayoutShiftOffenders
164
166
  });
165
167
  case 12:
166
168
  _context.t1 = _context.sent;
@@ -47,6 +47,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
47
47
  function VCObserverNew(config) {
48
48
  var _config$isPostInterac,
49
49
  _config$selectorConfi,
50
+ _config$trackLayoutSh,
50
51
  _this = this;
51
52
  (0, _classCallCheck2.default)(this, VCObserverNew);
52
53
  (0, _defineProperty2.default)(this, "viewportObserver", null);
@@ -72,6 +73,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
72
73
  enablePageLayoutPlaceholder: (_config$SSRConfig$ena = (_config$SSRConfig = config.SSRConfig) === null || _config$SSRConfig === void 0 ? void 0 : _config$SSRConfig.enablePageLayoutPlaceholder) !== null && _config$SSRConfig$ena !== void 0 ? _config$SSRConfig$ena : false
73
74
  });
74
75
  }
76
+ this.trackLayoutShiftOffenders = (_config$trackLayoutSh = config.trackLayoutShiftOffenders) !== null && _config$trackLayoutSh !== void 0 ? _config$trackLayoutSh : false;
75
77
  this.viewportObserver = new _viewportObserver.default({
76
78
  onChange: function onChange(onChangeArg) {
77
79
  var time = onChangeArg.time,
@@ -94,7 +96,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
94
96
  visible: visible,
95
97
  attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName,
96
98
  oldValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.oldValue,
97
- newValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.newValue
99
+ newValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.newValue,
100
+ originalMutationTimestamp: mutationData === null || mutationData === void 0 ? void 0 : mutationData.timestamp
98
101
  };
99
102
  if (element) {
100
103
  var labelStacks = getLabelStacks(element);
@@ -116,7 +119,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
116
119
  getSSRPlaceholderHandler: function getSSRPlaceholderHandler() {
117
120
  return _this.getSSRPlaceholderHandler();
118
121
  },
119
- searchPageConfig: config.searchPageConfig
122
+ searchPageConfig: config.searchPageConfig,
123
+ trackLayoutShiftOffenders: this.trackLayoutShiftOffenders
120
124
  });
121
125
  this.windowEventObserver = new _windowEventObserver.default({
122
126
  onEvent: function onEvent(_ref) {
@@ -316,7 +320,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
316
320
  excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
317
321
  includeSSRRatio: includeSSRRatio,
318
322
  isPageVisible: isPageVisible,
319
- interactionAbortReason: interactionAbortReason
323
+ interactionAbortReason: interactionAbortReason,
324
+ reportLayoutShiftOffenders: this.trackLayoutShiftOffenders
320
325
  });
321
326
  case 10:
322
327
  _context.t0 = _context.sent;
@@ -347,7 +352,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
347
352
  excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
348
353
  includeSSRRatio: includeSSRRatio,
349
354
  isPageVisible: isPageVisible,
350
- interactionAbortReason: interactionAbortReason
355
+ interactionAbortReason: interactionAbortReason,
356
+ reportLayoutShiftOffenders: this.trackLayoutShiftOffenders
351
357
  };
352
358
  _context.next = 22;
353
359
  return Promise.all([(0, _config.isVCRevisionEnabled)('fy26.04') ? calculator_fy26_04.calculate(calculatorParams) : null, (0, _config.isVCRevisionEnabled)('next') ? calculator_next.calculate(calculatorParams) : null]);
@@ -14,6 +14,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
14
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
16
  var _percentileCalc = require("./percentile-calc");
17
+ var _detectLayoutShiftCause = require("./utils/detect-layout-shift-cause");
17
18
  var _getViewportHeight = _interopRequireDefault(require("./utils/get-viewport-height"));
18
19
  var _getViewportWidth = _interopRequireDefault(require("./utils/get-viewport-width"));
19
20
  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; }
@@ -118,9 +119,9 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
118
119
  }, {
119
120
  key: "calculateWithDebugInfo",
120
121
  value: function () {
121
- var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, allEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason, includeSSRRatio) {
122
+ var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, allEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason, includeSSRRatio, reportLayoutShiftOffenders) {
122
123
  var _window, _window2, _window3, _window4, _window6;
123
- var percentiles, viewportEntries, _yield$calculateTTVCP, vcLogs, speedIndex, vcDetails, percentileIndex, entryDataBuffer, ssrRatio, _iterator4, _step4, _entry3, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, enhancedVcLogs, shouldCalculate3p, shouldCalculateDebugDetails, sortedVcLogs, maxViewportPercentageAtTime, maxSoFar, _iterator5, _step5, log, getBiggestPreviousViewportPercentage, ignoredEntriesByTime, _iterator6, _step6, _entry4, _ignoredEntriesByTime, _viewportData$rect, _viewportData$previou, viewportData, timestamp, additionalVcLogs, _iterator7, _step7, _step7$value, _timestamp, ignoredEntries, _viewportPercentage, v3RevisionDebugDetails, _window5, _window5$__ufo_devtoo, _window7, _window7$__on_ufo_vc_;
124
+ var percentiles, viewportEntries, _yield$calculateTTVCP, vcLogs, speedIndex, vcDetails, percentileIndex, entryDataBuffer, ssrRatio, layoutShiftInsights, previousViewportPercentage, _iterator4, _step4, _entry3, time, viewportPercentage, entries, elementNames, layoutShiftEntries, previousResult, i, percentile, enhancedVcLogs, shouldCalculate3p, shouldCalculateDebugDetails, sortedVcLogs, maxViewportPercentageAtTime, maxSoFar, _iterator5, _step5, log, getBiggestPreviousViewportPercentage, ignoredEntriesByTime, _iterator6, _step6, _entry4, _ignoredEntriesByTime, _viewportData$rect, _viewportData$previou, viewportData, timestamp, additionalVcLogs, _iterator7, _step7, _step7$value, _timestamp, ignoredEntries, _viewportPercentage, v3RevisionDebugDetails, _window5, _window5$__ufo_devtoo, _window7, _window7$__on_ufo_vc_;
124
125
  return _regenerator.default.wrap(function _callee$(_context) {
125
126
  while (1) switch (_context.prev = _context.next) {
126
127
  case 0:
@@ -144,16 +145,18 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
144
145
  percentileIndex = 0;
145
146
  entryDataBuffer = new Set();
146
147
  ssrRatio = -1;
148
+ layoutShiftInsights = null;
149
+ previousViewportPercentage = 0;
147
150
  if (!vcLogs) {
148
- _context.next = 32;
151
+ _context.next = 35;
149
152
  break;
150
153
  }
151
154
  _iterator4 = _createForOfIteratorHelper(vcLogs);
152
- _context.prev = 13;
155
+ _context.prev = 15;
153
156
  _iterator4.s();
154
- case 15:
157
+ case 17:
155
158
  if ((_step4 = _iterator4.n()).done) {
156
- _context.next = 24;
159
+ _context.next = 27;
157
160
  break;
158
161
  }
159
162
  _entry3 = _step4.value;
@@ -166,11 +169,11 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
166
169
 
167
170
  // Only process entries if we haven't reached all percentiles
168
171
  if (!(percentileIndex >= percentiles.length)) {
169
- _context.next = 21;
172
+ _context.next = 23;
170
173
  break;
171
174
  }
172
- return _context.abrupt("break", 24);
173
- case 21:
175
+ return _context.abrupt("break", 27);
176
+ case 23:
174
177
  // Check if this entry matches any checkpoint percentiles
175
178
  if (viewportPercentage >= percentiles[percentileIndex]) {
176
179
  elementNames = (0, _toConsumableArray2.default)(new Set(entries.map(function (e) {
@@ -181,6 +184,23 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
181
184
  t: Math.round(time),
182
185
  e: elementNames
183
186
  };
187
+ if (reportLayoutShiftOffenders && percentiles[percentileIndex] === 90 && entries.some(function (e) {
188
+ return e.type === 'layout-shift';
189
+ })) {
190
+ layoutShiftEntries = entries.filter(function (e) {
191
+ return e.type === 'layout-shift';
192
+ });
193
+ layoutShiftInsights = {
194
+ layoutShiftOffendersResult: (0, _detectLayoutShiftCause.detectLayoutShiftCause)({
195
+ viewportEntries: viewportEntries,
196
+ layoutShiftEntries: layoutShiftEntries,
197
+ time: time,
198
+ startTime: startTime
199
+ }),
200
+ layoutShiftEntriesCount: layoutShiftEntries.length,
201
+ layoutShiftImpact: viewportPercentage - previousViewportPercentage
202
+ };
203
+ }
184
204
  percentileIndex++;
185
205
  }
186
206
 
@@ -192,21 +212,22 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
192
212
  return entryDataBuffer.add(e);
193
213
  });
194
214
  }
195
- case 22:
196
- _context.next = 15;
215
+ previousViewportPercentage = viewportPercentage;
216
+ case 25:
217
+ _context.next = 17;
197
218
  break;
198
- case 24:
199
- _context.next = 29;
219
+ case 27:
220
+ _context.next = 32;
200
221
  break;
201
- case 26:
202
- _context.prev = 26;
203
- _context.t0 = _context["catch"](13);
204
- _iterator4.e(_context.t0);
205
222
  case 29:
206
223
  _context.prev = 29;
207
- _iterator4.f();
208
- return _context.finish(29);
224
+ _context.t0 = _context["catch"](15);
225
+ _iterator4.e(_context.t0);
209
226
  case 32:
227
+ _context.prev = 32;
228
+ _iterator4.f();
229
+ return _context.finish(32);
230
+ case 35:
210
231
  // Fill in any missing percentiles with the last known values
211
232
  previousResult = {
212
233
  t: 0,
@@ -367,15 +388,16 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
367
388
  return _context.abrupt("return", {
368
389
  vcDetails: vcDetails,
369
390
  ssrRatio: ssrRatio,
370
- speedIndex: speedIndex
391
+ speedIndex: speedIndex,
392
+ VC90layoutShiftInsights: layoutShiftInsights
371
393
  });
372
- case 44:
394
+ case 47:
373
395
  case "end":
374
396
  return _context.stop();
375
397
  }
376
- }, _callee, this, [[13, 26, 29, 32]]);
398
+ }, _callee, this, [[15, 29, 32, 35]]);
377
399
  }));
378
- function calculateWithDebugInfo(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x0, _x1, _x10, _x11, _x12) {
400
+ function calculateWithDebugInfo(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x0, _x1, _x10, _x11, _x12, _x13) {
379
401
  return _calculateWithDebugInfo.apply(this, arguments);
380
402
  }
381
403
  return calculateWithDebugInfo;
@@ -387,11 +409,11 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
387
409
  var _this = this,
388
410
  _vcDetails$90$t,
389
411
  _vcDetails$;
390
- var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, include3p, excludeSmartAnswersInSearch, includeSSRRatio, interactionType, isPageVisible, interactionAbortReason, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, _yield$this$calculate, vcDetails, ssrRatio, speedIndex, result;
412
+ var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, include3p, excludeSmartAnswersInSearch, includeSSRRatio, interactionType, isPageVisible, interactionAbortReason, reportLayoutShiftOffenders, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, _yield$this$calculate, vcDetails, ssrRatio, speedIndex, VC90layoutShiftInsights, layoutShiftInsightsPayload, _layoutShiftOffenders, _layoutShiftOffenders2, _layoutShiftOffenders3, layoutShiftOffendersResult, layoutShiftEntriesCount, layoutShiftImpact, result;
391
413
  return _regenerator.default.wrap(function _callee2$(_context2) {
392
414
  while (1) switch (_context2.prev = _context2.next) {
393
415
  case 0:
394
- startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries, interactionId = _ref.interactionId, isPostInteraction = _ref.isPostInteraction, include3p = _ref.include3p, excludeSmartAnswersInSearch = _ref.excludeSmartAnswersInSearch, includeSSRRatio = _ref.includeSSRRatio, interactionType = _ref.interactionType, isPageVisible = _ref.isPageVisible, interactionAbortReason = _ref.interactionAbortReason;
416
+ startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries, interactionId = _ref.interactionId, isPostInteraction = _ref.isPostInteraction, include3p = _ref.include3p, excludeSmartAnswersInSearch = _ref.excludeSmartAnswersInSearch, includeSSRRatio = _ref.includeSSRRatio, interactionType = _ref.interactionType, isPageVisible = _ref.isPageVisible, interactionAbortReason = _ref.interactionAbortReason, reportLayoutShiftOffenders = _ref.reportLayoutShiftOffenders;
395
417
  filteredEntries = orderedEntries.filter(function (entry) {
396
418
  return _this.isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch);
397
419
  });
@@ -411,17 +433,50 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
411
433
  });
412
434
  case 7:
413
435
  _context2.next = 9;
414
- return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, orderedEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason, includeSSRRatio);
436
+ return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, orderedEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason, includeSSRRatio, reportLayoutShiftOffenders);
415
437
  case 9:
416
438
  _yield$this$calculate = _context2.sent;
417
439
  vcDetails = _yield$this$calculate.vcDetails;
418
440
  ssrRatio = _yield$this$calculate.ssrRatio;
419
441
  speedIndex = _yield$this$calculate.speedIndex;
442
+ VC90layoutShiftInsights = _yield$this$calculate.VC90layoutShiftInsights;
443
+ if (VC90layoutShiftInsights !== null && reportLayoutShiftOffenders) {
444
+ layoutShiftOffendersResult = VC90layoutShiftInsights.layoutShiftOffendersResult, layoutShiftEntriesCount = VC90layoutShiftInsights.layoutShiftEntriesCount, layoutShiftImpact = VC90layoutShiftInsights.layoutShiftImpact;
445
+ layoutShiftInsightsPayload = {
446
+ impact: layoutShiftImpact,
447
+ sources: layoutShiftEntriesCount !== null && layoutShiftEntriesCount !== void 0 ? layoutShiftEntriesCount : 0,
448
+ same: {
449
+ dir: (_layoutShiftOffenders = layoutShiftOffendersResult === null || layoutShiftOffendersResult === void 0 ? void 0 : layoutShiftOffendersResult.layoutShiftVariables.allMovedSameWay) !== null && _layoutShiftOffenders !== void 0 ? _layoutShiftOffenders : false,
450
+ dist: (_layoutShiftOffenders2 = layoutShiftOffendersResult === null || layoutShiftOffendersResult === void 0 ? void 0 : layoutShiftOffendersResult.layoutShiftVariables.allMovedSameAmount) !== null && _layoutShiftOffenders2 !== void 0 ? _layoutShiftOffenders2 : false
451
+ },
452
+ total_mut: (_layoutShiftOffenders3 = layoutShiftOffendersResult === null || layoutShiftOffendersResult === void 0 ? void 0 : layoutShiftOffendersResult.layoutShiftOffenders.length) !== null && _layoutShiftOffenders3 !== void 0 ? _layoutShiftOffenders3 : 0,
453
+ mut: layoutShiftOffendersResult === null || layoutShiftOffendersResult === void 0 ? void 0 : layoutShiftOffendersResult.layoutShiftOffenders.sort(function (a, b) {
454
+ return Math.abs(a.distanceToLS) - Math.abs(b.distanceToLS);
455
+ }).slice(0, 5).map(function (offender) {
456
+ return {
457
+ e: offender.offender,
458
+ size: -1,
459
+ // @todo: calculate size
460
+ attr: {
461
+ t_before: offender.happenedBefore,
462
+ t_distance: offender.distanceToLS,
463
+ p_above: offender.isAbove,
464
+ p_left: offender.isLeft,
465
+ p_right: offender.isRight,
466
+ p_h_overlap: offender.hasHorizontalOverlap,
467
+ p_v_overlap: offender.hasVerticalOverlap,
468
+ p_same_offset: offender.matchesLayoutShiftDelta ? 'all' : 'none'
469
+ }
470
+ };
471
+ })
472
+ };
473
+ }
420
474
  result = {
421
475
  revision: this.revisionNo,
422
476
  clean: true,
423
477
  'metric:vc90': (_vcDetails$90$t = vcDetails === null || vcDetails === void 0 || (_vcDetails$ = vcDetails['90']) === null || _vcDetails$ === void 0 ? void 0 : _vcDetails$.t) !== null && _vcDetails$90$t !== void 0 ? _vcDetails$90$t : null,
424
- vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
478
+ vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined,
479
+ 'vc90:ls': layoutShiftInsightsPayload !== null && layoutShiftInsightsPayload !== void 0 ? layoutShiftInsightsPayload : undefined
425
480
  };
426
481
  result.ratios = this.calculateRatios(filteredEntries);
427
482
  if (ssrRatio !== -1) {
@@ -434,13 +489,13 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
434
489
  }
435
490
  result.labelStacks = this.getLabelStacks(filteredEntries, isPostInteraction);
436
491
  return _context2.abrupt("return", result);
437
- case 19:
492
+ case 21:
438
493
  case "end":
439
494
  return _context2.stop();
440
495
  }
441
496
  }, _callee2, this);
442
497
  }));
443
- function calculate(_x13) {
498
+ function calculate(_x14) {
444
499
  return _calculate.apply(this, arguments);
445
500
  }
446
501
  return calculate;