SPB Git
1.5 KB · 15 lines typescript
1import type { MetadataRoute } from "next";2import { sqlPublic as sql } from "@/db";3import { APP_URL } from "@/lib/env";4export const revalidate = 3600;5export default async function sitemap(): Promise<MetadataRoute.Sitemap> {6  const papers = await sql`SELECT slug, updated_at FROM public_papers WHERE status = 'published' ORDER BY number`;7  const topics = await sql`SELECT slug FROM topics WHERE is_active`; const methods = await sql`SELECT slug FROM methods`; const datasets = await sql`SELECT slug FROM datasets`; const authors = await sql`SELECT slug FROM authors`;8  const statics = ["", "/papers", "/series", "/topics", "/methods", "/datasets", "/authors", "/research-map", "/timeline", "/search", "/about", "/citation", "/api/docs"];9  const out: MetadataRoute.Sitemap = [];10  for (const s of statics) out.push({ url: `${APP_URL}${s}`, changeFrequency: "weekly", priority: s === "" ? 1 : 0.6, alternates: { languages: { en: `${APP_URL}${s}`, fr: `${APP_URL}/fr${s}` } } });11  for (const p of papers) out.push({ url: `${APP_URL}/papers/${p.slug}`, lastModified: new Date(p.updated_at), changeFrequency: "monthly", priority: 0.9, alternates: { languages: { en: `${APP_URL}/papers/${p.slug}`, fr: `${APP_URL}/fr/papers/${p.slug}` } } });12  for (const [prefix, rows] of [["/topics", topics], ["/methods", methods], ["/datasets", datasets], ["/authors", authors]] as const) for (const r of rows) out.push({ url: `${APP_URL}${prefix}/${r.slug}`, changeFrequency: "monthly", priority: 0.5 });13  return out;14}15
Files · main
Menu

Theme