@arikajs/events 0.0.3 โ†’ 0.0.5

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
@@ -110,6 +110,25 @@ export default {
110
110
 
111
111
  ## ๐Ÿ“š API Reference
112
112
 
113
+ ### ๐Ÿ”ข Listener Priorities
114
+
115
+ You can control the order in which listeners execute by passing a priority (higher numbers run first).
116
+
117
+ ```ts
118
+ Event.listen(OrderPlaced, ProcessPayment, 100);
119
+ Event.listen(OrderPlaced, SendEmail, 0); // Runs after payment
120
+ ```
121
+
122
+ ### ๐Ÿƒ Wildcard Events
123
+
124
+ Listen to a group of events using the `*` wildcard.
125
+
126
+ ```ts
127
+ Event.listen('user.*', (event) => {
128
+ // Handled for 'user.login', 'user.registered', etc.
129
+ });
130
+ ```
131
+
113
132
  ### `Event.dispatch(event)`
114
133
 
115
134
  Dispatch an event instance.
@@ -134,26 +153,43 @@ Remove all listeners for an event.
134
153
  Event.forget(OrderPlaced);
135
154
  ```
136
155
 
137
- ---
156
+ ### ๐Ÿ” Event Subscribers
138
157
 
139
- ## ๐Ÿง  Architecture
158
+ Subscribers are classes that can subscribe to multiple events from within a single class.
140
159
 
160
+ ```ts
161
+ class UserEventSubscriber {
162
+ subscribe(events) {
163
+ events.listen('user.login', this.onUserLogin);
164
+ events.listen('user.logout', this.onUserLogout);
165
+ }
166
+
167
+ onUserLogin(event) { /* ... */ }
168
+ onUserLogout(event) { /* ... */ }
169
+ }
170
+
171
+ Event.subscribe(UserEventSubscriber);
141
172
  ```
173
+
174
+ ---
175
+
176
+ ## ๐Ÿ— Architecture
177
+
178
+ ```text
142
179
  events/
143
180
  โ”œโ”€โ”€ src/
144
- โ”‚ โ”œโ”€โ”€ EventManager.ts โ† Central event dispatcher
145
- โ”‚ โ”œโ”€โ”€ ListenerResolver.ts โ† Resolves listeners via DI
146
- โ”‚ โ”œโ”€โ”€ Dispatcher.ts โ† Executes listeners
147
- โ”‚ โ”œโ”€โ”€ Contracts/
181
+ โ”‚ โ”œโ”€โ”€ Contracts
148
182
  โ”‚ โ”‚ โ””โ”€โ”€ Listener.ts
149
- โ”‚ โ”œโ”€โ”€ Exceptions/
183
+ โ”‚ โ”œโ”€โ”€ Exceptions
150
184
  โ”‚ โ”‚ โ””โ”€โ”€ EventException.ts
151
- โ”‚ โ””โ”€โ”€ index.ts
185
+ โ”‚ โ”œโ”€โ”€ Dispatcher.ts
186
+ โ”‚ โ”œโ”€โ”€ EventManager.ts
187
+ โ”‚ โ”œโ”€โ”€ index.ts
188
+ โ”‚ โ””โ”€โ”€ ListenerResolver.ts
152
189
  โ”œโ”€โ”€ tests/
153
190
  โ”œโ”€โ”€ package.json
154
191
  โ”œโ”€โ”€ tsconfig.json
155
- โ”œโ”€โ”€ README.md
156
- โ””โ”€โ”€ LICENSE
192
+ โ””โ”€โ”€ README.md
157
193
  ```
158
194
 
159
195
  ---
@@ -171,22 +207,29 @@ events/
171
207
 
172
208
  ## ๐Ÿงช Testing
173
209
 
174
- Events and listeners can be faked or mocked for tests:
210
+ The Arika event system provides powerful testing helpers to mock event dispatching.
175
211
 
176
212
  ```ts
177
- Event.fake();
178
- Event.assertDispatched(UserRegistered);
179
- ```
213
+ it('dispatches the order event', async () => {
214
+ Event.fake();
180
215
 
181
- (Test helpers planned.)
216
+ await someBusinessLogic();
217
+
218
+ Event.assertDispatched(OrderPlaced);
219
+ // Use a callback for custom assertions
220
+ Event.assertDispatched(OrderPlaced, (event) => {
221
+ return event.id === 123;
222
+ });
223
+ });
224
+ ```
182
225
 
183
226
  ---
184
227
 
185
228
  ## ๐Ÿ›ฃ Roadmap
186
229
 
187
- - [ ] Event subscribers
188
- - [ ] Wildcard events
189
- - [ ] Listener priorities
230
+ - [x] Event subscribers
231
+ - [x] Wildcard events
232
+ - [x] Listener priorities
190
233
  - [ ] Event discovery
191
234
  - [ ] Event caching
192
235
 
@@ -1,13 +1,20 @@
1
1
  import { ListenerResolver } from './ListenerResolver';
2
2
  export declare class EventManager {
3
3
  private listeners;
4
+ private wildcards;
4
5
  private dispatcher;
5
6
  private resolver;
7
+ private dispatched;
8
+ private isFaking;
6
9
  constructor(resolver?: ListenerResolver);
7
- listen(event: any, listener: any): this;
10
+ listen(event: any, listener: any, priority?: number): this;
11
+ private setupWildcard;
12
+ subscribe(subscriber: any): void;
8
13
  forget(event: any): this;
9
14
  dispatch(event: any): Promise<void>;
15
+ private getSortedListeners;
16
+ private matchWildcard;
10
17
  fake(): void;
11
- assertDispatched(event: any): void;
18
+ assertDispatched(event: any, callback?: (event: any) => boolean): void;
12
19
  }
13
20
  //# sourceMappingURL=EventManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventManager.d.ts","sourceRoot":"","sources":["../src/EventManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAmB;gBAEvB,QAAQ,CAAC,EAAE,gBAAgB;IAKhC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;IAQhC,MAAM,CAAC,KAAK,EAAE,GAAG;IAKX,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzC,IAAI;IAIJ,gBAAgB,CAAC,KAAK,EAAE,GAAG;CAGrC"}
1
+ {"version":3,"file":"EventManager.d.ts","sourceRoot":"","sources":["../src/EventManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAA8D;IAC/E,OAAO,CAAC,SAAS,CAAiE;IAClF,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,CAAC,EAAE,gBAAgB;IAKhC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAE,MAAU;IAY7D,OAAO,CAAC,aAAa;IAOd,SAAS,CAAC,UAAU,EAAE,GAAG;IAOzB,MAAM,CAAC,KAAK,EAAE,GAAG;IAMX,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,aAAa;IAMd,IAAI;IAIJ,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO;CAazE"}
@@ -6,43 +6,91 @@ const ListenerResolver_1 = require("./ListenerResolver");
6
6
  class EventManager {
7
7
  constructor(resolver) {
8
8
  this.listeners = new Map();
9
+ this.wildcards = new Map();
10
+ this.dispatched = [];
11
+ this.isFaking = false;
9
12
  this.resolver = resolver || new ListenerResolver_1.ListenerResolver();
10
13
  this.dispatcher = new Dispatcher_1.Dispatcher((ln) => this.resolver.resolve(ln));
11
14
  }
12
- listen(event, listener) {
13
- if (!this.listeners.has(event)) {
14
- this.listeners.set(event, []);
15
+ listen(event, listener, priority = 0) {
16
+ if (typeof event === 'string' && event.includes('*')) {
17
+ this.setupWildcard(event, listener, priority);
18
+ }
19
+ else {
20
+ if (!this.listeners.has(event)) {
21
+ this.listeners.set(event, []);
22
+ }
23
+ this.listeners.get(event)?.push({ listener, priority });
15
24
  }
16
- this.listeners.get(event)?.push(listener);
17
25
  return this;
18
26
  }
27
+ setupWildcard(event, listener, priority) {
28
+ if (!this.wildcards.has(event)) {
29
+ this.wildcards.set(event, []);
30
+ }
31
+ this.wildcards.get(event)?.push({ listener, priority });
32
+ }
33
+ subscribe(subscriber) {
34
+ const subscriberInstance = typeof subscriber === 'function' ? new subscriber() : subscriber;
35
+ if (typeof subscriberInstance.subscribe === 'function') {
36
+ subscriberInstance.subscribe(this);
37
+ }
38
+ }
19
39
  forget(event) {
20
40
  this.listeners.delete(event);
41
+ this.wildcards.delete(event);
21
42
  return this;
22
43
  }
23
44
  async dispatch(event) {
24
- let listeners = [];
25
- // Find listeners for this event instance
26
- // If event is an object, try to match its constructor
27
- let eventKey = event.constructor;
28
- if (this.listeners.has(eventKey)) {
29
- listeners = this.listeners.get(eventKey);
30
- }
31
- // Also check if we dispatched a class directly (rare but possible in some patterns)
32
- if (typeof event === 'function' && this.listeners.has(event)) {
33
- listeners = listeners.concat(this.listeners.get(event));
45
+ if (this.isFaking) {
46
+ this.dispatched.push(event);
47
+ return;
34
48
  }
35
- // TODO: Wildcard listeners
49
+ const listeners = this.getSortedListeners(event);
36
50
  if (listeners.length > 0) {
37
51
  await this.dispatcher.dispatch(event, listeners);
38
52
  }
39
53
  }
54
+ getSortedListeners(event) {
55
+ let listeners = [];
56
+ // 1. Get exact listeners
57
+ const eventKey = typeof event === 'object' ? event.constructor : event;
58
+ if (this.listeners.has(eventKey)) {
59
+ listeners = [...this.listeners.get(eventKey)];
60
+ }
61
+ // 2. Get wildcard listeners
62
+ if (typeof event === 'string' || (typeof event === 'object' && event.constructor.name)) {
63
+ const eventName = typeof event === 'string' ? event : event.constructor.name;
64
+ for (const [pattern, wildcardListeners] of this.wildcards.entries()) {
65
+ if (this.matchWildcard(pattern, eventName)) {
66
+ listeners = listeners.concat(wildcardListeners);
67
+ }
68
+ }
69
+ }
70
+ // 3. Sort by priority (descending)
71
+ return listeners
72
+ .sort((a, b) => b.priority - a.priority)
73
+ .map(l => l.listener);
74
+ }
75
+ matchWildcard(pattern, eventName) {
76
+ const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
77
+ return regex.test(eventName);
78
+ }
40
79
  // Testing helpers
41
80
  fake() {
42
- // Implement fake logic for testing
81
+ this.isFaking = true;
43
82
  }
44
- assertDispatched(event) {
45
- // Implement assertion
83
+ assertDispatched(event, callback) {
84
+ const found = this.dispatched.some(e => {
85
+ const matches = e instanceof event || e.constructor === event || e === event;
86
+ if (matches && callback) {
87
+ return callback(e);
88
+ }
89
+ return matches;
90
+ });
91
+ if (!found) {
92
+ throw new Error(`Event [${event.name || event}] was not dispatched.`);
93
+ }
46
94
  }
47
95
  }
48
96
  exports.EventManager = EventManager;
@@ -1 +1 @@
1
- {"version":3,"file":"EventManager.js","sourceRoot":"","sources":["../src/EventManager.ts"],"names":[],"mappings":";;;AACA,6CAA0C;AAC1C,yDAAsD;AAGtD,MAAa,YAAY;IAKrB,YAAY,QAA2B;QAJ/B,cAAS,GAAoB,IAAI,GAAG,EAAE,CAAC;QAK3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,mCAAgB,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAEM,MAAM,CAAC,KAAU,EAAE,QAAa;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,KAAU;QACpB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAU;QAC5B,IAAI,SAAS,GAAU,EAAE,CAAC;QAE1B,yCAAyC;QACzC,sDAAsD;QACtD,IAAI,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QAC9C,CAAC;QAED,oFAAoF;QACpF,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAC;QAC7D,CAAC;QAED,2BAA2B;QAE3B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,kBAAkB;IACX,IAAI;QACP,mCAAmC;IACvC,CAAC;IAEM,gBAAgB,CAAC,KAAU;QAC9B,sBAAsB;IAC1B,CAAC;CACJ;AArDD,oCAqDC"}
1
+ {"version":3,"file":"EventManager.js","sourceRoot":"","sources":["../src/EventManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListenerResolver.d.ts","sourceRoot":"","sources":["../src/ListenerResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,qBAAa,gBAAgB;IAGnB,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAWlD"}
1
+ {"version":3,"file":"ListenerResolver.d.ts","sourceRoot":"","sources":["../src/ListenerResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,qBAAa,gBAAgB;IAGnB,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkBlD"}
@@ -7,13 +7,18 @@ class ListenerResolver {
7
7
  // For now we do a simple instantiation
8
8
  async resolve(listener) {
9
9
  if (typeof listener === 'function') {
10
- try {
11
- // @ts-ignore - Assuming no-arg constructor or DI handles it
12
- return new listener();
13
- }
14
- catch (e) {
15
- throw new EventException_1.EventException(`Resolver failed to instantiate listener: ${e.message}`);
10
+ const isClass = /^\s*class\s+/.test(listener.toString()) ||
11
+ (listener.prototype && typeof listener.prototype.handle === 'function');
12
+ if (isClass) {
13
+ try {
14
+ return new listener();
15
+ }
16
+ catch (e) {
17
+ throw new EventException_1.EventException(`Resolver failed to instantiate listener: ${e.message}`);
18
+ }
16
19
  }
20
+ // It's a closure/function, wrap it in a listener object
21
+ return { handle: listener };
17
22
  }
18
23
  return listener;
19
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ListenerResolver.js","sourceRoot":"","sources":["../src/ListenerResolver.ts"],"names":[],"mappings":";;;AAGA,gEAA6D;AAE7D,MAAa,gBAAgB;IACzB,4DAA4D;IAC5D,uCAAuC;IACvC,KAAK,CAAC,OAAO,CAAC,QAAa;QACvB,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC;gBACD,4DAA4D;gBAC5D,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC1B,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,MAAM,IAAI,+BAAc,CAAC,4CAA4C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACtF,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAdD,4CAcC"}
1
+ {"version":3,"file":"ListenerResolver.js","sourceRoot":"","sources":["../src/ListenerResolver.ts"],"names":[],"mappings":";;;AAGA,gEAA6D;AAE7D,MAAa,gBAAgB;IACzB,4DAA4D;IAC5D,uCAAuC;IACvC,KAAK,CAAC,OAAO,CAAC,QAAa;QACvB,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACpD,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAE5E,IAAI,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC;oBACD,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC1B,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBACd,MAAM,IAAI,+BAAc,CAAC,4CAA4C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtF,CAAC;YACL,CAAC;YAED,wDAAwD;YACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AArBD,4CAqBC"}
package/dist/index.d.ts CHANGED
@@ -4,10 +4,13 @@ import { EventException } from './Exceptions/EventException';
4
4
  export declare class Event {
5
5
  private static instance;
6
6
  static dispatch(event: any): Promise<void>;
7
- static listen(event: any, listener: any): EventManager;
7
+ static listen(event: any, listener: any, priority?: number): EventManager;
8
8
  static forget(event: any): EventManager;
9
9
  static fake(): void;
10
+ static assertDispatched(event: any, callback?: (event: any) => boolean): any;
11
+ static subscribe(subscriber: any): void;
10
12
  static setManager(manager: EventManager): void;
13
+ static getManager(): EventManager;
11
14
  }
12
15
  export { EventManager, Listener, EventException };
13
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;WAE7C,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;WAInC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG;WAIhC,MAAM,CAAC,KAAK,EAAE,GAAG;WAIjB,IAAI;WAKJ,UAAU,CAAC,OAAO,EAAE,YAAY;CAGjD;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;WAE7C,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;WAInC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAE,MAAU;WAItD,MAAM,CAAC,KAAK,EAAE,GAAG;WAIjB,IAAI;WAIJ,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO;WAI/D,SAAS,CAAC,UAAU,EAAE,GAAG;WAKzB,UAAU,CAAC,OAAO,EAAE,YAAY;WAIhC,UAAU,IAAI,YAAY;CAG3C;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -9,8 +9,8 @@ class Event {
9
9
  static dispatch(event) {
10
10
  return this.instance.dispatch(event);
11
11
  }
12
- static listen(event, listener) {
13
- return this.instance.listen(event, listener);
12
+ static listen(event, listener, priority = 0) {
13
+ return this.instance.listen(event, listener, priority);
14
14
  }
15
15
  static forget(event) {
16
16
  return this.instance.forget(event);
@@ -18,10 +18,19 @@ class Event {
18
18
  static fake() {
19
19
  return this.instance.fake();
20
20
  }
21
+ static assertDispatched(event, callback) {
22
+ return this.instance.assertDispatched(event, callback);
23
+ }
24
+ static subscribe(subscriber) {
25
+ return this.instance.subscribe(subscriber);
26
+ }
21
27
  // Facade helper to set a custom manager
22
28
  static setManager(manager) {
23
29
  this.instance = manager;
24
30
  }
31
+ static getManager() {
32
+ return this.instance;
33
+ }
25
34
  }
26
35
  exports.Event = Event;
27
36
  Event.instance = new EventManager_1.EventManager();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iDAA8C;AA6BrC,6FA7BA,2BAAY,OA6BA;AA3BrB,gEAA6D;AA2B5B,+FA3BxB,+BAAc,OA2BwB;AAzB/C,MAAa,KAAK;IAGP,MAAM,CAAC,QAAQ,CAAC,KAAU;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAU,EAAE,QAAa;QAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAU;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,wCAAwC;IACjC,MAAM,CAAC,UAAU,CAAC,OAAqB;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;;AAtBL,sBAuBC;AAtBkB,cAAQ,GAAiB,IAAI,2BAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iDAA8C;AAyCrC,6FAzCA,2BAAY,OAyCA;AAvCrB,gEAA6D;AAuC5B,+FAvCxB,+BAAc,OAuCwB;AArC/C,MAAa,KAAK;IAGP,MAAM,CAAC,QAAQ,CAAC,KAAU;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAU,EAAE,QAAa,EAAE,WAAmB,CAAC;QAChE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAU;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,KAAU,EAAE,QAAkC;QACzE,OAAQ,IAAI,CAAC,QAAgB,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,UAAe;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,wCAAwC;IACjC,MAAM,CAAC,UAAU,CAAC,OAAqB;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,UAAU;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;;AAlCL,sBAmCC;AAlCkB,cAAQ,GAAiB,IAAI,2BAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,45 +1,47 @@
1
1
  {
2
- "name": "@arikajs/events",
3
- "version": "0.0.3",
4
- "description": "Event dispatching and listener system for the ArikaJS framework.",
5
- "license": "MIT",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "scripts": {
9
- "build": "tsc -p tsconfig.json",
10
- "build:tests": "tsc -p tsconfig.test.json",
11
- "clean": "rm -rf dist",
12
- "prepare": "echo skip",
13
- "test": "npm run build && npm run build:tests && node scripts/fix-test-imports.js && node --test 'dist/tests/**/*.test.js'",
14
- "test:watch": "npm run build && npm run build:tests && node --test --watch 'dist/tests/**/*.test.js'"
15
- },
16
- "files": [
17
- "dist"
18
- ],
19
- "keywords": [
20
- "arika",
21
- "arika-js",
22
- "framework",
23
- "events",
24
- "listener",
25
- "dispatcher",
26
- "observer"
27
- ],
28
- "engines": {
29
- "node": ">=20.0.0"
30
- },
31
- "repository": {
32
- "type": "git",
33
- "url": "git+https://github.com/arikajs/events.git"
34
- },
35
- "bugs": {
36
- "url": "https://github.com/arikajs/events/issues"
37
- },
38
- "homepage": "https://github.com/arikajs/events#readme",
39
- "dependencies": {},
40
- "devDependencies": {
41
- "@types/node": "^20.11.24",
42
- "typescript": "^5.3.3"
43
- },
44
- "author": "Prakash Tank"
2
+ "name": "@arikajs/events",
3
+ "version": "0.0.5",
4
+ "description": "Event dispatching and listener system for the ArikaJS framework.",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc -p tsconfig.json",
10
+ "build:tests": "tsc -p tsconfig.test.json",
11
+ "clean": "rm -rf dist",
12
+ "prepare": "echo skip",
13
+ "test": "npx tsx --test tests/**/*.test.ts",
14
+ "test:watch": "npx tsx --test --watch tests/**/*.test.ts",
15
+ "dev": "tsc -p tsconfig.json --watch"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "arika",
22
+ "arika-js",
23
+ "framework",
24
+ "events",
25
+ "listener",
26
+ "dispatcher",
27
+ "observer"
28
+ ],
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/ArikaJs/arikajs.git",
35
+ "directory": "packages/events"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/ArikaJs/arikajs/issues"
39
+ },
40
+ "homepage": "https://github.com/ArikaJs/arikajs/tree/main/packages/events#readme",
41
+ "dependencies": {},
42
+ "devDependencies": {
43
+ "@types/node": "^20.11.24",
44
+ "typescript": "^5.3.3"
45
+ },
46
+ "author": "Prakash Tank"
45
47
  }