index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. var register = require('./lib/register')
  2. var addHook = require('./lib/add')
  3. var removeHook = require('./lib/remove')
  4. // bind with array of arguments: https://stackoverflow.com/a/21792913
  5. var bind = Function.bind
  6. var bindable = bind.bind(bind)
  7. function bindApi (hook, state, name) {
  8. var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state])
  9. hook.api = { remove: removeHookRef }
  10. hook.remove = removeHookRef
  11. ;['before', 'error', 'after', 'wrap'].forEach(function (kind) {
  12. var args = name ? [state, kind, name] : [state, kind]
  13. hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args)
  14. })
  15. }
  16. function HookSingular () {
  17. var singularHookName = 'h'
  18. var singularHookState = {
  19. registry: {}
  20. }
  21. var singularHook = register.bind(null, singularHookState, singularHookName)
  22. bindApi(singularHook, singularHookState, singularHookName)
  23. return singularHook
  24. }
  25. function HookCollection () {
  26. var state = {
  27. registry: {}
  28. }
  29. var hook = register.bind(null, state)
  30. bindApi(hook, state)
  31. return hook
  32. }
  33. var collectionHookDeprecationMessageDisplayed = false
  34. function Hook () {
  35. if (!collectionHookDeprecationMessageDisplayed) {
  36. console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4')
  37. collectionHookDeprecationMessageDisplayed = true
  38. }
  39. return HookCollection()
  40. }
  41. Hook.Singular = HookSingular.bind()
  42. Hook.Collection = HookCollection.bind()
  43. module.exports = Hook
  44. // expose constructors as a named property for TypeScript
  45. module.exports.Hook = Hook
  46. module.exports.Singular = Hook.Singular
  47. module.exports.Collection = Hook.Collection