@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,135 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as SortKey_Filter$ReventlessLocal from "../../src/adapter/QueryDb/SortKey_Filter.res.mjs";
6
+
7
+ function makeItem(sk) {
8
+ let d = {};
9
+ d["_subId"] = sk;
10
+ return d;
11
+ }
12
+
13
+ let items = [
14
+ makeItem("art/2026-01"),
15
+ makeItem("art/2026-02"),
16
+ makeItem("math/2026-01"),
17
+ makeItem("math/2026-02"),
18
+ makeItem("science/2026-01")
19
+ ];
20
+
21
+ let skField = "_subId";
22
+
23
+ function getSks(result) {
24
+ return result.items.map(item => Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), d => d[skField]), Stdlib_JSON.Decode.string), ""));
25
+ }
26
+
27
+ globalThis.describe("SortKey_Filter.apply:", () => {
28
+ globalThis.test("no filters returns all items in order", async () => {
29
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, undefined, undefined, undefined);
30
+ globalThis.expect(r.items.length).toBe(5);
31
+ globalThis.expect(getSks(r)).toEqual([
32
+ "art/2026-01",
33
+ "art/2026-02",
34
+ "math/2026-01",
35
+ "math/2026-02",
36
+ "science/2026-01"
37
+ ]);
38
+ globalThis.expect(r.nextToken).toBe(undefined);
39
+ });
40
+ globalThis.test("prefix filters to matching sort keys", async () => {
41
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, "math", undefined, undefined, undefined, undefined, undefined, undefined);
42
+ globalThis.expect(getSks(r)).toEqual([
43
+ "math/2026-01",
44
+ "math/2026-02"
45
+ ]);
46
+ globalThis.expect(r.nextToken).toBe(undefined);
47
+ });
48
+ globalThis.test("from filters to sort keys >= from", async () => {
49
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, "math/2026-01", undefined, undefined, undefined, undefined, undefined);
50
+ globalThis.expect(getSks(r)).toEqual([
51
+ "math/2026-01",
52
+ "math/2026-02",
53
+ "science/2026-01"
54
+ ]);
55
+ });
56
+ globalThis.test("to filters to sort keys <= to", async () => {
57
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, "art/2026-02", undefined, undefined, undefined, undefined);
58
+ globalThis.expect(getSks(r)).toEqual([
59
+ "art/2026-01",
60
+ "art/2026-02"
61
+ ]);
62
+ });
63
+ globalThis.test("from+to gives BETWEEN range", async () => {
64
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, "art/2026-02", "math/2026-01", undefined, undefined, undefined, undefined);
65
+ globalThis.expect(getSks(r)).toEqual([
66
+ "art/2026-02",
67
+ "math/2026-01"
68
+ ]);
69
+ });
70
+ globalThis.test("eq filters to exact match only", async () => {
71
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, "math/2026-02", undefined, undefined, undefined);
72
+ globalThis.expect(getSks(r)).toEqual(["math/2026-02"]);
73
+ });
74
+ globalThis.test("reverse returns items in descending order", async () => {
75
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, true, undefined, undefined);
76
+ globalThis.expect(getSks(r)).toEqual([
77
+ "science/2026-01",
78
+ "math/2026-02",
79
+ "math/2026-01",
80
+ "art/2026-02",
81
+ "art/2026-01"
82
+ ]);
83
+ });
84
+ globalThis.test("limit returns first N items", async () => {
85
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, undefined, 2, undefined);
86
+ globalThis.expect(getSks(r)).toEqual([
87
+ "art/2026-01",
88
+ "art/2026-02"
89
+ ]);
90
+ globalThis.expect(r.nextToken).toBe("2");
91
+ });
92
+ globalThis.test("nextToken resumes from offset", async () => {
93
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, undefined, 2, 2);
94
+ globalThis.expect(getSks(r)).toEqual([
95
+ "math/2026-01",
96
+ "math/2026-02"
97
+ ]);
98
+ globalThis.expect(r.nextToken).toBe("4");
99
+ });
100
+ globalThis.test("last page has no nextToken", async () => {
101
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, undefined, 2, 4);
102
+ globalThis.expect(getSks(r)).toEqual(["science/2026-01"]);
103
+ globalThis.expect(r.nextToken).toBe(undefined);
104
+ });
105
+ globalThis.test("prefix + limit + nextToken paginates correctly", async () => {
106
+ let r1 = SortKey_Filter$ReventlessLocal.apply(items, skField, "art", undefined, undefined, undefined, undefined, 1, undefined);
107
+ globalThis.expect(getSks(r1)).toEqual(["art/2026-01"]);
108
+ globalThis.expect(r1.nextToken).toBe("1");
109
+ let r2 = SortKey_Filter$ReventlessLocal.apply(items, skField, "art", undefined, undefined, undefined, undefined, 1, 1);
110
+ globalThis.expect(getSks(r2)).toEqual(["art/2026-02"]);
111
+ globalThis.expect(r2.nextToken).toBe(undefined);
112
+ });
113
+ globalThis.test("reverse + limit returns last N items", async () => {
114
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, undefined, true, 3, undefined);
115
+ globalThis.expect(getSks(r)).toEqual([
116
+ "science/2026-01",
117
+ "math/2026-02",
118
+ "math/2026-01"
119
+ ]);
120
+ globalThis.expect(r.nextToken).toBe("3");
121
+ });
122
+ globalThis.test("eq with no match returns empty", async () => {
123
+ let r = SortKey_Filter$ReventlessLocal.apply(items, skField, undefined, undefined, undefined, "nonexistent", undefined, undefined, undefined);
124
+ globalThis.expect(r.items.length).toBe(0);
125
+ globalThis.expect(r.nextToken).toBe(undefined);
126
+ });
127
+ });
128
+
129
+ export {
130
+ makeItem,
131
+ items,
132
+ skField,
133
+ getSks,
134
+ }
135
+ /* items Not a pure module */
@@ -0,0 +1,86 @@
1
+ // Round-trip test for the SqliteDriver wrapper.
2
+ // Uses an in-memory database (`:memory:`) so no filesystem cleanup is needed.
3
+
4
+ open JestGlobals
5
+
6
+ describe("SqliteDriver", () => {
7
+ testPromise("open / exec / prepare / run / get / all / iterate / close round-trip", async () => {
8
+ let db = SqliteDriver.openDb(~path=":memory:")
9
+ db->SqliteDriver.exec("CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT)")
10
+
11
+ let insert = db->SqliteDriver.prepare("INSERT INTO t(id, v) VALUES(?, ?)")
12
+ insert->SqliteDriver.run([JSON.Encode.int(1), JSON.Encode.string("hello")])
13
+ insert->SqliteDriver.run([JSON.Encode.int(2), JSON.Encode.string("world")])
14
+
15
+ let selectAll = db->SqliteDriver.prepare("SELECT id, v FROM t WHERE id > ? ORDER BY id")
16
+ let rows = selectAll->SqliteDriver.all([JSON.Encode.int(0)])
17
+ expect(rows->Array.length)->toBe(2)
18
+ let firstRow = rows->Array.getUnsafe(0)
19
+ expect(firstRow->Dict.get("v")->Option.getOr(JSON.Encode.null))->toEqual(
20
+ JSON.Encode.string("hello"),
21
+ )
22
+
23
+ let getOne = selectAll->SqliteDriver.get([JSON.Encode.int(0)])
24
+ expect(getOne->Option.isSome)->toBe(true)
25
+
26
+ let countViaIterate = ref(0)
27
+ let iter = selectAll->SqliteDriver.iterate([JSON.Encode.int(0)])
28
+ let _ = iter->Iterator.forEach(_row => countViaIterate := countViaIterate.contents + 1)
29
+ expect(countViaIterate.contents)->toBe(2)
30
+
31
+ db->SqliteDriver.close
32
+ })
33
+
34
+ testPromise("transaction commits on success, rolls back on exception", async () => {
35
+ let db = SqliteDriver.openDb(~path=":memory:")
36
+ db->SqliteDriver.exec("CREATE TABLE t(id INTEGER PRIMARY KEY)")
37
+ let insert = db->SqliteDriver.prepare("INSERT INTO t(id) VALUES(?)")
38
+ let countAll = db->SqliteDriver.prepare("SELECT COUNT(*) AS c FROM t")
39
+
40
+ db->SqliteDriver.transaction(() => {
41
+ insert->SqliteDriver.run([JSON.Encode.int(1)])
42
+ insert->SqliteDriver.run([JSON.Encode.int(2)])
43
+ })
44
+
45
+ let row = countAll->SqliteDriver.get([])->Option.getOrThrow
46
+ expect(row->Dict.get("c")->Option.getOr(JSON.Encode.null))->toEqual(JSON.Encode.int(2))
47
+
48
+ let didThrow = ref(false)
49
+ try {
50
+ db->SqliteDriver.transaction(() => {
51
+ insert->SqliteDriver.run([JSON.Encode.int(3)])
52
+ throw(Failure("boom"))
53
+ })
54
+ } catch {
55
+ | Failure(_) => didThrow := true
56
+ }
57
+ expect(didThrow.contents)->toBe(true)
58
+
59
+ let rowAfter = countAll->SqliteDriver.get([])->Option.getOrThrow
60
+ expect(rowAfter->Dict.get("c")->Option.getOr(JSON.Encode.null))->toEqual(JSON.Encode.int(2))
61
+
62
+ db->SqliteDriver.close
63
+ })
64
+
65
+ testPromise("Backend.fromEnv parses sqlite path and reset flag", async () => {
66
+ let originalEnv =
67
+ Backend.processEnv->Dict.get("REVENTLESS_LOCAL_BACKEND")
68
+
69
+ Backend.processEnv->Dict.set("REVENTLESS_LOCAL_BACKEND", "sqlite:./local.db")
70
+ let parsed = Backend.fromEnv()
71
+ expect(parsed)->toEqual(Backend.Sqlite({path: "./local.db", resetOnStart: false}))
72
+
73
+ Backend.processEnv->Dict.set("REVENTLESS_LOCAL_BACKEND", "sqlite:./local.db?reset")
74
+ let parsedReset = Backend.fromEnv()
75
+ expect(parsedReset)->toEqual(Backend.Sqlite({path: "./local.db", resetOnStart: true}))
76
+
77
+ Backend.processEnv->Dict.set("REVENTLESS_LOCAL_BACKEND", "memory")
78
+ let parsedMem = Backend.fromEnv()
79
+ expect(parsedMem)->toEqual(Backend.Memory)
80
+
81
+ switch originalEnv {
82
+ | Some(v) => Backend.processEnv->Dict.set("REVENTLESS_LOCAL_BACKEND", v)
83
+ | None => Backend.processEnv->Dict.delete("REVENTLESS_LOCAL_BACKEND")
84
+ }
85
+ })
86
+ })
@@ -0,0 +1,101 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
6
+ import * as Backend$ReventlessLocal from "../../src/adapter/Backend.res.mjs";
7
+ import * as SqliteDriver$ReventlessLocal from "../../src/adapter/SqliteDriver.res.mjs";
8
+
9
+ globalThis.describe("SqliteDriver", () => {
10
+ globalThis.test("open / exec / prepare / run / get / all / iterate / close round-trip", async () => {
11
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
12
+ SqliteDriver$ReventlessLocal.exec(db, "CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT)");
13
+ let insert = SqliteDriver$ReventlessLocal.prepare(db, "INSERT INTO t(id, v) VALUES(?, ?)");
14
+ SqliteDriver$ReventlessLocal.run(insert, [
15
+ 1,
16
+ "hello"
17
+ ]);
18
+ SqliteDriver$ReventlessLocal.run(insert, [
19
+ 2,
20
+ "world"
21
+ ]);
22
+ let selectAll = SqliteDriver$ReventlessLocal.prepare(db, "SELECT id, v FROM t WHERE id > ? ORDER BY id");
23
+ let rows = SqliteDriver$ReventlessLocal.all(selectAll, [0]);
24
+ globalThis.expect(rows.length).toBe(2);
25
+ let firstRow = rows[0];
26
+ globalThis.expect(Stdlib_Option.getOr(firstRow["v"], null)).toEqual("hello");
27
+ let getOne = SqliteDriver$ReventlessLocal.get(selectAll, [0]);
28
+ globalThis.expect(Stdlib_Option.isSome(getOne)).toBe(true);
29
+ let countViaIterate = {
30
+ contents: 0
31
+ };
32
+ let iter = SqliteDriver$ReventlessLocal.iterate(selectAll, [0]);
33
+ iter.forEach(_row => {
34
+ countViaIterate.contents = countViaIterate.contents + 1 | 0;
35
+ });
36
+ globalThis.expect(countViaIterate.contents).toBe(2);
37
+ return SqliteDriver$ReventlessLocal.close(db);
38
+ });
39
+ globalThis.test("transaction commits on success, rolls back on exception", async () => {
40
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
41
+ SqliteDriver$ReventlessLocal.exec(db, "CREATE TABLE t(id INTEGER PRIMARY KEY)");
42
+ let insert = SqliteDriver$ReventlessLocal.prepare(db, "INSERT INTO t(id) VALUES(?)");
43
+ let countAll = SqliteDriver$ReventlessLocal.prepare(db, "SELECT COUNT(*) AS c FROM t");
44
+ SqliteDriver$ReventlessLocal.transaction(db, () => {
45
+ SqliteDriver$ReventlessLocal.run(insert, [1]);
46
+ SqliteDriver$ReventlessLocal.run(insert, [2]);
47
+ });
48
+ let row = Stdlib_Option.getOrThrow(SqliteDriver$ReventlessLocal.get(countAll, []), undefined);
49
+ globalThis.expect(Stdlib_Option.getOr(row["c"], null)).toEqual(2);
50
+ let didThrow = false;
51
+ try {
52
+ SqliteDriver$ReventlessLocal.transaction(db, () => {
53
+ SqliteDriver$ReventlessLocal.run(insert, [3]);
54
+ throw {
55
+ RE_EXN_ID: "Failure",
56
+ _1: "boom",
57
+ Error: new Error()
58
+ };
59
+ });
60
+ } catch (raw_exn) {
61
+ let exn = Primitive_exceptions.internalToException(raw_exn);
62
+ if (exn.RE_EXN_ID === "Failure") {
63
+ didThrow = true;
64
+ } else {
65
+ throw exn;
66
+ }
67
+ }
68
+ globalThis.expect(didThrow).toBe(true);
69
+ let rowAfter = Stdlib_Option.getOrThrow(SqliteDriver$ReventlessLocal.get(countAll, []), undefined);
70
+ globalThis.expect(Stdlib_Option.getOr(rowAfter["c"], null)).toEqual(2);
71
+ return SqliteDriver$ReventlessLocal.close(db);
72
+ });
73
+ globalThis.test("Backend.fromEnv parses sqlite path and reset flag", async () => {
74
+ let originalEnv = process.env["REVENTLESS_LOCAL_BACKEND"];
75
+ process.env["REVENTLESS_LOCAL_BACKEND"] = "sqlite:./local.db";
76
+ let parsed = Backend$ReventlessLocal.fromEnv();
77
+ globalThis.expect(parsed).toEqual({
78
+ TAG: "Sqlite",
79
+ path: "./local.db",
80
+ resetOnStart: false
81
+ });
82
+ process.env["REVENTLESS_LOCAL_BACKEND"] = "sqlite:./local.db?reset";
83
+ let parsedReset = Backend$ReventlessLocal.fromEnv();
84
+ globalThis.expect(parsedReset).toEqual({
85
+ TAG: "Sqlite",
86
+ path: "./local.db",
87
+ resetOnStart: true
88
+ });
89
+ process.env["REVENTLESS_LOCAL_BACKEND"] = "memory";
90
+ let parsedMem = Backend$ReventlessLocal.fromEnv();
91
+ globalThis.expect(parsedMem).toEqual("Memory");
92
+ if (originalEnv !== undefined) {
93
+ process.env["REVENTLESS_LOCAL_BACKEND"] = originalEnv;
94
+ return;
95
+ } else {
96
+ return Stdlib_Dict.$$delete(process.env, "REVENTLESS_LOCAL_BACKEND");
97
+ }
98
+ });
99
+ });
100
+
101
+ /* Not a pure module */
@@ -0,0 +1,44 @@
1
+ // Round-trip test for TaskBucket_Sqlite put/get helpers.
2
+
3
+ open JestGlobals
4
+
5
+ describe("TaskBucket_Sqlite", () => {
6
+ testPromise("put then get returns the stored body", async () => {
7
+ let db = SqliteDriver.openDb(~path=":memory:")
8
+ TaskBucket_Sqlite.put(~db, ~bucket="b1", ~key="k1", ~body="hello world")
9
+ let got = TaskBucket_Sqlite.get(~db, ~bucket="b1", ~key="k1")
10
+ expect(got)->toEqual(Some("hello world"))
11
+ db->SqliteDriver.close
12
+ })
13
+
14
+ testPromise("put overwrites existing body at same (bucket, key)", async () => {
15
+ let db = SqliteDriver.openDb(~path=":memory:")
16
+ TaskBucket_Sqlite.put(~db, ~bucket="b1", ~key="k", ~body="one")
17
+ TaskBucket_Sqlite.put(~db, ~bucket="b1", ~key="k", ~body="two")
18
+ let got = TaskBucket_Sqlite.get(~db, ~bucket="b1", ~key="k")
19
+ expect(got)->toEqual(Some("two"))
20
+ db->SqliteDriver.close
21
+ })
22
+
23
+ testPromise("get returns None for missing key", async () => {
24
+ let db = SqliteDriver.openDb(~path=":memory:")
25
+ let got = TaskBucket_Sqlite.get(~db, ~bucket="empty", ~key="nope")
26
+ expect(got)->toEqual(None)
27
+ db->SqliteDriver.close
28
+ })
29
+
30
+ testPromise("body persists across a file reopen", async () => {
31
+ let path = `/tmp/reventless-test-task-${Float.toString(Date.now())}.db`
32
+
33
+ {
34
+ let db = SqliteDriver.openDb(~path)
35
+ TaskBucket_Sqlite.put(~db, ~bucket="audit", ~key="42", ~body="payload")
36
+ db->SqliteDriver.close
37
+ }
38
+
39
+ let db2 = SqliteDriver.openDb(~path)
40
+ let got = TaskBucket_Sqlite.get(~db=db2, ~bucket="audit", ~key="42")
41
+ expect(got)->toEqual(Some("payload"))
42
+ db2->SqliteDriver.close
43
+ })
44
+ })
@@ -0,0 +1,40 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as SqliteDriver$ReventlessLocal from "../../src/adapter/SqliteDriver.res.mjs";
4
+ import * as TaskBucket_Sqlite$ReventlessLocal from "../../src/adapter/Task/TaskBucket_Sqlite.res.mjs";
5
+
6
+ globalThis.describe("TaskBucket_Sqlite", () => {
7
+ globalThis.test("put then get returns the stored body", async () => {
8
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
9
+ TaskBucket_Sqlite$ReventlessLocal.put(db, "b1", "k1", "hello world");
10
+ let got = TaskBucket_Sqlite$ReventlessLocal.get(db, "b1", "k1");
11
+ globalThis.expect(got).toEqual("hello world");
12
+ return SqliteDriver$ReventlessLocal.close(db);
13
+ });
14
+ globalThis.test("put overwrites existing body at same (bucket, key)", async () => {
15
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
16
+ TaskBucket_Sqlite$ReventlessLocal.put(db, "b1", "k", "one");
17
+ TaskBucket_Sqlite$ReventlessLocal.put(db, "b1", "k", "two");
18
+ let got = TaskBucket_Sqlite$ReventlessLocal.get(db, "b1", "k");
19
+ globalThis.expect(got).toEqual("two");
20
+ return SqliteDriver$ReventlessLocal.close(db);
21
+ });
22
+ globalThis.test("get returns None for missing key", async () => {
23
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
24
+ let got = TaskBucket_Sqlite$ReventlessLocal.get(db, "empty", "nope");
25
+ globalThis.expect(got).toEqual(undefined);
26
+ return SqliteDriver$ReventlessLocal.close(db);
27
+ });
28
+ globalThis.test("body persists across a file reopen", async () => {
29
+ let path = `/tmp/reventless-test-task-` + Date.now().toString() + `.db`;
30
+ let db = SqliteDriver$ReventlessLocal.openDb(path);
31
+ TaskBucket_Sqlite$ReventlessLocal.put(db, "audit", "42", "payload");
32
+ SqliteDriver$ReventlessLocal.close(db);
33
+ let db2 = SqliteDriver$ReventlessLocal.openDb(path);
34
+ let got = TaskBucket_Sqlite$ReventlessLocal.get(db2, "audit", "42");
35
+ globalThis.expect(got).toEqual("payload");
36
+ return SqliteDriver$ReventlessLocal.close(db2);
37
+ });
38
+ });
39
+
40
+ /* Not a pure module */
@@ -0,0 +1,106 @@
1
+ // Unit tests for LocalTaskBucket.
2
+ // Covers makeHandler (event extraction) and make (dummy resource for Task_Builder compatibility).
3
+
4
+ open JestGlobals
5
+
6
+ // No Pulumi mock needed (LocalTaskBucket has no Pulumi.Output usage)
7
+
8
+ describe("LocalTaskBucket", () => {
9
+ describe("makeHandler", () => {
10
+ testPromise("calls callback with eventName and key extracted from JSON object", async () => {
11
+ let receivedEventName: ref<string> = ref("")
12
+ let receivedKey: ref<string> = ref("")
13
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName, ~key) => {
14
+ receivedEventName := eventName
15
+ receivedKey := key
16
+ []
17
+ }
18
+ let handler = LocalTaskBucket.makeHandler(callback)
19
+ let json = JSON.Encode.object(
20
+ Dict.fromArray([
21
+ ("eventName", JSON.Encode.string("ObjectCreated:Put")),
22
+ ("key", JSON.Encode.string("uploads/file.csv")),
23
+ ]),
24
+ )
25
+ let _ = await handler(json, ())
26
+ expect(receivedEventName.contents)->toBe("ObjectCreated:Put")
27
+ expect(receivedKey.contents)->toBe("uploads/file.csv")
28
+ })
29
+
30
+ testPromise("uses 'ObjectCreated' when JSON has no eventName field", async () => {
31
+ let receivedEventName: ref<string> = ref("")
32
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName, ~key as _) => {
33
+ receivedEventName := eventName
34
+ []
35
+ }
36
+ let handler = LocalTaskBucket.makeHandler(callback)
37
+ let json = JSON.Encode.object(
38
+ Dict.fromArray([("key", JSON.Encode.string("some/path"))]),
39
+ )
40
+ let _ = await handler(json, ())
41
+ expect(receivedEventName.contents)->toBe("ObjectCreated")
42
+ })
43
+
44
+ testPromise("uses empty string when JSON has no key field", async () => {
45
+ let receivedKey: ref<string> = ref("initial")
46
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName as _, ~key) => {
47
+ receivedKey := key
48
+ []
49
+ }
50
+ let handler = LocalTaskBucket.makeHandler(callback)
51
+ let json = JSON.Encode.object(
52
+ Dict.fromArray([("eventName", JSON.Encode.string("ObjectRemoved"))]),
53
+ )
54
+ let _ = await handler(json, ())
55
+ expect(receivedKey.contents)->toBe("")
56
+ })
57
+
58
+ testPromise("non-object JSON uses 'ObjectCreated' and empty string for key", async () => {
59
+ let receivedEventName: ref<string> = ref("")
60
+ let receivedKey: ref<string> = ref("initial")
61
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName, ~key) => {
62
+ receivedEventName := eventName
63
+ receivedKey := key
64
+ []
65
+ }
66
+ let handler = LocalTaskBucket.makeHandler(callback)
67
+ let _ = await handler(JSON.Encode.string("not-an-object"), ())
68
+ expect(receivedEventName.contents)->toBe("ObjectCreated")
69
+ expect(receivedKey.contents)->toBe("")
70
+ })
71
+
72
+ testPromise("non-string eventName field falls back to ObjectCreated", async () => {
73
+ let receivedEventName: ref<string> = ref("")
74
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName, ~key as _) => {
75
+ receivedEventName := eventName
76
+ []
77
+ }
78
+ let handler = LocalTaskBucket.makeHandler(callback)
79
+ let json = JSON.Encode.object(
80
+ Dict.fromArray([("eventName", JSON.Encode.int(42))]),
81
+ )
82
+ let _ = await handler(json, ())
83
+ expect(receivedEventName.contents)->toBe("ObjectCreated")
84
+ })
85
+
86
+ testPromise("returns task actions from callback", async () => {
87
+ let callback: ReventlessCore.Task.bucketCallback = async (~eventName as _, ~key as _) => {
88
+ [ReventlessCore.Task.DeleteSchedule("my-schedule")]
89
+ }
90
+ let handler = LocalTaskBucket.makeHandler(callback)
91
+ let json = JSON.Encode.object(Dict.fromArray([]))
92
+ let actions = await handler(json, ())
93
+ expect(actions->Array.length)->toBe(1)
94
+ })
95
+ })
96
+
97
+ describe("make", () => {
98
+ testPromise(
99
+ "returns one dummy resource so Task_Builder can access resources[0]",
100
+ async () => {
101
+ let bucket = LocalTaskBucket.make(~name="my-bucket", ~opts={})
102
+ expect(bucket.resources->Array.length)->toBe(1)
103
+ },
104
+ )
105
+ })
106
+ })
@@ -0,0 +1,118 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as LocalTaskBucket$ReventlessLocal from "../../src/adapter/Task/LocalTaskBucket.res.mjs";
4
+
5
+ globalThis.describe("LocalTaskBucket", () => {
6
+ globalThis.describe("makeHandler", () => {
7
+ globalThis.test("calls callback with eventName and key extracted from JSON object", async () => {
8
+ let receivedEventName = {
9
+ contents: ""
10
+ };
11
+ let receivedKey = {
12
+ contents: ""
13
+ };
14
+ let callback = async (eventName, key) => {
15
+ receivedEventName.contents = eventName;
16
+ receivedKey.contents = key;
17
+ return [];
18
+ };
19
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
20
+ let json = Object.fromEntries([
21
+ [
22
+ "eventName",
23
+ "ObjectCreated:Put"
24
+ ],
25
+ [
26
+ "key",
27
+ "uploads/file.csv"
28
+ ]
29
+ ]);
30
+ await handler(json, undefined);
31
+ globalThis.expect(receivedEventName.contents).toBe("ObjectCreated:Put");
32
+ globalThis.expect(receivedKey.contents).toBe("uploads/file.csv");
33
+ });
34
+ globalThis.test("uses 'ObjectCreated' when JSON has no eventName field", async () => {
35
+ let receivedEventName = {
36
+ contents: ""
37
+ };
38
+ let callback = async (eventName, param) => {
39
+ receivedEventName.contents = eventName;
40
+ return [];
41
+ };
42
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
43
+ let json = Object.fromEntries([[
44
+ "key",
45
+ "some/path"
46
+ ]]);
47
+ await handler(json, undefined);
48
+ globalThis.expect(receivedEventName.contents).toBe("ObjectCreated");
49
+ });
50
+ globalThis.test("uses empty string when JSON has no key field", async () => {
51
+ let receivedKey = {
52
+ contents: "initial"
53
+ };
54
+ let callback = async (param, key) => {
55
+ receivedKey.contents = key;
56
+ return [];
57
+ };
58
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
59
+ let json = Object.fromEntries([[
60
+ "eventName",
61
+ "ObjectRemoved"
62
+ ]]);
63
+ await handler(json, undefined);
64
+ globalThis.expect(receivedKey.contents).toBe("");
65
+ });
66
+ globalThis.test("non-object JSON uses 'ObjectCreated' and empty string for key", async () => {
67
+ let receivedEventName = {
68
+ contents: ""
69
+ };
70
+ let receivedKey = {
71
+ contents: "initial"
72
+ };
73
+ let callback = async (eventName, key) => {
74
+ receivedEventName.contents = eventName;
75
+ receivedKey.contents = key;
76
+ return [];
77
+ };
78
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
79
+ await handler("not-an-object", undefined);
80
+ globalThis.expect(receivedEventName.contents).toBe("ObjectCreated");
81
+ globalThis.expect(receivedKey.contents).toBe("");
82
+ });
83
+ globalThis.test("non-string eventName field falls back to ObjectCreated", async () => {
84
+ let receivedEventName = {
85
+ contents: ""
86
+ };
87
+ let callback = async (eventName, param) => {
88
+ receivedEventName.contents = eventName;
89
+ return [];
90
+ };
91
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
92
+ let json = Object.fromEntries([[
93
+ "eventName",
94
+ 42
95
+ ]]);
96
+ await handler(json, undefined);
97
+ globalThis.expect(receivedEventName.contents).toBe("ObjectCreated");
98
+ });
99
+ globalThis.test("returns task actions from callback", async () => {
100
+ let callback = async (param, param$1) => [{
101
+ TAG: "DeleteSchedule",
102
+ _0: "my-schedule"
103
+ }];
104
+ let handler = LocalTaskBucket$ReventlessLocal.makeHandler(callback);
105
+ let json = Object.fromEntries([]);
106
+ let actions = await handler(json, undefined);
107
+ globalThis.expect(actions.length).toBe(1);
108
+ });
109
+ });
110
+ globalThis.describe("make", () => {
111
+ globalThis.test("returns one dummy resource so Task_Builder can access resources[0]", async () => {
112
+ let bucket = LocalTaskBucket$ReventlessLocal.make("my-bucket", {});
113
+ globalThis.expect(bucket.resources.length).toBe(1);
114
+ });
115
+ });
116
+ });
117
+
118
+ /* Not a pure module */