40 lines
2.2 KiB
TypeScript
40 lines
2.2 KiB
TypeScript
import type { MetadataRoute } from 'next';
|
|
import { db } from '@/lib/server/db';
|
|
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
const base = (process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000').replace(/\/$/, '');
|
|
const now = new Date();
|
|
const staticPages: MetadataRoute.Sitemap = [
|
|
{ url: `${base}/`, lastModified: now, changeFrequency: 'weekly', priority: 1 },
|
|
{ url: `${base}/blog`, lastModified: now, changeFrequency: 'weekly', priority: 0.9 },
|
|
{ url: `${base}/docs`, lastModified: now, changeFrequency: 'weekly', priority: 0.8 },
|
|
{ url: `${base}/tags`, lastModified: now, changeFrequency: 'weekly', priority: 0.5 },
|
|
{ url: `${base}/search`, lastModified: now, changeFrequency: 'monthly', priority: 0.4 },
|
|
{ url: `${base}/pricing`, lastModified: now, changeFrequency: 'monthly', priority: 0.6 },
|
|
{ url: `${base}/legal/privacy`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 },
|
|
{ url: `${base}/legal/terms`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 },
|
|
];
|
|
|
|
let dynamicPages: MetadataRoute.Sitemap = [];
|
|
try {
|
|
const [posts, docs, tags, authors] = await Promise.all([
|
|
db.post.findMany({ where: { status: 'published' }, select: { slug: true, updatedAt: true } }),
|
|
db.doc.findMany({ where: { status: 'published' }, select: { slug: true, updatedAt: true } }),
|
|
db.tag.findMany({ select: { slug: true } }),
|
|
db.author.findMany({ select: { slug: true } }),
|
|
]);
|
|
dynamicPages = [
|
|
...posts.map((p) => ({ url: `${base}/blog/${p.slug}`, lastModified: p.updatedAt, changeFrequency: 'monthly' as const, priority: 0.7 })),
|
|
...docs.map((d) => ({ url: `${base}/docs/${d.slug}`, lastModified: d.updatedAt, changeFrequency: 'monthly' as const, priority: 0.6 })),
|
|
...tags.map((t) => ({ url: `${base}/tags/${t.slug}`, lastModified: now, changeFrequency: 'weekly' as const, priority: 0.4 })),
|
|
...authors.map((a) => ({ url: `${base}/authors/${a.slug}`, lastModified: now, changeFrequency: 'weekly' as const, priority: 0.4 })),
|
|
];
|
|
} catch {
|
|
dynamicPages = [];
|
|
}
|
|
|
|
return [...staticPages, ...dynamicPages];
|
|
}
|