43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { getAllWebpages } from "@/content/pages/pages";
|
|
import { getSettings } from "@/content/settings/settings";
|
|
import type { APIRoute } from "astro";
|
|
import minifyXML from "minify-xml";
|
|
|
|
export const GET = (async () => {
|
|
const settings = await getSettings();
|
|
|
|
const webPages = await getAllWebpages();
|
|
const pageCount = webPages.length;
|
|
const perPage = settings.sitemap.perPage;
|
|
const pages = Math.ceil(pageCount / perPage);
|
|
|
|
let sitemaps: SitemapIndex[] = [];
|
|
|
|
for (let i = 0; i < pages; i++) {
|
|
sitemaps.push({
|
|
url: `/sitemap/pages-${i + 1}.xml`,
|
|
lastModified: new Date()
|
|
});
|
|
}
|
|
|
|
let sitemapContent = `
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
${sitemaps.map((item) => `
|
|
<sitemap>
|
|
<loc>${settings.website.domainName}${item.url}</loc>
|
|
<lastmod>${item.lastModified.toISOString()}</lastmod>
|
|
</sitemap>
|
|
`).join('')}
|
|
</sitemapindex>
|
|
`;
|
|
|
|
return new Response(minifyXML(sitemapContent), {
|
|
status: 200,
|
|
statusText: "OK",
|
|
headers: {
|
|
"Content-Type": "application/xml"
|
|
}
|
|
});
|
|
}) satisfies APIRoute;
|