core/converters/ontology.vocabulary.converter.ts
core/converters/ontology.vocabulary.converter.ts is a file in Bane's Lab Build Scripts. 57 lines of code and 7 definitions.
import { ALGO_FACE, ARCH_FACE, LEX_CATEGORY_FACE, REASON_FACE, TENSION_FACE, VOCABULARY_FACE } from "@govlab/constants";
import { refOf, vocabularyAnchor } from "#core/resolvers/ontology.resolver";
import { CLOSED_VOCABULARIES } from "@govlab/context";
import type { EdgeRef } from "@banes-lab/web/types/link.types.js";
import type { VocabularyUsers } from "#types/ontology.types";
import type { VocabularyView } from "@banes-lab/web/types/ontology.types.js";
const PAIR_JOINER = " / ";
const FLOW_JOINER = " → ";
type Use = readonly [string | null, EdgeRef];
const usesOf = function usesOf(users: VocabularyUsers): readonly Use[] {
return [
...users.principles.flatMap((group) =>
group.principles.map((principle): Use => [
principle.severity.ref,
{ label: principle.name, ref: refOf(ARCH_FACE, principle.id) },
]),
),
...users.contracts.flatMap((group) =>
group.contracts.map((contract): Use => [
contract.tier.ref,
{ label: contract.title, ref: refOf(ALGO_FACE, contract.id) },
]),
),
...users.surfaces.flatMap((surface) =>
[surface.evidenceSource, surface.predicateType, ...surface.verdictDomain].map((value): Use => [
value.ref,
{ label: surface.id, ref: refOf(REASON_FACE, surface.anchor) },
]),
),
...users.topology.map((edge): Use => [
edge.kind.ref,
{ label: edge.from.label + FLOW_JOINER + edge.to.label, ref: edge.from.ref },
]),
...users.tensions.map((tension): Use => [
tension.mechanism.ref,
{ label: tension.a.label + PAIR_JOINER + tension.b.label, ref: refOf(TENSION_FACE, tension.id) },
]),
...users.terms.map((group): Use => [
group.exampleShape?.ref ?? null,
{ label: group.category, ref: refOf(LEX_CATEGORY_FACE, group.id) },
]),
];
};
export const vocabulariesOf = function vocabulariesOf(users: VocabularyUsers): readonly VocabularyView[] {
const uses = usesOf(users);
return CLOSED_VOCABULARIES.map((vocabulary) => ({
entries: vocabulary.entries.map((entry) => {
const ref = refOf(VOCABULARY_FACE, vocabularyAnchor(vocabulary.id, entry.value));
return {
definition: entry.definition,
records: uses.filter(([held]) => held === ref).map(([, record]) => record),
value: entry.value,
};
}),
id: vocabulary.id,
}));
};