# core/loaders/canon.loader.ts

> 41 lines of code and 13 definitions.

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

Listed in [core/loaders](https://banes-lab.com/api/source/quality/core/loaders.md), after [core/loaders/binding.loader.ts](https://banes-lab.com/source/quality/core/loaders/binding.loader.ts.md) and before [core/loaders/comment.loader.ts](https://banes-lab.com/source/quality/core/loaders/comment.loader.ts.md).

## Definitions

- `listOf` (lexical_declaration, line 29)
- `loadCanonicalData` (lexical_declaration, line 33, exported)
- `isListOf` (lexical_declaration, line 25)
- `readGenerated` (lexical_declaration, line 17)
- `readData` (lexical_declaration, line 21)
- `SETTINGS_FILE` (lexical_declaration, line 12)
- `ROWS_FILE` (lexical_declaration, line 13)
- `VALUES_FILE` (lexical_declaration, line 14)
- `SURFACES_FILE` (lexical_declaration, line 15)
- `compiled` (lexical_declaration, line 34, exported)
- `rows` (lexical_declaration, line 35, exported)
- `values` (lexical_declaration, line 36, exported)
- `surfaces` (lexical_declaration, line 37, exported)

## Contained in

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

## Uses

- [core/parsers/record.parser.ts](https://banes-lab.com/source/quality/core/parsers/record.parser.ts.md)

## Used by

- [core/emitters/tool.emitter.ts](https://banes-lab.com/source/quality/core/emitters/tool.emitter.ts.md)

## Linked from

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

## Source

```typescript
import type {
    CanonicalData,
    CanonicalSettingRecord,
    ConflictInstance,
    MappingRow,
    OwnershipSurface,
} from "#types/canon.types";
import { absolutePath } from "@ssot/paths";
import { jsonRecord } from "#core/parsers/record.parser";
import { readFileSync } from "node:fs";

const SETTINGS_FILE = "canonical-settings.generated.json";
const ROWS_FILE = "mapping-rows.generated.json";
const VALUES_FILE = "canon.data.json";
const SURFACES_FILE = "surface.data.json";

const readGenerated = function readGenerated(file: string): Record<string, unknown> {
    return jsonRecord(readFileSync(absolutePath("govlab.quality.generated", file), "utf8"));
};

const readData = function readData(file: string): Record<string, unknown> {
    return jsonRecord(readFileSync(absolutePath("govlab.quality.data", file), "utf8"));
};

const isListOf = function isListOf<T>(value: unknown): value is T[] {
    return Array.isArray(value);
};

const listOf = function listOf<T>(value: unknown): T[] {
    return isListOf<T>(value) ? value : [];
};

export const loadCanonicalData = function loadCanonicalData(): CanonicalData {
    const compiled = readGenerated(SETTINGS_FILE);
    const rows = readGenerated(ROWS_FILE);
    const values = readData(VALUES_FILE);
    const surfaces = readData(SURFACES_FILE);
    return {
        conflicts: listOf<ConflictInstance>(surfaces["conflicts"]),
        ownership: listOf<OwnershipSurface>(surfaces["surfaces"]),
        rows: [...listOf<MappingRow>(rows["rows"]), ...listOf<MappingRow>(values["rows"])],
        settings: [
            ...listOf<CanonicalSettingRecord>(compiled["settings"]),
            ...listOf<CanonicalSettingRecord>(values["settings"]),
        ],
    };
};
```
