@adonisjs/events 7.1.3 → 7.2.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.
@@ -40,11 +40,87 @@ declare module '@ioc:Adonis/Core/Event' {
40
40
  clearListeners(event?: string): any;
41
41
  listenerCount(event?: string): number;
42
42
  }
43
+ /**
44
+ * Fake emitter to be used for finding and asserting
45
+ * faked events
46
+ */
47
+ export interface FakeEmitterContract {
48
+ /**
49
+ * Returns all the emitted events
50
+ */
51
+ all(): {
52
+ name: string;
53
+ data: any;
54
+ }[];
55
+ /**
56
+ * Find if the event exists
57
+ */
58
+ exists<K extends keyof EventsList>(event: K): boolean;
59
+ exists(event: string): boolean;
60
+ exists<Events extends Record<string, any> = EventsList>(matchCallback: (event: {
61
+ [K in keyof Events]: {
62
+ name: K;
63
+ data: Events[K];
64
+ };
65
+ }[keyof Events]) => boolean): boolean;
66
+ /**
67
+ * Find an event
68
+ */
69
+ find<K extends keyof EventsList>(event: K): {
70
+ name: K;
71
+ data: DataForEvent<K>;
72
+ } | null;
73
+ find(event: string): {
74
+ name: string;
75
+ data: any;
76
+ };
77
+ find<Events extends Record<string, any> = EventsList>(matchCallback: (event: {
78
+ [K in keyof Events]: {
79
+ name: K;
80
+ data: Events[K];
81
+ };
82
+ }[keyof Events]) => boolean): {
83
+ [K in keyof Events]: {
84
+ name: K;
85
+ data: Events[K];
86
+ };
87
+ }[keyof Events] | null;
88
+ /**
89
+ * Find multiple events
90
+ */
91
+ filter<K extends keyof EventsList>(event: K): {
92
+ name: K;
93
+ data: DataForEvent<K>;
94
+ }[];
95
+ filter(event: string): {
96
+ name: string;
97
+ data: any;
98
+ }[];
99
+ filter<Events extends Record<string, any> = EventsList>(matchCallback: (event: {
100
+ [K in keyof Events]: {
101
+ name: K;
102
+ data: Events[K];
103
+ };
104
+ }[keyof Events]) => boolean): {
105
+ [K in keyof Events]: {
106
+ name: K;
107
+ data: Events[K];
108
+ };
109
+ }[keyof Events][];
110
+ /**
111
+ * Get number of events emitted
112
+ */
113
+ size(): number;
114
+ }
43
115
  /**
44
116
  * Shape of Event emitter
45
117
  */
46
118
  export interface EmitterContract {
47
119
  transport: EmitterTransportContract;
120
+ /**
121
+ * Fake the upcoming events
122
+ */
123
+ fake<K extends keyof EventsList>(events?: K[] | string[]): FakeEmitterContract;
48
124
  /**
49
125
  * Define a custom error handler
50
126
  */
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../../adonis-typings/events.d.ts" />
2
2
  import { ApplicationContract } from '@ioc:Adonis/Core/Application';
3
3
  import { AnyHandler, EventsList, TrapHandler, EventHandler, DataForEvent, ErrorHandler, TrapAllHandler, EmitterContract, EmitterTransportContract } from '@ioc:Adonis/Core/Event';
4
+ import { FakeEmitter } from '../FakeEmitter';
4
5
  /**
5
6
  * Emitter class exposes the API for async event emitter built on top of
6
7
  * Emittery. It also exposes an API to pre-define the Typescript types
@@ -9,10 +10,21 @@ import { AnyHandler, EventsList, TrapHandler, EventHandler, DataForEvent, ErrorH
9
10
  export declare class Emitter implements EmitterContract {
10
11
  transport: EmitterTransportContract;
11
12
  private iocResolver?;
13
+ /**
14
+ * Error handler to report emitter errors
15
+ */
16
+ private errorHandler?;
17
+ /**
18
+ * Deprecated properties to manage trapping events
19
+ */
12
20
  private trappingEvents;
13
21
  private traps;
14
22
  private trapAllHandler?;
15
- private errorHandler?;
23
+ /**
24
+ * Fakes
25
+ */
26
+ private eventsToFake;
27
+ private fakeEmitter?;
16
28
  constructor(app?: ApplicationContract);
17
29
  /**
18
30
  * Returns reference to the IoC resolver. Do not call this method until
@@ -85,7 +97,12 @@ export declare class Emitter implements EmitterContract {
85
97
  */
86
98
  trapAll(handler: TrapAllHandler): this;
87
99
  /**
88
- * Restore trap
100
+ * Fake event emitter to collect events in-memory vs
101
+ * emitting them
102
+ */
103
+ fake(events?: any[]): FakeEmitter;
104
+ /**
105
+ * Restore trap and fake
89
106
  */
90
107
  restore(): this;
91
108
  }
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.Emitter = void 0;
15
15
  /// <reference path="../../adonis-typings/events.ts" />
16
16
  const emittery_1 = __importDefault(require("emittery"));
17
+ const FakeEmitter_1 = require("../FakeEmitter");
17
18
  const IocResolver_1 = require("../IocResolver");
18
19
  /**
19
20
  * Emitter class exposes the API for async event emitter built on top of
@@ -23,8 +24,15 @@ const IocResolver_1 = require("../IocResolver");
23
24
  class Emitter {
24
25
  constructor(app) {
25
26
  this.transport = new emittery_1.default();
27
+ /**
28
+ * Deprecated properties to manage trapping events
29
+ */
26
30
  this.trappingEvents = false;
27
31
  this.traps = new Map();
32
+ /**
33
+ * Fakes
34
+ */
35
+ this.eventsToFake = new Set();
28
36
  if (app) {
29
37
  this.iocResolver = new IocResolver_1.IocResolver(app);
30
38
  }
@@ -87,21 +95,30 @@ class Emitter {
87
95
  */
88
96
  async emit(event, data) {
89
97
  try {
98
+ let shouldEmitEvent = true;
99
+ /**
100
+ * Register event with the fake emitter
101
+ */
102
+ if (this.fakeEmitter && (this.eventsToFake.has('*') || this.eventsToFake.has(event))) {
103
+ shouldEmitEvent = false;
104
+ this.fakeEmitter.events.push({ name: event, data });
105
+ }
90
106
  if (this.trappingEvents) {
91
107
  /**
92
108
  * Give preference to the handler for a specific event
93
109
  */
94
110
  if (this.traps.has(event)) {
95
- return await this.traps.get(event)(data);
111
+ shouldEmitEvent = false;
112
+ await this.traps.get(event)(data);
96
113
  }
97
- /**
98
- * Invoke catch all (if defined)
99
- */
100
- if (this.trapAllHandler) {
101
- return await this.trapAllHandler(event, data);
114
+ else if (this.trapAllHandler) {
115
+ shouldEmitEvent = false;
116
+ await this.trapAllHandler(event, data);
102
117
  }
103
118
  }
104
- return await this.transport.emit(event, data);
119
+ if (shouldEmitEvent) {
120
+ return await this.transport.emit(event, data);
121
+ }
105
122
  }
106
123
  catch (error) {
107
124
  if (this.errorHandler) {
@@ -183,6 +200,7 @@ class Emitter {
183
200
  * Trap event instead of emitting it
184
201
  */
185
202
  trap(event, handler) {
203
+ process.emitWarning('DeprecationWarning', '"Event.trap" is deprecated. Instead use "Event.fake" method');
186
204
  this.trappingEvents = true;
187
205
  this.traps.set(event, handler);
188
206
  return this;
@@ -191,17 +209,42 @@ class Emitter {
191
209
  * Trap all events instead of emitting them
192
210
  */
193
211
  trapAll(handler) {
212
+ process.emitWarning('DeprecationWarning', '"Event.trapAll" is deprecated. Instead use "Event.fake" method');
194
213
  this.trappingEvents = true;
195
214
  this.trapAllHandler = handler;
196
215
  return this;
197
216
  }
198
217
  /**
199
- * Restore trap
218
+ * Fake event emitter to collect events in-memory vs
219
+ * emitting them
220
+ */
221
+ fake(events) {
222
+ this.fakeEmitter = this.fakeEmitter || new FakeEmitter_1.FakeEmitter();
223
+ /**
224
+ * If no events have been mentioned, then fake
225
+ * all the events
226
+ */
227
+ if (!events) {
228
+ this.eventsToFake.add('*');
229
+ return this.fakeEmitter;
230
+ }
231
+ /**
232
+ * Only track event names when wildcard is not added
233
+ */
234
+ if (!this.eventsToFake.has('*')) {
235
+ events.forEach((event) => this.eventsToFake.add(event));
236
+ }
237
+ return this.fakeEmitter;
238
+ }
239
+ /**
240
+ * Restore trap and fake
200
241
  */
201
242
  restore() {
202
243
  this.trappingEvents = false;
203
- this.traps.clear();
204
244
  this.trapAllHandler = undefined;
245
+ this.fakeEmitter = undefined;
246
+ this.traps.clear();
247
+ this.eventsToFake.clear();
205
248
  return this;
206
249
  }
207
250
  }
@@ -0,0 +1,43 @@
1
+ import { FakeEmitterContract } from '@ioc:Adonis/Core/Event';
2
+ /**
3
+ * Fake emitter to be used for finding and asserting
4
+ * faked events
5
+ */
6
+ export declare class FakeEmitter implements FakeEmitterContract {
7
+ events: {
8
+ name: string;
9
+ data: any;
10
+ }[];
11
+ /**
12
+ * Get all the emitted events
13
+ */
14
+ all(): {
15
+ name: string;
16
+ data: any;
17
+ }[];
18
+ /**
19
+ * Returns the size of captured events
20
+ */
21
+ size(): number;
22
+ /**
23
+ * Find if the event has emitted
24
+ */
25
+ exists(eventOrCallback: string | ((event: {
26
+ name: string;
27
+ data: any;
28
+ }) => boolean)): boolean;
29
+ /**
30
+ * Get selected events
31
+ */
32
+ filter(eventOrCallback: string | ((event: {
33
+ name: string;
34
+ data: any;
35
+ }) => boolean)): any[];
36
+ /**
37
+ * Find a specific event
38
+ */
39
+ find(eventOrCallback: string | ((event: {
40
+ name: string;
41
+ data: any;
42
+ }) => boolean)): any;
43
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /*
3
+ * @adonisjs/events
4
+ *
5
+ * (c) AdonisJS
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.FakeEmitter = void 0;
12
+ /**
13
+ * Fake emitter to be used for finding and asserting
14
+ * faked events
15
+ */
16
+ class FakeEmitter {
17
+ constructor() {
18
+ this.events = [];
19
+ }
20
+ /**
21
+ * Get all the emitted events
22
+ */
23
+ all() {
24
+ return this.events;
25
+ }
26
+ /**
27
+ * Returns the size of captured events
28
+ */
29
+ size() {
30
+ return this.events.length;
31
+ }
32
+ /**
33
+ * Find if the event has emitted
34
+ */
35
+ exists(eventOrCallback) {
36
+ return !!this.find(eventOrCallback);
37
+ }
38
+ /**
39
+ * Get selected events
40
+ */
41
+ filter(eventOrCallback) {
42
+ if (typeof eventOrCallback === 'function') {
43
+ return this.events.filter(eventOrCallback);
44
+ }
45
+ return this.events.filter((event) => event.name === eventOrCallback);
46
+ }
47
+ /**
48
+ * Find a specific event
49
+ */
50
+ find(eventOrCallback) {
51
+ if (typeof eventOrCallback === 'function') {
52
+ return this.events.find(eventOrCallback);
53
+ }
54
+ return this.events.find((event) => event.name === eventOrCallback);
55
+ }
56
+ }
57
+ exports.FakeEmitter = FakeEmitter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonisjs/events",
3
- "version": "7.1.3",
3
+ "version": "7.2.0",
4
4
  "description": "Event emitter with asynchronous events",
5
5
  "main": "build/providers/EventProvider.js",
6
6
  "files": [
@@ -13,8 +13,8 @@
13
13
  "scripts": {
14
14
  "mrm": "mrm --preset=@adonisjs/mrm-preset",
15
15
  "pretest": "npm run lint",
16
- "test": "node .bin/test.js",
17
- "clean": "del build",
16
+ "test": "node -r @adonisjs/require-ts/build/register bin/test.ts",
17
+ "clean": "del-cli build",
18
18
  "compile": "npm run lint && npm run clean && tsc",
19
19
  "build": "npm run compile",
20
20
  "commit": "git-cz",
@@ -35,6 +35,10 @@
35
35
  "@adonisjs/application": "^5.1.5",
36
36
  "@adonisjs/mrm-preset": "^5.0.2",
37
37
  "@adonisjs/require-ts": "^2.0.7",
38
+ "@japa/assert": "^1.2.3",
39
+ "@japa/run-failed-tests": "^1.0.3",
40
+ "@japa/runner": "^2.0.6",
41
+ "@japa/spec-reporter": "^1.1.7",
38
42
  "@poppinss/dev-utils": "^2.0.1",
39
43
  "@types/node": "^17.0.8",
40
44
  "commitizen": "^4.2.4",
@@ -46,8 +50,7 @@
46
50
  "eslint-plugin-prettier": "^4.0.0",
47
51
  "github-label-sync": "^2.0.1",
48
52
  "husky": "^7.0.1",
49
- "japa": "^4.0.0",
50
- "mrm": "^3.0.2",
53
+ "mrm": "^4.0.0",
51
54
  "np": "^7.5.0",
52
55
  "prettier": "^2.3.2",
53
56
  "typescript": "^4.3.5"