chiisai-event-emitter 1.0.2 → 2.1.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/README.md CHANGED
@@ -22,17 +22,45 @@ npm install chiisai-event-emitter
22
22
 
23
23
  ## Usage
24
24
 
25
+ ### Subscribe to an Event
26
+
27
+ Use `EventEmitter.subscribe(eventName, callback)` to subscribe to an event.
28
+
25
29
  ```ts
26
30
  import { EventEmitter } from 'chiisai-event-emitter';
27
31
 
28
32
  const eventEmitter = new EventEmitter();
29
33
 
30
- eventEmitter.subscribe('test-event', () => console.log('test-event handler called!'));
31
- eventEmitter.subscribe('test-event', () => console.log('another test-event handler called!'))
34
+ eventEmitter.subscribe('event', () => console.log('event-handler called!'));
35
+
36
+ eventEmitter.emit('event')
37
+ // event-handler called!
38
+ ```
39
+
40
+ ### Unsubscibe
41
+
42
+ `EventEmitter.subscribe(eventName, callback)` method returns a function which can be called to unsubscribe the callback from the event.
43
+
44
+ ```ts
45
+ const unsubscibe = eventEmitter.subscribe('event', () => console.log('event-handler called!'));
46
+ unsubscribe();
47
+
48
+ eventEmitter.emit('event')
49
+ // (nothing happened)
50
+ ```
51
+
52
+ ### Delete an Event
53
+
54
+ `EventEmitter.clear(eventName)` method removes an event and all callbacks subscibed to this event.
55
+
56
+ ```ts
57
+ eventEmitter.subscribe('event', () => console.log('event-handler called!'));
58
+ eventEmitter.subscribe('event', () => console.log('another event-handler called!'));
59
+ eventEmitter.clear('event')
60
+
61
+ eventEmitter.emit('event')
62
+ // (nothing happened)
32
63
 
33
- eventEmitter.emit('test-event')
34
- // test-event handler called!
35
- // another test-event handler called!
36
64
  ```
37
65
 
38
66
  [build-img]:https://github.com/bencelaszlo/chiisai-event-emitter/actions/workflows/release.yml/badge.svg
@@ -1,11 +1,14 @@
1
- export declare type EventCallback<T = void> = (...args: Array<any>) => T;
2
- export declare type Subscriptions = Map<string, Array<{
1
+ export type EventCallback<T = void> = (...args: Array<any>) => T;
2
+ export declare class Subscriptions extends Map<string, Array<{
3
3
  id: symbol;
4
4
  callback: EventCallback;
5
- }>>;
6
- export declare type Unsubscribe = {
7
- unsubscribe: () => void;
8
- };
5
+ }>> {
6
+ get(key: string): {
7
+ id: symbol;
8
+ callback: EventCallback;
9
+ }[];
10
+ }
11
+ export type Unsubscribe = () => void;
9
12
  export declare class EventEmitter {
10
13
  subscriptions: Subscriptions;
11
14
  constructor();
@@ -18,6 +21,13 @@ export declare class EventEmitter {
18
21
  /**
19
22
  * @param {string} eventName
20
23
  * @param {Array<any>} args
24
+ * @returns void
21
25
  */
22
26
  emit(eventName: string, ...args: Array<any>): void;
27
+ /**
28
+ *
29
+ * @param eventName eventName to be deleted
30
+ * @returns void
31
+ */
32
+ clear(eventName: string): void;
23
33
  }
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventEmitter = void 0;
3
+ exports.EventEmitter = exports.Subscriptions = void 0;
4
+ class Subscriptions extends Map {
5
+ get(key) {
6
+ return super.get(key) || [];
7
+ }
8
+ }
9
+ exports.Subscriptions = Subscriptions;
4
10
  class EventEmitter {
5
11
  constructor() {
6
- this.subscriptions = new Map();
12
+ this.subscriptions = new Subscriptions();
7
13
  }
8
14
  /**
9
15
  * @param {string} eventName
@@ -12,19 +18,31 @@ class EventEmitter {
12
18
  */
13
19
  subscribe(eventName, callback) {
14
20
  const id = Symbol(callback.toString());
15
- this.subscriptions.set(eventName, this.subscriptions.has(eventName)
16
- ? [...(this.subscriptions.get(eventName) || []), { id, callback }]
17
- : [{ id, callback }]);
18
- return {
19
- unsubscribe: () => this.subscriptions.set(eventName, (this.subscriptions.get(eventName) || []).filter(({ id: subscriptionId }) => subscriptionId !== id)),
20
- };
21
+ this.subscriptions.set(eventName, [
22
+ ...this.subscriptions.get(eventName),
23
+ { id, callback },
24
+ ]);
25
+ return () => this.subscriptions.set(eventName, this.subscriptions
26
+ .get(eventName)
27
+ .filter(({ id: subscriptionId }) => subscriptionId !== id));
21
28
  }
22
29
  /**
23
30
  * @param {string} eventName
24
31
  * @param {Array<any>} args
32
+ * @returns void
25
33
  */
26
34
  emit(eventName, ...args) {
27
- (this.subscriptions.get(eventName) || []).forEach(({ callback }) => callback(...args));
35
+ this.subscriptions
36
+ .get(eventName)
37
+ .forEach(({ callback }) => callback(...args));
38
+ }
39
+ /**
40
+ *
41
+ * @param eventName eventName to be deleted
42
+ * @returns void
43
+ */
44
+ clear(eventName) {
45
+ this.subscriptions = new Subscriptions([...this.subscriptions].filter(([key]) => key !== eventName));
28
46
  }
29
47
  }
30
48
  exports.EventEmitter = EventEmitter;
@@ -0,0 +1 @@
1
+ var e=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(r,i)||e(r,t,i)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./EventEmitter"),exports);
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "chiisai-event-emitter",
3
- "version": "1.0.2",
3
+ "version": "2.1.0",
4
4
  "description": "A minimal event emitter.",
5
5
  "main": "./lib/index.js",
6
6
  "files": [
7
7
  "lib/**/*"
8
8
  ],
9
9
  "scripts": {
10
- "build": "tsc --project tsconfig.build.json",
10
+ "tsc": "tsc --project tsconfig.build.json",
11
+ "minify": "terser ./lib/index.js -o ./lib/index.min.js --compress --mangle --module",
12
+ "build": "npm run tsc && npm run minify",
11
13
  "clean": "rm -rf ./lib/",
12
14
  "cm": "cz",
13
15
  "lint": "eslint ./src/ --fix",
@@ -58,9 +60,10 @@
58
60
  "lint-staged": "^13.2.1",
59
61
  "prettier": "^2.2.1",
60
62
  "semantic-release": "^21.0.1",
63
+ "terser": "^5.34.1",
61
64
  "ts-jest": "^27.0.5",
62
65
  "ts-node": "^10.2.1",
63
- "typescript": "^4.2.4"
66
+ "typescript": "^4.9.5"
64
67
  },
65
68
  "config": {
66
69
  "commitizen": {