nuxt-simple-sitemap
Version:
Powerfully flexible XML Sitemaps that integrate seamlessly, for Nuxt.
39 lines (38 loc) • 1.73 kB
JavaScript
import { defu } from "defu";
import { defineNitroPlugin } from "nitropack/dist/runtime/plugin";
import { useSimpleSitemapRuntimeConfig } from "../../utils.mjs";
export default defineNitroPlugin((nitroApp) => {
const { discoverImages, isNuxtContentDocumentDriven } = useSimpleSitemapRuntimeConfig();
nitroApp.hooks.hook("content:file:afterParse", async (content) => {
if (content.sitemap === false || content._draft || content._extension !== "md" || content._partial || content.indexable === false || content.index === false)
return;
let images = [];
if (discoverImages) {
images = content.body?.children?.filter(
(c) => c.tag && c.props?.src && ["image", "img", "nuxtimg", "nuxt-img"].includes(c.tag.toLowerCase())
).map((i) => ({ loc: i.props.src })) || [];
}
const sitemapConfig = typeof content.sitemap === "object" ? content.sitemap : {};
const lastmod = content.modifiedAt || content.updatedAt;
const defaults = {};
if (isNuxtContentDocumentDriven)
defaults.loc = content._path;
if (content.path)
defaults.loc = content.path;
if (images.length > 0)
defaults.images = images;
if (lastmod)
defaults.lastmod = lastmod;
const definition = defu(sitemapConfig, defaults);
if (!definition.loc) {
if (content.path && content.path && content.path.startsWith("/"))
definition.loc = content.path;
if (Object.keys(sitemapConfig).length > 0 && import.meta.dev)
console.warn(`[nuxt-simple-sitemap] The @nuxt/content file \`${content._path}\` is missing a sitemap \`loc\`.`);
}
content.sitemap = definition;
if (!definition.loc)
delete content.sitemap;
return content;
});
});