opencode/script/profile-typecheck-packages.ts
2026-07-06 17:17:30 -05:00

66 lines
1.9 KiB
TypeScript

#!/usr/bin/env bun
import path from "path"
const root = path.resolve(import.meta.dir, "..")
const proc = Bun.spawn(
[
"bun",
"turbo",
"typecheck",
"--concurrency=1",
"--force",
"--continue=always",
"--summarize",
"--output-logs=errors-only",
],
{
cwd: root,
stdout: "pipe",
stderr: "pipe",
},
)
const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited])
const output = stdout + stderr
if (exitCode !== 0) {
process.stdout.write(stdout)
process.stderr.write(stderr)
process.exit(exitCode)
}
const summary = output.match(/Summary:\s+(.+\.json)/)?.[1]?.trim()
if (!summary) {
process.stdout.write(stdout)
process.stderr.write(stderr)
throw new Error("Turbo did not report a run summary")
}
const report = (await Bun.file(summary).json()) as {
tasks: Array<{
taskId: string
execution: { startTime: number; endTime: number; exitCode: number } | null
}>
}
const tasks = report.tasks
.flatMap((task) =>
task.execution
? [
{
task: task.taskId.replace(/#typecheck$/, ""),
durationMs: task.execution.endTime - task.execution.startTime,
},
]
: [],
)
.sort((a, b) => b.durationMs - a.durationMs)
const total = tasks.reduce((duration, task) => duration + task.durationMs, 0)
const width = Math.max(...tasks.map((task) => task.task.length), "Package".length)
console.log(`Package${" ".repeat(width - "Package".length)} Time Share`)
tasks.forEach((task) => {
const duration = `${(task.durationMs / 1000).toFixed(2)}s`.padStart(7)
const share = `${((task.durationMs / total) * 100).toFixed(1)}%`.padStart(6)
console.log(`${task.task.padEnd(width)} ${duration} ${share}`)
})
console.log(`\nTotal serial task time: ${(total / 1000).toFixed(2)}s`)
console.log(`Turbo summary: ${path.relative(root, summary)}`)