Skip to content

Commit 53c754d

Browse files
authored
Rename exports to be more generic (#75)
* Rename exports to be more generic * Update changelog * Specify Ethereum EIP-1474 in a comment, mention Ethereum EIP-1193 renaming This commit updates comments in the README file to make it clear that JSON-RPC errors and Ethereum EIP-1474 errors are under the 'rpcErrors' namespace, and adds that Ethereum EIP-1193 Provider errors are now under the 'providerErrors' namespace. * Export providerErrors from index.ts file The providerErrors was not exported from the index.ts file, so it was imported separately from the errors module. This commit includes the export statement for providerErrors in the index.ts file. * Update code coverage thresholds Adjusting the coverage thresholds to meet the new requirements.
1 parent 5991ddd commit 53c754d

File tree

11 files changed

+281
-278
lines changed

11 files changed

+281
-278
lines changed

CHANGELOG.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9191
- `serializeError`
9292
- If the object passed to the function has a `.message` property, it will preferred over the `.message` property of the fallback error when creating the returned serialized error object
9393

94-
[Unreleased]: https://github.com/MetaMask/eth-rpc-errors/compare/v4.0.3...HEAD
95-
[4.0.3]: https://github.com/MetaMask/eth-rpc-errors/compare/v4.0.2...v4.0.3
96-
[4.0.2]: https://github.com/MetaMask/eth-rpc-errors/compare/v4.0.1...v4.0.2
97-
[4.0.1]: https://github.com/MetaMask/eth-rpc-errors/compare/v4.0.0...v4.0.1
98-
[4.0.0]: https://github.com/MetaMask/eth-rpc-errors/compare/v3.0.0...v4.0.0
99-
[3.0.0]: https://github.com/MetaMask/eth-rpc-errors/compare/v2.1.1...v3.0.0
100-
[2.1.1]: https://github.com/MetaMask/eth-rpc-errors/compare/v2.1.0...v2.1.1
101-
[2.1.0]: https://github.com/MetaMask/eth-rpc-errors/compare/v2.0.2...v2.1.0
102-
[2.0.2]: https://github.com/MetaMask/eth-rpc-errors/compare/v2.0.1...v2.0.2
103-
[2.0.1]: https://github.com/MetaMask/eth-rpc-errors/compare/v2.0.0...v2.0.1
104-
[2.0.0]: https://github.com/MetaMask/eth-rpc-errors/compare/v1.1.0...v2.0.0
105-
[1.1.0]: https://github.com/MetaMask/eth-rpc-errors/releases/tag/v1.1.0
94+
[Unreleased]: https://github.com/MetaMask/rpc-errors/compare/v4.0.3...HEAD
95+
[4.0.3]: https://github.com/MetaMask/rpc-errors/compare/v4.0.2...v4.0.3
96+
[4.0.2]: https://github.com/MetaMask/rpc-errors/compare/v4.0.1...v4.0.2
97+
[4.0.1]: https://github.com/MetaMask/rpc-errors/compare/v4.0.0...v4.0.1
98+
[4.0.0]: https://github.com/MetaMask/rpc-errors/compare/v3.0.0...v4.0.0
99+
[3.0.0]: https://github.com/MetaMask/rpc-errors/compare/v2.1.1...v3.0.0
100+
[2.1.1]: https://github.com/MetaMask/rpc-errors/compare/v2.1.0...v2.1.1
101+
[2.1.0]: https://github.com/MetaMask/rpc-errors/compare/v2.0.2...v2.1.0
102+
[2.0.2]: https://github.com/MetaMask/rpc-errors/compare/v2.0.1...v2.0.2
103+
[2.0.1]: https://github.com/MetaMask/rpc-errors/compare/v2.0.0...v2.0.1
104+
[2.0.0]: https://github.com/MetaMask/rpc-errors/compare/v1.1.0...v2.0.0
105+
[1.1.0]: https://github.com/MetaMask/rpc-errors/releases/tag/v1.1.0

README.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,48 @@ or
1717
## Usage
1818

1919
```js
20-
import { ethErrors } from '@metamask/rpc-errors';
20+
import { rpcErrors, providerErrors } from '@metamask/rpc-errors';
2121

22-
throw ethErrors.provider.unauthorized();
22+
throw rpcErrors.invalidRequest();
2323
// or
24-
throw ethErrors.provider.unauthorized('my custom message');
24+
throw providerErrors.unauthorized('my custom message');
2525
```
2626

2727
## Supported Errors
2828

29+
- Generic JSON RPC 2.0 errors
30+
- Per [JSON RPC 2.0 spec](https://www.jsonrpc.org/specification#error_object)
2931
- Ethereum JSON RPC
3032
- Per [EIP-1474](https://eips.ethereum.org/EIPS/eip-1474#error-codes)
31-
- This includes all
32-
[JSON RPC 2.0 errors](https://www.jsonrpc.org/specification#error_object)
3333
- Ethereum Provider errors
3434
- Per [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193#provider-errors)
3535
- Does **not** yet support [`CloseEvent` errors or status codes](https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes).
3636

3737
## API
3838

3939
```js
40-
import { ethErrors } from '@metamask/rpc-errors';
40+
import { rpcErrors, providerErrors } from '@metamask/rpc-errors';
4141

42-
// Ethereum RPC errors are namespaced under "ethErrors.rpc"
43-
response.error = ethErrors.rpc.methodNotFound({
42+
// JSON-RPC errors and Ethereum EIP-1474 errors are namespaced under "rpcErrors"
43+
response.error = rpcErrors.methodNotFound({
4444
message: optionalCustomMessage,
4545
data: optionalData,
4646
});
4747

48-
// Provider errors namespaced under ethErrors.provider
49-
response.error = ethErrors.provider.unauthorized({
48+
// Ethereum EIP-1193 Provider errors namespaced under "providerErrors"
49+
response.error = providerErrors.unauthorized({
5050
message: optionalCustomMessage,
5151
data: optionalData,
5252
});
5353

5454
// each error getter takes a single "opts" argument
5555
// for most errors, this can be replaced with a single string, which becomes
5656
// the error message
57-
response.error = ethErrors.provider.unauthorized(customMessage);
57+
response.error = providerErrors.unauthorized(customMessage);
5858

5959
// if an error getter accepts a single string, all arguments can be omitted
60-
response.error = ethErrors.provider.unauthorized();
61-
response.error = ethErrors.provider.unauthorized({});
60+
response.error = providerErrors.unauthorized();
61+
response.error = providerErrors.unauthorized({});
6262

6363
// omitting the message will produce an error with a default message per
6464
// the relevant spec
@@ -67,13 +67,13 @@ response.error = ethErrors.provider.unauthorized({});
6767
// "data" property
6868

6969
// the JSON RPC 2.0 server error requires a valid code
70-
response.error = ethErrors.rpc.server({
70+
response.error = rpcErrors.server({
7171
code: -32031,
7272
});
7373

7474
// custom Ethereum Provider errors require a valid code and message
7575
// valid codes are integers i such that: 1000 <= i <= 4999
76-
response.error = ethErrors.provider.custom({
76+
response.error = providerErrors.custom({
7777
code: 1001,
7878
message: 'foo',
7979
});
@@ -109,7 +109,7 @@ response.error = serializeError(maybeAnError, fallbackError)
109109
/**
110110
* Classes
111111
*/
112-
import { EthereumRpcError, EthereumProviderError } from '@metamask/rpc-errors';
112+
import { JsonRpcError, EthereumProviderError } from '@metamask/rpc-errors';
113113

114114
/**
115115
* getMessageFromCode and errorCodes
@@ -126,11 +126,11 @@ const message2 = getMessageFromCode(someCode, myFallback);
126126
const message3 = getMessageFromCode(someCode, null);
127127

128128
// {
129-
// rpc: { [errorName]: code, ... },
130-
// provider: { [errorName]: code, ... },
129+
// rpcErrors: { [errorName]: code, ... },
130+
// providerErrors: { [errorName]: code, ... },
131131
// }
132-
const code1 = errorCodes.rpc.parse;
133-
const code2 = errorCodes.provider.userRejectedRequest;
132+
const code1 = rpcErrors.parse;
133+
const code2 = providerErrors.userRejectedRequest;
134134

135135
// all codes in errorCodes have default messages
136136
const message4 = getMessageFromCode(code1);

jest.config.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ module.exports = {
4141
// An object that configures minimum threshold enforcement for coverage results
4242
coverageThreshold: {
4343
global: {
44-
branches: 94.44,
45-
functions: 85,
46-
lines: 96.87,
47-
statements: 96.87,
44+
branches: 94.5,
45+
functions: 85.36,
46+
lines: 96.88,
47+
statements: 96.88,
4848
},
4949
},
5050

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
"errors",
99
"utility"
1010
],
11-
"homepage": "https://github.com/MetaMask/eth-rpc-errors#readme",
11+
"homepage": "https://github.com/MetaMask/rpc-errors#readme",
1212
"bugs": {
13-
"url": "https://github.com/MetaMask/eth-rpc-errors/issues"
13+
"url": "https://github.com/MetaMask/rpc-errors/issues"
1414
},
1515
"repository": {
1616
"type": "git",
17-
"url": "https://github.com/MetaMask/eth-rpc-errors.git"
17+
"url": "https://github.com/MetaMask/rpc-errors.git"
1818
},
1919
"license": "MIT",
2020
"author": "Erik Marks <[email protected]>",

src/__fixtures__/errors.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ethErrors } from '..';
1+
import { rpcErrors } from '..';
22

33
export const dummyData = { foo: 'bar' };
44
export const dummyMessage = 'baz';
@@ -26,11 +26,11 @@ export const validError1 = {
2626
message: dummyMessage,
2727
data: Object.assign({}, dummyData),
2828
};
29-
export const validError2 = ethErrors.rpc.parse();
29+
export const validError2 = rpcErrors.parse();
3030
delete validError2.stack;
31-
export const validError3 = ethErrors.rpc.parse(dummyMessage);
31+
export const validError3 = rpcErrors.parse(dummyMessage);
3232
delete validError3.stack;
33-
export const validError4 = ethErrors.rpc.parse({
33+
export const validError4 = rpcErrors.parse({
3434
message: dummyMessage,
3535
data: Object.assign({}, dummyData),
3636
});

src/classes.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import safeStringify from 'fast-safe-stringify';
2-
import { Json, JsonRpcError } from '@metamask/utils';
2+
import { Json, JsonRpcError as SerializedJsonRpcError } from '@metamask/utils';
33

4-
export { JsonRpcError };
4+
export { SerializedJsonRpcError };
55

66
/**
77
* Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors
88
* per EIP-1474.
99
*
1010
* Permits any integer error code.
1111
*/
12-
export class EthereumRpcError<T extends Json> extends Error {
12+
export class JsonRpcError<T extends Json> extends Error {
1313
public code: number;
1414

1515
public data?: T;
@@ -20,7 +20,7 @@ export class EthereumRpcError<T extends Json> extends Error {
2020
}
2121

2222
if (!message || typeof message !== 'string') {
23-
throw new Error('"message" must be a nonempty string.');
23+
throw new Error('"message" must be a non-empty string.');
2424
}
2525

2626
super(message);
@@ -35,8 +35,8 @@ export class EthereumRpcError<T extends Json> extends Error {
3535
*
3636
* @returns A plain object with all public class properties.
3737
*/
38-
serialize(): JsonRpcError {
39-
const serialized: JsonRpcError = {
38+
serialize(): SerializedJsonRpcError {
39+
const serialized: SerializedJsonRpcError = {
4040
code: this.code,
4141
message: this.message,
4242
};
@@ -65,7 +65,7 @@ export class EthereumRpcError<T extends Json> extends Error {
6565
* Error subclass implementing Ethereum Provider errors per EIP-1193.
6666
* Permits integer error codes in the [ 1000 <= 4999 ] range.
6767
*/
68-
export class EthereumProviderError<T extends Json> extends EthereumRpcError<T> {
68+
export class EthereumProviderError<T extends Json> extends JsonRpcError<T> {
6969
/**
7070
* Create an Ethereum Provider JSON-RPC error.
7171
*

src/errors.test.ts

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ import {
55
SERVER_ERROR_CODE,
66
CUSTOM_ERROR_CODE,
77
} from './__fixtures__';
8-
import { ethErrors, errorCodes } from '.';
8+
import { rpcErrors, providerErrors, errorCodes } from '.';
99

10-
describe('ethErrors.rpc.invalidInput', () => {
10+
describe('rpcErrors.invalidInput', () => {
1111
it('accepts a single string argument where appropriate', () => {
12-
const err = ethErrors.rpc.invalidInput(CUSTOM_ERROR_MESSAGE);
12+
const err = rpcErrors.invalidInput(CUSTOM_ERROR_MESSAGE);
1313
expect(err.code).toBe(errorCodes.rpc.invalidInput);
1414
expect(err.message).toBe(CUSTOM_ERROR_MESSAGE);
1515
});
1616
});
1717

18-
describe('ethErrors.provider.unauthorized', () => {
18+
describe('providerErrors.unauthorized', () => {
1919
it('accepts a single string argument where appropriate', () => {
20-
const err = ethErrors.provider.unauthorized(CUSTOM_ERROR_MESSAGE);
20+
const err = providerErrors.unauthorized(CUSTOM_ERROR_MESSAGE);
2121
expect(err.code).toBe(errorCodes.provider.unauthorized);
2222
expect(err.message).toBe(CUSTOM_ERROR_MESSAGE);
2323
});
@@ -27,7 +27,7 @@ describe('custom provider error options', () => {
2727
it('throws if the value is not an options object', () => {
2828
expect(() => {
2929
// @ts-expect-error Invalid input
30-
ethErrors.provider.custom('bar');
30+
providerErrors.custom('bar');
3131
}).toThrow(
3232
'Ethereum Provider custom errors must provide single object argument.',
3333
);
@@ -36,11 +36,11 @@ describe('custom provider error options', () => {
3636
it('throws if the value is invalid', () => {
3737
expect(() => {
3838
// @ts-expect-error Invalid input
39-
ethErrors.provider.custom({ code: 4009, message: 2 });
39+
providerErrors.custom({ code: 4009, message: 2 });
4040
}).toThrow('"message" must be a nonempty string');
4141

4242
expect(() => {
43-
ethErrors.provider.custom({ code: 4009, message: '' });
43+
providerErrors.custom({ code: 4009, message: '' });
4444
}).toThrow('"message" must be a nonempty string');
4545
});
4646
});
@@ -49,24 +49,24 @@ describe('ethError.rpc.server', () => {
4949
it('throws on invalid input', () => {
5050
expect(() => {
5151
// @ts-expect-error Invalid input
52-
ethErrors.rpc.server('bar');
52+
rpcErrors.server('bar');
5353
}).toThrow(
5454
'Ethereum RPC Server errors must provide single object argument.',
5555
);
5656

5757
expect(() => {
5858
// @ts-expect-error Invalid input
59-
ethErrors.rpc.server({ code: 'bar' });
59+
rpcErrors.server({ code: 'bar' });
6060
}).toThrow('"code" must be an integer such that: -32099 <= code <= -32005');
6161

6262
expect(() => {
63-
ethErrors.rpc.server({ code: 1 });
63+
rpcErrors.server({ code: 1 });
6464
}).toThrow('"code" must be an integer such that: -32099 <= code <= -32005');
6565
});
6666
});
6767

68-
describe('ethError.rpc', () => {
69-
it.each(Object.entries(ethErrors.rpc).filter(([key]) => key !== 'server'))(
68+
describe('rpcErrors', () => {
69+
it.each(Object.entries(rpcErrors).filter(([key]) => key !== 'server'))(
7070
'%s returns appropriate value',
7171
(key, value) => {
7272
const createError = value as any;
@@ -86,7 +86,7 @@ describe('ethError.rpc', () => {
8686
);
8787

8888
it('server returns appropriate value', () => {
89-
const error = ethErrors.rpc.server({
89+
const error = rpcErrors.server({
9090
code: SERVER_ERROR_CODE,
9191
data: Object.assign({}, dummyData),
9292
});
@@ -96,24 +96,25 @@ describe('ethError.rpc', () => {
9696
});
9797
});
9898

99-
describe('ethError.provider', () => {
100-
it.each(
101-
Object.entries(ethErrors.provider).filter(([key]) => key !== 'custom'),
102-
)('%s returns appropriate value', (key, value) => {
103-
const createError = value as any;
104-
const error = createError({
105-
message: null,
106-
data: Object.assign({}, dummyData),
107-
});
108-
// @ts-expect-error TypeScript does not like indexing into this with the key
109-
const providerCode = errorCodes.provider[key];
110-
expect(error.code >= 1000 && error.code < 5000).toBe(true);
111-
expect(error.code).toBe(providerCode);
112-
expect(error.message).toBe(getMessageFromCode(providerCode));
113-
});
99+
describe('providerErrors', () => {
100+
it.each(Object.entries(providerErrors).filter(([key]) => key !== 'custom'))(
101+
'%s returns appropriate value',
102+
(key, value) => {
103+
const createError = value as any;
104+
const error = createError({
105+
message: null,
106+
data: Object.assign({}, dummyData),
107+
});
108+
// @ts-expect-error TypeScript does not like indexing into this with the key
109+
const providerCode = errorCodes.provider[key];
110+
expect(error.code >= 1000 && error.code < 5000).toBe(true);
111+
expect(error.code).toBe(providerCode);
112+
expect(error.message).toBe(getMessageFromCode(providerCode));
113+
},
114+
);
114115

115116
it('custom returns appropriate value', () => {
116-
const error = ethErrors.provider.custom({
117+
const error = providerErrors.custom({
117118
code: CUSTOM_ERROR_CODE,
118119
message: CUSTOM_ERROR_MESSAGE,
119120
data: Object.assign({}, dummyData),

0 commit comments

Comments
 (0)