import type { MetadataRoute } from "next"; import { getAllBlogPosts } from "./content"; import { sitemapUrl } from "./siteMetadata"; import { USE_CASE_DETAIL_SLUGS } from "./useCaseSyntheticPost"; const STATIC_PUBLIC_PATHS = [ "/", "/about", "/learn", "/templates", "/blog", "/use-cases", "/how-it-works", "/privacy", "/terms", "/cookies", ] as const; /** * Public marketing URLs for `/sitemap.xml`, plus listed published rules when * the caller supplies them. Omits signed-in product routes (`/create`, * `/login`, `/profile`), admin, and unlisted guest-claim `/rules/[id]`. */ export function buildPublicSitemap( listedRules: ReadonlyArray<{ id: string; updatedAt: Date }> = [], ): MetadataRoute.Sitemap { const entries: MetadataRoute.Sitemap = STATIC_PUBLIC_PATHS.map((path) => ({ url: sitemapUrl(path), })); for (const post of getAllBlogPosts()) { entries.push({ url: sitemapUrl(`/blog/${post.slug}`), lastModified: post.lastModified, }); } for (const slug of USE_CASE_DETAIL_SLUGS) { entries.push({ url: sitemapUrl(`/use-cases/${slug}`) }); entries.push({ url: sitemapUrl(`/use-cases/${slug}/rule`) }); } for (const rule of listedRules) { entries.push({ url: sitemapUrl(`/rules/${encodeURIComponent(rule.id)}`), lastModified: rule.updatedAt, }); } return entries; }