Skip to content

Commit 7d34d86

Browse files
committed
🎀 handle-rejection: Handle unhandled rejections
1 parent 6655416 commit 7d34d86

File tree

12 files changed

+131
-0
lines changed

12 files changed

+131
-0
lines changed

.eslintrc

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
"assert": true,
3131
"sleep": true,
3232
"freeze": true
33+
},
34+
"rules": {
35+
"no-console": 0
3336
}
3437
},
3538
{

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Mono repo holding multiple packages
1616
| **`doamrn`** | [Retrieve a random item from the arguments](./packages/doamrn#readme) | [![1.0.2](https://img.shields.io/npm/v/doamrn.svg)](https://www.npmjs.com/package/doamrn)
1717
| **`edit-package`** | [Read, write and reset package.json](./packages/edit-package#readme) | [![1.0.1](https://img.shields.io/npm/v/edit-package.svg)](https://www.npmjs.com/package/edit-package)
1818
| **`@recursive/flatten`** | [Flatten arrays of arrays, as long as all the members are arrays](./packages/flatten#readme) | [![0.0.0](https://img.shields.io/npm/v/@recursive/flatten.svg)](https://www.npmjs.com/package/@recursive/flatten)
19+
| **`handle-rejection`** | [💀 Handle unhandled rejections](./packages/handle-rejection#readme) | [![0.0.0](https://img.shields.io/npm/v/handle-rejection.svg)](https://www.npmjs.com/package/handle-rejection)
1920
| **`hypertonia`** | [A theme for Hyper.](./packages/hypertonia#readme) | [![0.2.6](https://img.shields.io/npm/v/hypertonia.svg)](https://www.npmjs.com/package/hypertonia)
2021
| **`index-require`** | [Create an index for a lib directory](./packages/index-require#readme) | [![0.1.0](https://img.shields.io/npm/v/index-require.svg)](https://www.npmjs.com/package/index-require)
2122
| **`jsnpm`** | [Use NPM in Javascript runtime](./packages/jsnpm#readme) | [![0.3.2](https://img.shields.io/npm/v/jsnpm.svg)](https://www.npmjs.com/package/jsnpm)
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text eol=lf

packages/handle-rejection/.npmignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.*
2+
*.log
3+
spec.js

packages/handle-rejection/.npmrc

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
package-lock=false
2+
access=public

packages/handle-rejection/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# handle-rejection [![](https://img.shields.io/npm/v/handle-rejection.svg)](https://www.npmjs.com/package/handle-rejection) [![](https://img.shields.io/badge/source--000000.svg?logo=github&style=social)](https://github.com/omrilotan/mono/tree/master/packages/handle-rejection)
2+
3+
## 💀 Handle unhandled rejections
4+
5+
Built in single handlers
6+
```js
7+
require('handle-rejection').console(); // console.error(error)
8+
require('handle-rejection').exit(); // process.exit(1)
9+
require('handle-rejection').throw(); // throw error
10+
```
11+
12+
Combined handlers (built in and custom)
13+
```js
14+
require('handle-rejection')(
15+
error => Raven.captureException(error) // custom
16+
'exit', // built in
17+
);
18+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = console.error; // eslint-disable-line no-console
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = () => {
2+
process.exit(1);
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = error => { throw error; };

packages/handle-rejection/index.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const BUILT_IN = [
2+
'console',
3+
'exit',
4+
'throw',
5+
];
6+
7+
const handle = fn => process.on('unhandledRejection', fn);
8+
9+
function bundle(...handlers) {
10+
handle(
11+
error => handlers.forEach(handler => {
12+
switch (typeof handler) {
13+
case 'function':
14+
handler(error);
15+
break;
16+
case 'string':
17+
if (BUILT_IN.includes(handler)) {
18+
require(`./handlers/${handler}`)(error);
19+
}
20+
break;
21+
}
22+
})
23+
);
24+
}
25+
26+
BUILT_IN.reduce(
27+
(accumulator, key) => Object.assign(
28+
accumulator,
29+
{[key]: handle(require(`./handlers/${key}`))}
30+
),
31+
bundle
32+
);
33+
34+
module.exports = bundle;
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "handle-rejection",
3+
"version": "0.0.0",
4+
"description": "💀 Handle unhandled rejections",
5+
"keywords": [
6+
"unhandledRejection",
7+
"handle rejection",
8+
"error",
9+
"handler",
10+
"process",
11+
"💀"
12+
],
13+
"author": "omrilotan",
14+
"license": "MIT",
15+
"repository": {
16+
"type": "git",
17+
"url": "git+https://github.com/omrilotan/mono.git"
18+
},
19+
"homepage": "https://omrilotan.com/mono/handle-rejection/",
20+
"main": "index.js",
21+
"scripts": {
22+
"test": "cd ../../; npm t handle-rejection; cd -"
23+
}
24+
}

packages/handle-rejection/spec.js

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const stubs = {};
2+
let handle;
3+
4+
describe('handle-rejection', async() => {
5+
const on = process.on;
6+
const consoleerror = console.error;
7+
8+
beforeEach(() => {
9+
process.on = (...args) => stubs.on(...args);
10+
console.error = (...args) => stubs.console(...args);
11+
stubs.on = () => null;
12+
delete require.cache[require.resolve('.')];
13+
handle = require('.');
14+
});
15+
16+
after(() => {
17+
delete require.cache[require.resolve('.')];
18+
process.on = on;
19+
console.error = consoleerror;
20+
});
21+
it('Should call on multiple handlers', async() => {
22+
let consoled = false;
23+
let called = false;
24+
25+
stubs.console = () => {
26+
consoled = true;
27+
}
28+
function custom() {
29+
called = true;
30+
}
31+
32+
stubs.on = (name, fn) => fn();
33+
34+
handle('console', custom);
35+
36+
expect(called).to.be.true;
37+
expect(consoled).to.be.true;
38+
39+
});
40+
});

0 commit comments

Comments
 (0)