@irrelon/emitter 6.0.1 → 6.2.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.
@@ -1,23 +1,30 @@
1
+ import { jest } from "@jest/globals";
1
2
  import assert from "assert";
2
- import { Emitter, EmitterEventsInterface, EventListenerCallback, ListenerReturnFlag } from "../src/Emitter";
3
+ import {
4
+ Emitter,
5
+ EmitterEventsInterface,
6
+ EmitterEventsWithStar,
7
+ EventListenerCallback,
8
+ ListenerReturnFlag
9
+ } from "../src/Emitter";
3
10
 
4
11
  let expectedAssertions = 0;
5
12
  let actualAssertions = 0;
6
13
 
7
- function expect(val: number) {
14
+ function expectAssertionCount (val: number) {
8
15
  expectedAssertions = val;
9
16
  }
10
17
 
11
- function reset() {
18
+ function resetAssertionCount () {
12
19
  expectedAssertions = 0;
13
20
  actualAssertions = 0;
14
21
  }
15
22
 
16
- function countAssertion() {
23
+ function countAssertion () {
17
24
  actualAssertions++;
18
25
  }
19
26
 
20
- function check() {
27
+ function checkAssertionCount () {
21
28
  if (expectedAssertions === undefined || expectedAssertions === actualAssertions) {
22
29
  return;
23
30
  }
@@ -25,15 +32,16 @@ function check() {
25
32
  throw new Error("expected " + expectedAssertions + " assertions, got " + actualAssertions);
26
33
  }
27
34
 
28
- beforeEach(reset);
29
- afterEach(check);
35
+ beforeEach(resetAssertionCount);
36
+ afterEach(checkAssertionCount);
30
37
 
31
38
  describe("Emitter", () => {
32
39
  describe("new Emitter()", () => {
33
40
  it("Creates emitter instance by instantiation", () => {
34
41
  const myClass = new Emitter();
35
42
 
36
- myClass.on("moo", () => {});
43
+ myClass.on("moo", () => {
44
+ });
37
45
 
38
46
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listener registered on event");
39
47
 
@@ -41,25 +49,19 @@ describe("Emitter", () => {
41
49
 
42
50
  assert.strictEqual(
43
51
  !myClass._eventListeners?.moo ||
44
- !myClass._eventListeners.moo["*"] ||
45
- myClass._eventListeners.moo["*"].length,
52
+ !myClass._eventListeners.moo["*"] ||
53
+ myClass._eventListeners.moo["*"].length,
46
54
  true,
47
55
  "Listeners all removed from event"
48
56
  );
49
57
  });
50
58
 
51
59
  it("Supports extending Emitter as a base class", () => {
52
- let testFuncCount = 0;
53
-
54
60
  // Test extending Emitter and modifying base functionality
55
61
  class MyClass extends Emitter {
56
- testFunc() {
57
- testFuncCount++;
58
- }
59
-
60
- on(eventName: string, id: string, listener: EventListenerCallback): this;
61
- on(eventName: string, listener: EventListenerCallback): this;
62
- on(eventName: string, ...rest: any[]): this {
62
+ on (eventName: string, id: string, listener: EventListenerCallback): this;
63
+ on (eventName: string, listener: EventListenerCallback): this;
64
+ on (eventName: string, ...rest: any[]): this {
63
65
  const restTypes = rest.map((arg) => typeof arg);
64
66
 
65
67
  if (restTypes[0] === "function") {
@@ -73,14 +75,14 @@ describe("Emitter", () => {
73
75
  }
74
76
 
75
77
  // @ts-ignore
76
- emit(eventName: string, ...rest: any[]) {
78
+ emit (eventName: string, ...rest: any[]) {
77
79
  return super.emitId(eventName, "^^noId", ...rest);
78
80
  }
79
81
 
80
- off(eventName: string, id: string, listener?: EventListenerCallback): this;
81
- off(eventName: string, listener?: EventListenerCallback): this;
82
- off(eventName: string): this;
83
- off(eventName: string, ...rest: any[]) {
82
+ off (eventName: string, id: string, listener?: EventListenerCallback): this;
83
+ off (eventName: string, listener?: EventListenerCallback): this;
84
+ off (eventName: string): this;
85
+ off (eventName: string, ...rest: any[]) {
84
86
  let id = rest[0];
85
87
  let func = rest[1];
86
88
 
@@ -118,22 +120,22 @@ describe("Emitter", () => {
118
120
 
119
121
  assert.strictEqual(
120
122
  !myClass._eventListeners?.moo ||
121
- !myClass._eventListeners?.moo["testId"] ||
122
- (myClass._eventListeners?.moo["testId"].length as number) === 0,
123
+ !myClass._eventListeners?.moo["testId"] ||
124
+ (myClass._eventListeners?.moo["testId"].length as number) === 0,
123
125
  true,
124
126
  "Listeners all removed from event"
125
127
  );
126
128
  assert.strictEqual(
127
129
  myClass._eventListeners?.moo &&
128
- myClass._eventListeners?.moo["^^noId"] &&
129
- myClass._eventListeners?.moo["^^noId"].length === 1,
130
+ myClass._eventListeners?.moo["^^noId"] &&
131
+ myClass._eventListeners?.moo["^^noId"].length === 1,
130
132
  true,
131
133
  "Global listener still there"
132
134
  );
133
135
  assert.strictEqual(
134
136
  !myClass._eventListeners?.moo ||
135
- !myClass._eventListeners?.moo["*"] ||
136
- myClass._eventListeners?.moo["*"].length === 0,
137
+ !myClass._eventListeners?.moo["*"] ||
138
+ myClass._eventListeners?.moo["*"].length === 0,
137
139
  true,
138
140
  "Global listener still there"
139
141
  );
@@ -142,8 +144,8 @@ describe("Emitter", () => {
142
144
 
143
145
  assert.strictEqual(
144
146
  !myClass._eventListeners?.moo ||
145
- !myClass._eventListeners?.moo["*"] ||
146
- myClass._eventListeners?.moo["*"].length === 0,
147
+ !myClass._eventListeners?.moo["*"] ||
148
+ myClass._eventListeners?.moo["*"].length === 0,
147
149
  true,
148
150
  "Listeners all removed from event"
149
151
  );
@@ -230,6 +232,7 @@ describe("Emitter", () => {
230
232
  const delta = new Date().getTime() - time;
231
233
 
232
234
  assert.ok(delta > 900, "Delta was not correct, await may not have paused?");
235
+ assert.strictEqual(listenerFiredCount, 2, "Listener fire count was incorect");
233
236
  });
234
237
 
235
238
  it("Supports awaiting async and non-async listener return data", async () => {
@@ -338,12 +341,16 @@ describe("Emitter", () => {
338
341
  describe("off()", () => {
339
342
  it("Cancels all listeners (event)", () => {
340
343
  const myClass = new Emitter();
341
- const listener1 = () => {};
342
- const listener2 = () => {};
344
+ const listener1 = () => {
345
+ };
346
+ const listener2 = () => {
347
+ };
343
348
 
344
- myClass.on("moo", () => {});
349
+ myClass.on("moo", () => {
350
+ });
345
351
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
346
- myClass.on("moo", "testId", () => {});
352
+ myClass.on("moo", "testId", () => {
353
+ });
347
354
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
348
355
  myClass.on("moo", listener1);
349
356
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -354,8 +361,8 @@ describe("Emitter", () => {
354
361
 
355
362
  assert.strictEqual(
356
363
  !myClass._eventListeners?.moo ||
357
- (myClass._eventListeners?.moo["*"].length === 0 &&
358
- myClass._eventListeners?.moo["testId"].length === 0),
364
+ (myClass._eventListeners?.moo["*"].length === 0 &&
365
+ myClass._eventListeners?.moo["testId"].length === 0),
359
366
  true,
360
367
  "Listeners all removed from event"
361
368
  );
@@ -363,12 +370,16 @@ describe("Emitter", () => {
363
370
 
364
371
  it("Cancels id-based listeners (event, id)", () => {
365
372
  const myClass = new Emitter();
366
- const listener1 = () => {};
367
- const listener2 = () => {};
373
+ const listener1 = () => {
374
+ };
375
+ const listener2 = () => {
376
+ };
368
377
 
369
- myClass.on("moo", () => {});
378
+ myClass.on("moo", () => {
379
+ });
370
380
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
371
- myClass.on("moo", "testId", () => {});
381
+ myClass.on("moo", "testId", () => {
382
+ });
372
383
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
373
384
  myClass.on("moo", listener1);
374
385
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -391,12 +402,16 @@ describe("Emitter", () => {
391
402
 
392
403
  it("Cancels listener-based listeners (event, listener)", () => {
393
404
  const myClass = new Emitter();
394
- const listener1 = () => {};
395
- const listener2 = () => {};
405
+ const listener1 = () => {
406
+ };
407
+ const listener2 = () => {
408
+ };
396
409
 
397
- myClass.on("moo", () => {});
410
+ myClass.on("moo", () => {
411
+ });
398
412
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
399
- myClass.on("moo", "testId", () => {});
413
+ myClass.on("moo", "testId", () => {
414
+ });
400
415
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
401
416
  myClass.on("moo", listener1);
402
417
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -419,12 +434,16 @@ describe("Emitter", () => {
419
434
 
420
435
  it("Cancels id-based + listener-based listeners (event, id, listener)", () => {
421
436
  const myClass = new Emitter();
422
- const listener1 = () => {};
423
- const listener2 = () => {};
437
+ const listener1 = () => {
438
+ };
439
+ const listener2 = () => {
440
+ };
424
441
 
425
- myClass.on("moo", () => {});
442
+ myClass.on("moo", () => {
443
+ });
426
444
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
427
- myClass.on("moo", "testId", () => {});
445
+ myClass.on("moo", "testId", () => {
446
+ });
428
447
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
429
448
  myClass.on("moo", listener1);
430
449
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -448,9 +467,10 @@ describe("Emitter", () => {
448
467
 
449
468
  describe("emitStatic()", () => {
450
469
  it("Static emitter will emit when a new listener is added", (resolve) => {
451
- class MyClass extends Emitter {}
470
+ class MyClass extends Emitter {
471
+ }
452
472
 
453
- expect(1);
473
+ expectAssertionCount(1);
454
474
 
455
475
  const myClass = new MyClass();
456
476
  myClass.emitStatic("moo");
@@ -464,9 +484,10 @@ describe("Emitter", () => {
464
484
 
465
485
  describe("cancelStatic()", () => {
466
486
  it("Removes static emitter", (resolve) => {
467
- class MyClass extends Emitter {}
487
+ class MyClass extends Emitter {
488
+ }
468
489
 
469
- expect(1);
490
+ expectAssertionCount(1);
470
491
 
471
492
  const myClass = new MyClass();
472
493
  myClass.emitStatic("moo");
@@ -489,9 +510,10 @@ describe("Emitter", () => {
489
510
 
490
511
  describe("overwrite()", () => {
491
512
  it("Only fires the last listener added, cancelling all other listeners before it", (resolve) => {
492
- class MyClass extends Emitter {}
513
+ class MyClass extends Emitter {
514
+ }
493
515
 
494
- expect(1);
516
+ expectAssertionCount(1);
495
517
 
496
518
  const myClass = new MyClass();
497
519
  myClass.on("moo", () => {
@@ -514,9 +536,10 @@ describe("Emitter", () => {
514
536
  });
515
537
 
516
538
  it("Only fires the last listener added (with id), cancelling all other listeners before it", (resolve) => {
517
- class MyClass extends Emitter {}
539
+ class MyClass extends Emitter {
540
+ }
518
541
 
519
- expect(2);
542
+ expectAssertionCount(2);
520
543
 
521
544
  const myClass = new MyClass();
522
545
 
@@ -575,15 +598,15 @@ describe("Emitter", () => {
575
598
 
576
599
  assert.strictEqual(
577
600
  !myClass._eventListeners?.moo ||
578
- !myClass._eventListeners?.moo["testId"] ||
579
- myClass._eventListeners?.moo["testId"].length,
601
+ !myClass._eventListeners?.moo["testId"] ||
602
+ myClass._eventListeners?.moo["testId"].length,
580
603
  true,
581
604
  "Listeners all removed from event"
582
605
  );
583
606
  assert.strictEqual(
584
607
  myClass._eventListeners?.moo &&
585
- myClass._eventListeners?.moo["*"] &&
586
- myClass._eventListeners?.moo["*"].length === 1,
608
+ myClass._eventListeners?.moo["*"] &&
609
+ myClass._eventListeners?.moo["*"].length === 1,
587
610
  true,
588
611
  "Global listener still there"
589
612
  );
@@ -592,11 +615,67 @@ describe("Emitter", () => {
592
615
 
593
616
  assert.strictEqual(
594
617
  !myClass._eventListeners?.moo ||
595
- !myClass._eventListeners?.moo["*"] ||
596
- myClass._eventListeners?.moo["*"].length === 0,
618
+ !myClass._eventListeners?.moo["*"] ||
619
+ myClass._eventListeners?.moo["*"].length === 0,
597
620
  true,
598
621
  "Listeners all removed from event"
599
622
  );
600
623
  });
601
624
  });
625
+
626
+ describe("Global listener functionality", () => {
627
+ interface MyEvents {
628
+ someEvent: (arg1: string, arg2: boolean, arg3: boolean) => void;
629
+ }
630
+
631
+ it("Listens for any event emitted and fires the listener with the onAny() function", () => {
632
+ const emitter = new Emitter<MyEvents>();
633
+
634
+ const spy = jest.fn();
635
+
636
+ emitter.onAny(spy);
637
+
638
+ emitter.emit("someEvent", "someArg1", true, false);
639
+
640
+ expect(spy).toHaveBeenCalledWith("someEvent", "someArg1", true, false);
641
+ });
642
+
643
+ it(`Listens for any event emitted and fires the listener with the on("*") function`, () => {
644
+ const emitter = new Emitter<EmitterEventsWithStar<MyEvents>>();
645
+
646
+ const spy = jest.fn();
647
+
648
+ emitter.on("*", spy);
649
+
650
+ emitter.emit("someEvent", "someArg1", true, false);
651
+
652
+ expect(spy).toHaveBeenCalledWith("someEvent", "someArg1", true, false);
653
+ });
654
+
655
+ it(`Cancels an event listener for any event emitted with the offAny() function`, () => {
656
+ const emitter = new Emitter<EmitterEventsWithStar<MyEvents>>();
657
+
658
+ const spy = jest.fn();
659
+
660
+ emitter.on("*", spy);
661
+ emitter.offAny(spy);
662
+
663
+ emitter.emit("someEvent", "someArg1", true, false);
664
+
665
+ expect(spy).toHaveBeenCalledTimes(0);
666
+ });
667
+
668
+ it(`Cancels an event listener for any event emitted with the off("*") function`, () => {
669
+ const emitter = new Emitter<EmitterEventsWithStar<MyEvents>>();
670
+
671
+ const spy = jest.fn();
672
+
673
+ emitter.on("*", spy);
674
+ emitter.off("*", spy);
675
+
676
+ emitter.emit("someEvent", "someArg1", true, false);
677
+
678
+ expect(spy).toHaveBeenCalledTimes(0);
679
+ });
680
+ });
602
681
  });
package/tsconfig.json CHANGED
@@ -4,7 +4,8 @@
4
4
  "baseUrl": ".",
5
5
  "target": "es6",
6
6
  "lib": [
7
- "esnext"
7
+ "ESNext",
8
+ "DOM"
8
9
  ],
9
10
  "allowJs": false,
10
11
  "skipLibCheck": false,
@@ -12,6 +13,8 @@
12
13
  "pretty": true,
13
14
  "allowSyntheticDefaultImports": true,
14
15
  "forceConsistentCasingInFileNames": true,
16
+ "experimentalDecorators": true,
17
+ "emitDecoratorMetadata": true,
15
18
  "noEmit": false,
16
19
  "incremental": true,
17
20
  "esModuleInterop": true,
@@ -21,7 +24,10 @@
21
24
  "isolatedModules": true,
22
25
  "declaration": true,
23
26
  "inlineSourceMap": false,
24
- "types": ["node", "jest"]
27
+ "types": [
28
+ "node",
29
+ "jest"
30
+ ]
25
31
  },
26
32
  "include": [
27
33
  "src/**/*.ts",