# core/factories/context.factory.ts

> 56 lines of code and 10 definitions.

Tree: GovLab Context
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/context#file-context-core-factories-context-factory-ts
Source text: https://banes-lab.com/source/context/core/factories/context.factory.ts.txt

Listed in [core/factories](https://banes-lab.com/api/source/context/core/factories.md), after [core/factories/check.factory.ts](https://banes-lab.com/source/context/core/factories/check.factory.ts.md) and before [core/factories/field.factory.ts](https://banes-lab.com/source/context/core/factories/field.factory.ts.md).

## Definitions

- `assemble` (lexical_declaration, line 22)
- `createGovlabContext` (lexical_declaration, line 48, exported)
- `{ checks = [], logger, canonicalizeId }` (lexical_declaration, line 49, exported)
- `built` (lexical_declaration, line 50, exported)
- `arch` (lexical_declaration, line 51, exported)
- `algo` (lexical_declaration, line 52, exported)
- `pag` (lexical_declaration, line 53, exported)
- `lex` (lexical_declaration, line 54, exported)
- `reason` (lexical_declaration, line 55, exported)
- `layerJoin` (lexical_declaration, line 56, exported)

## Contained in

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

## Uses

- [core/resolvers/reference.resolver.ts](https://banes-lab.com/source/context/core/resolvers/reference.resolver.ts.md)
- [core/selectors/check.selector.ts](https://banes-lab.com/source/context/core/selectors/check.selector.ts.md)
- [core/validators/ontology.validator.ts](https://banes-lab.com/source/context/core/validators/ontology.validator.ts.md)
- [core/validators/vocabulary.validator.ts](https://banes-lab.com/source/context/core/validators/vocabulary.validator.ts.md)

## Linked from

- [core/factories](https://banes-lab.com/anatomy/context/folder-context-core-factories.md)
- [core/resolvers](https://banes-lab.com/anatomy/context/folder-context-core-resolvers.md)
- [core/selectors](https://banes-lab.com/anatomy/context/folder-context-core-selectors.md)
- [core/validators](https://banes-lab.com/anatomy/context/folder-context-core-validators.md)

## Source

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