import type { StarlightPlugin, StarlightUserConfig, } from "@astrojs/starlight/types"; import type { AstroIntegrationLogger } from "astro"; import { vitePluginStarlightGhostConfig } from "./src/integrations/vite"; import { type StarlightGhostConfig, validateConfig, } from "./src/schemas/config"; import { facebook, getSettings, invariant, twitter } from "./src/utils/api"; const settings = await getSettings(); export type { StarlightGhostConfig }; export default function starlightGhostCMS( userConfig?: StarlightGhostConfig, ): StarlightPlugin { const config: StarlightGhostConfig = validateConfig(userConfig); invariant(settings, "Settings not available... check your api key/url"); return { name: "@matthiesenxyz/starlight-ghostcms-plugin", hooks: { setup({ astroConfig, addIntegration, config: starlightConfig, logger, updateConfig: updateStarlightConfig, }) { // Update the Starlight config with the GhostCMS config updateStarlightConfig({ social: { ...starlightConfig.social, rss: `${astroConfig.site}/rss.xml`, twitter: twitter(settings.twitter ? settings.twitter : ""), facebook: facebook(settings.facebook ? settings.facebook : ""), }, components: { ...starlightConfig.components, ...overrideStarlightComponent( starlightConfig.components, logger, "MarkdownContent", ), ...overrideStarlightComponent( starlightConfig.components, logger, "Sidebar", ), ...overrideStarlightComponent( starlightConfig.components, logger, "SiteTitle", ), }, }); // Add the Starlight-GhostCMS integration addIntegration({ name: "@matthiesenxyz/starlight-ghostcms", hooks: { "astro:config:setup": ({ injectRoute, updateConfig }) => { updateConfig({ vite: { plugins: [vitePluginStarlightGhostConfig(config)], }, }); const makeRoute = (endpoint: string, entrypoint: string) => { injectRoute({ pattern: `/${endpoint}`, entrypoint: `@matthiesenxyz/starlight-ghostcms/routes/${entrypoint}`, prerender: true, }); }; makeRoute("blog", "index.astro"); makeRoute("blog/[slug]", "[slug].astro"); makeRoute("blog/about", "about.astro"); makeRoute("blog/authors", "authors.astro"); makeRoute("rss.xml", "rss.xml.ts"); }, }, }); }, }, }; } function overrideStarlightComponent( components: StarlightUserConfig["components"], logger: AstroIntegrationLogger, component: keyof NonNullable, ) { if (components?.[component]) { logger.warn( `It looks like you already have a \`${component}\` component override in your Starlight configuration.`, ); logger.warn( `To use \`starlight-ghostcms\`, remove the override for the \`${component}\` component.\n`, ); logger.warn("This Warning can be ignored if you know what your doing ;)"); return {}; } return { [component]: `@matthiesenxyz/starlight-ghostcms/overrides/${component}.astro`, }; }