evnty 0.6.22 → 0.7.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/.eslintignore ADDED
@@ -0,0 +1,3 @@
1
+ build
2
+ coverage
3
+ node_modules
package/.eslintrc ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "overrides": [
3
+ {
4
+ "env": {
5
+ "es2020": true
6
+ },
7
+ "files": "**/*.js",
8
+ "extends": ["prettier", "eslint-config-airbnb-base"]
9
+ },
10
+ {
11
+ "env": {
12
+ "es2020": true
13
+ },
14
+ "files": "**/*.ts",
15
+ "extends": ["prettier", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended"],
16
+ "parser": "@typescript-eslint/parser",
17
+ "plugins": ["@typescript-eslint"],
18
+ "rules": {
19
+ "@typescript-eslint/no-unused-vars": 2,
20
+ "@typescript-eslint/no-explicit-any": 0,
21
+ "@typescript-eslint/ban-types": 0,
22
+ "@typescript-eslint/ban-ts-comment": 1
23
+ }
24
+ }
25
+ ]
26
+ }
package/.prettierrc ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "tabWidth": 2,
3
+ "useTabs": false,
4
+ "semi": true,
5
+ "singleQuote": true,
6
+ "printWidth": 160
7
+ }
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(): 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
- 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.0",
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
  }
@@ -1,4 +1,4 @@
1
- import event, { Event } from '../index';
1
+ import createEvent, { Event } from '../index';
2
2
 
3
3
  describe('Anonymous Event test suite', function () {
4
4
  it('Should be instantiable', () => {
@@ -6,7 +6,11 @@ describe('Anonymous Event test suite', function () {
6
6
  });
7
7
 
8
8
  it('Should be instantiable', () => {
9
- expect(() => event()).not.toThrow();
9
+ expect(() => createEvent()).not.toThrow();
10
+ });
11
+
12
+ it('Should be instantiable', () => {
13
+ expect(() => createEvent()).not.toThrow();
10
14
  });
11
15
 
12
16
  it('Should call parent constructor', () => {
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() {
140
+ export default function createEvent() {
136
141
  return new Event();
137
142
  }
package/tsconfig.json CHANGED
@@ -5,6 +5,7 @@
5
5
  "noImplicitAny": true,
6
6
  "removeComments": true,
7
7
  "preserveConstEnums": true,
8
+ "experimentalDecorators": true,
8
9
  "sourceMap": true,
9
10
  "declaration": true,
10
11
  "lib": [