diff --git a/index.d.ts b/index.d.ts index dc47c85..5fa6689 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1,4 @@ -import {Primitive, JsonObject} from 'type-fest'; +import {type Primitive, type JsonObject} from 'type-fest'; export {default as errorConstructors} from './error-constructors.js'; @@ -19,7 +19,7 @@ export type ErrorLike = { code?: string; }; -export interface Options { +export type Options = { /** The maximum depth of properties to preserve when serializing/deserializing. @@ -47,7 +47,7 @@ export interface Options { @default true */ readonly useToJSON?: boolean; -} +}; /** Serialize an `Error` object into a plain object. diff --git a/index.js b/index.js index 22f4499..525ec3b 100644 --- a/index.js +++ b/index.js @@ -128,7 +128,7 @@ const destroyCircular = ({ } for (const {property, enumerable} of commonProperties) { - if (typeof from[property] !== 'undefined' && from[property] !== null) { + if (from[property] !== undefined && from[property] !== null) { Object.defineProperty(to, property, { value: isErrorLike(from[property]) ? continueDestroyCircular(from[property]) : from[property], enumerable: forceEnumerable ? true : enumerable, diff --git a/index.test-d.ts b/index.test-d.ts index ea7412e..a50b97b 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,5 +1,7 @@ import {expectType, expectAssignable} from 'tsd'; -import {serializeError, deserializeError, ErrorObject, Options} from './index.js'; +import { + serializeError, deserializeError, type ErrorObject, type Options, +} from './index.js'; const error = new Error('unicorn'); diff --git a/package.json b/package.json index d5886c5..d8bcdd8 100644 --- a/package.json +++ b/package.json @@ -38,11 +38,11 @@ "deserialize" ], "dependencies": { - "type-fest": "^2.12.2" + "type-fest": "^4.31.0" }, "devDependencies": { - "ava": "^4.2.0", - "tsd": "^0.20.0", - "xo": "^0.48.0" + "ava": "^6.2.0", + "tsd": "^0.31.2", + "xo": "^0.60.0" } } diff --git a/test.js b/test.js index 45ced34..03c8615 100644 --- a/test.js +++ b/test.js @@ -119,7 +119,7 @@ test('should drop functions', t => { const serialized = serializeError(object); t.deepEqual(serialized, {}); - t.false(Object.prototype.hasOwnProperty.call(serialized, 'a')); + t.false(Object.hasOwn(serialized, 'a')); }); test('should not access deep non-enumerable properties', t => { @@ -349,6 +349,17 @@ test('should deserialize properties up to `Options.maxDepth` levels deep', t => t.deepEqual(levelThree, error); }); +test('should ignore objects that look like errors but are not', t => { + const object = { + name: 'Error', + message: (new class {}('Foo')), + stack: 'at :3:14', + }; + + const deserialized = deserializeError(object); + t.deepEqual(deserialized, object); +}); + test('should serialize Date as ISO string', t => { const date = {date: new Date(0)}; const serialized = serializeError(date); @@ -467,13 +478,19 @@ test('should serialize properties up to `Options.maxDepth` levels deep', t => { t.deepEqual(levelZero, {}); const levelOne = serializeError(error, {maxDepth: 1}); - t.deepEqual(levelOne, {message, name, stack, one: {}}); + t.deepEqual(levelOne, { + message, name, stack, one: {}, + }); const levelTwo = serializeError(error, {maxDepth: 2}); - t.deepEqual(levelTwo, {message, name, stack, one: {two: {}}}); + t.deepEqual(levelTwo, { + message, name, stack, one: {two: {}}, + }); const levelThree = serializeError(error, {maxDepth: 3}); - t.deepEqual(levelThree, {message, name, stack, one: {two: {three: {}}}}); + t.deepEqual(levelThree, { + message, name, stack, one: {two: {three: {}}}, + }); }); test('should identify serialized errors', t => {