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

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 (74) hide show
  1. package/CHANGELOG.md +7 -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/Task/Task_Builder.res +6 -4
  6. package/src/components/Task/Task_Builder.res.mjs +4 -4
  7. package/src/plugin/connect/PluginExtensionPoint_Builder.res +2 -0
  8. package/src/plugin/connect/PluginExtensionPoint_Builder.res.mjs +3 -3
  9. package/tests/IdentityTest.res.mjs +0 -174
  10. package/tests/adapter/MonitoringTest.res.mjs +0 -82
  11. package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +0 -356
  12. package/tests/admin/Platform_UIFragmentsApiTest.res.mjs +0 -101
  13. package/tests/aggregate/AggregateCacheTest.res.mjs +0 -433
  14. package/tests/aggregate/AggregateCallbackTest.res.mjs +0 -143
  15. package/tests/aggregate/AggregateCausationTest.res.mjs +0 -47
  16. package/tests/aggregate/AggregateConflictTest.res.mjs +0 -386
  17. package/tests/aggregate/AggregateFixtures.res.mjs +0 -308
  18. package/tests/aggregate/AggregateRejectionTest.res.mjs +0 -166
  19. package/tests/aggregate/AggregateSnapshotTest.res.mjs +0 -645
  20. package/tests/api/ApiNoApiTest.res.mjs +0 -90
  21. package/tests/api/GraphQL_StitcherTest.res.mjs +0 -112
  22. package/tests/api/SimpleTest.res.mjs +0 -10
  23. package/tests/api/SuryToJsonSchemaTest.res.mjs +0 -674
  24. package/tests/commandgenerator/CommandGeneratorCallbackTest.res.mjs +0 -160
  25. package/tests/commandgenerator/CommandGeneratorFixtures.res.mjs +0 -197
  26. package/tests/commandtopic/CommandTopicCallbackFixtures.res.mjs +0 -152
  27. package/tests/commandtopic/CommandTopicCallbackTest.res.mjs +0 -106
  28. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res.mjs +0 -109
  29. package/tests/counter/CounterCallbackTest.res.mjs +0 -140
  30. package/tests/counter/CounterFixtures.res.mjs +0 -67
  31. package/tests/dcb/DcbDecodeTest.res.mjs +0 -194
  32. package/tests/dcb/DcbEventLogOperationsTest.res.mjs +0 -268
  33. package/tests/dcb/DcbFixtures.res.mjs +0 -534
  34. package/tests/dcb/DcbScopeInferenceTest.res.mjs +0 -480
  35. package/tests/dcb/DcbStateChangeSliceTest.res.mjs +0 -540
  36. package/tests/dcb/DcbTagTest.res.mjs +0 -867
  37. package/tests/dcb/DcbValidationTest.res.mjs +0 -476
  38. package/tests/eventlog/EventLogFixtures.res.mjs +0 -196
  39. package/tests/eventlog/EventLogOperationsTest.res.mjs +0 -192
  40. package/tests/eventlog/EventLogRetryTest.res.mjs +0 -195
  41. package/tests/eventmapper/EventMapperCallbackTest.res.mjs +0 -141
  42. package/tests/eventmapper/EventMapperFixtures.res.mjs +0 -440
  43. package/tests/eventmapper/EventMapperTest.res.mjs +0 -83
  44. package/tests/eventtopic/EventTopicFixtures.res.mjs +0 -65
  45. package/tests/eventtopic/EventTopicOperationsTest.res.mjs +0 -71
  46. package/tests/extensionpoint/ExtensionPointCallbackTest.res.mjs +0 -94
  47. package/tests/extensionpoint/ExtensionPointFixtures.res.mjs +0 -205
  48. package/tests/extensionpoint/ExtensionPointOperationsTest.res.mjs +0 -304
  49. package/tests/ftp/FTPTest.res.mjs +0 -88
  50. package/tests/logger/LogFormatTest.res.mjs +0 -309
  51. package/tests/logger/LoggerLazyTest.res.mjs +0 -40
  52. package/tests/message/MessageTest.res.mjs +0 -218
  53. package/tests/message/MetaEnvelopeTest.res.mjs +0 -188
  54. package/tests/plugin/ManifestVisibilityTest.res.mjs +0 -215
  55. package/tests/plugin/PluginSpecExperiment.res.mjs +0 -31
  56. package/tests/plugin/PluginStructureTest.res.mjs +0 -419
  57. package/tests/plugin/PluginVersionTest.res.mjs +0 -30
  58. package/tests/plugin/SchemaWalkerTest.res.mjs +0 -160
  59. package/tests/plugin/StateChangeSlice/PsPlaceOrder.res.mjs +0 -62
  60. package/tests/plugin/StateChangeSlice/PsShipOrder.res.mjs +0 -69
  61. package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +0 -95
  62. package/tests/plugin/StateViewSlice/PsAvailableProductsView.res.mjs +0 -69
  63. package/tests/plugin/StateViewSlice/PsCustomersView.res.mjs +0 -69
  64. package/tests/plugin/StateViewSlice/PsOrdersView.res.mjs +0 -81
  65. package/tests/poc/StructuralSubtypingPoc.res.mjs +0 -61
  66. package/tests/projection/ProjectionOptimizeTest.res.mjs +0 -75
  67. package/tests/querydb/QueryDbFixtures.res.mjs +0 -135
  68. package/tests/querydb/QueryDbOperationsTest.res.mjs +0 -168
  69. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res.mjs +0 -77
  70. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +0 -139
  71. package/tests/util/CommandPublisherTest.res.mjs +0 -78
  72. package/tests/util/CsvStreamTest.res.mjs +0 -51
  73. package/tests/util/LruTest.res.mjs +0 -105
  74. 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 */