core/coordinators/report.coordinator.ts
core/coordinators/report.coordinator.ts is a file in GovLab Patterns. 78 lines of code and 17 definitions.
import type { CheckOps, DriftProbe, HealOps, HealResult, HealState, ModuleFindings } from "#types/report.types";
import { HEX_DIR, persistArtifacts, staleFiles } from "#core/persistence/report.persistence";
import { artifactDrift, artifactsEqual } from "#core/validators/report.validator";
import { driftModules, healedModules, modulesClean, rewrittenModules } from "#configuration/strings/report.strings";
import { join } from "node:path";
import process from "node:process";
const FAILURE_EXIT = 1;
const probeModule = async function probeModule(moduleDir: string, ops: HealOps): Promise<DriftProbe> {
const generated = await ops.generate(moduleDir);
const hexDir = join(moduleDir, HEX_DIR);
const orphaned = staleFiles(hexDir, new Set(generated.artifacts.keys())).length > 0;
return { ...generated, drift: orphaned || artifactDrift(hexDir, generated.artifacts) };
};
const settle = function settle(probe: DriftProbe, state: HealState): HealResult {
return { findings: probe.findings, state, svgs: probe.svgs };
};
const reattempt = async function reattempt(
moduleDir: string,
ops: HealOps,
remaining: number,
prior: DriftProbe,
): Promise<HealResult> {
if (remaining <= 0) {
return settle(prior, "drift");
}
await ops.reparse(moduleDir);
const fresh = await probeModule(moduleDir, ops);
if (!fresh.drift) {
return settle(fresh, "healed");
}
if (artifactsEqual(prior.artifacts, fresh.artifacts)) {
persistArtifacts(moduleDir, fresh.artifacts);
return settle(fresh, "rewritten");
}
return reattempt(moduleDir, ops, remaining - 1, fresh);
};
export const healModule = async function healModule(moduleDir: string, ops: HealOps): Promise<HealResult> {
const first = await probeModule(moduleDir, ops);
if (!first.drift) {
return settle(first, "clean");
}
if (ops.attempts <= 0) {
return settle(first, "drift");
}
await ops.reparse(moduleDir);
const second = await probeModule(moduleDir, ops);
return second.drift ? reattempt(moduleDir, ops, ops.attempts - 1, second) : settle(second, "healed");
};
const reportHeal = function reportHeal(total: number, buckets: Readonly<Record<HealState, string[]>>): void {
if (buckets.healed.length > 0) {
process.stdout.write(healedModules(buckets.healed));
}
if (buckets.rewritten.length > 0) {
process.stdout.write(rewrittenModules(buckets.rewritten));
}
if (buckets.drift.length > 0) {
process.stderr.write(driftModules(buckets.drift));
process.exitCode = FAILURE_EXIT;
return;
}
process.stdout.write(modulesClean(total));
};
export const runHexCheck = async function runHexCheck(ops: CheckOps): Promise<void> {
const collected: ModuleFindings[] = [];
const buckets: Record<HealState, string[]> = { clean: [], drift: [], healed: [], rewritten: [] };
const svgs = new Map<string, Map<string, string>>();
await ops.pool(ops.modules, async (moduleDir) => {
const result = await healModule(moduleDir, ops);
collected.push(result.findings);
svgs.set(moduleDir, result.svgs);
buckets[result.state].push(ops.title(moduleDir));
});
ops.writeSvgs(svgs);
if (!ops.masterOk(collected)) {
ops.writeMaster();
}
reportHeal(ops.modules.length, buckets);
};