- bunext build records when each page's client bundle hash last changed
in .bunext/page-lastmod.json (sitemap.lastmod_file to relocate). The
hash covers the page's whole import graph, so component edits re-date
every page that uses them. The sitemap uses these dates as lastmod
- Add sitemap.default_lastmod
- BREAKING: use_file_lastmod now defaults to false (file mtimes are reset
by checkouts); it is a fallback after the build record
- Warn when a page or __root.tsx is skipped because its default export
is not at the start of a line (e.g. export { Page as default })
- Replace leaking module mocks in tests (log, grab-root-file-path) with
spies and fixtures
Co-Authored-By: Claude Opus 5.5 <[email protected]>
60 lines
2.5 KiB
JavaScript
60 lines
2.5 KiB
JavaScript
import { Command } from "commander";
|
|
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";
|
|
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();
|
|
export default function () {
|
|
return new Command("build")
|
|
.description("Build Project")
|
|
.action(async () => {
|
|
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 });
|
|
// 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();
|
|
});
|
|
}
|