evnty 0.6.22 → 0.7.2

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/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2021-present Ivan Zakharchanka
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md CHANGED
@@ -76,8 +76,8 @@ unsubscribe();
76
76
  ```
77
77
 
78
78
  ## License
79
- License [The MIT License](http://opensource.org/licenses/MIT)
80
- Copyright (c) 2021 Ivan Zakharchanka
79
+ License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
80
+ Copyright (c) 2021-present Ivan Zakharchanka
81
81
 
82
82
  [npm-url]: https://www.npmjs.com/package/evnty
83
83
  [downloads-image]: https://img.shields.io/npm/dw/evnty.svg?maxAge=43200
package/build/index.d.ts CHANGED
@@ -1,42 +1,45 @@
1
1
  export interface Unsubscribe {
2
2
  (): void;
3
3
  }
4
- export interface Listener {
5
- (...args: any[]): void;
4
+ export interface Listener<T extends any[]> {
5
+ (...args: T): void;
6
6
  }
7
7
  export interface Dispose {
8
8
  (): void;
9
9
  }
10
- export interface Filter {
11
- (...args: any[]): boolean;
10
+ export interface Filter<T extends any[]> {
11
+ (...args: T): boolean;
12
12
  }
13
- export interface Mapper<T = any[]> {
14
- (...args: any[]): T;
13
+ export interface Mapper<T extends any[], R> {
14
+ (...args: T): R;
15
15
  }
16
- export interface Reducer<T = any[]> {
17
- (value: T, ...args: any[]): T;
18
- }
19
- export interface Listeners extends Set<Listener> {
16
+ export interface Reducer<T extends any[], R> {
17
+ (value: R, ...args: T): R;
20
18
  }
19
+ export declare type Listeners<T extends any[]> = Set<Listener<T>>;
21
20
  declare class FunctionExt extends Function {
22
21
  constructor(func: Function);
23
22
  }
24
- export declare class Event extends FunctionExt {
25
- static merge(...events: Event[]): Event;
26
- static interval(interval: number): Event;
23
+ export interface Event<T extends any[]> {
24
+ (...args: T): Promise<void> | void;
25
+ }
26
+ declare type EventTypes<T extends Event<any>[]> = T extends Event<infer E>[] ? E : never;
27
+ export declare class Event<T extends any[]> extends FunctionExt {
28
+ static merge<E extends Event<unknown[]>[], ET extends any[] = EventTypes<E>>(...events: E): Event<ET>;
29
+ static interval(interval: number): Event<[number]>;
27
30
  private listeners;
28
31
  readonly dispose: Dispose;
29
32
  constructor(dispose?: Dispose);
30
- get size(): Number;
31
- has(listener: Listener): boolean;
32
- off(listener: Listener): void;
33
- on(listener: Listener): Unsubscribe;
34
- once(listener: Listener): Unsubscribe;
33
+ get size(): number;
34
+ has(listener: Listener<T>): boolean;
35
+ off(listener: Listener<T>): void;
36
+ on(listener: Listener<T>): Unsubscribe;
37
+ once(listener: Listener<T>): Unsubscribe;
35
38
  clear(): void;
36
- toPromise(): Promise<any[]>;
37
- filter(filter: Filter): Event;
38
- map<T>(mapper: Mapper<T>): Event;
39
- reduce<T>(reducer: Reducer<T>, init: T): Event;
39
+ toPromise(): Promise<T>;
40
+ filter(filter: Filter<T>): Event<any[]>;
41
+ map<R>(mapper: Mapper<T, R>): Event<any[]>;
42
+ reduce<R>(reducer: Reducer<T, R>, init: R): Event<any[]>;
40
43
  }
41
- export default function event(): Event;
44
+ export default function createEvent<T extends any[]>(): Event<T>;
42
45
  export {};
package/build/index.js CHANGED
@@ -13,16 +13,17 @@ exports.Event = void 0;
13
13
  class FunctionExt extends Function {
14
14
  constructor(func) {
15
15
  super();
16
- return Object.setPrototypeOf(func, new.target.prototype);
16
+ Object.setPrototypeOf(func, new.target.prototype);
17
17
  }
18
18
  }
19
19
  function eventEmitter(listeners, ...args) {
20
- return Promise.all([...listeners].map(listener => listener(...args)));
20
+ return Promise.all([...listeners].map(listener => listener(...args))).then(() => { });
21
21
  }
22
22
  class Event extends FunctionExt {
23
23
  constructor(dispose) {
24
24
  const listeners = new Set();
25
- super(eventEmitter.bind(null, listeners));
25
+ const fn = eventEmitter.bind(null, listeners);
26
+ super(fn);
26
27
  this.listeners = listeners;
27
28
  this.dispose = () => {
28
29
  this.clear();
@@ -50,12 +51,10 @@ class Event extends FunctionExt {
50
51
  off(listener) {
51
52
  this.listeners.delete(listener);
52
53
  }
53
- ;
54
54
  on(listener) {
55
55
  this.listeners.add(listener);
56
56
  return () => this.off(listener);
57
57
  }
58
- ;
59
58
  once(listener) {
60
59
  const oneTimeListener = (...args) => {
61
60
  this.off(oneTimeListener);
@@ -63,7 +62,6 @@ class Event extends FunctionExt {
63
62
  };
64
63
  return this.on(oneTimeListener);
65
64
  }
66
- ;
67
65
  clear() {
68
66
  this.listeners.clear();
69
67
  }
@@ -102,8 +100,8 @@ class Event extends FunctionExt {
102
100
  }
103
101
  }
104
102
  exports.Event = Event;
105
- function event() {
103
+ function createEvent() {
106
104
  return new Event();
107
105
  }
108
- exports.default = event;
106
+ exports.default = createEvent;
109
107
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "evnty",
3
- "version": "0.6.22",
3
+ "version": "0.7.2",
4
4
  "description": "0-Deps, simple, fast, for browser and node js anonymous event library",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "rm -rf build && NODE_ENV=production tsc",
9
9
  "test": "jest",
10
- "test:cov": "COVERAGE=true jest"
10
+ "test:cov": "COVERAGE=true jest",
11
+ "lint": "eslint .",
12
+ "prepare": "husky install"
11
13
  },
12
14
  "repository": {
13
15
  "type": "git",
@@ -28,10 +30,19 @@
28
30
  },
29
31
  "homepage": "https://github.com/3axap4eHko/evnty#readme",
30
32
  "devDependencies": {
31
- "@types/jest": "^26.0.20",
32
- "jest": "^26.6.3",
33
- "ts-jest": "^26.5.1",
34
- "ts-node": "^9.1.1",
33
+ "@types/jest": "^27.4.1",
34
+ "@typescript-eslint/eslint-plugin": "^5.20.0",
35
+ "@typescript-eslint/parser": "^5.20.0",
36
+ "eslint": "^8.13.0",
37
+ "eslint-config-airbnb-base": "^15.0.0",
38
+ "eslint-config-prettier": "^8.5.0",
39
+ "eslint-plugin-import": "^2.26.0",
40
+ "husky": "^7.0.4",
41
+ "jest": "^27.5.1",
42
+ "prettier": "^2.6.2",
43
+ "pretty-quick": "^3.1.3",
44
+ "ts-jest": "^27.1.4",
45
+ "ts-node": "^10.7.0",
35
46
  "typescript": "^4.1.5"
36
47
  }
37
48
  }
package/src/index.ts CHANGED
@@ -2,62 +2,67 @@ export interface Unsubscribe {
2
2
  (): void;
3
3
  }
4
4
 
5
- export interface Listener {
6
- (...args: any[]): void;
5
+ export interface Listener<T extends any[]> {
6
+ (...args: T): void;
7
7
  }
8
8
 
9
9
  export interface Dispose {
10
10
  (): void
11
11
  }
12
12
 
13
- export interface Filter {
14
- (...args: any[]): boolean
13
+ export interface Filter<T extends any[]> {
14
+ (...args: T): boolean
15
15
  }
16
16
 
17
- export interface Mapper<T = any[]> {
18
- (...args: any[]): T;
17
+ export interface Mapper<T extends any[], R> {
18
+ (...args: T): R;
19
19
  }
20
20
 
21
- export interface Reducer<T = any[]> {
22
- (value: T, ...args: any[]): T
21
+ export interface Reducer<T extends any[], R> {
22
+ (value: R, ...args: T): R
23
23
  }
24
24
 
25
- export interface Listeners extends Set<Listener> {
26
-
27
- }
25
+ export type Listeners<T extends any[]> = Set<Listener<T>>;
28
26
 
29
27
  class FunctionExt extends Function {
30
28
  constructor(func: Function) {
31
29
  super();
32
- return Object.setPrototypeOf(func, new.target.prototype);
30
+ Object.setPrototypeOf(func, new.target.prototype);
33
31
  }
34
32
  }
35
33
 
36
- function eventEmitter(listeners: Listeners, ...args: any[]) {
37
- return Promise.all([...listeners].map(listener => listener(...args)));
34
+ function eventEmitter<A extends any[]>(listeners: Listeners<A>, ...args: A) {
35
+ return Promise.all([...listeners].map(listener => listener(...args))).then(() => { });
36
+ }
37
+
38
+ export interface Event<T extends any[]> {
39
+ (...args: T): Promise<void> | void;
38
40
  }
39
41
 
40
- export class Event extends FunctionExt {
41
- static merge(...events: Event[]): Event {
42
- const mergedEvent = new Event();
43
- events.forEach(event => event.on((...args) => mergedEvent(...args)));
42
+ type EventTypes<T extends Event<any>[]> = T extends Event<infer E>[] ? E : never;
43
+
44
+ export class Event<T extends any[]> extends FunctionExt {
45
+ static merge<E extends Event<unknown[]>[], ET extends any[] = EventTypes<E>>(...events: E) {
46
+ const mergedEvent = new Event<ET>();
47
+ events.forEach(event => event.on((...args: ET) => mergedEvent(...args)));
44
48
  return mergedEvent;
45
49
  }
46
50
 
47
51
  static interval(interval: number) {
48
52
  let timerId: any = 0;
49
53
  let counter = 0;
50
- const intervalEvent = new Event(() => clearInterval(timerId));
54
+ const intervalEvent = new Event<[number]>(() => clearInterval(timerId));
51
55
  timerId = setInterval(() => intervalEvent(counter++), interval);
52
56
  return intervalEvent;
53
57
  }
54
58
 
55
- private listeners: Listeners;
59
+ private listeners: Listeners<T>;
56
60
  readonly dispose: Dispose;
57
61
 
58
62
  constructor(dispose?: Dispose) {
59
- const listeners = new Set<Listener>();
60
- super(eventEmitter.bind(null, listeners));
63
+ const listeners = new Set<Listener<T>>();
64
+ const fn: (...args: T) => Promise<void> = eventEmitter.bind(null, listeners);
65
+ super(fn);
61
66
  this.listeners = listeners;
62
67
  this.dispose = () => {
63
68
  this.clear();
@@ -65,40 +70,40 @@ export class Event extends FunctionExt {
65
70
  };
66
71
  }
67
72
 
68
- get size(): Number {
73
+ get size(): number {
69
74
  return this.listeners.size;
70
75
  }
71
76
 
72
- has(listener: Listener): boolean {
77
+ has(listener: Listener<T>): boolean {
73
78
  return this.listeners.has(listener);
74
79
  }
75
80
 
76
- off(listener: Listener): void {
81
+ off(listener: Listener<T>): void {
77
82
  this.listeners.delete(listener);
78
- };
83
+ }
79
84
 
80
- on(listener: Listener): Unsubscribe {
85
+ on(listener: Listener<T>): Unsubscribe {
81
86
  this.listeners.add(listener);
82
87
  return () => this.off(listener);
83
- };
88
+ }
84
89
 
85
- once(listener: Listener): Unsubscribe {
86
- const oneTimeListener = (...args: any[]) => {
90
+ once(listener: Listener<T>): Unsubscribe {
91
+ const oneTimeListener = (...args: T) => {
87
92
  this.off(oneTimeListener);
88
93
  listener(...args);
89
94
  };
90
95
  return this.on(oneTimeListener);
91
- };
96
+ }
92
97
 
93
98
  clear() {
94
99
  this.listeners.clear();
95
100
  }
96
101
 
97
- toPromise(): Promise<any[]> {
102
+ toPromise(): Promise<T> {
98
103
  return new Promise(resolve => this.once((...args) => resolve(args)));
99
104
  }
100
105
 
101
- filter(filter: Filter) {
106
+ filter(filter: Filter<T>) {
102
107
  const dispose = this.on(async (...args) => {
103
108
  if (filteredEvent.size > 0 && await filter(...args)) {
104
109
  filteredEvent(...args);
@@ -108,7 +113,7 @@ export class Event extends FunctionExt {
108
113
  return filteredEvent;
109
114
  }
110
115
 
111
- map<T>(mapper: Mapper<T>) {
116
+ map<R>(mapper: Mapper<T, R>) {
112
117
  const dispose = this.on(async (...args) => {
113
118
  if (mappedEvent.size > 0) {
114
119
  const value = await mapper(...args);
@@ -119,8 +124,8 @@ export class Event extends FunctionExt {
119
124
  return mappedEvent;
120
125
  }
121
126
 
122
- reduce<T>(reducer: Reducer<T>, init: T) {
123
- let value: T = init;
127
+ reduce<R>(reducer: Reducer<T, R>, init: R) {
128
+ let value = init;
124
129
  const dispose = this.on(async (...args) => {
125
130
  if (reducedEvent.size > 0) {
126
131
  value = await reducer(value, ...args);
@@ -132,6 +137,6 @@ export class Event extends FunctionExt {
132
137
  }
133
138
  }
134
139
 
135
- export default function event() {
136
- return new Event();
140
+ export default function createEvent<T extends any[]>() {
141
+ return new Event<T>();
137
142
  }
@@ -1,44 +0,0 @@
1
- name: Build Package
2
-
3
- on: [push, pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-latest
8
- strategy:
9
- matrix:
10
- node-version: [14.x]
11
- steps:
12
- - name: Checkout code
13
- uses: actions/checkout@v2
14
-
15
- - name: Use Node.js ${{ matrix.node-version }}
16
- uses: actions/setup-node@v1
17
- with:
18
- node-version: ${{ matrix.node-version }}
19
- registry-url: https://registry.npmjs.org/
20
-
21
- - name: Environment log
22
- id: env
23
- run: |
24
- node --version
25
- yarn --version
26
-
27
- - name: Install dependecies
28
- run: |
29
- yarn
30
-
31
- - name: Run build process
32
- run: |
33
- yarn build
34
-
35
- - name: Run testing
36
- run: |
37
- yarn test
38
- env:
39
- COVERAGE: 1
40
-
41
- - name: Upload test coverage
42
- uses: codecov/codecov-action@v1
43
- with:
44
- token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,72 +0,0 @@
1
- name: Autoupdate
2
-
3
- on:
4
- schedule:
5
- - cron: 0 0 * * *
6
- workflow_dispatch:
7
-
8
- jobs:
9
- build:
10
- runs-on: ubuntu-latest
11
- strategy:
12
- matrix:
13
- node-version: [14.x]
14
- steps:
15
- - name: Checkout 🛎️
16
- uses: actions/checkout@v2
17
-
18
- - name: Use Node.js ${{ matrix.node-version }} 🟢
19
- uses: actions/setup-node@v1
20
- with:
21
- node-version: ${{ matrix.node-version }}
22
- registry-url: https://registry.npmjs.org/
23
-
24
- - name: Setup ENV ⚙️
25
- id: env
26
- run: |
27
- node --version
28
- yarn --version
29
-
30
- - name: Install 🔧
31
- run: |
32
- yarn install --frozen-lockfile
33
-
34
- - name: Upgrade 🌠
35
- id: updates
36
- run: |
37
- PENDING=$(yarn outdated --json|tail -1|jq '.data.body'|jq length)
38
- echo "::set-output name=PENDING::$PENDING"
39
- yarn upgrade
40
- DONE=$(yarn outdated --json|tail -1|jq '.data.body'|jq length)
41
- echo "::set-output name=DONE::$DONE"
42
-
43
- - name: Build 🧱
44
- if: steps.updates.outputs.PENDING != steps.updates.outputs.DONE
45
- run: |
46
- yarn build
47
-
48
- - name: Test 🧪
49
- if: steps.updates.outputs.PENDING != steps.updates.outputs.DONE
50
- run: |
51
- yarn test
52
-
53
- - name: Commit 🔒
54
- if: steps.updates.outputs.PENDING != steps.updates.outputs.DONE
55
- run: |
56
- git config --global user.email "3axap4eHko@github.com"
57
- git config --global user.name "Ivan Zakharchanka"
58
- git add --all
59
- git commit -am "autoupdate"
60
- npm version patch
61
-
62
- - name: Publish 📚
63
- if: steps.updates.outputs.PENDING != steps.updates.outputs.DONE
64
- run: |
65
- echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc
66
- npm publish
67
-
68
- - name: Push
69
- if: steps.updates.outputs.PENDING != steps.updates.outputs.DONE
70
- run: |
71
- git push
72
- git push --tags
package/jest.config.js DELETED
@@ -1,15 +0,0 @@
1
- module.exports = {
2
- verbose: true,
3
- collectCoverage: !!process.env.TRAVIS || !!process.env.COVERAGE,
4
- preset: 'ts-jest',
5
- collectCoverageFrom: [
6
- 'src/**/*.ts',
7
- ],
8
- coveragePathIgnorePatterns: [
9
- '/node_modules/',
10
- '__fixtures__',
11
- '__mocks__',
12
- '__tests__',
13
- ],
14
- coverageDirectory: './coverage',
15
- };
@@ -1,208 +0,0 @@
1
- import event, { Event } from '../index';
2
-
3
- describe('Anonymous Event test suite', function () {
4
- it('Should be instantiable', () => {
5
- expect(() => new Event()).not.toThrow();
6
- });
7
-
8
- it('Should be instantiable', () => {
9
- expect(() => event()).not.toThrow();
10
- });
11
-
12
- it('Should call parent constructor', () => {
13
- const EventOriginal = Object.getPrototypeOf(Event);
14
- const EventMock = jest.fn();
15
-
16
- Object.setPrototypeOf(Event, EventMock);
17
-
18
- expect(() => new Event()).not.toThrow();
19
- expect(EventMock).toHaveBeenCalled();
20
-
21
- Object.setPrototypeOf(Event, EventOriginal);
22
- });
23
-
24
- it('Should be callable', () => {
25
- const event = new Event();
26
- expect(() => event()).not.toThrow();
27
- });
28
-
29
- it('Should check event existence', () => {
30
- const event = new Event();
31
- const listener = jest.fn();
32
- event.on(listener);
33
- expect(event.has(listener)).toEqual(true);
34
- });
35
-
36
- it('Should add event listener', () => {
37
- const event = new Event();
38
- const listener = jest.fn();
39
- event.on(listener);
40
- event('test');
41
- expect(event.size).toEqual(1);
42
- expect(listener).toHaveBeenCalledWith('test');
43
- });
44
-
45
- it('Should remove event listener', () => {
46
- const event = new Event();
47
- const listener = jest.fn();
48
- event.on(listener);
49
- event.off(listener);
50
- event('test');
51
- expect(listener).not.toHaveBeenCalled();
52
- });
53
-
54
- it('Should unsubscribe event', () => {
55
- const event = new Event();
56
- const listener = jest.fn();
57
- const unsubscribe = event.on(listener);
58
- unsubscribe();
59
- event('test');
60
- expect(listener).not.toHaveBeenCalled();
61
- });
62
-
63
- it('Should add one time event listener', () => {
64
- const event = new Event();
65
- const listener = jest.fn();
66
- event.once(listener);
67
- event('test');
68
- event('test');
69
- expect(listener).toHaveBeenCalledTimes(1);
70
- });
71
-
72
- it('Should clear all events', () => {
73
- const event = new Event();
74
- const listener = jest.fn();
75
- event.on(listener);
76
-
77
- event.clear();
78
- expect(event.size).toEqual(0);
79
-
80
- event('test');
81
- expect(listener).not.toHaveBeenCalled();
82
- });
83
-
84
- it('Should return event promise', async () => {
85
- const listener = jest.fn();
86
- const event = new Event();
87
- event.on(listener);
88
- expect(listener).not.toBeCalled();
89
- const promise = event.toPromise();
90
- event('test');
91
- const result = await promise;
92
- expect(result).toEqual(['test']);
93
- expect(listener).toBeCalledWith('test');
94
- });
95
-
96
- it('Should create filtered event', async () => {
97
- const listener = jest.fn();
98
- const filter = jest.fn().mockImplementation(name => name === 'two');
99
-
100
- const event = new Event();
101
- const filteredEvent = event.filter(filter);
102
- expect(event.size).toEqual(1);
103
-
104
- filteredEvent.on(listener);
105
- expect(filteredEvent.size).toEqual(1);
106
-
107
- await event('one', 1);
108
- await event('two', 2);
109
- await event('three', 3);
110
-
111
- expect(filter).toHaveBeenCalledTimes(3);
112
- expect(filter).toHaveBeenNthCalledWith(1, 'one', 1);
113
- expect(filter).toHaveBeenNthCalledWith(2, 'two', 2);
114
- expect(filter).toHaveBeenNthCalledWith(3, 'three', 3);
115
-
116
- expect(listener).toHaveBeenCalledTimes(1);
117
- expect(listener).toHaveBeenCalledWith('two', 2);
118
- });
119
-
120
- it('Should create mapped event', async () => {
121
- const listener = jest.fn();
122
- const mapper = jest.fn().mockImplementation(value => value * 2);
123
-
124
- const event = new Event();
125
- const mappedEvent = event.map(mapper);
126
- expect(event.size).toEqual(1);
127
- await event(1);
128
-
129
- mappedEvent.on(listener);
130
- expect(mappedEvent.size).toEqual(1);
131
-
132
- await event(1);
133
- await event(2);
134
- await event(3);
135
-
136
- expect(mapper).toHaveBeenCalledTimes(3);
137
- expect(mapper).toHaveBeenNthCalledWith(1, 1);
138
- expect(mapper).toHaveBeenNthCalledWith(2, 2);
139
- expect(mapper).toHaveBeenNthCalledWith(3, 3);
140
-
141
- expect(listener).toHaveBeenCalledTimes(3);
142
- expect(listener).toHaveBeenCalledWith(2);
143
- expect(listener).toHaveBeenCalledWith(4);
144
- expect(listener).toHaveBeenCalledWith(6);
145
- });
146
-
147
- it('Should create reduced event', async () => {
148
- const listener = jest.fn();
149
- const reducer = jest.fn().mockImplementation((result, value) => result + value);
150
-
151
- const event = new Event();
152
- const reducedEvent = event.reduce(reducer, 0);
153
- expect(event.size).toEqual(1);
154
- await event(1);
155
-
156
- reducedEvent.on(listener);
157
- expect(reducedEvent.size).toEqual(1);
158
-
159
- await event(1);
160
- await event(2);
161
- await event(3);
162
-
163
- expect(reducer).toHaveBeenCalledTimes(3);
164
- expect(reducer).toHaveBeenNthCalledWith(1, 0, 1);
165
- expect(reducer).toHaveBeenNthCalledWith(2, 0 + 1, 2);
166
- expect(reducer).toHaveBeenNthCalledWith(3, 0 + 1 + 2, 3);
167
-
168
- expect(listener).toHaveBeenCalledTimes(3);
169
- expect(listener).toHaveBeenCalledWith(1);
170
- expect(listener).toHaveBeenCalledWith(3);
171
- expect(listener).toHaveBeenCalledWith(6);
172
- });
173
-
174
- it('Should merge multiple events', () => {
175
- const listener = jest.fn();
176
-
177
- const event1 = new Event();
178
- const event2 = new Event();
179
- const event3 = new Event();
180
- const mergedEvent = Event.merge(event1, event2, event3);
181
- mergedEvent.on(listener);
182
-
183
- event1(1);
184
- event2(2);
185
- event3(3);
186
- mergedEvent(123);
187
-
188
- expect(listener).toHaveBeenCalledTimes(4);
189
- expect(listener).toHaveBeenNthCalledWith(1, 1);
190
- expect(listener).toHaveBeenNthCalledWith(2, 2);
191
- expect(listener).toHaveBeenNthCalledWith(3, 3);
192
- expect(listener).toHaveBeenNthCalledWith(4, 123);
193
- });
194
-
195
- it('Should create interval events', async () => {
196
- const listener = jest.fn();
197
- const event = Event.interval(10);
198
- event.on(listener);
199
- await event.toPromise();
200
- expect(listener).toBeCalledWith(0);
201
- event.dispose();
202
- const result = await Promise.race([
203
- new Promise(resolve => setTimeout(resolve, 100, null)),
204
- event.toPromise(),
205
- ]);
206
- expect(result).toEqual(null);
207
- });
208
- });
package/tsconfig.json DELETED
@@ -1,27 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2015",
4
- "module": "commonjs",
5
- "noImplicitAny": true,
6
- "removeComments": true,
7
- "preserveConstEnums": true,
8
- "sourceMap": true,
9
- "declaration": true,
10
- "lib": [
11
- "es2015.core",
12
- "es6",
13
- "dom"
14
- ],
15
- "rootDir": "src",
16
- "outDir": "build"
17
- },
18
- "include": [
19
- "src/*.ts"
20
- ],
21
- "exclude": [
22
- "node_modules",
23
- "src/**/__tests__",
24
- "src/**/__fixtures__",
25
- "src/**/__mocks__"
26
- ]
27
- }