import type { MetadataRoute } from "next"; import { SITEMAP_KINDS, type SitemapKind } from "@/lib/dto"; import { routes } from "@/lib/routes"; /** * Shared by app/sitemap.ts (per-id sitemaps at /sitemap/.xml) and app/sitemap.xml/route.ts (the index). * Ids are deterministic strings so the index never depends on the API being reachable at build time: * static · -1 … -PAGES_PER_KIND (5 000 URLs per API page; empty pages yield no URLs) */ export const PAGES_PER_KIND = 4; type Freq = MetadataRoute.Sitemap[number]["changeFrequency"]; export const STATIC_PAGES: Array<{ path: string; changeFrequency: Freq; priority: number }> = [ { path: routes.home(), changeFrequency: "hourly", priority: 1 }, { path: routes.map(), changeFrequency: "daily", priority: 0.9 }, { path: routes.datacenters(), changeFrequency: "daily", priority: 0.9 }, { path: routes.markets(), changeFrequency: "daily", priority: 0.8 }, { path: routes.operators(), changeFrequency: "daily", priority: 0.8 }, { path: routes.countries(), changeFrequency: "daily", priority: 0.8 }, { path: routes.projects(), changeFrequency: "daily", priority: 0.8 }, { path: routes.rankings(), changeFrequency: "daily", priority: 0.7 }, { path: routes.cloudRegions(), changeFrequency: "weekly", priority: 0.7 }, { path: routes.ixps(), changeFrequency: "weekly", priority: 0.5 }, { path: routes.live(), changeFrequency: "hourly", priority: 0.7 }, { path: routes.sources(), changeFrequency: "weekly", priority: 0.5 }, { path: routes.methodology(), changeFrequency: "monthly", priority: 0.5 }, { path: routes.bot(), changeFrequency: "monthly", priority: 0.3 }, { path: routes.about(), changeFrequency: "monthly", priority: 0.4 }, { path: routes.search(), changeFrequency: "monthly", priority: 0.3 }, ]; export const KIND_HREF: Record string> = { facilities: routes.facility, operators: routes.operator, countries: routes.country, metros: routes.market, projects: routes.project, "cloud-regions": routes.cloudRegion, }; export const KIND_FREQ: Record = { facilities: "weekly", operators: "weekly", countries: "daily", metros: "daily", projects: "weekly", "cloud-regions": "monthly", }; export function sitemapIds(): string[] { const ids = ["static"]; for (const kind of SITEMAP_KINDS) for (let p = 1; p <= PAGES_PER_KIND; p++) ids.push(`${kind}-${p}`); return ids; } export function parseSitemapId(id: string): { kind: SitemapKind; page: number } | "static" | null { if (id === "static") return "static"; const m = /^(.+)-(\d+)$/.exec(id); if (!m) return null; const kind = m[1] as SitemapKind; if (!(SITEMAP_KINDS as readonly string[]).includes(kind)) return null; const page = Number(m[2]); return page >= 1 && page <= PAGES_PER_KIND ? { kind, page } : null; }