@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,137 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
5
+
6
+ let moduleUrl = import.meta.url;
7
+
8
+ let eventSchema = S.union([
9
+ S.schema(s => ({
10
+ TAG: "OrderShipped",
11
+ orderId: s.m(DcbTag$Reventless.string),
12
+ email: s.m(S.string)
13
+ })),
14
+ S.schema(s => ({
15
+ TAG: "PaymentReceived",
16
+ orderId: s.m(DcbTag$Reventless.string),
17
+ amount: s.m(S.float)
18
+ }))
19
+ ]);
20
+
21
+ let OrderEventLog = {
22
+ moduleUrl: moduleUrl,
23
+ eventSchema: eventSchema
24
+ };
25
+
26
+ let moduleUrl$1 = import.meta.url;
27
+
28
+ let consumedEventSchema = S.schema(s => ({
29
+ TAG: "OrderShipped",
30
+ orderId: s.m(S.string),
31
+ email: s.m(S.string)
32
+ }));
33
+
34
+ let outboundItemSchema = S.schema(s => ({
35
+ orderId: s.m(S.string),
36
+ email: s.m(S.string)
37
+ }));
38
+
39
+ function collect(event) {
40
+ let orderId = event.orderId;
41
+ return [[
42
+ orderId,
43
+ {
44
+ orderId: orderId,
45
+ email: event.email
46
+ }
47
+ ]];
48
+ }
49
+
50
+ async function translate(_id, _item) {
51
+ return {
52
+ TAG: "Ok",
53
+ _0: undefined
54
+ };
55
+ }
56
+
57
+ let SendTrackingEmailSpec = {
58
+ name: "SendTrackingEmail",
59
+ moduleUrl: moduleUrl$1,
60
+ consumedEventSchema: consumedEventSchema,
61
+ outboundItemSchema: outboundItemSchema,
62
+ inboundCommandSchema: S.unit,
63
+ collect: collect,
64
+ translate: translate,
65
+ maxRetries: 3,
66
+ heartbeatInterval: 60,
67
+ targetName: undefined
68
+ };
69
+
70
+ let moduleUrl$2 = import.meta.url;
71
+
72
+ let consumedEventSchema$1 = S.schema(s => ({
73
+ TAG: "PaymentReceived",
74
+ orderId: s.m(S.string),
75
+ amount: s.m(S.float)
76
+ }));
77
+
78
+ let outboundItemSchema$1 = S.schema(s => ({
79
+ orderId: s.m(S.string),
80
+ amount: s.m(S.float)
81
+ }));
82
+
83
+ let inboundCommandSchema = S.schema(s => ({
84
+ TAG: "ConfirmPayment",
85
+ orderId: s.m(DcbTag$Reventless.string)
86
+ }));
87
+
88
+ function collect$1(event) {
89
+ let orderId = event.orderId;
90
+ return [[
91
+ orderId,
92
+ {
93
+ orderId: orderId,
94
+ amount: event.amount
95
+ }
96
+ ]];
97
+ }
98
+
99
+ let translateFn = {
100
+ contents: async (id, _item) => ({
101
+ TAG: "Ok",
102
+ _0: [
103
+ id,
104
+ {
105
+ TAG: "ConfirmPayment",
106
+ orderId: id
107
+ }
108
+ ]
109
+ })
110
+ };
111
+
112
+ function translate$1(id, item) {
113
+ return translateFn.contents(id, item);
114
+ }
115
+
116
+ let ProcessPaymentSpec_targetName = "ConfirmPayment";
117
+
118
+ let ProcessPaymentSpec = {
119
+ name: "ProcessPayment",
120
+ moduleUrl: moduleUrl$2,
121
+ consumedEventSchema: consumedEventSchema$1,
122
+ outboundItemSchema: outboundItemSchema$1,
123
+ inboundCommandSchema: inboundCommandSchema,
124
+ collect: collect$1,
125
+ translateFn: translateFn,
126
+ translate: translate$1,
127
+ maxRetries: 2,
128
+ heartbeatInterval: 30,
129
+ targetName: ProcessPaymentSpec_targetName
130
+ };
131
+
132
+ export {
133
+ OrderEventLog,
134
+ SendTrackingEmailSpec,
135
+ ProcessPaymentSpec,
136
+ }
137
+ /* moduleUrl Not a pure module */
@@ -0,0 +1,39 @@
1
+ // Integration test fixtures for QueryDb builder (in-memory).
2
+
3
+ // ─────────────────────────────────────────────────────────────
4
+ // Test state spec
5
+ // ─────────────────────────────────────────────────────────────
6
+
7
+ module ItemQueryDbSpec = {
8
+ module Id = Reventless.Id.StringPure
9
+ let name = "TestItemQueryDb"
10
+ let moduleUrl: string = %raw(`import.meta.url`)
11
+
12
+ @schema
13
+ type state = {name: string, count: int}
14
+
15
+ let config = Reventless.ReadModel.config()
16
+ let subIdConfig = None
17
+ }
18
+
19
+ // ─────────────────────────────────────────────────────────────
20
+ // Bus and Pulumi setup
21
+ // ─────────────────────────────────────────────────────────────
22
+
23
+ module Bus = LocalBus.Make()
24
+
25
+ let _ = TestRunner.setup()
26
+
27
+ // ─────────────────────────────────────────────────────────────
28
+ // Build QueryDb using in-memory adapters
29
+ // ─────────────────────────────────────────────────────────────
30
+
31
+ module QDbStorage = QueryDbStorage_InMemory.Make(Bus)
32
+ module QDbResolvers = ReventlessCore.QueryDb_Adapter.NoResolvers(QDbStorage)
33
+ module QueryDbMaker = ReventlessCore.QueryDb_Builder.Make(
34
+ ItemQueryDbSpec,
35
+ QDbStorage,
36
+ QDbResolvers,
37
+ )
38
+
39
+ let queryDb = QueryDbMaker.make(~api=(), ~apiRole=())
@@ -0,0 +1,73 @@
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 ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
6
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
7
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
8
+ import * as QueryDb_Adapter$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Adapter.res.mjs";
9
+ import * as QueryDb_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Builder.res.mjs";
10
+ import * as QueryDbStorage_InMemory$ReventlessLocal from "../../../src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs";
11
+
12
+ let name = "TestItemQueryDb";
13
+
14
+ let moduleUrl = import.meta.url;
15
+
16
+ let stateSchema = S.schema(s => ({
17
+ name: s.m(S.string),
18
+ count: s.m(S.int)
19
+ }));
20
+
21
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
22
+
23
+ let ItemQueryDbSpec = {
24
+ Id: undefined,
25
+ name: name,
26
+ moduleUrl: moduleUrl,
27
+ stateSchema: stateSchema,
28
+ config: config,
29
+ subIdConfig: undefined,
30
+ authorization: "AllowAuthenticated",
31
+ visibility: "Public"
32
+ };
33
+
34
+ let Bus = LocalBus$ReventlessLocal.Make({});
35
+
36
+ TestRunner$ReventlessLocal.setup();
37
+
38
+ let QDbStorage = QueryDbStorage_InMemory$ReventlessLocal.Make(Bus);
39
+
40
+ let QDbResolvers = QueryDb_Adapter$ReventlessCore.NoResolvers({
41
+ make: QDbStorage.make
42
+ });
43
+
44
+ let QueryDbMaker = QueryDb_Builder$ReventlessCore.Make({
45
+ Id: {
46
+ schema: Id$Reventless.StringPure.schema,
47
+ make: prim => prim,
48
+ makeFromString: prim => prim,
49
+ toString: prim => prim,
50
+ cmp: Id$Reventless.StringPure.cmp
51
+ },
52
+ name: name,
53
+ moduleUrl: moduleUrl,
54
+ stateSchema: stateSchema,
55
+ config: config,
56
+ subIdConfig: undefined,
57
+ authorization: "AllowAuthenticated",
58
+ visibility: "Public"
59
+ })({
60
+ make: QDbStorage.make
61
+ })(QDbResolvers);
62
+
63
+ let queryDb = QueryDbMaker.make(undefined, undefined, undefined, undefined);
64
+
65
+ export {
66
+ ItemQueryDbSpec,
67
+ Bus,
68
+ QDbStorage,
69
+ QDbResolvers,
70
+ QueryDbMaker,
71
+ queryDb,
72
+ }
73
+ /* moduleUrl Not a pure module */
@@ -0,0 +1,44 @@
1
+ // Fixtures for QueryDb sub-ID tests.
2
+ // Uses a spec with composite sub-key (_subId = region + "/" + date).
3
+
4
+ // ─────────────────────────────────────────────────────────────
5
+ // Test state spec with subIdConfig
6
+ // ─────────────────────────────────────────────────────────────
7
+
8
+ module MetricSpec = {
9
+ module Id = Reventless.Id.StringPure
10
+ let name = "TestMetricQueryDb"
11
+ let moduleUrl: string = %raw(`import.meta.url`)
12
+
13
+ @schema
14
+ type state = {userId: string, region: string, date: string, value: float}
15
+
16
+ let config = Reventless.ReadModel.config()
17
+
18
+ let subIdConfig: option<Reventless.ReadModel.subIdConfig<state>> = Some({
19
+ subIdField: "_subId",
20
+ getSubId: (state: state) => state.region ++ "/" ++ state.date,
21
+ })
22
+ }
23
+
24
+ // ─────────────────────────────────────────────────────────────
25
+ // Bus and Pulumi setup
26
+ // ─────────────────────────────────────────────────────────────
27
+
28
+ module Bus = LocalBus.Make()
29
+
30
+ let _ = TestRunner.setup()
31
+
32
+ // ─────────────────────────────────────────────────────────────
33
+ // Build QueryDb using in-memory adapters
34
+ // ─────────────────────────────────────────────────────────────
35
+
36
+ module QDbStorage = QueryDbStorage_InMemory.Make(Bus)
37
+ module QDbResolvers = ReventlessCore.QueryDb_Adapter.NoResolvers(QDbStorage)
38
+ module MetricQueryDbMaker = ReventlessCore.QueryDb_Builder.Make(
39
+ MetricSpec,
40
+ QDbStorage,
41
+ QDbResolvers,
42
+ )
43
+
44
+ let metricQueryDb = MetricQueryDbMaker.make(~api=(), ~apiRole=())
@@ -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 ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
6
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
7
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
8
+ import * as QueryDb_Adapter$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Adapter.res.mjs";
9
+ import * as QueryDb_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Builder.res.mjs";
10
+ import * as QueryDbStorage_InMemory$ReventlessLocal from "../../../src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs";
11
+
12
+ let name = "TestMetricQueryDb";
13
+
14
+ let moduleUrl = import.meta.url;
15
+
16
+ let stateSchema = S.schema(s => ({
17
+ userId: s.m(S.string),
18
+ region: s.m(S.string),
19
+ date: s.m(S.string),
20
+ value: s.m(S.float)
21
+ }));
22
+
23
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
24
+
25
+ let subIdConfig = {
26
+ subIdField: "_subId",
27
+ getSubId: state => state.region + "/" + state.date
28
+ };
29
+
30
+ let MetricSpec = {
31
+ Id: undefined,
32
+ name: name,
33
+ moduleUrl: moduleUrl,
34
+ stateSchema: stateSchema,
35
+ config: config,
36
+ subIdConfig: subIdConfig,
37
+ authorization: "AllowAuthenticated",
38
+ visibility: "Public"
39
+ };
40
+
41
+ let Bus = LocalBus$ReventlessLocal.Make({});
42
+
43
+ TestRunner$ReventlessLocal.setup();
44
+
45
+ let QDbStorage = QueryDbStorage_InMemory$ReventlessLocal.Make(Bus);
46
+
47
+ let QDbResolvers = QueryDb_Adapter$ReventlessCore.NoResolvers({
48
+ make: QDbStorage.make
49
+ });
50
+
51
+ let MetricQueryDbMaker = QueryDb_Builder$ReventlessCore.Make({
52
+ Id: {
53
+ schema: Id$Reventless.StringPure.schema,
54
+ make: prim => prim,
55
+ makeFromString: prim => prim,
56
+ toString: prim => prim,
57
+ cmp: Id$Reventless.StringPure.cmp
58
+ },
59
+ name: name,
60
+ moduleUrl: moduleUrl,
61
+ stateSchema: stateSchema,
62
+ config: config,
63
+ subIdConfig: subIdConfig,
64
+ authorization: "AllowAuthenticated",
65
+ visibility: "Public"
66
+ })({
67
+ make: QDbStorage.make
68
+ })(QDbResolvers);
69
+
70
+ let metricQueryDb = MetricQueryDbMaker.make(undefined, undefined, undefined, undefined);
71
+
72
+ export {
73
+ MetricSpec,
74
+ Bus,
75
+ QDbStorage,
76
+ QDbResolvers,
77
+ MetricQueryDbMaker,
78
+ metricQueryDb,
79
+ }
80
+ /* moduleUrl Not a pure module */
@@ -0,0 +1,104 @@
1
+ // Tests for QueryDb in-memory storage with sub-ID (composite sort key) semantics.
2
+ // Verifies that loadStream returns items sorted by sub-key and that
3
+ // delete(id, Some((field, value))) removes only the targeted sub-key item.
4
+
5
+ open JestGlobals
6
+ open QueryDbSubIdFixtures
7
+
8
+ describe("QueryDb sub-ID (in-memory)", () => {
9
+ let _ = beforeAllAsync(async () => {
10
+ let _ = await metricQueryDb->ReventlessCore.Component.operations->TestRunner.resolve
11
+ })
12
+
13
+ testPromise("loadStream returns items sorted by sub-key", async () => {
14
+ let ops = await metricQueryDb->ReventlessCore.Component.operations->TestRunner.resolve
15
+ let _ = await ops.save(
16
+ "user-sort",
17
+ {userId: "user-sort", region: "us-east", date: "2026-03", value: 1.0},
18
+ Init,
19
+ None,
20
+ )
21
+ let _ = await ops.save(
22
+ "user-sort",
23
+ {userId: "user-sort", region: "us-east", date: "2026-01", value: 2.0},
24
+ Init,
25
+ None,
26
+ )
27
+ let _ = await ops.save(
28
+ "user-sort",
29
+ {userId: "user-sort", region: "eu-west", date: "2026-02", value: 3.0},
30
+ Init,
31
+ None,
32
+ )
33
+ let result = await ops.loadStream("user-sort")->Stream.runCollect->Effect.runPromise
34
+ // Sub-keys: "eu-west/2026-02", "us-east/2026-01", "us-east/2026-03" — alphabetical order
35
+ expect(result->Array.length)->toBe(3)
36
+ let s0 = result->Array.getUnsafe(0)
37
+ let s1 = result->Array.getUnsafe(1)
38
+ let s2 = result->Array.getUnsafe(2)
39
+ expect(s0.region ++ "/" ++ s0.date)->toBe("eu-west/2026-02")
40
+ expect(s1.region ++ "/" ++ s1.date)->toBe("us-east/2026-01")
41
+ expect(s2.region ++ "/" ++ s2.date)->toBe("us-east/2026-03")
42
+ })
43
+
44
+ testPromise("delete with subId removes only the targeted item", async () => {
45
+ let ops = await metricQueryDb->ReventlessCore.Component.operations->TestRunner.resolve
46
+ let _ = await ops.save(
47
+ "user-del",
48
+ {userId: "user-del", region: "us-east", date: "2026-01", value: 10.0},
49
+ Init,
50
+ None,
51
+ )
52
+ let _ = await ops.save(
53
+ "user-del",
54
+ {userId: "user-del", region: "us-east", date: "2026-02", value: 20.0},
55
+ Init,
56
+ None,
57
+ )
58
+ // Delete only the 2026-01 entry
59
+ let _ = await ops.delete("user-del", Some(("_subId", "us-east/2026-01")))
60
+ let result = await ops.loadStream("user-del")->Stream.runCollect->Effect.runPromise
61
+ expect(result->Array.length)->toBe(1)
62
+ let remaining = result->Array.getUnsafe(0)
63
+ expect(remaining.date)->toBe("2026-02")
64
+ })
65
+
66
+ testPromise("delete without subId removes entire partition", async () => {
67
+ let ops = await metricQueryDb->ReventlessCore.Component.operations->TestRunner.resolve
68
+ let _ = await ops.save(
69
+ "user-delall",
70
+ {userId: "user-delall", region: "us-east", date: "2026-01", value: 5.0},
71
+ Init,
72
+ None,
73
+ )
74
+ let _ = await ops.save(
75
+ "user-delall",
76
+ {userId: "user-delall", region: "eu-west", date: "2026-01", value: 7.0},
77
+ Init,
78
+ None,
79
+ )
80
+ let _ = await ops.delete("user-delall", None)
81
+ let result = await ops.loadStream("user-delall")->Stream.runCollect->Effect.runPromise
82
+ expect(result->Array.length)->toBe(0)
83
+ })
84
+
85
+ testPromise("save overwrites item with same sub-key", async () => {
86
+ let ops = await metricQueryDb->ReventlessCore.Component.operations->TestRunner.resolve
87
+ let _ = await ops.save(
88
+ "user-overwrite",
89
+ {userId: "user-overwrite", region: "us-east", date: "2026-01", value: 1.0},
90
+ Init,
91
+ None,
92
+ )
93
+ let _ = await ops.save(
94
+ "user-overwrite",
95
+ {userId: "user-overwrite", region: "us-east", date: "2026-01", value: 99.0},
96
+ Overwrite,
97
+ None,
98
+ )
99
+ let result = await ops.loadStream("user-overwrite")->Stream.runCollect->Effect.runPromise
100
+ expect(result->Array.length)->toBe(1)
101
+ let s = result->Array.getUnsafe(0)
102
+ expect(s.value)->toBe(99.0)
103
+ })
104
+ })
@@ -0,0 +1,104 @@
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 Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
7
+ import * as QueryDbSubIdFixtures$ReventlessLocal from "./QueryDbSubIdFixtures.res.mjs";
8
+
9
+ globalThis.describe("QueryDb sub-ID (in-memory)", () => {
10
+ globalThis.beforeAll(async () => {
11
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(QueryDbSubIdFixtures$ReventlessLocal.metricQueryDb));
12
+ });
13
+ globalThis.test("loadStream returns items sorted by sub-key", async () => {
14
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(QueryDbSubIdFixtures$ReventlessLocal.metricQueryDb));
15
+ await ops.save("user-sort", {
16
+ userId: "user-sort",
17
+ region: "us-east",
18
+ date: "2026-03",
19
+ value: 1.0
20
+ }, "Init", undefined);
21
+ await ops.save("user-sort", {
22
+ userId: "user-sort",
23
+ region: "us-east",
24
+ date: "2026-01",
25
+ value: 2.0
26
+ }, "Init", undefined);
27
+ await ops.save("user-sort", {
28
+ userId: "user-sort",
29
+ region: "eu-west",
30
+ date: "2026-02",
31
+ value: 3.0
32
+ }, "Init", undefined);
33
+ let result = await Effect.runPromise(Stream.runCollect(ops.loadStream("user-sort")));
34
+ globalThis.expect(result.length).toBe(3);
35
+ let s0 = result[0];
36
+ let s1 = result[1];
37
+ let s2 = result[2];
38
+ globalThis.expect(s0.region + "/" + s0.date).toBe("eu-west/2026-02");
39
+ globalThis.expect(s1.region + "/" + s1.date).toBe("us-east/2026-01");
40
+ globalThis.expect(s2.region + "/" + s2.date).toBe("us-east/2026-03");
41
+ });
42
+ globalThis.test("delete with subId removes only the targeted item", async () => {
43
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(QueryDbSubIdFixtures$ReventlessLocal.metricQueryDb));
44
+ await ops.save("user-del", {
45
+ userId: "user-del",
46
+ region: "us-east",
47
+ date: "2026-01",
48
+ value: 10.0
49
+ }, "Init", undefined);
50
+ await ops.save("user-del", {
51
+ userId: "user-del",
52
+ region: "us-east",
53
+ date: "2026-02",
54
+ value: 20.0
55
+ }, "Init", undefined);
56
+ await ops.delete("user-del", [
57
+ "_subId",
58
+ "us-east/2026-01"
59
+ ]);
60
+ let result = await Effect.runPromise(Stream.runCollect(ops.loadStream("user-del")));
61
+ globalThis.expect(result.length).toBe(1);
62
+ let remaining = result[0];
63
+ globalThis.expect(remaining.date).toBe("2026-02");
64
+ });
65
+ globalThis.test("delete without subId removes entire partition", async () => {
66
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(QueryDbSubIdFixtures$ReventlessLocal.metricQueryDb));
67
+ await ops.save("user-delall", {
68
+ userId: "user-delall",
69
+ region: "us-east",
70
+ date: "2026-01",
71
+ value: 5.0
72
+ }, "Init", undefined);
73
+ await ops.save("user-delall", {
74
+ userId: "user-delall",
75
+ region: "eu-west",
76
+ date: "2026-01",
77
+ value: 7.0
78
+ }, "Init", undefined);
79
+ await ops.delete("user-delall", undefined);
80
+ let result = await Effect.runPromise(Stream.runCollect(ops.loadStream("user-delall")));
81
+ globalThis.expect(result.length).toBe(0);
82
+ });
83
+ globalThis.test("save overwrites item with same sub-key", async () => {
84
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(QueryDbSubIdFixtures$ReventlessLocal.metricQueryDb));
85
+ await ops.save("user-overwrite", {
86
+ userId: "user-overwrite",
87
+ region: "us-east",
88
+ date: "2026-01",
89
+ value: 1.0
90
+ }, "Init", undefined);
91
+ await ops.save("user-overwrite", {
92
+ userId: "user-overwrite",
93
+ region: "us-east",
94
+ date: "2026-01",
95
+ value: 99.0
96
+ }, "Overwrite", undefined);
97
+ let result = await Effect.runPromise(Stream.runCollect(ops.loadStream("user-overwrite")));
98
+ globalThis.expect(result.length).toBe(1);
99
+ let s = result[0];
100
+ globalThis.expect(s.value).toBe(99.0);
101
+ });
102
+ });
103
+
104
+ /* Not a pure module */
@@ -0,0 +1,81 @@
1
+ // Integration tests for QueryDb_Builder with in-memory adapters.
2
+
3
+ open JestGlobals
4
+ open QueryDbFixtures
5
+
6
+ describe("QueryDb (in-memory)", () => {
7
+ let _ = beforeAllAsync(async () => {
8
+ let _ = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
9
+ })
10
+
11
+ testPromise("loadStream returns empty for unknown id", async () => {
12
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
13
+ let result = await ops.loadStream("unknown-id")->Stream.runCollect->Effect.runPromise
14
+ expect(result)->toEqual([])
15
+ })
16
+
17
+ testPromise("save and loadStream round-trip", async () => {
18
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
19
+ let state: ItemQueryDbSpec.state = {name: "Widget", count: 5}
20
+ let _ = await ops.save("item-1", state, Init, None)
21
+ let result = await ops.loadStream("item-1")->Stream.runCollect->Effect.runPromise
22
+ switch result {
23
+ | [s] => expect((s.name, s.count))->toEqual(("Widget", 5))
24
+ | _ => expect("Expected [state]")->toEqual("but got different result")
25
+ }
26
+ })
27
+
28
+ testPromise("save overwrites previous state", async () => {
29
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
30
+ let _ = await ops.save("item-2", {name: "Old", count: 1}, Init, None)
31
+ let _ = await ops.save("item-2", {name: "New", count: 2}, Overwrite, None)
32
+ let result = await ops.loadStream("item-2")->Stream.runCollect->Effect.runPromise
33
+ switch result {
34
+ | [s] => expect(s.name)->toBe("New")
35
+ | _ => expect("Expected [state]")->toEqual("but got different result")
36
+ }
37
+ })
38
+
39
+ testPromise("saveBatch saves multiple states", async () => {
40
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
41
+ let batch = [
42
+ ("batch-1", ({name: "Alpha", count: 1}: ItemQueryDbSpec.state), None),
43
+ ("batch-2", ({name: "Beta", count: 2}: ItemQueryDbSpec.state), None),
44
+ ]
45
+ let _ = await ops.saveBatch(batch)
46
+ let r1 = await ops.loadStream("batch-1")->Stream.runCollect->Effect.runPromise
47
+ let r2 = await ops.loadStream("batch-2")->Stream.runCollect->Effect.runPromise
48
+ expect((r1->Array.length > 0, r2->Array.length > 0))->toEqual((true, true))
49
+ })
50
+
51
+ testPromise("delete removes state", async () => {
52
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
53
+ let _ = await ops.save("item-del", {name: "ToDelete", count: 0}, Init, None)
54
+ let _ = await ops.delete("item-del", None)
55
+ let result = await ops.loadStream("item-del")->Stream.runCollect->Effect.runPromise
56
+ expect(result)->toEqual([])
57
+ })
58
+
59
+ testPromise("loadStream emits saved states", async () => {
60
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
61
+ let _ = await ops.save("stream-item", {name: "Streamed", count: 42}, Init, None)
62
+ let arr =
63
+ await ops.loadStream("stream-item")->Stream.runCollect->Effect.runPromise
64
+ expect(arr->Array.length)->toBe(1)
65
+ let s = arr->Array.getUnsafe(0)
66
+ expect((s.name, s.count))->toEqual(("Streamed", 42))
67
+ })
68
+
69
+ testPromise("loadStream returns empty for unknown id", async () => {
70
+ let ops = await queryDb->ReventlessCore.Component.operations->TestRunner.resolve
71
+ let arr =
72
+ await ops.loadStream("no-such-id")->Stream.runCollect->Effect.runPromise
73
+ expect(arr->Array.length)->toBe(0)
74
+ })
75
+
76
+ testPromise("registered in bus by component name", async () => {
77
+ // QueryDb registers itself in the bus with the base Spec.name
78
+ let db = Bus.getQueryDb("TestItemQueryDb")
79
+ expect(db->Option.isSome)->toBe(true)
80
+ })
81
+ })