12.0.0 • Published 5 months ago

serialize-error v12.0.0

Weekly downloads
2,936,057
License
MIT
Repository
github
Last release
5 months ago

serialize-error

Serialize/deserialize an error into a plain object

Useful if you for example need to JSON.stringify() or process.send() the error.

Install

npm install serialize-error

Usage

import {serializeError, deserializeError} from 'serialize-error';

const error = new Error('🦄');

console.log(error);
//=> [Error: 🦄]

const serialized = serializeError(error);

console.log(serialized);
//=> {name: 'Error', message: '🦄', stack: 'Error: 🦄\n    at Object.<anonymous> …'}

const deserialized = deserializeError(serialized);

console.log(deserialized);
//=> [Error: 🦄]

Error constructors

When a serialized error with a known name is encountered, it will be deserialized using the corresponding error constructor, while unknown error names will be deserialized as regular errors:

import {deserializeError} from 'serialize-error';

const known = deserializeError({
	name: 'TypeError',
	message: '🦄'
});

console.log(known);
//=> [TypeError: 🦄] <-- Still a TypeError

const unknown = deserializeError({
	name: 'TooManyCooksError',
	message: '🦄'
});

console.log(unknown);
//=> [Error: 🦄] <-- Just a regular Error

The list of known errors can be extended globally. This also works if serialize-error is a sub-dependency that's not used directly.

import {addKnownErrorConstructor} from 'serialize-error';
import {MyCustomError} from './errors.js'

addKnownErrorConstructor(MyCustomError);

Warning: The constructor must work without any arguments or this function will throw.

API

serializeError(value, options?)

Serialize an Error object into a plain object.

  • Non-error values are passed through.
  • Custom properties are preserved.
  • Non-enumerable properties are kept non-enumerable (name, message, stack).
  • Enumerable properties are kept enumerable (all properties besides the non-enumerable ones).
  • Buffer properties are replaced with [object Buffer].
  • Circular references are handled.
  • If the input object has a .toJSON() method, then it's called instead of serializing the object's properties.
  • It's up to .toJSON() implementation to handle circular references and enumerability of the properties.

value

Type: Error | unknown

toJSON implementation examples

import {serializeError} from 'serialize-error';

class ErrorWithDate extends Error {
	constructor() {
		super();
		this.date = new Date();
	}
}

const error = new ErrorWithDate();

serializeError(error);
// => {date: '1970-01-01T00:00:00.000Z', name, message, stack}
import {serializeError} from 'serialize-error';

const error = new Error('Unicorn');

error.horn = {
	toJSON() {
		return 'x';
	}
};

serializeError(error);
// => {horn: 'x', name, message, stack}

deserializeError(value, options?)

Deserialize a plain object or any value into an Error object.

  • Error objects are passed through.
  • Objects that have at least a message property are interpreted as errors.
  • All other values are wrapped in a NonError error.
  • Custom properties are preserved.
  • Non-enumerable properties are kept non-enumerable (name, message, stack, cause).
  • Enumerable properties are kept enumerable (all properties besides the non-enumerable ones).
  • Circular references are handled.
  • Native error constructors are preserved (TypeError, DOMException, etc) and more can be added.

value

Type: {message: string} | unknown

options

Type: object

maxDepth

Type: number\ Default: Number.POSITIVE_INFINITY

The maximum depth of properties to preserve when serializing/deserializing.

import {serializeError} from 'serialize-error';

const error = new Error('🦄');
error.one = {two: {three: {}}};

console.log(serializeError(error, {maxDepth: 1}));
//=> {name: 'Error', message: '🦄', one: {}}

console.log(serializeError(error, {maxDepth: 2}));
//=> {name: 'Error', message: '🦄', one: { two: {}}}

useToJSON

Type: boolean\ Default: true

Indicate whether to use a .toJSON() method if encountered in the object. This is useful when a custom error implements its own serialization logic via .toJSON() but you prefer to not use it.

isErrorLike(value)

Predicate to determine whether a value looks like an error, even if it's not an instance of Error. It must have at least the name, message, and stack properties.

import {isErrorLike} from 'serialize-error';

const error = new Error('🦄');
error.one = {two: {three: {}}};

isErrorLike({
	name: 'DOMException',
	message: 'It happened',
	stack: 'at foo (index.js:2:9)',
});
//=> true

isErrorLike(new Error('🦄'));
//=> true

isErrorLike(serializeError(new Error('🦄'));
//=> true

isErrorLike({
	name: 'Bluberricious pancakes',
	stack: 12,
	ingredients: 'Blueberry',
});
//=> false
bit-bin@atomist/automation-client@atomist/sdm-localeasy-select-rnreact-native-bluetooth2killi8n-react-native-fast-imageswytch-x-notification-clientdocker-layers-cacheserverless-offline-lambda-supportservice-calendarrn-send-smsonewallet.library.rabbit@arunkumarpalaniappan/node-common@stelladoradus/hermes-clipg-taskq-serverlec-multitenant-apireact-native-template-rfbase@stelladoradus/stella-cliairscanairscan-examplepg-taskq@daysmart/frankenstack-apicpo-commonreact-native-esc-pos-sahaab@withonevision/omnihive@borisovart/atol-kkt-module@withonevision/omnihive-worker-featureflag-launchdarkly-node@withonevision/omnihive-worker-12stone@withonevision/omnihive-worker-elastic@jessitron/automation-clientdeneme323112disposabletestabcd@256dev/sdk-node@ntt_app/react-native-custom-notificationreact-native-custom-text-hwjamesreact-native-covid-sdkck12-be-logger@traceman/clientreact-native-thanh-toast-library@thanhnguyen14797/react-native-thanh-toast-libraryts-gutsreact-native-printer-brothersrn-pdf-reader-offlinereact-native-shekhar-bridge-test@envase/connect-commonwilscanner@oiti/documentoscopy-react-nativequoc-testreact-native-slider-kfone-indexarena-rt@infinitebrahmanuniverse/nolb-seri@webcatalog/electron-ipc-cat@pixiebrix/extensionluminos-ui-core@everything-registry/sub-chunk-2735jawwy-sdkjawwy_gamification_releaserest-import-wavemaker-v2react-native-sphereuisphereuijawwy_libraryreact-native-credit-card-pkg@itoa/itoa@itoa/keystonereact-native-jawwy_samplegriffin-ui-librarysync-mattermost-reduxswagger-hpsswagger-iswagger-custom-uiswagger-adjusttest-library-123test-haptik-libtea-swagger-uitea-swagger-ui2test-npm-jjmessiwiddixwinston-trustpilotworker-pool-aws-sdkx-mattermost-reduxwifi_configuration_packagewumpus-carrierxendit-pg-bossxdlsuper-tech-heroestemittest-sdk-ui-integrationtest-zeo-collecttestnpm_lmnswagger-uiswagger-ui-extendswagger-uihpsswagger-ui-qtgswagger-ui-reactswagger-ui-react-enhancedsvc-rpcswaggerhptglib-execathread-func
12.0.0

5 months ago

11.0.3

2 years ago

11.0.2

2 years ago

11.0.1

2 years ago

11.0.0

3 years ago

10.0.0

3 years ago

9.1.1

3 years ago

9.1.0

3 years ago

9.0.0

4 years ago

8.1.0

4 years ago

8.0.1

4 years ago

8.0.0

4 years ago

7.0.1

5 years ago

7.0.0

5 years ago

6.0.0

5 years ago

5.0.0

6 years ago

4.1.0

6 years ago

4.0.0

6 years ago

3.0.0

7 years ago

2.1.0

9 years ago

2.0.0

9 years ago

1.1.0

10 years ago

1.0.0

10 years ago