studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
49 lines (48 loc) • 1.65 kB
JavaScript
import { convertToSafeString } from "@withstudiocms/internal_helpers/utils";
import { addVirtualImports, createResolver } from "astro-integration-kit";
function safeString(str) {
return convertToSafeString(str).replace(/^_+/, "").replace(/_+$/, "").replace("studiocms_", "");
}
function dynamicSitemap(options) {
const { resolve } = createResolver(import.meta.url);
return {
name: "studiocms/dynamic-sitemap",
hooks: {
/* v8 ignore start */
"astro:config:setup": (params) => {
const { injectRoute } = params;
const { sitemaps } = options;
addVirtualImports(params, {
name: "studiocms/dynamic-sitemap",
imports: {
"virtual:studiocms/sitemaps": `
export const sitemaps = ${JSON.stringify([...sitemaps.map(({ pluginName }) => `./sitemap-${safeString(pluginName)}.xml`)])};
`
}
});
injectRoute({
entrypoint: resolve("./sitemap-index.xml.js"),
pattern: "/sitemap-index.xml",
prerender: false
});
const existingSitemaps = [];
for (const { pluginName, sitemapXMLEndpointPath: entrypoint } of sitemaps) {
let pattern = `/sitemap-${safeString(pluginName)}.xml`;
if (existingSitemaps.includes(pattern)) {
pattern = `/sitemap-${safeString(pluginName)}-${existingSitemaps.length}.xml`;
}
injectRoute({
entrypoint,
pattern,
prerender: false
});
}
}
/* v8 ignore stop */
}
};
}
export {
dynamicSitemap,
safeString
};