storybookjs / telejson

🛰 JSON parse & stringify with support for cyclic objects, functions, dates, regex, infinity, undefined, null, NaN, Classes, Instances
MIT License
169 stars 29 forks source link

[Bug] Error is not stringified #77

Open ghengeveld opened 3 years ago

ghengeveld commented 3 years ago

Describe the bug

Stringifying an Error instance will yield "{}".

Steps to reproduce the behavior

import { stringify, parse } from "telejson";

const error = new Error("Oops");

const string = stringify(error);
console.log({ string }); // => { string: "{}" }

const parsed = parse(string);
console.log(parsed); // => {}

https://codesandbox.io/s/delicate-fire-dto12?file=/src/index.js

Expected behavior

A stringified Error should look like:

{ "name": "CustomError", "message": "Oops", "stack": "CustomError: Oops\n    at <anonymous>:1:1" }

Parsing this should yield an Error instance with these properties restored.

const { name, message, stack } = JSON.parse(string); // or something safer
const error = new Error(message);
Object.defineProperty(error, 'name', { value: name });
Object.defineProperty(error, 'stack', { value: stack });

This doesn't yield the original CustomError class instance, but I suppose it's better to not attempt to restore that since it may have other custom properties or methods which we won't be able to restore anyway.

Workaround

const error = new Error("Oops");
const { name, message, stack } = error;
const e = { name, message, stack };

However this doesn't yield an Error instance, just a plain object.