From 663e797954721016625142c6a38d2915c0a6a698 Mon Sep 17 00:00:00 2001 From: memdmp Date: Mon, 26 Jan 2026 06:20:31 +0100 Subject: feat: an RSS --- src/routes/blog/feed.xml/+server.ts | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/routes/blog/feed.xml/+server.ts (limited to 'src/routes/blog/feed.xml/+server.ts') diff --git a/src/routes/blog/feed.xml/+server.ts b/src/routes/blog/feed.xml/+server.ts new file mode 100644 index 0000000..a2a80f5 --- /dev/null +++ b/src/routes/blog/feed.xml/+server.ts @@ -0,0 +1,41 @@ +import { RSS_ROOT } from '$/lib'; +import { RSSChannelElement, RSSItemElement, RSSRootElement } from '$/lib/vendor/rss/rss'; +import { XMLDeclaration, XMLDocumentRoot, XMLElement, XMLRootElement, XMLText } from '$/lib/vendor/rss/xml' +import { dev } from '$app/environment'; +import posts from '../posts'; + +export const GET = async (req) => { + const doc = new XMLDocumentRoot().child( + new XMLDeclaration().version().encoding(), + new RSSRootElement() + .channel( + new RSSChannelElement( + 'Latest blog posts for 7222e800', + 'Some Fancy Description Here', + RSS_ROOT + ) + .pubDate(new Date('2026-01-14T15:53:57Z') /* When the last item was published */) + .lastBuildDate(new Date() /* When this file was last updated - usually when your build process last ran */) + .language('en') + .child(new XMLElement('nonStandardElement').attribute('non-standard', 'true')) + .generator() + .items( + ...(await Promise.all(Object.values(posts))) + .filter(v => v.metadata.published === true || (dev && req.url.searchParams.has('include-unpublished'))) + .map(({ metadata }) => { + const item = new RSSItemElement(`${metadata.published === true ? '' : metadata.published ? '🚧 ' : '🛑 '}${metadata.title}`, metadata.blurb, new URL(`${metadata.id}-${metadata.slug}`, RSS_ROOT)); + if (metadata.author) + item.author(metadata.author); + item.pubDate(new Date(metadata.created)); + item.guid(new URL(`${metadata.id}`, RSS_ROOT).href, true) + return item; + }) + ), + ) + ) + return new Response(doc.toString(), { + headers: { + 'Content-Type': 'application/rss+xml;charset=utf-8' + } + }) +} -- cgit v1.2.3