UNPKG

@studiocms/blog

Version:

Add a blog to your StudioCMS project with ease!

124 lines (123 loc) 3.85 kB
import { addVirtualImports, createResolver } from "astro-integration-kit"; import { pathWithBase } from "studiocms/lib/pathGenerators"; import { definePlugin } from "studiocms/plugins"; import { FrontEndConfigSchema } from "./types.js"; const packageIdentifier = "@studiocms/blog"; function internalBlogIntegration(options) { const resolvedOptions = FrontEndConfigSchema.parse(options); const { blog: { title, enableRSS, route: orgRoute }, injectRoutes, ...frontendConfig } = resolvedOptions; const route = pathWithBase(orgRoute); const resEntrypoint = (path) => `@studiocms/blog/routes/${path}`; return { name: packageIdentifier, hooks: { /* v8 ignore start */ /* this is tested indirectly via the plugin tests */ "astro:config:setup": async (params) => { const { injectRoute } = params; if (injectRoutes) { injectRoute({ entrypoint: resEntrypoint("[...slug].astro"), pattern: pathWithBase("[...slug]"), prerender: false }); injectRoute({ entrypoint: resEntrypoint("blog/index.astro"), pattern: `${route}`, prerender: false }); injectRoute({ entrypoint: resEntrypoint("blog/[...slug].astro"), pattern: `${route}/[...slug]`, prerender: false }); if (enableRSS) { injectRoute({ entrypoint: resEntrypoint("rss.xml.js"), pattern: pathWithBase("rss.xml"), prerender: false }); } } addVirtualImports(params, { name: packageIdentifier, imports: { "studiocms:blog/config": ` const config = { title: ${JSON.stringify(title)}, enableRSS: ${enableRSS}, route: ${JSON.stringify(route)} } export default config; `, "studiocms:blog/frontend-config": ` const config = ${JSON.stringify(frontendConfig)}; export default config; ` } }); } /* v8 ignore stop */ } }; } function studioCMSBlogPlugin(options) { const resolvedOptions = FrontEndConfigSchema.parse(options); const { blog: { title, route: orgRoute }, sitemap } = resolvedOptions; const route = pathWithBase(orgRoute); const { resolve } = createResolver(import.meta.url); const editor = resolve("./components/editor.astro"); const renderer = resolve("./components/render.js"); return definePlugin({ identifier: packageIdentifier, name: "StudioCMS Blog", studiocmsMinimumVersion: "0.1.0-beta.21", requires: ["@studiocms/md"], hooks: { "studiocms:astro:config": ({ addIntegrations }) => { addIntegrations(internalBlogIntegration(resolvedOptions)); }, "studiocms:config:setup": ({ setFrontend, setRendering, setSitemap }) => { setFrontend({ frontendNavigationLinks: [{ label: title, href: route }] }); setRendering({ pageTypes: [ { identifier: packageIdentifier, label: "Blog Post (StudioCMS Blog)", pageContentComponent: editor, rendererComponent: renderer } ] }); setSitemap({ triggerSitemap: sitemap, sitemaps: [ { pluginName: packageIdentifier, sitemapXMLEndpointPath: resolve("./routes/sitemap-posts.xml.js") }, { pluginName: "pages", sitemapXMLEndpointPath: resolve("./routes/sitemap-md.xml.js") } ] }); } } }); } var index_default = studioCMSBlogPlugin; export { index_default as default, internalBlogIntegration, studioCMSBlogPlugin };