| var register = require('./lib/register') | |
| var addHook = require('./lib/add') | |
| var removeHook = require('./lib/remove') | |
| // bind with array of arguments: https://stackoverflow.com/a/21792913 | |
| var bind = Function.bind | |
| var bindable = bind.bind(bind) | |
| function bindApi (hook, state, name) { | |
| var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) | |
| hook.api = { remove: removeHookRef } | |
| hook.remove = removeHookRef | |
| ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { | |
| var args = name ? [state, kind, name] : [state, kind] | |
| hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) | |
| }) | |
| } | |
| function HookSingular () { | |
| var singularHookName = 'h' | |
| var singularHookState = { | |
| registry: {} | |
| } | |
| var singularHook = register.bind(null, singularHookState, singularHookName) | |
| bindApi(singularHook, singularHookState, singularHookName) | |
| return singularHook | |
| } | |
| function HookCollection () { | |
| var state = { | |
| registry: {} | |
| } | |
| var hook = register.bind(null, state) | |
| bindApi(hook, state) | |
| return hook | |
| } | |
| var collectionHookDeprecationMessageDisplayed = false | |
| function Hook () { | |
| if (!collectionHookDeprecationMessageDisplayed) { | |
| console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') | |
| collectionHookDeprecationMessageDisplayed = true | |
| } | |
| return HookCollection() | |
| } | |
| Hook.Singular = HookSingular.bind() | |
| Hook.Collection = HookCollection.bind() | |
| module.exports = Hook | |
| // expose constructors as a named property for TypeScript | |
| module.exports.Hook = Hook | |
| module.exports.Singular = Hook.Singular | |
| module.exports.Collection = Hook.Collection |