nuxt-simple-sitemap
Version:
Powerfully flexible XML Sitemaps that integrate seamlessly, for Nuxt.
36 lines (35 loc) • 1.57 kB
JavaScript
import { getQuery, setHeader } from "h3";
import { fixSlashes } from "site-config-stack/urls";
import { buildSitemap } from "./builder/sitemap.mjs";
import { buildSitemapIndex } from "./builder/sitemap-index.mjs";
import { useNitroApp } from "#internal/nitro";
import { createSitePathResolver, useSiteConfig } from "#internal/nuxt-site-config";
export function useNitroUrlResolvers(e) {
const canonicalQuery = getQuery(e).canonical;
const isShowingCanonical = typeof canonicalQuery !== "undefined" && canonicalQuery !== "false";
const siteConfig = useSiteConfig(e);
return {
event: e,
fixSlashes: (path) => fixSlashes(siteConfig.trailingSlash, path),
// we need these as they depend on the nitro event
canonicalUrlResolver: createSitePathResolver(e, {
canonical: isShowingCanonical || !process.dev,
absolute: true,
withBase: true
}),
relativeBaseUrlResolver: createSitePathResolver(e, { absolute: false, withBase: true })
};
}
export async function createSitemap(e, definition) {
const { sitemapName } = definition;
const nitro = useNitroApp();
let sitemap = await (definition.sitemapName === "index" ? buildSitemapIndex(useNitroUrlResolvers(e)) : buildSitemap(definition, useNitroUrlResolvers(e)));
const ctx = { sitemap, sitemapName };
await nitro.hooks.callHook("sitemap:output", ctx);
sitemap = ctx.sitemap;
setHeader(e, "Content-Type", "text/xml; charset=UTF-8");
if (!process.dev)
setHeader(e, "Cache-Control", "max-age=600, must-revalidate");
e.context._isSitemap = true;
return sitemap;
}