core/converters/lexicon.converter.ts
core/converters/lexicon.converter.ts is a file in Bane's Lab Build Scripts. 59 lines of code and 8 definitions.
import { ALGO_FACE, ARCH_FACE, LEX_FACE, REFERENCED_BY_RELATION } from "@govlab/constants";
import type { PrincipleCategoryView, TermCategoryView, TermView } from "@banes-lab/web/types/ontology.types.js";
import { distinctsOf, exemplarOf, groupBy, layerRef, orNull } from "#core/converters/view.converter";
import { EXAMPLE_SHAPE_VOCABULARY } from "#configuration/constants/ontology.constants";
import type { EdgeRef } from "@banes-lab/web/types/link.types.js";
import type { OntologySources } from "#types/ontology.types";
import type { Term } from "@govlab/context";
import { lookup } from "#core/converters/ontology.index.converter";
import { refOf } from "#core/resolvers/ontology.resolver";
const twinsOf = function twinsOf(principles: readonly PrincipleCategoryView[]): ReadonlyMap<string, EdgeRef> {
return new Map(
principles
.flatMap((group) => group.principles)
.flatMap((principle) => {
const term = principle.term?.ref ?? null;
return term === null
? []
: [[term, { label: principle.name, ref: refOf(ARCH_FACE, principle.id) }] as const];
}),
);
};
const termView = function termView(
sources: OntologySources,
twins: ReadonlyMap<string, EdgeRef>,
term: Term,
): TermView {
const { resolve } = sources;
const contract = sources.context.algo.get(term.id);
return {
aliases: term.aliases,
category: resolve.lexCategory(term.category),
contract: contract === null ? null : { label: contract.title, ref: refOf(ALGO_FACE, contract.id) },
definition: term.definition,
distinctFrom: distinctsOf(term.distinctFrom, resolve.target),
example: orNull(term.example),
exemplar: exemplarOf(term.exemplar),
id: term.id,
kind: resolve.kind(term.kind),
layer: layerRef(sources, term.id),
name: term.name,
principle: twins.get(refOf(LEX_FACE, term.id)) ?? null,
referencedBy: lookup(sources.index, REFERENCED_BY_RELATION, LEX_FACE, term.id),
};
};
export const termsOf = function termsOf(
sources: OntologySources,
principles: readonly PrincipleCategoryView[],
): readonly TermCategoryView[] {
const twins = twinsOf(principles);
return groupBy(sources.context.lex.all(), (term) => term.category).map(([category, terms]) => {
const shape = terms.find((term) => term.exampleShape !== undefined)?.exampleShape;
return {
category: sources.resolve.lexCategory(category).label,
exampleShape: shape === undefined ? null : sources.resolve.vocabulary(EXAMPLE_SHAPE_VOCABULARY, shape),
id: category,
terms: terms.map((term) => termView(sources, twins, term)),
};
});
};