From ca41a2608d784dc6cbe233cedba28adbdc6902ea Mon Sep 17 00:00:00 2001 From: tuna2134 Date: Sun, 5 Apr 2026 03:46:12 +0000 Subject: [PATCH] feat: add sitemap generation for announcements and static routes --- app/sitemap.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 app/sitemap.ts diff --git a/app/sitemap.ts b/app/sitemap.ts new file mode 100644 index 0000000..2dcb2b1 --- /dev/null +++ b/app/sitemap.ts @@ -0,0 +1,44 @@ +import type { MetadataRoute } from "next"; + +import { getAllAnnouncements } from "@/lib/announcements"; + +const SITE_URL = + process.env.NEXT_PUBLIC_SITE_URL ?? + process.env.SITE_URL ?? + "https://mc.neody.ad.jp"; + +function toAbsoluteUrl(pathname: string): string { + return new URL(pathname, SITE_URL).toString(); +} + +export default async function sitemap(): Promise { + const announcements = await getAllAnnouncements(); + + const staticRoutes: MetadataRoute.Sitemap = [ + { + url: toAbsoluteUrl("/"), + lastModified: new Date(), + changeFrequency: "weekly", + priority: 1, + }, + { + url: toAbsoluteUrl("/announcements/"), + lastModified: new Date(), + changeFrequency: "daily", + priority: 0.8, + }, + ]; + + const announcementRoutes: MetadataRoute.Sitemap = announcements.map((item) => { + const parsedDate = new Date(item.date); + + return { + url: toAbsoluteUrl(`/announcements/${item.slug}/`), + lastModified: Number.isNaN(parsedDate.getTime()) ? new Date() : parsedDate, + changeFrequency: "monthly", + priority: 0.7, + }; + }); + + return [...staticRoutes, ...announcementRoutes]; +}