@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,149 @@
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 Pulumi from "@pulumi/pulumi";
6
+ import * as Message$Reventless from "@reventlessdev/reventless-spec/src/types/Message.res.mjs";
7
+ import * as Adapter$ReventlessInfra from "@reventlessdev/reventless-infra/src/adapter/Adapter.res.mjs";
8
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
9
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
10
+ import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
11
+ import * as EventCollector_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventCollector/EventCollector_Builder.res.mjs";
12
+ import * as LocalRuntimeEnvironment$ReventlessLocal from "../../../src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs";
13
+ import * as SideEffectHandler_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/SideEffectHandler/SideEffectHandler_Builder.res.mjs";
14
+ import * as LocalEventCollectorChannel$ReventlessLocal from "../../../src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs";
15
+ import * as LocalEventCollectorRuntime_Builder$ReventlessLocal from "../../../src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs";
16
+
17
+ S.enableJson();
18
+
19
+ let Bus = LocalBus$ReventlessLocal.Make({});
20
+
21
+ TestRunner$ReventlessLocal.setup();
22
+
23
+ let name = "TestSEHSource";
24
+
25
+ let eventSchema = S.schema(s => ({
26
+ TAG: "OrderPlaced",
27
+ orderId: s.m(S.string)
28
+ }));
29
+
30
+ let TestSEHSource = {
31
+ Id: undefined,
32
+ name: name,
33
+ eventSchema: eventSchema
34
+ };
35
+
36
+ let capturedOrders = {
37
+ contents: []
38
+ };
39
+
40
+ let moduleUrl = import.meta.url;
41
+
42
+ async function execute(id, _meta, event, _queryEngine) {
43
+ capturedOrders.contents = capturedOrders.contents.concat([[
44
+ id,
45
+ event.orderId
46
+ ]]);
47
+ }
48
+
49
+ let TestSideEffect = {
50
+ Source: undefined,
51
+ moduleUrl: moduleUrl,
52
+ execute: execute
53
+ };
54
+
55
+ let EventCollectorCh = LocalEventCollectorChannel$ReventlessLocal.Make(Bus);
56
+
57
+ let SpecificEventCollector = EventCollector_Builder$ReventlessCore.Make({
58
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
59
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
60
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
61
+ asEventHandler: prim => prim,
62
+ asEffectHandler: prim => prim
63
+ })(EventCollectorCh);
64
+
65
+ let ECRTBuilder = LocalEventCollectorRuntime_Builder$ReventlessLocal.Make(Bus)(EventCollectorCh);
66
+
67
+ let SEHBuilder = SideEffectHandler_Builder$ReventlessCore.Make({
68
+ make: LocalRuntimeEnvironment$ReventlessLocal.make,
69
+ groupBySource: LocalRuntimeEnvironment$ReventlessLocal.groupBySource,
70
+ extractCorrelationId: LocalRuntimeEnvironment$ReventlessLocal.extractCorrelationId,
71
+ asEventHandler: prim => prim,
72
+ asEffectHandler: prim => prim
73
+ })(EventCollectorCh)(SpecificEventCollector)(ECRTBuilder);
74
+
75
+ let topicName = "TestSEHSource";
76
+
77
+ let topicResource = Adapter$ReventlessInfra.make(Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output("memory:InMemory"), undefined, undefined, undefined, undefined, undefined, undefined);
78
+
79
+ let allEventTopics = Object.fromEntries([[
80
+ "TestSEHSource",
81
+ {
82
+ resources: [topicResource]
83
+ }
84
+ ]]);
85
+
86
+ let sideEffects = [{
87
+ Source: {
88
+ name: name,
89
+ Id: {
90
+ schema: Id$Reventless.StringPure.schema,
91
+ make: prim => prim,
92
+ makeFromString: prim => prim,
93
+ toString: prim => prim,
94
+ cmp: Id$Reventless.StringPure.cmp
95
+ },
96
+ eventSchema: eventSchema
97
+ },
98
+ moduleUrl: moduleUrl,
99
+ execute: execute
100
+ }];
101
+
102
+ let seh = SEHBuilder.make("TestSEH", sideEffects, allEventTopics, Pulumi.output({}), undefined, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockScheduler, TestFixtures$ReventlessLocal.mockResourceNaming, undefined, undefined, undefined);
103
+
104
+ let testMeta = TestFixtures$ReventlessLocal.makeTestMeta("TestSEHSource");
105
+
106
+ async function publishOrderPlaced(id, orderId) {
107
+ let eventJson = Object.fromEntries([
108
+ [
109
+ "id",
110
+ id
111
+ ],
112
+ [
113
+ "meta",
114
+ S.reverseConvertToJsonOrThrow(testMeta, Message$Reventless.metaSchema)
115
+ ],
116
+ [
117
+ "event",
118
+ S.reverseConvertToJsonOrThrow({
119
+ TAG: "OrderPlaced",
120
+ orderId: orderId
121
+ }, eventSchema)
122
+ ]
123
+ ]);
124
+ return await Bus.publishEvent(topicName, "TestSEHSource", testMeta, eventJson);
125
+ }
126
+
127
+ function resetMocks() {
128
+ capturedOrders.contents = [];
129
+ }
130
+
131
+ export {
132
+ Bus,
133
+ TestSEHSource,
134
+ capturedOrders,
135
+ TestSideEffect,
136
+ EventCollectorCh,
137
+ SpecificEventCollector,
138
+ ECRTBuilder,
139
+ SEHBuilder,
140
+ topicName,
141
+ topicResource,
142
+ allEventTopics,
143
+ sideEffects,
144
+ seh,
145
+ testMeta,
146
+ publishOrderPlaced,
147
+ resetMocks,
148
+ }
149
+ /* Not a pure module */
@@ -0,0 +1,39 @@
1
+ // Integration tests for SideEffectHandler builder (in-memory).
2
+ // Publishes events to the bus and verifies side effect execute is called.
3
+
4
+ open JestGlobals
5
+ open SideEffectHandlerFixtures
6
+
7
+ // ─────────────────────────────────────────────────────────────
8
+ // Resolve Output chain before tests run (same pattern as ReadModelTest).
9
+ //
10
+ // Two resolves:
11
+ // 1. seh operations — triggers EventCollector.make → EventCollectorRuntimeBuilder.forEventCollector
12
+ // → LocalEventCollectorChannel.connect (starts resource.name.apply subscription chain).
13
+ // 2. topicResource.name — resolves the inner resource.name Output, registering
14
+ // Bus.subscribeToEvents for the side effect handler.
15
+ // ─────────────────────────────────────────────────────────────
16
+
17
+ let _ = beforeAllAsync(async () => {
18
+ let _ = await seh->ReventlessCore.Component.operations->TestRunner.resolve
19
+ let _ = await topicResource.name->TestRunner.resolve
20
+ })
21
+
22
+ describe("SideEffectHandler (in-memory)", () => {
23
+ let _ = beforeEach(() => resetMocks())
24
+
25
+ testPromise("OrderPlaced event triggers execute with correct id and orderId", async () => {
26
+ await publishOrderPlaced("order-1", "ord-abc")
27
+ expect(capturedOrders.contents->Array.length)->toBe(1)
28
+ let entry = capturedOrders.contents->Array.getUnsafe(0)
29
+ let (aggId, orderId) = entry
30
+ expect(aggId)->toBe("order-1")
31
+ expect(orderId)->toBe("ord-abc")
32
+ })
33
+
34
+ testPromise("multiple events trigger execute for each", async () => {
35
+ await publishOrderPlaced("order-2", "ord-def")
36
+ await publishOrderPlaced("order-3", "ord-ghi")
37
+ expect(capturedOrders.contents->Array.length)->toBe(2)
38
+ })
39
+ })
@@ -0,0 +1,28 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
4
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
5
+ import * as SideEffectHandlerFixtures$ReventlessLocal from "./SideEffectHandlerFixtures.res.mjs";
6
+
7
+ globalThis.beforeAll(async () => {
8
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(SideEffectHandlerFixtures$ReventlessLocal.seh));
9
+ await TestRunner$ReventlessLocal.resolve(SideEffectHandlerFixtures$ReventlessLocal.topicResource.name);
10
+ });
11
+
12
+ globalThis.describe("SideEffectHandler (in-memory)", () => {
13
+ globalThis.beforeEach(() => SideEffectHandlerFixtures$ReventlessLocal.resetMocks());
14
+ globalThis.test("OrderPlaced event triggers execute with correct id and orderId", async () => {
15
+ await SideEffectHandlerFixtures$ReventlessLocal.publishOrderPlaced("order-1", "ord-abc");
16
+ globalThis.expect(SideEffectHandlerFixtures$ReventlessLocal.capturedOrders.contents.length).toBe(1);
17
+ let entry = SideEffectHandlerFixtures$ReventlessLocal.capturedOrders.contents[0];
18
+ globalThis.expect(entry[0]).toBe("order-1");
19
+ globalThis.expect(entry[1]).toBe("ord-abc");
20
+ });
21
+ globalThis.test("multiple events trigger execute for each", async () => {
22
+ await SideEffectHandlerFixtures$ReventlessLocal.publishOrderPlaced("order-2", "ord-def");
23
+ await SideEffectHandlerFixtures$ReventlessLocal.publishOrderPlaced("order-3", "ord-ghi");
24
+ globalThis.expect(SideEffectHandlerFixtures$ReventlessLocal.capturedOrders.contents.length).toBe(2);
25
+ });
26
+ });
27
+
28
+ /* Not a pure module */
@@ -0,0 +1,117 @@
1
+ // E2E test fixtures for StateViewSlice builder.
2
+ // Builds a StateViewSlice on top of a DcbEventLog and verifies projection into QueryDb.
3
+
4
+ open Reventless.Projection
5
+
6
+ // ─────────────────────────────────────────────────────────────
7
+ // Event type definition for the DcbEventLog
8
+ // ─────────────────────────────────────────────────────────────
9
+
10
+ module ItemEventLog = {
11
+ @schema
12
+ type event =
13
+ | ItemAdded({id: @s.matches(Reventless.DcbTag.string) string, name: string})
14
+ | ItemRenamed({id: @s.matches(Reventless.DcbTag.string) string, name: string})
15
+ | ItemRemoved({id: @s.matches(Reventless.DcbTag.string) string})
16
+ }
17
+
18
+ // ─────────────────────────────────────────────────────────────
19
+ // StateViewSlice spec: project ItemEventLog events to {id, name} state
20
+ // ─────────────────────────────────────────────────────────────
21
+
22
+ module ItemsViewSpec = {
23
+ let name = "ItemsView"
24
+ let moduleUrl: string = %raw(`import.meta.url`)
25
+
26
+ @schema
27
+ type consumedEvent =
28
+ | ItemAdded({id: string, name: string})
29
+ | ItemRenamed({id: string, name: string})
30
+ | ItemRemoved({id: string})
31
+
32
+ @schema
33
+ type state = {id: string, name: string}
34
+
35
+ let config = Reventless.ReadModel.config()
36
+ let subIdConfig = None
37
+ }
38
+
39
+ module ItemsViewProjection = {
40
+ module Spec = ItemsViewSpec
41
+ open ItemsViewSpec
42
+
43
+ let moduleUrl: string = %raw(`import.meta.url`)
44
+
45
+ let project = (event: consumedEvent) =>
46
+ switch event {
47
+ | ItemAdded({id, name}) => [Set(id, {id, name})]
48
+ | ItemRenamed({id, name}) => [Update(id, s => {...s, name})]
49
+ | ItemRemoved({id}) => [Delete(id)]
50
+ }
51
+ }
52
+
53
+ // ─────────────────────────────────────────────────────────────
54
+ // Isolated bus for this test suite
55
+ // ─────────────────────────────────────────────────────────────
56
+
57
+ module Bus = LocalBus.Make()
58
+
59
+ // ─────────────────────────────────────────────────────────────
60
+ // Activate Pulumi mock mode (must be before any Component.make)
61
+ // ─────────────────────────────────────────────────────────────
62
+
63
+ let _ = TestRunner.setup()
64
+
65
+ // ─────────────────────────────────────────────────────────────
66
+ // Build DcbEventLog
67
+ // ─────────────────────────────────────────────────────────────
68
+
69
+ module ItemEventLogMaker = DcbEventLog_Builder.Make(Bus)
70
+ let eventLog = ItemEventLogMaker.make(~name="ItemEventLog", ~partitionTag=Reventless.DcbTag.Simple({key: "id"}))
71
+
72
+ // ─────────────────────────────────────────────────────────────
73
+ // Build StateViewSlice
74
+ // ─────────────────────────────────────────────────────────────
75
+
76
+ module SVMaker = StateViewSlice_Builder.Make(Bus)
77
+ module ItemsViewMaker = SVMaker.Make(ItemsViewSpec, ItemsViewProjection)
78
+ let sv = ItemsViewMaker.make(~dcbEventLog=eventLog)
79
+
80
+ // DcbEventLog eventTopic resource — needed for 2nd beforeAllAsync resolve to
81
+ // trigger EventCollectorChannel.connect registration.
82
+ let dcbEventTopicResource =
83
+ (eventLog->ReventlessCore.Component.outputs).eventTopic.resources->Array.getUnsafe(0)
84
+
85
+ // ─────────────────────────────────────────────────────────────
86
+ // Test helpers
87
+ // ─────────────────────────────────────────────────────────────
88
+
89
+ // Encode a typed event into a raw event for appending to the DcbEventLog
90
+ let encodeEvent = (event: ItemEventLog.event): ReventlessInfra.DcbEventLog.rawEvent => {
91
+ let json = event->S.reverseConvertToJsonOrThrow(ItemEventLog.eventSchema)
92
+ let (eventType, data) = json->ReventlessCore.Message.splitMessage
93
+ let tags = Reventless.DcbTag.extractTags(ItemEventLog.eventSchema, event)
94
+ let meta = ReventlessCore.Message.generateMeta(~service="test")
95
+ {eventType, data: JSON.Object(data), tags, meta}
96
+ }
97
+
98
+ // Append an event to the DcbEventLog (publishes to event topic automatically)
99
+ let appendEvent = async event => {
100
+ let ops = await eventLog->ItemEventLogMaker.operations->TestRunner.resolve
101
+ let _ = await ops.append([encodeEvent(event)])
102
+ }
103
+
104
+ // Load projected state from the in-memory QueryDb.
105
+ // QueryDb is registered with the base Spec.name = "ItemsView".
106
+ let loadState = async id => {
107
+ switch Bus.getQueryDb("ItemsView") {
108
+ | None => []
109
+ | Some(ops) =>
110
+ let states =
111
+ await ops.loadStream(id)
112
+ ->Stream.runCollect
113
+ ->Effect.catchAll(_ => Effect.succeed([]))
114
+ ->Effect.runPromise
115
+ states->Array.map(json => json->S.parseJsonOrThrow(ItemsViewSpec.stateSchema))
116
+ }
117
+ }
@@ -0,0 +1,188 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
5
+ import * as Effect from "effect/Effect";
6
+ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
7
+ import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
8
+ import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
9
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
10
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
11
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
12
+ import * as DcbEventLog_Builder$ReventlessLocal from "../../../src/components/DcbEventLog_Builder.res.mjs";
13
+ import * as StateViewSlice_Builder$ReventlessLocal from "../../../src/components/StateViewSlice_Builder.res.mjs";
14
+
15
+ let eventSchema = S.union([
16
+ S.schema(s => ({
17
+ TAG: "ItemAdded",
18
+ id: s.m(DcbTag$Reventless.string),
19
+ name: s.m(S.string)
20
+ })),
21
+ S.schema(s => ({
22
+ TAG: "ItemRenamed",
23
+ id: s.m(DcbTag$Reventless.string),
24
+ name: s.m(S.string)
25
+ })),
26
+ S.schema(s => ({
27
+ TAG: "ItemRemoved",
28
+ id: s.m(DcbTag$Reventless.string)
29
+ }))
30
+ ]);
31
+
32
+ let ItemEventLog = {
33
+ eventSchema: eventSchema
34
+ };
35
+
36
+ let name = "ItemsView";
37
+
38
+ let moduleUrl = import.meta.url;
39
+
40
+ let consumedEventSchema = S.union([
41
+ S.schema(s => ({
42
+ TAG: "ItemAdded",
43
+ id: s.m(S.string),
44
+ name: s.m(S.string)
45
+ })),
46
+ S.schema(s => ({
47
+ TAG: "ItemRenamed",
48
+ id: s.m(S.string),
49
+ name: s.m(S.string)
50
+ })),
51
+ S.schema(s => ({
52
+ TAG: "ItemRemoved",
53
+ id: s.m(S.string)
54
+ }))
55
+ ]);
56
+
57
+ let stateSchema = S.schema(s => ({
58
+ id: s.m(S.string),
59
+ name: s.m(S.string)
60
+ }));
61
+
62
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
63
+
64
+ let ItemsViewSpec = {
65
+ name: name,
66
+ moduleUrl: moduleUrl,
67
+ consumedEventSchema: consumedEventSchema,
68
+ stateSchema: stateSchema,
69
+ config: config,
70
+ subIdConfig: undefined,
71
+ authorization: "AllowAuthenticated",
72
+ visibility: "Public"
73
+ };
74
+
75
+ let moduleUrl$1 = import.meta.url;
76
+
77
+ function project(event) {
78
+ switch (event.TAG) {
79
+ case "ItemAdded" :
80
+ let id = event.id;
81
+ return [{
82
+ TAG: "Set",
83
+ _0: id,
84
+ _1: {
85
+ id: id,
86
+ name: event.name
87
+ }
88
+ }];
89
+ case "ItemRenamed" :
90
+ let name = event.name;
91
+ return [{
92
+ TAG: "Update",
93
+ _0: event.id,
94
+ _1: s => ({
95
+ id: s.id,
96
+ name: name
97
+ })
98
+ }];
99
+ case "ItemRemoved" :
100
+ return [{
101
+ TAG: "Delete",
102
+ _0: event.id
103
+ }];
104
+ }
105
+ }
106
+
107
+ let ItemsViewProjection = {
108
+ Spec: undefined,
109
+ moduleUrl: moduleUrl$1,
110
+ project: project
111
+ };
112
+
113
+ let Bus = LocalBus$ReventlessLocal.Make({});
114
+
115
+ TestRunner$ReventlessLocal.setup();
116
+
117
+ let ItemEventLogMaker = DcbEventLog_Builder$ReventlessLocal.Make(Bus);
118
+
119
+ let eventLog = ItemEventLogMaker.make("ItemEventLog", undefined, {
120
+ TAG: "Simple",
121
+ _0: {
122
+ key: "id"
123
+ }
124
+ }, undefined);
125
+
126
+ let SVMaker = StateViewSlice_Builder$ReventlessLocal.Make(Bus);
127
+
128
+ let ItemsViewMaker = SVMaker.Make({
129
+ name: name,
130
+ moduleUrl: moduleUrl,
131
+ stateSchema: stateSchema,
132
+ consumedEventSchema: consumedEventSchema,
133
+ config: config,
134
+ subIdConfig: undefined,
135
+ authorization: "AllowAuthenticated",
136
+ visibility: "Public"
137
+ })({
138
+ project: project,
139
+ moduleUrl: moduleUrl$1
140
+ });
141
+
142
+ let sv = ItemsViewMaker.make(eventLog, undefined);
143
+
144
+ let dcbEventTopicResource = Component$ReventlessCore.outputs(eventLog).eventTopic.resources[0];
145
+
146
+ function encodeEvent(event) {
147
+ let json = S.reverseConvertToJsonOrThrow(event, eventSchema);
148
+ let match = Message$ReventlessCore.splitMessage(json);
149
+ let tags = DcbTag$Reventless.extractTags(eventSchema, event);
150
+ let meta = Message$ReventlessCore.generateMeta("test", undefined, undefined, undefined, undefined, undefined, undefined, undefined);
151
+ return {
152
+ eventType: match[0],
153
+ data: match[1],
154
+ tags: tags,
155
+ meta: meta
156
+ };
157
+ }
158
+
159
+ async function appendEvent(event) {
160
+ let ops = await TestRunner$ReventlessLocal.resolve(ItemEventLogMaker.operations(eventLog));
161
+ await ops.append([encodeEvent(event)], undefined);
162
+ }
163
+
164
+ async function loadState(id) {
165
+ let ops = Bus.getQueryDb("ItemsView");
166
+ if (ops === undefined) {
167
+ return [];
168
+ }
169
+ let states = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream(id)), param => Effect.succeed([])));
170
+ return states.map(json => S.parseJsonOrThrow(json, stateSchema));
171
+ }
172
+
173
+ export {
174
+ ItemEventLog,
175
+ ItemsViewSpec,
176
+ ItemsViewProjection,
177
+ Bus,
178
+ ItemEventLogMaker,
179
+ eventLog,
180
+ SVMaker,
181
+ ItemsViewMaker,
182
+ sv,
183
+ dcbEventTopicResource,
184
+ encodeEvent,
185
+ appendEvent,
186
+ loadState,
187
+ }
188
+ /* eventSchema Not a pure module */
@@ -0,0 +1,117 @@
1
+ // E2E test fixtures for StateViewSlice with sub-ID (composite sort key).
2
+ // Verifies that projection stores items with composite sub-keys and that
3
+ // loadStream returns them sorted.
4
+
5
+ open Reventless.Projection
6
+
7
+ // ─────────────────────────────────────────────────────────────
8
+ // Event type definition for the DcbEventLog
9
+ // ─────────────────────────────────────────────────────────────
10
+
11
+ module ScoreEventLog = {
12
+ @schema
13
+ type event =
14
+ | ScoreRecorded({id: @s.matches(Reventless.DcbTag.string) string, category: string, date: string, score: int})
15
+ | ScoreRemoved({id: @s.matches(Reventless.DcbTag.string) string, category: string, date: string})
16
+ }
17
+
18
+ // ─────────────────────────────────────────────────────────────
19
+ // StateViewSlice spec with composite sub-key (category + "/" + date)
20
+ // ─────────────────────────────────────────────────────────────
21
+
22
+ module ScoresViewSpec = {
23
+ let name = "ScoresView"
24
+ let moduleUrl: string = %raw(`import.meta.url`)
25
+
26
+ @schema
27
+ type consumedEvent =
28
+ | ScoreRecorded({id: string, category: string, date: string, score: int})
29
+ | ScoreRemoved({id: string, category: string, date: string})
30
+
31
+ @schema
32
+ type state = {id: string, category: string, date: string, score: int}
33
+
34
+ let config = Reventless.ReadModel.config()
35
+ let subIdConfig: option<Reventless.ReadModel.subIdConfig<state>> = Some({
36
+ subIdField: "_subId",
37
+ getSubId: (state: state) => state.category ++ "/" ++ state.date,
38
+ })
39
+ }
40
+
41
+ module ScoresViewProjection = {
42
+ module Spec = ScoresViewSpec
43
+ open ScoresViewSpec
44
+
45
+ let moduleUrl: string = %raw(`import.meta.url`)
46
+
47
+ let project = (event: consumedEvent) =>
48
+ switch event {
49
+ | ScoreRecorded({id, category, date, score}) =>
50
+ [Set(id, {id, category, date, score})]
51
+ | ScoreRemoved({id, category: _, date: _}) =>
52
+ [Delete(id)]
53
+ }
54
+ }
55
+
56
+ // ─────────────────────────────────────────────────────────────
57
+ // Isolated bus for this test suite
58
+ // ─────────────────────────────────────────────────────────────
59
+
60
+ module Bus = LocalBus.Make()
61
+
62
+ // ─────────────────────────────────────────────────────────────
63
+ // Activate Pulumi mock mode (must be before any Component.make)
64
+ // ─────────────────────────────────────────────────────────────
65
+
66
+ let _ = TestRunner.setup()
67
+
68
+ // ─────────────────────────────────────────────────────────────
69
+ // Build DcbEventLog
70
+ // ─────────────────────────────────────────────────────────────
71
+
72
+ module ScoreEventLogMaker = DcbEventLog_Builder.Make(Bus)
73
+ let eventLog = ScoreEventLogMaker.make(
74
+ ~name="ScoreEventLog",
75
+ ~partitionTag=Reventless.DcbTag.Simple({key: "id"}),
76
+ )
77
+
78
+ // ─────────────────────────────────────────────────────────────
79
+ // Build StateViewSlice
80
+ // ─────────────────────────────────────────────────────────────
81
+
82
+ module SVMaker = StateViewSlice_Builder.Make(Bus)
83
+ module ScoresViewMaker = SVMaker.Make(ScoresViewSpec, ScoresViewProjection)
84
+ let sv = ScoresViewMaker.make(~dcbEventLog=eventLog)
85
+
86
+ let dcbEventTopicResource =
87
+ (eventLog->ReventlessCore.Component.outputs).eventTopic.resources->Array.getUnsafe(0)
88
+
89
+ // ─────────────────────────────────────────────────────────────
90
+ // Test helpers
91
+ // ─────────────────────────────────────────────────────────────
92
+
93
+ let encodeEvent = (event: ScoreEventLog.event): ReventlessInfra.DcbEventLog.rawEvent => {
94
+ let json = event->S.reverseConvertToJsonOrThrow(ScoreEventLog.eventSchema)
95
+ let (eventType, data) = json->ReventlessCore.Message.splitMessage
96
+ let tags = Reventless.DcbTag.extractTags(ScoreEventLog.eventSchema, event)
97
+ let meta = ReventlessCore.Message.generateMeta(~service="test")
98
+ {eventType, data: JSON.Object(data), tags, meta}
99
+ }
100
+
101
+ let appendEvent = async event => {
102
+ let ops = await eventLog->ScoreEventLogMaker.operations->TestRunner.resolve
103
+ let _ = await ops.append([encodeEvent(event)])
104
+ }
105
+
106
+ let loadScores = async id => {
107
+ switch Bus.getQueryDb("ScoresView") {
108
+ | None => []
109
+ | Some(ops) =>
110
+ let states =
111
+ await ops.loadStream(id)
112
+ ->Stream.runCollect
113
+ ->Effect.catchAll(_ => Effect.succeed([]))
114
+ ->Effect.runPromise
115
+ states->Array.map(json => json->S.parseJsonOrThrow(ScoresViewSpec.stateSchema))
116
+ }
117
+ }