fix(SW-2934): Added all sitemap entries as their own url entry, not just as alternates

Approved-by: Linus Flood
This commit is contained in:
Erik Tiekstra
2025-06-04 06:57:30 +00:00
parent 800b329998
commit 52d266b357

View File

@@ -1,10 +1,10 @@
import { Lang } from "@/constants/languages"
import { env } from "@/env/server"
import { createCounter } from "@/server/telemetry"
import { removeTrailingSlash } from "@/utils/url"
import type { SitemapEntry, SyncItem } from "@/types/sitemap"
import type { SyncItem } from "@/types/sitemap"
import type { Lang } from "@/constants/languages"
export function mergeEntries(
currentEntries: SyncItem[],
@@ -62,8 +62,8 @@ export function mapEntriesToSitemapData(entries: SyncItem[]) {
const entriesByUid = groupEntriesByUid(filteredEntries)
const sitemapEntries = Object.entries(entriesByUid)
.map(([_, entries]) => mapEntriesToSitemapEntry(entries))
.filter((entry): entry is SitemapEntry => !!entry)
.map(([_, entries]) => mapEntriesToSitemapEntries(entries))
.flat()
metricsEntriesTransform.success({
entriesCount: entries.length,
@@ -94,72 +94,25 @@ function groupEntriesByUid(entries: SyncItem[]) {
}, {})
}
function mapEntriesToSitemapEntry(entries: SyncItem[]) {
// Main entry is always English. Without English, there can't be other pages in ContentStack.
const mainEntry = entries.find((entry) => entry.data.locale === Lang.en)
const alternates = getAlternates(entries)
const lastModified = getLastModified(entries)
const changeFrequency = getChangeFrequency(entries)
const priority = getPriority(entries)
if (mainEntry) {
const { locale, url } = mainEntry.data
const sitemapEntry: SitemapEntry = {
url: removeTrailingSlash(`${env.PUBLIC_URL}/${locale}${url}`),
lastModified,
changeFrequency,
priority,
alternates,
}
return sitemapEntry
}
function mapEntriesToSitemapEntries(entries: SyncItem[]) {
const alternates = mapToAlternates(entries)
return entries.map((currentEntry) => ({
url: removeTrailingSlash(
`${env.PUBLIC_URL}/${currentEntry.data.locale}${currentEntry.data.url}`
),
lastModified: currentEntry.data.updated_at,
changeFrequency:
currentEntry.data.web?.seo_metadata?.sitemap?.change_frequency ?? "daily",
priority: currentEntry.data.web?.seo_metadata?.sitemap?.priority ?? 0.5,
alternates,
}))
}
function getLastModified(entries: SyncItem[]) {
// Localized versions of the data can have a different last modified value.
// We make sure we take the latest.
return entries.reduce((latest, entry) => {
const entryDate = entry.data.updated_at
return entryDate > latest ? entryDate : latest
}, "")
}
function getChangeFrequency(entries: SyncItem[]) {
// Localized versions of the data can have a different changeFrequency value.
// We make sure we take the highest.
const changeFrequencyPriority: SitemapEntry["changeFrequency"][] = [
"never",
"yearly",
"monthly",
"weekly",
"daily",
"hourly",
"always",
]
return entries.reduce<SitemapEntry["changeFrequency"]>((highest, entry) => {
const changeFrequency =
entry.data.web?.seo_metadata?.sitemap?.change_frequency ?? "daily"
return changeFrequencyPriority.indexOf(changeFrequency) >
changeFrequencyPriority.indexOf(highest)
? changeFrequency
: highest
}, "never")
}
function getPriority(entries: SyncItem[]) {
// Localized versions of the data can have a different priority.
// We make sure we take the highest.
return entries.reduce((highest, entry) => {
const priority = entry.data.web?.seo_metadata?.sitemap?.priority ?? 0.5
return priority > highest ? priority : highest
}, 0.0)
}
function getAlternates(entries: SyncItem[]) {
return entries
.filter((entry) => entry.data.locale !== Lang.en)
.reduce<Partial<Record<Lang, string>>>((acc, { data }) => {
acc[data.locale] = `${env.PUBLIC_URL}/${data.locale}${data.url}`
return acc
}, {})
function mapToAlternates(entries: SyncItem[]) {
return entries.reduce<Partial<Record<Lang, string>>>((acc, entry) => {
acc[entry.data.locale] = removeTrailingSlash(
`${env.PUBLIC_URL}/${entry.data.locale}${entry.data.url}`
)
return acc
}, {})
}