core/validators/markup.validator.ts

core/validators/markup.validator.ts is a file in GovLab Patterns. 23 lines of code and 8 definitions.

import { MALFORMED_ROOT, MISSING_VIEWBOX, forbiddenToken, unsafeSvg } from "#configuration/strings/markup.strings";
import { FORBIDDEN_MARKUP } from "#configuration/constants/walk.constants";

const VIEWBOX_MARKER = 'viewBox="0 0 ';
const SVG_OPEN = "<svg";
const SVG_CLOSE = "</svg>";
const ISSUE_JOIN = ", ";

export const hardenIssues = function hardenIssues(svg: string): string[] {
    const lower = svg.toLowerCase();
    const issues = FORBIDDEN_MARKUP.filter((token) => lower.includes(token)).map(forbiddenToken);
    if (!svg.includes(VIEWBOX_MARKER)) {
        issues.push(MISSING_VIEWBOX);
    }
    if (!svg.startsWith(SVG_OPEN) || !svg.trimEnd().endsWith(SVG_CLOSE)) {
        issues.push(MALFORMED_ROOT);
    }
    return issues;
};

export const assertHardened = function assertHardened(svg: string, label: string): void {
    const issues = hardenIssues(svg);
    if (issues.length > 0) {
        throw new Error(unsafeSvg(label, issues.join(ISSUE_JOIN)));
    }
};