import { Command } from "commander"; import { DistDirOptionDescription, DistDirOptionFlags, } from "../dist-dir-option"; import { log } from "../../utils/log"; import grabDirNames from "../../utils/grab-dir-names"; import { rmSync, writeFileSync } from "fs"; import bunextInit from "../../functions/bunext-init"; import { v4 } from "uuid"; import { updatePageLastmodRecord } from "../../utils/page-lastmod-record"; import disposeBundlerContexts from "../../functions/bundler/dispose-bundler-contexts"; export default function () { return new Command("build") .description("Build Project") .option(DistDirOptionFlags, DistDirOptionDescription) .action(async () => { const { HYDRATION_DST_DIR, BUNX_CWD_PAGES_REWRITE_DIR, BUNDLER_CTX_MAP_JSON, SSR_BUNDLER_CTX_MAP_JSON, BUNX_CWD_MODULE_CACHE_DIR, BUILD_INFO_JSON, } = grabDirNames(); try { rmSync(HYDRATION_DST_DIR, { recursive: true }); rmSync(BUNX_CWD_PAGES_REWRITE_DIR, { recursive: true }); rmSync(BUNX_CWD_MODULE_CACHE_DIR, { recursive: true, force: true, }); } catch (error) { } global.BUNEXT_SKIPPED_BROWSER_MODULES = new Set(); await bunextInit({ build_only: true }); await disposeBundlerContexts({ stop_service: true }); // A failed bundle must fail the command: CI and scripts rely on // the exit code instead of grepping logs. if (global.BUNEXT_BUILD_FAILED) { log.error("Build failed with errors. Exiting."); process.exit(1); } if (global.BUNEXT_BUNDLER_CTX_MAP) { let bundler_ctx_json_str = JSON.stringify(global.BUNEXT_BUNDLER_CTX_MAP); writeFileSync(BUNDLER_CTX_MAP_JSON, bundler_ctx_json_str, "utf-8"); } if (global.BUNEXT_SSR_BUNDLER_CTX_MAP) { let ssr_bundler_ctx_json_str = JSON.stringify(global.BUNEXT_SSR_BUNDLER_CTX_MAP); writeFileSync(SSR_BUNDLER_CTX_MAP_JSON, ssr_bundler_ctx_json_str, "utf-8"); } const build_data = { build_id: v4(), build_date_unix: Date.now(), build_date: Date(), }; if (global.BUNEXT_BUNDLER_CTX_MAP) { try { updatePageLastmodRecord({ ctx_map: global.BUNEXT_BUNDLER_CTX_MAP, build_date: new Date(build_data.build_date_unix), }); } catch (error) { // Only sitemap dates depend on this; never fail the build. log.warn(`Could not update page lastmod record: ${error?.message || error}`); } } writeFileSync(BUILD_INFO_JSON, JSON.stringify(build_data, null, 4), "utf-8"); log.success("Modules Built Successfully!"); process.exit(); }); }