UNPKG

@studiocms/blog

Version:

Add a blog to your StudioCMS project with ease!

44 lines (43 loc) 1.76 kB
import blogConfig from "studiocms:blog/config"; import { pathWithBase } from "studiocms:lib"; import { SDKCore } from "studiocms:sdk"; import rss, {} from "@astrojs/rss"; import { createJsonResponse, Effect, withEffectAPI } from "studiocms/effect"; import { getBlogRoute } from "../utils/remapFilter.js"; const GET = withEffectAPI( Effect.fn(function* ({ site: _site, locals }) { const sdk = yield* SDKCore; const config = locals?.StudioCMS?.siteConfig?.data; const siteTitle = config?.title ?? "StudioCMS"; const title = `${siteTitle} | ${blogConfig.title}`; const description = config?.description ?? "Blog"; const site = _site ?? "https://example.com"; const posts = yield* sdk.GET.pages(); const sortedPosts = posts.map(({ data }) => data).filter(({ package: pkg }) => pkg === "@studiocms/blog").sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime()); const items = sortedPosts.map( ({ title: title2, description: description2, publishedAt, slug, categories: categoryData }) => { const link = pathWithBase(getBlogRoute(slug)); const categories = (categoryData ?? []).map(({ name }) => name); const pubDate = typeof publishedAt === "string" ? new Date(publishedAt) : publishedAt; return { title: title2, description: description2, pubDate, link, categories }; } ); return rss({ title, description, site, items }); }), { cors: { methods: ["GET"], origin: "*" }, onError: async (error) => { console.error("Error generating RSS feed:", error); return createJsonResponse({ error: "Something went wrong" }, { status: 500 }); } } ); export { GET };