UNPKG

studiocms

Version:

Astro Native CMS for AstroDB. Built from the ground up by the Astro community.

93 lines (78 loc) 3.3 kB
/* v8 ignore start */ /* This file is ignored by v8 coverage as it contains imports from 'astro:db' and 'studiocms:sdk' which are not available outside of the Astro runtime with the `@astrojs/db` package installed. */ import { SDKCoreJs } from 'studiocms:sdk'; import { EmptyReturn, tsMetric, WEB_VITALS_METRIC_TABLE } from './consts.js'; import type { GetWebVitalsData, IntermediateWebVitalsRouteSummary, MetricStats, WebVitalsMetricSummary, WebVitalsResponseItem, WebVitalsRouteSummary, WebVitalsSummary, } from './types.js'; import { checkDate } from './utils/checkDate.js'; import { processWebVitalsRouteSummary } from './webVitalsRouteSummary.js'; import { processWebVitalsSummary } from './webVitalsSummary.js'; export type { WebVitalsResponseItem, IntermediateWebVitalsRouteSummary, MetricStats, WebVitalsMetricSummary, WebVitalsRouteSummary, WebVitalsSummary, GetWebVitalsData, }; /** * Fetches web vitals data from the Astro database. * * @returns {Promise<GetWebVitalsData>} A promise that resolves to an object containing web vitals data. * * The returned object contains the following properties: * - `raw`: The raw web vitals data. * - `routeSummary`: A summary of web vitals data by route. * - `summary`: A general summary of web vitals data. * - `twentyFourHours`: An object containing web vitals data for the last 24 hours, with `summary` and `routeSummary` properties. * - `sevenDays`: An object containing web vitals data for the last 7 days, with `summary` and `routeSummary` properties. * - `thirtyDays`: An object containing web vitals data for the last 30 days, with `summary` and `routeSummary` properties. * * If the web vitals metric table is not found in the Astro database, or if an error occurs, an empty return object is returned. * * @throws {Error} If there is an issue with fetching or processing the web vitals data. */ export async function getWebVitals(): Promise<GetWebVitalsData> { try { const AstroDB = await import('astro:db'); if (WEB_VITALS_METRIC_TABLE in AstroDB) { if (AstroDB.AstrojsWebVitals_Metric) { const raw = (await SDKCoreJs.db.select().from(tsMetric)) as WebVitalsResponseItem[]; const last24HoursData = raw.filter((item) => checkDate(item.timestamp).isInLast24Hours()); const last7DaysData = raw.filter((item) => checkDate(item.timestamp).isInLast7Days()); const last30DaysData = raw.filter((item) => checkDate(item.timestamp).isInLast30Days()); const routeSummary = processWebVitalsRouteSummary(raw as WebVitalsResponseItem[]); const summary = processWebVitalsSummary(raw as WebVitalsResponseItem[]); const twentyFourHours = { summary: processWebVitalsSummary(last24HoursData), routeSummary: processWebVitalsRouteSummary(last24HoursData), }; const sevenDays = { summary: processWebVitalsSummary(last7DaysData), routeSummary: processWebVitalsRouteSummary(last7DaysData), }; const thirtyDays = { summary: processWebVitalsSummary(last30DaysData), routeSummary: processWebVitalsRouteSummary(last30DaysData), }; return { raw, routeSummary, summary, twentyFourHours, sevenDays, thirtyDays }; } return EmptyReturn; } return EmptyReturn; } catch (_error) { return EmptyReturn; } } /* v8 ignore stop */