@reventlessdev/reventless-local 3.0.0-alpha.113

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 (334) hide show
  1. package/CHANGELOG.md +1197 -0
  2. package/LICENSE +202 -0
  3. package/__mocks__/emptyModule.js +2 -0
  4. package/__mocks__/nodeSqlite.mjs +6 -0
  5. package/package.json +67 -0
  6. package/rescript.json +39 -0
  7. package/src/Platform.res +2162 -0
  8. package/src/Platform.res.mjs +3389 -0
  9. package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
  10. package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
  11. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
  12. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
  13. package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
  14. package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
  15. package/src/adapter/Auth/LocalAuth.res +239 -0
  16. package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
  17. package/src/adapter/Auth/UserStore.res +134 -0
  18. package/src/adapter/Auth/UserStore.res.mjs +146 -0
  19. package/src/adapter/Backend.res +46 -0
  20. package/src/adapter/Backend.res.mjs +66 -0
  21. package/src/adapter/BackendState.res +34 -0
  22. package/src/adapter/BackendState.res.mjs +42 -0
  23. package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
  24. package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
  25. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
  26. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
  27. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
  28. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
  29. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
  30. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
  31. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
  32. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
  33. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
  34. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
  35. package/src/adapter/Counter/LocalCounterHandler.res +42 -0
  36. package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
  37. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
  38. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
  39. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
  40. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
  41. package/src/adapter/DomainGraphQL_Server.res +565 -0
  42. package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
  43. package/src/adapter/DomainMCP_Server.res +369 -0
  44. package/src/adapter/DomainMCP_Server.res.mjs +358 -0
  45. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
  46. package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
  47. package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
  48. package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
  49. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
  50. package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
  51. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
  52. package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
  53. package/src/adapter/GraphQL_Server.res +6 -0
  54. package/src/adapter/GraphQL_Server.res.mjs +154 -0
  55. package/src/adapter/GraphQL_ServerInstance.res +310 -0
  56. package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
  57. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
  58. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
  59. package/src/adapter/LocalBus.res +498 -0
  60. package/src/adapter/LocalBus.res.mjs +1011 -0
  61. package/src/adapter/LocalPluginSpec.res +16 -0
  62. package/src/adapter/LocalPluginSpec.res.mjs +33 -0
  63. package/src/adapter/LocalSideEffectHandler.res +44 -0
  64. package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
  65. package/src/adapter/MCP_Server.res +4 -0
  66. package/src/adapter/MCP_Server.res.mjs +67 -0
  67. package/src/adapter/MCP_ServerInstance.res +362 -0
  68. package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
  69. package/src/adapter/PlatformGraphQL_Server.res +75 -0
  70. package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
  71. package/src/adapter/PlatformMCP_Server.res +23 -0
  72. package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
  73. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
  74. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
  75. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
  76. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
  77. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
  78. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
  79. package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
  80. package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
  81. package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
  82. package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
  83. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
  84. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
  85. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
  86. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
  87. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
  88. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
  89. package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
  90. package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
  91. package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
  92. package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
  93. package/src/adapter/SqliteDriver.res +52 -0
  94. package/src/adapter/SqliteDriver.res.mjs +76 -0
  95. package/src/adapter/SqliteDriver.resi +31 -0
  96. package/src/adapter/Task/LocalTaskBucket.res +75 -0
  97. package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
  98. package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
  99. package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
  100. package/src/components/Aggregate_Builder.res +55 -0
  101. package/src/components/Aggregate_Builder.res.mjs +140 -0
  102. package/src/components/AutomationSlice_Builder.res +41 -0
  103. package/src/components/AutomationSlice_Builder.res.mjs +57 -0
  104. package/src/components/Counter_Builder.res +14 -0
  105. package/src/components/Counter_Builder.res.mjs +32 -0
  106. package/src/components/DcbEventLog_Builder.res +18 -0
  107. package/src/components/DcbEventLog_Builder.res.mjs +24 -0
  108. package/src/components/ExtensionPoint_Builder.res +25 -0
  109. package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
  110. package/src/components/InboundTranslationSlice_Builder.res +34 -0
  111. package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
  112. package/src/components/OutboundTranslationSlice_Builder.res +43 -0
  113. package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
  114. package/src/components/Plugin_Builder.res +37 -0
  115. package/src/components/Plugin_Builder.res.mjs +67 -0
  116. package/src/components/ReadModel_Builder.res +47 -0
  117. package/src/components/ReadModel_Builder.res.mjs +54 -0
  118. package/src/components/StateChangeSlice_Builder.res +19 -0
  119. package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
  120. package/src/components/StateViewSlice_Builder.res +42 -0
  121. package/src/components/StateViewSlice_Builder.res.mjs +58 -0
  122. package/src/components/Task_Builder.res +28 -0
  123. package/src/components/Task_Builder.res.mjs +41 -0
  124. package/src/reexport/CommandTopic.res +3 -0
  125. package/src/reexport/CommandTopic.res.mjs +55 -0
  126. package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
  127. package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
  128. package/src/test/Mocks/MockEventLogStorage.res +57 -0
  129. package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
  130. package/src/test/Mocks/MockPublisher.res +29 -0
  131. package/src/test/Mocks/MockPublisher.res.mjs +28 -0
  132. package/src/test/Mocks/MockQueryDbStorage.res +104 -0
  133. package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
  134. package/src/test/TestRunner.res +96 -0
  135. package/src/test/TestRunner.res.mjs +71 -0
  136. package/tests/SplitApiFixtures.res +84 -0
  137. package/tests/SplitApiFixtures.res.mjs +88 -0
  138. package/tests/SplitApiTest.res +102 -0
  139. package/tests/SplitApiTest.res.mjs +82 -0
  140. package/tests/TestFixtures.res +54 -0
  141. package/tests/TestFixtures.res.mjs +65 -0
  142. package/tests/adapter/BackendParityTest.res +94 -0
  143. package/tests/adapter/BackendParityTest.res.mjs +96 -0
  144. package/tests/adapter/CollectNEventsTest.res +82 -0
  145. package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
  146. package/tests/adapter/CommandAuthorizationTest.res +200 -0
  147. package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
  148. package/tests/adapter/CommandTopicChannelTest.res +174 -0
  149. package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
  150. package/tests/adapter/CounterHandlerTest.res +113 -0
  151. package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
  152. package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
  153. package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
  154. package/tests/adapter/DcbEventLogStorageTest.res +187 -0
  155. package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
  156. package/tests/adapter/EventCollectorChannelTest.res +166 -0
  157. package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
  158. package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
  159. package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
  160. package/tests/adapter/EventTapTest.res +102 -0
  161. package/tests/adapter/EventTapTest.res.mjs +94 -0
  162. package/tests/adapter/EventTopicPublisherTest.res +76 -0
  163. package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
  164. package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
  165. package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
  166. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
  167. package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
  168. package/tests/adapter/HeartbeatRunnerTest.res +136 -0
  169. package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
  170. package/tests/adapter/LocalAuthHttpTest.res +224 -0
  171. package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
  172. package/tests/adapter/LocalAuthLoginTest.res +180 -0
  173. package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
  174. package/tests/adapter/LocalAuthTest.res +106 -0
  175. package/tests/adapter/LocalAuthTest.res.mjs +145 -0
  176. package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
  177. package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
  178. package/tests/adapter/LocalBusBoundedTest.res +157 -0
  179. package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
  180. package/tests/adapter/LocalBusPubSubTest.res +81 -0
  181. package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
  182. package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
  183. package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
  184. package/tests/adapter/QueryDbListResolverTest.res +361 -0
  185. package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
  186. package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
  187. package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
  188. package/tests/adapter/QueryDbStorageTest.res +171 -0
  189. package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
  190. package/tests/adapter/QueryEngineTest.res +152 -0
  191. package/tests/adapter/QueryEngineTest.res.mjs +148 -0
  192. package/tests/adapter/ScheduledPublisherTest.res +199 -0
  193. package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
  194. package/tests/adapter/SortKey_FilterTest.res +103 -0
  195. package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
  196. package/tests/adapter/SqliteDriverTest.res +86 -0
  197. package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
  198. package/tests/adapter/TaskBucketSqliteTest.res +44 -0
  199. package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
  200. package/tests/adapter/TaskBucketTest.res +106 -0
  201. package/tests/adapter/TaskBucketTest.res.mjs +118 -0
  202. package/tests/components/aggregate/AggregateFixtures.res +78 -0
  203. package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
  204. package/tests/components/aggregate/AggregateTest.res +129 -0
  205. package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
  206. package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
  207. package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
  208. package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
  209. package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
  210. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
  211. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
  212. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
  213. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
  214. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
  215. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
  216. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
  217. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
  218. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
  219. package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
  220. package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
  221. package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
  222. package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
  223. package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
  224. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
  225. package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
  226. package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
  227. package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
  228. package/tests/components/commandtopic/CommandTopicTest.res +55 -0
  229. package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
  230. package/tests/components/counter/CounterFixtures.res +42 -0
  231. package/tests/components/counter/CounterFixtures.res.mjs +34 -0
  232. package/tests/components/counter/CounterTest.res +46 -0
  233. package/tests/components/counter/CounterTest.res.mjs +61 -0
  234. package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
  235. package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
  236. package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
  237. package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
  238. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
  239. package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
  240. package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
  241. package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
  242. package/tests/components/dcb/DcbFixtures.res +145 -0
  243. package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
  244. package/tests/components/dcb/DcbTest.res +55 -0
  245. package/tests/components/dcb/DcbTest.res.mjs +55 -0
  246. package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
  247. package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
  248. package/tests/components/eventcollector/EventCollectorTest.res +37 -0
  249. package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
  250. package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
  251. package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
  252. package/tests/components/eventlog/EventLogConflictTest.res +86 -0
  253. package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
  254. package/tests/components/eventlog/EventLogFixtures.res +52 -0
  255. package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
  256. package/tests/components/eventlog/EventLogStreamTest.res +98 -0
  257. package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
  258. package/tests/components/eventlog/EventLogTest.res +53 -0
  259. package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
  260. package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
  261. package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
  262. package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
  263. package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
  264. package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
  265. package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
  266. package/tests/components/eventtopic/EventTopicTest.res +35 -0
  267. package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
  268. package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
  269. package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
  270. package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
  271. package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
  272. package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
  273. package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
  274. package/tests/components/heartbeat/HeartbeatTest.res +67 -0
  275. package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
  276. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
  277. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
  278. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
  279. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
  280. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
  281. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
  282. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
  283. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
  284. package/tests/components/querydb/QueryDbFixtures.res +39 -0
  285. package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
  286. package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
  287. package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
  288. package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
  289. package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
  290. package/tests/components/querydb/QueryDbTest.res +81 -0
  291. package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
  292. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
  293. package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
  294. package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
  295. package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
  296. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
  297. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
  298. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
  299. package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
  300. package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
  301. package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
  302. package/tests/components/readmodel/ReadModelFixtures.res +138 -0
  303. package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
  304. package/tests/components/readmodel/ReadModelTest.res +46 -0
  305. package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
  306. package/tests/components/scheduler/SchedulerFixtures.res +59 -0
  307. package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
  308. package/tests/components/scheduler/SchedulerTest.res +76 -0
  309. package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
  310. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
  311. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
  312. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
  313. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
  314. package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
  315. package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
  316. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
  317. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
  318. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
  319. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
  320. package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
  321. package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
  322. package/tests/components/task/TaskFixtures.res +87 -0
  323. package/tests/components/task/TaskFixtures.res.mjs +82 -0
  324. package/tests/components/task/TaskTest.res +98 -0
  325. package/tests/components/task/TaskTest.res.mjs +46 -0
  326. package/tests/plugin/PluginBehavior_GWT.res +146 -0
  327. package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
  328. package/tests/plugin/Plugin_Fixtures.res +61 -0
  329. package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
  330. package/tests/plugin/PluginsProjection_GWT.res +95 -0
  331. package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
  332. package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
  333. package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
  334. package/tests/setup/sqliteGlobal.cjs +12 -0
@@ -0,0 +1,113 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Stream$1 from "effect/Stream";
6
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
7
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
8
+ import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
9
+
10
+ globalThis.describe("EventLog.appendStream (in-memory adapter)", () => {
11
+ globalThis.beforeAll(async () => {
12
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
13
+ });
14
+ globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
15
+ globalThis.describe("basic append", () => {
16
+ globalThis.test("appendStream writes all events to storage", async () => {
17
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
18
+ let stream = Stream$1.fromIterable([
19
+ {
20
+ TAG: "ItemCreated",
21
+ name: "e1"
22
+ },
23
+ {
24
+ TAG: "ItemCreated",
25
+ name: "e2"
26
+ },
27
+ {
28
+ TAG: "ItemCreated",
29
+ name: "e3"
30
+ }
31
+ ]);
32
+ await Effect.runPromise(ops.appendStream(0, "as-basic-1", stream));
33
+ let replayed = await ops.replay("as-basic-1");
34
+ globalThis.expect(replayed.length).toBe(3);
35
+ });
36
+ globalThis.test("appendStream on empty stream writes nothing", async () => {
37
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
38
+ await Effect.runPromise(ops.appendStream(0, "as-empty-1", Stream$1.empty));
39
+ let replayed = await ops.replay("as-empty-1");
40
+ globalThis.expect(replayed.length).toBe(0);
41
+ });
42
+ globalThis.test("appendStream preserves event order", async () => {
43
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
44
+ let stream = Stream$1.fromIterable([
45
+ {
46
+ TAG: "ItemCreated",
47
+ name: "first"
48
+ },
49
+ {
50
+ TAG: "ItemDeleted",
51
+ id: "second"
52
+ }
53
+ ]);
54
+ await Effect.runPromise(ops.appendStream(0, "as-order-1", stream));
55
+ let replayed = await Effect.runPromise(Stream.runCollect(ops.replayStream("as-order-1")));
56
+ let first = replayed[0];
57
+ globalThis.expect(first).toEqual({
58
+ TAG: "ItemCreated",
59
+ name: "first"
60
+ });
61
+ });
62
+ globalThis.test("appendStream after array append continues from correct sequenceNr", async () => {
63
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
64
+ await ops.append(0, "as-seq-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("as-seq-1", {
65
+ TAG: "ItemCreated",
66
+ name: "initial"
67
+ })]);
68
+ let stream = Stream$1.fromIterable([{
69
+ TAG: "ItemCreated",
70
+ name: "streamed"
71
+ }]);
72
+ await Effect.runPromise(ops.appendStream(1, "as-seq-1", stream));
73
+ let replayed = await ops.replay("as-seq-1");
74
+ globalThis.expect(replayed.length).toBe(2);
75
+ });
76
+ });
77
+ globalThis.describe("replayStream → appendStream pipeline", () => {
78
+ globalThis.test("can copy events from one aggregate to another via streams", async () => {
79
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
80
+ await ops.append(0, "as-src-1", [
81
+ EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-1", {
82
+ TAG: "ItemCreated",
83
+ name: "a"
84
+ }),
85
+ EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-1", {
86
+ TAG: "ItemDeleted",
87
+ id: "b"
88
+ })
89
+ ]);
90
+ let sourceStream = ops.replayStream("as-src-1");
91
+ await Effect.runPromise(ops.appendStream(0, "as-dst-1", sourceStream));
92
+ let destEvents = await ops.replay("as-dst-1");
93
+ globalThis.expect(destEvents.length).toBe(2);
94
+ });
95
+ globalThis.test("copied events round-trip through decode correctly", async () => {
96
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
97
+ await ops.append(0, "as-src-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-2", {
98
+ TAG: "ItemCreated",
99
+ name: "copied"
100
+ })]);
101
+ let sourceStream = ops.replayStream("as-src-2");
102
+ await Effect.runPromise(ops.appendStream(0, "as-dst-2", sourceStream));
103
+ let destEvents = await Effect.runPromise(Stream.runCollect(ops.replayStream("as-dst-2")));
104
+ let first = destEvents[0];
105
+ globalThis.expect(first).toEqual({
106
+ TAG: "ItemCreated",
107
+ name: "copied"
108
+ });
109
+ });
110
+ });
111
+ });
112
+
113
+ /* Not a pure module */
@@ -0,0 +1,86 @@
1
+ // Tests for optimistic locking conflict detection in EventLog (in-memory).
2
+
3
+ open JestGlobals
4
+ open EventLogFixtures
5
+
6
+ describe("EventLog — conflict detection (in-memory)", () => {
7
+ let _ = beforeAllAsync(async () => {
8
+ let _ = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
9
+ })
10
+
11
+ let _ = beforeEach(() => reset())
12
+
13
+ testPromise("append with stale sequenceNr returns conflict error", async () => {
14
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
15
+ let _ = await ops.append(
16
+ 0,
17
+ "conflict-1",
18
+ [makeEvent'("conflict-1", ItemEventLogSpec.ItemCreated({name: "First"}))],
19
+ )
20
+ // Now storage has 1 event for "conflict-1"; passing sequenceNr=0 again should conflict
21
+ let result = await ops.append(
22
+ 0,
23
+ "conflict-1",
24
+ [makeEvent'("conflict-1", ItemEventLogSpec.ItemCreated({name: "Duplicate"}))],
25
+ )
26
+ expect(Result.isError(result))->toBe(true)
27
+ })
28
+
29
+ testPromise("append with correct sequenceNr succeeds after prior append", async () => {
30
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
31
+ let _ = await ops.append(
32
+ 0,
33
+ "conflict-2",
34
+ [makeEvent'("conflict-2", ItemEventLogSpec.ItemCreated({name: "First"}))],
35
+ )
36
+ let result = await ops.append(
37
+ 1,
38
+ "conflict-2",
39
+ [makeEvent'("conflict-2", ItemEventLogSpec.ItemDeleted({id: "conflict-2"}))],
40
+ )
41
+ expect(Result.isOk(result))->toBe(true)
42
+ })
43
+
44
+ testPromise("conflict does not publish events to event topic", async () => {
45
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
46
+ let _ = await ops.append(
47
+ 0,
48
+ "conflict-3",
49
+ [makeEvent'("conflict-3", ItemEventLogSpec.ItemCreated({name: "First"}))],
50
+ )
51
+ reset() // Reset captured count after first append
52
+ let _ = await ops.append(
53
+ 0,
54
+ "conflict-3",
55
+ [makeEvent'("conflict-3", ItemEventLogSpec.ItemCreated({name: "Duplicate"}))],
56
+ )
57
+ expect(capturedTopicEventCount.contents)->toBe(0)
58
+ })
59
+
60
+ testPromise("conflict does not store events", async () => {
61
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
62
+ let _ = await ops.append(
63
+ 0,
64
+ "conflict-4",
65
+ [makeEvent'("conflict-4", ItemEventLogSpec.ItemCreated({name: "First"}))],
66
+ )
67
+ let _ = await ops.append(
68
+ 0,
69
+ "conflict-4",
70
+ [makeEvent'("conflict-4", ItemEventLogSpec.ItemCreated({name: "Should not be stored"}))],
71
+ )
72
+ let replayed = await ops.replay("conflict-4")
73
+ expect(replayed->Array.length)->toBe(1)
74
+ })
75
+
76
+ testPromise("batch append with correct sequenceNr stores all events", async () => {
77
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
78
+ let result = await ops.append(0, "conflict-5", [
79
+ makeEvent'("conflict-5", ItemEventLogSpec.ItemCreated({name: "e1"})),
80
+ makeEvent'("conflict-5", ItemEventLogSpec.ItemDeleted({id: "e2"})),
81
+ ])
82
+ expect(Result.isOk(result))->toBe(true)
83
+ let replayed = await ops.replay("conflict-5")
84
+ expect(replayed->Array.length)->toBe(2)
85
+ })
86
+ })
@@ -0,0 +1,81 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Result from "@rescript/runtime/lib/es6/Stdlib_Result.js";
4
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
5
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
6
+ import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
7
+
8
+ globalThis.describe("EventLog — conflict detection (in-memory)", () => {
9
+ globalThis.beforeAll(async () => {
10
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
11
+ });
12
+ globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
13
+ globalThis.test("append with stale sequenceNr returns conflict error", async () => {
14
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
15
+ await ops.append(0, "conflict-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-1", {
16
+ TAG: "ItemCreated",
17
+ name: "First"
18
+ })]);
19
+ let result = await ops.append(0, "conflict-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-1", {
20
+ TAG: "ItemCreated",
21
+ name: "Duplicate"
22
+ })]);
23
+ globalThis.expect(Stdlib_Result.isError(result)).toBe(true);
24
+ });
25
+ globalThis.test("append with correct sequenceNr succeeds after prior append", async () => {
26
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
27
+ await ops.append(0, "conflict-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-2", {
28
+ TAG: "ItemCreated",
29
+ name: "First"
30
+ })]);
31
+ let result = await ops.append(1, "conflict-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-2", {
32
+ TAG: "ItemDeleted",
33
+ id: "conflict-2"
34
+ })]);
35
+ globalThis.expect(Stdlib_Result.isOk(result)).toBe(true);
36
+ });
37
+ globalThis.test("conflict does not publish events to event topic", async () => {
38
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
39
+ await ops.append(0, "conflict-3", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-3", {
40
+ TAG: "ItemCreated",
41
+ name: "First"
42
+ })]);
43
+ EventLogFixtures$ReventlessLocal.reset();
44
+ await ops.append(0, "conflict-3", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-3", {
45
+ TAG: "ItemCreated",
46
+ name: "Duplicate"
47
+ })]);
48
+ globalThis.expect(EventLogFixtures$ReventlessLocal.capturedTopicEventCount.contents).toBe(0);
49
+ });
50
+ globalThis.test("conflict does not store events", async () => {
51
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
52
+ await ops.append(0, "conflict-4", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-4", {
53
+ TAG: "ItemCreated",
54
+ name: "First"
55
+ })]);
56
+ await ops.append(0, "conflict-4", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-4", {
57
+ TAG: "ItemCreated",
58
+ name: "Should not be stored"
59
+ })]);
60
+ let replayed = await ops.replay("conflict-4");
61
+ globalThis.expect(replayed.length).toBe(1);
62
+ });
63
+ globalThis.test("batch append with correct sequenceNr stores all events", async () => {
64
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
65
+ let result = await ops.append(0, "conflict-5", [
66
+ EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-5", {
67
+ TAG: "ItemCreated",
68
+ name: "e1"
69
+ }),
70
+ EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-5", {
71
+ TAG: "ItemDeleted",
72
+ id: "e2"
73
+ })
74
+ ]);
75
+ globalThis.expect(Stdlib_Result.isOk(result)).toBe(true);
76
+ let replayed = await ops.replay("conflict-5");
77
+ globalThis.expect(replayed.length).toBe(2);
78
+ });
79
+ });
80
+
81
+ /* Not a pure module */
@@ -0,0 +1,52 @@
1
+ // Integration test fixtures for EventLog builder (in-memory).
2
+
3
+ open TestFixtures
4
+
5
+ // ─────────────────────────────────────────────────────────────
6
+ // Test event spec
7
+ // ─────────────────────────────────────────────────────────────
8
+
9
+ module ItemEventLogSpec = {
10
+ module Id = Reventless.Id.StringPure
11
+ let name = "TestItemEventLog"
12
+
13
+ @schema
14
+ type event = | ItemCreated({name: string}) | ItemDeleted({id: string})
15
+ }
16
+
17
+ // ─────────────────────────────────────────────────────────────
18
+ // Bus and Pulumi setup
19
+ // ─────────────────────────────────────────────────────────────
20
+
21
+ module Bus = LocalBus.Make()
22
+
23
+ // Capture events published to the event topic.
24
+ // Topic name = Spec.name ++ "EventTopic" = "TestItemEventLogEventTopic"
25
+ let capturedTopicEventCount: ref<int> = ref(0)
26
+ let _ = Bus.subscribeToEvents("TestItemEventLogEventTopic", async (_, _, _) => {
27
+ capturedTopicEventCount := capturedTopicEventCount.contents + 1
28
+ })
29
+
30
+ let _ = TestRunner.setup()
31
+
32
+ // ─────────────────────────────────────────────────────────────
33
+ // Build EventLog using in-memory adapters directly
34
+ // ─────────────────────────────────────────────────────────────
35
+
36
+ module EventLogMaker = ReventlessCore.EventLog_Builder.Make(
37
+ ItemEventLogSpec,
38
+ EventLogStorage_InMemory,
39
+ LocalEventTopicPublisher.Make(Bus),
40
+ )
41
+
42
+ let eventLog = EventLogMaker.make(~name="TestItemEventLog")
43
+
44
+ let makeEvent' = (id, event) => ({
45
+ Reventless.Message.id,
46
+ meta: testMeta,
47
+ event,
48
+ }: Reventless.Message.event'<string, ItemEventLogSpec.event>)
49
+
50
+ let reset = () => {
51
+ capturedTopicEventCount := 0
52
+ }
@@ -0,0 +1,80 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
5
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
7
+ import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
8
+ import * as EventLog_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventLog/EventLog_Builder.res.mjs";
9
+ import * as EventLogStorage_InMemory$ReventlessLocal from "../../../src/adapter/EventLog/EventLogStorage_InMemory.res.mjs";
10
+ import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
11
+
12
+ let name = "TestItemEventLog";
13
+
14
+ let eventSchema = S.union([
15
+ S.schema(s => ({
16
+ TAG: "ItemCreated",
17
+ name: s.m(S.string)
18
+ })),
19
+ S.schema(s => ({
20
+ TAG: "ItemDeleted",
21
+ id: s.m(S.string)
22
+ }))
23
+ ]);
24
+
25
+ let ItemEventLogSpec = {
26
+ Id: undefined,
27
+ name: name,
28
+ eventSchema: eventSchema
29
+ };
30
+
31
+ let Bus = LocalBus$ReventlessLocal.Make({});
32
+
33
+ let capturedTopicEventCount = {
34
+ contents: 0
35
+ };
36
+
37
+ Bus.subscribeToEvents("TestItemEventLogEventTopic", async (param, param$1, param$2) => {
38
+ capturedTopicEventCount.contents = capturedTopicEventCount.contents + 1 | 0;
39
+ });
40
+
41
+ TestRunner$ReventlessLocal.setup();
42
+
43
+ let EventLogMaker = EventLog_Builder$ReventlessCore.Make({
44
+ Id: {
45
+ schema: Id$Reventless.StringPure.schema,
46
+ make: prim => prim,
47
+ makeFromString: prim => prim,
48
+ toString: prim => prim,
49
+ cmp: Id$Reventless.StringPure.cmp
50
+ },
51
+ name: name,
52
+ eventSchema: eventSchema
53
+ })({
54
+ make: EventLogStorage_InMemory$ReventlessLocal.make
55
+ })(LocalEventTopicPublisher$ReventlessLocal.Make(Bus));
56
+
57
+ let eventLog = EventLogMaker.make("TestItemEventLog", undefined);
58
+
59
+ function makeEvent$p(id, event) {
60
+ return {
61
+ id: id,
62
+ meta: TestFixtures$ReventlessLocal.testMeta,
63
+ event: event
64
+ };
65
+ }
66
+
67
+ function reset() {
68
+ capturedTopicEventCount.contents = 0;
69
+ }
70
+
71
+ export {
72
+ ItemEventLogSpec,
73
+ Bus,
74
+ capturedTopicEventCount,
75
+ EventLogMaker,
76
+ eventLog,
77
+ makeEvent$p,
78
+ reset,
79
+ }
80
+ /* eventSchema Not a pure module */
@@ -0,0 +1,98 @@
1
+ // Tests for EventLog.replayStream (Phase B of effect-stream-integration plan).
2
+ // These tests verify the streaming replay API and the (state, count) fold pattern
3
+ // used by Aggregate_Callback to replace the two-pass replay + Array.length approach.
4
+
5
+ open JestGlobals
6
+ open EventLogFixtures
7
+
8
+ describe("EventLog.replayStream (in-memory adapter)", () => {
9
+ let _ = beforeAllAsync(async () => {
10
+ let _ = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
11
+ })
12
+
13
+ let _ = beforeEach(() => reset())
14
+
15
+ describe("basic streaming", () => {
16
+ testPromise("replayStream returns all appended events", async () => {
17
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
18
+ let _ = await ops.append(0, "stream-1", [makeEvent'("stream-1", ItemEventLogSpec.ItemCreated({name: "Widget"}))])
19
+ let _ = await ops.append(1, "stream-1", [makeEvent'("stream-1", ItemEventLogSpec.ItemDeleted({id: "stream-1"}))])
20
+ let count = await ops.replayStream("stream-1")
21
+ ->Stream.runFold(0, (n, _) => n + 1)
22
+ ->Effect.runPromise
23
+ expect(count)->toBe(2)
24
+ })
25
+
26
+ testPromise("replayStream for unknown id returns empty stream", async () => {
27
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
28
+ let count = await ops.replayStream("no-such-id")
29
+ ->Stream.runFold(0, (n, _) => n + 1)
30
+ ->Effect.runPromise
31
+ expect(count)->toBe(0)
32
+ })
33
+
34
+ testPromise("replayStream emits events in append order", async () => {
35
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
36
+ let _ = await ops.append(0, "stream-2", [makeEvent'("stream-2", ItemEventLogSpec.ItemCreated({name: "First"}))])
37
+ let _ = await ops.append(1, "stream-2", [makeEvent'("stream-2", ItemEventLogSpec.ItemDeleted({id: "stream-2"}))])
38
+ let events = await ops.replayStream("stream-2")
39
+ ->Stream.runCollect
40
+ ->Effect.runPromise
41
+ expect(events->Array.length)->toBe(2)
42
+ // First emitted is the Created event
43
+ let first = events->Array.getUnsafe(0)
44
+ expect(first)->toEqual(ItemEventLogSpec.ItemCreated({name: "First"}))
45
+ })
46
+
47
+ testPromise("separate aggregate IDs have independent streams", async () => {
48
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
49
+ let _ = await ops.append(0, "agg-X", [makeEvent'("agg-X", ItemEventLogSpec.ItemCreated({name: "X"}))])
50
+ let _ = await ops.append(0, "agg-Y", [makeEvent'("agg-Y", ItemEventLogSpec.ItemCreated({name: "Y1"})), makeEvent'("agg-Y", ItemEventLogSpec.ItemDeleted({id: "agg-Y"}))])
51
+ let countX = await ops.replayStream("agg-X")
52
+ ->Stream.runFold(0, (n, _) => n + 1)
53
+ ->Effect.runPromise
54
+ let countY = await ops.replayStream("agg-Y")
55
+ ->Stream.runFold(0, (n, _) => n + 1)
56
+ ->Effect.runPromise
57
+ expect(countX)->toBe(1)
58
+ expect(countY)->toBe(2)
59
+ })
60
+
61
+ testPromise("take(2) on a 5-event log returns only 2 events", async () => {
62
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
63
+ let _ = await ops.append(0, "stream-3", [
64
+ makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e1"})),
65
+ makeEvent'("stream-3", ItemEventLogSpec.ItemDeleted({id: "e2"})),
66
+ makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e3"})),
67
+ makeEvent'("stream-3", ItemEventLogSpec.ItemDeleted({id: "e4"})),
68
+ makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e5"})),
69
+ ])
70
+ let first2 = await ops.replayStream("stream-3")
71
+ ->Stream.take(2)
72
+ ->Stream.runCollect
73
+ ->Effect.runPromise
74
+ expect(first2->Array.length)->toBe(2)
75
+ })
76
+ })
77
+
78
+ describe("tuple fold — (state, count) pattern used in Aggregate_Callback", () => {
79
+ testPromise("runFold produces correct count for sequenceNr", async () => {
80
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
81
+ let _ = await ops.append(0, "fold-1", [makeEvent'("fold-1", ItemEventLogSpec.ItemCreated({name: "e1"})), makeEvent'("fold-1", ItemEventLogSpec.ItemDeleted({id: "e2"}))])
82
+ let _ = await ops.append(2, "fold-1", [makeEvent'("fold-1", ItemEventLogSpec.ItemCreated({name: "e3"}))])
83
+ let (_state, count) = await ops.replayStream("fold-1")
84
+ ->Stream.runFold((None, 0), ((st, n), _ev) => (st, n + 1))
85
+ ->Effect.runPromise
86
+ expect(count)->toBe(3)
87
+ })
88
+
89
+ testPromise("runFold on empty stream returns initial accumulator", async () => {
90
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
91
+ let (state, count) = await ops.replayStream("unknown-fold")
92
+ ->Stream.runFold((None, 0), ((st, n), _ev) => (st, n + 1))
93
+ ->Effect.runPromise
94
+ expect(state)->toEqual(None)
95
+ expect(count)->toBe(0)
96
+ })
97
+ })
98
+ })
@@ -0,0 +1,142 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Stream$1 from "effect/Stream";
6
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
7
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
8
+ import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
9
+
10
+ globalThis.describe("EventLog.replayStream (in-memory adapter)", () => {
11
+ globalThis.beforeAll(async () => {
12
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
13
+ });
14
+ globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
15
+ globalThis.describe("basic streaming", () => {
16
+ globalThis.test("replayStream returns all appended events", async () => {
17
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
18
+ await ops.append(0, "stream-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-1", {
19
+ TAG: "ItemCreated",
20
+ name: "Widget"
21
+ })]);
22
+ await ops.append(1, "stream-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-1", {
23
+ TAG: "ItemDeleted",
24
+ id: "stream-1"
25
+ })]);
26
+ let count = await Effect.runPromise(Stream$1.runFold(ops.replayStream("stream-1"), 0, (n, param) => n + 1 | 0));
27
+ globalThis.expect(count).toBe(2);
28
+ });
29
+ globalThis.test("replayStream for unknown id returns empty stream", async () => {
30
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
31
+ let count = await Effect.runPromise(Stream$1.runFold(ops.replayStream("no-such-id"), 0, (n, param) => n + 1 | 0));
32
+ globalThis.expect(count).toBe(0);
33
+ });
34
+ globalThis.test("replayStream emits events in append order", async () => {
35
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
36
+ await ops.append(0, "stream-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-2", {
37
+ TAG: "ItemCreated",
38
+ name: "First"
39
+ })]);
40
+ await ops.append(1, "stream-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-2", {
41
+ TAG: "ItemDeleted",
42
+ id: "stream-2"
43
+ })]);
44
+ let events = await Effect.runPromise(Stream.runCollect(ops.replayStream("stream-2")));
45
+ globalThis.expect(events.length).toBe(2);
46
+ let first = events[0];
47
+ globalThis.expect(first).toEqual({
48
+ TAG: "ItemCreated",
49
+ name: "First"
50
+ });
51
+ });
52
+ globalThis.test("separate aggregate IDs have independent streams", async () => {
53
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
54
+ await ops.append(0, "agg-X", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-X", {
55
+ TAG: "ItemCreated",
56
+ name: "X"
57
+ })]);
58
+ await ops.append(0, "agg-Y", [
59
+ EventLogFixtures$ReventlessLocal.makeEvent$p("agg-Y", {
60
+ TAG: "ItemCreated",
61
+ name: "Y1"
62
+ }),
63
+ EventLogFixtures$ReventlessLocal.makeEvent$p("agg-Y", {
64
+ TAG: "ItemDeleted",
65
+ id: "agg-Y"
66
+ })
67
+ ]);
68
+ let countX = await Effect.runPromise(Stream$1.runFold(ops.replayStream("agg-X"), 0, (n, param) => n + 1 | 0));
69
+ let countY = await Effect.runPromise(Stream$1.runFold(ops.replayStream("agg-Y"), 0, (n, param) => n + 1 | 0));
70
+ globalThis.expect(countX).toBe(1);
71
+ globalThis.expect(countY).toBe(2);
72
+ });
73
+ globalThis.test("take(2) on a 5-event log returns only 2 events", async () => {
74
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
75
+ await ops.append(0, "stream-3", [
76
+ EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
77
+ TAG: "ItemCreated",
78
+ name: "e1"
79
+ }),
80
+ EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
81
+ TAG: "ItemDeleted",
82
+ id: "e2"
83
+ }),
84
+ EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
85
+ TAG: "ItemCreated",
86
+ name: "e3"
87
+ }),
88
+ EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
89
+ TAG: "ItemDeleted",
90
+ id: "e4"
91
+ }),
92
+ EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
93
+ TAG: "ItemCreated",
94
+ name: "e5"
95
+ })
96
+ ]);
97
+ let first2 = await Effect.runPromise(Stream.runCollect(Stream$1.take(ops.replayStream("stream-3"), 2)));
98
+ globalThis.expect(first2.length).toBe(2);
99
+ });
100
+ });
101
+ globalThis.describe("tuple fold — (state, count) pattern used in Aggregate_Callback", () => {
102
+ globalThis.test("runFold produces correct count for sequenceNr", async () => {
103
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
104
+ await ops.append(0, "fold-1", [
105
+ EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
106
+ TAG: "ItemCreated",
107
+ name: "e1"
108
+ }),
109
+ EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
110
+ TAG: "ItemDeleted",
111
+ id: "e2"
112
+ })
113
+ ]);
114
+ await ops.append(2, "fold-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
115
+ TAG: "ItemCreated",
116
+ name: "e3"
117
+ })]);
118
+ let match = await Effect.runPromise(Stream$1.runFold(ops.replayStream("fold-1"), [
119
+ undefined,
120
+ 0
121
+ ], (param, _ev) => [
122
+ param[0],
123
+ param[1] + 1 | 0
124
+ ]));
125
+ globalThis.expect(match[1]).toBe(3);
126
+ });
127
+ globalThis.test("runFold on empty stream returns initial accumulator", async () => {
128
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
129
+ let match = await Effect.runPromise(Stream$1.runFold(ops.replayStream("unknown-fold"), [
130
+ undefined,
131
+ 0
132
+ ], (param, _ev) => [
133
+ param[0],
134
+ param[1] + 1 | 0
135
+ ]));
136
+ globalThis.expect(match[0]).toEqual(undefined);
137
+ globalThis.expect(match[1]).toBe(0);
138
+ });
139
+ });
140
+ });
141
+
142
+ /* Not a pure module */