import type { MetadataRoute } from 'next'; import { getBuildingsForMod, getMods, getUnitsForMod, SITE_URL, } from '@/lib/api-server'; export const dynamic = 'force-dynamic'; export default async function sitemap(): Promise { const mods = (await getMods()) ?? []; const modEntries: MetadataRoute.Sitemap = mods.map((mod) => ({ url: `${SITE_URL}/mod/${mod.id}`, lastModified: new Date(), changeFrequency: 'weekly', priority: 0.8, })); const entries: MetadataRoute.Sitemap = [...modEntries]; // Gather races/units/buildings per mod (limit parallelism) const details = await Promise.all( mods.slice(0, 20).map(async (mod) => { const [units, buildings] = await Promise.all([ getUnitsForMod(mod.id), getBuildingsForMod(mod.id), ]); return { mod, units, buildings }; }) ); for (const { mod, units, buildings } of details) { const raceIds = new Set(); for (const unitGroup of units ?? []) raceIds.add(unitGroup.race.id); for (const buildingGroup of buildings ?? []) raceIds.add(buildingGroup.race.id); for (const raceId of raceIds) { entries.push({ url: `${SITE_URL}/mod/${mod.id}/race/${raceId}`, lastModified: new Date(), changeFrequency: 'weekly', priority: 0.7, }); } for (const unitGroup of units ?? []) { for (const unit of [...unitGroup.infantry, ...unitGroup.support, ...unitGroup.tech]) { entries.push({ url: `${SITE_URL}/mod/${mod.id}/race/${unitGroup.race.id}/unit/${unit.id}`, lastModified: new Date(), changeFrequency: 'monthly', priority: 0.5, }); } } for (const buildingGroup of buildings ?? []) { for (const building of [...buildingGroup.buildings, ...buildingGroup.buildingsAdvanced]) { entries.push({ url: `${SITE_URL}/mod/${mod.id}/race/${buildingGroup.race.id}/building/${building.id}`, lastModified: new Date(), changeFrequency: 'monthly', priority: 0.5, }); } } } return [ { url: SITE_URL, lastModified: new Date(), changeFrequency: 'daily', priority: 1, }, ...entries, ]; }