@irrelon/emitter 5.0.6 → 6.0.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,5 +1,5 @@
1
1
  import assert from "assert";
2
- import {ConvertInterfaceToDict, Emitter, EventListenerCallback, EventReturnFlag} from "../src/Emitter";
2
+ import { Emitter, EmitterEventsInterface, EventListenerCallback, ListenerReturnFlag } from "../src/Emitter";
3
3
 
4
4
  let expectedAssertions = 0;
5
5
  let actualAssertions = 0;
@@ -33,14 +33,19 @@ describe("Emitter", () => {
33
33
  it("Creates emitter instance by instantiation", () => {
34
34
  const myClass = new Emitter();
35
35
 
36
- myClass.on("moo", () => {
37
- });
36
+ myClass.on("moo", () => {});
38
37
 
39
38
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listener registered on event");
40
39
 
41
40
  myClass.off("moo");
42
41
 
43
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners.moo["*"] || myClass._eventListeners.moo["*"].length, true, "Listeners all removed from event");
42
+ assert.strictEqual(
43
+ !myClass._eventListeners?.moo ||
44
+ !myClass._eventListeners.moo["*"] ||
45
+ myClass._eventListeners.moo["*"].length,
46
+ true,
47
+ "Listeners all removed from event"
48
+ );
44
49
  });
45
50
 
46
51
  it("Supports extending Emitter as a base class", () => {
@@ -52,8 +57,8 @@ describe("Emitter", () => {
52
57
  testFuncCount++;
53
58
  }
54
59
 
55
- on (eventName: string, id: string, listener: EventListenerCallback): this;
56
- on (eventName: string, listener: EventListenerCallback): this;
60
+ on(eventName: string, id: string, listener: EventListenerCallback): this;
61
+ on(eventName: string, listener: EventListenerCallback): this;
57
62
  on (eventName: string, ...rest: any[]): this {
58
63
  const restTypes = rest.map((arg) => typeof arg);
59
64
 
@@ -68,13 +73,13 @@ describe("Emitter", () => {
68
73
  }
69
74
 
70
75
  // @ts-ignore
71
- emit (eventName: string, ...rest: any[]): EventReturnFlag {
76
+ emit (eventName: string, ...rest: any[]) {
72
77
  return super.emitId(eventName, "^^noId", ...rest);
73
78
  }
74
79
 
75
- off (eventName: string, id: string, listener?: EventListenerCallback): this;
76
- off (eventName: string, listener?: EventListenerCallback): this;
77
- off (eventName: string): this;
80
+ off(eventName: string, id: string, listener?: EventListenerCallback): this;
81
+ off(eventName: string, listener?: EventListenerCallback): this;
82
+ off(eventName: string): this;
78
83
  off (eventName: string, ...rest: any[]) {
79
84
  let id = rest[0];
80
85
  let func = rest[1];
@@ -111,37 +116,61 @@ describe("Emitter", () => {
111
116
 
112
117
  myClass.off("moo", "testId");
113
118
 
114
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners?.moo["testId"] || myClass._eventListeners?.moo["testId"].length === 0, true, "Listeners all removed from event");
115
- assert.strictEqual(myClass._eventListeners?.moo && myClass._eventListeners?.moo["^^noId"] && myClass._eventListeners?.moo["^^noId"].length === 1, true, "Global listener still there");
116
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners?.moo["*"] || myClass._eventListeners?.moo["*"].length === 0, true, "Global listener still there");
119
+ assert.strictEqual(
120
+ !myClass._eventListeners?.moo ||
121
+ !myClass._eventListeners?.moo["testId"] ||
122
+ (myClass._eventListeners?.moo["testId"].length as number) === 0,
123
+ true,
124
+ "Listeners all removed from event"
125
+ );
126
+ assert.strictEqual(
127
+ myClass._eventListeners?.moo &&
128
+ myClass._eventListeners?.moo["^^noId"] &&
129
+ myClass._eventListeners?.moo["^^noId"].length === 1,
130
+ true,
131
+ "Global listener still there"
132
+ );
133
+ assert.strictEqual(
134
+ !myClass._eventListeners?.moo ||
135
+ !myClass._eventListeners?.moo["*"] ||
136
+ myClass._eventListeners?.moo["*"].length === 0,
137
+ true,
138
+ "Global listener still there"
139
+ );
117
140
 
118
141
  myClass.off("moo");
119
142
 
120
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners?.moo["*"] || myClass._eventListeners?.moo["*"].length === 0, true, "Listeners all removed from event");
143
+ assert.strictEqual(
144
+ !myClass._eventListeners?.moo ||
145
+ !myClass._eventListeners?.moo["*"] ||
146
+ myClass._eventListeners?.moo["*"].length === 0,
147
+ true,
148
+ "Listeners all removed from event"
149
+ );
121
150
  });
122
151
  });
123
152
 
124
153
  describe("emit()", () => {
125
154
  it("Supports type safe usage", async () => {
126
155
  interface MyEventsResponses {
127
- post: () => void;
128
- person: (name: string, age: number, enabled: boolean) => void;
156
+ post: () => Promise<void>;
157
+ person: (name: string, age: number, enabled: boolean) => Promise<string>;
129
158
  house: (no: number, street: string, postcode: string, enabled: boolean) => void;
130
159
  }
131
160
 
132
- const emitter = new Emitter<ConvertInterfaceToDict<MyEventsResponses>>();
161
+ const emitter = new Emitter<MyEventsResponses>();
133
162
  let listenerFiredCount = 0;
134
163
 
135
- emitter.on("person", async (name, age, enabled) => {
136
- return new Promise<void>((resolve) => {
164
+ emitter.on("person", (name) => {
165
+ return new Promise<string>((resolve) => {
137
166
  setTimeout(() => {
138
167
  listenerFiredCount++;
139
- resolve();
168
+ resolve(name);
140
169
  }, 1000);
141
170
  });
142
171
  });
143
172
 
144
- emitter.on("post", async () => {
173
+ emitter.on("post", () => {
145
174
  return new Promise<void>((resolve) => {
146
175
  setTimeout(() => {
147
176
  listenerFiredCount++;
@@ -150,7 +179,7 @@ describe("Emitter", () => {
150
179
  });
151
180
  });
152
181
 
153
- emitter.on("post", async () => {
182
+ emitter.on("post", () => {
154
183
  return new Promise<void>((resolve) => {
155
184
  setTimeout(() => {
156
185
  listenerFiredCount++;
@@ -160,14 +189,22 @@ describe("Emitter", () => {
160
189
  });
161
190
 
162
191
  const time = new Date().getTime();
163
- await emitter.emit("post");
192
+ await Promise.all(emitter.emit("post"));
164
193
  const delta = new Date().getTime() - time;
165
194
 
166
195
  assert.ok(delta > 900, `Delta was not correct, await may not have paused? Delta was: ${delta}`);
196
+ assert.ok(
197
+ listenerFiredCount === 2,
198
+ `listenerFiredCount was not correct, await may not have paused? listenerFiredCount was: ${listenerFiredCount}`
199
+ );
167
200
  });
168
201
 
169
202
  it("Supports awaiting async listeners", async () => {
170
- const emitter = new Emitter();
203
+ interface TestEvents {
204
+ foo: () => Promise<void>;
205
+ }
206
+
207
+ const emitter = new Emitter<EmitterEventsInterface<TestEvents>>();
171
208
  let listenerFiredCount = 0;
172
209
 
173
210
  emitter.on("foo", async () => {
@@ -189,26 +226,91 @@ describe("Emitter", () => {
189
226
  });
190
227
 
191
228
  const time = new Date().getTime();
192
- await emitter.emit("foo");
229
+ await Promise.all(emitter.emit("foo"));
230
+ const delta = new Date().getTime() - time;
231
+
232
+ assert.ok(delta > 900, "Delta was not correct, await may not have paused?");
233
+ });
234
+
235
+ it("Supports awaiting async and non-async listener return data", async () => {
236
+ interface MyTestEvents {
237
+ foo: () => string | Promise<string>;
238
+ }
239
+
240
+ const emitter = new Emitter<EmitterEventsInterface<MyTestEvents>>();
241
+ let listenerFiredCount = 0;
242
+
243
+ emitter.on("foo", () => {
244
+ return new Promise<string>((resolve) => {
245
+ setTimeout(() => {
246
+ listenerFiredCount++;
247
+ resolve("Foo1 Return Value");
248
+ }, 1000);
249
+ });
250
+ });
251
+
252
+ emitter.on("foo", () => {
253
+ return "Foo2 Return Value";
254
+ });
255
+
256
+ const time = new Date().getTime();
257
+ const results: string[] = await Promise.all(emitter.emit("foo"));
193
258
  const delta = new Date().getTime() - time;
194
259
 
195
260
  assert.ok(delta > 900, "Delta was not correct, await may not have paused?");
261
+ assert.ok(listenerFiredCount === 1, "listenerFiredCount was not correct, await may not have been used?");
262
+ assert.strictEqual(results[0], "Foo1 Return Value", "Return data for foo1 was not correct");
263
+ assert.strictEqual(results[1], "Foo2 Return Value", "Return data for foo2 was not correct");
264
+ });
265
+
266
+ it("Supports responding with a cancellation signal", async () => {
267
+ interface MyTestEvents {
268
+ foo: () => string | ListenerReturnFlag;
269
+ }
270
+
271
+ const emitter = new Emitter<EmitterEventsInterface<MyTestEvents>>();
272
+ let listenerFiredCount = 0;
273
+
274
+ emitter.on("foo", () => {
275
+ listenerFiredCount++;
276
+ return "Foo1 Return Value";
277
+ });
278
+
279
+ emitter.on("foo", () => {
280
+ listenerFiredCount++;
281
+
282
+ // This listener will respond with a cancellation, this should terminate further listener calls
283
+ return ListenerReturnFlag.cancel;
284
+ });
285
+
286
+ emitter.on("foo", () => {
287
+ listenerFiredCount++;
288
+ return "Foo3 Return Value";
289
+ });
290
+
291
+ emitter.on("foo", () => {
292
+ listenerFiredCount++;
293
+ return "Foo4 Return Value";
294
+ });
295
+
296
+ const results = emitter.emit("foo");
297
+
298
+ assert.ok(listenerFiredCount === 2, "listenerFiredCount was not correct, await may not have been used?");
299
+ assert.strictEqual(results[0], "Foo1 Return Value", "Return data should be a cancel flag");
300
+ assert.strictEqual(results[1], ListenerReturnFlag.cancel, "Return data should be a cancel flag");
301
+ assert.ok(emitter.didCancel(results), "didCancel should detect a cancel flag");
196
302
  });
197
303
  });
198
304
 
199
305
  describe("off()", () => {
200
306
  it("Cancels all listeners (event)", () => {
201
307
  const myClass = new Emitter();
202
- const listener1 = () => {
203
- };
204
- const listener2 = () => {
205
- };
308
+ const listener1 = () => {};
309
+ const listener2 = () => {};
206
310
 
207
- myClass.on("moo", () => {
208
- });
311
+ myClass.on("moo", () => {});
209
312
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
210
- myClass.on("moo", "testId", () => {
211
- });
313
+ myClass.on("moo", "testId", () => {});
212
314
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
213
315
  myClass.on("moo", listener1);
214
316
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -217,21 +319,23 @@ describe("Emitter", () => {
217
319
 
218
320
  myClass.off("moo");
219
321
 
220
- assert.strictEqual(!myClass._eventListeners?.moo || (myClass._eventListeners?.moo["*"].length === 0 && myClass._eventListeners?.moo["testId"].length === 0), true, "Listeners all removed from event");
322
+ assert.strictEqual(
323
+ !myClass._eventListeners?.moo ||
324
+ (myClass._eventListeners?.moo["*"].length === 0 &&
325
+ myClass._eventListeners?.moo["testId"].length === 0),
326
+ true,
327
+ "Listeners all removed from event"
328
+ );
221
329
  });
222
330
 
223
331
  it("Cancels id-based listeners (event, id)", () => {
224
332
  const myClass = new Emitter();
225
- const listener1 = () => {
226
- };
227
- const listener2 = () => {
228
- };
333
+ const listener1 = () => {};
334
+ const listener2 = () => {};
229
335
 
230
- myClass.on("moo", () => {
231
- });
336
+ myClass.on("moo", () => {});
232
337
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
233
- myClass.on("moo", "testId", () => {
234
- });
338
+ myClass.on("moo", "testId", () => {});
235
339
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
236
340
  myClass.on("moo", listener1);
237
341
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -240,22 +344,26 @@ describe("Emitter", () => {
240
344
 
241
345
  myClass.off("moo", "testId");
242
346
 
243
- assert.strictEqual(myClass._eventListeners?.moo["*"].length === 2, true, "Listeners all removed from event");
244
- assert.strictEqual(!myClass._eventListeners?.moo["testId"] || myClass._eventListeners?.moo["testId"].length === 0, true, "Listeners all removed from event");
347
+ assert.strictEqual(
348
+ myClass._eventListeners?.moo["*"].length === 2,
349
+ true,
350
+ "Listeners all removed from event"
351
+ );
352
+ assert.strictEqual(
353
+ !myClass._eventListeners?.moo["testId"] || myClass._eventListeners?.moo["testId"].length === 0,
354
+ true,
355
+ "Listeners all removed from event"
356
+ );
245
357
  });
246
358
 
247
359
  it("Cancels listener-based listeners (event, listener)", () => {
248
360
  const myClass = new Emitter();
249
- const listener1 = () => {
250
- };
251
- const listener2 = () => {
252
- };
361
+ const listener1 = () => {};
362
+ const listener2 = () => {};
253
363
 
254
- myClass.on("moo", () => {
255
- });
364
+ myClass.on("moo", () => {});
256
365
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
257
- myClass.on("moo", "testId", () => {
258
- });
366
+ myClass.on("moo", "testId", () => {});
259
367
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
260
368
  myClass.on("moo", listener1);
261
369
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -264,22 +372,26 @@ describe("Emitter", () => {
264
372
 
265
373
  myClass.off("moo", listener1);
266
374
 
267
- assert.strictEqual(myClass._eventListeners?.moo["*"].length === 1, true, "Listeners all removed from event");
268
- assert.strictEqual(myClass._eventListeners?.moo["testId"].length === 2, true, "Listeners all removed from event");
375
+ assert.strictEqual(
376
+ myClass._eventListeners?.moo["*"].length === 1,
377
+ true,
378
+ "Listeners all removed from event"
379
+ );
380
+ assert.strictEqual(
381
+ myClass._eventListeners?.moo["testId"].length === 2,
382
+ true,
383
+ "Listeners all removed from event"
384
+ );
269
385
  });
270
386
 
271
387
  it("Cancels id-based + listener-based listeners (event, id, listener)", () => {
272
388
  const myClass = new Emitter();
273
- const listener1 = () => {
274
- };
275
- const listener2 = () => {
276
- };
389
+ const listener1 = () => {};
390
+ const listener2 = () => {};
277
391
 
278
- myClass.on("moo", () => {
279
- });
392
+ myClass.on("moo", () => {});
280
393
  assert.strictEqual(myClass._eventListeners?.moo!["*"].length, 1, "Listeners registered on event");
281
- myClass.on("moo", "testId", () => {
282
- });
394
+ myClass.on("moo", "testId", () => {});
283
395
  assert.strictEqual(myClass._eventListeners?.moo["testId"].length, 1, "Listeners registered on event");
284
396
  myClass.on("moo", listener1);
285
397
  assert.strictEqual(myClass._eventListeners?.moo["*"].length, 2, "Listeners registered on event");
@@ -288,15 +400,22 @@ describe("Emitter", () => {
288
400
 
289
401
  myClass.off("moo", "testId", listener2);
290
402
 
291
- assert.strictEqual(myClass._eventListeners?.moo["*"].length === 2, true, "Listeners all removed from event");
292
- assert.strictEqual(myClass._eventListeners?.moo["testId"].length === 1, true, "Listeners all removed from event");
403
+ assert.strictEqual(
404
+ myClass._eventListeners?.moo["*"].length === 2,
405
+ true,
406
+ "Listeners all removed from event"
407
+ );
408
+ assert.strictEqual(
409
+ myClass._eventListeners?.moo["testId"].length === 1,
410
+ true,
411
+ "Listeners all removed from event"
412
+ );
293
413
  });
294
414
  });
295
415
 
296
416
  describe("emitStatic()", () => {
297
417
  it("Static emitter will emit when a new listener is added", (resolve) => {
298
- class MyClass extends Emitter {
299
- }
418
+ class MyClass extends Emitter {}
300
419
 
301
420
  expect(1);
302
421
 
@@ -312,8 +431,7 @@ describe("Emitter", () => {
312
431
 
313
432
  describe("cancelStatic()", () => {
314
433
  it("Removes static emitter", (resolve) => {
315
- class MyClass extends Emitter {
316
- }
434
+ class MyClass extends Emitter {}
317
435
 
318
436
  expect(1);
319
437
 
@@ -338,8 +456,7 @@ describe("Emitter", () => {
338
456
 
339
457
  describe("overwrite()", () => {
340
458
  it("Only fires the last listener added, cancelling all other listeners before it", (resolve) => {
341
- class MyClass extends Emitter {
342
- }
459
+ class MyClass extends Emitter {}
343
460
 
344
461
  expect(1);
345
462
 
@@ -364,8 +481,7 @@ describe("Emitter", () => {
364
481
  });
365
482
 
366
483
  it("Only fires the last listener added (with id), cancelling all other listeners before it", (resolve) => {
367
- class MyClass extends Emitter {
368
- }
484
+ class MyClass extends Emitter {}
369
485
 
370
486
  expect(2);
371
487
 
@@ -424,12 +540,30 @@ describe("Emitter", () => {
424
540
 
425
541
  myClass.off("moo", "testId");
426
542
 
427
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners?.moo["testId"] || myClass._eventListeners?.moo["testId"].length, true, "Listeners all removed from event");
428
- assert.strictEqual(myClass._eventListeners?.moo && myClass._eventListeners?.moo["*"] && myClass._eventListeners?.moo["*"].length === 1, true, "Global listener still there");
543
+ assert.strictEqual(
544
+ !myClass._eventListeners?.moo ||
545
+ !myClass._eventListeners?.moo["testId"] ||
546
+ myClass._eventListeners?.moo["testId"].length,
547
+ true,
548
+ "Listeners all removed from event"
549
+ );
550
+ assert.strictEqual(
551
+ myClass._eventListeners?.moo &&
552
+ myClass._eventListeners?.moo["*"] &&
553
+ myClass._eventListeners?.moo["*"].length === 1,
554
+ true,
555
+ "Global listener still there"
556
+ );
429
557
 
430
558
  myClass.off("moo");
431
559
 
432
- assert.strictEqual(!myClass._eventListeners?.moo || !myClass._eventListeners?.moo["*"] || myClass._eventListeners?.moo["*"].length === 0, true, "Listeners all removed from event");
560
+ assert.strictEqual(
561
+ !myClass._eventListeners?.moo ||
562
+ !myClass._eventListeners?.moo["*"] ||
563
+ myClass._eventListeners?.moo["*"].length === 0,
564
+ true,
565
+ "Listeners all removed from event"
566
+ );
433
567
  });
434
568
  });
435
- });
569
+ });
package/tsconfig-cjs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "./tsconfig-base.json",
2
+ "extends": "./tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "module": "commonjs",
5
5
  "outDir": "dist/cjs",
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "esnext",
5
+ "outDir": "dist/esm",
6
+ "target": "esnext"
7
+ }
8
+ }
package/tsconfig.json CHANGED
@@ -1,8 +1,36 @@
1
1
  {
2
- "extends": "./tsconfig-base.json",
3
2
  "compilerOptions": {
4
- "module": "esnext",
5
- "outDir": "dist/mjs",
6
- "target": "esnext"
7
- }
3
+ "downlevelIteration": true,
4
+ "baseUrl": ".",
5
+ "target": "es6",
6
+ "lib": [
7
+ "esnext"
8
+ ],
9
+ "allowJs": false,
10
+ "skipLibCheck": false,
11
+ "strict": true,
12
+ "pretty": true,
13
+ "allowSyntheticDefaultImports": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "noEmit": false,
16
+ "incremental": true,
17
+ "esModuleInterop": true,
18
+ "module": "es2022",
19
+ "moduleResolution": "node",
20
+ "resolveJsonModule": true,
21
+ "isolatedModules": true,
22
+ "declaration": true,
23
+ "inlineSourceMap": false,
24
+ "types": ["node", "jest"]
25
+ },
26
+ "include": [
27
+ "src/**/*.ts",
28
+ "tests/*.ts",
29
+ "tests/**/*.ts",
30
+ "src/**/*.tsx"
31
+ ],
32
+ "exclude": [
33
+ "node_modules",
34
+ "dist"
35
+ ]
8
36
  }
@@ -1,36 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "downlevelIteration": true,
4
- "baseUrl": ".",
5
- "target": "es6",
6
- "lib": [
7
- "esnext"
8
- ],
9
- "allowJs": false,
10
- "skipLibCheck": false,
11
- "strict": true,
12
- "pretty": true,
13
- "allowSyntheticDefaultImports": true,
14
- "forceConsistentCasingInFileNames": true,
15
- "noEmit": false,
16
- "incremental": true,
17
- "esModuleInterop": true,
18
- "module": "es2022",
19
- "moduleResolution": "node",
20
- "resolveJsonModule": true,
21
- "isolatedModules": true,
22
- "declaration": true,
23
- "inlineSourceMap": false,
24
- "types": ["node", "jest"]
25
- },
26
- "include": [
27
- "src/**/*.ts",
28
- "tests/*.ts",
29
- "tests/**/*.ts",
30
- "src/**/*.tsx"
31
- ],
32
- "exclude": [
33
- "node_modules",
34
- "dist"
35
- ]
36
- }
File without changes
File without changes
File without changes