core/loaders/reason.loader.ts

core/loaders/reason.loader.ts is a file in GovLab Context. 103 lines of code and 11 definitions.

import { CHECK_KEY, RECORDS_KEY } from "#configuration/constants/ontology.constants";
import {
    aliased,
    normalizeAxis,
    normalizeDerivationLoop,
    normalizeDimension,
    normalizeEdge,
    normalizeLayer,
    normalizeLens,
    normalizeMaps,
    normalizeMathDomain,
    normalizeMathType,
    normalizeMode,
    normalizeModel,
    normalizeNode,
    normalizePatternType,
    normalizeRepresentation,
    normalizeSubstrate,
    normalizeUniversalAxis,
    refused,
} from "#core/normalizers/reason.normalizer";
import {
    normalizeFailureShape,
    normalizeInvariant,
    normalizeTechnique,
    normalizeTestSurface,
} from "#core/normalizers/reason.surface.normalizer";
import type { CheckTable } from "#core/stores/check.store";
import { REASON_FILES } from "#configuration/constants/reason.constants";
import type { ReadAudit } from "#core/observers/record.observer";
import type { ReasonData } from "#types/reason.types";
import { absolutePath } from "@ssot/paths";
import { isObject } from "#core/predicates/record.predicate";
import { join } from "node:path";
import { readJsonFile } from "#core/loaders/ontology.loader";

interface ReasonLoad {
    audit: ReadAudit;
    checks: CheckTable;
    dir: string;
}

const readObject = function readObject(load: ReasonLoad, file: string): Record<string, unknown> {
    const parsed = readJsonFile(join(load.dir, file));
    if (isObject(parsed)) {
        return load.audit.track(parsed, file);
    }
    load.audit.reject(parsed, file);
    return {};
};

const declaredObject = function declaredObject(
    load: ReasonLoad,
    file: string,
    kinds: readonly string[],
): Record<string, unknown> {
    const object = readObject(load, file);
    for (const kind of kinds) {
        load.checks.forKind(kind, object[CHECK_KEY]);
    }
    return object;
};

const recordsOf = function recordsOf<T extends { aliases?: string[]; id: string }>(
    load: ReasonLoad,
    kind: string,
    file: string,
    normalize: (raw: Record<string, unknown>) => T,
): T[] {
    const checked = aliased(kind, normalize);
    return load.audit.records(declaredObject(load, file, [kind])[RECORDS_KEY], file).map((raw) => {
        const record = checked(raw);
        load.checks.forRecord(kind, record.id, raw[CHECK_KEY]);
        return record;
    });
};

export const loadBundledData = function loadBundledData(audit: ReadAudit, checks: CheckTable): ReasonData {
    const load: ReasonLoad = { audit, checks, dir: absolutePath("govlab.context.reasoning") };
    const files = REASON_FILES;
    return {
        axes: recordsOf(load, "axis", files.axes, normalizeAxis),
        derivationLoop: refused(
            "loop",
            normalizeDerivationLoop,
        )(declaredObject(load, files.derivationLoop, ["loop", "stage"])),
        dimensions: recordsOf(load, "dimension", files.dimensions, normalizeDimension),
        edges: audit
            .records(readObject(load, files.edges)[RECORDS_KEY], files.edges)
            .map(refused("edge", normalizeEdge)),
        failureShapes: recordsOf(load, "failure-shape", files.failureShapes, normalizeFailureShape),
        invariants: recordsOf(load, "invariant", files.invariants, normalizeInvariant),
        layers: recordsOf(load, "layer", files.layers, normalizeLayer),
        lenses: recordsOf(load, "lens", files.lenses, normalizeLens),
        maps: normalizeMaps(readObject(load, files.maps)),
        mathDomains: recordsOf(load, "math-domain", files.mathDomains, normalizeMathDomain),
        mathTypes: recordsOf(load, "math-type", files.mathTypes, normalizeMathType),
        models: recordsOf(load, "model", files.models, normalizeModel),
        modes: recordsOf(load, "mode", files.modes, normalizeMode),
        nodes: recordsOf(load, "node", files.nodes, normalizeNode),
        patternTypes: recordsOf(load, "pattern-type", files.patternTypes, normalizePatternType),
        representations: recordsOf(load, "representation", files.representations, normalizeRepresentation),
        substrate: normalizeSubstrate(declaredObject(load, files.substrate, ["substrate-node"])),
        techniques: recordsOf(load, "technique", files.techniques, normalizeTechnique),
        testSurfaces: recordsOf(load, "test-surface", files.testSurfaces, normalizeTestSurface),
        universalAxes: recordsOf(load, "universal-axis", files.universalAxes, normalizeUniversalAxis),
    };
};