hookified 1.2.1 → 1.4.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/README.md +94 -15
- package/dist/browser/index.global.js +2 -0
- package/dist/browser/index.global.js.map +1 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/{index.cjs → node/index.cjs} +51 -0
- package/dist/node/index.d.cts +181 -0
- package/dist/node/index.d.ts +181 -0
- package/dist/{index.js → node/index.js} +51 -0
- package/package.json +13 -12
- package/dist/index.d.cts +0 -29
- package/dist/index.d.ts +0 -29
package/README.md
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
[](https://npmjs.com/package/hookified)
|
|
9
9
|
[](https://npmjs.com/package/hookified)
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# Features
|
|
12
12
|
- Simple replacement for EventEmitter
|
|
13
13
|
- Async Middleware Hooks for Your Methods
|
|
14
14
|
- ESM / CJS with Types and Nodejs 20+
|
|
15
15
|
- Maintained on a regular basis!
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
# Installation
|
|
18
18
|
```bash
|
|
19
19
|
npm install hookified --save
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
# Usage
|
|
23
23
|
This was built because we constantly wanted hooks and events extended on libraires we are building such as [Keyv](https://keyv.org) and [Cacheable](https://cacheable.org). This is a simple way to add hooks and events to your classes.
|
|
24
24
|
|
|
25
25
|
```javascript
|
|
@@ -66,39 +66,94 @@ class MyClass extends Hookified {
|
|
|
66
66
|
}
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
# Using it in the Browser
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
```html
|
|
72
|
+
<script type="module">
|
|
73
|
+
import { Hookified } from 'https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.js';
|
|
74
|
+
|
|
75
|
+
class MyClass extends Hookified {
|
|
76
|
+
constructor() {
|
|
77
|
+
super();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async myMethodEmittingEvent() {
|
|
81
|
+
this.emit('message', 'Hello World'); //using Emittery
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
|
|
85
|
+
async myMethodWithHooks() Promise<any> {
|
|
86
|
+
let data = { some: 'data' };
|
|
87
|
+
// do something
|
|
88
|
+
await this.hook('before:myMethod2', data);
|
|
89
|
+
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
</script>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
if you are not using ESM modules, you can use the following:
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<script src="https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.global.js"></script>
|
|
100
|
+
<script>
|
|
101
|
+
class MyClass extends Hookified {
|
|
102
|
+
constructor() {
|
|
103
|
+
super();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async myMethodEmittingEvent() {
|
|
107
|
+
this.emit('message', 'Hello World'); //using Emittery
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
|
|
111
|
+
async myMethodWithHooks() Promise<any> {
|
|
112
|
+
let data = { some: 'data' };
|
|
113
|
+
// do something
|
|
114
|
+
await this.hook('before:myMethod2', data);
|
|
115
|
+
|
|
116
|
+
return data;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
</script>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
# API - Hooks
|
|
123
|
+
|
|
124
|
+
## .onHook(eventName, handler)
|
|
72
125
|
|
|
73
126
|
Subscribe to a hook event.
|
|
74
127
|
|
|
75
|
-
|
|
128
|
+
## .removeHook(eventName)
|
|
76
129
|
|
|
77
130
|
Unsubscribe from a hook event.
|
|
78
131
|
|
|
79
|
-
|
|
132
|
+
## .hook(eventName, ...args)
|
|
80
133
|
|
|
81
134
|
Run a hook event.
|
|
82
135
|
|
|
83
|
-
|
|
136
|
+
## .hooks
|
|
84
137
|
|
|
85
138
|
Get all hooks.
|
|
86
139
|
|
|
87
|
-
|
|
140
|
+
## .getHooks(eventName)
|
|
88
141
|
|
|
89
142
|
Get all hooks for an event.
|
|
90
143
|
|
|
91
|
-
|
|
144
|
+
## .clearHooks(eventName)
|
|
145
|
+
|
|
146
|
+
# API - Events
|
|
92
147
|
|
|
93
|
-
|
|
148
|
+
## .on(eventName, handler)
|
|
94
149
|
|
|
95
150
|
Subscribe to an event.
|
|
96
151
|
|
|
97
|
-
|
|
152
|
+
## .off(eventName, handler)
|
|
98
153
|
|
|
99
154
|
Unsubscribe from an event.
|
|
100
155
|
|
|
101
|
-
|
|
156
|
+
## .emit(eventName, ...args)
|
|
102
157
|
|
|
103
158
|
Emit an event.
|
|
104
159
|
|
|
@@ -114,7 +169,31 @@ Remove all listeners for an event.
|
|
|
114
169
|
|
|
115
170
|
Set the maximum number of listeners and will truncate if there are already too many.
|
|
116
171
|
|
|
117
|
-
##
|
|
172
|
+
## .once(eventName, handler)
|
|
173
|
+
|
|
174
|
+
Subscribe to an event once.
|
|
175
|
+
|
|
176
|
+
## .prependListener(eventName, handler)
|
|
177
|
+
|
|
178
|
+
Prepend a listener to an event.
|
|
179
|
+
|
|
180
|
+
## .prependOnceListener(eventName, handler)
|
|
181
|
+
|
|
182
|
+
Prepend a listener to an event once.
|
|
183
|
+
|
|
184
|
+
## .eventNames()
|
|
185
|
+
|
|
186
|
+
Get all event names.
|
|
187
|
+
|
|
188
|
+
## .listenerCount(eventName?)
|
|
189
|
+
|
|
190
|
+
Get the count of listeners for an event or all events if evenName not provided.
|
|
191
|
+
|
|
192
|
+
## .rawListeners(eventName?)
|
|
193
|
+
|
|
194
|
+
Get all listeners for an event or all events if evenName not provided.
|
|
195
|
+
|
|
196
|
+
# Development and Testing
|
|
118
197
|
|
|
119
198
|
Hookified is written in TypeScript and tests are written in `vitest`. To run the tests, use the following command:
|
|
120
199
|
|
|
@@ -126,7 +205,7 @@ npm i && npm test
|
|
|
126
205
|
|
|
127
206
|
To contribute follow the [Contributing Guidelines](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
128
207
|
|
|
129
|
-
|
|
208
|
+
# License
|
|
130
209
|
|
|
131
210
|
[MIT & © Jared Wray](LICENSE)
|
|
132
211
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(()=>{var g=Object.defineProperty;var a=(r,e,t)=>e in r?g(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var i=(r,e,t)=>a(r,typeof e!="symbol"?e+"":e,t);var o=class{constructor(){i(this,"_eventListeners");i(this,"_maxListeners");this._eventListeners=new Map,this._maxListeners=100}once(e,t){let s=(...n)=>{this.off(e,s),t(...n)};return this.on(e,s),this}listenerCount(e){if(!e)return this.getAllListeners().length;let t=this._eventListeners.get(e);return t?t.length:0}eventNames(){return Array.from(this._eventListeners.keys())}rawListeners(e){return e?this._eventListeners.get(e)??[]:this.getAllListeners()}prependListener(e,t){let s=this._eventListeners.get(e)??[];return s.unshift(t),this._eventListeners.set(e,s),this}prependOnceListener(e,t){let s=(...n)=>{this.off(e,s),t(...n)};return this.prependListener(e,s),this}maxListeners(){return this._maxListeners}addListener(e,t){return this.on(e,t),this}on(e,t){this._eventListeners.has(e)||this._eventListeners.set(e,[]);let s=this._eventListeners.get(e);return s&&(s.length>=this._maxListeners&&console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${s.length+1} ${e} listeners added. Use setMaxListeners() to increase limit.`),s.push(t)),this}removeListener(e,t){return this.off(e,t),this}off(e,t){let s=this._eventListeners.get(e)??[],n=s.indexOf(t);return n>-1&&s.splice(n,1),s.length===0&&this._eventListeners.delete(e),this}emit(e,...t){let s=this._eventListeners.get(e);if(s&&s.length>0)for(let n of s)n(...t);return!0}listeners(e){return this._eventListeners.get(e)??[]}removeAllListeners(e){return e?this._eventListeners.delete(e):this._eventListeners.clear(),this}setMaxListeners(e){this._maxListeners=e;for(let t of this._eventListeners.values())t.length>e&&t.splice(e)}getAllListeners(){let e=new Array;for(let t of this._eventListeners.values())e=e.concat(t);return e}};var h=class extends o{constructor(){super();i(this,"_hooks");this._hooks=new Map}onHook(t,s){let n=this._hooks.get(t);n?n.push(s):this._hooks.set(t,[s])}removeHook(t,s){let n=this._hooks.get(t);if(n){let l=n.indexOf(s);l!==-1&&n.splice(l,1)}}async hook(t,...s){let n=this._hooks.get(t);if(n)for(let l of n)try{await l(...s)}catch(L){this.emit("error",new Error(`Error in hook handler for event "${t}": ${L.message}`))}}get hooks(){return this._hooks}getHooks(t){return this._hooks.get(t)}clearHooks(){this._hooks.clear()}};})();
|
|
2
|
+
//# sourceMappingURL=index.global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["import {type IEventEmitter} from './event-emitter.js';\n\nexport type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified implements IEventEmitter {\n\t_eventListeners: Map<string | symbol, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\t}\n\n\tonce(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\tlistenerCount(eventName?: string | symbol): number {\n\t\tif (!eventName) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName as string);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\teventNames(): Array<string | symbol> {\n\t\treturn Array.from(this._eventListeners.keys());\n\t}\n\n\trawListeners(eventName?: string | symbol): EventListener[] {\n\t\tif (!eventName) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(eventName) ?? [];\n\t}\n\n\tprependListener(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\tprependOnceListener(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t// Add an event listener\n\tpublic addListener(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\tpublic off(event: string, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index > -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): boolean {\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tlistener(...arguments_);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Get all listeners for a specific event\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t// Remove all listeners for a specific event\n\tpublic removeAllListeners(event?: string): IEventEmitter {\n\t\tif (event) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Set the maximum number of listeners for a single event\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result = new Array<EventListener>();\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = result.concat(listeners);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import {Eventified} from './eventified.js';\n\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport class Hookified extends Eventified {\n\t_hooks: Map<string, Hook[]>;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._hooks = new Map();\n\t}\n\n\t// Adds a handler function for a specific event\n\tonHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t// Removes a specific handler function for a specific event\n\tremoveHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Triggers all handlers for a specific event with provided data\n\tasync hook<T>(event: string, ...arguments_: T[]) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.emit('error', new Error(`Error in hook handler for event \"${event}\": ${(error as Error).message}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Provides read-only access to the current handlers\n\tget hooks() {\n\t\t// Creating a new map to prevent external modifications to the original map\n\t\treturn this._hooks;\n\t}\n\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\tclearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport {Eventified, type EventListener} from './eventified.js';\n"],"mappings":"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","names":["Eventified","__publicField","eventName","listener","onceListener","arguments_","listeners","event","index","n","result","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var g=Object.defineProperty;var a=(r,e,t)=>e in r?g(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var i=(r,e,t)=>a(r,typeof e!="symbol"?e+"":e,t);var o=class{constructor(){i(this,"_eventListeners");i(this,"_maxListeners");this._eventListeners=new Map,this._maxListeners=100}once(e,t){let s=(...n)=>{this.off(e,s),t(...n)};return this.on(e,s),this}listenerCount(e){if(!e)return this.getAllListeners().length;let t=this._eventListeners.get(e);return t?t.length:0}eventNames(){return Array.from(this._eventListeners.keys())}rawListeners(e){return e?this._eventListeners.get(e)??[]:this.getAllListeners()}prependListener(e,t){let s=this._eventListeners.get(e)??[];return s.unshift(t),this._eventListeners.set(e,s),this}prependOnceListener(e,t){let s=(...n)=>{this.off(e,s),t(...n)};return this.prependListener(e,s),this}maxListeners(){return this._maxListeners}addListener(e,t){return this.on(e,t),this}on(e,t){this._eventListeners.has(e)||this._eventListeners.set(e,[]);let s=this._eventListeners.get(e);return s&&(s.length>=this._maxListeners&&console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${s.length+1} ${e} listeners added. Use setMaxListeners() to increase limit.`),s.push(t)),this}removeListener(e,t){return this.off(e,t),this}off(e,t){let s=this._eventListeners.get(e)??[],n=s.indexOf(t);return n>-1&&s.splice(n,1),s.length===0&&this._eventListeners.delete(e),this}emit(e,...t){let s=this._eventListeners.get(e);if(s&&s.length>0)for(let n of s)n(...t);return!0}listeners(e){return this._eventListeners.get(e)??[]}removeAllListeners(e){return e?this._eventListeners.delete(e):this._eventListeners.clear(),this}setMaxListeners(e){this._maxListeners=e;for(let t of this._eventListeners.values())t.length>e&&t.splice(e)}getAllListeners(){let e=new Array;for(let t of this._eventListeners.values())e=e.concat(t);return e}};var h=class extends o{constructor(){super();i(this,"_hooks");this._hooks=new Map}onHook(t,s){let n=this._hooks.get(t);n?n.push(s):this._hooks.set(t,[s])}removeHook(t,s){let n=this._hooks.get(t);if(n){let l=n.indexOf(s);l!==-1&&n.splice(l,1)}}async hook(t,...s){let n=this._hooks.get(t);if(n)for(let l of n)try{await l(...s)}catch(L){this.emit("error",new Error(`Error in hook handler for event "${t}": ${L.message}`))}}get hooks(){return this._hooks}getHooks(t){return this._hooks.get(t)}clearHooks(){this._hooks.clear()}};export{o as Eventified,h as Hookified};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["import {type IEventEmitter} from './event-emitter.js';\n\nexport type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified implements IEventEmitter {\n\t_eventListeners: Map<string | symbol, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\t}\n\n\tonce(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\tlistenerCount(eventName?: string | symbol): number {\n\t\tif (!eventName) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName as string);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\teventNames(): Array<string | symbol> {\n\t\treturn Array.from(this._eventListeners.keys());\n\t}\n\n\trawListeners(eventName?: string | symbol): EventListener[] {\n\t\tif (!eventName) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(eventName) ?? [];\n\t}\n\n\tprependListener(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\tprependOnceListener(eventName: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t// Add an event listener\n\tpublic addListener(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\tpublic off(event: string, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index > -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): boolean {\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tlistener(...arguments_);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Get all listeners for a specific event\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t// Remove all listeners for a specific event\n\tpublic removeAllListeners(event?: string): IEventEmitter {\n\t\tif (event) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Set the maximum number of listeners for a single event\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result = new Array<EventListener>();\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = result.concat(listeners);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import {Eventified} from './eventified.js';\n\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport class Hookified extends Eventified {\n\t_hooks: Map<string, Hook[]>;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._hooks = new Map();\n\t}\n\n\t// Adds a handler function for a specific event\n\tonHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t// Removes a specific handler function for a specific event\n\tremoveHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Triggers all handlers for a specific event with provided data\n\tasync hook<T>(event: string, ...arguments_: T[]) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.emit('error', new Error(`Error in hook handler for event \"${event}\": ${(error as Error).message}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Provides read-only access to the current handlers\n\tget hooks() {\n\t\t// Creating a new map to prevent external modifications to the original map\n\t\treturn this._hooks;\n\t}\n\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\tclearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport {Eventified, type EventListener} from './eventified.js';\n"],"mappings":"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","names":["Eventified","__publicField","eventName","listener","onceListener","arguments_","listeners","event","index","n","result","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]}
|
|
@@ -33,12 +33,51 @@ var Eventified = class {
|
|
|
33
33
|
this._eventListeners = /* @__PURE__ */ new Map();
|
|
34
34
|
this._maxListeners = 100;
|
|
35
35
|
}
|
|
36
|
+
once(eventName, listener) {
|
|
37
|
+
const onceListener = (...arguments_) => {
|
|
38
|
+
this.off(eventName, onceListener);
|
|
39
|
+
listener(...arguments_);
|
|
40
|
+
};
|
|
41
|
+
this.on(eventName, onceListener);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
listenerCount(eventName) {
|
|
45
|
+
if (!eventName) {
|
|
46
|
+
return this.getAllListeners().length;
|
|
47
|
+
}
|
|
48
|
+
const listeners = this._eventListeners.get(eventName);
|
|
49
|
+
return listeners ? listeners.length : 0;
|
|
50
|
+
}
|
|
51
|
+
eventNames() {
|
|
52
|
+
return Array.from(this._eventListeners.keys());
|
|
53
|
+
}
|
|
54
|
+
rawListeners(eventName) {
|
|
55
|
+
if (!eventName) {
|
|
56
|
+
return this.getAllListeners();
|
|
57
|
+
}
|
|
58
|
+
return this._eventListeners.get(eventName) ?? [];
|
|
59
|
+
}
|
|
60
|
+
prependListener(eventName, listener) {
|
|
61
|
+
const listeners = this._eventListeners.get(eventName) ?? [];
|
|
62
|
+
listeners.unshift(listener);
|
|
63
|
+
this._eventListeners.set(eventName, listeners);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
prependOnceListener(eventName, listener) {
|
|
67
|
+
const onceListener = (...arguments_) => {
|
|
68
|
+
this.off(eventName, onceListener);
|
|
69
|
+
listener(...arguments_);
|
|
70
|
+
};
|
|
71
|
+
this.prependListener(eventName, onceListener);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
36
74
|
maxListeners() {
|
|
37
75
|
return this._maxListeners;
|
|
38
76
|
}
|
|
39
77
|
// Add an event listener
|
|
40
78
|
addListener(event, listener) {
|
|
41
79
|
this.on(event, listener);
|
|
80
|
+
return this;
|
|
42
81
|
}
|
|
43
82
|
on(event, listener) {
|
|
44
83
|
if (!this._eventListeners.has(event)) {
|
|
@@ -51,10 +90,12 @@ var Eventified = class {
|
|
|
51
90
|
}
|
|
52
91
|
listeners.push(listener);
|
|
53
92
|
}
|
|
93
|
+
return this;
|
|
54
94
|
}
|
|
55
95
|
// Remove an event listener
|
|
56
96
|
removeListener(event, listener) {
|
|
57
97
|
this.off(event, listener);
|
|
98
|
+
return this;
|
|
58
99
|
}
|
|
59
100
|
off(event, listener) {
|
|
60
101
|
const listeners = this._eventListeners.get(event) ?? [];
|
|
@@ -65,6 +106,7 @@ var Eventified = class {
|
|
|
65
106
|
if (listeners.length === 0) {
|
|
66
107
|
this._eventListeners.delete(event);
|
|
67
108
|
}
|
|
109
|
+
return this;
|
|
68
110
|
}
|
|
69
111
|
// Emit an event
|
|
70
112
|
emit(event, ...arguments_) {
|
|
@@ -74,6 +116,7 @@ var Eventified = class {
|
|
|
74
116
|
listener(...arguments_);
|
|
75
117
|
}
|
|
76
118
|
}
|
|
119
|
+
return true;
|
|
77
120
|
}
|
|
78
121
|
// Get all listeners for a specific event
|
|
79
122
|
listeners(event) {
|
|
@@ -86,6 +129,7 @@ var Eventified = class {
|
|
|
86
129
|
} else {
|
|
87
130
|
this._eventListeners.clear();
|
|
88
131
|
}
|
|
132
|
+
return this;
|
|
89
133
|
}
|
|
90
134
|
// Set the maximum number of listeners for a single event
|
|
91
135
|
setMaxListeners(n) {
|
|
@@ -96,6 +140,13 @@ var Eventified = class {
|
|
|
96
140
|
}
|
|
97
141
|
}
|
|
98
142
|
}
|
|
143
|
+
getAllListeners() {
|
|
144
|
+
let result = new Array();
|
|
145
|
+
for (const listeners of this._eventListeners.values()) {
|
|
146
|
+
result = result.concat(listeners);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
99
150
|
};
|
|
100
151
|
|
|
101
152
|
// src/index.ts
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
type IEventEmitter = {
|
|
2
|
+
/**
|
|
3
|
+
* Registers a listener for the specified event.
|
|
4
|
+
*
|
|
5
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
6
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
7
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* emitter.on('data', (message) => {
|
|
11
|
+
* console.log(message);
|
|
12
|
+
* });
|
|
13
|
+
*/
|
|
14
|
+
on(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
15
|
+
/**
|
|
16
|
+
* Alias for `on`. Registers a listener for the specified event.
|
|
17
|
+
*
|
|
18
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
19
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
20
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
21
|
+
*/
|
|
22
|
+
addListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
23
|
+
/**
|
|
24
|
+
* Registers a one-time listener for the specified event. The listener is removed after it is called once.
|
|
25
|
+
*
|
|
26
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
27
|
+
* @param listener - A callback function that will be invoked once when the event is emitted.
|
|
28
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* emitter.once('close', () => {
|
|
32
|
+
* console.log('The connection was closed.');
|
|
33
|
+
* });
|
|
34
|
+
*/
|
|
35
|
+
once(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
36
|
+
/**
|
|
37
|
+
* Removes a previously registered listener for the specified event.
|
|
38
|
+
*
|
|
39
|
+
* @param eventName - The name (or symbol) of the event to stop listening for.
|
|
40
|
+
* @param listener - The specific callback function to remove.
|
|
41
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* emitter.off('data', myListener);
|
|
45
|
+
*/
|
|
46
|
+
off(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
47
|
+
/**
|
|
48
|
+
* Alias for `off`. Removes a previously registered listener for the specified event.
|
|
49
|
+
*
|
|
50
|
+
* @param eventName - The name (or symbol) of the event to stop listening for.
|
|
51
|
+
* @param listener - The specific callback function to remove.
|
|
52
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
53
|
+
*/
|
|
54
|
+
removeListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
55
|
+
/**
|
|
56
|
+
* Emits the specified event, invoking all registered listeners with the provided arguments.
|
|
57
|
+
*
|
|
58
|
+
* @param eventName - The name (or symbol) of the event to emit.
|
|
59
|
+
* @param args - Arguments passed to each listener.
|
|
60
|
+
* @returns `true` if the event had listeners, `false` otherwise.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* emitter.emit('data', 'Hello World');
|
|
64
|
+
*/
|
|
65
|
+
emit(eventName: string | symbol, ...arguments_: any[]): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Returns the number of listeners registered for the specified event.
|
|
68
|
+
*
|
|
69
|
+
* @param eventName - The name (or symbol) of the event.
|
|
70
|
+
* @returns The number of registered listeners.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* const count = emitter.listenerCount('data');
|
|
74
|
+
* console.log(count); // e.g., 2
|
|
75
|
+
*/
|
|
76
|
+
listenerCount(eventName: string | symbol): number;
|
|
77
|
+
/**
|
|
78
|
+
* Removes all listeners for the specified event. If no event is specified, it removes all listeners for all events.
|
|
79
|
+
*
|
|
80
|
+
* @param eventName - (Optional) The name (or symbol) of the event.
|
|
81
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* emitter.removeAllListeners('data');
|
|
85
|
+
*/
|
|
86
|
+
removeAllListeners(eventName?: string | symbol): IEventEmitter;
|
|
87
|
+
/**
|
|
88
|
+
* Returns an array of event names for which listeners have been registered.
|
|
89
|
+
*
|
|
90
|
+
* @returns An array of event names (or symbols).
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const events = emitter.eventNames();
|
|
94
|
+
* console.log(events); // e.g., ['data', 'close']
|
|
95
|
+
*/
|
|
96
|
+
eventNames(): Array<string | symbol>;
|
|
97
|
+
/**
|
|
98
|
+
* Returns an array of listeners registered for the specified event.
|
|
99
|
+
*
|
|
100
|
+
* @param eventName - The name (or symbol) of the event.
|
|
101
|
+
* @returns An array of listener functions.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* const listeners = emitter.listeners('data');
|
|
105
|
+
* console.log(listeners.length); // e.g., 2
|
|
106
|
+
*/
|
|
107
|
+
listeners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;
|
|
108
|
+
/**
|
|
109
|
+
* Returns an array of raw listeners for the specified event. This includes listeners wrapped by internal mechanisms (e.g., once-only listeners).
|
|
110
|
+
*
|
|
111
|
+
* @param eventName - The name (or symbol) of the event.
|
|
112
|
+
* @returns An array of raw listener functions.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* const rawListeners = emitter.rawListeners('data');
|
|
116
|
+
*/
|
|
117
|
+
rawListeners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;
|
|
118
|
+
/**
|
|
119
|
+
* Adds a listener to the beginning of the listeners array for the specified event.
|
|
120
|
+
*
|
|
121
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
122
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
123
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* emitter.prependListener('data', (message) => {
|
|
127
|
+
* console.log('This will run first.');
|
|
128
|
+
* });
|
|
129
|
+
*/
|
|
130
|
+
prependListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
131
|
+
/**
|
|
132
|
+
* Adds a one-time listener to the beginning of the listeners array for the specified event.
|
|
133
|
+
*
|
|
134
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
135
|
+
* @param listener - A callback function that will be invoked once when the event is emitted.
|
|
136
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* emitter.prependOnceListener('data', (message) => {
|
|
140
|
+
* console.log('This will run first and only once.');
|
|
141
|
+
* });
|
|
142
|
+
*/
|
|
143
|
+
prependOnceListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
type EventListener = (...arguments_: any[]) => void;
|
|
147
|
+
declare class Eventified implements IEventEmitter {
|
|
148
|
+
_eventListeners: Map<string | symbol, EventListener[]>;
|
|
149
|
+
_maxListeners: number;
|
|
150
|
+
constructor();
|
|
151
|
+
once(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
152
|
+
listenerCount(eventName?: string | symbol): number;
|
|
153
|
+
eventNames(): Array<string | symbol>;
|
|
154
|
+
rawListeners(eventName?: string | symbol): EventListener[];
|
|
155
|
+
prependListener(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
156
|
+
prependOnceListener(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
157
|
+
maxListeners(): number;
|
|
158
|
+
addListener(event: string | symbol, listener: EventListener): IEventEmitter;
|
|
159
|
+
on(event: string | symbol, listener: EventListener): IEventEmitter;
|
|
160
|
+
removeListener(event: string, listener: EventListener): IEventEmitter;
|
|
161
|
+
off(event: string, listener: EventListener): IEventEmitter;
|
|
162
|
+
emit(event: string, ...arguments_: any[]): boolean;
|
|
163
|
+
listeners(event: string): EventListener[];
|
|
164
|
+
removeAllListeners(event?: string): IEventEmitter;
|
|
165
|
+
setMaxListeners(n: number): void;
|
|
166
|
+
getAllListeners(): EventListener[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
170
|
+
declare class Hookified extends Eventified {
|
|
171
|
+
_hooks: Map<string, Hook[]>;
|
|
172
|
+
constructor();
|
|
173
|
+
onHook(event: string, handler: Hook): void;
|
|
174
|
+
removeHook(event: string, handler: Hook): void;
|
|
175
|
+
hook<T>(event: string, ...arguments_: T[]): Promise<void>;
|
|
176
|
+
get hooks(): Map<string, Hook[]>;
|
|
177
|
+
getHooks(event: string): Hook[] | undefined;
|
|
178
|
+
clearHooks(): void;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { type EventListener, Eventified, type Hook, Hookified };
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
type IEventEmitter = {
|
|
2
|
+
/**
|
|
3
|
+
* Registers a listener for the specified event.
|
|
4
|
+
*
|
|
5
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
6
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
7
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* emitter.on('data', (message) => {
|
|
11
|
+
* console.log(message);
|
|
12
|
+
* });
|
|
13
|
+
*/
|
|
14
|
+
on(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
15
|
+
/**
|
|
16
|
+
* Alias for `on`. Registers a listener for the specified event.
|
|
17
|
+
*
|
|
18
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
19
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
20
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
21
|
+
*/
|
|
22
|
+
addListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
23
|
+
/**
|
|
24
|
+
* Registers a one-time listener for the specified event. The listener is removed after it is called once.
|
|
25
|
+
*
|
|
26
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
27
|
+
* @param listener - A callback function that will be invoked once when the event is emitted.
|
|
28
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* emitter.once('close', () => {
|
|
32
|
+
* console.log('The connection was closed.');
|
|
33
|
+
* });
|
|
34
|
+
*/
|
|
35
|
+
once(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
36
|
+
/**
|
|
37
|
+
* Removes a previously registered listener for the specified event.
|
|
38
|
+
*
|
|
39
|
+
* @param eventName - The name (or symbol) of the event to stop listening for.
|
|
40
|
+
* @param listener - The specific callback function to remove.
|
|
41
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* emitter.off('data', myListener);
|
|
45
|
+
*/
|
|
46
|
+
off(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
47
|
+
/**
|
|
48
|
+
* Alias for `off`. Removes a previously registered listener for the specified event.
|
|
49
|
+
*
|
|
50
|
+
* @param eventName - The name (or symbol) of the event to stop listening for.
|
|
51
|
+
* @param listener - The specific callback function to remove.
|
|
52
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
53
|
+
*/
|
|
54
|
+
removeListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
55
|
+
/**
|
|
56
|
+
* Emits the specified event, invoking all registered listeners with the provided arguments.
|
|
57
|
+
*
|
|
58
|
+
* @param eventName - The name (or symbol) of the event to emit.
|
|
59
|
+
* @param args - Arguments passed to each listener.
|
|
60
|
+
* @returns `true` if the event had listeners, `false` otherwise.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* emitter.emit('data', 'Hello World');
|
|
64
|
+
*/
|
|
65
|
+
emit(eventName: string | symbol, ...arguments_: any[]): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Returns the number of listeners registered for the specified event.
|
|
68
|
+
*
|
|
69
|
+
* @param eventName - The name (or symbol) of the event.
|
|
70
|
+
* @returns The number of registered listeners.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* const count = emitter.listenerCount('data');
|
|
74
|
+
* console.log(count); // e.g., 2
|
|
75
|
+
*/
|
|
76
|
+
listenerCount(eventName: string | symbol): number;
|
|
77
|
+
/**
|
|
78
|
+
* Removes all listeners for the specified event. If no event is specified, it removes all listeners for all events.
|
|
79
|
+
*
|
|
80
|
+
* @param eventName - (Optional) The name (or symbol) of the event.
|
|
81
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* emitter.removeAllListeners('data');
|
|
85
|
+
*/
|
|
86
|
+
removeAllListeners(eventName?: string | symbol): IEventEmitter;
|
|
87
|
+
/**
|
|
88
|
+
* Returns an array of event names for which listeners have been registered.
|
|
89
|
+
*
|
|
90
|
+
* @returns An array of event names (or symbols).
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const events = emitter.eventNames();
|
|
94
|
+
* console.log(events); // e.g., ['data', 'close']
|
|
95
|
+
*/
|
|
96
|
+
eventNames(): Array<string | symbol>;
|
|
97
|
+
/**
|
|
98
|
+
* Returns an array of listeners registered for the specified event.
|
|
99
|
+
*
|
|
100
|
+
* @param eventName - The name (or symbol) of the event.
|
|
101
|
+
* @returns An array of listener functions.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* const listeners = emitter.listeners('data');
|
|
105
|
+
* console.log(listeners.length); // e.g., 2
|
|
106
|
+
*/
|
|
107
|
+
listeners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;
|
|
108
|
+
/**
|
|
109
|
+
* Returns an array of raw listeners for the specified event. This includes listeners wrapped by internal mechanisms (e.g., once-only listeners).
|
|
110
|
+
*
|
|
111
|
+
* @param eventName - The name (or symbol) of the event.
|
|
112
|
+
* @returns An array of raw listener functions.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* const rawListeners = emitter.rawListeners('data');
|
|
116
|
+
*/
|
|
117
|
+
rawListeners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;
|
|
118
|
+
/**
|
|
119
|
+
* Adds a listener to the beginning of the listeners array for the specified event.
|
|
120
|
+
*
|
|
121
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
122
|
+
* @param listener - A callback function that will be invoked when the event is emitted.
|
|
123
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* emitter.prependListener('data', (message) => {
|
|
127
|
+
* console.log('This will run first.');
|
|
128
|
+
* });
|
|
129
|
+
*/
|
|
130
|
+
prependListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
131
|
+
/**
|
|
132
|
+
* Adds a one-time listener to the beginning of the listeners array for the specified event.
|
|
133
|
+
*
|
|
134
|
+
* @param eventName - The name (or symbol) of the event to listen for.
|
|
135
|
+
* @param listener - A callback function that will be invoked once when the event is emitted.
|
|
136
|
+
* @returns The current instance of EventEmitter for method chaining.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* emitter.prependOnceListener('data', (message) => {
|
|
140
|
+
* console.log('This will run first and only once.');
|
|
141
|
+
* });
|
|
142
|
+
*/
|
|
143
|
+
prependOnceListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
type EventListener = (...arguments_: any[]) => void;
|
|
147
|
+
declare class Eventified implements IEventEmitter {
|
|
148
|
+
_eventListeners: Map<string | symbol, EventListener[]>;
|
|
149
|
+
_maxListeners: number;
|
|
150
|
+
constructor();
|
|
151
|
+
once(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
152
|
+
listenerCount(eventName?: string | symbol): number;
|
|
153
|
+
eventNames(): Array<string | symbol>;
|
|
154
|
+
rawListeners(eventName?: string | symbol): EventListener[];
|
|
155
|
+
prependListener(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
156
|
+
prependOnceListener(eventName: string | symbol, listener: EventListener): IEventEmitter;
|
|
157
|
+
maxListeners(): number;
|
|
158
|
+
addListener(event: string | symbol, listener: EventListener): IEventEmitter;
|
|
159
|
+
on(event: string | symbol, listener: EventListener): IEventEmitter;
|
|
160
|
+
removeListener(event: string, listener: EventListener): IEventEmitter;
|
|
161
|
+
off(event: string, listener: EventListener): IEventEmitter;
|
|
162
|
+
emit(event: string, ...arguments_: any[]): boolean;
|
|
163
|
+
listeners(event: string): EventListener[];
|
|
164
|
+
removeAllListeners(event?: string): IEventEmitter;
|
|
165
|
+
setMaxListeners(n: number): void;
|
|
166
|
+
getAllListeners(): EventListener[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
170
|
+
declare class Hookified extends Eventified {
|
|
171
|
+
_hooks: Map<string, Hook[]>;
|
|
172
|
+
constructor();
|
|
173
|
+
onHook(event: string, handler: Hook): void;
|
|
174
|
+
removeHook(event: string, handler: Hook): void;
|
|
175
|
+
hook<T>(event: string, ...arguments_: T[]): Promise<void>;
|
|
176
|
+
get hooks(): Map<string, Hook[]>;
|
|
177
|
+
getHooks(event: string): Hook[] | undefined;
|
|
178
|
+
clearHooks(): void;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { type EventListener, Eventified, type Hook, Hookified };
|
|
@@ -6,12 +6,51 @@ var Eventified = class {
|
|
|
6
6
|
this._eventListeners = /* @__PURE__ */ new Map();
|
|
7
7
|
this._maxListeners = 100;
|
|
8
8
|
}
|
|
9
|
+
once(eventName, listener) {
|
|
10
|
+
const onceListener = (...arguments_) => {
|
|
11
|
+
this.off(eventName, onceListener);
|
|
12
|
+
listener(...arguments_);
|
|
13
|
+
};
|
|
14
|
+
this.on(eventName, onceListener);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
listenerCount(eventName) {
|
|
18
|
+
if (!eventName) {
|
|
19
|
+
return this.getAllListeners().length;
|
|
20
|
+
}
|
|
21
|
+
const listeners = this._eventListeners.get(eventName);
|
|
22
|
+
return listeners ? listeners.length : 0;
|
|
23
|
+
}
|
|
24
|
+
eventNames() {
|
|
25
|
+
return Array.from(this._eventListeners.keys());
|
|
26
|
+
}
|
|
27
|
+
rawListeners(eventName) {
|
|
28
|
+
if (!eventName) {
|
|
29
|
+
return this.getAllListeners();
|
|
30
|
+
}
|
|
31
|
+
return this._eventListeners.get(eventName) ?? [];
|
|
32
|
+
}
|
|
33
|
+
prependListener(eventName, listener) {
|
|
34
|
+
const listeners = this._eventListeners.get(eventName) ?? [];
|
|
35
|
+
listeners.unshift(listener);
|
|
36
|
+
this._eventListeners.set(eventName, listeners);
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
prependOnceListener(eventName, listener) {
|
|
40
|
+
const onceListener = (...arguments_) => {
|
|
41
|
+
this.off(eventName, onceListener);
|
|
42
|
+
listener(...arguments_);
|
|
43
|
+
};
|
|
44
|
+
this.prependListener(eventName, onceListener);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
9
47
|
maxListeners() {
|
|
10
48
|
return this._maxListeners;
|
|
11
49
|
}
|
|
12
50
|
// Add an event listener
|
|
13
51
|
addListener(event, listener) {
|
|
14
52
|
this.on(event, listener);
|
|
53
|
+
return this;
|
|
15
54
|
}
|
|
16
55
|
on(event, listener) {
|
|
17
56
|
if (!this._eventListeners.has(event)) {
|
|
@@ -24,10 +63,12 @@ var Eventified = class {
|
|
|
24
63
|
}
|
|
25
64
|
listeners.push(listener);
|
|
26
65
|
}
|
|
66
|
+
return this;
|
|
27
67
|
}
|
|
28
68
|
// Remove an event listener
|
|
29
69
|
removeListener(event, listener) {
|
|
30
70
|
this.off(event, listener);
|
|
71
|
+
return this;
|
|
31
72
|
}
|
|
32
73
|
off(event, listener) {
|
|
33
74
|
const listeners = this._eventListeners.get(event) ?? [];
|
|
@@ -38,6 +79,7 @@ var Eventified = class {
|
|
|
38
79
|
if (listeners.length === 0) {
|
|
39
80
|
this._eventListeners.delete(event);
|
|
40
81
|
}
|
|
82
|
+
return this;
|
|
41
83
|
}
|
|
42
84
|
// Emit an event
|
|
43
85
|
emit(event, ...arguments_) {
|
|
@@ -47,6 +89,7 @@ var Eventified = class {
|
|
|
47
89
|
listener(...arguments_);
|
|
48
90
|
}
|
|
49
91
|
}
|
|
92
|
+
return true;
|
|
50
93
|
}
|
|
51
94
|
// Get all listeners for a specific event
|
|
52
95
|
listeners(event) {
|
|
@@ -59,6 +102,7 @@ var Eventified = class {
|
|
|
59
102
|
} else {
|
|
60
103
|
this._eventListeners.clear();
|
|
61
104
|
}
|
|
105
|
+
return this;
|
|
62
106
|
}
|
|
63
107
|
// Set the maximum number of listeners for a single event
|
|
64
108
|
setMaxListeners(n) {
|
|
@@ -69,6 +113,13 @@ var Eventified = class {
|
|
|
69
113
|
}
|
|
70
114
|
}
|
|
71
115
|
}
|
|
116
|
+
getAllListeners() {
|
|
117
|
+
let result = new Array();
|
|
118
|
+
for (const listeners of this._eventListeners.values()) {
|
|
119
|
+
result = result.concat(listeners);
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
72
123
|
};
|
|
73
124
|
|
|
74
125
|
// src/index.ts
|
package/package.json
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hookified",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Event and Middleware Hooks",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "
|
|
7
|
-
"module": "
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
6
|
+
"main": "dist/node/index.cjs",
|
|
7
|
+
"module": "dist/node/index.js",
|
|
9
8
|
"exports": {
|
|
10
9
|
".": {
|
|
11
|
-
"
|
|
12
|
-
"
|
|
10
|
+
"import": "./dist/node/index.js",
|
|
11
|
+
"require": "./dist/node/index.cjs"
|
|
12
|
+
},
|
|
13
|
+
"./browser": {
|
|
14
|
+
"import": "./dist/browser/index.js",
|
|
15
|
+
"default": "./dist/browser/index.global.js"
|
|
13
16
|
}
|
|
14
17
|
},
|
|
15
|
-
"
|
|
16
|
-
"node": ">=20"
|
|
17
|
-
},
|
|
18
|
+
"types": "dist/node/index.d.ts",
|
|
18
19
|
"scripts": {
|
|
19
20
|
"test": "xo --fix && vitest run --coverage",
|
|
20
21
|
"test:ci": "xo && vitest run --coverage",
|
|
21
22
|
"clean": "rimraf ./dist ./coverage ./site/dist",
|
|
22
|
-
"build": "rimraf ./dist && tsup
|
|
23
|
+
"build": "rimraf ./dist && tsup",
|
|
23
24
|
"website:build": "docula build",
|
|
24
25
|
"website:serve": "docula serve",
|
|
25
26
|
"prepare": "npm run build"
|
|
@@ -56,12 +57,12 @@
|
|
|
56
57
|
},
|
|
57
58
|
"homepage": "https://github.com/jaredwray/hookified#readme",
|
|
58
59
|
"devDependencies": {
|
|
59
|
-
"@vitest/coverage-v8": "^2.1.
|
|
60
|
+
"@vitest/coverage-v8": "^2.1.3",
|
|
60
61
|
"docula": "^0.9.3",
|
|
61
62
|
"rimraf": "^6.0.1",
|
|
62
63
|
"tsup": "^8.3.0",
|
|
63
64
|
"typescript": "^5.6.3",
|
|
64
|
-
"vitest": "^2.1.
|
|
65
|
+
"vitest": "^2.1.3",
|
|
65
66
|
"xo": "^0.59.3"
|
|
66
67
|
},
|
|
67
68
|
"files": [
|
package/dist/index.d.cts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
type EventListener = (...arguments_: any[]) => void;
|
|
2
|
-
declare class Eventified {
|
|
3
|
-
_eventListeners: Map<string, EventListener[]>;
|
|
4
|
-
_maxListeners: number;
|
|
5
|
-
constructor();
|
|
6
|
-
maxListeners(): number;
|
|
7
|
-
addListener(event: string, listener: EventListener): void;
|
|
8
|
-
on(event: string, listener: EventListener): void;
|
|
9
|
-
removeListener(event: string, listener: EventListener): void;
|
|
10
|
-
off(event: string, listener: EventListener): void;
|
|
11
|
-
emit(event: string, ...arguments_: any[]): void;
|
|
12
|
-
listeners(event: string): EventListener[];
|
|
13
|
-
removeAllListeners(event?: string): void;
|
|
14
|
-
setMaxListeners(n: number): void;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
18
|
-
declare class Hookified extends Eventified {
|
|
19
|
-
_hooks: Map<string, Hook[]>;
|
|
20
|
-
constructor();
|
|
21
|
-
onHook(event: string, handler: Hook): void;
|
|
22
|
-
removeHook(event: string, handler: Hook): void;
|
|
23
|
-
hook<T>(event: string, ...arguments_: T[]): Promise<void>;
|
|
24
|
-
get hooks(): Map<string, Hook[]>;
|
|
25
|
-
getHooks(event: string): Hook[] | undefined;
|
|
26
|
-
clearHooks(): void;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { type EventListener, Eventified, type Hook, Hookified };
|
package/dist/index.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
type EventListener = (...arguments_: any[]) => void;
|
|
2
|
-
declare class Eventified {
|
|
3
|
-
_eventListeners: Map<string, EventListener[]>;
|
|
4
|
-
_maxListeners: number;
|
|
5
|
-
constructor();
|
|
6
|
-
maxListeners(): number;
|
|
7
|
-
addListener(event: string, listener: EventListener): void;
|
|
8
|
-
on(event: string, listener: EventListener): void;
|
|
9
|
-
removeListener(event: string, listener: EventListener): void;
|
|
10
|
-
off(event: string, listener: EventListener): void;
|
|
11
|
-
emit(event: string, ...arguments_: any[]): void;
|
|
12
|
-
listeners(event: string): EventListener[];
|
|
13
|
-
removeAllListeners(event?: string): void;
|
|
14
|
-
setMaxListeners(n: number): void;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
18
|
-
declare class Hookified extends Eventified {
|
|
19
|
-
_hooks: Map<string, Hook[]>;
|
|
20
|
-
constructor();
|
|
21
|
-
onHook(event: string, handler: Hook): void;
|
|
22
|
-
removeHook(event: string, handler: Hook): void;
|
|
23
|
-
hook<T>(event: string, ...arguments_: T[]): Promise<void>;
|
|
24
|
-
get hooks(): Map<string, Hook[]>;
|
|
25
|
-
getHooks(event: string): Hook[] | undefined;
|
|
26
|
-
clearHooks(): void;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { type EventListener, Eventified, type Hook, Hookified };
|