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:
@@ -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
|
||||
}, {})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user