diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index b2bf2c3d6c..9eaaae316a 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -830,6 +830,24 @@ bool Bun__deepEquals(JSC__JSGlobalObject* globalObject, JSValue v1, JSValue v2, return false; } + case ErrorInstanceType: { + if (c2Type != ErrorInstanceType) { + return false; + } + + if (JSC::ErrorInstance* left = jsDynamicCast(v1)) { + JSC::ErrorInstance* right = jsDynamicCast(v2); + + if (UNLIKELY(!right)) { + return false; + } + + return ( + left->sanitizedNameString(globalObject) == right->sanitizedNameString(globalObject) && + left->sanitizedMessageString(globalObject) == right->sanitizedMessageString(globalObject) + ); + } + } case Int8ArrayType: case Uint8ArrayType: case Uint8ClampedArrayType: diff --git a/test/js/bun/test/test-test.test.ts b/test/js/bun/test/test-test.test.ts index 885007e34a..f212ee7162 100644 --- a/test/js/bun/test/test-test.test.ts +++ b/test/js/bun/test/test-test.test.ts @@ -161,6 +161,14 @@ test("testing Bun.deepEquals() using isEqual()", () => { expect(Infinity).toEqual(1 / 0); expect(-Infinity).toEqual(-Infinity); expect(-Infinity).toEqual(-1 / 0); + + expect(Error("foo")).toEqual(Error("foo")); + expect(Error("foo")).not.toEqual(Error("bar")); + expect(Error("foo")).not.toEqual("foo"); + + class CustomError extends Error { constructor(message) { super(message); } }; + expect(new CustomError("foo")).not.toEqual(new CustomError("bar")); + expect(new CustomError("foo")).toEqual(new CustomError("foo")); }); try {