@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.
- package/.editorconfig +1 -1
- package/.eslintignore +3 -1
- package/.eslintrc.json +17 -56
- package/dist/Emitter.d.ts +205 -0
- package/dist/Emitter.js +339 -777
- package/package.json +54 -50
- package/readme.md +44 -11
- package/src/Emitter.ts +672 -0
- package/tests/Emitter.test.js +277 -110
- package/tsconfig.json +29 -0
- package/src/Emitter.js +0 -884
package/tests/Emitter.test.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const {
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
+
}
|