Skip to content

Errors with toJSON method are not formatted correctly #8040

@dmaretskyi

Description

@dmaretskyi

Describe the bug

Vitest requires errors the override toJSON methods to return message and stack in the resulting object.
Without those fields present the error will not have the stack trace or the message visible in the console output.

This diverges from the standard way errors are serialized:

JSON.stringify(new Error("foo")) === "{}"

Currently the vitest error serializer ignores message and stack properties on the error object if there's toJSON method defined. Instead it should inspect message and stack even if toJSON method is defined.

This issue is apparent when using vitest with https://effect.website/ library. Their errors have toJSON defined as:

toJSON() {
   return { ...this }
}

Using effect with vitest results in errors that have no stack traces, which is very difficult to debug.

Reproduction

https://stackblitz.com/edit/vitest-dev-vitest-muksh8v1?file=test%2Ferrors.test.ts

System Info

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 20.19.1 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.8.2 - /usr/local/bin/npm
    pnpm: 8.15.6 - /usr/local/bin/pnpm
  npmPackages:
    @vitest/ui: latest => 3.1.4 
    vite: latest => 6.3.5 
    vitest: latest => 3.1.4

Used Package Manager

npm

Validations

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions