@studiocms/blog
Version:
Add a blog to your StudioCMS project with ease!
124 lines (123 loc) • 3.85 kB
JavaScript
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
};