@zdavison/matador-nest 2.0.9 → 2.0.11

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.
Files changed (64) hide show
  1. package/dist/constants.d.ts +13 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/{src/constants.ts → dist/constants.js} +0 -2
  4. package/dist/decorators/index.d.ts +3 -0
  5. package/dist/decorators/index.d.ts.map +1 -0
  6. package/dist/decorators/matador-subscriber.decorator.d.ts +20 -0
  7. package/dist/decorators/matador-subscriber.decorator.d.ts.map +1 -0
  8. package/{src/decorators/matador-subscriber.decorator.ts → dist/decorators/matador-subscriber.decorator.js} +7 -8
  9. package/dist/decorators/on-matador-event.decorator.d.ts +24 -0
  10. package/dist/decorators/on-matador-event.decorator.d.ts.map +1 -0
  11. package/dist/decorators/on-matador-event.decorator.js +38 -0
  12. package/dist/discovery/index.d.ts +2 -0
  13. package/dist/discovery/index.d.ts.map +1 -0
  14. package/dist/discovery/subscriber-discovery.service.d.ts +37 -0
  15. package/dist/discovery/subscriber-discovery.service.d.ts.map +1 -0
  16. package/dist/discovery/subscriber-discovery.service.js +143 -0
  17. package/dist/index.cjs +490 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.cts +7 -0
  20. package/dist/index.d.ts +7 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/{src/index.ts → dist/index.js} +1 -19
  23. package/dist/index.js.map +1 -0
  24. package/dist/module/index.d.ts +2 -0
  25. package/dist/module/index.d.ts.map +1 -0
  26. package/dist/module/matador.module.d.ts +75 -0
  27. package/dist/module/matador.module.d.ts.map +1 -0
  28. package/dist/module/matador.module.js +150 -0
  29. package/dist/services/index.d.ts +2 -0
  30. package/dist/services/index.d.ts.map +1 -0
  31. package/dist/services/matador.service.d.ts +105 -0
  32. package/dist/services/matador.service.d.ts.map +1 -0
  33. package/dist/services/matador.service.js +202 -0
  34. package/dist/testing/index.d.ts +2 -0
  35. package/dist/testing/index.d.ts.map +1 -0
  36. package/{src/testing/matador-testing.module.ts → dist/testing/matador-testing.module.d.ts} +10 -28
  37. package/dist/testing/matador-testing.module.d.ts.map +1 -0
  38. package/dist/testing/matador-testing.module.js +77 -0
  39. package/dist/testing.cjs +493 -0
  40. package/dist/testing.cjs.map +1 -0
  41. package/dist/testing.d.cts +2 -0
  42. package/dist/testing.d.ts +2 -0
  43. package/dist/testing.d.ts.map +1 -0
  44. package/dist/testing.js.map +1 -0
  45. package/dist/types.d.ts +96 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +1 -0
  48. package/package.json +7 -4
  49. package/src/decorators/on-matador-event.decorator.ts +0 -68
  50. package/src/discovery/subscriber-discovery.service.ts +0 -181
  51. package/src/module/matador.module.ts +0 -166
  52. package/src/services/matador.service.ts +0 -283
  53. package/src/types.ts +0 -125
  54. package/test/decorators.test.ts +0 -132
  55. package/test/discovery.test.ts +0 -264
  56. package/test/tsconfig.json +0 -9
  57. package/tsconfig.json +0 -32
  58. package/tsup.config.ts +0 -23
  59. /package/{src/decorators/index.ts → dist/decorators/index.js} +0 -0
  60. /package/{src/discovery/index.ts → dist/discovery/index.js} +0 -0
  61. /package/{src/module/index.ts → dist/module/index.js} +0 -0
  62. /package/{src/services/index.ts → dist/services/index.js} +0 -0
  63. /package/{src/testing/index.ts → dist/testing/index.js} +0 -0
  64. /package/{src/testing.ts → dist/testing.js} +0 -0
@@ -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
- });
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "../tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "..",
5
- "noEmit": true,
6
- "composite": false
7
- },
8
- "include": ["**/*", "../src/**/*"]
9
- }
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