core/coordinators/drift.coordinator.ts

core/coordinators/drift.coordinator.ts is a file in GovLab Docs. 66 lines of code and 11 definitions.

import type { HealResult, HealState, Spec } from "#types/document.output.types";
import {
    driftFinding,
    gateFinding,
    regenerated,
    selfHealed,
    unstableRegeneration,
} from "#configuration/strings/drift.strings";
import type { CheckResult } from "#types/finding.types";
import { DOC_HEAL_ATTEMPTS as HEAL_ATTEMPTS } from "#configuration/constants/invocation.constants";
import { readTextSafe } from "#core/loaders/base.loader";

const gateErrors = async function gateErrors(spec: Spec, content: string): Promise<string[]> {
    if (spec.gate === undefined) {
        return [];
    }
    const { findings } = await spec.gate(content);
    return findings.map((finding) => gateFinding(spec.label, finding.line, spec.gateCode ?? "", finding.message));
};

const healSpec = async function healSpec(spec: Spec, onDisk: string, state: HealState): Promise<HealResult> {
    if (state.remaining <= 0) {
        return { content: state.prior, outcome: "drift" };
    }
    const fresh = await spec.produce(onDisk);
    const normalized = spec.normalize(fresh);
    if (normalized === spec.normalize(onDisk)) {
        return { content: fresh, outcome: "healed" };
    }
    if (normalized === spec.normalize(state.prior)) {
        return { content: fresh, outcome: "rewritten" };
    }
    return healSpec(spec, onDisk, { prior: fresh, remaining: state.remaining - 1 });
};

const resolveHeal = async function resolveHeal(
    spec: Spec,
    result: HealResult,
    writeSpec: (spec: Spec, content: string) => void,
): Promise<CheckResult> {
    if (result.outcome === "drift") {
        return { errors: [unstableRegeneration(spec.label, spec.driftCode, HEAL_ATTEMPTS)], heals: [] };
    }
    const errors = await gateErrors(spec, result.content);
    if (errors.length > 0) {
        return { errors, heals: [] };
    }
    if (result.outcome === "healed") {
        return { errors: [], heals: [selfHealed(spec.label)] };
    }
    writeSpec(spec, result.content);
    return { errors: [], heals: [regenerated(spec.label)] };
};

export const checkSpec = async function checkSpec(
    spec: Spec,
    fix: boolean,
    writeSpec: (spec: Spec, content: string) => void,
): Promise<CheckResult> {
    const onDisk = readTextSafe(spec.path) ?? "";
    const content = await spec.produce(onDisk);
    if (spec.normalize(content) === spec.normalize(onDisk)) {
        return { errors: await gateErrors(spec, content), heals: [] };
    }
    if (!fix) {
        return { errors: [...(await gateErrors(spec, content)), driftFinding(spec.label, spec.driftCode)], heals: [] };
    }
    const result = await healSpec(spec, onDisk, { prior: content, remaining: HEAL_ATTEMPTS });
    return resolveHeal(spec, result, writeSpec);
};