@irrelon/emitter 3.0.0 → 5.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,4 @@
1
- const {beforeEach, afterEach, describe, it} = require("mocha");
2
- const Emitter = require("../dist/Emitter");
1
+ const {Emitter, makeEmitter} = require("../dist/Emitter");
3
2
  const assert = require("assert");
4
3
 
5
4
  let expectedAssertions = 0;
@@ -22,131 +21,299 @@ function check () {
22
21
  if (expectedAssertions === undefined || expectedAssertions === actualAssertions) {
23
22
  return;
24
23
  }
25
- const err = new Error("expected " + expectedAssertions + " assertions, got " + actualAssertions);
26
- this.currentTest.emit("error", err);
24
+ throw new Error("expected " + expectedAssertions + " assertions, got " + actualAssertions);
27
25
  }
28
26
 
29
27
  beforeEach(reset);
30
28
  afterEach(check);
31
29
 
32
30
  describe("Emitter", () => {
33
- it("Creates emitter instance by instantiation", () => {
34
- const myClass = new Emitter();
35
-
36
- myClass.on("moo", () => {
31
+ describe("new Emitter()", () => {
32
+ it("Creates emitter instance by instantiation", () => {
33
+ const myClass = new Emitter();
34
+
35
+ myClass.on("moo", () => {
36
+ });
37
+
38
+ assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listener registered on event");
39
+
40
+ myClass.off("moo");
41
+
42
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["*"] || myClass._listeners.moo["*"].length, true, "Listeners all removed from event");
37
43
  });
38
-
39
- assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listener registered on event");
40
-
41
- myClass.off("moo");
42
-
43
- assert.strictEqual(!myClass._listeners.moo || myClass._listeners.moo["*"].length, true, "Listeners all removed from event");
44
- });
45
-
46
- it("Emitter.off() removes all listeners from an event", () => {
47
- const MyClass = function () {
48
- };
49
-
50
- Emitter(MyClass);
51
-
52
- const myClass = new MyClass();
53
-
54
- myClass.on("moo", () => {
44
+
45
+ it("Augments an object passed to makeEmitter()", (resolve) => {
46
+ const obj = {
47
+ "someExistingProp": "hello"
48
+ };
49
+ makeEmitter(obj);
50
+
51
+ function test () {
52
+ assert.strictEqual(this.someExistingProp, "hello", "Able to access object props via `this`");
53
+ assert.strictEqual(obj._listeners.moo["*"].length, 1, "Listener registered on event");
54
+
55
+ resolve();
56
+ }
57
+
58
+ obj.on("moo", test);
59
+
60
+ obj.emit("moo");
61
+
62
+ obj.off("moo");
63
+
64
+ assert.strictEqual(!obj._listeners.moo || !obj._listeners.moo["*"] || obj._listeners.moo["*"].length, true, "Listeners all removed from event");
55
65
  });
56
-
57
- assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listener registered on event");
58
-
59
- myClass.off("moo");
60
-
61
- assert.strictEqual(!myClass._listeners.moo || myClass._listeners.moo["*"].length, true, true, "Listeners all removed from event");
62
- });
63
-
64
- it("Emitter.emitStatic() static emitter works", (resolve) => {
65
- const MyClass = function () {
66
- };
67
-
68
- expect(1);
69
-
70
- Emitter(MyClass);
71
-
72
- const myClass = new MyClass();
73
- myClass.emitStatic("moo");
74
- myClass.on("moo", () => {
75
- countAssertion();
76
- assert.ok(true, "Callback was fired");
77
- resolve();
66
+
67
+ it("Supports extending Emitter as a base class", () => {
68
+ let testFuncCount = 0;
69
+
70
+ // Test extending Emitter and modifying base functionality
71
+ class MyClass extends Emitter {
72
+ testFunc () {
73
+ testFuncCount++;
74
+ }
75
+
76
+ on (event, id, listener) {
77
+ if (typeof id === "function") {
78
+ listener = id;
79
+ id = "^^noId";
80
+ }
81
+
82
+ super.on(event, id, listener);
83
+ }
84
+
85
+ emit (event, ...rest) {
86
+ super.emitId(event, "^^noId", ...rest);
87
+ }
88
+
89
+ off (event, id, func) {
90
+ if (typeof id === "function") {
91
+ func = id;
92
+ id = "^^noId";
93
+ } else if (typeof id === "undefined") {
94
+ id = "^^noId";
95
+ }
96
+
97
+ super.off(event, id, func);
98
+ }
99
+ }
100
+
101
+ const myClass = new MyClass();
102
+ let emitCount = 0;
103
+
104
+ // Register id-based listener
105
+ myClass.on("moo", "testId", () => {
106
+ emitCount++;
107
+ });
108
+
109
+ // Register non-id-based listener
110
+ myClass.on("moo", () => {
111
+ emitCount++;
112
+ });
113
+
114
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listener registered on event");
115
+
116
+ myClass.emitId("moo", "testId", "foo");
117
+
118
+ assert.strictEqual(emitCount, 1, "Event fired correctly");
119
+
120
+ myClass.off("moo", "testId");
121
+
122
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["testId"] || myClass._listeners.moo["testId"].length === 0, true, "Listeners all removed from event");
123
+ assert.strictEqual(myClass._listeners.moo && myClass._listeners.moo["^^noId"] && myClass._listeners.moo["^^noId"].length === 1, true, "Global listener still there");
124
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["*"] || myClass._listeners.moo["*"].length === 0, true, "Global listener still there");
125
+
126
+ myClass.off("moo");
127
+
128
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["*"] || myClass._listeners.moo["*"].length === 0, true, "Listeners all removed from event");
78
129
  });
79
130
  });
80
-
81
- it("Emitter.cancelStatic() removes static emitter", (resolve) => {
82
- const MyClass = function () {
83
- };
84
-
85
- expect(1);
86
-
87
- Emitter(MyClass);
88
-
89
- const myClass = new MyClass();
90
- myClass.emitStatic("moo");
91
- myClass.on("moo", () => {
92
- countAssertion();
93
- assert.ok(true, "Callback was fired");
131
+
132
+ describe("off()", () => {
133
+ it("Cancels all listeners (event)", () => {
134
+ const myClass = new Emitter();
135
+ const listener1 = () => {};
136
+ const listener2 = () => {};
137
+
138
+ myClass.on("moo", () => {});
139
+ assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listeners registered on event");
140
+ myClass.on("moo", "testId", () => {});
141
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listeners registered on event");
142
+ myClass.on("moo", listener1);
143
+ assert.strictEqual(myClass._listeners.moo["*"].length, 2, "Listeners registered on event");
144
+ myClass.on("moo", "testId", listener2);
145
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 2, "Listeners registered on event");
146
+
147
+ myClass.off("moo");
148
+
149
+ assert.strictEqual(!myClass._listeners.moo || (myClass._listeners.moo["*"].length === 0 && myClass._listeners.moo["testId"].length === 0), true, "Listeners all removed from event");
150
+ });
151
+
152
+ it("Cancels id-based listeners (event, id)", () => {
153
+ const myClass = new Emitter();
154
+ const listener1 = () => {};
155
+ const listener2 = () => {};
156
+
157
+ myClass.on("moo", () => {});
158
+ assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listeners registered on event");
159
+ myClass.on("moo", "testId", () => {});
160
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listeners registered on event");
161
+ myClass.on("moo", listener1);
162
+ assert.strictEqual(myClass._listeners.moo["*"].length, 2, "Listeners registered on event");
163
+ myClass.on("moo", "testId", listener2);
164
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 2, "Listeners registered on event");
165
+
166
+ myClass.off("moo", "testId");
167
+
168
+ assert.strictEqual(myClass._listeners.moo["*"].length === 2, true, "Listeners all removed from event");
169
+ assert.strictEqual(!myClass._listeners.moo["testId"] || myClass._listeners.moo["testId"].length === 0, true, "Listeners all removed from event");
94
170
  });
95
-
96
- myClass.cancelStatic("moo");
97
- myClass.on("moo", () => {
98
- countAssertion();
99
- assert.ok(false, "Callback was fired");
171
+
172
+ it("Cancels listener-based listeners (event, listener)", () => {
173
+ const myClass = new Emitter();
174
+ const listener1 = () => {};
175
+ const listener2 = () => {};
176
+
177
+ myClass.on("moo", () => {});
178
+ assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listeners registered on event");
179
+ myClass.on("moo", "testId", () => {});
180
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listeners registered on event");
181
+ myClass.on("moo", listener1);
182
+ assert.strictEqual(myClass._listeners.moo["*"].length, 2, "Listeners registered on event");
183
+ myClass.on("moo", "testId", listener2);
184
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 2, "Listeners registered on event");
185
+
186
+ myClass.off("moo", listener1);
187
+
188
+ assert.strictEqual(myClass._listeners.moo["*"].length === 1, true, "Listeners all removed from event");
189
+ assert.strictEqual(myClass._listeners.moo["testId"].length === 2, true, "Listeners all removed from event");
190
+ });
191
+
192
+ it("Cancels id-based + listener-based listeners (event, id, listener)", () => {
193
+ const myClass = new Emitter();
194
+ const listener1 = () => {};
195
+ const listener2 = () => {};
196
+
197
+ myClass.on("moo", () => {});
198
+ assert.strictEqual(myClass._listeners.moo["*"].length, 1, "Listeners registered on event");
199
+ myClass.on("moo", "testId", () => {});
200
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listeners registered on event");
201
+ myClass.on("moo", listener1);
202
+ assert.strictEqual(myClass._listeners.moo["*"].length, 2, "Listeners registered on event");
203
+ myClass.on("moo", "testId", listener2);
204
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 2, "Listeners registered on event");
205
+
206
+ myClass.off("moo", "testId", listener2);
207
+
208
+ assert.strictEqual(myClass._listeners.moo["*"].length === 2, true, "Listeners all removed from event");
209
+ assert.strictEqual(myClass._listeners.moo["testId"].length === 1, true, "Listeners all removed from event");
100
210
  });
101
-
102
- setTimeout(() => {
103
- resolve();
104
- }, 10);
105
211
  });
106
-
107
- it("Emitter.one() only fires the last listener added, cancelling all other listeners before it", (resolve) => {
108
- const MyClass = function () {
109
- };
110
- expect(1);
111
-
112
- Emitter(MyClass);
113
-
114
- const myClass = new MyClass();
115
- myClass.on("moo", () => {
116
- countAssertion();
117
- assert.ok(false, "Correct callback was fired");
212
+
213
+ describe("emitStatic()", () => {
214
+ it("Static emitter will emit when a new listener is added", (resolve) => {
215
+ const MyClass = function () {};
216
+
217
+ expect(1);
218
+
219
+ makeEmitter(MyClass.prototype);
220
+
221
+ const myClass = new MyClass();
222
+ myClass.emitStatic("moo");
223
+ myClass.on("moo", () => {
224
+ countAssertion();
225
+ assert.ok(true, "Callback was fired");
226
+ resolve();
227
+ });
118
228
  });
119
- myClass.on("moo", () => {
120
- countAssertion();
121
- assert.ok(false, "Correct callback was fired");
229
+ });
230
+
231
+ describe("cancelStatic()", () => {
232
+ it("Removes static emitter", (resolve) => {
233
+ const MyClass = function () {
234
+ };
235
+
236
+ expect(1);
237
+
238
+ makeEmitter(MyClass.prototype);
239
+
240
+ const myClass = new MyClass();
241
+ myClass.emitStatic("moo");
242
+ myClass.on("moo", () => {
243
+ countAssertion();
244
+ assert.ok(true, "Callback was fired");
245
+ });
246
+
247
+ myClass.cancelStatic("moo");
248
+ myClass.on("moo", () => {
249
+ countAssertion();
250
+ assert.ok(false, "Callback was fired");
251
+ });
252
+
253
+ setTimeout(() => {
254
+ resolve();
255
+ }, 10);
122
256
  });
123
- myClass.one("moo", () => {
124
- countAssertion();
125
- assert.ok(true, "Correct callback was fired");
257
+ });
258
+
259
+ describe("one()", () => {
260
+ it("Only fires the last listener added, cancelling all other listeners before it", (resolve) => {
261
+ const MyClass = function () {
262
+ };
263
+ expect(1);
264
+
265
+ makeEmitter(MyClass.prototype);
266
+
267
+ const myClass = new MyClass();
268
+ myClass.on("moo", () => {
269
+ countAssertion();
270
+ assert.ok(false, "Correct callback was fired");
271
+ });
272
+ myClass.on("moo", () => {
273
+ countAssertion();
274
+ assert.ok(false, "Correct callback was fired");
275
+ });
276
+ myClass.one("moo", () => {
277
+ countAssertion();
278
+ assert.ok(true, "Correct callback was fired");
279
+ });
280
+ myClass.emit("moo");
281
+
282
+ setTimeout(() => {
283
+ resolve();
284
+ }, 10);
126
285
  });
127
- myClass.emit("moo");
128
-
129
- setTimeout(() => {
130
- resolve();
131
- }, 10);
132
286
  });
133
-
134
- it("Fires an event correctly using emitId()", () => {
135
- const myClass = new Emitter();
136
- let emitCount = 0;
137
-
138
- myClass.on("moo", "testId", () => {
139
- emitCount++;
287
+
288
+ describe("emitId()", () => {
289
+ it("Fires an id-based event first followed by a global event", () => {
290
+ const myClass = new Emitter();
291
+ let emitCount = 0;
292
+
293
+ // Register id-based listener
294
+ myClass.on("moo", "testId", () => {
295
+ emitCount++;
296
+ });
297
+
298
+ // Register non-id-based listener
299
+ myClass.on("moo", () => {
300
+ emitCount++;
301
+ });
302
+
303
+ assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listener registered on event");
304
+
305
+ myClass.emitId("moo", "testId", "foo");
306
+
307
+ assert.strictEqual(emitCount, 2, "Event fired correctly");
308
+
309
+ myClass.off("moo", "testId");
310
+
311
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["testId"] || myClass._listeners.moo["testId"].length, true, "Listeners all removed from event");
312
+ assert.strictEqual(myClass._listeners.moo && myClass._listeners.moo["*"] && myClass._listeners.moo["*"].length === 1, true, "Global listener still there");
313
+
314
+ myClass.off("moo");
315
+
316
+ assert.strictEqual(!myClass._listeners.moo || !myClass._listeners.moo["*"] || myClass._listeners.moo["*"].length === 0, true, "Listeners all removed from event");
140
317
  });
141
-
142
- assert.strictEqual(myClass._listeners.moo["testId"].length, 1, "Listener registered on event");
143
-
144
- myClass.emitId("moo", "testId", "foo");
145
-
146
- assert.strictEqual(emitCount, 1, "Event fired correctly");
147
-
148
- myClass.off("moo", "testId");
149
-
150
- assert.strictEqual(!myClass._listeners.moo["testId"] || myClass._listeners.moo["testId"].length, true, "Listeners all removed from event");
151
318
  });
152
319
  });
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2015",
4
+ "module": "CommonJS",
5
+ "lib": [
6
+ "dom",
7
+ "dom.iterable",
8
+ "esnext"
9
+ ],
10
+ "allowJs": false,
11
+ "skipLibCheck": true,
12
+ "esModuleInterop": true,
13
+ "allowSyntheticDefaultImports": true,
14
+ "strict": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "suppressImplicitAnyIndexErrors": true,
17
+ "noFallthroughCasesInSwitch": false,
18
+ "moduleResolution": "node",
19
+ "resolveJsonModule": true,
20
+ "isolatedModules": true,
21
+ "noEmit": false,
22
+ "jsx": "react-jsx",
23
+ "outDir": "dist",
24
+ "declaration": true
25
+ },
26
+ "include": [
27
+ "src"
28
+ ]
29
+ }