Skip to content

Commit

Permalink
feat: hook.error()
Browse files Browse the repository at this point in the history
  • Loading branch information
gr2m committed Jan 16, 2018
1 parent 8e8173c commit 33c78b9
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 8 deletions.
4 changes: 4 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ module.exports = Hook

var register = require('./lib/register')
var before = require('./lib/before')
var error = require('./lib/error')
var after = require('./lib/after')
var removeBefore = require('./lib/remove-before')
var removeError = require('./lib/remove-error')
var removeAfter = require('./lib/remove-after')

function Hook () {
Expand All @@ -15,10 +17,12 @@ function Hook () {
hook.api = {}

hook.api.before = hook.before = before.bind(null, state)
hook.api.error = hook.error = error.bind(null, state)
hook.api.after = hook.after = after.bind(null, state)

hook.api.remove = hook.remove = {
before: removeBefore.bind(null, state),
error: removeError.bind(null, state),
after: removeAfter.bind(null, state)
}

Expand Down
5 changes: 3 additions & 2 deletions lib/after.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
module.exports = after
module.exports = afterHook

function after (state, name, afterHook) {
function afterHook (state, name, afterHook) {
if (state.registry[name]) {
state.registry[name].after.push(afterHook)
return
}

state.registry[name] = {
before: [],
error: [],
after: [afterHook]
}
}
5 changes: 3 additions & 2 deletions lib/before.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
module.exports = before
module.exports = beforeHook

function before (state, name, beforeHook) {
function beforeHook (state, name, beforeHook) {
if (state.registry[name]) {
state.registry[name].before.unshift(beforeHook)
return
}

state.registry[name] = {
before: [beforeHook],
error: [],
after: []
}
}
14 changes: 14 additions & 0 deletions lib/error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module.exports = errorHook

function errorHook (state, name, errorHook) {
if (state.registry[name]) {
state.registry[name].error.unshift(errorHook)
return
}

state.registry[name] = {
before: [],
error: [errorHook],
after: []
}
}
29 changes: 29 additions & 0 deletions lib/register.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ function register (state, name, options, method) {
}

var beforeHooks = hooks.before
var errorHooks = hooks.error
var afterHooks = hooks.after

return Promise.all(beforeHooks.map(invokeBeforeHook.bind(null, options)))
Expand All @@ -34,6 +35,20 @@ function register (state, name, options, method) {
return method(options)
})

.catch(function (error) {
return Promise.all(errorHooks.map(invokeErrorHook.bind(null, error, options)))

.then(function (results) {
var nonErrorResults = results.filter(isntError)

if (nonErrorResults.length) {
return nonErrorResults[0]
}

throw error
})
})

.then(function (result) {
return Promise.all(afterHooks.map(invokeAfterHook.bind(null, result, options)))

Expand All @@ -59,10 +74,24 @@ function invokeBeforeHook (options, method) {
}
}

function invokeErrorHook (result, options, errorHook) {
try {
return Promise.resolve(errorHook(result, options))

.catch(function (error) { return error })
} catch (error) {
return Promise.resolve(error)
}
}

function invokeAfterHook (result, options, method) {
try {
return method(result, options)
} catch (error) {
return Promise.reject(error)
}
}

function isntError (result) {
return !(result instanceof Error)
}
4 changes: 2 additions & 2 deletions lib/remove-after.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = removeAfter
module.exports = removeAfterHook

function removeAfter (state, name, method) {
function removeAfterHook (state, name, method) {
if (!state.registry[name]) {
return
}
Expand Down
4 changes: 2 additions & 2 deletions lib/remove-before.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = removeBefore
module.exports = removeBeforeHook

function removeBefore (state, name, method) {
function removeBeforeHook (state, name, method) {
if (!state.registry[name]) {
return
}
Expand Down
15 changes: 15 additions & 0 deletions lib/remove-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports = removeErrorHook

function removeErrorHook (state, name, method) {
if (!state.registry[name]) {
return
}

var index = state.registry[name].error.indexOf(method)

if (index === -1) {
return
}

state.registry[name].error.splice(index, 1)
}

0 comments on commit 33c78b9

Please sign in to comment.