From 9d76b1249baf2c31c668a77fe9b3d3020a601087 Mon Sep 17 00:00:00 2001 From: Gregor Date: Mon, 15 Jan 2018 22:43:44 -0800 Subject: [PATCH] refactor: combine implementation of adding/removing hooks --- index.js | 24 ++++++++---------------- lib/add.js | 13 +++++++++++++ lib/after.js | 14 -------------- lib/before.js | 14 -------------- lib/error.js | 14 -------------- lib/register.js | 7 +++++++ lib/remove-after.js | 15 --------------- lib/remove-before.js | 15 --------------- lib/remove-error.js | 15 --------------- lib/remove.js | 15 +++++++++++++++ 10 files changed, 43 insertions(+), 103 deletions(-) create mode 100644 lib/add.js delete mode 100644 lib/after.js delete mode 100644 lib/before.js delete mode 100644 lib/error.js delete mode 100644 lib/remove-after.js delete mode 100644 lib/remove-before.js delete mode 100644 lib/remove-error.js create mode 100644 lib/remove.js diff --git a/index.js b/index.js index 269bdbb..97bd874 100644 --- a/index.js +++ b/index.js @@ -1,12 +1,8 @@ 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') +var addHook = require('./lib/add') +var removeHook = require('./lib/remove') function Hook () { var state = { @@ -14,17 +10,13 @@ function Hook () { } var hook = register.bind(null, state) - hook.api = {} + hook.remove = {} + hook.api = {remove: {}} - 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) - } + ;['before', 'error', 'after'].forEach(function (kind) { + hook[kind] = hook.api[kind] = addHook.bind(null, state, kind) + hook.remove[kind] = hook.api.remove[kind] = removeHook.bind(null, state, kind) + }) return hook } diff --git a/lib/add.js b/lib/add.js new file mode 100644 index 0000000..001701e --- /dev/null +++ b/lib/add.js @@ -0,0 +1,13 @@ +module.exports = addHook + +function addHook (state, kind, name, hook) { + if (!state.registry[name]) { + state.registry[name] = { + before: [], + error: [], + after: [] + } + } + + state.registry[name][kind][kind === 'before' ? 'unshift' : 'push'](hook) +} diff --git a/lib/after.js b/lib/after.js deleted file mode 100644 index 46af160..0000000 --- a/lib/after.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = afterHook - -function afterHook (state, name, afterHook) { - if (state.registry[name]) { - state.registry[name].after.push(afterHook) - return - } - - state.registry[name] = { - before: [], - error: [], - after: [afterHook] - } -} diff --git a/lib/before.js b/lib/before.js deleted file mode 100644 index 0dbbe19..0000000 --- a/lib/before.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = beforeHook - -function beforeHook (state, name, beforeHook) { - if (state.registry[name]) { - state.registry[name].before.unshift(beforeHook) - return - } - - state.registry[name] = { - before: [beforeHook], - error: [], - after: [] - } -} diff --git a/lib/error.js b/lib/error.js deleted file mode 100644 index 3edfa02..0000000 --- a/lib/error.js +++ /dev/null @@ -1,14 +0,0 @@ -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: [] - } -} diff --git a/lib/register.js b/lib/register.js index dbb5316..c048591 100644 --- a/lib/register.js +++ b/lib/register.js @@ -21,6 +21,7 @@ function register (state, name, options, method) { } var hooks = state.registry[name] + if (!hooks) { return invokeMethod(options, method) } @@ -29,12 +30,17 @@ function register (state, name, options, method) { var errorHooks = hooks.error var afterHooks = hooks.after + // 1. run "before hooks" which may mutate options return Promise.all(beforeHooks.map(invokeBeforeHook.bind(null, options))) + // 2. Once all finish without error, call the method with the (mutated) options .then(function () { return method(options) }) + // 3. If an error occurs in 1. or 2. run the "error hooks" which may mutate + // the error object. If one of them does not return an error then set the + // result to that. Otherwise throw (mutated) error. .catch(function (error) { return Promise.all(errorHooks.map(invokeErrorHook.bind(null, error, options))) @@ -49,6 +55,7 @@ function register (state, name, options, method) { }) }) + // 4. Run the "after hooks". They may mutate the result .then(function (result) { return Promise.all(afterHooks.map(invokeAfterHook.bind(null, result, options))) diff --git a/lib/remove-after.js b/lib/remove-after.js deleted file mode 100644 index 1e442c7..0000000 --- a/lib/remove-after.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = removeAfterHook - -function removeAfterHook (state, name, method) { - if (!state.registry[name]) { - return - } - - var index = state.registry[name].after.indexOf(method) - - if (index === -1) { - return - } - - state.registry[name].after.splice(index, 1) -} diff --git a/lib/remove-before.js b/lib/remove-before.js deleted file mode 100644 index c613e66..0000000 --- a/lib/remove-before.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = removeBeforeHook - -function removeBeforeHook (state, name, method) { - if (!state.registry[name]) { - return - } - - var index = state.registry[name].before.indexOf(method) - - if (index === -1) { - return - } - - state.registry[name].before.splice(index, 1) -} diff --git a/lib/remove-error.js b/lib/remove-error.js deleted file mode 100644 index f06db20..0000000 --- a/lib/remove-error.js +++ /dev/null @@ -1,15 +0,0 @@ -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) -} diff --git a/lib/remove.js b/lib/remove.js new file mode 100644 index 0000000..f548c42 --- /dev/null +++ b/lib/remove.js @@ -0,0 +1,15 @@ +module.exports = removeHook + +function removeHook (state, kind, name, method) { + if (!state.registry[name]) { + return + } + + var index = state.registry[name][kind].indexOf(method) + + if (index === -1) { + return + } + + state.registry[name][kind].splice(index, 1) +}