domain/converters/evidence.converter.ts

domain/converters/evidence.converter.ts is a file in Bane's Lab Site. 30 lines of code and 8 definitions.

import type { ChapterSubject, Evidence, EvidenceSubject } from "#types/evidence.types";
import { ANCHOR_PREFIX } from "#configuration/constants/document.constants";
import { CHAPTER_FACE } from "#configuration/constants/vocabulary.constants";
import { FACE_SEPARATOR } from "@govlab/constants";
import type { ReferenceTarget } from "#types/reference.types";
import { pageFromPath } from "#core/assets/link.assets";

const CHAPTER_PREFIX = CHAPTER_FACE + FACE_SEPARATOR;

const chapterHref = function chapterHref(target: ReferenceTarget): string | null {
    return target.face === CHAPTER_FACE && target.ref.startsWith(CHAPTER_PREFIX)
        ? target.ref.slice(CHAPTER_PREFIX.length)
        : null;
};

const isChapterOf = function isChapterOf(subject: ChapterSubject, href: string): boolean {
    const cut = href.indexOf(ANCHOR_PREFIX);
    const section = cut === -1 ? "" : href.slice(cut + ANCHOR_PREFIX.length);
    return section === subject.section && pageFromPath(href, "") === subject.page;
};

export const subjectMatches = function subjectMatches(subject: EvidenceSubject, target: ReferenceTarget): boolean {
    if (subject.kind === "record") {
        return subject.ref === target.ref;
    }
    const href = chapterHref(target);
    return href !== null && isChapterOf(subject, href);
};

export const evidenceFor = function evidenceFor(
    target: ReferenceTarget,
    registry: readonly Evidence[],
): readonly Evidence[] {
    return registry.filter((entry) => subjectMatches(entry.subject, target));
};