core/converters/grammar.reference.converter.ts

core/converters/grammar.reference.converter.ts is a file in Bane's Lab Build Scripts. 51 lines of code and 3 definitions.

import { GROUNDS_RELATION, PAG_FACE } from "@govlab/constants";
import type { ReferenceIndex, ReferenceRecord } from "@banes-lab/web/types/reference.types.js";
import type { EdgeRef } from "@banes-lab/web/types/link.types.js";
import type { GrammarView } from "@banes-lab/web/types/grammar.types.js";
import { PAG_KINDS } from "@govlab/context";
import { refOf } from "#core/resolvers/ontology.resolver";

const recordOf = function recordOf(
    kind: string,
    name: string,
    summary: string | null,
    grounds: readonly EdgeRef[],
): ReferenceRecord {
    return {
        code: null,
        kind,
        layer: null,
        name,
        relations: grounds.length === 0 ? [] : [{ edges: grounds, relation: GROUNDS_RELATION }],
        summary,
    };
};

export const pagReferencesOf = function pagReferencesOf(grammar: GrammarView): ReferenceIndex {
    const entries: [string, ReferenceRecord][] = [
        ...grammar.categories.flatMap((group) =>
            group.keywords.map((keyword): [string, ReferenceRecord] => [
                refOf(PAG_FACE, keyword.anchor),
                recordOf(
                    PAG_KINDS.keyword,
                    keyword.name,
                    keyword.roles[0].meaning,
                    keyword.roles.flatMap((role) => role.grounds),
                ),
            ]),
        ),
        ...grammar.groups.flatMap((group) =>
            group.productions.map((production): [string, ReferenceRecord] => [
                refOf(PAG_FACE, production.anchor),
                recordOf(PAG_KINDS.production, production.lhs, production.rhs, production.grounds),
            ]),
        ),
        ...grammar.documentTypes.map((documentType): [string, ReferenceRecord] => [
            refOf(PAG_FACE, documentType.anchor),
            recordOf(PAG_KINDS.documentType, documentType.type, documentType.purpose, documentType.grounds),
        ]),
        ...grammar.templates.map((template): [string, ReferenceRecord] => [
            refOf(PAG_FACE, template.anchor),
            recordOf(PAG_KINDS.template, template.title, null, []),
        ]),
    ];
    return Object.fromEntries(entries);
};