# core/loaders/report.loader.ts

> 53 lines of code and 7 definitions.

Tree: GovLab Stats
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/stats#file-stats-core-loaders-report-loader-ts
Source text: https://banes-lab.com/source/stats/core/loaders/report.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/stats/core/loaders.md), after [core/loaders/registry.loader.ts](https://banes-lab.com/source/stats/core/loaders/registry.loader.ts.md).

## Definitions

- `emptyVerify` (lexical_declaration, line 8)
- `collectVerifyReport` (lexical_declaration, line 38, exported)
- `toStage` (lexical_declaration, line 28)
- `toStep` (lexical_declaration, line 19)
- `violations` (lexical_declaration, line 20)
- `raw` (lexical_declaration, line 39, exported)
- `totals` (lexical_declaration, line 43, exported)

## Contained in

- [core/loaders](https://banes-lab.com/anatomy/stats/folder-stats-core-loaders.md)

## Uses

- [core/predicates/record.predicate.ts](https://banes-lab.com/source/stats/core/predicates/record.predicate.ts.md)
- [core/selectors/field.selector.ts](https://banes-lab.com/source/stats/core/selectors/field.selector.ts.md)

## Linked from

- [core/loaders](https://banes-lab.com/anatomy/stats/folder-stats-core-loaders.md)
- [core/predicates](https://banes-lab.com/anatomy/stats/folder-stats-core-predicates.md)
- [core/selectors](https://banes-lab.com/anatomy/stats/folder-stats-core-selectors.md)

## Source

```typescript
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),
        },
    };
};
```
