78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
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<MetadataRoute.Sitemap> {
|
|
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<string>();
|
|
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,
|
|
];
|
|
} |