https://github.com/arkerone/hookify-object
Wrap an object with ES6 proxy to add hooks capabilities
https://github.com/arkerone/hookify-object
Last synced: 5 months ago
JSON representation
Wrap an object with ES6 proxy to add hooks capabilities
- Host: GitHub
- URL: https://github.com/arkerone/hookify-object
- Owner: arkerone
- License: mit
- Created: 2020-12-13T16:57:23.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2020-12-14T21:02:05.000Z (over 4 years ago)
- Last Synced: 2024-12-01T02:39:04.891Z (6 months ago)
- Language: JavaScript
- Homepage:
- Size: 29.3 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# hookify-object
Wrap an object with ES6 proxy to add hooks capabilities through an event emitter.
[](https://badge.fury.io/js/hookify-object) [](https://codecov.io/gh/arkerone/hookify-object)
## Installation
$ npm install --save hookify-object
## Usage
`Hookify-object` provides severals hooks for an object :
- Before/after call a method;
- After resolve/reject a promise;
- Before/after set a object property;
- Before/after delete a property.### Example
Here is a basic usage to get the execution time of the object's methods :
const hookify = require('hookify-object')
const obj = {
process () {
/* ... */
},
}
const objWithHooks = hookify(obj)
objWithHooks.hooks.on('beforeCall', (context) => {
const { name } = context
console.time(name)
})
objWithHooks.hooks.on('afterCall', (context) => {
const { name } = context
console.timeEnd(name)
})
objWithHooks.process()## API
### hookify(target)
Add hook capabilities to a target object.
#### Parameters
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `target` | `object` | `-` | `The object on which we want to add the hook capabilities` |#### Return value
| Type | Description |
|:---------------:|:---------------:|
| `Proxy` | `The hook wrapper of the target object` |#### Example
const hookify = require('hookify-object')
const obj = {}
const objWithHooks = hookify(obj)### proxy.hooks.on(hookName, handler)
Attach a handler for the hook named `hookName`.
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `hookName` | `string` | `-` | `The hook's name` |
| `handler` | `Function` | `-` | `The handler function for the specified hook (see bellow)` |#### handler (context)
Check each hook to know the structure of the `context` object.
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `context` | `object` | `-` | `Contains the context of the hook` |### Hooks list
#### beforeCall[:methodName]
Called before calling a method. You can specify a unique method via the `methodName` option.
#### Example
objWithHooks.hooks.on('beforeCall', (context) => {
/* Call before the call of any method */
})
objWithHooks.hooks.on('beforeCall:test', (context) => {
/* Call before the call of the "test" method */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the called method` |
| `params` | `Array` | `-` | `The parameters of the called method` |#### afterCall[:methodName]
Called after calling a method. You can specify a unique method via the `methodName` option.
#### Example
objWithHooks.hooks.on('afterCall', (context) => {
/* Call after the call of any method */
})
objWithHooks.hooks.on('afterCall:test', (context) => {
/* Call after the call of the "test" method */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the called method` |
| `params` | `Array` | `-` | `The parameters of the called method` |
| `result` | `*` | `-` | `The returned value of the called method` |#### afterResolve[:methodName]
Called when the promise returned by the method has resolved. You can specify a unique method via the `methodName`
option.#### Example
objWithHooks.hooks.on('afterResolve', (context) => {
/* Call after resolve the promise of any method */
})
objWithHooks.hooks.on('afterResolve:testAsync', (context) => {
/* Call after resolve the promise of the "testAsync" method */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the called method` |
| `params` | `Array` | `-` | `The parameters of the called method` |
| `result` | `*` | `-` | `The returned value of the promise` |#### afterReject[:methodName]
Called when the promise returned by the method has rejected. You can specify a unique method via the `methodName`
option.#### Example
objWithHooks.hooks.on('afterReject', (context) => {
/* Call after reject the promise of any method */
})
objWithHooks.hooks.on('afterReject:testAsync', (context) => {
/* Call after reject the promise of the "testAsync" method */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the called method` |
| `params` | `Array` | `-` | `The parameters of the called method` |
| `errors` | `Array` | `-` | `The returned errors of the promise` |#### beforeSet[:propertyName]
Called before setting a property value. You can specify a unique property via the `propertyName` option.
#### Example
objWithHooks.hooks.on('beforeSet', (context) => {
/* Call before set any property */
})
objWithHooks.hooks.on('beforeSet:value', (context) => {
/* Call before set the property "value" */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the property` |
| `value` | `*` | `-` | `The new value of the property to set` |#### afterSet:[propertyName]
Called after setting a property value. You can specify a unique property via the `propertyName` option.
#### Example
objWithHooks.hooks.on('afterSet', (context) => {
/* Call after set any property */
})
objWithHooks.hooks.on('afterSet:value', (context) => {
/* Call after set the property "value" */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the property` |
| `value` | `*` | `-` | `The new value of the property to set` |#### beforeDelete[:propertyName]
Called before deleting a property via the `delete` instruction. You can specify a unique property via the `propertyName`
option.#### Example
objWithHooks.hooks.on('beforeDelete', (context) => {
/* Call before delete any property */
})
objWithHooks.hooks.on('beforeDelete:value', (context) => {
/* Call before delete the property "value" */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the property` |#### afterDelete[:propertyName]
Called after deleting a property via the `delete` instruction. You can specify a unique property via the `propertyName`
option.#### Example
objWithHooks.hooks.on('afterDelete', (context) => {
/* Call after delete any property */
})
objWithHooks.hooks.on('afterDelete:value', (context) => {
/* Call after delete the property "value" */
})#### context object
| Name | Type | Default | Description |
| :---------------: | :-------------: | :-------------: | :---------------------------------------------- |
| `self` | `object` | `-` | `The object wrapped by the hook proxy` |
| `name` | `string` | `-` | `The name of the property` |