@zdavison/matador-nest 2.0.9 → 2.0.10
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/dist/constants.d.ts +13 -0
- package/dist/constants.d.ts.map +1 -0
- package/{src/constants.ts → dist/constants.js} +0 -2
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/matador-subscriber.decorator.d.ts +20 -0
- package/dist/decorators/matador-subscriber.decorator.d.ts.map +1 -0
- package/{src/decorators/matador-subscriber.decorator.ts → dist/decorators/matador-subscriber.decorator.js} +7 -8
- package/dist/decorators/on-matador-event.decorator.d.ts +24 -0
- package/dist/decorators/on-matador-event.decorator.d.ts.map +1 -0
- package/dist/decorators/on-matador-event.decorator.js +38 -0
- package/dist/discovery/index.d.ts +2 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/subscriber-discovery.service.d.ts +37 -0
- package/dist/discovery/subscriber-discovery.service.d.ts.map +1 -0
- package/dist/discovery/subscriber-discovery.service.js +143 -0
- package/dist/index.cjs +495 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -19
- package/dist/index.js.map +1 -0
- package/dist/module/index.d.ts +2 -0
- package/dist/module/index.d.ts.map +1 -0
- package/dist/module/matador.module.d.ts +75 -0
- package/dist/module/matador.module.d.ts.map +1 -0
- package/dist/module/matador.module.js +150 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/matador.service.d.ts +105 -0
- package/dist/services/matador.service.d.ts.map +1 -0
- package/dist/services/matador.service.js +208 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/{src/testing/matador-testing.module.ts → dist/testing/matador-testing.module.d.ts} +10 -28
- package/dist/testing/matador-testing.module.d.ts.map +1 -0
- package/dist/testing/matador-testing.module.js +77 -0
- package/dist/testing.cjs +498 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +2 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +7 -4
- package/src/decorators/on-matador-event.decorator.ts +0 -68
- package/src/discovery/subscriber-discovery.service.ts +0 -181
- package/src/module/matador.module.ts +0 -166
- package/src/services/matador.service.ts +0 -283
- package/src/types.ts +0 -125
- package/test/decorators.test.ts +0 -132
- package/test/discovery.test.ts +0 -264
- package/test/tsconfig.json +0 -9
- package/tsconfig.json +0 -32
- package/tsup.config.ts +0 -23
- /package/{src/decorators/index.ts → dist/decorators/index.js} +0 -0
- /package/{src/discovery/index.ts → dist/discovery/index.js} +0 -0
- /package/{src/module/index.ts → dist/module/index.js} +0 -0
- /package/{src/services/index.ts → dist/services/index.js} +0 -0
- /package/{src/testing/index.ts → dist/testing/index.js} +0 -0
- /package/{src/testing.ts → dist/testing.js} +0 -0
package/test/discovery.test.ts
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
-
import 'reflect-metadata';
|
|
3
|
-
import type { DiscoveryService } from '@nestjs/core';
|
|
4
|
-
import { type Envelope, MatadorEvent } from '@zdavison/matador';
|
|
5
|
-
import { OnMatadorEvent } from '../src/decorators/on-matador-event.decorator.js';
|
|
6
|
-
import { SubscriberDiscoveryService } from '../src/discovery/subscriber-discovery.service.js';
|
|
7
|
-
|
|
8
|
-
// Test events
|
|
9
|
-
class UserCreatedEvent extends MatadorEvent<{ userId: string }> {
|
|
10
|
-
static readonly key = 'user.created';
|
|
11
|
-
static readonly description = 'User created event';
|
|
12
|
-
|
|
13
|
-
constructor(public readonly data: { userId: string }) {
|
|
14
|
-
super();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
class OrderPlacedEvent extends MatadorEvent<{ orderId: string }> {
|
|
19
|
-
static readonly key = 'order.placed';
|
|
20
|
-
static readonly description = 'Order placed event';
|
|
21
|
-
|
|
22
|
-
constructor(public readonly data: { orderId: string }) {
|
|
23
|
-
super();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
describe('SubscriberDiscoveryService', () => {
|
|
28
|
-
let discoveryService: SubscriberDiscoveryService;
|
|
29
|
-
let mockNestDiscovery: { getProviders: () => Array<{ instance: unknown }> };
|
|
30
|
-
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
mockNestDiscovery = {
|
|
33
|
-
getProviders: () => [],
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('discovers decorated methods and builds schema', () => {
|
|
38
|
-
// Create a service with decorated handlers
|
|
39
|
-
class TestService {
|
|
40
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
41
|
-
description: 'Handles user creation',
|
|
42
|
-
})
|
|
43
|
-
async onUserCreated(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
44
|
-
// handler
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const instance = new TestService();
|
|
49
|
-
|
|
50
|
-
mockNestDiscovery.getProviders = () => [
|
|
51
|
-
{
|
|
52
|
-
instance,
|
|
53
|
-
},
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
57
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
// Trigger discovery (simulates onModuleInit)
|
|
61
|
-
discoveryService.onModuleInit();
|
|
62
|
-
|
|
63
|
-
const schema = discoveryService.getSchema();
|
|
64
|
-
|
|
65
|
-
expect(schema[UserCreatedEvent.key]).toBeDefined();
|
|
66
|
-
const [eventClass, subscribers] = schema[UserCreatedEvent.key] as [
|
|
67
|
-
unknown,
|
|
68
|
-
unknown[],
|
|
69
|
-
];
|
|
70
|
-
expect(eventClass).toBe(UserCreatedEvent);
|
|
71
|
-
expect(subscribers).toHaveLength(1);
|
|
72
|
-
expect(subscribers[0]).toHaveProperty('name', 'TestService.onUserCreated');
|
|
73
|
-
expect(subscribers[0]).toHaveProperty(
|
|
74
|
-
'description',
|
|
75
|
-
'Handles user creation',
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('uses custom name when provided', () => {
|
|
80
|
-
class TestService {
|
|
81
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
82
|
-
name: 'custom-handler-name',
|
|
83
|
-
description: 'Handles user creation',
|
|
84
|
-
})
|
|
85
|
-
async onUserCreated(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
86
|
-
// handler
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const instance = new TestService();
|
|
91
|
-
|
|
92
|
-
mockNestDiscovery.getProviders = () => [
|
|
93
|
-
{
|
|
94
|
-
instance,
|
|
95
|
-
},
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
99
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
discoveryService.onModuleInit();
|
|
103
|
-
|
|
104
|
-
const schema = discoveryService.getSchema();
|
|
105
|
-
const [, subscribers] = schema[UserCreatedEvent.key] as [
|
|
106
|
-
unknown,
|
|
107
|
-
unknown[],
|
|
108
|
-
];
|
|
109
|
-
expect(subscribers[0]).toHaveProperty('name', 'custom-handler-name');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('discovers multiple handlers for the same event', () => {
|
|
113
|
-
class ServiceA {
|
|
114
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
115
|
-
description: 'Handler A',
|
|
116
|
-
})
|
|
117
|
-
async handle(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
118
|
-
// handler
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
class ServiceB {
|
|
123
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
124
|
-
description: 'Handler B',
|
|
125
|
-
})
|
|
126
|
-
async handle(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
127
|
-
// handler
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const instanceA = new ServiceA();
|
|
132
|
-
const instanceB = new ServiceB();
|
|
133
|
-
|
|
134
|
-
mockNestDiscovery.getProviders = () => [
|
|
135
|
-
{ instance: instanceA },
|
|
136
|
-
{ instance: instanceB },
|
|
137
|
-
];
|
|
138
|
-
|
|
139
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
140
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
discoveryService.onModuleInit();
|
|
144
|
-
|
|
145
|
-
const schema = discoveryService.getSchema();
|
|
146
|
-
const [, subscribers] = schema[UserCreatedEvent.key] as [
|
|
147
|
-
unknown,
|
|
148
|
-
unknown[],
|
|
149
|
-
];
|
|
150
|
-
expect(subscribers).toHaveLength(2);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('discovers handlers for different events', () => {
|
|
154
|
-
class TestService {
|
|
155
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
156
|
-
description: 'User handler',
|
|
157
|
-
})
|
|
158
|
-
async onUserCreated(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
159
|
-
// handler
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
@OnMatadorEvent(OrderPlacedEvent, {
|
|
163
|
-
description: 'Order handler',
|
|
164
|
-
})
|
|
165
|
-
async onOrderPlaced(_envelope: Envelope<OrderPlacedEvent['data']>) {
|
|
166
|
-
// handler
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const instance = new TestService();
|
|
171
|
-
|
|
172
|
-
mockNestDiscovery.getProviders = () => [
|
|
173
|
-
{
|
|
174
|
-
instance,
|
|
175
|
-
},
|
|
176
|
-
];
|
|
177
|
-
|
|
178
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
179
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
discoveryService.onModuleInit();
|
|
183
|
-
|
|
184
|
-
const schema = discoveryService.getSchema();
|
|
185
|
-
|
|
186
|
-
expect(schema[UserCreatedEvent.key]).toBeDefined();
|
|
187
|
-
expect(schema[OrderPlacedEvent.key]).toBeDefined();
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('skips providers without decorated methods', () => {
|
|
191
|
-
class PlainService {
|
|
192
|
-
someMethod() {
|
|
193
|
-
return 'plain';
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const instance = new PlainService();
|
|
198
|
-
|
|
199
|
-
mockNestDiscovery.getProviders = () => [
|
|
200
|
-
{
|
|
201
|
-
instance,
|
|
202
|
-
},
|
|
203
|
-
];
|
|
204
|
-
|
|
205
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
206
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
207
|
-
);
|
|
208
|
-
|
|
209
|
-
discoveryService.onModuleInit();
|
|
210
|
-
|
|
211
|
-
const schema = discoveryService.getSchema();
|
|
212
|
-
expect(Object.keys(schema)).toHaveLength(0);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it('merges additional events from options', () => {
|
|
216
|
-
class TestService {
|
|
217
|
-
@OnMatadorEvent(UserCreatedEvent, {
|
|
218
|
-
description: 'Discovered handler',
|
|
219
|
-
})
|
|
220
|
-
async handle(_envelope: Envelope<UserCreatedEvent['data']>) {
|
|
221
|
-
// handler
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const instance = new TestService();
|
|
226
|
-
|
|
227
|
-
mockNestDiscovery.getProviders = () => [
|
|
228
|
-
{
|
|
229
|
-
instance,
|
|
230
|
-
},
|
|
231
|
-
];
|
|
232
|
-
|
|
233
|
-
discoveryService = new SubscriberDiscoveryService(
|
|
234
|
-
mockNestDiscovery as unknown as DiscoveryService,
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
discoveryService.onModuleInit();
|
|
238
|
-
|
|
239
|
-
// Additional event with subscriber
|
|
240
|
-
const additionalSubscriber = {
|
|
241
|
-
name: 'additional-subscriber',
|
|
242
|
-
description: 'Additional handler',
|
|
243
|
-
callback: async () => {},
|
|
244
|
-
importance: 'should-investigate' as const,
|
|
245
|
-
idempotent: 'unknown' as const,
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
const mergedSchema = discoveryService.getMergedSchema({
|
|
249
|
-
transport: {} as never,
|
|
250
|
-
topology: {} as never,
|
|
251
|
-
additionalEvents: [[OrderPlacedEvent, [additionalSubscriber]]],
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
expect(mergedSchema[UserCreatedEvent.key]).toBeDefined();
|
|
255
|
-
expect(mergedSchema[OrderPlacedEvent.key]).toBeDefined();
|
|
256
|
-
|
|
257
|
-
const [, orderSubscribers] = mergedSchema[OrderPlacedEvent.key] as [
|
|
258
|
-
unknown,
|
|
259
|
-
unknown[],
|
|
260
|
-
];
|
|
261
|
-
expect(orderSubscribers).toHaveLength(1);
|
|
262
|
-
expect(orderSubscribers[0]).toHaveProperty('name', 'additional-subscriber');
|
|
263
|
-
});
|
|
264
|
-
});
|
package/test/tsconfig.json
DELETED
package/tsconfig.json
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"composite": true,
|
|
4
|
-
"target": "ES2022",
|
|
5
|
-
"module": "NodeNext",
|
|
6
|
-
"moduleResolution": "NodeNext",
|
|
7
|
-
"lib": ["ES2022"],
|
|
8
|
-
"strict": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"forceConsistentCasingInFileNames": true,
|
|
12
|
-
"declaration": true,
|
|
13
|
-
"declarationMap": true,
|
|
14
|
-
"outDir": "./dist",
|
|
15
|
-
"rootDir": "./src",
|
|
16
|
-
"noEmit": false,
|
|
17
|
-
"noUnusedLocals": true,
|
|
18
|
-
"noUnusedParameters": true,
|
|
19
|
-
"noImplicitReturns": true,
|
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"exactOptionalPropertyTypes": true,
|
|
22
|
-
"noUncheckedIndexedAccess": true,
|
|
23
|
-
"resolveJsonModule": true,
|
|
24
|
-
"isolatedModules": true,
|
|
25
|
-
"verbatimModuleSyntax": true,
|
|
26
|
-
"experimentalDecorators": true,
|
|
27
|
-
"emitDecoratorMetadata": true
|
|
28
|
-
},
|
|
29
|
-
"include": ["src/**/*"],
|
|
30
|
-
"exclude": ["node_modules", "dist"],
|
|
31
|
-
"references": [{ "path": "../matador" }]
|
|
32
|
-
}
|
package/tsup.config.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'tsup';
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
entry: ['src/index.ts', 'src/testing.ts'],
|
|
5
|
-
format: ['cjs', 'esm'],
|
|
6
|
-
dts: false,
|
|
7
|
-
splitting: false,
|
|
8
|
-
sourcemap: true,
|
|
9
|
-
clean: false,
|
|
10
|
-
outDir: 'dist',
|
|
11
|
-
target: 'node18',
|
|
12
|
-
treeshake: true,
|
|
13
|
-
// Keep class names for NestJS DI to work properly
|
|
14
|
-
keepNames: true,
|
|
15
|
-
external: [
|
|
16
|
-
'@nestjs/common',
|
|
17
|
-
'@nestjs/core',
|
|
18
|
-
'@nestjs/testing',
|
|
19
|
-
'@zdavison/matador',
|
|
20
|
-
'reflect-metadata',
|
|
21
|
-
'rxjs',
|
|
22
|
-
],
|
|
23
|
-
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|