# core/validators/markup.validator.ts

> 23 lines of code and 8 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-validators-markup-validator-ts
Source text: https://banes-lab.com/source/patterns/core/validators/markup.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/patterns/core/validators.md), after [core/validators/graph.validator.ts](https://banes-lab.com/source/patterns/core/validators/graph.validator.ts.md) and before [core/validators/report.validator.ts](https://banes-lab.com/source/patterns/core/validators/report.validator.ts.md).

## Definitions

- `assertHardened` (lexical_declaration, line 21, exported)
- `VIEWBOX_MARKER` (lexical_declaration, line 4)
- `SVG_OPEN` (lexical_declaration, line 5)
- `SVG_CLOSE` (lexical_declaration, line 6)
- `ISSUE_JOIN` (lexical_declaration, line 7)
- `hardenIssues` (lexical_declaration, line 9, exported)
- `lower` (lexical_declaration, line 10, exported)
- `issues` (lexical_declaration, line 22, exported)

## Contained in

- [core/validators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-validators.md)

## Uses

- [configuration/strings/markup.strings.ts](https://banes-lab.com/source/patterns/configuration/strings/markup.strings.ts.md)

## Used by

- [core/coordinators/page.coordinator.ts](https://banes-lab.com/source/patterns/core/coordinators/page.coordinator.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/patterns/folder-patterns-configuration-strings.md)
- [core/coordinators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-coordinators.md)

## Source

```typescript
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)));
    }
};
```
