studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
210 lines (209 loc) • 6.64 kB
JavaScript
import { checkDate } from "./checkDate.js";
import {
calculateClsAverage,
calculateClsScoreText,
calculateInpAverage,
calculateInpScoreText,
calculateLcpAverage,
calculateLcpScoreText
} from "./webVitalsUtils.js";
const buildPerPageRouteDataObject = (webVitalData) => {
const RouteArray = [];
const last24HoursData = [];
const last7DaysData = [];
const last30DaysData = [];
for (const item of webVitalData) {
const { route, timestamp } = item;
if (checkDate(timestamp).isInLast24Hours()) {
const index2 = last24HoursData.findIndex((entry) => entry.route === route);
if (index2 !== -1) {
last24HoursData[index2].samplesize += 1;
if (item.name === "CLS") {
last24HoursData[index2].clsvalue.push(item.value);
}
if (item.name === "LCP") {
last24HoursData[index2].lcpvalue.push(item.value);
}
if (item.name === "INP") {
last24HoursData[index2].inpvalue.push(item.value);
}
} else {
last24HoursData.push({
route,
samplesize: 1,
clsvalue: item.name === "CLS" ? [item.value] : [],
lcpvalue: item.name === "LCP" ? [item.value] : [],
inpvalue: item.name === "INP" ? [item.value] : []
});
}
}
if (checkDate(timestamp).isInLast7Days()) {
const index2 = last7DaysData.findIndex((entry) => entry.route === route);
if (index2 !== -1) {
last7DaysData[index2].samplesize += 1;
if (item.name === "CLS") {
last7DaysData[index2].clsvalue.push(item.value);
}
if (item.name === "LCP") {
last7DaysData[index2].lcpvalue.push(item.value);
}
if (item.name === "INP") {
last7DaysData[index2].inpvalue.push(item.value);
}
} else {
last7DaysData.push({
route,
samplesize: 1,
clsvalue: item.name === "CLS" ? [item.value] : [],
lcpvalue: item.name === "LCP" ? [item.value] : [],
inpvalue: item.name === "INP" ? [item.value] : []
});
}
}
if (checkDate(timestamp).isInLast30Days()) {
const index2 = last30DaysData.findIndex((entry) => entry.route === route);
if (index2 !== -1) {
last30DaysData[index2].samplesize += 1;
if (item.name === "CLS") {
last30DaysData[index2].clsvalue.push(item.value);
}
if (item.name === "LCP") {
last30DaysData[index2].lcpvalue.push(item.value);
}
if (item.name === "INP") {
last30DaysData[index2].inpvalue.push(item.value);
}
} else {
last30DaysData.push({
route,
samplesize: 1,
clsvalue: item.name === "CLS" ? [item.value] : [],
lcpvalue: item.name === "LCP" ? [item.value] : [],
inpvalue: item.name === "INP" ? [item.value] : []
});
}
}
const index = RouteArray.findIndex((entry) => entry.route === route);
if (index !== -1) {
RouteArray[index].samplesize += 1;
if (item.name === "CLS") {
RouteArray[index].clsvalue.push(item.value);
}
if (item.name === "LCP") {
RouteArray[index].lcpvalue.push(item.value);
}
if (item.name === "INP") {
RouteArray[index].inpvalue.push(item.value);
}
} else {
RouteArray.push({
route,
samplesize: 1,
clsvalue: item.name === "CLS" ? [item.value] : [],
lcpvalue: item.name === "LCP" ? [item.value] : [],
inpvalue: item.name === "INP" ? [item.value] : []
});
}
}
const perPageData = [];
const last24HoursPerPageData = [];
const last7DaysPerPageData = [];
const last30DaysPerPageData = [];
for (const item of RouteArray) {
const { route, samplesize, clsvalue, lcpvalue, inpvalue } = item;
const clsAverage = calculateClsAverage(clsvalue);
const lcpAverage = calculateLcpAverage(lcpvalue);
const inpAverage = calculateInpAverage(inpvalue);
perPageData.push({
pageRoute: route,
sampleSize: samplesize,
CLS: {
average: clsAverage,
rating: calculateClsScoreText(clsAverage)
},
LCP: {
average: lcpAverage,
rating: calculateLcpScoreText(lcpAverage)
},
INP: {
average: inpAverage,
rating: calculateInpScoreText(inpAverage)
}
});
}
for (const item of last24HoursData) {
const { route, samplesize, clsvalue, lcpvalue, inpvalue } = item;
const clsAverage = calculateClsAverage(clsvalue);
const lcpAverage = calculateLcpAverage(lcpvalue);
const inpAverage = calculateInpAverage(inpvalue);
last24HoursPerPageData.push({
pageRoute: route,
sampleSize: samplesize,
CLS: {
average: clsAverage,
rating: calculateClsScoreText(clsAverage)
},
LCP: {
average: lcpAverage,
rating: calculateLcpScoreText(lcpAverage)
},
INP: {
average: inpAverage,
rating: calculateInpScoreText(inpAverage)
}
});
}
for (const item of last7DaysData) {
const { route, samplesize, clsvalue, lcpvalue, inpvalue } = item;
const clsAverage = calculateClsAverage(clsvalue);
const lcpAverage = calculateLcpAverage(lcpvalue);
const inpAverage = calculateInpAverage(inpvalue);
last7DaysPerPageData.push({
pageRoute: route,
sampleSize: samplesize,
CLS: {
average: clsAverage,
rating: calculateClsScoreText(clsAverage)
},
LCP: {
average: lcpAverage,
rating: calculateLcpScoreText(lcpAverage)
},
INP: {
average: inpAverage,
rating: calculateInpScoreText(inpAverage)
}
});
}
for (const item of last30DaysData) {
const { route, samplesize, clsvalue, lcpvalue, inpvalue } = item;
const clsAverage = calculateClsAverage(clsvalue);
const lcpAverage = calculateLcpAverage(lcpvalue);
const inpAverage = calculateInpAverage(inpvalue);
last30DaysPerPageData.push({
pageRoute: route,
sampleSize: samplesize,
CLS: {
average: clsAverage,
rating: calculateClsScoreText(clsAverage)
},
LCP: {
average: lcpAverage,
rating: calculateLcpScoreText(lcpAverage)
},
INP: {
average: inpAverage,
rating: calculateInpScoreText(inpAverage)
}
});
}
return {
historicalData: perPageData,
last24HoursData: last24HoursPerPageData,
last7DaysData: last7DaysPerPageData,
last30DaysData: last30DaysPerPageData
};
};
export {
buildPerPageRouteDataObject
};