hookified 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -3
- package/README.md +71 -3
- package/dist/index.d.ts +8 -7
- package/dist/index.js +19 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<img src="site/logo.svg" alt="Hookified" height="400" align="center">
|
|
2
2
|
|
|
3
|
-
# Event and Middleware Hooks
|
|
3
|
+
# Async Event and Middleware Hooks
|
|
4
4
|
|
|
5
5
|
[](https://github.com/jaredwray/hookified/actions/workflows/tests.yaml)
|
|
6
6
|
[](https://github.com/jaredwray/hookified/blob/master/LICENSE)
|
|
@@ -10,10 +10,12 @@
|
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
- Emit Events via [Emittery](https://npmjs.com/package/emittery)
|
|
13
|
-
- Middleware Hooks
|
|
13
|
+
- Async Middleware Hooks for Your Methods
|
|
14
14
|
- ESM and Nodejs 20+
|
|
15
15
|
- Maintained on a regular basis!
|
|
16
16
|
|
|
17
|
+
Special thanks to [@sindresorhus](https://github.com/sindresorhus) for the [Emittery](https://npmjs.com/package/emittery) library. 🍻
|
|
18
|
+
|
|
17
19
|
## Installation
|
|
18
20
|
```bash
|
|
19
21
|
npm install hookified --save
|
|
@@ -31,7 +33,7 @@ class MyClass extends Hookified {
|
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
async myMethodEmittingEvent() {
|
|
34
|
-
await this.emit('message', 'Hello World');
|
|
36
|
+
await this.emit('message', 'Hello World'); //using Emittery
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
|
|
@@ -43,5 +45,71 @@ class MyClass extends Hookified {
|
|
|
43
45
|
return data;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
You can even pass in multiple arguments to the hooks:
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
import { Hookified } from 'hookified';
|
|
54
|
+
|
|
55
|
+
class MyClass extends Hookified {
|
|
56
|
+
constructor() {
|
|
57
|
+
super();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async myMethodWithHooks() Promise<any> {
|
|
61
|
+
let data = { some: 'data' };
|
|
62
|
+
let data2 = { some: 'data2' };
|
|
63
|
+
// do something
|
|
64
|
+
await this.hook('before:myMethod2', data, data2);
|
|
65
|
+
|
|
66
|
+
return data;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## API
|
|
72
|
+
|
|
73
|
+
Please see the [Emittery](https://npmjs.com/package/emittery) documentation for more information on the event emitter.
|
|
74
|
+
|
|
75
|
+
### .onHook(eventName, handler)
|
|
76
|
+
|
|
77
|
+
Subscribe to a hook event.
|
|
78
|
+
|
|
79
|
+
### .removeHook(eventName)
|
|
80
|
+
|
|
81
|
+
Unsubscribe from a hook event.
|
|
82
|
+
|
|
83
|
+
### .hook(eventName, ...args)
|
|
84
|
+
|
|
85
|
+
Run a hook event.
|
|
86
|
+
|
|
87
|
+
### .hooks
|
|
88
|
+
|
|
89
|
+
Get all hooks.
|
|
90
|
+
|
|
91
|
+
### .getHooks(eventName)
|
|
92
|
+
|
|
93
|
+
Get all hooks for an event.
|
|
94
|
+
|
|
95
|
+
### .clearHooks(eventName)
|
|
96
|
+
|
|
97
|
+
## Development and Testing
|
|
98
|
+
|
|
99
|
+
Hookified is written in TypeScript and tests are written in `vitest`. To run the tests, use the following command:
|
|
100
|
+
|
|
101
|
+
To setup the environment and run the tests:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npm i && npm test
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
To contribute follow the [Contributing Guidelines](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
[MIT & © Jared Wray](LICENSE)
|
|
112
|
+
|
|
113
|
+
|
|
46
114
|
|
|
47
115
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Emittery from 'emittery';
|
|
2
|
-
type
|
|
2
|
+
export type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
3
3
|
export declare class Hookified extends Emittery {
|
|
4
|
-
|
|
4
|
+
_hooks: Map<string, Hook[]>;
|
|
5
5
|
constructor();
|
|
6
|
-
onHook(event: string, handler:
|
|
7
|
-
removeHook(event: string, handler:
|
|
8
|
-
hook(event: string, data: any): Promise<void>;
|
|
9
|
-
get
|
|
6
|
+
onHook(event: string, handler: Hook): void;
|
|
7
|
+
removeHook(event: string, handler: Hook): void;
|
|
8
|
+
hook(event: string, ...data: any[]): Promise<void>;
|
|
9
|
+
get hooks(): Map<string, Hook[]>;
|
|
10
|
+
getHooks(event: string): Hook[] | undefined;
|
|
11
|
+
clearHooks(): void;
|
|
10
12
|
}
|
|
11
|
-
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import Emittery from 'emittery';
|
|
2
2
|
export class Hookified extends Emittery {
|
|
3
|
-
|
|
3
|
+
_hooks;
|
|
4
4
|
constructor() {
|
|
5
5
|
super();
|
|
6
|
-
this.
|
|
6
|
+
this._hooks = new Map();
|
|
7
7
|
}
|
|
8
8
|
// Adds a handler function for a specific event
|
|
9
|
-
|
|
10
|
-
const eventHandlers = this.
|
|
9
|
+
onHook(event, handler) {
|
|
10
|
+
const eventHandlers = this._hooks.get(event);
|
|
11
11
|
if (eventHandlers) {
|
|
12
12
|
eventHandlers.push(handler);
|
|
13
13
|
}
|
|
14
14
|
else {
|
|
15
|
-
this.
|
|
15
|
+
this._hooks.set(event, [handler]);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
// Removes a specific handler function for a specific event
|
|
19
|
-
|
|
20
|
-
const eventHandlers = this.
|
|
19
|
+
removeHook(event, handler) {
|
|
20
|
+
const eventHandlers = this._hooks.get(event);
|
|
21
21
|
if (eventHandlers) {
|
|
22
22
|
const index = eventHandlers.indexOf(handler);
|
|
23
23
|
if (index !== -1) {
|
|
@@ -26,13 +26,13 @@ export class Hookified extends Emittery {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
// Triggers all handlers for a specific event with provided data
|
|
29
|
-
async hook(event, data) {
|
|
30
|
-
const eventHandlers = this.
|
|
29
|
+
async hook(event, ...data) {
|
|
30
|
+
const eventHandlers = this._hooks.get(event);
|
|
31
31
|
if (eventHandlers) {
|
|
32
32
|
for (const handler of eventHandlers) {
|
|
33
33
|
try {
|
|
34
|
-
// eslint-disable-next-line no-await-in-loop
|
|
35
|
-
await handler(data);
|
|
34
|
+
// eslint-disable-next-line no-await-in-loop, @typescript-eslint/no-unsafe-argument
|
|
35
|
+
await handler(...data);
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
// eslint-disable-next-line no-await-in-loop
|
|
@@ -42,9 +42,15 @@ export class Hookified extends Emittery {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
// Provides read-only access to the current handlers
|
|
45
|
-
get
|
|
45
|
+
get hooks() {
|
|
46
46
|
// Creating a new map to prevent external modifications to the original map
|
|
47
|
-
return
|
|
47
|
+
return this._hooks;
|
|
48
|
+
}
|
|
49
|
+
getHooks(event) {
|
|
50
|
+
return this._hooks.get(event);
|
|
51
|
+
}
|
|
52
|
+
clearHooks() {
|
|
53
|
+
this._hooks.clear();
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACtC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACtC,MAAM,CAAsB;IAE5B;QACC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,+CAA+C;IAC/C,MAAM,CAAC,KAAa,EAAE,OAAa;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,aAAa,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,2DAA2D;IAC3D,UAAU,CAAC,KAAa,EAAE,OAAa;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,GAAG,IAAW;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,aAAa,EAAE,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACJ,mFAAmF;oBACnF,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,4CAA4C;oBAC5C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,oCAAoC,KAAK,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAChH,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,oDAAoD;IACpD,IAAI,KAAK;QACR,2EAA2E;QAC3E,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAa;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU;QACT,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACD"}
|