hopefully fix build times

This commit is contained in:
KingKDot
2026-07-30 16:09:24 -05:00
parent 68a733ab81
commit d829864527
4 changed files with 150 additions and 29 deletions
+39 -15
View File
@@ -34,6 +34,10 @@ const htmlOpts = {
type Stats = { js: number; css: number; html: number; savedBytes: number };
const stats: Stats = { js: 0, css: 0, html: 0, savedBytes: 0 };
let failures = 0;
const requestedConcurrency = Number.parseInt(process.env.MINIFY_CONCURRENCY || "", 10);
const minifyConcurrency = Number.isFinite(requestedConcurrency) && requestedConcurrency > 0
? requestedConcurrency
: 4;
async function collectFiles(dir: string, exts: Set<string>): Promise<string[]> {
const results: string[] = [];
@@ -86,28 +90,48 @@ async function minifyHTML(filePath: string) {
stats.html++;
}
async function runPool<T>(
items: T[],
concurrency: number,
worker: (item: T) => Promise<void>,
): Promise<void> {
let nextIndex = 0;
const workers = Array.from(
{ length: Math.min(concurrency, Math.max(1, items.length)) },
async () => {
while (nextIndex < items.length) {
const item = items[nextIndex++];
await worker(item);
}
},
);
await Promise.all(workers);
}
// Collect all files
const jsFiles = await collectFiles(path.join(publicDir, "assets"), new Set([".js"]));
const cssFiles = await collectFiles(path.join(publicDir, "assets"), new Set([".css"]));
const htmlFiles = await collectFiles(publicDir, new Set([".html"]));
console.log(`Minifying ${jsFiles.length} JS, ${cssFiles.length} CSS, ${htmlFiles.length} HTML files...`);
console.log(
`Minifying ${jsFiles.length} JS, ${cssFiles.length} CSS, ${htmlFiles.length} HTML files ` +
`(concurrency=${minifyConcurrency})...`,
);
// Process in parallel batches
await Promise.all([
...jsFiles.map((f) => minifyJS(f).catch((e) => {
const jobs = [
...jsFiles.map((file) => ({ kind: "JS", file, minify: minifyJS })),
...cssFiles.map((file) => ({ kind: "CSS", file, minify: minifyCSS })),
...htmlFiles.map((file) => ({ kind: "HTML", file, minify: minifyHTML })),
];
await runPool(jobs, minifyConcurrency, async ({ kind, file, minify }) => {
try {
await minify(file);
} catch (e) {
failures++;
console.error(`JS error ${f}: ${e.message}`);
})),
...cssFiles.map((f) => minifyCSS(f).catch((e) => {
failures++;
console.error(`CSS error ${f}: ${e.message}`);
})),
...htmlFiles.map((f) => minifyHTML(f).catch((e) => {
failures++;
console.error(`HTML error ${f}: ${e.message}`);
})),
]);
const message = e instanceof Error ? e.message : String(e);
console.error(`${kind} error ${file}: ${message}`);
}
});
console.log(
`Done: ${stats.js} JS, ${stats.css} CSS, ${stats.html} HTML — saved ${(stats.savedBytes / 1024).toFixed(1)} KB`,
+5
View File
@@ -361,15 +361,20 @@ rmSync(ansiTmp, { force: true });
console.log("Downloading countries GeoJSON ...");
const geojsonDest = path.join(VENDOR, "geo-countries", "countries.geojson");
ensureDir(path.dirname(geojsonDest));
const geojsonController = new AbortController();
const geojsonTimeout = setTimeout(() => geojsonController.abort(), 15_000);
try {
const resp = await fetch(
"https://cdn.jsdelivr.net/gh/datasets/geo-countries@master/data/countries.geojson",
{ signal: geojsonController.signal },
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
await Bun.write(geojsonDest, resp);
console.log(" GeoJSON saved (" + ((await Bun.file(geojsonDest).size) / 1024 / 1024).toFixed(1) + " MB)");
} catch (err) {
console.warn(" WARNING: Could not download GeoJSON. Map features may not work offline.", err);
} finally {
clearTimeout(geojsonTimeout);
}
/* ── done ─────────────────────────────────────────────────────────── */