import type { MetadataRoute } from 'next'; import { CATEGORIES, INDICES } from '@rareindex/taxonomy'; import { NAV } from '@/config/nav'; import { countAssets, getAssetSlugsForSitemap } from '@/lib/queries/assets'; import { getSetSlugsForSitemap } from '@/lib/queries/markets'; const SITE = process.env.NEXT_PUBLIC_SITE_URL ?? 'https://www.rareindex.io'; const PAGE = 20_000; export async function generateSitemaps() { let n = 0; try { n = await countAssets(); } catch { n = 0; } const assetPages = Math.max(1, Math.ceil(n / PAGE)); return [{ id: 0 }, ...Array.from({ length: assetPages }, (_, i) => ({ id: i + 1 }))]; } export default async function sitemap({ id }: { id: number }): Promise { const now = new Date(); if (id === 0) { let sets: string[] = []; try { sets = await getSetSlugsForSitemap(); } catch { sets = []; } return [ ...NAV.map((n) => ({ url: `${SITE}${n.href}`, lastModified: now, changeFrequency: 'hourly' as const, priority: n.href === '/' ? 1 : 0.7 })), ...CATEGORIES.map((c) => ({ url: `${SITE}/markets/${c.slug}`, lastModified: now, changeFrequency: 'hourly' as const, priority: c.phase === 1 ? 0.9 : 0.6 })), ...INDICES.map((i) => ({ url: `${SITE}/rareindex/${i.ticker}`, lastModified: now, changeFrequency: 'daily' as const, priority: 0.8 })), ...sets.map((s) => ({ url: `${SITE}/set/${s}`, lastModified: now, changeFrequency: 'daily' as const, priority: 0.6 })), { url: `${SITE}/records`, lastModified: now, changeFrequency: 'daily' as const, priority: 0.6 }, { url: `${SITE}/radar`, lastModified: now, changeFrequency: 'hourly' as const, priority: 0.5 }, ]; } try { const assets = await getAssetSlugsForSitemap((id - 1) * PAGE, PAGE); return assets.map((a) => ({ url: `${SITE}/asset/${a.slug}`, lastModified: a.updatedAt, changeFrequency: 'daily' as const, priority: 0.7 })); } catch { return []; } }