import type { MetadataRoute } from 'next'; import { api, safe } from '@/lib/api'; import { SITE_URL } from '@/lib/site'; /** * Sharded sitemaps via `generateSitemaps` → served at /sitemaps/sitemap/.xml; the index at /sitemap.xml is `app/sitemap.xml/route.ts`. Shards: `static`, `companies-` (only `indexed = true` companies, per the API), * `industries`, `countries`. Built from `GET /sitemap?kind&page`. */ export const revalidate = 3600; export async function generateSitemaps(): Promise<{ id: string }[]> { const ids: { id: string }[] = [{ id: 'static' }, { id: 'industries' }, { id: 'countries' }]; const first = await safe(api.sitemap('companies', 0)); const pages = Math.max(1, first?.pages ?? 1); for (let p = 0; p < pages; p++) ids.push({ id: `companies-${p}` }); return ids; } const STATIC = ['/', '/live', '/companies', '/events', '/rankings', '/industry', '/country', '/company/compare', '/about', '/methodology', '/api', '/system', '/bot']; export default async function sitemap(props: { id: Promise }): Promise { const id = await props.id; const now = new Date(); if (id === 'static') return STATIC.map((p) => ({ url: `${SITE_URL}${p}`, lastModified: now, changeFrequency: p === '/' || p === '/live' ? 'hourly' : 'daily', priority: p === '/' ? 1 : 0.7 })); if (id === 'industries') { const d = await safe(api.sitemap('industries', 0)); return (d?.items ?? []).map((i) => ({ url: `${SITE_URL}/industry/${i.slug}`, lastModified: i.updated_at ? new Date(i.updated_at) : now, changeFrequency: 'daily', priority: 0.6 })); } if (id === 'countries') { const d = await safe(api.sitemap('countries', 0)); return (d?.items ?? []).map((i) => ({ url: `${SITE_URL}/country/${i.slug.toLowerCase()}`, lastModified: i.updated_at ? new Date(i.updated_at) : now, changeFrequency: 'daily', priority: 0.6 })); } const m = /^companies-(\d+)$/.exec(id); if (!m) return []; const d = await safe(api.sitemap('companies', Number(m[1]))); return (d?.items ?? []).map((i) => ({ url: `${SITE_URL}/company/${i.slug}`, lastModified: i.updated_at ? new Date(i.updated_at) : now, changeFrequency: 'daily', priority: 0.8 })); }