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 ", "Output file relative to the project root (default: public/sitemap.xml)") .option("--origin ", "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(//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(); }); }