evnty 2.1.96 → 2.1.98

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "evnty",
3
3
  "description": "0-Deps, simple, fast, for browser and node js reactive anonymous event library",
4
- "version": "2.1.96",
4
+ "version": "2.1.98",
5
5
  "type": "module",
6
6
  "types": "build/index.d.ts",
7
7
  "main": "build/index.cjs",
@@ -58,7 +58,7 @@
58
58
  "devDependencies": {
59
59
  "@swc/jest": "^0.2.36",
60
60
  "@types/jest": "^29.5.12",
61
- "@types/node": "^20.12.4",
61
+ "@types/node": "^20.12.5",
62
62
  "@typescript-eslint/eslint-plugin": "^7.5.0",
63
63
  "@typescript-eslint/parser": "^7.5.0",
64
64
  "eslint": "^8.57.0",
@@ -67,7 +67,7 @@
67
67
  "eslint-plugin-import": "^2.29.1",
68
68
  "eslint-plugin-prettier": "^5.1.3",
69
69
  "husky": "^9.0.11",
70
- "inop": "^0.5.5",
70
+ "inop": "^0.5.7",
71
71
  "jest": "^29.7.0",
72
72
  "prettier": "^3.2.5",
73
73
  "typescript": "^5.4.4"
@@ -1,404 +0,0 @@
1
- import createEvent, { merge, createInterval, Event, Dismiss, FunctionExt, EventHandler, FilterFunction, Predicate } from '../index';
2
-
3
- describe('Anonymous Event test suite', () => {
4
- test('FunctionExt extends from Function', () => {
5
- expect(FunctionExt.prototype).toBeInstanceOf(Function);
6
- });
7
-
8
- test('Dismiss extends from FunctionExt', () => {
9
- expect(Dismiss.prototype).toBeInstanceOf(FunctionExt);
10
- });
11
-
12
- test('Event extends from FunctionExt', () => {
13
- expect(Event.prototype).toBeInstanceOf(FunctionExt);
14
- });
15
-
16
- it('Should be instantiable', () => {
17
- expect(() => new Event()).not.toThrow();
18
- });
19
-
20
- it('Should be instantiable', () => {
21
- expect(() => createEvent<[number]>()).not.toThrow();
22
- });
23
-
24
- it('Should be instantiable', () => {
25
- expect(() => createEvent<[string], string>()).not.toThrow();
26
- });
27
-
28
- it('Should call parent constructor', () => {
29
- const EventOriginal = Object.getPrototypeOf(Event);
30
- const EventMock = jest.fn();
31
-
32
- Object.setPrototypeOf(Event, EventMock);
33
-
34
- expect(() => new Event()).not.toThrow();
35
- expect(EventMock).toHaveBeenCalled();
36
-
37
- Object.setPrototypeOf(Event, EventOriginal);
38
- });
39
-
40
- it('Should be callable', () => {
41
- const event = new Event();
42
- expect(() => event()).not.toThrow();
43
- });
44
-
45
- it('Should check event existence', () => {
46
- const event = new Event();
47
- const listener: EventHandler<typeof event> = jest.fn();
48
- event.on(listener);
49
- expect(event.has(listener)).toEqual(true);
50
- event.off(listener);
51
- expect(event.lacks(listener)).toEqual(true);
52
- });
53
-
54
- it('Should add event listener', async () => {
55
- const event = new Event();
56
- const listener = jest.fn();
57
- event.on(listener);
58
- await event('test');
59
- expect(event.size).toEqual(1);
60
- expect(listener).toHaveBeenCalledWith('test');
61
- });
62
-
63
- it('Should remove existing event listener', async () => {
64
- const event = new Event();
65
- const listener = jest.fn();
66
- event.on(listener);
67
- event.off(listener);
68
- await event('test');
69
- expect(listener).not.toHaveBeenCalled();
70
- });
71
-
72
- it('Should remove all existing event listeners', async () => {
73
- const event = new Event();
74
- const listener = jest.fn();
75
- event.on(listener);
76
- event.on(listener);
77
- event.off(listener);
78
- await event('test');
79
- expect(listener).not.toHaveBeenCalled();
80
- });
81
-
82
- it('Should not remove other event listeners', async () => {
83
- const event = new Event();
84
- const listener = jest.fn();
85
- event.on(listener);
86
- event.off(jest.fn());
87
- await event('test');
88
- expect(listener).toHaveBeenCalled();
89
- });
90
-
91
- it('Should unsubscribe event', async () => {
92
- const event = new Event();
93
- const listener = jest.fn();
94
- const unsubscribe = event.on(listener);
95
- unsubscribe();
96
- await event('test');
97
- expect(listener).not.toHaveBeenCalled();
98
- });
99
-
100
- it('Should add one time event listener', async () => {
101
- const event = new Event();
102
- const listener = jest.fn();
103
- event.once(listener);
104
- await event('test');
105
- await event('test');
106
- expect(listener).toHaveBeenCalledTimes(1);
107
- });
108
-
109
- it('Should clear all events', async () => {
110
- const event = new Event();
111
- const listener = jest.fn();
112
- event.on(listener);
113
-
114
- event.clear();
115
- expect(event.size).toEqual(0);
116
-
117
- await event('test');
118
- expect(listener).not.toHaveBeenCalled();
119
- });
120
-
121
- it('Should return event promise', async () => {
122
- const listener = jest.fn();
123
- const event = new Event();
124
- event.on(listener);
125
- expect(listener).not.toBeCalled();
126
- const promise = event.onceAsync();
127
- await event('test');
128
- const result = await promise;
129
- expect(result).toEqual('test');
130
- expect(listener).toBeCalledWith('test');
131
- });
132
-
133
- it('Should create predicated and filtered events', async () => {
134
- const listener = jest.fn();
135
-
136
- type ClickEvent = { x: number; y: number; button: number };
137
- type LeftClickEvent = ClickEvent & { button: 1 };
138
-
139
- const clickEvent = createEvent<ClickEvent>();
140
- const leftClickPredicate: Predicate<ClickEvent, LeftClickEvent> = (mouseClickEvent): mouseClickEvent is LeftClickEvent => mouseClickEvent.button === 1;
141
- const leftClickPredicatedEvent = clickEvent.filter(leftClickPredicate);
142
- leftClickPredicatedEvent.on(listener);
143
- leftClickPredicatedEvent({ x: 1, y: 1, button: 1 });
144
-
145
- const leftClickFiltered: FilterFunction<ClickEvent> = ({ button }) => button === 1;
146
- const leftClickFilteredEvent = clickEvent.filter<LeftClickEvent>(leftClickFiltered);
147
- leftClickFilteredEvent.on(listener);
148
- leftClickFilteredEvent({ x: 1, y: 1, button: 1 });
149
-
150
- await clickEvent({ x: 1, y: 1, button: 1 });
151
- await clickEvent({ x: 1, y: 1, button: 2 });
152
-
153
- expect(listener).toHaveBeenCalledTimes(4);
154
- expect(listener).not.toHaveBeenCalledWith({ x: 1, y: 1, button: 2 });
155
- });
156
-
157
- it('Should create predicated event', async () => {
158
- type TestEvent = { name: string; value: number };
159
- const listener = jest.fn();
160
-
161
- const predicate = (event: TestEvent): event is TestEvent & { name: 'two' } => event.name === 'two';
162
- const predicateMock = jest.fn(predicate);
163
- const event = new Event<TestEvent>();
164
- const predicatedEvent = event.filter(predicateMock as unknown as typeof predicate);
165
- expect(event.size).toEqual(1);
166
-
167
- predicatedEvent.on(listener);
168
- expect(predicatedEvent.size).toEqual(1);
169
-
170
- await event({ name: 'one', value: 1 });
171
- await event({ name: 'two', value: 2 });
172
- await event({ name: 'three', value: 3 });
173
-
174
- expect(predicateMock).toHaveBeenCalledTimes(3);
175
- expect(predicateMock).toHaveBeenNthCalledWith(1, { name: 'one', value: 1 });
176
- expect(predicateMock).toHaveBeenNthCalledWith(2, { name: 'two', value: 2 });
177
- expect(predicateMock).toHaveBeenNthCalledWith(3, { name: 'three', value: 3 });
178
-
179
- expect(listener).toHaveBeenCalledTimes(1);
180
- expect(listener).toHaveBeenCalledWith({ name: 'two', value: 2 });
181
- });
182
-
183
- it('Should create filtered event', async () => {
184
- type TestEvent = { name: string; value: number };
185
- const listener = jest.fn();
186
- const filter = (event: TestEvent) => event.name === 'two';
187
- const filterMock = jest.fn(filter);
188
- const event = new Event<TestEvent>();
189
- const filteredEvent = event.filter(filterMock as unknown as typeof filter);
190
- expect(event.size).toEqual(1);
191
-
192
- filteredEvent.on(listener);
193
- expect(filteredEvent.size).toEqual(1);
194
-
195
- await event({ name: 'one', value: 1 });
196
- await event({ name: 'two', value: 2 });
197
- await event({ name: 'three', value: 3 });
198
-
199
- expect(filterMock).toHaveBeenCalledTimes(3);
200
- expect(filterMock).toHaveBeenNthCalledWith(1, { name: 'one', value: 1 });
201
- expect(filterMock).toHaveBeenNthCalledWith(2, { name: 'two', value: 2 });
202
- expect(filterMock).toHaveBeenNthCalledWith(3, { name: 'three', value: 3 });
203
-
204
- expect(listener).toHaveBeenCalledTimes(1);
205
- expect(listener).toHaveBeenCalledWith({ name: 'two', value: 2 });
206
- });
207
-
208
- it('Should create one time filtered event', async () => {
209
- type TestEvent = { name: string; value: number };
210
-
211
- const predicate = (event: TestEvent): event is TestEvent & { name: 'two' } => event.name === 'two';
212
- const predicateMock = jest.fn(predicate);
213
- const predicateAsyncMock = jest.fn(predicate);
214
- const listener = jest.fn();
215
-
216
- const event = new Event<TestEvent>();
217
- const filteredEvent = event.first(predicateMock as unknown as typeof predicate);
218
- const filteredAsync = event.firstAsync(predicateAsyncMock as unknown as typeof predicate);
219
- expect(event.size).toEqual(2);
220
-
221
- filteredEvent.on(listener);
222
- expect(filteredEvent.size).toEqual(1);
223
-
224
- await event({ name: 'one', value: 1 });
225
- await event({ name: 'two', value: 2 });
226
- await event({ name: 'three', value: 3 });
227
-
228
- expect(listener).toHaveBeenCalledTimes(1);
229
- expect(listener).toHaveBeenCalledWith({ name: 'two', value: 2 });
230
-
231
- expect(predicateMock).toHaveBeenCalledTimes(2);
232
- expect(predicateMock).toHaveBeenNthCalledWith(1, { name: 'one', value: 1 });
233
- expect(predicateMock).toHaveBeenNthCalledWith(2, { name: 'two', value: 2 });
234
-
235
- expect(predicateAsyncMock).toHaveBeenCalledTimes(2);
236
- expect(predicateAsyncMock).toHaveBeenNthCalledWith(1, { name: 'one', value: 1 });
237
- expect(predicateAsyncMock).toHaveBeenNthCalledWith(2, { name: 'two', value: 2 });
238
-
239
- await expect(filteredAsync).resolves.toEqual({ name: 'two', value: 2 });
240
- });
241
-
242
- it('Should create mapped event', async () => {
243
- const listener = jest.fn();
244
- const mapper = jest.fn((value) => value * 2);
245
-
246
- const event = new Event();
247
- const mappedEvent = event.map(mapper);
248
- expect(event.size).toEqual(1);
249
- await event(1);
250
-
251
- mappedEvent.on(listener);
252
- expect(mappedEvent.size).toEqual(1);
253
-
254
- await event(1);
255
- await event(2);
256
- await event(3);
257
-
258
- expect(mapper).toHaveBeenCalledTimes(3);
259
- expect(mapper).toHaveBeenNthCalledWith(1, 1);
260
- expect(mapper).toHaveBeenNthCalledWith(2, 2);
261
- expect(mapper).toHaveBeenNthCalledWith(3, 3);
262
-
263
- expect(listener).toHaveBeenCalledTimes(3);
264
- expect(listener).toHaveBeenCalledWith(2);
265
- expect(listener).toHaveBeenCalledWith(4);
266
- expect(listener).toHaveBeenCalledWith(6);
267
- });
268
-
269
- it('Should create reduced event', async () => {
270
- const listener = jest.fn();
271
- const reducer = jest.fn((result, value) => result + value);
272
-
273
- const event = new Event();
274
- const reducedEvent = event.reduce(reducer, 0);
275
- expect(event.size).toEqual(1);
276
- await event(1);
277
-
278
- reducedEvent.on(listener);
279
- expect(reducedEvent.size).toEqual(1);
280
-
281
- await event(1);
282
- await event(2);
283
- await event(3);
284
-
285
- expect(reducer).toHaveBeenCalledTimes(3);
286
- expect(reducer).toHaveBeenNthCalledWith(1, 0, 1);
287
- expect(reducer).toHaveBeenNthCalledWith(2, 0 + 1, 2);
288
- expect(reducer).toHaveBeenNthCalledWith(3, 0 + 1 + 2, 3);
289
-
290
- expect(listener).toHaveBeenCalledTimes(3);
291
- expect(listener).toHaveBeenCalledWith(1);
292
- expect(listener).toHaveBeenCalledWith(3);
293
- expect(listener).toHaveBeenCalledWith(6);
294
- });
295
-
296
- it('Should merge multiple events', async () => {
297
- const listener = jest.fn();
298
-
299
- const event1 = new Event<string, number>();
300
- const event2 = new Event<number, boolean>();
301
- const event3 = new Event<boolean, string>();
302
- const mergedEvent = merge(event1, event2, event3);
303
-
304
- mergedEvent.on(listener);
305
-
306
- await event1('a');
307
- await event2(1);
308
- await event3(true);
309
- await mergedEvent('b');
310
- await mergedEvent(2);
311
- await mergedEvent(false);
312
-
313
- expect(listener).toHaveBeenCalledTimes(6);
314
- expect(listener).toHaveBeenNthCalledWith(1, 'a');
315
- expect(listener).toHaveBeenNthCalledWith(2, 1);
316
- expect(listener).toHaveBeenNthCalledWith(3, true);
317
- expect(listener).toHaveBeenNthCalledWith(4, 'b');
318
- expect(listener).toHaveBeenNthCalledWith(5, 2);
319
- expect(listener).toHaveBeenNthCalledWith(6, false);
320
- });
321
-
322
- it('Should create interval events', async () => {
323
- const listener = jest.fn();
324
- const event = createInterval(10);
325
- event.on(listener);
326
- await event.onceAsync();
327
- expect(listener).toBeCalledWith(0);
328
- event.dispose();
329
- const result = await Promise.race([new Promise((resolve) => setTimeout(resolve, 100, null)), event.onceAsync()]);
330
- expect(result).toEqual(null);
331
- });
332
-
333
- it('Should dismiss event listener', async () => {
334
- const listener = jest.fn();
335
- const event = createInterval(10);
336
- event.on(listener);
337
- await event.onceAsync();
338
- expect(listener).toBeCalledWith(0);
339
- event.dispose();
340
- const result = await Promise.race([new Promise(process.nextTick).then(Boolean), event.onceAsync()]);
341
- expect(result).toEqual(true);
342
- });
343
-
344
- it('Should dismiss event pre finished', async () => {
345
- const listener = jest.fn();
346
- const event = new Event();
347
- const dismiss = event.on(listener);
348
- await event();
349
- expect(listener).toHaveBeenCalledTimes(1);
350
- const nextTick = new Promise<void>(process.nextTick);
351
- await dismiss.pre(() => nextTick)();
352
- await nextTick;
353
- await event();
354
- expect(listener).toHaveBeenCalledTimes(1);
355
- });
356
-
357
- it('Should dismiss event post finished', async () => {
358
- const listener = jest.fn();
359
- const event = new Event();
360
- const dismiss = event.on(listener);
361
- await event();
362
- expect(listener).toHaveBeenCalledTimes(1);
363
- const nextTick = new Promise<void>(process.nextTick);
364
- await dismiss.post(() => nextTick)();
365
- await nextTick;
366
- await event();
367
- expect(listener).toHaveBeenCalledTimes(1);
368
- });
369
-
370
- it('Should dismiss event countdown', async () => {
371
- const listener = jest.fn();
372
- const event = new Event();
373
- const dismiss = event.on(listener);
374
- const timesCallback = dismiss.countdown(2);
375
- await event();
376
- await timesCallback();
377
- await event();
378
- await timesCallback();
379
- await event();
380
- await timesCallback();
381
- await event();
382
- expect(listener).toHaveBeenCalledTimes(2);
383
- });
384
-
385
- it('Should return listeners values', async () => {
386
- const event = new Event<string, number | string>();
387
- event.on(() => 1);
388
- event.on(() => 'test');
389
- event.on(() => {});
390
- const result = (await event('test')) satisfies (number | string | void)[];
391
- expect(result).toEqual([1, 'test', undefined]);
392
- });
393
-
394
- it('Should debounce events', async () => {
395
- const listener = jest.fn();
396
- const event = new Event<string, number | string>();
397
- const debouncedEvent = event.debounce(10);
398
- debouncedEvent.on(listener);
399
- await event('test1');
400
- await event('test2');
401
- await debouncedEvent.onceAsync();
402
- expect(listener).toBeCalledTimes(1);
403
- });
404
- });