/** * Motor de resolução de variáveis — opera direto sobre a árvore Tiptap * (`editor_content`), não mais sobre `{{variavel}}` em texto puro (essa era * a versão stand-in de uma leva anterior, antes do editor visual real * existir). Inspirado em `resolveDocument()` do legado (eden.md §3.2), mas * simplificado: sem nó `conditional`, sem expansão de `tableRow.attrs.repeat` * (fora de escopo — o editor/catálogo desta leva nunca produz nenhum dos * dois) e sem bloquear com `MISSING_REQUIRED_FIELDS`/`UNRESOLVED_VARIABLES` * (HTTP 422) — uma `mergeField` sem valor em `context` vira string vazia e é * só reportada em `missingVariables` (deduplicada, ordem da primeira * ocorrência); o chamador decide o que fazer com isso. */ import { collectMergeFieldKeys, renderToHtml } from "./editor-content-renderer"; export interface ResolveDocumentResult { /** HTML final, com toda `mergeField` já substituída pelo valor do contexto (ou string vazia, quando ausente). */ html: string; /** Chaves referenciadas no documento mas ausentes de `context`, deduplicadas, na ordem de `collectMergeFieldKeys`. */ missingVariables: string[]; } export function resolveDocument(editorContent: unknown, context: Record): ResolveDocumentResult { const keys = collectMergeFieldKeys(editorContent); const missingVariables = keys.filter((key) => !Object.prototype.hasOwnProperty.call(context, key)); const html = renderToHtml(editorContent, (key) => context[key] ?? ""); return { html, missingVariables }; }