Files
bunext/dist/commands/sitemap/index.js
T
2026-10-14 17:41:50 +01:00

40 lines
1.8 KiB
JavaScript

import { Command } from "commander";
import { mkdirSync, writeFileSync } from "fs";
import path from "path";
import { log } from "../../utils/log";
import grabDirNames from "../../utils/grab-dir-names";
import grabConfig from "../../functions/grab-config";
import grabConstants from "../../utils/grab-constants";
import generateSitemap from "../../utils/generate-sitemap";
export default function () {
return new Command("sitemap")
.description("Generate sitemap.xml from the pages directory")
.option("-o, --output <path>", "Output file relative to the project root (default: public/sitemap.xml)")
.option("--origin <url>", "Base URL for sitemap links")
.action(async (options) => {
const { ROOT_DIR, PUBLIC_DIR } = grabDirNames();
global.BUNEXT_CONFIG = (await grabConfig()) || {};
global.BUNEXT_CONSTANTS = grabConstants();
const { output, ...sitemap_config } = global.BUNEXT_CONFIG.sitemap || {};
try {
const xml = await generateSitemap({
...sitemap_config,
origin: options.origin || sitemap_config.origin,
});
const output_path = options.output || output;
const output_file = output_path
? path.resolve(ROOT_DIR, output_path)
: path.join(PUBLIC_DIR, "sitemap.xml");
mkdirSync(path.dirname(output_file), { recursive: true });
writeFileSync(output_file, xml, "utf-8");
const url_count = xml.match(/<url>/g)?.length || 0;
log.success(`Sitemap with ${url_count} URLs written to ${path.relative(ROOT_DIR, output_file)}`);
}
catch (error) {
log.error(`Failed to generate sitemap: ${error?.message || error}`);
process.exit(1);
}
process.exit();
});
}