Struktur-Linter
lintStructure(content, options?) ist der Datenintegritäts-Checker in @templatical/quality. Er durchläuft den TemplateContent-Blockbaum und meldet Formen, die auf Korruption hindeuten — doppelte IDs, Sektionen, deren columns-Layout nicht zum children-Array passt, verschachtelte Sektionen (vom Renderer abgelehnt) und leere Sektionen / Spalten.
Warum
Die meisten „Ist dieses Template OK?"-Werkzeuge kümmern sich um Inhaltsqualität (Alt-Text, Kontrast). Struktur-Regeln decken ein anderes Problem ab: Kann dieses JSON überhaupt sauber rendern? Importer (BeeFree, Unlayer, HTML) und serverseitige Custom-Editoren können Blöcke produzieren, die der Editor selbst nie erzeugen würde — verwaiste Spalten-Einträge, fehlende Block-Felder, Layout-/Children-Mismatches. Erreichen sie den Renderer, ist es meist zu spät, um sauber zu reagieren.
Der Struktur-Linter fängt diese Probleme vor Save / vor Versand:
- Doppelte Block-IDs. Baumtraversierung, Undo/Redo und Selection setzen alle voraus, dass IDs eindeutig sind. Eine doppelte ID beschädigt jede ID-basierte Operation lautlos.
- Section-Column-Mismatch. Eine Sektion mit
columns: "2-1"erwartetchildren.length === 2. Hatchildrenein oder drei inner arrays, ist das Layout kaputt — meist ein UI-Bug oder ein veralteter Import. - Verschachtelte Sektion. Der Renderer lehnt Sektionen innerhalb von Spalten ab. Landet eine dort, fällt sie lautlos aus dem MJML-Output.
- Leere Sektion. Eine Sektion ohne Blöcke rendert als leere Tabellenzeile — verschwendeter Whitespace, manchmal eine sichtbare Padding-Lücke.
- Leere Spalte. Eine Mehrspalten-Sektion mit einer leeren Spalte rendert in den meisten Clients unglücklich und bedeutet fast immer, dass der Autor weniger Spalten meinte.
Diese Regeln sind deterministisch und sprachunabhängig — sie feuern auf JSON-Formen, nicht auf Phrasen. Nur der Nachrichtentext muss übersetzt werden.
API
import { lintStructure } from "@templatical/quality";
const issues = lintStructure(content, options?);
// issues: LintIssue[] — jeder Eintrag hat eine ruleId, die mit "structure." beginntGleiche Signatur wie lintAccessibility. Gleiche LintOptions-Struktur. Gleicher LintIssue-Rückgabewert. Du kannst beide Linter unabhängig aufrufen oder Ergebnisse zusammenführen.
Im Editor lädt das useTemplateLint-Composable @templatical/quality per dynamischem Import und führt beide Linter bei jeder (entprellten) Inhaltsänderung aus. Struktur-Issues erscheinen im Issues-Sidebar-Tab neben Barrierefreiheits-Issues.
Schnellzugriff
- Regelkatalog — jede Struktur-Regel mit Schweregrad, Begründung und Auto-Fix-Hinweis.
- Optionen — geteilt über beide Linter.
- Schweregrade & Fixes — wie das Schweregrad-Modell funktioniert und wie Auto-Fix-Patches angewendet werden.
- Headless-Nutzung — Validierung gespeicherter Templates in CI.