core/loaders/report.loader.ts

core/loaders/report.loader.ts is a file in GovLab Stats. 53 lines of code and 7 definitions.

import type { VerifyReportStats, VerifyStageStat, VerifyStepStat } from "#types/report.types";
import { arrayField, field, numberField, stringField } from "#core/selectors/field.selector";
import { VERIFY_REPORT_FILE } from "@govlab/pipeline/configuration/constants/report.constants.ts";
import { isRecord } from "#core/predicates/record.predicate";
import path from "node:path";
import { readJson } from "#core/loaders/data.loader";

const emptyVerify = function emptyVerify(): VerifyReportStats {
    return {
        available: false,
        generatedAt: "",
        label: "",
        ok: false,
        stages: [],
        totals: { failed: 0, passed: 0, steps: 0, violations: 0 },
    };
};

const toStep = function toStep(raw: unknown): VerifyStepStat {
    const violations = field(raw, "violations");
    return {
        label: stringField(raw, "label"),
        ok: field(raw, "ok") === true,
        violations: typeof violations === "number" ? violations : null,
    };
};

const toStage = function toStage(raw: unknown): VerifyStageStat {
    return {
        failed: numberField(raw, "failed", 0),
        passed: numberField(raw, "passed", 0),
        stage: stringField(raw, "stage"),
        steps: arrayField(raw, "steps").map(toStep),
        violations: numberField(raw, "violations", 0),
    };
};

export const collectVerifyReport = function collectVerifyReport(root: string): VerifyReportStats {
    const raw = readJson(path.join(root, VERIFY_REPORT_FILE));
    if (!isRecord(raw)) {
        return emptyVerify();
    }
    const totals = field(raw, "totals");
    return {
        available: true,
        generatedAt: stringField(raw, "generatedAt"),
        label: stringField(raw, "label"),
        ok: field(raw, "ok") === true,
        stages: arrayField(raw, "stages").map(toStage),
        totals: {
            failed: numberField(totals, "failed", 0),
            passed: numberField(totals, "passed", 0),
            steps: numberField(totals, "steps", 0),
            violations: numberField(totals, "violations", 0),
        },
    };
};