evnty 0.6.21 → 0.7.1
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 +13 -0
- package/README.md +2 -2
- package/build/index.d.ts +26 -23
- package/build/index.js +6 -8
- package/build/index.js.map +1 -1
- package/package.json +17 -6
- package/src/index.ts +42 -37
- package/.github/workflows/build.yml +0 -44
- package/.github/workflows/upgrade.yml +0 -72
- package/jest.config.js +0 -15
- package/src/__tests__/index.ts +0 -208
- package/tsconfig.json +0 -27
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 [
|
|
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:
|
|
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:
|
|
10
|
+
export interface Filter<T extends any[]> {
|
|
11
|
+
(...args: T): boolean;
|
|
12
12
|
}
|
|
13
|
-
export interface Mapper<T
|
|
14
|
-
(...args:
|
|
13
|
+
export interface Mapper<T extends any[], R> {
|
|
14
|
+
(...args: T): R;
|
|
15
15
|
}
|
|
16
|
-
export interface Reducer<T
|
|
17
|
-
(value:
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
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():
|
|
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<
|
|
37
|
-
filter(filter: Filter): Event
|
|
38
|
-
map<
|
|
39
|
-
reduce<
|
|
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
|
|
44
|
+
export default function createEvent(): Event<any[]>;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
103
|
+
function createEvent() {
|
|
106
104
|
return new Event();
|
|
107
105
|
}
|
|
108
|
-
exports.default =
|
|
106
|
+
exports.default = createEvent;
|
|
109
107
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
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.
|
|
3
|
+
"version": "0.7.1",
|
|
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": "^
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
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:
|
|
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:
|
|
13
|
+
export interface Filter<T extends any[]> {
|
|
14
|
+
(...args: T): boolean
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export interface Mapper<T
|
|
18
|
-
(...args:
|
|
17
|
+
export interface Mapper<T extends any[], R> {
|
|
18
|
+
(...args: T): R;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export interface Reducer<T
|
|
22
|
-
(value:
|
|
21
|
+
export interface Reducer<T extends any[], R> {
|
|
22
|
+
(value: R, ...args: T): R
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export
|
|
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
|
-
|
|
30
|
+
Object.setPrototypeOf(func, new.target.prototype);
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
33
|
|
|
36
|
-
function eventEmitter(listeners: Listeners
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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():
|
|
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:
|
|
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<
|
|
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<
|
|
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<
|
|
123
|
-
let value
|
|
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
|
|
140
|
+
export default function createEvent() {
|
|
136
141
|
return new Event();
|
|
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
|
-
};
|
package/src/__tests__/index.ts
DELETED
|
@@ -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
|
-
}
|