diff --git a/src/routes/sitemap.xml/+server.ts b/src/routes/sitemap.xml/+server.ts new file mode 100644 index 0000000..a8dca77 --- /dev/null +++ b/src/routes/sitemap.xml/+server.ts @@ -0,0 +1,53 @@ +import { removeTrailingSlash } from '$lib/utils/formatParse' +import { listPosts } from '$content/blog'; + +// prettier-ignore +const sitemap = (pages: string[]) => ` + + ${pages.map((page) => `${removeTrailingSlash(page)}`).join('')} + +`; + +export const GET = async () => { + const staticPages = Object.keys( + // For other static pages. Except content pages - changelogs, guides, blog posts, guides etc. + import.meta.glob('/src/routes/**/!(_)*.{svelte,md,svx}') + ) + .filter((page) => { + const filters = [ + '/src/routes/index.svelte', + '404', + 'slug]', + 'title]', + '+error', + '+layout' + ]; + return !filters.find((filter) => page.includes(filter)); + }) + .map((page) => { + return page + .replace('/src/routes', 'https://mattmor.in') + .replace('/index.md', '/') + .replace('.md', '/') + .replace('/index.svelte', '/') + .replace('.svelte', '/') + .replace('/+page', ''); + }); + + const Posts = listPosts().map((post) => `https://www.mattmor.in/blog/${post.slug}`); + const renderedSitemap = sitemap([...staticPages, ...Posts]); + + return new Response(renderedSitemap, { + headers: { + 'Cache-Control': 'max-age=0, s-maxage=3600', + 'Content-Type': 'application/xml' + } + }); +};