core/validators/writing.validator.ts

core/validators/writing.validator.ts is a file in Bane's Lab Content. 27 lines of code and 6 definitions.

import type { PageSection, ReadingSignoff } from "#types/writing.types";
import { SIGNOFF_CHANGED, SIGNOFF_MISSING } from "#configuration/strings/derivation.strings";
import type { Finding } from "#types/derivation.types";
import { SIGNOFF_SEPARATOR } from "#configuration/constants/writing.constants";

const signoffKey = function signoffKey(key: string, fingerprint: string): string {
    return key + SIGNOFF_SEPARATOR + fingerprint;
};

export const unsignedSections = function unsignedSections(
    scope: readonly string[],
    signoffs: readonly ReadingSignoff[],
    sections: readonly PageSection[],
): Finding[] {
    const inScope = new Set(scope);
    const signed = new Set(signoffs.map((signoff) => signoffKey(signoff.key, signoff.fingerprint)));
    const everSigned = new Set(signoffs.map((signoff) => signoff.key));
    return sections
        .filter((section) => inScope.has(section.page))
        .filter((section) => !signed.has(signoffKey(section.key, section.fingerprint)))
        .map((section) => ({
            file: section.key,
            message: `${everSigned.has(section.key) ? SIGNOFF_CHANGED : SIGNOFF_MISSING}${section.fingerprint}`,
        }));
};

export const unreadCount = function unreadCount(scope: readonly string[], sections: readonly PageSection[]): number {
    const inScope = new Set(scope);
    return sections.filter((section) => !inScope.has(section.page)).length;
};