@reventlessdev/reventless-core 3.0.0-alpha.170 → 3.0.0-alpha.172

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 (83) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +14 -14
  3. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res +5 -2
  4. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res.mjs +3 -3
  5. package/src/components/Heartbeat/Heartbeat.res +2 -2
  6. package/src/components/Heartbeat/Heartbeat_Builder.res +2 -2
  7. package/src/components/Heartbeat/Heartbeat_Builder.res.mjs +2 -4
  8. package/src/components/Task/Task_Builder.res +6 -4
  9. package/src/components/Task/Task_Builder.res.mjs +4 -4
  10. package/src/plugin/component/Plugin_Builder.res +5 -1
  11. package/src/plugin/component/Plugin_Builder.res.mjs +1 -1
  12. package/src/plugin/component/Plugin_Helpers.res +6 -1
  13. package/src/plugin/connect/PluginExtensionPoint_Builder.res +2 -0
  14. package/src/plugin/connect/PluginExtensionPoint_Builder.res.mjs +3 -3
  15. package/src/plugin/connect/PluginExtensionPoint_Plugin.res +12 -5
  16. package/src/plugin/connect/PluginExtensionPoint_Plugin.res.mjs +8 -2
  17. package/tests/plugin/HeartbeatDisconnectGraceTest.res +98 -0
  18. package/tests/IdentityTest.res.mjs +0 -174
  19. package/tests/adapter/MonitoringTest.res.mjs +0 -82
  20. package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +0 -356
  21. package/tests/admin/Platform_UIFragmentsApiTest.res.mjs +0 -101
  22. package/tests/aggregate/AggregateCacheTest.res.mjs +0 -433
  23. package/tests/aggregate/AggregateCallbackTest.res.mjs +0 -143
  24. package/tests/aggregate/AggregateCausationTest.res.mjs +0 -47
  25. package/tests/aggregate/AggregateConflictTest.res.mjs +0 -386
  26. package/tests/aggregate/AggregateFixtures.res.mjs +0 -308
  27. package/tests/aggregate/AggregateRejectionTest.res.mjs +0 -166
  28. package/tests/aggregate/AggregateSnapshotTest.res.mjs +0 -645
  29. package/tests/api/ApiNoApiTest.res.mjs +0 -90
  30. package/tests/api/GraphQL_StitcherTest.res.mjs +0 -112
  31. package/tests/api/SimpleTest.res.mjs +0 -10
  32. package/tests/api/SuryToJsonSchemaTest.res.mjs +0 -674
  33. package/tests/commandgenerator/CommandGeneratorCallbackTest.res.mjs +0 -160
  34. package/tests/commandgenerator/CommandGeneratorFixtures.res.mjs +0 -197
  35. package/tests/commandtopic/CommandTopicCallbackFixtures.res.mjs +0 -152
  36. package/tests/commandtopic/CommandTopicCallbackTest.res.mjs +0 -106
  37. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res.mjs +0 -109
  38. package/tests/counter/CounterCallbackTest.res.mjs +0 -140
  39. package/tests/counter/CounterFixtures.res.mjs +0 -67
  40. package/tests/dcb/DcbDecodeTest.res.mjs +0 -194
  41. package/tests/dcb/DcbEventLogOperationsTest.res.mjs +0 -268
  42. package/tests/dcb/DcbFixtures.res.mjs +0 -534
  43. package/tests/dcb/DcbScopeInferenceTest.res.mjs +0 -480
  44. package/tests/dcb/DcbStateChangeSliceTest.res.mjs +0 -540
  45. package/tests/dcb/DcbTagTest.res.mjs +0 -867
  46. package/tests/dcb/DcbValidationTest.res.mjs +0 -476
  47. package/tests/eventlog/EventLogFixtures.res.mjs +0 -196
  48. package/tests/eventlog/EventLogOperationsTest.res.mjs +0 -192
  49. package/tests/eventlog/EventLogRetryTest.res.mjs +0 -195
  50. package/tests/eventmapper/EventMapperCallbackTest.res.mjs +0 -141
  51. package/tests/eventmapper/EventMapperFixtures.res.mjs +0 -440
  52. package/tests/eventmapper/EventMapperTest.res.mjs +0 -83
  53. package/tests/eventtopic/EventTopicFixtures.res.mjs +0 -65
  54. package/tests/eventtopic/EventTopicOperationsTest.res.mjs +0 -71
  55. package/tests/extensionpoint/ExtensionPointCallbackTest.res.mjs +0 -94
  56. package/tests/extensionpoint/ExtensionPointFixtures.res.mjs +0 -205
  57. package/tests/extensionpoint/ExtensionPointOperationsTest.res.mjs +0 -304
  58. package/tests/ftp/FTPTest.res.mjs +0 -88
  59. package/tests/logger/LogFormatTest.res.mjs +0 -309
  60. package/tests/logger/LoggerLazyTest.res.mjs +0 -40
  61. package/tests/message/MessageTest.res.mjs +0 -218
  62. package/tests/message/MetaEnvelopeTest.res.mjs +0 -188
  63. package/tests/plugin/ManifestVisibilityTest.res.mjs +0 -215
  64. package/tests/plugin/PluginSpecExperiment.res.mjs +0 -31
  65. package/tests/plugin/PluginStructureTest.res.mjs +0 -419
  66. package/tests/plugin/PluginVersionTest.res.mjs +0 -30
  67. package/tests/plugin/SchemaWalkerTest.res.mjs +0 -160
  68. package/tests/plugin/StateChangeSlice/PsPlaceOrder.res.mjs +0 -62
  69. package/tests/plugin/StateChangeSlice/PsShipOrder.res.mjs +0 -69
  70. package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +0 -95
  71. package/tests/plugin/StateViewSlice/PsAvailableProductsView.res.mjs +0 -69
  72. package/tests/plugin/StateViewSlice/PsCustomersView.res.mjs +0 -69
  73. package/tests/plugin/StateViewSlice/PsOrdersView.res.mjs +0 -81
  74. package/tests/poc/StructuralSubtypingPoc.res.mjs +0 -61
  75. package/tests/projection/ProjectionOptimizeTest.res.mjs +0 -75
  76. package/tests/querydb/QueryDbFixtures.res.mjs +0 -135
  77. package/tests/querydb/QueryDbOperationsTest.res.mjs +0 -168
  78. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res.mjs +0 -77
  79. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +0 -139
  80. package/tests/util/CommandPublisherTest.res.mjs +0 -78
  81. package/tests/util/CsvStreamTest.res.mjs +0 -51
  82. package/tests/util/LruTest.res.mjs +0 -105
  83. package/tests/util/MetricsTest.res.mjs +0 -53
@@ -1,867 +0,0 @@
1
- // Generated by ReScript, PLEASE EDIT WITH CARE
2
-
3
- import * as S from "sury/src/S.res.mjs";
4
- import * as JestGlobals from "@reventlessdev/rescript-jest/src/JestGlobals.res.mjs";
5
- import * as Stdlib_JsExn from "@rescript/runtime/lib/es6/Stdlib_JsExn.js";
6
- import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
7
- import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
8
- import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
9
- import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
10
- import * as DcbFixtures$ReventlessCore from "./DcbFixtures.res.mjs";
11
-
12
- globalThis.describe("DcbTag:", () => {
13
- globalThis.describe("jsonValueToString", () => {
14
- globalThis.test("converts string value", () => {
15
- globalThis.expect(DcbTag$Reventless.jsonValueToString("hello")).toBe("hello");
16
- });
17
- globalThis.test("converts integer-like number", () => {
18
- globalThis.expect(DcbTag$Reventless.jsonValueToString(42)).toBe("42");
19
- });
20
- globalThis.test("converts float number", () => {
21
- globalThis.expect(DcbTag$Reventless.jsonValueToString(3.14)).toBe("3.14");
22
- });
23
- globalThis.test("converts boolean true", () => {
24
- globalThis.expect(DcbTag$Reventless.jsonValueToString(true)).toBe("true");
25
- });
26
- globalThis.test("converts boolean false", () => {
27
- globalThis.expect(DcbTag$Reventless.jsonValueToString(false)).toBe("false");
28
- });
29
- globalThis.test("converts null", () => {
30
- globalThis.expect(DcbTag$Reventless.jsonValueToString(null)).toBe("null");
31
- });
32
- globalThis.test("converts array via JSON.stringify", () => {
33
- globalThis.expect(DcbTag$Reventless.jsonValueToString([
34
- 1,
35
- 2
36
- ])).toBe("[1,2]");
37
- });
38
- });
39
- globalThis.describe("isTagged", () => {
40
- globalThis.test("returns true for Reventless.DcbTag.string schema", () => {
41
- globalThis.expect(DcbTag$Reventless.isTagged(DcbTag$Reventless.string)).toBe(true);
42
- });
43
- globalThis.test("returns true for Reventless.DcbTag.int schema", () => {
44
- globalThis.expect(DcbTag$Reventless.isTagged(DcbTag$Reventless.int)).toBe(true);
45
- });
46
- globalThis.test("returns false for plain S.string schema", () => {
47
- globalThis.expect(DcbTag$Reventless.isTagged(S.string)).toBe(false);
48
- });
49
- });
50
- globalThis.describe("extractTags from variant (Union) schema", () => {
51
- globalThis.test("extracts itemId tag from ItemCreated", () => {
52
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema, {
53
- TAG: "ItemCreated",
54
- itemId: "item-1",
55
- name: "Test"
56
- })).toEqual([{
57
- key: "itemId",
58
- value: "item-1"
59
- }]);
60
- });
61
- globalThis.test("extracts itemId tag from ItemRenamed", () => {
62
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema, {
63
- TAG: "ItemRenamed",
64
- itemId: "item-2",
65
- newName: "Updated"
66
- })).toEqual([{
67
- key: "itemId",
68
- value: "item-2"
69
- }]);
70
- });
71
- globalThis.test("extracts multiple tags from CountUpdated", () => {
72
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema, {
73
- TAG: "CountUpdated",
74
- category: "electronics",
75
- amount: 42
76
- })).toEqual([
77
- {
78
- key: "category",
79
- value: "electronics"
80
- },
81
- {
82
- key: "amount",
83
- value: "42"
84
- }
85
- ]);
86
- });
87
- globalThis.test("returns empty array for SimpleEvent (no payload)", () => {
88
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema, "SimpleEvent")).toEqual([]);
89
- });
90
- globalThis.test("returns empty array for untagged PlainEvent", () => {
91
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.UntaggedEventSpec.eventSchema, {
92
- TAG: "PlainEvent",
93
- name: "test",
94
- value: 1
95
- })).toEqual([]);
96
- });
97
- globalThis.test("returns empty array for untagged EmptyEvent", () => {
98
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.UntaggedEventSpec.eventSchema, "EmptyEvent")).toEqual([]);
99
- });
100
- });
101
- globalThis.describe("extractTags from Object schema", () => {
102
- globalThis.test("extracts tenantId tag from object record", () => {
103
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.objectEventSchema, {
104
- tenantId: "tenant-1",
105
- data: "test"
106
- })).toEqual([{
107
- key: "tenantId",
108
- value: "tenant-1"
109
- }]);
110
- });
111
- });
112
- globalThis.describe("extractTags from command schema", () => {
113
- globalThis.test("extracts itemId tag from CreateItem command", () => {
114
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestCommandSpec.commandSchema, {
115
- TAG: "CreateItem",
116
- itemId: "item-1",
117
- name: "Test"
118
- })).toEqual([{
119
- key: "itemId",
120
- value: "item-1"
121
- }]);
122
- });
123
- globalThis.test("extracts itemId tag from RenameItem command", () => {
124
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.TestCommandSpec.commandSchema, {
125
- TAG: "RenameItem",
126
- itemId: "item-3",
127
- newName: "New"
128
- })).toEqual([{
129
- key: "itemId",
130
- value: "item-3"
131
- }]);
132
- });
133
- });
134
- globalThis.describe("extractTaggedFields from schema", () => {
135
- globalThis.describe("Union (variant) schemas", () => {
136
- globalThis.test("extracts all unique tagged field names from event schema", () => {
137
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema)).toEqual([
138
- "amount",
139
- "category",
140
- "itemId"
141
- ]);
142
- });
143
- globalThis.test("extracts tagged field names from command schema", () => {
144
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.TestCommandSpec.commandSchema)).toEqual(["itemId"]);
145
- });
146
- globalThis.test("returns empty array for untagged variant schema", () => {
147
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.UntaggedEventSpec.eventSchema)).toEqual([]);
148
- });
149
- globalThis.test("deduplicates field names across variants", () => {
150
- let fields = DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema);
151
- globalThis.expect(fields).toEqual([
152
- "amount",
153
- "category",
154
- "itemId"
155
- ]);
156
- });
157
- globalThis.test("returns sorted field names", () => {
158
- let fields = DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema);
159
- let sorted = fields.toSorted(Primitive_string.compare);
160
- globalThis.expect(fields).toEqual(sorted);
161
- });
162
- });
163
- globalThis.describe("Object (record) schemas", () => {
164
- globalThis.test("extracts tagged field names from object schema", () => {
165
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.objectEventSchema)).toEqual(["tenantId"]);
166
- });
167
- globalThis.test("returns empty array for object with no tagged fields", () => {
168
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.plainRecordSchema)).toEqual([]);
169
- });
170
- globalThis.test("extracts multiple tagged fields from object schema", () => {
171
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.multiTagRecordSchema)).toEqual([
172
- "tenantId",
173
- "userId"
174
- ]);
175
- });
176
- });
177
- globalThis.describe("Edge cases", () => {
178
- globalThis.test("handles variants with no payload (SimpleEvent)", () => {
179
- let fields = DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema);
180
- globalThis.expect(fields.length).toBeGreaterThan(0);
181
- });
182
- globalThis.test("handles schema with mix of tagged and untagged fields", () => {
183
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.mixedEventSchema)).toEqual(["id"]);
184
- });
185
- globalThis.test("handles empty schema gracefully", () => {
186
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.emptyVariantSchema)).toEqual([]);
187
- });
188
- globalThis.test("handles schema with int tags", () => {
189
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.intTagEventSchema)).toEqual(["count"]);
190
- });
191
- });
192
- globalThis.describe("isTaggedArray", () => {
193
- globalThis.test("returns true for array of tagged strings", () => {
194
- let schema = S.array(DcbTag$Reventless.string);
195
- globalThis.expect(DcbTag$Reventless.isTaggedArray(schema)).toBe(true);
196
- });
197
- globalThis.test("returns false for array of plain strings", () => {
198
- let schema = S.array(S.string);
199
- globalThis.expect(DcbTag$Reventless.isTaggedArray(schema)).toBe(false);
200
- });
201
- globalThis.test("returns false for tagged scalar", () => {
202
- globalThis.expect(DcbTag$Reventless.isTaggedArray(DcbTag$Reventless.string)).toBe(false);
203
- });
204
- globalThis.test("returns false for plain string", () => {
205
- globalThis.expect(DcbTag$Reventless.isTaggedArray(S.string)).toBe(false);
206
- });
207
- });
208
- globalThis.describe("Complex schemas", () => {
209
- globalThis.test("extracts from schema with many variants and fields", () => {
210
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.complexEventSchema)).toEqual([
211
- "orderId",
212
- "paymentId",
213
- "trackingId",
214
- "userId"
215
- ]);
216
- });
217
- globalThis.test("handles variants with multiple tagged fields in same variant", () => {
218
- globalThis.expect(DcbTag$Reventless.extractTaggedFields(DcbFixtures$ReventlessCore.multiFieldEventSchema)).toEqual([
219
- "sessionId",
220
- "tenantId",
221
- "userId"
222
- ]);
223
- });
224
- });
225
- });
226
- globalThis.describe("extractTagsExpanded (array expansion)", () => {
227
- globalThis.test("expands array tagged field into per-element tags", () => {
228
- globalThis.expect(DcbTag$Reventless.extractTagsExpanded(DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
229
- TAG: "PlaceOrder",
230
- orderId: "ord-1",
231
- customerId: "cust-1",
232
- productId: [
233
- "prod-1",
234
- "prod-2"
235
- ]
236
- })).toEqual([
237
- {
238
- key: "orderId",
239
- value: "ord-1"
240
- },
241
- {
242
- key: "productId",
243
- value: "prod-1"
244
- },
245
- {
246
- key: "productId",
247
- value: "prod-2"
248
- }
249
- ]);
250
- });
251
- globalThis.test("handles empty array tagged field", () => {
252
- globalThis.expect(DcbTag$Reventless.extractTagsExpanded(DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
253
- TAG: "PlaceOrder",
254
- orderId: "ord-1",
255
- customerId: "cust-1",
256
- productId: []
257
- })).toEqual([{
258
- key: "orderId",
259
- value: "ord-1"
260
- }]);
261
- });
262
- globalThis.test("scalar tagged fields unchanged", () => {
263
- globalThis.expect(DcbTag$Reventless.extractTagsExpanded(DcbFixtures$ReventlessCore.singleTagCommandSchema, {
264
- TAG: "CreateItem",
265
- itemId: "item-1",
266
- name: "Test"
267
- })).toEqual([{
268
- key: "itemId",
269
- value: "item-1"
270
- }]);
271
- });
272
- });
273
- globalThis.describe("extractCompositePartitionFields", () => {
274
- globalThis.test("extracts 3 fields from single-variant composite schema", () => {
275
- let fields = DcbTag$Reventless.extractCompositePartitionFields(DcbFixtures$ReventlessCore.compositeEventSchema);
276
- globalThis.expect(fields.length).toBe(3);
277
- globalThis.expect(fields.map(f => f.name)).toEqual([
278
- "environment",
279
- "platformName",
280
- "pluginName"
281
- ]);
282
- });
283
- globalThis.test("fields are sorted by position", () => {
284
- let fields = DcbTag$Reventless.extractCompositePartitionFields(DcbFixtures$ReventlessCore.compositeEventSchema);
285
- let positions = fields.map(f => f.position);
286
- globalThis.expect(positions).toEqual([
287
- 0,
288
- 1,
289
- 2
290
- ]);
291
- });
292
- globalThis.test("extracts separator values", () => {
293
- let fields = DcbTag$Reventless.extractCompositePartitionFields(DcbFixtures$ReventlessCore.compositeEventCustomSepSchema);
294
- globalThis.expect(fields.map(f => f.sep)).toEqual([
295
- ":",
296
- "/",
297
- "/"
298
- ]);
299
- });
300
- globalThis.test("deduplicates fields across variants", () => {
301
- let fields = DcbTag$Reventless.extractCompositePartitionFields(DcbFixtures$ReventlessCore.compositeMultiVariantSchema);
302
- globalThis.expect(fields.length).toBe(2);
303
- globalThis.expect(fields.map(f => f.name)).toEqual([
304
- "env",
305
- "name"
306
- ]);
307
- });
308
- globalThis.test("returns empty for schema without composite fields", () => {
309
- let fields = DcbTag$Reventless.extractCompositePartitionFields(DcbFixtures$ReventlessCore.TestEventLogSpec.eventSchema);
310
- globalThis.expect(fields).toEqual([]);
311
- });
312
- });
313
- globalThis.describe("getCompositePartitionKeyValue", () => {
314
- globalThis.test("joins values with default separator", () => {
315
- let spec_keys = [
316
- "environment",
317
- "platformName",
318
- "pluginName"
319
- ];
320
- let spec_seps = [
321
- "/",
322
- "/"
323
- ];
324
- let spec = {
325
- keys: spec_keys,
326
- seps: spec_seps
327
- };
328
- let tags = [
329
- {
330
- key: "environment",
331
- value: "prod"
332
- },
333
- {
334
- key: "platformName",
335
- value: "aws"
336
- },
337
- {
338
- key: "pluginName",
339
- value: "catalog"
340
- }
341
- ];
342
- globalThis.expect(DcbTag$Reventless.getCompositePartitionKeyValue(tags, spec)).toBe("prod/aws/catalog");
343
- });
344
- globalThis.test("joins values with mixed separators", () => {
345
- let spec_keys = [
346
- "tenantId",
347
- "region",
348
- "service"
349
- ];
350
- let spec_seps = [
351
- ":",
352
- "/"
353
- ];
354
- let spec = {
355
- keys: spec_keys,
356
- seps: spec_seps
357
- };
358
- let tags = [
359
- {
360
- key: "tenantId",
361
- value: "acme"
362
- },
363
- {
364
- key: "region",
365
- value: "eu-west-1"
366
- },
367
- {
368
- key: "service",
369
- value: "auth"
370
- }
371
- ];
372
- globalThis.expect(DcbTag$Reventless.getCompositePartitionKeyValue(tags, spec)).toBe("acme:eu-west-1/auth");
373
- });
374
- globalThis.test("uses empty string for missing tag values", () => {
375
- let spec_keys = [
376
- "a",
377
- "b"
378
- ];
379
- let spec_seps = ["/"];
380
- let spec = {
381
- keys: spec_keys,
382
- seps: spec_seps
383
- };
384
- let tags = [{
385
- key: "a",
386
- value: "x"
387
- }];
388
- globalThis.expect(DcbTag$Reventless.getCompositePartitionKeyValue(tags, spec)).toBe("x/");
389
- });
390
- globalThis.test("handles tags in different order than keys", () => {
391
- let spec_keys = [
392
- "a",
393
- "b",
394
- "c"
395
- ];
396
- let spec_seps = [
397
- "/",
398
- "/"
399
- ];
400
- let spec = {
401
- keys: spec_keys,
402
- seps: spec_seps
403
- };
404
- let tags = [
405
- {
406
- key: "c",
407
- value: "3"
408
- },
409
- {
410
- key: "a",
411
- value: "1"
412
- },
413
- {
414
- key: "b",
415
- value: "2"
416
- }
417
- ];
418
- globalThis.expect(DcbTag$Reventless.getCompositePartitionKeyValue(tags, spec)).toBe("1/2/3");
419
- });
420
- });
421
- globalThis.describe("derivePartitionTag", () => {
422
- globalThis.test("returns Composite for schema with >= 2 composite fields", () => {
423
- let result = DcbTag$Reventless.derivePartitionTag([[
424
- "Sync",
425
- "test.res",
426
- DcbFixtures$ReventlessCore.compositeEventSchema
427
- ]]);
428
- if (result.TAG === "Simple") {
429
- return JestGlobals.fail("Expected Composite");
430
- }
431
- let spec = result._0;
432
- globalThis.expect(spec.keys).toEqual([
433
- "environment",
434
- "platformName",
435
- "pluginName"
436
- ]);
437
- globalThis.expect(spec.seps).toEqual([
438
- "/",
439
- "/"
440
- ]);
441
- });
442
- globalThis.test("returns Composite with custom separators", () => {
443
- let result = DcbTag$Reventless.derivePartitionTag([[
444
- "Config",
445
- "test.res",
446
- DcbFixtures$ReventlessCore.compositeEventCustomSepSchema
447
- ]]);
448
- if (result.TAG === "Simple") {
449
- return JestGlobals.fail("Expected Composite");
450
- }
451
- let spec = result._0;
452
- globalThis.expect(spec.keys).toEqual([
453
- "tenantId",
454
- "region",
455
- "service"
456
- ]);
457
- globalThis.expect(spec.seps).toEqual([
458
- ":",
459
- "/"
460
- ]);
461
- });
462
- globalThis.test("returns Simple for schema with only @partitionTag", () => {
463
- let result = DcbTag$Reventless.derivePartitionTag([[
464
- "Order",
465
- "test.res",
466
- DcbFixtures$ReventlessCore.simplePartitionEventSchema
467
- ]]);
468
- if (result.TAG !== "Simple") {
469
- return JestGlobals.fail("Expected Simple");
470
- }
471
- globalThis.expect(result._0.key).toBe("orderId");
472
- });
473
- globalThis.test("returns Simple for schema with single tagged field", () => {
474
- let result = DcbTag$Reventless.derivePartitionTag([[
475
- "Item",
476
- "test.res",
477
- DcbFixtures$ReventlessCore.singleTagCommandSchema
478
- ]]);
479
- if (result.TAG !== "Simple") {
480
- return JestGlobals.fail("Expected Simple");
481
- }
482
- globalThis.expect(result._0.key).toBe("itemId");
483
- });
484
- globalThis.test("throws on mixed composite and simple partition strategy", () => {
485
- let threw = false;
486
- try {
487
- DcbTag$Reventless.derivePartitionTag([[
488
- "Mixed",
489
- "test.res",
490
- DcbFixtures$ReventlessCore.mixedStrategyEventSchema
491
- ]]);
492
- } catch (raw_err) {
493
- let err = Primitive_exceptions.internalToException(raw_err);
494
- if (err.RE_EXN_ID === "JsExn") {
495
- threw = true;
496
- globalThis.expect(Stdlib_Option.getOr(Stdlib_JsExn.message(err._1), "").includes("mixes @compositePartitionTag and @partitionTag")).toBe(true);
497
- } else {
498
- throw err;
499
- }
500
- }
501
- globalThis.expect(threw).toBe(true);
502
- });
503
- globalThis.test("throws on single composite field (< 2)", () => {
504
- let threw = false;
505
- try {
506
- DcbTag$Reventless.derivePartitionTag([[
507
- "Single",
508
- "test.res",
509
- DcbFixtures$ReventlessCore.singleCompositeEventSchema
510
- ]]);
511
- } catch (raw_err) {
512
- let err = Primitive_exceptions.internalToException(raw_err);
513
- if (err.RE_EXN_ID === "JsExn") {
514
- threw = true;
515
- globalThis.expect(Stdlib_Option.getOr(Stdlib_JsExn.message(err._1), "").includes("at least 2 annotated fields")).toBe(true);
516
- } else {
517
- throw err;
518
- }
519
- }
520
- globalThis.expect(threw).toBe(true);
521
- });
522
- });
523
- globalThis.describe("isCompositePartitionMember", () => {
524
- globalThis.test("returns true for compositePartitionMember schema", () => {
525
- globalThis.expect(DcbTag$Reventless.isCompositePartitionMember(DcbTag$Reventless.compositePartitionMember(0, undefined))).toBe(true);
526
- });
527
- globalThis.test("returns false for plain DcbTag.string", () => {
528
- globalThis.expect(DcbTag$Reventless.isCompositePartitionMember(DcbTag$Reventless.string)).toBe(false);
529
- });
530
- globalThis.test("returns false for plain S.string", () => {
531
- globalThis.expect(DcbTag$Reventless.isCompositePartitionMember(S.string)).toBe(false);
532
- });
533
- });
534
- globalThis.describe("buildQueryFromCommand", () => {
535
- let eventTypes = [
536
- "EventA",
537
- "EventB"
538
- ];
539
- globalThis.test("scalar-only command produces single AND clause", () => {
540
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(eventTypes, DcbFixtures$ReventlessCore.singleTagCommandSchema, {
541
- TAG: "CreateItem",
542
- itemId: "item-1",
543
- name: "Test"
544
- }, undefined, undefined)).toEqual([{
545
- eventTypes: eventTypes,
546
- tags: [{
547
- key: "itemId",
548
- value: "item-1"
549
- }]
550
- }]);
551
- });
552
- globalThis.test("tagged array command produces per-element OR clauses", () => {
553
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(eventTypes, DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
554
- TAG: "PlaceOrder",
555
- orderId: "ord-1",
556
- customerId: "cust-1",
557
- productId: [
558
- "prod-1",
559
- "prod-2"
560
- ]
561
- }, undefined, undefined)).toEqual([
562
- {
563
- eventTypes: eventTypes,
564
- tags: [{
565
- key: "orderId",
566
- value: "ord-1"
567
- }]
568
- },
569
- {
570
- eventTypes: eventTypes,
571
- tags: [{
572
- key: "productId",
573
- value: "prod-1"
574
- }]
575
- },
576
- {
577
- eventTypes: eventTypes,
578
- tags: [{
579
- key: "productId",
580
- value: "prod-2"
581
- }]
582
- }
583
- ]);
584
- });
585
- globalThis.test("tagged array with single element produces two OR clauses", () => {
586
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(eventTypes, DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
587
- TAG: "PlaceOrder",
588
- orderId: "ord-1",
589
- customerId: "cust-1",
590
- productId: ["prod-1"]
591
- }, undefined, undefined)).toEqual([
592
- {
593
- eventTypes: eventTypes,
594
- tags: [{
595
- key: "orderId",
596
- value: "ord-1"
597
- }]
598
- },
599
- {
600
- eventTypes: eventTypes,
601
- tags: [{
602
- key: "productId",
603
- value: "prod-1"
604
- }]
605
- }
606
- ]);
607
- });
608
- globalThis.test("tagged array with empty array produces single clause for scalar tag", () => {
609
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(eventTypes, DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
610
- TAG: "PlaceOrder",
611
- orderId: "ord-1",
612
- customerId: "cust-1",
613
- productId: []
614
- }, undefined, undefined)).toEqual([{
615
- eventTypes: eventTypes,
616
- tags: [{
617
- key: "orderId",
618
- value: "ord-1"
619
- }]
620
- }]);
621
- });
622
- let orderTagKeys = DcbTag$Reventless.extractTagKeysByEventType(DcbFixtures$ReventlessCore.orderEventLogSchema);
623
- globalThis.test("extractTagKeysByEventType maps each event type to its produced tag keys", () => {
624
- globalThis.expect(Object.entries(orderTagKeys).toSorted((param, param$1) => Primitive_string.compare(param[0], param$1[0]))).toEqual([
625
- [
626
- "CatalogProductSynced",
627
- ["productId"]
628
- ],
629
- [
630
- "OrderPlaced",
631
- [
632
- "orderId",
633
- "customerId",
634
- "productId"
635
- ]
636
- ]
637
- ]);
638
- });
639
- globalThis.test("narrowing drops the vacuous (CatalogProductSynced, orderId) combination but keeps OrderPlaced under productId", () => {
640
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand([
641
- "OrderPlaced",
642
- "CatalogProductSynced"
643
- ], DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
644
- TAG: "PlaceOrder",
645
- orderId: "ord-1",
646
- customerId: "cust-1",
647
- productId: ["prod-1"]
648
- }, orderTagKeys, undefined)).toEqual([
649
- {
650
- eventTypes: ["OrderPlaced"],
651
- tags: [{
652
- key: "orderId",
653
- value: "ord-1"
654
- }]
655
- },
656
- {
657
- eventTypes: [
658
- "OrderPlaced",
659
- "CatalogProductSynced"
660
- ],
661
- tags: [{
662
- key: "productId",
663
- value: "prod-1"
664
- }]
665
- }
666
- ]);
667
- });
668
- globalThis.test("narrowing the single AND clause keeps only types carrying every clause tag", () => {
669
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand([
670
- "OrderPlaced",
671
- "CatalogProductSynced"
672
- ], DcbFixtures$ReventlessCore.singleTagCommandSchema, {
673
- TAG: "CreateItem",
674
- itemId: "item-1",
675
- name: "Test"
676
- }, orderTagKeys, undefined)).toEqual([{
677
- eventTypes: [],
678
- tags: [{
679
- key: "itemId",
680
- value: "item-1"
681
- }]
682
- }]);
683
- });
684
- globalThis.test("an empty map leaves all event types in place (no narrowing)", () => {
685
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand([
686
- "OrderPlaced",
687
- "CatalogProductSynced"
688
- ], DcbFixtures$ReventlessCore.crossEntityCommandSchema, {
689
- TAG: "PlaceOrder",
690
- orderId: "ord-1",
691
- customerId: "cust-1",
692
- productId: ["prod-1"]
693
- }, {}, undefined)).toEqual([
694
- {
695
- eventTypes: [
696
- "OrderPlaced",
697
- "CatalogProductSynced"
698
- ],
699
- tags: [{
700
- key: "orderId",
701
- value: "ord-1"
702
- }]
703
- },
704
- {
705
- eventTypes: [
706
- "OrderPlaced",
707
- "CatalogProductSynced"
708
- ],
709
- tags: [{
710
- key: "productId",
711
- value: "prod-1"
712
- }]
713
- }
714
- ]);
715
- });
716
- globalThis.test("extractCrossPartitionTagKeys returns only the @crossPartition keys", () => {
717
- globalThis.expect(DcbTag$Reventless.extractCrossPartitionTagKeys(DcbFixtures$ReventlessCore.subscriptionEventSchema)).toEqual(["studentId"]);
718
- });
719
- globalThis.test("extractCrossPartitionTagKeys is empty when no field is @crossPartition", () => {
720
- globalThis.expect(DcbTag$Reventless.extractCrossPartitionTagKeys(DcbFixtures$ReventlessCore.simplePartitionEventSchema)).toEqual([]);
721
- });
722
- globalThis.test("a cross-partition tag fans a 2-tag command into two single-tag clauses", () => {
723
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(["StudentSubscribed"], DcbFixtures$ReventlessCore.subscribeCommandSchema, {
724
- TAG: "SubscribeStudent",
725
- courseId: "C1",
726
- studentId: "S1"
727
- }, undefined, ["studentId"])).toEqual([
728
- {
729
- eventTypes: ["StudentSubscribed"],
730
- tags: [{
731
- key: "courseId",
732
- value: "C1"
733
- }]
734
- },
735
- {
736
- eventTypes: ["StudentSubscribed"],
737
- tags: [{
738
- key: "studentId",
739
- value: "S1"
740
- }]
741
- }
742
- ]);
743
- });
744
- globalThis.test("without crossPartitionTagKeys the same 2-tag command stays one composite clause", () => {
745
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand(["StudentSubscribed"], DcbFixtures$ReventlessCore.subscribeCommandSchema, {
746
- TAG: "SubscribeStudent",
747
- courseId: "C1",
748
- studentId: "S1"
749
- }, undefined, undefined)).toEqual([{
750
- eventTypes: ["StudentSubscribed"],
751
- tags: [
752
- {
753
- key: "courseId",
754
- value: "C1"
755
- },
756
- {
757
- key: "studentId",
758
- value: "S1"
759
- }
760
- ]
761
- }]);
762
- });
763
- globalThis.test("hasTaggedArrayFields detects tagged arrays", () => {
764
- globalThis.expect(DcbTag$Reventless.hasTaggedArrayFields(DcbFixtures$ReventlessCore.crossEntityCommandSchema)).toBe(true);
765
- });
766
- globalThis.test("hasTaggedArrayFields returns false for scalar-only schemas", () => {
767
- globalThis.expect(DcbTag$Reventless.hasTaggedArrayFields(DcbFixtures$ReventlessCore.singleTagCommandSchema)).toBe(false);
768
- });
769
- });
770
- globalThis.describe("stringForKey (tag-key override)", () => {
771
- globalThis.test("isTagged is true for stringForKey schema", () => {
772
- globalThis.expect(DcbTag$Reventless.isTagged(DcbTag$Reventless.stringForKey("productId"))).toBe(true);
773
- });
774
- globalThis.test("extractTags returns the override key for a scalar field", () => {
775
- globalThis.expect(DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.customKeyEventSchema, {
776
- TAG: "ProductLabelled",
777
- sku: "SKU-42"
778
- })).toEqual([{
779
- key: "productSku",
780
- value: "SKU-42"
781
- }]);
782
- });
783
- globalThis.test("extractTagsExpanded uses the override key on every array element", () => {
784
- globalThis.expect(DcbTag$Reventless.extractTagsExpanded(DcbFixtures$ReventlessCore.multiProductCommandSchema, {
785
- TAG: "PlaceOrderWithMany",
786
- orderId: "ord-1",
787
- productIds: [
788
- "prod-1",
789
- "prod-2"
790
- ]
791
- })).toEqual([
792
- {
793
- key: "orderId",
794
- value: "ord-1"
795
- },
796
- {
797
- key: "productId",
798
- value: "prod-1"
799
- },
800
- {
801
- key: "productId",
802
- value: "prod-2"
803
- }
804
- ]);
805
- });
806
- globalThis.test("buildQueryFromCommand emits the override key in OR clauses", () => {
807
- globalThis.expect(DcbTag$Reventless.buildQueryFromCommand([
808
- "OrderPlaced",
809
- "CatalogProductSynced"
810
- ], DcbFixtures$ReventlessCore.multiProductCommandSchema, {
811
- TAG: "PlaceOrderWithMany",
812
- orderId: "ord-1",
813
- productIds: [
814
- "prod-1",
815
- "prod-2"
816
- ]
817
- }, undefined, undefined)).toEqual([
818
- {
819
- eventTypes: [
820
- "OrderPlaced",
821
- "CatalogProductSynced"
822
- ],
823
- tags: [{
824
- key: "orderId",
825
- value: "ord-1"
826
- }]
827
- },
828
- {
829
- eventTypes: [
830
- "OrderPlaced",
831
- "CatalogProductSynced"
832
- ],
833
- tags: [{
834
- key: "productId",
835
- value: "prod-1"
836
- }]
837
- },
838
- {
839
- eventTypes: [
840
- "OrderPlaced",
841
- "CatalogProductSynced"
842
- ],
843
- tags: [{
844
- key: "productId",
845
- value: "prod-2"
846
- }]
847
- }
848
- ]);
849
- });
850
- globalThis.test("singular producer + plural consumer share the same tag key (round-trip)", () => {
851
- let producerTags = DcbTag$Reventless.extractTags(DcbFixtures$ReventlessCore.singleProductEventSchema, {
852
- TAG: "CatalogProductSynced",
853
- productId: "prod-1"
854
- });
855
- let consumerTags = DcbTag$Reventless.extractTagsExpanded(DcbFixtures$ReventlessCore.multiProductCommandSchema, {
856
- TAG: "PlaceOrderWithMany",
857
- orderId: "ord-1",
858
- productIds: ["prod-1"]
859
- });
860
- let producerHead = producerTags[0];
861
- let consumerProductTag = Stdlib_Option.getOrThrow(consumerTags.find(t => t.key !== "orderId"), undefined);
862
- globalThis.expect(consumerProductTag.key).toBe(producerHead.key);
863
- });
864
- });
865
- });
866
-
867
- /* Not a pure module */