diff --git a/.changeset/spotty-beds-arrive.md b/.changeset/spotty-beds-arrive.md new file mode 100644 index 0000000000..ca552242d7 --- /dev/null +++ b/.changeset/spotty-beds-arrive.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +ensure "cause" is rendered in Data.Error output diff --git a/.changeset/swift-dodos-double.md b/.changeset/swift-dodos-double.md new file mode 100644 index 0000000000..dd6396493b --- /dev/null +++ b/.changeset/swift-dodos-double.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +support ErrorOptions in YieldableError constructor diff --git a/packages/effect/src/Data.ts b/packages/effect/src/Data.ts index dacabf0590..d793a1c21d 100644 --- a/packages/effect/src/Data.ts +++ b/packages/effect/src/Data.ts @@ -532,7 +532,7 @@ export const Error: new = {}>( ) => Cause.YieldableError & Readonly = (function() { return class Base extends core.YieldableError { constructor(args: any) { - super() + super(args?.message, { cause: args?.cause }) if (args) { Object.assign(this, args) } diff --git a/packages/effect/src/internal/core.ts b/packages/effect/src/internal/core.ts index f40a8c089d..7230d04c81 100644 --- a/packages/effect/src/internal/core.ts +++ b/packages/effect/src/internal/core.ts @@ -2174,23 +2174,19 @@ export const causeSquashWith = dual< // ----------------------------------------------------------------------------- /** @internal */ -export const YieldableError: new(message?: string) => Cause.YieldableError = (function() { +export const YieldableError: new(message?: string, options?: ErrorOptions) => Cause.YieldableError = (function() { class YieldableError extends globalThis.Error { commit() { return fail(this) } - toString() { - return this.message ? `${this.name}: ${this.message}` : this.name - } toJSON() { return { ...this } } - [NodeInspectSymbol](): string { - const stack = this.stack - if (stack) { - return `${this.toString()}\n${stack.split("\n").slice(1).join("\n")}` + [NodeInspectSymbol]() { + if (this.toString !== globalThis.Error.prototype.toString) { + return this.stack ? `${this.toString()}\n${this.stack.split("\n").slice(1).join("\n")}` : this.toString() } - return this.toString() + return this } } Object.assign(YieldableError.prototype, StructuralCommitPrototype) diff --git a/packages/effect/test/Effect/error.test.ts b/packages/effect/test/Effect/error.test.ts index 0890480b4a..42fbebe1be 100644 --- a/packages/effect/test/Effect/error.test.ts +++ b/packages/effect/test/Effect/error.test.ts @@ -83,6 +83,13 @@ describe("Effect", () => { expect(inspect(new MessageError()).startsWith("fail\n")).toBe(true) assert.deepStrictEqual(new MessageError().toJSON(), { _tag: "MessageError" }) }) + + it.it("cause", () => { + class MessageError extends Data.TaggedError("MessageError")<{ + cause: unknown + }> {} + expect(inspect(new MessageError({ cause: new Error("boom") }))).includes("[cause]: Error: boom") + }) } it.it("toJSON", () => {