feat: add sitemap.xml, robots.txt, full SEO metadata
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import type { MetadataRoute } from 'next';
|
||||
import { getLessons } from '@/lib/actions/lessonActions';
|
||||
import { getCheatsheets } from '@/lib/actions/cheatsheetActions';
|
||||
import { getPrompts } from '@/lib/actions/promptActions';
|
||||
|
||||
const BASE_URL = 'https://ayrisai.xyz';
|
||||
const LOCALES = ['en'];
|
||||
|
||||
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
||||
const now = new Date();
|
||||
|
||||
// Static pages
|
||||
const staticRoutes = [
|
||||
{ path: '', priority: 1.0, changeFrequency: 'daily' as const },
|
||||
{ path: '/lessons', priority: 0.9, changeFrequency: 'daily' as const },
|
||||
{ path: '/cheatsheets', priority: 0.8, changeFrequency: 'weekly' as const },
|
||||
{ path: '/prompts', priority: 0.8, changeFrequency: 'weekly' as const },
|
||||
{ path: '/contact', priority: 0.5, changeFrequency: 'monthly' as const },
|
||||
];
|
||||
|
||||
const staticEntries: MetadataRoute.Sitemap = LOCALES.flatMap((locale) =>
|
||||
staticRoutes.map(({ path, priority, changeFrequency }) => ({
|
||||
url: `${BASE_URL}/${locale}${path}`,
|
||||
lastModified: now,
|
||||
changeFrequency,
|
||||
priority,
|
||||
}))
|
||||
);
|
||||
|
||||
// Dynamic: Lessons
|
||||
let lessonEntries: MetadataRoute.Sitemap = [];
|
||||
try {
|
||||
const lessons = await getLessons();
|
||||
lessonEntries = LOCALES.flatMap((locale) =>
|
||||
lessons.map((lesson: any) => ({
|
||||
url: `${BASE_URL}/${locale}/lessons/${lesson.slug}`,
|
||||
lastModified: lesson.updatedAt || now,
|
||||
changeFrequency: 'weekly' as const,
|
||||
priority: 0.85,
|
||||
}))
|
||||
);
|
||||
} catch {}
|
||||
|
||||
// Dynamic: Cheatsheets
|
||||
let cheatEntries: MetadataRoute.Sitemap = [];
|
||||
try {
|
||||
const sheets = await getCheatsheets();
|
||||
cheatEntries = LOCALES.flatMap((locale) =>
|
||||
sheets.map((sheet: any) => ({
|
||||
url: `${BASE_URL}/${locale}/cheatsheets/${sheet.slug}`,
|
||||
lastModified: sheet.updatedAt || now,
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.7,
|
||||
}))
|
||||
);
|
||||
} catch {}
|
||||
|
||||
// Dynamic: Prompts
|
||||
let promptEntries: MetadataRoute.Sitemap = [];
|
||||
try {
|
||||
const prompts = await getPrompts();
|
||||
promptEntries = LOCALES.flatMap((locale) =>
|
||||
prompts.map((prompt: any) => ({
|
||||
url: `${BASE_URL}/${locale}/prompts/${prompt.slug}`,
|
||||
lastModified: prompt.updatedAt || now,
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.7,
|
||||
}))
|
||||
);
|
||||
} catch {}
|
||||
|
||||
return [...staticEntries, ...lessonEntries, ...cheatEntries, ...promptEntries];
|
||||
}
|
||||
Reference in New Issue
Block a user