spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1import type { MetadataRoute } from "next";2import { SITEMAP_KINDS, type SitemapKind } from "@/lib/dto";3import { routes } from "@/lib/routes";45/**6 * Shared by app/sitemap.ts (per-id sitemaps at /sitemap/<id>.xml) and app/sitemap.xml/route.ts (the index).7 * Ids are deterministic strings so the index never depends on the API being reachable at build time:8 * static · <kind>-1 … <kind>-PAGES_PER_KIND (5 000 URLs per API page; empty pages yield no URLs)9 */10export const PAGES_PER_KIND = 4;1112type Freq = MetadataRoute.Sitemap[number]["changeFrequency"];1314export const STATIC_PAGES: Array<{ path: string; changeFrequency: Freq; priority: number }> = [15 { path: routes.home(), changeFrequency: "hourly", priority: 1 },16 { path: routes.map(), changeFrequency: "daily", priority: 0.9 },17 { path: routes.datacenters(), changeFrequency: "daily", priority: 0.9 },18 { path: routes.markets(), changeFrequency: "daily", priority: 0.8 },19 { path: routes.operators(), changeFrequency: "daily", priority: 0.8 },20 { path: routes.countries(), changeFrequency: "daily", priority: 0.8 },21 { path: routes.projects(), changeFrequency: "daily", priority: 0.8 },22 { path: routes.rankings(), changeFrequency: "daily", priority: 0.7 },23 { path: routes.cloudRegions(), changeFrequency: "weekly", priority: 0.7 },24 { path: routes.ixps(), changeFrequency: "weekly", priority: 0.5 },25 { path: routes.live(), changeFrequency: "hourly", priority: 0.7 },26 { path: routes.sources(), changeFrequency: "weekly", priority: 0.5 },27 { path: routes.methodology(), changeFrequency: "monthly", priority: 0.5 },28 { path: routes.bot(), changeFrequency: "monthly", priority: 0.3 },29 { path: routes.about(), changeFrequency: "monthly", priority: 0.4 },30 { path: routes.search(), changeFrequency: "monthly", priority: 0.3 },31];3233export const KIND_HREF: Record<SitemapKind, (slug: string) => string> = {34 facilities: routes.facility,35 operators: routes.operator,36 countries: routes.country,37 metros: routes.market,38 projects: routes.project,39 "cloud-regions": routes.cloudRegion,40};4142export const KIND_FREQ: Record<SitemapKind, Freq> = {43 facilities: "weekly",44 operators: "weekly",45 countries: "daily",46 metros: "daily",47 projects: "weekly",48 "cloud-regions": "monthly",49};5051export function sitemapIds(): string[] {52 const ids = ["static"];53 for (const kind of SITEMAP_KINDS) for (let p = 1; p <= PAGES_PER_KIND; p++) ids.push(`${kind}-${p}`);54 return ids;55}5657export function parseSitemapId(id: string): { kind: SitemapKind; page: number } | "static" | null {58 if (id === "static") return "static";59 const m = /^(.+)-(\d+)$/.exec(id);60 if (!m) return null;61 const kind = m[1] as SitemapKind;62 if (!(SITEMAP_KINDS as readonly string[]).includes(kind)) return null;63 const page = Number(m[2]);64 return page >= 1 && page <= PAGES_PER_KIND ? { kind, page } : null;65}66