Skip to content

Commit

Permalink
Allow passing unknown values as cause (#91)
Browse files Browse the repository at this point in the history
* Allow passing unknown values as cause

Previously, only the `Error` type as accepted as cause, but since any value can be thrown as error, we have to allow any value to be used.

* Update coverage threshold

---------

Co-authored-by: legobeat <109787230+legobeat@users.noreply.github.com>
  • Loading branch information
Mrtenz and legobeat authored Apr 19, 2023
1 parent 1d1852d commit e06f8d8
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 6 deletions.
6 changes: 3 additions & 3 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ module.exports = {
// An object that configures minimum threshold enforcement for coverage results
coverageThreshold: {
global: {
branches: 94.25,
branches: 94.31,
functions: 94.11,
lines: 97.04,
statements: 97.04,
lines: 97.05,
statements: 97.05,
},
},

Expand Down
38 changes: 38 additions & 0 deletions src/errors.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,25 @@ describe('rpcErrors', () => {
},
});
});

it('serializes a non-Error-instance cause', () => {
const error = rpcErrors.invalidInput({
data: {
foo: 'bar',
cause: 'foo',
},
});

const serializedError = error.serialize();
assert(serializedError.data);
assert(isPlainObject(serializedError.data));

expect(serializedError.data.cause).not.toBeInstanceOf(Error);
expect(serializedError.data).toStrictEqual({
foo: 'bar',
cause: 'foo',
});
});
});

describe('providerErrors', () => {
Expand Down Expand Up @@ -169,4 +188,23 @@ describe('providerErrors', () => {
},
});
});

it('serializes a non-Error-instance cause', () => {
const error = providerErrors.unauthorized({
data: {
foo: 'bar',
cause: 'foo',
},
});

const serializedError = error.serialize();
assert(serializedError.data);
assert(isPlainObject(serializedError.data));

expect(serializedError.data.cause).not.toBeInstanceOf(Error);
expect(serializedError.data).toStrictEqual({
foo: 'bar',
cause: 'foo',
});
});
});
9 changes: 6 additions & 3 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ import { errorCodes, errorValues } from './error-constants';
* A data object, that must be either:
*
* - A JSON-serializable object.
* - An object with a `cause` property that is an `Error` instance, and any
* - An object with a `cause` property that is an error-like value, and any
* other properties that are JSON-serializable.
*/
export type DataWithOptionalCause =
| Json
| {
[key: string]: Json | Error;
cause: Error;
// Unfortunately we can't use just `Json` here, because all properties of
// an object with an index signature must be assignable to the index
// signature's type. So we have to use `Json | unknown` instead.
[key: string]: Json | unknown;
cause: unknown;
};

const FALLBACK_ERROR_CODE = errorCodes.rpc.internal;
Expand Down

0 comments on commit e06f8d8

Please sign in to comment.