Skip to content

Commit 613e52d

Browse files
committed
feat: add progress reporting
1 parent 514b63f commit 613e52d

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

src/progress.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
export class ProgressReporter {
2+
readonly #jsonMode: boolean;
3+
4+
constructor(jsonMode: boolean) {
5+
this.#jsonMode = jsonMode;
6+
}
7+
8+
startStep(name: string): StepHandle {
9+
if (this.#jsonMode) {
10+
process.stdout.write(`${JSON.stringify({ event: "step:start", name })}\n`);
11+
} else {
12+
process.stdout.write(`* ${name}\n`);
13+
}
14+
return new StepHandle(name, this.#jsonMode);
15+
}
16+
17+
info(message: string): void {
18+
if (this.#jsonMode) {
19+
process.stdout.write(`${JSON.stringify({ event: "info", message })}\n`);
20+
return;
21+
}
22+
process.stdout.write(` ${message}\n`);
23+
}
24+
}
25+
26+
class StepHandle {
27+
readonly #name: string;
28+
readonly #jsonMode: boolean;
29+
readonly #startedAt: number;
30+
31+
constructor(name: string, jsonMode: boolean) {
32+
this.#name = name;
33+
this.#jsonMode = jsonMode;
34+
this.#startedAt = Date.now();
35+
}
36+
37+
done(details?: string): void {
38+
const elapsedMs = Date.now() - this.#startedAt;
39+
if (this.#jsonMode) {
40+
process.stdout.write(`${JSON.stringify({ event: "step:done", name: this.#name, elapsedMs, details })}\n`);
41+
return;
42+
}
43+
44+
const suffix = details === undefined ? "" : ` ${details}`;
45+
process.stdout.write(` done ${this.#name} (${elapsedMs}ms)${suffix}\n`);
46+
}
47+
}

0 commit comments

Comments
 (0)