hookified 1.3.0 → 1.5.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 +476 -3
- package/dist/browser/index.global.js +1 -1
- package/dist/browser/index.global.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +181 -10
- package/dist/node/index.d.cts +282 -8
- package/dist/node/index.d.ts +282 -8
- package/dist/node/index.js +181 -10
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
|
-
# Event Emitting and
|
|
3
|
+
# Event Emitting 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)
|
|
7
7
|
[](https://codecov.io/gh/jaredwray/hookified)
|
|
8
8
|
[](https://npmjs.com/package/hookified)
|
|
9
|
+

|
|
9
10
|
[](https://npmjs.com/package/hookified)
|
|
10
11
|
|
|
11
12
|
# Features
|
|
12
13
|
- Simple replacement for EventEmitter
|
|
13
|
-
- Async Middleware Hooks for Your Methods
|
|
14
|
+
- Async / Sync Middleware Hooks for Your Methods
|
|
14
15
|
- ESM / CJS with Types and Nodejs 20+
|
|
16
|
+
- Browser Support and Delivered via CDN
|
|
15
17
|
- Maintained on a regular basis!
|
|
16
18
|
|
|
17
19
|
# Installation
|
|
@@ -119,54 +121,525 @@ if you are not using ESM modules, you can use the following:
|
|
|
119
121
|
</script>
|
|
120
122
|
```
|
|
121
123
|
|
|
122
|
-
# API
|
|
124
|
+
# API - Hooks
|
|
123
125
|
|
|
124
126
|
## .onHook(eventName, handler)
|
|
125
127
|
|
|
126
128
|
Subscribe to a hook event.
|
|
127
129
|
|
|
130
|
+
```javascript
|
|
131
|
+
import { Hookified } from 'hookified';
|
|
132
|
+
|
|
133
|
+
class MyClass extends Hookified {
|
|
134
|
+
constructor() {
|
|
135
|
+
super();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async myMethodWithHooks() Promise<any> {
|
|
139
|
+
let data = { some: 'data' };
|
|
140
|
+
// do something
|
|
141
|
+
await this.hook('before:myMethod2', data);
|
|
142
|
+
|
|
143
|
+
return data;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const myClass = new MyClass();
|
|
148
|
+
myClass.onHook('before:myMethod2', async (data) => {
|
|
149
|
+
data.some = 'new data';
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## .onceHook(eventName, handler)
|
|
154
|
+
|
|
155
|
+
Subscribe to a hook event once.
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
import { Hookified } from 'hookified';
|
|
159
|
+
|
|
160
|
+
class MyClass extends Hookified {
|
|
161
|
+
constructor() {
|
|
162
|
+
super();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async myMethodWithHooks() Promise<any> {
|
|
166
|
+
let data = { some: 'data' };
|
|
167
|
+
// do something
|
|
168
|
+
await this.hook('before:myMethod2', data);
|
|
169
|
+
|
|
170
|
+
return data;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const myClass = new MyClass();
|
|
175
|
+
|
|
176
|
+
myClass.onHookOnce('before:myMethod2', async (data) => {
|
|
177
|
+
data.some = 'new data';
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
myClass.myMethodWithHooks();
|
|
181
|
+
|
|
182
|
+
console.log(myClass.hooks.length); // 0
|
|
183
|
+
```
|
|
184
|
+
|
|
128
185
|
## .removeHook(eventName)
|
|
129
186
|
|
|
130
187
|
Unsubscribe from a hook event.
|
|
131
188
|
|
|
189
|
+
```javascript
|
|
190
|
+
import { Hookified } from 'hookified';
|
|
191
|
+
|
|
192
|
+
class MyClass extends Hookified {
|
|
193
|
+
constructor() {
|
|
194
|
+
super();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async myMethodWithHooks() Promise<any> {
|
|
198
|
+
let data = { some: 'data' };
|
|
199
|
+
// do something
|
|
200
|
+
await this.hook('before:myMethod2', data);
|
|
201
|
+
|
|
202
|
+
return data;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const myClass = new MyClass();
|
|
207
|
+
const handler = async (data) => {
|
|
208
|
+
data.some = 'new data';
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
myClass.onHook('before:myMethod2', handler);
|
|
212
|
+
|
|
213
|
+
myClass.removeHook('before:myMethod2', handler);
|
|
214
|
+
```
|
|
215
|
+
|
|
132
216
|
## .hook(eventName, ...args)
|
|
133
217
|
|
|
134
218
|
Run a hook event.
|
|
135
219
|
|
|
220
|
+
```javascript
|
|
221
|
+
import { Hookified } from 'hookified';
|
|
222
|
+
|
|
223
|
+
class MyClass extends Hookified {
|
|
224
|
+
constructor() {
|
|
225
|
+
super();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async myMethodWithHooks() Promise<any> {
|
|
229
|
+
let data = { some: 'data' };
|
|
230
|
+
// do something
|
|
231
|
+
await this.hook('before:myMethod2', data);
|
|
232
|
+
|
|
233
|
+
return data;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
in this example we are passing multiple arguments to the hook:
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
import { Hookified } from 'hookified';
|
|
242
|
+
|
|
243
|
+
class MyClass extends Hookified {
|
|
244
|
+
constructor() {
|
|
245
|
+
super();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async myMethodWithHooks() Promise<any> {
|
|
249
|
+
let data = { some: 'data' };
|
|
250
|
+
let data2 = { some: 'data2' };
|
|
251
|
+
// do something
|
|
252
|
+
await this.hook('before:myMethod2', data, data2);
|
|
253
|
+
|
|
254
|
+
return data;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const myClass = new MyClass();
|
|
259
|
+
|
|
260
|
+
myClass.onHook('before:myMethod2', async (data, data2) => {
|
|
261
|
+
data.some = 'new data';
|
|
262
|
+
data2.some = 'new data2';
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
await myClass.myMethodWithHooks();
|
|
266
|
+
```
|
|
267
|
+
|
|
136
268
|
## .hooks
|
|
137
269
|
|
|
138
270
|
Get all hooks.
|
|
139
271
|
|
|
272
|
+
```javascript
|
|
273
|
+
import { Hookified } from 'hookified';
|
|
274
|
+
|
|
275
|
+
class MyClass extends Hookified {
|
|
276
|
+
constructor() {
|
|
277
|
+
super();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async myMethodWithHooks() Promise<any> {
|
|
281
|
+
let data = { some: 'data' };
|
|
282
|
+
// do something
|
|
283
|
+
await this.hook('before:myMethod2', data);
|
|
284
|
+
|
|
285
|
+
return data;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const myClass = new MyClass();
|
|
290
|
+
myClass.onHook('before:myMethod2', async (data) => {
|
|
291
|
+
data.some = 'new data';
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
console.log(myClass.hooks);
|
|
295
|
+
```
|
|
296
|
+
|
|
140
297
|
## .getHooks(eventName)
|
|
141
298
|
|
|
142
299
|
Get all hooks for an event.
|
|
143
300
|
|
|
301
|
+
```javascript
|
|
302
|
+
import { Hookified } from 'hookified';
|
|
303
|
+
|
|
304
|
+
class MyClass extends Hookified {
|
|
305
|
+
constructor() {
|
|
306
|
+
super();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async myMethodWithHooks() Promise<any> {
|
|
310
|
+
let data = { some: 'data' };
|
|
311
|
+
// do something
|
|
312
|
+
await this.hook('before:myMethod2', data);
|
|
313
|
+
|
|
314
|
+
return data;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const myClass = new MyClass();
|
|
319
|
+
myClass.onHook('before:myMethod2', async (data) => {
|
|
320
|
+
data.some = 'new data';
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
console.log(myClass.getHooks('before:myMethod2'));
|
|
324
|
+
```
|
|
325
|
+
|
|
144
326
|
## .clearHooks(eventName)
|
|
145
327
|
|
|
328
|
+
Clear all hooks for an event.
|
|
329
|
+
|
|
330
|
+
```javascript
|
|
331
|
+
import { Hookified } from 'hookified';
|
|
332
|
+
|
|
333
|
+
class MyClass extends Hookified {
|
|
334
|
+
constructor() {
|
|
335
|
+
super();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
async myMethodWithHooks() Promise<any> {
|
|
339
|
+
let data = { some: 'data' };
|
|
340
|
+
// do something
|
|
341
|
+
await this.hook('before:myMethod2', data);
|
|
342
|
+
|
|
343
|
+
return data;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const myClass = new MyClass();
|
|
348
|
+
|
|
349
|
+
myClass.onHook('before:myMethod2', async (data) => {
|
|
350
|
+
data.some = 'new data';
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
myClass.clearHooks('before:myMethod2');
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
# API - Events
|
|
357
|
+
|
|
146
358
|
## .on(eventName, handler)
|
|
147
359
|
|
|
148
360
|
Subscribe to an event.
|
|
149
361
|
|
|
362
|
+
```javascript
|
|
363
|
+
import { Hookified } from 'hookified';
|
|
364
|
+
|
|
365
|
+
class MyClass extends Hookified {
|
|
366
|
+
constructor() {
|
|
367
|
+
super();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async myMethodEmittingEvent() {
|
|
371
|
+
this.emit('message', 'Hello World');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const myClass = new MyClass();
|
|
376
|
+
|
|
377
|
+
myClass.on('message', (message) => {
|
|
378
|
+
console.log(message);
|
|
379
|
+
});
|
|
380
|
+
```
|
|
381
|
+
|
|
150
382
|
## .off(eventName, handler)
|
|
151
383
|
|
|
152
384
|
Unsubscribe from an event.
|
|
153
385
|
|
|
386
|
+
```javascript
|
|
387
|
+
import { Hookified } from 'hookified';
|
|
388
|
+
|
|
389
|
+
class MyClass extends Hookified {
|
|
390
|
+
constructor() {
|
|
391
|
+
super();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
async myMethodEmittingEvent() {
|
|
395
|
+
this.emit('message', 'Hello World');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const myClass = new MyClass();
|
|
400
|
+
myClass.on('message', (message) => {
|
|
401
|
+
console.log(message);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
myClass.off('message', (message) => {
|
|
405
|
+
console.log(message);
|
|
406
|
+
});
|
|
407
|
+
```
|
|
408
|
+
|
|
154
409
|
## .emit(eventName, ...args)
|
|
155
410
|
|
|
156
411
|
Emit an event.
|
|
157
412
|
|
|
413
|
+
```javascript
|
|
414
|
+
import { Hookified } from 'hookified';
|
|
415
|
+
|
|
416
|
+
class MyClass extends Hookified {
|
|
417
|
+
constructor() {
|
|
418
|
+
super();
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
async myMethodEmittingEvent() {
|
|
422
|
+
this.emit('message', 'Hello World');
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
158
427
|
## .listeners(eventName)
|
|
159
428
|
|
|
160
429
|
Get all listeners for an event.
|
|
161
430
|
|
|
431
|
+
```javascript
|
|
432
|
+
import { Hookified } from 'hookified';
|
|
433
|
+
|
|
434
|
+
class MyClass extends Hookified {
|
|
435
|
+
constructor() {
|
|
436
|
+
super();
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
async myMethodEmittingEvent() {
|
|
440
|
+
this.emit('message', 'Hello World');
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const myClass = new MyClass();
|
|
445
|
+
|
|
446
|
+
myClass.on('message', (message) => {
|
|
447
|
+
console.log(message);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
console.log(myClass.listeners('message'));
|
|
451
|
+
```
|
|
452
|
+
|
|
162
453
|
## .removeAllListeners(eventName)
|
|
163
454
|
|
|
164
455
|
Remove all listeners for an event.
|
|
165
456
|
|
|
457
|
+
```javascript
|
|
458
|
+
import { Hookified } from 'hookified';
|
|
459
|
+
|
|
460
|
+
class MyClass extends Hookified {
|
|
461
|
+
constructor() {
|
|
462
|
+
super();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
async myMethodEmittingEvent() {
|
|
466
|
+
this.emit('message', 'Hello World');
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
const myClass = new MyClass();
|
|
471
|
+
|
|
472
|
+
myClass.on('message', (message) => {
|
|
473
|
+
console.log(message);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
myClass.removeAllListeners('message');
|
|
477
|
+
```
|
|
478
|
+
|
|
166
479
|
## .setMaxListeners(maxListeners: number)
|
|
167
480
|
|
|
168
481
|
Set the maximum number of listeners and will truncate if there are already too many.
|
|
169
482
|
|
|
483
|
+
```javascript
|
|
484
|
+
import { Hookified } from 'hookified';
|
|
485
|
+
|
|
486
|
+
class MyClass extends Hookified {
|
|
487
|
+
constructor() {
|
|
488
|
+
super();
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
async myMethodEmittingEvent() {
|
|
492
|
+
this.emit('message', 'Hello World');
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
const myClass = new MyClass();
|
|
497
|
+
|
|
498
|
+
myClass.setMaxListeners(1);
|
|
499
|
+
|
|
500
|
+
myClass.on('message', (message) => {
|
|
501
|
+
console.log(message);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
myClass.on('message', (message) => {
|
|
505
|
+
console.log(message);
|
|
506
|
+
}); // this will not be added and console warning
|
|
507
|
+
|
|
508
|
+
console.log(myClass.listenerCount('message')); // 1
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
## .once(eventName, handler)
|
|
512
|
+
|
|
513
|
+
Subscribe to an event once.
|
|
514
|
+
|
|
515
|
+
```javascript
|
|
516
|
+
import { Hookified } from 'hookified';
|
|
517
|
+
|
|
518
|
+
class MyClass extends Hookified {
|
|
519
|
+
constructor() {
|
|
520
|
+
super();
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const myClass = new MyClass();
|
|
525
|
+
|
|
526
|
+
myClass.once('message', (message) => {
|
|
527
|
+
console.log(message);
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
myClass.emit('message', 'Hello World');
|
|
531
|
+
|
|
532
|
+
myClass.emit('message', 'Hello World'); // this will not be called
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
## .prependListener(eventName, handler)
|
|
536
|
+
|
|
537
|
+
Prepend a listener to an event. This will be called before any other listeners.
|
|
538
|
+
|
|
539
|
+
```javascript
|
|
540
|
+
import { Hookified } from 'hookified';
|
|
541
|
+
|
|
542
|
+
class MyClass extends Hookified {
|
|
543
|
+
constructor() {
|
|
544
|
+
super();
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
const myClass = new MyClass();
|
|
549
|
+
|
|
550
|
+
myClass.prependListener('message', (message) => {
|
|
551
|
+
console.log(message);
|
|
552
|
+
});
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## .prependOnceListener(eventName, handler)
|
|
556
|
+
|
|
557
|
+
Prepend a listener to an event once. This will be called before any other listeners.
|
|
558
|
+
|
|
559
|
+
```javascript
|
|
560
|
+
import { Hookified } from 'hookified';
|
|
561
|
+
|
|
562
|
+
class MyClass extends Hookified {
|
|
563
|
+
constructor() {
|
|
564
|
+
super();
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const myClass = new MyClass();
|
|
569
|
+
|
|
570
|
+
myClass.prependOnceListener('message', (message) => {
|
|
571
|
+
console.log(message);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
myClass.emit('message', 'Hello World');
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
## .eventNames()
|
|
578
|
+
|
|
579
|
+
Get all event names.
|
|
580
|
+
|
|
581
|
+
```javascript
|
|
582
|
+
import { Hookified } from 'hookified';
|
|
583
|
+
|
|
584
|
+
class MyClass extends Hookified {
|
|
585
|
+
constructor() {
|
|
586
|
+
super();
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const myClass = new MyClass();
|
|
591
|
+
|
|
592
|
+
myClass.on('message', (message) => {
|
|
593
|
+
console.log(message);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
console.log(myClass.eventNames());
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## .listenerCount(eventName?)
|
|
600
|
+
|
|
601
|
+
Get the count of listeners for an event or all events if evenName not provided.
|
|
602
|
+
|
|
603
|
+
```javascript
|
|
604
|
+
import { Hookified } from 'hookified';
|
|
605
|
+
|
|
606
|
+
class MyClass extends Hookified {
|
|
607
|
+
constructor() {
|
|
608
|
+
super();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
const myClass = new MyClass();
|
|
613
|
+
|
|
614
|
+
myClass.on('message', (message) => {
|
|
615
|
+
console.log(message);
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
console.log(myClass.listenerCount('message')); // 1
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
## .rawListeners(eventName?)
|
|
622
|
+
|
|
623
|
+
Get all listeners for an event or all events if evenName not provided.
|
|
624
|
+
|
|
625
|
+
```javascript
|
|
626
|
+
import { Hookified } from 'hookified';
|
|
627
|
+
|
|
628
|
+
class MyClass extends Hookified {
|
|
629
|
+
constructor() {
|
|
630
|
+
super();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
const myClass = new MyClass();
|
|
635
|
+
|
|
636
|
+
myClass.on('message', (message) => {
|
|
637
|
+
console.log(message);
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
console.log(myClass.rawListeners('message'));
|
|
641
|
+
```
|
|
642
|
+
|
|
170
643
|
# Development and Testing
|
|
171
644
|
|
|
172
645
|
Hookified is written in TypeScript and tests are written in `vitest`. To run the tests, use the following command:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
1
|
+
"use strict";(()=>{var L=Object.defineProperty;var c=(i,e,t)=>e in i?L(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var o=(i,e,t)=>c(i,typeof e!="symbol"?e+"":e,t);var l=class{constructor(){o(this,"_eventListeners");o(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=!1,n=this._eventListeners.get(e);if(n&&n.length>0)for(let r of n)r(...t),s=!0;return s}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 l{constructor(){super();o(this,"_hooks");this._hooks=new Map}onHook(t,s){let n=this._hooks.get(t);n?n.push(s):this._hooks.set(t,[s])}onceHook(t,s){let n=async(...r)=>(this.removeHook(t,n),s(...r));this.onHook(t,n)}removeHook(t,s){let n=this._hooks.get(t);if(n){let r=n.indexOf(s);r!==-1&&n.splice(r,1)}}async hook(t,...s){let n=this._hooks.get(t);if(n)for(let r of n)try{await r(...s)}catch(a){this.emit("error",new Error(`Error in hook handler for event "${t}": ${a.message}`))}}get hooks(){return this._hooks}getHooks(t){return this._hooks.get(t)}clearHooks(){this._hooks.clear()}};})();
|
|
2
2
|
//# sourceMappingURL=index.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["export type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified {\n\t_eventListeners: Map<string, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\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, listener: EventListener): void {\n\t\tthis.on(event, listener);\n\t}\n\n\tpublic on(event: string, listener: EventListener): void {\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} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): void {\n\t\tthis.off(event, listener);\n\t}\n\n\tpublic off(event: string, listener: EventListener): void {\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\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): void {\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\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): void {\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\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","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":"uLAEO,IAAMA,EAAN,KAAiB,CAIvB,aAAc,CAHdC,EAAA,wBACAA,EAAA,sBAGC,KAAK,gBAAkB,IAAI,IAC3B,KAAK,cAAgB,GACtB,CAEO,cAAuB,CAC7B,OAAO,KAAK,aACb,CAGO,YAAYC,EAAeC,EAA+B,CAChE,KAAK,GAAGD,EAAOC,CAAQ,CACxB,CAEO,GAAGD,EAAeC,EAA+B,CAClD,KAAK,gBAAgB,IAAID,CAAK,GAClC,KAAK,gBAAgB,IAAIA,EAAO,CAAC,CAAC,EAGnC,IAAME,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAE5CE,IACCA,EAAU,QAAU,KAAK,eAC5B,QAAQ,KAAK,qEAAqEA,EAAU,OAAS,CAAC,IAAIF,CAAK,4DAA4D,EAG5KE,EAAU,KAAKD,CAAQ,EAEzB,CAGO,eAAeD,EAAeC,EAA+B,CACnE,KAAK,IAAID,EAAOC,CAAQ,CACzB,CAEO,IAAID,EAAeC,EAA+B,CACxD,IAAMC,EAAY,KAAK,gBAAgB,IAAIF,CAAK,GAAK,CAAC,EAChDG,EAAQD,EAAU,QAAQD,CAAQ,EACpCE,EAAQ,IACXD,EAAU,OAAOC,EAAO,CAAC,EAGtBD,EAAU,SAAW,GACxB,KAAK,gBAAgB,OAAOF,CAAK,CAEnC,CAGO,KAAKA,KAAkBI,EAAyB,CACtD,IAAMF,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAEhD,GAAIE,GAAaA,EAAU,OAAS,EACnC,QAAWD,KAAYC,EAEtBD,EAAS,GAAGG,CAAU,CAGzB,CAGO,UAAUJ,EAAgC,CAChD,OAAO,KAAK,gBAAgB,IAAIA,CAAK,GAAK,CAAC,CAC5C,CAGO,mBAAmBA,EAAsB,CAC3CA,EACH,KAAK,gBAAgB,OAAOA,CAAK,EAEjC,KAAK,gBAAgB,MAAM,CAE7B,CAGO,gBAAgBK,EAAiB,CACvC,KAAK,cAAgBA,EACrB,QAAWH,KAAa,KAAK,gBAAgB,OAAO,EAC/CA,EAAU,OAASG,GACtBH,EAAU,OAAOG,CAAC,CAGrB,CACD,ECpFO,IAAMC,EAAN,cAAwBC,CAAW,CAGzC,aAAc,CACb,MAAM,EAHPC,EAAA,eAIC,KAAK,OAAS,IAAI,GACnB,CAGA,OAAOC,EAAeC,EAAe,CACpC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EACvCE,EACHA,EAAc,KAAKD,CAAO,EAE1B,KAAK,OAAO,IAAID,EAAO,CAACC,CAAO,CAAC,CAElC,CAGA,WAAWD,EAAeC,EAAe,CACxC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EAAe,CAClB,IAAMC,EAAQD,EAAc,QAAQD,CAAO,EACvCE,IAAU,IACbD,EAAc,OAAOC,EAAO,CAAC,CAE/B,CACD,CAGA,MAAM,KAAQH,KAAkBI,EAAiB,CAChD,IAAMF,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EACH,QAAWD,KAAWC,EACrB,GAAI,CAEH,MAAMD,EAAQ,GAAGG,CAAU,CAC5B,OAASC,EAAO,CACf,KAAK,KAAK,QAAS,IAAI,MAAM,oCAAoCL,CAAK,MAAOK,EAAgB,OAAO,EAAE,CAAC,CACxG,CAGH,CAGA,IAAI,OAAQ,CAEX,OAAO,KAAK,MACb,CAEA,SAASL,EAAe,CACvB,OAAO,KAAK,OAAO,IAAIA,CAAK,CAC7B,CAEA,YAAa,CACZ,KAAK,OAAO,MAAM,CACnB,CACD","names":["Eventified","__publicField","event","listener","listeners","index","arguments_","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]}
|
|
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\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\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\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\teventNames(): Array<string | symbol> {\n\t\treturn Array.from(this._eventListeners.keys());\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\trawListeners(event?: string | symbol): EventListener[] {\n\t\tif (!event) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, 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/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\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\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\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\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\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/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\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/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tonceHook(event: string, handler: Hook) {\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\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/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\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/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tget hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\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","result","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","hook","arguments_","index","error"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var L=Object.defineProperty;var c=(i,e,t)=>e in i?L(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var o=(i,e,t)=>c(i,typeof e!="symbol"?e+"":e,t);var l=class{constructor(){o(this,"_eventListeners");o(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=!1,n=this._eventListeners.get(e);if(n&&n.length>0)for(let r of n)r(...t),s=!0;return s}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 l{constructor(){super();o(this,"_hooks");this._hooks=new Map}onHook(t,s){let n=this._hooks.get(t);n?n.push(s):this._hooks.set(t,[s])}onceHook(t,s){let n=async(...r)=>(this.removeHook(t,n),s(...r));this.onHook(t,n)}removeHook(t,s){let n=this._hooks.get(t);if(n){let r=n.indexOf(s);r!==-1&&n.splice(r,1)}}async hook(t,...s){let n=this._hooks.get(t);if(n)for(let r of n)try{await r(...s)}catch(a){this.emit("error",new Error(`Error in hook handler for event "${t}": ${a.message}`))}}get hooks(){return this._hooks}getHooks(t){return this._hooks.get(t)}clearHooks(){this._hooks.clear()}};export{l as Eventified,h as Hookified};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["export type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified {\n\t_eventListeners: Map<string, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\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, listener: EventListener): void {\n\t\tthis.on(event, listener);\n\t}\n\n\tpublic on(event: string, listener: EventListener): void {\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} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): void {\n\t\tthis.off(event, listener);\n\t}\n\n\tpublic off(event: string, listener: EventListener): void {\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\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): void {\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\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): void {\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\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","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":"oKAEO,IAAMA,EAAN,KAAiB,CAIvB,aAAc,CAHdC,EAAA,wBACAA,EAAA,sBAGC,KAAK,gBAAkB,IAAI,IAC3B,KAAK,cAAgB,GACtB,CAEO,cAAuB,CAC7B,OAAO,KAAK,aACb,CAGO,YAAYC,EAAeC,EAA+B,CAChE,KAAK,GAAGD,EAAOC,CAAQ,CACxB,CAEO,GAAGD,EAAeC,EAA+B,CAClD,KAAK,gBAAgB,IAAID,CAAK,GAClC,KAAK,gBAAgB,IAAIA,EAAO,CAAC,CAAC,EAGnC,IAAME,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAE5CE,IACCA,EAAU,QAAU,KAAK,eAC5B,QAAQ,KAAK,qEAAqEA,EAAU,OAAS,CAAC,IAAIF,CAAK,4DAA4D,EAG5KE,EAAU,KAAKD,CAAQ,EAEzB,CAGO,eAAeD,EAAeC,EAA+B,CACnE,KAAK,IAAID,EAAOC,CAAQ,CACzB,CAEO,IAAID,EAAeC,EAA+B,CACxD,IAAMC,EAAY,KAAK,gBAAgB,IAAIF,CAAK,GAAK,CAAC,EAChDG,EAAQD,EAAU,QAAQD,CAAQ,EACpCE,EAAQ,IACXD,EAAU,OAAOC,EAAO,CAAC,EAGtBD,EAAU,SAAW,GACxB,KAAK,gBAAgB,OAAOF,CAAK,CAEnC,CAGO,KAAKA,KAAkBI,EAAyB,CACtD,IAAMF,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAEhD,GAAIE,GAAaA,EAAU,OAAS,EACnC,QAAWD,KAAYC,EAEtBD,EAAS,GAAGG,CAAU,CAGzB,CAGO,UAAUJ,EAAgC,CAChD,OAAO,KAAK,gBAAgB,IAAIA,CAAK,GAAK,CAAC,CAC5C,CAGO,mBAAmBA,EAAsB,CAC3CA,EACH,KAAK,gBAAgB,OAAOA,CAAK,EAEjC,KAAK,gBAAgB,MAAM,CAE7B,CAGO,gBAAgBK,EAAiB,CACvC,KAAK,cAAgBA,EACrB,QAAWH,KAAa,KAAK,gBAAgB,OAAO,EAC/CA,EAAU,OAASG,GACtBH,EAAU,OAAOG,CAAC,CAGrB,CACD,ECpFO,IAAMC,EAAN,cAAwBC,CAAW,CAGzC,aAAc,CACb,MAAM,EAHPC,EAAA,eAIC,KAAK,OAAS,IAAI,GACnB,CAGA,OAAOC,EAAeC,EAAe,CACpC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EACvCE,EACHA,EAAc,KAAKD,CAAO,EAE1B,KAAK,OAAO,IAAID,EAAO,CAACC,CAAO,CAAC,CAElC,CAGA,WAAWD,EAAeC,EAAe,CACxC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EAAe,CAClB,IAAMC,EAAQD,EAAc,QAAQD,CAAO,EACvCE,IAAU,IACbD,EAAc,OAAOC,EAAO,CAAC,CAE/B,CACD,CAGA,MAAM,KAAQH,KAAkBI,EAAiB,CAChD,IAAMF,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EACH,QAAWD,KAAWC,EACrB,GAAI,CAEH,MAAMD,EAAQ,GAAGG,CAAU,CAC5B,OAASC,EAAO,CACf,KAAK,KAAK,QAAS,IAAI,MAAM,oCAAoCL,CAAK,MAAOK,EAAgB,OAAO,EAAE,CAAC,CACxG,CAGH,CAGA,IAAI,OAAQ,CAEX,OAAO,KAAK,MACb,CAEA,SAASL,EAAe,CACvB,OAAO,KAAK,OAAO,IAAIA,CAAK,CAC7B,CAEA,YAAa,CACZ,KAAK,OAAO,MAAM,CACnB,CACD","names":["Eventified","__publicField","event","listener","listeners","index","arguments_","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]}
|
|
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\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\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\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\teventNames(): Array<string | symbol> {\n\t\treturn Array.from(this._eventListeners.keys());\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\trawListeners(event?: string | symbol): EventListener[] {\n\t\tif (!event) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, 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/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\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\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\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/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\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\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\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/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\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/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tonceHook(event: string, handler: Hook) {\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\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/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\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/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tget hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\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","result","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","hook","arguments_","index","error"]}
|