core/converters/identifier.converter.ts

core/converters/identifier.converter.ts is a file in Bane's Lab Build Scripts. 140 lines of code and 35 definitions.

import {
    INDEX_PART_BUDGET,
    LEADING_ARTICLES,
    RESOLVE_FIRST,
    RESOLVE_LAST,
    RESOLVE_PREFIX,
    RESOLVE_REF,
    SLUG_CHARACTERS,
    SLUG_SEPARATOR,
} from "#configuration/constants/catalog.constants";
import type { Identity, Leaf, Linker } from "#types/catalog.types";
import { resolveLeaf, resolveMap, searchIndex, slugShard } from "#core/resolvers/catalog.resolver";
import { NAME_LOOKUP_TITLE } from "#configuration/strings/catalog.strings";
import type { NamedSource } from "#types/source.types";
import type { Phrase } from "#types/search.types";
import { nameKeyOf } from "@govlab/context";
import { nameShardTitle } from "@banes-lab/web/strings/catalog.strings";
import { prefixShards } from "#core/stores/catalog.store";

const RESOLVE_KIND = "resolve";
const SLUGS_PREFIX = "api:slugs/";
const PATH_SEPARATOR = "/";
const SPACE = " ";
const ACRONYM_OPEN = "(";
const ACRONYM_CLOSE = ")";

const baseName = function baseName(path: string): string {
    return path.slice(path.lastIndexOf(PATH_SEPARATOR) + 1);
};

const withoutArticle = function withoutArticle(title: string): string {
    const space = title.indexOf(SPACE);
    return space !== -1 && LEADING_ARTICLES.has(title.slice(0, space).toLowerCase()) ? title.slice(space + 1) : title;
};

const acronymOf = function acronymOf(title: string): string | null {
    const open = title.lastIndexOf(ACRONYM_OPEN);
    const close = title.lastIndexOf(ACRONYM_CLOSE);
    return open !== -1 && close > open + 1 ? title.slice(open + 1, close) : null;
};

export const identityPhrases = function identityPhrases(identities: readonly Identity[]): readonly Phrase[] {
    return identities.flatMap((identity) => {
        const id = identity.ref.slice(identity.ref.indexOf(":") + 1);
        const { title } = identity;
        const own = [title, id, baseName(title), withoutArticle(title), acronymOf(title)];
        return own.filter((phrase) => phrase !== null).map((phrase) => ({ phrase, ref: identity.ref }));
    });
};

export const definitionPhrases = function definitionPhrases(files: readonly NamedSource[]): readonly Phrase[] {
    return files.flatMap(({ file, identity }) =>
        file.definitions.map((definition) => ({ phrase: definition.name, ref: identity.ref })),
    );
};

const rankOf = function rankOf(ref: string): number {
    const collection = ref.slice(0, ref.indexOf(":"));
    const first = RESOLVE_FIRST.indexOf(collection);
    if (first !== -1) {
        return first;
    }
    return RESOLVE_LAST.includes(collection) ? RESOLVE_FIRST.length + 1 : RESOLVE_FIRST.length;
};

export const resolveTable = function resolveTable(phrases: readonly Phrase[]): ReadonlyMap<string, readonly string[]> {
    const table = new Map<string, string[]>();
    for (const { phrase, ref } of phrases) {
        const slug = nameKeyOf(phrase);
        if (slug.length === 0) {
            continue;
        }
        const held = table.get(slug) ?? [];
        if (!held.includes(ref)) {
            table.set(slug, [...held, ref]);
        }
    }
    return new Map(
        [...table.entries()].map(([slug, refs]) => [
            slug,
            refs.toSorted((left, right) => rankOf(left) - rankOf(right)),
        ]),
    );
};

export const resolveLeaves = function resolveLeaves(
    table: ReadonlyMap<string, readonly string[]>,
    linker: Linker,
): readonly Leaf[] {
    const answer = (ref: string): object => {
        const identity = linker.byRef(ref);
        return {
            kind: identity?.kind ?? null,
            summary: identity?.summary ?? null,
            ...linker.link(identity?.title ?? ref, ref),
        };
    };
    const leaves = [...table.entries()].map(([slug, refs]): Leaf => {
        const address = resolveLeaf(slug);
        return {
            data: { candidates: refs.map(answer), slug },
            identity: {
                address,
                href: null,
                kind: RESOLVE_KIND,
                ref: RESOLVE_PREFIX + slug,
                summary: null,
                title: slug,
            },
            markdown: null,
        };
    });
    const prefixes = prefixShards([...table.entries()], INDEX_PART_BUDGET);
    const shards = [...prefixes.entries()].map(([prefix, slugs]): Leaf => {
        const ref = SLUGS_PREFIX + prefix;
        const title = nameShardTitle(prefix);
        const map = Object.fromEntries(slugs);
        return {
            data: { prefix, ref, slugs: map, title },
            identity: { address: slugShard(prefix), href: null, kind: RESOLVE_KIND, ref, summary: null, title },
            markdown: null,
        };
    });
    const head: Leaf = {
        data: {
            count: table.size,
            order: [...RESOLVE_FIRST, ...RESOLVE_LAST],
            ref: RESOLVE_REF,
            shards: Object.fromEntries(
                [...prefixes.keys()].map((prefix) => [prefix, linker.site + slugShard(prefix).json]),
            ),
            slugRules: {
                characters: SLUG_CHARACTERS,
                separator: SLUG_SEPARATOR,
                words: linker.site + searchIndex().json,
            },
        },
        identity: {
            address: resolveMap(),
            href: null,
            kind: RESOLVE_KIND,
            ref: RESOLVE_REF,
            summary: null,
            title: NAME_LOOKUP_TITLE,
        },
        markdown: null,
    };
    return [...leaves, ...shards, head];
};