@benpsnyder/analogjs-esm-vite-plugin-nitro
Version:
A Vite plugin for adding a nitro API server
68 lines • 2.46 kB
JavaScript
import { writeFileSync } from 'node:fs';
import { create } from 'xmlbuilder2';
import { resolve } from 'node:path';
export async function buildSitemap(config, sitemapConfig, routes, outputDir, routeSitemaps) {
const routeList = await optionHasRoutes(routes);
if (routeList.length) {
const slash = checkSlash(sitemapConfig.host || '');
const sitemapData = routeList.map((page) => {
const url = `${slash}${page.replace(/^\/+/g, '')}`;
const config = routeSitemaps[url];
const props = typeof config === 'object' ? config : config?.();
return {
page: `${sitemapConfig.host}${url}`,
lastMod: props?.lastmod ?? new Date().toISOString().split('T')[0],
changefreq: props?.changefreq,
priority: props?.priority,
};
});
const sitemap = createXml('urlset');
for (const item of sitemapData) {
const page = sitemap.ele('url');
page.ele('loc').txt(item.page);
page.ele('lastmod').txt(item.lastMod);
if (item.changefreq) {
page.ele('changefreq').txt(item.changefreq);
}
if (item.priority) {
page.ele('priority').txt(item.priority);
}
}
const mapPath = `${resolve(outputDir)}/sitemap.xml`;
try {
console.log(`Writing sitemap at ${mapPath}`);
writeFileSync(mapPath, sitemap.end({ prettyPrint: true }));
}
catch (e) {
console.error(`Unable to write file at ${mapPath}`, e);
}
}
}
function createXml(elementName) {
return create({ version: '1.0', encoding: 'UTF-8' })
.ele(elementName, {
xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',
})
.com(`This file was automatically generated by Analog.`);
}
function checkSlash(host) {
const finalChar = host.slice(-1);
return finalChar === '/' ? '' : '/';
}
async function optionHasRoutes(routes) {
let routeList;
if (typeof routes === 'function') {
// returns an array or undefined
routeList = await routes();
}
else if (Array.isArray(routes)) {
// returns an array of strings
routeList = routes;
}
else {
// default it to an empty of array
routeList = [];
}
return routeList.filter(Boolean);
}
//# sourceMappingURL=build-sitemap.js.map