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", () => {