@zdavison/matador 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 (259) hide show
  1. package/dist/checkpoint/context.d.ts +59 -0
  2. package/dist/checkpoint/context.d.ts.map +1 -0
  3. package/dist/checkpoint/context.js +140 -0
  4. package/dist/checkpoint/context.test.d.ts +2 -0
  5. package/dist/checkpoint/context.test.d.ts.map +1 -0
  6. package/dist/checkpoint/context.test.js +424 -0
  7. package/dist/checkpoint/index.d.ts +7 -0
  8. package/dist/checkpoint/index.d.ts.map +1 -0
  9. package/dist/checkpoint/index.js +6 -0
  10. package/dist/checkpoint/stores/memory.d.ts +29 -0
  11. package/dist/checkpoint/stores/memory.d.ts.map +1 -0
  12. package/dist/checkpoint/stores/memory.js +39 -0
  13. package/{src/checkpoint/stores/noop.ts → dist/checkpoint/stores/noop.d.ts} +5 -13
  14. package/dist/checkpoint/stores/noop.d.ts.map +1 -0
  15. package/dist/checkpoint/stores/noop.js +18 -0
  16. package/dist/checkpoint/stores/stores.test.d.ts +2 -0
  17. package/dist/checkpoint/stores/stores.test.d.ts.map +1 -0
  18. package/dist/checkpoint/stores/stores.test.js +146 -0
  19. package/dist/checkpoint/types.d.ts +119 -0
  20. package/dist/checkpoint/types.d.ts.map +1 -0
  21. package/dist/checkpoint/types.js +1 -0
  22. package/dist/codec/codec.d.ts +29 -0
  23. package/dist/codec/codec.d.ts.map +1 -0
  24. package/dist/codec/codec.js +15 -0
  25. package/dist/codec/header-aware-codec.d.ts +36 -0
  26. package/dist/codec/header-aware-codec.d.ts.map +1 -0
  27. package/dist/codec/header-aware-codec.js +1 -0
  28. package/{src/codec/index.ts → dist/codec/index.d.ts} +2 -7
  29. package/dist/codec/index.d.ts.map +1 -0
  30. package/dist/codec/index.js +3 -0
  31. package/dist/codec/json-codec.d.ts +13 -0
  32. package/dist/codec/json-codec.d.ts.map +1 -0
  33. package/dist/codec/json-codec.js +64 -0
  34. package/dist/codec/rabbitmq-codec.d.ts +28 -0
  35. package/dist/codec/rabbitmq-codec.d.ts.map +1 -0
  36. package/dist/codec/rabbitmq-codec.js +242 -0
  37. package/dist/codec/rabbitmq-codec.test.d.ts +2 -0
  38. package/dist/codec/rabbitmq-codec.test.d.ts.map +1 -0
  39. package/dist/codec/rabbitmq-codec.test.js +433 -0
  40. package/dist/core/fanout.d.ts +59 -0
  41. package/dist/core/fanout.d.ts.map +1 -0
  42. package/dist/core/fanout.js +121 -0
  43. package/dist/core/fanout.test.d.ts +2 -0
  44. package/dist/core/fanout.test.d.ts.map +1 -0
  45. package/dist/core/fanout.test.js +1054 -0
  46. package/{src/core/index.ts → dist/core/index.d.ts} +2 -7
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +3 -0
  49. package/dist/core/matador.d.ts +133 -0
  50. package/dist/core/matador.d.ts.map +1 -0
  51. package/dist/core/matador.js +228 -0
  52. package/dist/core/matador.test.d.ts +2 -0
  53. package/dist/core/matador.test.d.ts.map +1 -0
  54. package/dist/core/matador.test.js +446 -0
  55. package/dist/core/shutdown.d.ts +78 -0
  56. package/dist/core/shutdown.d.ts.map +1 -0
  57. package/dist/core/shutdown.js +111 -0
  58. package/dist/core/shutdown.test.d.ts +2 -0
  59. package/dist/core/shutdown.test.d.ts.map +1 -0
  60. package/dist/core/shutdown.test.js +524 -0
  61. package/dist/errors/checkpoint-errors.d.ts +30 -0
  62. package/dist/errors/checkpoint-errors.d.ts.map +1 -0
  63. package/dist/errors/checkpoint-errors.js +49 -0
  64. package/dist/errors/has-description.d.ts +18 -0
  65. package/dist/errors/has-description.d.ts.map +1 -0
  66. package/dist/errors/has-description.js +9 -0
  67. package/dist/errors/index.d.ts +6 -0
  68. package/dist/errors/index.d.ts.map +1 -0
  69. package/dist/errors/index.js +22 -0
  70. package/dist/errors/matador-errors.d.ts +183 -0
  71. package/dist/errors/matador-errors.d.ts.map +1 -0
  72. package/dist/errors/matador-errors.js +376 -0
  73. package/dist/errors/retry-errors.d.ts +102 -0
  74. package/dist/errors/retry-errors.d.ts.map +1 -0
  75. package/dist/errors/retry-errors.js +155 -0
  76. package/dist/errors/retry-errors.test.d.ts +2 -0
  77. package/dist/errors/retry-errors.test.d.ts.map +1 -0
  78. package/dist/errors/retry-errors.test.js +136 -0
  79. package/dist/hooks/index.d.ts +4 -0
  80. package/dist/hooks/index.d.ts.map +1 -0
  81. package/dist/hooks/index.js +2 -0
  82. package/dist/hooks/safe-hooks.d.ts +32 -0
  83. package/dist/hooks/safe-hooks.d.ts.map +1 -0
  84. package/dist/hooks/safe-hooks.js +120 -0
  85. package/dist/hooks/types.d.ts +172 -0
  86. package/dist/hooks/types.d.ts.map +1 -0
  87. package/dist/hooks/types.js +9 -0
  88. package/dist/index.cjs +3228 -0
  89. package/dist/index.cjs.map +1 -0
  90. package/dist/index.d.cts +23 -0
  91. package/dist/index.d.ts +23 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +31 -0
  94. package/dist/index.js.map +1 -0
  95. package/{src/pipeline/index.ts → dist/pipeline/index.d.ts} +1 -0
  96. package/dist/pipeline/index.d.ts.map +1 -0
  97. package/dist/pipeline/index.js +1 -0
  98. package/dist/pipeline/pipeline.d.ts +63 -0
  99. package/dist/pipeline/pipeline.d.ts.map +1 -0
  100. package/dist/pipeline/pipeline.js +273 -0
  101. package/dist/pipeline/pipeline.test.d.ts +2 -0
  102. package/dist/pipeline/pipeline.test.d.ts.map +1 -0
  103. package/dist/pipeline/pipeline.test.js +1112 -0
  104. package/{src/retry/index.ts → dist/retry/index.d.ts} +1 -1
  105. package/dist/retry/index.d.ts.map +1 -0
  106. package/dist/retry/index.js +1 -0
  107. package/dist/retry/policy.d.ts +43 -0
  108. package/dist/retry/policy.d.ts.map +1 -0
  109. package/dist/retry/policy.js +1 -0
  110. package/dist/retry/standard-policy.d.ts +44 -0
  111. package/dist/retry/standard-policy.d.ts.map +1 -0
  112. package/dist/retry/standard-policy.js +102 -0
  113. package/dist/retry/standard-policy.test.d.ts +2 -0
  114. package/dist/retry/standard-policy.test.d.ts.map +1 -0
  115. package/dist/retry/standard-policy.test.js +196 -0
  116. package/dist/schema/index.d.ts +4 -0
  117. package/dist/schema/index.d.ts.map +1 -0
  118. package/dist/schema/index.js +2 -0
  119. package/dist/schema/registry.d.ts +63 -0
  120. package/dist/schema/registry.d.ts.map +1 -0
  121. package/dist/schema/registry.js +174 -0
  122. package/dist/schema/registry.test.d.ts +2 -0
  123. package/dist/schema/registry.test.d.ts.map +1 -0
  124. package/dist/schema/registry.test.js +278 -0
  125. package/{src/schema/types.ts → dist/schema/types.d.ts} +29 -88
  126. package/dist/schema/types.d.ts.map +1 -0
  127. package/dist/schema/types.js +74 -0
  128. package/dist/schema/types.test.d.ts +2 -0
  129. package/dist/schema/types.test.d.ts.map +1 -0
  130. package/dist/schema/types.test.js +242 -0
  131. package/dist/topology/builder.d.ts +80 -0
  132. package/dist/topology/builder.d.ts.map +1 -0
  133. package/dist/topology/builder.js +165 -0
  134. package/dist/topology/builder.test.d.ts +2 -0
  135. package/dist/topology/builder.test.d.ts.map +1 -0
  136. package/dist/topology/builder.test.js +360 -0
  137. package/dist/topology/index.d.ts +5 -0
  138. package/dist/topology/index.d.ts.map +1 -0
  139. package/dist/topology/index.js +2 -0
  140. package/dist/topology/types.d.ts +128 -0
  141. package/dist/topology/types.d.ts.map +1 -0
  142. package/dist/topology/types.js +28 -0
  143. package/dist/transport/capabilities.d.ts +66 -0
  144. package/dist/transport/capabilities.d.ts.map +1 -0
  145. package/dist/transport/capabilities.js +18 -0
  146. package/dist/transport/connection-manager.d.ts +95 -0
  147. package/dist/transport/connection-manager.d.ts.map +1 -0
  148. package/dist/transport/connection-manager.js +144 -0
  149. package/dist/transport/index.d.ts +11 -0
  150. package/dist/transport/index.d.ts.map +1 -0
  151. package/dist/transport/index.js +5 -0
  152. package/dist/transport/local/local-transport.d.ts +62 -0
  153. package/dist/transport/local/local-transport.d.ts.map +1 -0
  154. package/dist/transport/local/local-transport.js +241 -0
  155. package/dist/transport/local/local-transport.test.d.ts +2 -0
  156. package/dist/transport/local/local-transport.test.d.ts.map +1 -0
  157. package/dist/transport/local/local-transport.test.js +192 -0
  158. package/dist/transport/multi/multi-transport.d.ts +94 -0
  159. package/dist/transport/multi/multi-transport.d.ts.map +1 -0
  160. package/dist/transport/multi/multi-transport.js +184 -0
  161. package/dist/transport/multi/multi-transport.test.d.ts +2 -0
  162. package/dist/transport/multi/multi-transport.test.d.ts.map +1 -0
  163. package/dist/transport/multi/multi-transport.test.js +236 -0
  164. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts +83 -0
  165. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +1 -0
  166. package/dist/transport/rabbitmq/rabbitmq-transport.js +541 -0
  167. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts +2 -0
  168. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts.map +1 -0
  169. package/dist/transport/rabbitmq/rabbitmq-transport.test.js +100 -0
  170. package/dist/transport/transport.d.ts +152 -0
  171. package/dist/transport/transport.d.ts.map +1 -0
  172. package/dist/transport/transport.js +1 -0
  173. package/{src/types/common.ts → dist/types/common.d.ts} +8 -20
  174. package/dist/types/common.d.ts.map +1 -0
  175. package/dist/types/common.js +12 -0
  176. package/dist/types/dispatcher.d.ts +14 -0
  177. package/dist/types/dispatcher.d.ts.map +1 -0
  178. package/dist/types/dispatcher.js +1 -0
  179. package/dist/types/envelope.d.ts +131 -0
  180. package/dist/types/envelope.d.ts.map +1 -0
  181. package/dist/types/envelope.js +99 -0
  182. package/dist/types/event.d.ts +92 -0
  183. package/dist/types/event.d.ts.map +1 -0
  184. package/dist/types/event.js +26 -0
  185. package/dist/types/event.test.d.ts +2 -0
  186. package/dist/types/event.test.d.ts.map +1 -0
  187. package/dist/types/event.test.js +130 -0
  188. package/dist/types/index.d.ts +11 -0
  189. package/dist/types/index.d.ts.map +1 -0
  190. package/dist/types/index.js +4 -0
  191. package/dist/types/subscriber.d.ts +227 -0
  192. package/dist/types/subscriber.d.ts.map +1 -0
  193. package/dist/types/subscriber.js +97 -0
  194. package/package.json +6 -2
  195. package/examples/config.ts +0 -126
  196. package/examples/event.ts +0 -26
  197. package/examples/order-event.json +0 -19
  198. package/src/checkpoint/context.test.ts +0 -510
  199. package/src/checkpoint/context.ts +0 -213
  200. package/src/checkpoint/index.ts +0 -30
  201. package/src/checkpoint/stores/memory.ts +0 -47
  202. package/src/checkpoint/stores/stores.test.ts +0 -177
  203. package/src/checkpoint/types.ts +0 -147
  204. package/src/codec/codec.ts +0 -42
  205. package/src/codec/header-aware-codec.ts +0 -41
  206. package/src/codec/json-codec.ts +0 -69
  207. package/src/codec/rabbitmq-codec.test.ts +0 -516
  208. package/src/codec/rabbitmq-codec.ts +0 -336
  209. package/src/core/fanout.test.ts +0 -1350
  210. package/src/core/fanout.ts +0 -184
  211. package/src/core/matador.test.ts +0 -575
  212. package/src/core/matador.ts +0 -357
  213. package/src/core/shutdown.test.ts +0 -853
  214. package/src/core/shutdown.ts +0 -165
  215. package/src/errors/checkpoint-errors.ts +0 -62
  216. package/src/errors/has-description.ts +0 -25
  217. package/src/errors/index.ts +0 -58
  218. package/src/errors/matador-errors.ts +0 -477
  219. package/src/errors/retry-errors.test.ts +0 -175
  220. package/src/errors/retry-errors.ts +0 -188
  221. package/src/hooks/index.ts +0 -14
  222. package/src/hooks/safe-hooks.ts +0 -200
  223. package/src/hooks/types.ts +0 -226
  224. package/src/index.ts +0 -242
  225. package/src/pipeline/pipeline.test.ts +0 -1377
  226. package/src/pipeline/pipeline.ts +0 -393
  227. package/src/retry/policy.ts +0 -46
  228. package/src/retry/standard-policy.test.ts +0 -290
  229. package/src/retry/standard-policy.ts +0 -156
  230. package/src/schema/index.ts +0 -16
  231. package/src/schema/registry.test.ts +0 -339
  232. package/src/schema/registry.ts +0 -229
  233. package/src/schema/types.test.ts +0 -280
  234. package/src/topology/builder.test.ts +0 -451
  235. package/src/topology/builder.ts +0 -238
  236. package/src/topology/index.ts +0 -19
  237. package/src/topology/types.ts +0 -183
  238. package/src/transport/capabilities.ts +0 -88
  239. package/src/transport/connection-manager.ts +0 -218
  240. package/src/transport/index.ts +0 -42
  241. package/src/transport/local/local-transport.test.ts +0 -262
  242. package/src/transport/local/local-transport.ts +0 -330
  243. package/src/transport/multi/multi-transport.test.ts +0 -320
  244. package/src/transport/multi/multi-transport.ts +0 -294
  245. package/src/transport/rabbitmq/rabbitmq-transport.test.ts +0 -120
  246. package/src/transport/rabbitmq/rabbitmq-transport.ts +0 -782
  247. package/src/transport/transport.ts +0 -200
  248. package/src/types/dispatcher.ts +0 -18
  249. package/src/types/envelope.ts +0 -244
  250. package/src/types/event.test.ts +0 -157
  251. package/src/types/event.ts +0 -112
  252. package/src/types/index.ts +0 -62
  253. package/src/types/subscriber.ts +0 -333
  254. package/test/e2e/multi-transport.e2e.test.ts +0 -237
  255. package/test/e2e/rabbitmq-transport.e2e.test.ts +0 -618
  256. package/test/e2e/transport-compliance.e2e.test.ts +0 -506
  257. package/test/integration/matador.integration.test.ts +0 -634
  258. package/tsconfig.json +0 -29
  259. package/tsup.config.ts +0 -13
@@ -1,280 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- import {
3
- MatadorEvent,
4
- createSubscriber,
5
- createSubscriberStub,
6
- } from '../types/index.js';
7
- import { bind, installPlugins, isSchemaEntryTuple } from './types.js';
8
- import type { MatadorSchema } from './types.js';
9
-
10
- class UserCreatedEvent extends MatadorEvent {
11
- static readonly key = 'user.created';
12
- static readonly description = 'User created event';
13
-
14
- constructor(public data: { userId: string }) {
15
- super();
16
- }
17
- }
18
-
19
- class OrderPlacedEvent extends MatadorEvent {
20
- static readonly key = 'order.placed';
21
- static readonly description = 'Order placed event';
22
-
23
- constructor(public data: { orderId: string }) {
24
- super();
25
- }
26
- }
27
-
28
- class ChatMessageSentEvent extends MatadorEvent {
29
- static readonly key = 'chat.message.sent';
30
- static readonly description = 'Chat message sent event';
31
-
32
- constructor(public data: { messageId: string }) {
33
- super();
34
- }
35
- }
36
-
37
- describe('bind', () => {
38
- it('should create a schema entry tuple', () => {
39
- const subscriber = createSubscriber<UserCreatedEvent>({
40
- name: 'test-sub',
41
- description: 'Test subscriber',
42
- callback: async () => {},
43
- });
44
- const entry = bind(UserCreatedEvent, [subscriber]);
45
-
46
- expect(isSchemaEntryTuple(entry)).toBe(true);
47
- expect(entry[0]).toBe(UserCreatedEvent);
48
- expect(entry[1]).toHaveLength(1);
49
- expect(entry[1][0]).toBe(subscriber);
50
- });
51
- });
52
-
53
- describe('isSchemaEntryTuple', () => {
54
- it('should return true for tuple format', () => {
55
- const entry = [UserCreatedEvent, []] as const;
56
- expect(isSchemaEntryTuple(entry)).toBe(true);
57
- });
58
-
59
- it('should return false for object format', () => {
60
- const entry = { eventClass: UserCreatedEvent, subscribers: [] };
61
- expect(isSchemaEntryTuple(entry)).toBe(false);
62
- });
63
- });
64
-
65
- describe('installPlugins', () => {
66
- it('should add plugin subscriber to all events', () => {
67
- const sub1 = createSubscriber<UserCreatedEvent>({
68
- name: 'user-handler',
69
- description: 'Handles user events',
70
- callback: async () => {},
71
- });
72
- const sub2 = createSubscriber<OrderPlacedEvent>({
73
- name: 'order-handler',
74
- description: 'Handles order events',
75
- callback: async () => {},
76
- });
77
- const globalSub = createSubscriber<MatadorEvent>({
78
- name: 'analytics',
79
- description: 'Analytics subscriber',
80
- callback: async () => {},
81
- });
82
-
83
- const baseSchema: MatadorSchema = {
84
- [UserCreatedEvent.key]: [UserCreatedEvent, [sub1]],
85
- [OrderPlacedEvent.key]: [OrderPlacedEvent, [sub2]],
86
- };
87
-
88
- const schema = installPlugins(baseSchema, [{ subscriber: globalSub }]);
89
-
90
- // Check user.created has both subscribers
91
- const userEntry = schema[UserCreatedEvent.key];
92
- expect(isSchemaEntryTuple(userEntry!)).toBe(true);
93
- const [, userSubs] = userEntry as [unknown, readonly unknown[]];
94
- expect(userSubs).toHaveLength(2);
95
- expect(userSubs[0]).toBe(sub1);
96
- expect(userSubs[1]).toBe(globalSub);
97
-
98
- // Check order.placed has both subscribers
99
- const orderEntry = schema[OrderPlacedEvent.key];
100
- const [, orderSubs] = orderEntry as [unknown, readonly unknown[]];
101
- expect(orderSubs).toHaveLength(2);
102
- expect(orderSubs[0]).toBe(sub2);
103
- expect(orderSubs[1]).toBe(globalSub);
104
- });
105
-
106
- it('should respect exclusions', () => {
107
- const sub1 = createSubscriber<UserCreatedEvent>({
108
- name: 'user-handler',
109
- description: 'Handles user events',
110
- callback: async () => {},
111
- });
112
- const sub2 = createSubscriber<OrderPlacedEvent>({
113
- name: 'order-handler',
114
- description: 'Handles order events',
115
- callback: async () => {},
116
- });
117
- const sub3 = createSubscriber<ChatMessageSentEvent>({
118
- name: 'chat-handler',
119
- description: 'Handles chat events',
120
- callback: async () => {},
121
- });
122
- const globalSub = createSubscriber<MatadorEvent>({
123
- name: 'analytics',
124
- description: 'Analytics subscriber',
125
- callback: async () => {},
126
- });
127
-
128
- const baseSchema: MatadorSchema = {
129
- [UserCreatedEvent.key]: [UserCreatedEvent, [sub1]],
130
- [OrderPlacedEvent.key]: [OrderPlacedEvent, [sub2]],
131
- [ChatMessageSentEvent.key]: [ChatMessageSentEvent, [sub3]],
132
- };
133
-
134
- const schema = installPlugins(baseSchema, [
135
- {
136
- subscriber: globalSub,
137
- exclusions: [ChatMessageSentEvent.key],
138
- },
139
- ]);
140
-
141
- // user.created should have analytics
142
- const userEntry = schema[UserCreatedEvent.key];
143
- const [, userSubs] = userEntry as [unknown, readonly unknown[]];
144
- expect(userSubs).toHaveLength(2);
145
-
146
- // order.placed should have analytics
147
- const orderEntry = schema[OrderPlacedEvent.key];
148
- const [, orderSubs] = orderEntry as [unknown, readonly unknown[]];
149
- expect(orderSubs).toHaveLength(2);
150
-
151
- // chat.message.sent should NOT have analytics (excluded)
152
- const chatEntry = schema[ChatMessageSentEvent.key];
153
- const [, chatSubs] = chatEntry as [unknown, readonly unknown[]];
154
- expect(chatSubs).toHaveLength(1);
155
- expect(chatSubs[0]).toBe(sub3);
156
- });
157
-
158
- it('should handle multiple plugins', () => {
159
- const sub1 = createSubscriber<UserCreatedEvent>({
160
- name: 'user-handler',
161
- description: 'Handles user events',
162
- callback: async () => {},
163
- });
164
- const analyticsSub = createSubscriber<MatadorEvent>({
165
- name: 'analytics',
166
- description: 'Analytics subscriber',
167
- callback: async () => {},
168
- });
169
- const loggingSub = createSubscriber<MatadorEvent>({
170
- name: 'logging',
171
- description: 'Logging subscriber',
172
- callback: async () => {},
173
- });
174
-
175
- const baseSchema: MatadorSchema = {
176
- [UserCreatedEvent.key]: [UserCreatedEvent, [sub1]],
177
- };
178
-
179
- const schema = installPlugins(baseSchema, [
180
- { subscriber: analyticsSub },
181
- { subscriber: loggingSub },
182
- ]);
183
-
184
- const entry = schema[UserCreatedEvent.key];
185
- const [, subs] = entry as [unknown, readonly unknown[]];
186
- expect(subs).toHaveLength(3);
187
- expect(subs[0]).toBe(sub1);
188
- expect(subs[1]).toBe(analyticsSub);
189
- expect(subs[2]).toBe(loggingSub);
190
- });
191
-
192
- it('should handle object format schema entries', () => {
193
- const sub1 = createSubscriber<UserCreatedEvent>({
194
- name: 'user-handler',
195
- description: 'Handles user events',
196
- callback: async () => {},
197
- });
198
- const globalSub = createSubscriber<MatadorEvent>({
199
- name: 'analytics',
200
- description: 'Analytics subscriber',
201
- callback: async () => {},
202
- });
203
-
204
- const baseSchema: MatadorSchema = {
205
- [UserCreatedEvent.key]: {
206
- eventClass: UserCreatedEvent,
207
- subscribers: [sub1],
208
- },
209
- };
210
-
211
- const schema = installPlugins(baseSchema, [{ subscriber: globalSub }]);
212
-
213
- const entry = schema[UserCreatedEvent.key];
214
- expect(isSchemaEntryTuple(entry!)).toBe(true);
215
- const [eventClass, subs] = entry as [unknown, readonly unknown[]];
216
- expect(eventClass).toBe(UserCreatedEvent);
217
- expect(subs).toHaveLength(2);
218
- });
219
-
220
- it('should work with subscriber stubs', () => {
221
- const sub1 = createSubscriber<UserCreatedEvent>({
222
- name: 'user-handler',
223
- description: 'Handles user events',
224
- callback: async () => {},
225
- });
226
- const stubSub = createSubscriberStub({
227
- name: 'remote-analytics',
228
- targetQueue: 'analytics-worker',
229
- });
230
-
231
- const baseSchema: MatadorSchema = {
232
- [UserCreatedEvent.key]: [UserCreatedEvent, [sub1]],
233
- };
234
-
235
- const schema = installPlugins(baseSchema, [{ subscriber: stubSub }]);
236
-
237
- const entry = schema[UserCreatedEvent.key];
238
- const [, subs] = entry as [unknown, readonly unknown[]];
239
- expect(subs).toHaveLength(2);
240
- expect(subs[1]).toBe(stubSub);
241
- });
242
-
243
- it('should return empty schema for empty input', () => {
244
- const schema = installPlugins({}, [
245
- {
246
- subscriber: createSubscriber<MatadorEvent>({
247
- name: 'analytics',
248
- description: 'Analytics subscriber',
249
- callback: async () => {},
250
- }),
251
- },
252
- ]);
253
-
254
- expect(Object.keys(schema)).toHaveLength(0);
255
- });
256
-
257
- it('should not modify original schema', () => {
258
- const sub1 = createSubscriber<UserCreatedEvent>({
259
- name: 'user-handler',
260
- description: 'Handles user events',
261
- callback: async () => {},
262
- });
263
- const globalSub = createSubscriber<MatadorEvent>({
264
- name: 'analytics',
265
- description: 'Analytics subscriber',
266
- callback: async () => {},
267
- });
268
-
269
- const baseSchema: MatadorSchema = {
270
- [UserCreatedEvent.key]: [UserCreatedEvent, [sub1]],
271
- };
272
-
273
- installPlugins(baseSchema, [{ subscriber: globalSub }]);
274
-
275
- // Original schema should be unchanged
276
- const entry = baseSchema[UserCreatedEvent.key];
277
- const [, subs] = entry as [unknown, readonly unknown[]];
278
- expect(subs).toHaveLength(1);
279
- });
280
- });