From 3572646d5e0804f85bc7f64633fb95722533f9dd Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 13 Jun 2024 01:21:09 +1200 Subject: [PATCH] ensure multiline error messages are preserved in cause rendering (#2981) --- .changeset/long-tools-sleep.md | 5 +++++ packages/effect/src/internal/cause.ts | 2 +- packages/effect/test/Effect/cause-rendering.test.ts | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/long-tools-sleep.md diff --git a/.changeset/long-tools-sleep.md b/.changeset/long-tools-sleep.md new file mode 100644 index 0000000000..5603b9ff1f --- /dev/null +++ b/.changeset/long-tools-sleep.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +ensure multiline error messages are preserved in cause rendering diff --git a/packages/effect/src/internal/cause.ts b/packages/effect/src/internal/cause.ts index dda5d700ad..27b328667f 100644 --- a/packages/effect/src/internal/cause.ts +++ b/packages/effect/src/internal/cause.ts @@ -1055,7 +1055,7 @@ export const spanToTrace = globalValue("effect/Tracer/spanToTrace", () => new We const prettyErrorStack = (message: string, stack: string, span?: Span | undefined): string => { const out: Array = [message] - const lines = stack.split("\n") + const lines = stack.startsWith(message) ? stack.slice(message.length).split("\n") : stack.split("\n") for (let i = 1; i < lines.length; i++) { if (lines[i].includes("Generator.next")) { diff --git a/packages/effect/test/Effect/cause-rendering.test.ts b/packages/effect/test/Effect/cause-rendering.test.ts index 8d8ea1191b..058fa163c3 100644 --- a/packages/effect/test/Effect/cause-rendering.test.ts +++ b/packages/effect/test/Effect/cause-rendering.test.ts @@ -141,4 +141,17 @@ describe("Effect", () => { yield* Effect.void it.expect({ foo: "ok" }).toStrictEqual({ foo: "bar" }) })) + + it.effect("multiline message", () => + Effect.gen(function*() { + const cause = yield* Effect.fail(new Error("Multi-line\nerror\nmessage")).pipe( + Effect.sandbox, + Effect.flip + ) + const pretty = Cause.pretty(cause) + assert.isTrue(pretty.startsWith(`Error: Multi-line +error +message + at`)) + })) })