From c6a86acb0b2cc66b25eb572b7064e74e8b27cfb8 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 12 Aug 2026 15:06:28 -0400 Subject: [PATCH] fix(tui): harden Mermaid rendering limits (#42123) --- packages/merman/src/core/canvas.test.ts | 8 ++++++- packages/merman/src/core/canvas.ts | 7 +++++-- packages/merman/src/flowchart/parser.ts | 4 ++++ packages/merman/src/markdown.ts | 18 +++++++++++++--- packages/merman/src/sequence/parser.ts | 4 ++++ packages/merman/src/state/parser.ts | 3 +++ packages/merman/src/test/diagnostics.test.ts | 10 +++++++++ packages/merman/src/test/markdown.test.ts | 22 ++++++++++++++++++++ 8 files changed, 70 insertions(+), 6 deletions(-) diff --git a/packages/merman/src/core/canvas.test.ts b/packages/merman/src/core/canvas.test.ts index 59b343d32c6..2b1030d6050 100644 --- a/packages/merman/src/core/canvas.test.ts +++ b/packages/merman/src/core/canvas.test.ts @@ -4,7 +4,7 @@ import { DiagramCanvas, DiagramCanvasSizeError, type DiagramCanvasCell } from ". describe("DiagramCanvas", () => { test("rejects canvases that exceed the rendering budget", () => { - expect(() => new DiagramCanvas(2_000, 1_000)).toThrow(DiagramCanvasSizeError) + expect(() => new DiagramCanvas(1_000, 251)).toThrow(DiagramCanvasSizeError) }) test("rejects invalid canvas dimensions", () => { @@ -38,6 +38,12 @@ describe("DiagramCanvas", () => { expect(stringWidth(canvas.toString())).toBe(4) }) + test("does not emit partial wide graphemes", () => { + const clipped = new DiagramCanvas<"label">(1, 1) + clipped.setText(0, 0, "界", "label") + expect(clipped.toString()).toBe("") + }) + test("keeps custom measurement for ASCII text", () => { let measurements = 0 const canvas = new DiagramCanvas<"label">(5, 1, { diff --git a/packages/merman/src/core/canvas.ts b/packages/merman/src/core/canvas.ts index 4b6b4c013a6..d932d928cd0 100644 --- a/packages/merman/src/core/canvas.ts +++ b/packages/merman/src/core/canvas.ts @@ -40,7 +40,7 @@ export interface DiagramCanvasRunOptions