SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
4 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
2.8 KB · 66 lines typescript
Raw Blame History
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