feat: add dev/production modes to ts build script

This commit is contained in:
2026-07-03 02:36:42 +02:00
parent 1800335719
commit 49abffb21a

View File

@@ -1,9 +1,12 @@
import { spawnSync } from "node:child_process"; import { spawnSync } from "node:child_process";
import { cp, mkdir } from "node:fs/promises"; import { cp, mkdir, readFile, rm } from "node:fs/promises";
import { performance } from "node:perf_hooks"; import { performance } from "node:perf_hooks";
import { gzipSync } from "node:zlib";
type BuildStep = { name: string; args: string[] }; type BuildStep = { name: string; args: string[] };
const isProduction = !process.argv.includes("--development");
const buildSteps: BuildStep[] = [ const buildSteps: BuildStep[] = [
{ {
name: "player", name: "player",
@@ -15,6 +18,7 @@ const buildSteps: BuildStep[] = [
"--target", "--target",
"browser", "browser",
"--splitting", "--splitting",
"--sourcemap=none",
], ],
}, },
{ {
@@ -30,14 +34,18 @@ const buildSteps: BuildStep[] = [
"./static", "./static",
"--entry-naming", "--entry-naming",
"[name].js", "[name].js",
"--sourcemap=none",
], ],
}, },
]; ];
const bundlePaths = ["./dist/static/app.js", "./dist/static/player/main.js"];
const runBuildStep = (step: BuildStep): void => { const runBuildStep = (step: BuildStep): void => {
console.log(`building ${step.name}...`); console.log(`building ${step.name}...`);
const result = spawnSync("bun", step.args, { stdio: "inherit" }); const args = isProduction ? [...step.args, "--minify"] : step.args;
const result = spawnSync("bun", args, { stdio: "inherit" });
if (result.error) { if (result.error) {
throw new Error(`failed to start ${step.name} build: ${result.error.message}`); throw new Error(`failed to start ${step.name} build: ${result.error.message}`);
} }
@@ -49,18 +57,39 @@ const runBuildStep = (step: BuildStep): void => {
} }
}; };
const formatBytes = (bytes: number): string => `${(bytes / 1024).toFixed(1)}KB`;
const printBundleSizes = async (): Promise<void> => {
console.log("bundle sizes:");
const results = await Promise.all(
bundlePaths.map(async (path) => {
const contents = await readFile(path);
return { path, raw: contents.byteLength, gzip: gzipSync(contents).byteLength };
}),
);
for (const { path, raw, gzip } of results) {
console.log(` ${path}: ${formatBytes(raw)} raw, ${formatBytes(gzip)} gzip`);
}
};
const main = async (): Promise<void> => { const main = async (): Promise<void> => {
const startedAt = performance.now(); const startedAt = performance.now();
await rm("./dist/static", { recursive: true, force: true });
await mkdir("./dist/static", { recursive: true });
buildSteps.forEach((step) => { buildSteps.forEach((step) => {
runBuildStep(step); runBuildStep(step);
}); });
await mkdir("./dist/static", { recursive: true });
await cp("./node_modules/htmx.org/dist/htmx.min.js", "./dist/static/htmx-lib.js"); await cp("./node_modules/htmx.org/dist/htmx.min.js", "./dist/static/htmx-lib.js");
await printBundleSizes();
const elapsedMs = Math.round(performance.now() - startedAt); const elapsedMs = Math.round(performance.now() - startedAt);
console.log(`ts build ok (${buildSteps.length} entries, ${elapsedMs}ms)`); const mode = isProduction ? "production" : "development";
console.log(`ts build ok (${buildSteps.length} entries, ${mode}, ${elapsedMs}ms)`);
}; };
main().catch((error: unknown) => { main().catch((error: unknown) => {