From 48ac803bc3d0e18e827cd0f36eeba727f2470df4 Mon Sep 17 00:00:00 2001 From: Xevion Date: Mon, 5 Jan 2026 19:34:02 -0600 Subject: [PATCH] feat: parallelize check tasks with real-time progress output --- Justfile | 65 ++++++++++++++++++++++++++++++++++++++++++++---- web/package.json | 3 ++- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/Justfile b/Justfile index d34ecbe..ab26862 100644 --- a/Justfile +++ b/Justfile @@ -3,12 +3,67 @@ set dotenv-load default: just --list +[script("bun")] check: - bun run --cwd web format - bun run --cwd web lint - bun run --cwd web check - cargo clippy --all-targets - cargo fmt --check + const checks = [ + { name: "prettier", cmd: ["bun", "run", "--cwd", "web", "format:check"] }, + { name: "eslint", cmd: ["bun", "run", "--cwd", "web", "lint"] }, + { name: "svelte-check", cmd: ["bun", "run", "--cwd", "web", "check"] }, + { name: "clippy", cmd: ["cargo", "clippy", "--all-targets"] }, + { name: "rustfmt", cmd: ["cargo", "fmt", "--check"] }, + ]; + + const start = Date.now(); + const remaining = new Set(checks.map(c => c.name)); + const results = []; + + // Spawn all checks in parallel + const promises = checks.map(async (check) => { + const proc = Bun.spawn(check.cmd, { + env: { ...process.env, FORCE_COLOR: "1" }, + stdout: "pipe", + stderr: "pipe", + }); + + const [stdout, stderr] = await Promise.all([ + new Response(proc.stdout).text(), + new Response(proc.stderr).text(), + ]); + + await proc.exited; + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + + return { ...check, stdout, stderr, exitCode: proc.exitCode, elapsed }; + }); + + // Progress updater + const interval = setInterval(() => { + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + const tasks = Array.from(remaining).join(", "); + process.stderr.write(`\r\x1b[K${elapsed}s [${tasks}]`); + }, 100); + + // Stream outputs as they complete + let anyFailed = false; + for (const promise of promises) { + const result = await promise; + remaining.delete(result.name); + + if (result.exitCode !== 0) { + anyFailed = true; + process.stderr.write(`\r\x1b[K`); + process.stdout.write(`❌ ${result.name} (${result.elapsed}s)\n`); + if (result.stdout) process.stdout.write(result.stdout); + if (result.stderr) process.stderr.write(result.stderr); + } else { + process.stderr.write(`\r\x1b[K`); + process.stdout.write(`✅ ${result.name} (${result.elapsed}s)\n`); + } + } + + clearInterval(interval); + process.stderr.write(`\r\x1b[K`); + process.exit(anyFailed ? 1 : 0); build: bun run --cwd web build diff --git a/web/package.json b/web/package.json index 4290664..951871e 100644 --- a/web/package.json +++ b/web/package.json @@ -12,7 +12,8 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "clean": "rm -rf .svelte-kit build node_modules", "lint": "eslint .", - "format": "prettier --write ." + "format": "prettier --write .", + "format:check": "prettier --check ." }, "dependencies": { "@fontsource-variable/inter": "^5.2.8",