core/factories/registry.factory.ts

core/factories/registry.factory.ts is a file in GovLab Docs. 80 lines of code and 20 definitions.

import type { DocForm } from "#types/location.types";
import type { DocVerb } from "#types/reference.types";
import type { UserRegistries } from "#types/manifest.types";
import { isRecord } from "#core/predicates/record.predicate";

const VERB_KEY = "verb";
const CONCERN_KEY = "concern";

const hasText = function hasText(record: Record<string, unknown>, key: string): boolean {
    const value = record[key];
    return typeof value === "string" && value.length > 0;
};

const hasFormAxes = function hasFormAxes(record: Record<string, unknown>): boolean {
    return (
        typeof record["ownerAxis"] === "string" &&
        typeof record["kind"] === "string" &&
        typeof record["boundary"] === "boolean"
    );
};

const isValidForm = function isValidForm(form: unknown, usedFolders: ReadonlySet<string>): form is DocForm {
    if (!isRecord(form) || !hasText(form, "id") || !hasText(form, "folder")) {
        return false;
    }
    return !usedFolders.has(String(form["folder"])) && hasFormAxes(form);
};

const concernOf = function concernOf(entry: unknown): string | null {
    if (typeof entry === "string") {
        return entry.length > 0 ? entry : null;
    }
    return isRecord(entry) && hasText(entry, CONCERN_KEY) ? String(entry[CONCERN_KEY]) : null;
};

const isValidRefVerb = function isValidRefVerb(entry: unknown): entry is DocVerb & { verb: string } {
    return (
        isRecord(entry) &&
        typeof entry[VERB_KEY] === "string" &&
        Array.isArray(entry["checks"]) &&
        Array.isArray(entry["satisfies"])
    );
};

export class RegistryBuilder {
    readonly #forms: Record<string, DocForm>;
    readonly #concerns: string[];
    readonly #activityVerbs: Record<string, string>;
    readonly #refVerbs: Record<string, DocVerb>;
    readonly #usedFolders: Set<string>;

    public constructor(base: UserRegistries) {
        this.#forms = { ...base.forms };
        this.#concerns = [...base.concerns];
        this.#activityVerbs = { ...base.activityVerbs };
        this.#refVerbs = { ...base.refVerbs };
        this.#usedFolders = new Set(Object.values(base.forms).map((form) => form.folder));
    }

    public addRefVerb(entry: unknown): void {
        if (isValidRefVerb(entry) && !Object.hasOwn(this.#refVerbs, entry.verb)) {
            this.#refVerbs[entry.verb] = { checks: entry.checks, satisfies: entry.satisfies };
        }
    }

    public addForm(form: unknown): void {
        if (isValidForm(form, this.#usedFolders) && !Object.hasOwn(this.#forms, form.id)) {
            this.#forms[form.id] = form;
            this.#usedFolders.add(form.folder);
        }
    }

    public addConcern(entry: unknown): void {
        const concern = concernOf(entry);
        if (concern === null || this.#concerns.includes(concern)) {
            return;
        }
        this.#concerns.push(concern);
        if (isRecord(entry) && hasText(entry, VERB_KEY)) {
            this.#activityVerbs[concern] = String(entry[VERB_KEY]);
        }
    }

    public frozen(): UserRegistries {
        return {
            activityVerbs: Object.freeze(this.#activityVerbs),
            concerns: Object.freeze(this.#concerns),
            forms: Object.freeze(this.#forms),
            refVerbs: Object.freeze(this.#refVerbs),
        };
    }
}