@quenty/cli-output-helpers
Version:
Helpers to generate Nevermore package and game templates
87 lines • 2.56 kB
JavaScript
import { BaseReporter } from '../reporter.js';
/**
* Centralized state container for a live batch run.
* Extends BaseReporter to receive lifecycle hooks and mutate state.
* Reporters read from it via the IStateTracker interface.
*/
export class LiveStateTracker extends BaseReporter {
_packages;
_startTimeMs = 0;
_completed = 0;
_failures = [];
_allResults = [];
constructor(packageNames) {
super();
this._packages = new Map();
for (const name of packageNames) {
this._packages.set(name, { name, status: 'pending' });
}
}
get total() {
return this._packages.size;
}
get completed() {
return this._completed;
}
get startTimeMs() {
return this._startTimeMs;
}
getPackage(name) {
return this._packages.get(name);
}
getAllPackages() {
return [...this._packages.values()];
}
getResults() {
return this._allResults;
}
getFailures() {
return this._failures;
}
getCurrentPhase(name) {
return this._packages.get(name)?.status;
}
async startAsync() {
this._startTimeMs = Date.now();
}
onPackageStart(name) {
const state = this._packages.get(name);
if (!state)
return;
state.status = 'building';
state.startMs = Date.now();
}
onPackagePhaseChange(name, phase) {
const state = this._packages.get(name);
if (!state)
return;
if (state.status === 'passed' || state.status === 'failed')
return; // don't regress terminal states
state.status = phase;
state.progress = undefined; // clear progress on phase transition
}
onPackageProgressUpdate(name, progress) {
const state = this._packages.get(name);
if (!state)
return;
state.progress = progress;
}
onPackageResult(result, bufferedOutput) {
const state = this._packages.get(result.packageName);
if (!state)
return;
state.status = result.success ? 'passed' : 'failed';
state.durationMs = result.durationMs;
state.result = result;
state.bufferedOutput = bufferedOutput;
if (result.progressSummary) {
state.progress = result.progressSummary;
}
this._completed++;
this._allResults.push(result);
if (!result.success) {
this._failures.push(result);
}
}
}
//# sourceMappingURL=live-state-tracker.js.map