62 lines
1.7 KiB
JavaScript
62 lines
1.7 KiB
JavaScript
|
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;
|