core/factories/context.factory.ts

core/factories/context.factory.ts is a file in GovLab Context. 56 lines of code and 10 definitions.

import type { Faces, GovlabContext, GovlabContextOptions } from "#types/context.types";
import { checkGapsFor, runValidation } from "#core/validators/ontology.validator";
import {
    isAlgoGrammar,
    isArchRelations,
    isLexicon,
    isPagGrammar,
    isReasonOntology,
    requireFace,
} from "#core/guards/context.guard";
import { COLLECTIONS } from "#configuration/constants/ontology.constants";
import type { DeclaredCheck } from "#types/check.types";
import { KIND_TAXONOMY } from "#configuration/constants/kind.constants";
import { ONTOLOGY_FACES } from "#core/registries/context.registry";
import { checkedRecordsOf } from "#core/selectors/check.selector";
import { collectionRefResolver } from "#core/resolvers/reference.resolver";
import { createLayerJoin } from "#core/factories/layer.factory";
import { crossValidateFaces } from "#core/validators/vocabulary.validator";
import { foldFaces } from "#core/registries/ontology.registry";
import { slugify } from "#core/converters/identifier.converter";

const assemble = function assemble(faces: Faces, checks: readonly DeclaredCheck[]): GovlabContext {
    return {
        algo: faces.algo,
        arch: faces.arch,
        checkGaps: () => checkGapsFor(faces, checks),
        checkedRecords: () => checkedRecordsOf(faces, checks),
        crossValidate: () => crossValidateFaces(faces),
        joinConcerns: () =>
            faces.algo.joinConcerns({
                principlesForForce: (force) => faces.arch.query({ scope: force }).map((principle) => principle.id),
            }),
        kindTaxonomy: () => KIND_TAXONOMY,
        layerOf: (idOrName) => faces.layerJoin.layerOf(idOrName),
        layers: () => faces.layerJoin.layers(),
        lex: faces.lex,
        pag: faces.pag,
        reason: faces.reason,
        resolutions: () => faces.layerJoin.resolutions(),
        resolveRef: collectionRefResolver(faces),
        resolveTension: (a, b) => faces.layerJoin.resolveTension(a, b),
        slugify,
        topology: () => faces.layerJoin.topology(),
        validateResolution: () => runValidation(faces, checks),
    };
};

export const createGovlabContext = function createGovlabContext(options: GovlabContextOptions = {}): GovlabContext {
    const { checks = [], logger, canonicalizeId } = options;
    const built = foldFaces(ONTOLOGY_FACES, { canonicalizeId, logger });
    const arch = requireFace(built.get(COLLECTIONS.architecture), isArchRelations, COLLECTIONS.architecture);
    const algo = requireFace(built.get(COLLECTIONS.algorithms), isAlgoGrammar, COLLECTIONS.algorithms);
    const pag = requireFace(built.get(COLLECTIONS.pag), isPagGrammar, COLLECTIONS.pag);
    const lex = requireFace(built.get(COLLECTIONS.lexicon), isLexicon, COLLECTIONS.lexicon);
    const reason = requireFace(built.get(COLLECTIONS.reasoning), isReasonOntology, COLLECTIONS.reasoning);
    const layerJoin = createLayerJoin({ algo, arch, lex });
    return assemble({ algo, arch, layerJoin, lex, pag, reason }, checks);
};