# core/validators/report.validator.ts

> 22 lines of code and 4 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-validators-report-validator-ts
Source text: https://banes-lab.com/source/patterns/core/validators/report.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/patterns/core/validators.md), after [core/validators/markup.validator.ts](https://banes-lab.com/source/patterns/core/validators/markup.validator.ts.md) and before [core/validators/schema.validator.ts](https://banes-lab.com/source/patterns/core/validators/schema.validator.ts.md).

## Definitions

- `currentText` (lexical_declaration, line 6)
- `checkHexMaster` (lexical_declaration, line 21, exported)
- `artifactDrift` (lexical_declaration, line 10, exported)
- `artifactsEqual` (lexical_declaration, line 14, exported)

## Contained in

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

## Uses

- [core/formatters/report.formatter.ts](https://banes-lab.com/source/patterns/core/formatters/report.formatter.ts.md)

## Used by

- [core/coordinators/report.coordinator.ts](https://banes-lab.com/source/patterns/core/coordinators/report.coordinator.ts.md)
- [runtime/entrypoints/report.entrypoint.ts](https://banes-lab.com/source/patterns/runtime/entrypoints/report.entrypoint.ts.md)

## Linked from

- [core/coordinators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-coordinators.md)
- [core/formatters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-formatters.md)
- [core/validators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-validators.md)
- [runtime/entrypoints](https://banes-lab.com/anatomy/patterns/folder-patterns-runtime-entrypoints.md)

## Source

```typescript
import { existsSync, readFileSync } from "node:fs";
import type { ModuleFindings } from "#types/report.types";
import { buildMasterFindings } from "#core/formatters/report.formatter";
import { join } from "node:path";

const currentText = function currentText(path: string): string {
    return existsSync(path) ? readFileSync(path, "utf8").trimEnd() : "";
};

export const artifactDrift = function artifactDrift(hexDir: string, artifacts: ReadonlyMap<string, string>): boolean {
    return [...artifacts].some(([name, content]) => currentText(join(hexDir, name)) !== content.trimEnd());
};

export const artifactsEqual = function artifactsEqual(
    a: ReadonlyMap<string, string>,
    b: ReadonlyMap<string, string>,
): boolean {
    return a.size === b.size && [...a].every(([name, content]) => b.get(name)?.trimEnd() === content.trimEnd());
};

export const checkHexMaster = function checkHexMaster(
    masterPath: string,
    collected: readonly ModuleFindings[],
): boolean {
    return currentText(masterPath) === buildMasterFindings(collected).trimEnd();
};
```
