Awaitable hooks for Node.js
Using yarn:
yarn add hookableUsing npm:
npm install hookableExtend your base class from Hookable:
import Hookable from 'hookable'
export default class Foo extends Hookable {
constructor() {
// Call to parent to initialize
super()
// Initialize Hookable with custom logger
// super(consola)
}
async someFunction() {
// Call and wait for `hook1` hooks (if any) sequential
await this.callHook('hook1')
}
}Inside plugins, register for any hook:
const lib = newFooLib()
// Register a handler for `hook2`
lib.hook('hook2', async () => { /* ... */ })
// Register multiply handlers at once
lib.addHooks({
hook1: async () => { /* ... */ },
hook2: [ /* can be also an array */ ]
})Unregistering hooks:
const lib = newFooLib()
const hook0 = async () => { /* ... */ }
const hook1 = async () => { /* ... */ }
const hook2 = async () => { /* ... */ }
// The hook() method returns an "unregister" function
const unregisterHook0 = lib.hook('hook0', hook0)
const unregisterHooks1and2 lib.addHooks({ hook1, hook2 })
/* ... */
unregisterHook0()
unregisterHooks1and2()
// or
lib.removeHooks({ hook0, hook1 })
lib.removeHook('hook2', hook2)Triggering a hook handler once:
const lib = newFooLib()
const unregister = lib.hook('hook0', async () => {
// Unregister as soon as the hook is executed
unregister()
/* ... */
})Custom logger. Default logger is console but you can use your own or consola.
It should be an object implementing following functions:
- warn
- error
- fatal (optional)
Register a handler for a specific hook. fn must be a function.
Returns an unregister function that, when called, will remove the registered handler.
Flatten and register hooks object.
Example:
hookable.addHooks({
test: {
before: () => {},
after: () => {}
}
})This registers test:before and test:after hooks at bulk.
Returns an unregister function that, when called, will remove all the registered handlers.
Used by class itself to sequentially call handlers of a specific hook.
Deprecate hook called old in favor of name hook.
Deprecate all hooks from an object (keys are old and values or newer ones).
Remove a particular hook handler, if the fn handler is present.
Remove multiple hook handlers.
Example:
const handler = async () => { /* ... */ }
hookable.hook('test:before', handler)
hookable.addHooks({ test: { after: handler } })
// ...
hookable.removeHooks({
test: {
before: handler,
after: handler
}
})Extracted from Nuxt.js hooks system
Original author Sébastien Chopin
Thanks to Joe Paice for donating hookable package name
MIT - Made with 💖 by Nuxt.js team!