@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,268 @@
1
+ // Phase 5 — GSI fidelity (CREATE INDEX statements) and TTL filtering
2
+ // for QueryDbStorage_Sqlite.
3
+
4
+ open JestGlobals
5
+
6
+ let _ = TestRunner.setup()
7
+ let opts: Pulumi.CustomResourceOptions.t = {}
8
+
9
+ let openFreshDb = () => SqliteDriver.openDb(~path=":memory:")
10
+
11
+ let collect = stream =>
12
+ stream
13
+ ->Stream.runCollect
14
+ ->Effect.catchAll(_ => Effect.succeed([]))
15
+ ->Effect.runPromise
16
+
17
+ describe("QueryDbStorage_Sqlite — GSI", () => {
18
+ testPromise("declared indexes produce CREATE INDEX statements", async () => {
19
+ module TestBus = LocalBus.Make()
20
+ module DbProvider = {
21
+ let db = openFreshDb()
22
+ }
23
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
24
+
25
+ let byOwnerIdx: Reventless.ReadModel.indexConfig = {
26
+ index: "ByOwner",
27
+ type_: "S",
28
+ idField: "ownerId",
29
+ projectionType: ALL,
30
+ }
31
+ let byOwnerCreatedIdx: Reventless.ReadModel.indexConfig = {
32
+ index: "ByOwnerCreated",
33
+ type_: "S",
34
+ idField: "ownerId",
35
+ subIdField: "createdAt",
36
+ projectionType: KEYS_ONLY,
37
+ }
38
+
39
+ let _ = Storage.make(
40
+ ~name="orders",
41
+ ~indexes=[byOwnerIdx, byOwnerCreatedIdx],
42
+ ~api=(),
43
+ ~apiRole=(),
44
+ ~opts,
45
+ )
46
+
47
+ // Verify the indexes were created in sqlite_master.
48
+ let listIndexes = DbProvider.db->SqliteDriver.prepare(
49
+ "SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name='qdb_orders' ORDER BY name",
50
+ )
51
+ let rows = listIndexes->SqliteDriver.all([])
52
+ let names = rows->Array.map(row =>
53
+ switch row->Dict.get("name") {
54
+ | Some(JSON.String(s)) => s
55
+ | _ => ""
56
+ }
57
+ )
58
+ expect(names->Array.includes("idx_qdb_orders_ByOwner"))->toBe(true)
59
+ expect(names->Array.includes("idx_qdb_orders_ByOwnerCreated"))->toBe(true)
60
+
61
+ // Confirm the index definition references json_extract on the configured field.
62
+ let firstSql = switch rows->Array.find(row =>
63
+ switch row->Dict.get("name") {
64
+ | Some(JSON.String(s)) => s == "idx_qdb_orders_ByOwner"
65
+ | _ => false
66
+ }
67
+ ) {
68
+ | Some(row) =>
69
+ switch row->Dict.get("sql") {
70
+ | Some(JSON.String(s)) => s
71
+ | _ => ""
72
+ }
73
+ | None => ""
74
+ }
75
+ expect(firstSql->String.includes("json_extract(item, '$.ownerId')"))->toBe(true)
76
+ })
77
+
78
+ testPromise("composite-key indexes use pk/sk concatenation expressions", async () => {
79
+ module TestBus = LocalBus.Make()
80
+ module DbProvider = {
81
+ let db = openFreshDb()
82
+ }
83
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
84
+
85
+ let compositeIdx: Reventless.ReadModel.indexConfig = {
86
+ index: "ByTenantOwner",
87
+ type_: "S",
88
+ pkFields: ["tenantId", "ownerId"],
89
+ pkSep: "|",
90
+ projectionType: ALL,
91
+ }
92
+
93
+ let _ = Storage.make(
94
+ ~name="composite",
95
+ ~indexes=[compositeIdx],
96
+ ~api=(),
97
+ ~apiRole=(),
98
+ ~opts,
99
+ )
100
+
101
+ let listSql = DbProvider.db->SqliteDriver.prepare(
102
+ "SELECT sql FROM sqlite_master WHERE type='index' AND name='idx_qdb_composite_ByTenantOwner'",
103
+ )
104
+ let row = listSql->SqliteDriver.get([])->Option.getOrThrow
105
+ let sql = switch row->Dict.get("sql") {
106
+ | Some(JSON.String(s)) => s
107
+ | _ => ""
108
+ }
109
+ expect(
110
+ sql->String.includes("json_extract(item, '$.tenantId') || '|' || json_extract(item, '$.ownerId')"),
111
+ )->toBe(true)
112
+ })
113
+
114
+ testPromise("index name is sanitised — special characters in index name become underscores", async () => {
115
+ module TestBus = LocalBus.Make()
116
+ module DbProvider = {
117
+ let db = openFreshDb()
118
+ }
119
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
120
+
121
+ let weirdIdx: Reventless.ReadModel.indexConfig = {
122
+ index: "by-thing.v2",
123
+ type_: "S",
124
+ idField: "thing",
125
+ projectionType: ALL,
126
+ }
127
+ let _ = Storage.make(
128
+ ~name="rm",
129
+ ~indexes=[weirdIdx],
130
+ ~api=(),
131
+ ~apiRole=(),
132
+ ~opts,
133
+ )
134
+ let listIndexes = DbProvider.db->SqliteDriver.prepare(
135
+ "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='qdb_rm'",
136
+ )
137
+ let names =
138
+ listIndexes
139
+ ->SqliteDriver.all([])
140
+ ->Array.map(row =>
141
+ switch row->Dict.get("name") {
142
+ | Some(JSON.String(s)) => s
143
+ | _ => ""
144
+ }
145
+ )
146
+ expect(names->Array.includes("idx_qdb_rm_by_thing_v2"))->toBe(true)
147
+ })
148
+ })
149
+
150
+ describe("QueryDbStorage_Sqlite — TTL", () => {
151
+ testPromise("save with TTL in the future returns the item", async () => {
152
+ module TestBus = LocalBus.Make()
153
+ module DbProvider = {
154
+ let db = openFreshDb()
155
+ }
156
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
157
+
158
+ let s = Storage.make(~name="rt-future", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
159
+ let ops = await s.operations->TestRunner.resolve
160
+
161
+ let oneHourFromNow = Float.toInt(Date.now() /. 1000.0) + 3600
162
+ let _ = await ops.save(
163
+ "k",
164
+ JSON.Encode.string("alive"),
165
+ ReventlessCore.QueryDb.Any,
166
+ Some(oneHourFromNow),
167
+ )
168
+
169
+ let items = await ops.loadStream("k")->collect
170
+ expect(items->Array.length)->toBe(1)
171
+ })
172
+
173
+ testPromise("save with TTL already in the past hides the item from reads", async () => {
174
+ module TestBus = LocalBus.Make()
175
+ module DbProvider = {
176
+ let db = openFreshDb()
177
+ }
178
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
179
+
180
+ let s = Storage.make(~name="rt-past", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
181
+ let ops = await s.operations->TestRunner.resolve
182
+
183
+ let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
184
+ let _ = await ops.save(
185
+ "k",
186
+ JSON.Encode.string("expired"),
187
+ ReventlessCore.QueryDb.Any,
188
+ Some(aMinuteAgo),
189
+ )
190
+
191
+ let items = await ops.loadStream("k")->collect
192
+ expect(items->Array.length)->toBe(0)
193
+ })
194
+
195
+ testPromise("save without TTL is treated as never expiring", async () => {
196
+ module TestBus = LocalBus.Make()
197
+ module DbProvider = {
198
+ let db = openFreshDb()
199
+ }
200
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
201
+
202
+ let s = Storage.make(~name="rt-none", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
203
+ let ops = await s.operations->TestRunner.resolve
204
+
205
+ let _ = await ops.save("k", JSON.Encode.string("forever"), ReventlessCore.QueryDb.Any, None)
206
+
207
+ let items = await ops.loadStream("k")->collect
208
+ expect(items->Array.length)->toBe(1)
209
+ })
210
+
211
+ testPromise("scanAll skips expired rows", async () => {
212
+ module TestBus = LocalBus.Make()
213
+ module DbProvider = {
214
+ let db = openFreshDb()
215
+ }
216
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
217
+
218
+ let s = Storage.make(~name="scan-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
219
+ let ops = await s.operations->TestRunner.resolve
220
+
221
+ let _ = await ops.save("alive", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
222
+ let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
223
+ let _ = await ops.save(
224
+ "expired",
225
+ JSON.Encode.string("e"),
226
+ ReventlessCore.QueryDb.Any,
227
+ Some(aMinuteAgo),
228
+ )
229
+
230
+ let scan = TestBus.getQueryDbScan("scan-ttl")
231
+ switch scan {
232
+ | Some(fn) => expect(fn()->Array.length)->toBe(1)
233
+ | None => expect("scan registered")->toBe("scan missing")
234
+ }
235
+ })
236
+
237
+ testPromise("overwriting an expired row with a non-expired one makes it visible again", async () => {
238
+ module TestBus = LocalBus.Make()
239
+ module DbProvider = {
240
+ let db = openFreshDb()
241
+ }
242
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
243
+
244
+ let s = Storage.make(~name="overwrite-ttl", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
245
+ let ops = await s.operations->TestRunner.resolve
246
+
247
+ let aMinuteAgo = Float.toInt(Date.now() /. 1000.0) - 60
248
+ let _ = await ops.save(
249
+ "k",
250
+ JSON.Encode.string("expired"),
251
+ ReventlessCore.QueryDb.Any,
252
+ Some(aMinuteAgo),
253
+ )
254
+
255
+ let items1 = await ops.loadStream("k")->collect
256
+ expect(items1->Array.length)->toBe(0)
257
+
258
+ let _ = await ops.save(
259
+ "k",
260
+ JSON.Encode.string("revived"),
261
+ ReventlessCore.QueryDb.Any,
262
+ None,
263
+ )
264
+ let items2 = await ops.loadStream("k")->collect
265
+ expect(items2->Array.length)->toBe(1)
266
+ expect(items2->Array.getUnsafe(0))->toEqual(JSON.Encode.string("revived"))
267
+ })
268
+ })
@@ -0,0 +1,209 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Effect from "effect/Effect";
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 SqliteDriver$ReventlessLocal from "../../src/adapter/SqliteDriver.res.mjs";
9
+ import * as QueryDbStorage_Sqlite$ReventlessLocal from "../../src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs";
10
+
11
+ TestRunner$ReventlessLocal.setup();
12
+
13
+ let opts = {};
14
+
15
+ function openFreshDb() {
16
+ return SqliteDriver$ReventlessLocal.openDb(":memory:");
17
+ }
18
+
19
+ function collect(stream) {
20
+ return Effect.runPromise(Effect.catchAll(Stream.runCollect(stream), param => Effect.succeed([])));
21
+ }
22
+
23
+ globalThis.describe("QueryDbStorage_Sqlite — GSI", () => {
24
+ globalThis.test("declared indexes produce CREATE INDEX statements", async () => {
25
+ let TestBus = LocalBus$ReventlessLocal.Make({});
26
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
27
+ let DbProvider = {
28
+ db: db
29
+ };
30
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
31
+ Storage.make("orders", [
32
+ {
33
+ index: "ByOwner",
34
+ type_: "S",
35
+ idField: "ownerId",
36
+ projectionType: "ALL"
37
+ },
38
+ {
39
+ index: "ByOwnerCreated",
40
+ type_: "S",
41
+ idField: "ownerId",
42
+ subIdField: "createdAt",
43
+ projectionType: "KEYS_ONLY"
44
+ }
45
+ ], undefined, undefined, undefined, undefined, opts);
46
+ let listIndexes = SqliteDriver$ReventlessLocal.prepare(db, "SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name='qdb_orders' ORDER BY name");
47
+ let rows = SqliteDriver$ReventlessLocal.all(listIndexes, []);
48
+ let names = rows.map(row => {
49
+ let match = row["name"];
50
+ if (typeof match === "string") {
51
+ return match;
52
+ } else {
53
+ return "";
54
+ }
55
+ });
56
+ globalThis.expect(names.includes("idx_qdb_orders_ByOwner")).toBe(true);
57
+ globalThis.expect(names.includes("idx_qdb_orders_ByOwnerCreated")).toBe(true);
58
+ let row = rows.find(row => {
59
+ let match = row["name"];
60
+ return match === "idx_qdb_orders_ByOwner";
61
+ });
62
+ let firstSql;
63
+ if (row !== undefined) {
64
+ let match = row["sql"];
65
+ firstSql = typeof match === "string" ? match : "";
66
+ } else {
67
+ firstSql = "";
68
+ }
69
+ globalThis.expect(firstSql.includes("json_extract(item, '$.ownerId')")).toBe(true);
70
+ });
71
+ globalThis.test("composite-key indexes use pk/sk concatenation expressions", async () => {
72
+ let TestBus = LocalBus$ReventlessLocal.Make({});
73
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
74
+ let DbProvider = {
75
+ db: db
76
+ };
77
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
78
+ let compositeIdx_pkFields = [
79
+ "tenantId",
80
+ "ownerId"
81
+ ];
82
+ let compositeIdx_pkSep = "|";
83
+ let compositeIdx = {
84
+ index: "ByTenantOwner",
85
+ type_: "S",
86
+ pkFields: compositeIdx_pkFields,
87
+ pkSep: compositeIdx_pkSep,
88
+ projectionType: "ALL"
89
+ };
90
+ Storage.make("composite", [compositeIdx], undefined, undefined, undefined, undefined, opts);
91
+ let listSql = SqliteDriver$ReventlessLocal.prepare(db, "SELECT sql FROM sqlite_master WHERE type='index' AND name='idx_qdb_composite_ByTenantOwner'");
92
+ let row = Stdlib_Option.getOrThrow(SqliteDriver$ReventlessLocal.get(listSql, []), undefined);
93
+ let match = row["sql"];
94
+ let sql = typeof match === "string" ? match : "";
95
+ globalThis.expect(sql.includes("json_extract(item, '$.tenantId') || '|' || json_extract(item, '$.ownerId')")).toBe(true);
96
+ });
97
+ globalThis.test("index name is sanitised — special characters in index name become underscores", async () => {
98
+ let TestBus = LocalBus$ReventlessLocal.Make({});
99
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
100
+ let DbProvider = {
101
+ db: db
102
+ };
103
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
104
+ Storage.make("rm", [{
105
+ index: "by-thing.v2",
106
+ type_: "S",
107
+ idField: "thing",
108
+ projectionType: "ALL"
109
+ }], undefined, undefined, undefined, undefined, opts);
110
+ let listIndexes = SqliteDriver$ReventlessLocal.prepare(db, "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='qdb_rm'");
111
+ let names = SqliteDriver$ReventlessLocal.all(listIndexes, []).map(row => {
112
+ let match = row["name"];
113
+ if (typeof match === "string") {
114
+ return match;
115
+ } else {
116
+ return "";
117
+ }
118
+ });
119
+ globalThis.expect(names.includes("idx_qdb_rm_by_thing_v2")).toBe(true);
120
+ });
121
+ });
122
+
123
+ globalThis.describe("QueryDbStorage_Sqlite — TTL", () => {
124
+ globalThis.test("save with TTL in the future returns the item", async () => {
125
+ let TestBus = LocalBus$ReventlessLocal.Make({});
126
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
127
+ let DbProvider = {
128
+ db: db
129
+ };
130
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
131
+ let s = Storage.make("rt-future", [], undefined, undefined, undefined, undefined, opts);
132
+ let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
133
+ let oneHourFromNow = (Date.now() / 1000.0 | 0) + 3600 | 0;
134
+ await ops.save("k", "alive", "Any", oneHourFromNow);
135
+ let items = await collect(ops.loadStream("k"));
136
+ globalThis.expect(items.length).toBe(1);
137
+ });
138
+ globalThis.test("save with TTL already in the past hides the item from reads", async () => {
139
+ let TestBus = LocalBus$ReventlessLocal.Make({});
140
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
141
+ let DbProvider = {
142
+ db: db
143
+ };
144
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
145
+ let s = Storage.make("rt-past", [], undefined, undefined, undefined, undefined, opts);
146
+ let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
147
+ let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
148
+ await ops.save("k", "expired", "Any", aMinuteAgo);
149
+ let items = await collect(ops.loadStream("k"));
150
+ globalThis.expect(items.length).toBe(0);
151
+ });
152
+ globalThis.test("save without TTL is treated as never expiring", async () => {
153
+ let TestBus = LocalBus$ReventlessLocal.Make({});
154
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
155
+ let DbProvider = {
156
+ db: db
157
+ };
158
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
159
+ let s = Storage.make("rt-none", [], undefined, undefined, undefined, undefined, opts);
160
+ let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
161
+ await ops.save("k", "forever", "Any", undefined);
162
+ let items = await collect(ops.loadStream("k"));
163
+ globalThis.expect(items.length).toBe(1);
164
+ });
165
+ globalThis.test("scanAll skips expired rows", async () => {
166
+ let TestBus = LocalBus$ReventlessLocal.Make({});
167
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
168
+ let DbProvider = {
169
+ db: db
170
+ };
171
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
172
+ let s = Storage.make("scan-ttl", [], undefined, undefined, undefined, undefined, opts);
173
+ let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
174
+ await ops.save("alive", "a", "Any", undefined);
175
+ let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
176
+ await ops.save("expired", "e", "Any", aMinuteAgo);
177
+ let scan = TestBus.getQueryDbScan("scan-ttl");
178
+ if (scan !== undefined) {
179
+ globalThis.expect(scan().length).toBe(1);
180
+ } else {
181
+ globalThis.expect("scan registered").toBe("scan missing");
182
+ }
183
+ });
184
+ globalThis.test("overwriting an expired row with a non-expired one makes it visible again", async () => {
185
+ let TestBus = LocalBus$ReventlessLocal.Make({});
186
+ let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
187
+ let DbProvider = {
188
+ db: db
189
+ };
190
+ let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
191
+ let s = Storage.make("overwrite-ttl", [], undefined, undefined, undefined, undefined, opts);
192
+ let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
193
+ let aMinuteAgo = (Date.now() / 1000.0 | 0) - 60 | 0;
194
+ await ops.save("k", "expired", "Any", aMinuteAgo);
195
+ let items1 = await collect(ops.loadStream("k"));
196
+ globalThis.expect(items1.length).toBe(0);
197
+ await ops.save("k", "revived", "Any", undefined);
198
+ let items2 = await collect(ops.loadStream("k"));
199
+ globalThis.expect(items2.length).toBe(1);
200
+ globalThis.expect(items2[0]).toEqual("revived");
201
+ });
202
+ });
203
+
204
+ export {
205
+ opts,
206
+ openFreshDb,
207
+ collect,
208
+ }
209
+ /* Not a pure module */