@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.
- package/.editorconfig +4 -7
- package/dist/cjs/src/Emitter.d.ts +51 -14
- package/dist/cjs/src/Emitter.js +83 -29
- package/dist/cjs/tests/Emitter.test.js +77 -30
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/esm/src/Emitter.d.ts +51 -14
- package/dist/esm/src/Emitter.js +83 -26
- package/dist/esm/tests/Emitter.test.js +77 -30
- package/dist/esm/tsconfig-esm.tsbuildinfo +1 -1
- package/doc/Emitter.html +451 -1551
- package/doc/Emitter.js.html +601 -850
- package/doc/index.html +1 -1
- package/doc/scripts/linenumber.js +9 -9
- package/doc/styles/jsdoc-default.css +2 -2
- package/eslint.config.mjs +42 -0
- package/jest.config.js +7 -0
- package/package.json +18 -27
- package/readme.md +10 -1
- package/src/Emitter.d.ts +290 -0
- package/src/Emitter.js +600 -0
- package/src/Emitter.ts +167 -161
- package/tests/Emitter.test.d.ts +1 -0
- package/tests/Emitter.test.js +472 -0
- package/tests/Emitter.test.ts +143 -64
- package/tsconfig.json +8 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/.prettierrc.yml +0 -26
- package/doc/deferEmit.html +0 -258
- package/doc/emitStatic.html +0 -444
- package/doc/emitStaticId.html +0 -685
- package/doc/global.html +0 -991
- package/doc/global.html#emit +0 -442
- package/doc/off.html +0 -857
- package/doc/on.html +0 -453
- package/doc/once.html +0 -453
- package/doc/willEmit.html +0 -234
- package/doc/willEmitId.html +0 -257
- /package/{.eslintrc.json → eslint.json} +0 -0
package/tests/Emitter.test.ts
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
1
2
|
import assert from "assert";
|
|
2
|
-
import {
|
|
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
|
|
14
|
+
function expectAssertionCount (val: number) {
|
|
8
15
|
expectedAssertions = val;
|
|
9
16
|
}
|
|
10
17
|
|
|
11
|
-
function
|
|
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
|
|
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(
|
|
29
|
-
afterEach(
|
|
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
|
-
|
|
45
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
122
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
136
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
358
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
579
|
-
|
|
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
|
-
|
|
586
|
-
|
|
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
|
-
|
|
596
|
-
|
|
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
|
-
"
|
|
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": [
|
|
27
|
+
"types": [
|
|
28
|
+
"node",
|
|
29
|
+
"jest"
|
|
30
|
+
]
|
|
25
31
|
},
|
|
26
32
|
"include": [
|
|
27
33
|
"src/**/*.ts",
|