core/validators/payload.validator.ts

core/validators/payload.validator.ts is a file in Bane's Lab Build Scripts. 101 lines of code and 19 definitions.

import {
    BODILESS_ALTERNATE,
    EMPTY_PAYLOAD,
    MALFORMED_PAYLOAD,
    inlineTag,
    unanchoredAlternate,
    untitledAlternate,
    wrongPayloadId,
    wrongPayloadTab,
} from "#configuration/strings/payload.strings";
import type { Finding } from "#types/validation.types";
import { isRecord } from "#core/selectors/base.selector";

const INLINE_TAG_OPEN = "<";
const INLINE_TAG_STOPS = new Set([">", " ", "/"]);
const INLINE_TAGS = new Set(["strong", "b", "em", "i", "code", "a", "span", "br"]);
const MIN_MARKDOWN_LINES = 5;

interface Payload {
    readonly content: unknown;
    readonly id: unknown;
    readonly tab?: unknown;
}

const tagAt = function tagAt(text: string, open: number): string {
    let end = open + 1;
    while (end < text.length && !INLINE_TAG_STOPS.has(text.charAt(end))) {
        end += 1;
    }
    return text.slice(open + 1, end).toLowerCase();
};

export const inlineMarkupIn = function inlineMarkupIn(value: unknown): string | null {
    if (typeof value === "string") {
        let open = value.indexOf(INLINE_TAG_OPEN);
        while (open !== -1) {
            const tag = tagAt(value, open);
            if (INLINE_TAGS.has(tag)) {
                return tag;
            }
            open = value.indexOf(INLINE_TAG_OPEN, open + 1);
        }
        return null;
    }
    if (typeof value === "object" && value !== null) {
        for (const entry of Object.values(value)) {
            const found = inlineMarkupIn(entry);
            if (found !== null) {
                return found;
            }
        }
    }
    return null;
};

const parsePayload = function parsePayload(raw: string): Payload | null {
    const parsed: unknown = JSON.parse(raw);
    if (!isRecord(parsed) || !("content" in parsed) || !("id" in parsed)) {
        return null;
    }
    return { content: parsed["content"], id: parsed["id"], tab: parsed["tab"] };
};

const checkPayloadContent = function checkPayloadContent(file: string, content: unknown): Finding[] {
    if (content === undefined || content === null) {
        return [{ file, message: EMPTY_PAYLOAD }];
    }
    const markup = inlineMarkupIn(content);
    return markup === null ? [] : [{ file, message: inlineTag(markup) }];
};

export const checkPayload = function checkPayload(
    file: string,
    id: string,
    tab: string | null,
    raw: string,
): Finding[] {
    const payload = parsePayload(raw);
    if (payload === null) {
        return [{ file, message: MALFORMED_PAYLOAD }];
    }
    const findings: Finding[] = [];
    if (payload.id !== id) {
        findings.push({ file, message: wrongPayloadId(String(payload.id), id) });
    }
    if (payload.tab !== tab) {
        findings.push({ file, message: wrongPayloadTab(String(tab)) });
    }
    return [...findings, ...checkPayloadContent(file, payload.content)];
};

export const checkMarkdown = function checkMarkdown(
    file: string,
    text: string,
    title: string,
    address: string,
): Finding[] {
    const findings: Finding[] = [];
    if (!text.startsWith(`# ${title}`)) {
        findings.push({ file, message: untitledAlternate(title) });
    }
    if (!text.includes(address)) {
        findings.push({ file, message: unanchoredAlternate(address) });
    }
    if (text.trim().split("\n").length < MIN_MARKDOWN_LINES) {
        findings.push({ file, message: BODILESS_ALTERNATE });
    }
    return findings;
};