From 8eff962cab608341a6f2fedc640a0e32d96f26e2 Mon Sep 17 00:00:00 2001 From: altaf-creator Date: Sun, 9 Nov 2025 11:15:19 +0800 Subject: pain --- .../web-vitals/src/attribution/onFCP.ts | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 frontend-old/node_modules/web-vitals/src/attribution/onFCP.ts (limited to 'frontend-old/node_modules/web-vitals/src/attribution/onFCP.ts') diff --git a/frontend-old/node_modules/web-vitals/src/attribution/onFCP.ts b/frontend-old/node_modules/web-vitals/src/attribution/onFCP.ts new file mode 100644 index 0000000..079bf91 --- /dev/null +++ b/frontend-old/node_modules/web-vitals/src/attribution/onFCP.ts @@ -0,0 +1,76 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {getBFCacheRestoreTime} from '../lib/bfcache.js'; +import {getLoadState} from '../lib/getLoadState.js'; +import {getNavigationEntry} from '../lib/getNavigationEntry.js'; +import {onFCP as unattributedOnFCP} from '../onFCP.js'; +import { + FCPAttribution, + FCPMetric, + FCPMetricWithAttribution, + ReportOpts, +} from '../types.js'; + +const attributeFCP = (metric: FCPMetric): FCPMetricWithAttribution => { + // Use a default object if no other attribution has been set. + let attribution: FCPAttribution = { + timeToFirstByte: 0, + firstByteToFCP: metric.value, + loadState: getLoadState(getBFCacheRestoreTime()), + }; + + if (metric.entries.length) { + const navigationEntry = getNavigationEntry(); + const fcpEntry = metric.entries[metric.entries.length - 1]; + + if (navigationEntry) { + const activationStart = navigationEntry.activationStart || 0; + const ttfb = Math.max(0, navigationEntry.responseStart - activationStart); + + attribution = { + timeToFirstByte: ttfb, + firstByteToFCP: metric.value - ttfb, + loadState: getLoadState(metric.entries[0].startTime), + navigationEntry, + fcpEntry, + }; + } + } + + // Use Object.assign to set property to keep tsc happy. + const metricWithAttribution: FCPMetricWithAttribution = Object.assign( + metric, + {attribution}, + ); + return metricWithAttribution; +}; + +/** + * Calculates the [FCP](https://web.dev/articles/fcp) value for the current page and + * calls the `callback` function once the value is ready, along with the + * relevant `paint` performance entry used to determine the value. The reported + * value is a `DOMHighResTimeStamp`. + */ +export const onFCP = ( + onReport: (metric: FCPMetricWithAttribution) => void, + opts?: ReportOpts, +) => { + unattributedOnFCP((metric: FCPMetric) => { + const metricWithAttribution = attributeFCP(metric); + onReport(metricWithAttribution); + }, opts); +}; -- cgit v1.2.3