@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,53 @@
1
+ // Integration tests for EventLog_Builder with in-memory adapters.
2
+
3
+ open JestGlobals
4
+ open EventLogFixtures
5
+
6
+ describe("EventLog (in-memory)", () => {
7
+ let _ = beforeAllAsync(async () => {
8
+ let _ = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
9
+ })
10
+
11
+ let _ = beforeEach(() => reset())
12
+
13
+ testPromise("append stores events and replay returns them", async () => {
14
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
15
+ let event = ItemEventLogSpec.ItemCreated({name: "Widget"})
16
+ let event' = makeEvent'("item-1", event)
17
+ let _ = await ops.append(0, "item-1", [event'])
18
+ let replayed = await ops.replay("item-1")
19
+ expect(replayed->Array.length)->toBe(1)
20
+ let first = replayed->Array.getUnsafe(0)
21
+ expect(first)->toEqual(event)
22
+ })
23
+
24
+ testPromise("append publishes event to event topic", async () => {
25
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
26
+ let event' = makeEvent'("pub-1", ItemEventLogSpec.ItemCreated({name: "Widget"}))
27
+ let _ = await ops.append(0, "pub-1", [event'])
28
+ expect(capturedTopicEventCount.contents)->toBe(1)
29
+ })
30
+
31
+ testPromise("replay returns empty array for unknown id", async () => {
32
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
33
+ let events = await ops.replay("unknown-id")
34
+ expect(events->Array.length)->toBe(0)
35
+ })
36
+
37
+ testPromise("multiple appends accumulate events", async () => {
38
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
39
+ let _ = await ops.append(0, "agg-1", [makeEvent'("agg-1", ItemEventLogSpec.ItemCreated({name: "First"}))])
40
+ let _ = await ops.append(1, "agg-1", [makeEvent'("agg-1", ItemEventLogSpec.ItemDeleted({id: "agg-1"}))])
41
+ let replayed = await ops.replay("agg-1")
42
+ expect(replayed->Array.length)->toBe(2)
43
+ })
44
+
45
+ testPromise("separate aggregates have independent event logs", async () => {
46
+ let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
47
+ let _ = await ops.append(0, "agg-A", [makeEvent'("agg-A", ItemEventLogSpec.ItemCreated({name: "A"}))])
48
+ let _ = await ops.append(0, "agg-B", [makeEvent'("agg-B", ItemEventLogSpec.ItemDeleted({id: "B"}))])
49
+ let eventsA = await ops.replay("agg-A")
50
+ let eventsB = await ops.replay("agg-B")
51
+ expect((eventsA->Array.length, eventsB->Array.length))->toEqual((1, 1))
52
+ })
53
+ })
@@ -0,0 +1,74 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
4
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
5
+ import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
6
+
7
+ globalThis.describe("EventLog (in-memory)", () => {
8
+ globalThis.beforeAll(async () => {
9
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
10
+ });
11
+ globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
12
+ globalThis.test("append stores events and replay returns them", async () => {
13
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
14
+ let event = {
15
+ TAG: "ItemCreated",
16
+ name: "Widget"
17
+ };
18
+ let event$p = EventLogFixtures$ReventlessLocal.makeEvent$p("item-1", event);
19
+ await ops.append(0, "item-1", [event$p]);
20
+ let replayed = await ops.replay("item-1");
21
+ globalThis.expect(replayed.length).toBe(1);
22
+ let first = replayed[0];
23
+ globalThis.expect(first).toEqual(event);
24
+ });
25
+ globalThis.test("append publishes event to event topic", async () => {
26
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
27
+ let event$p = EventLogFixtures$ReventlessLocal.makeEvent$p("pub-1", {
28
+ TAG: "ItemCreated",
29
+ name: "Widget"
30
+ });
31
+ await ops.append(0, "pub-1", [event$p]);
32
+ globalThis.expect(EventLogFixtures$ReventlessLocal.capturedTopicEventCount.contents).toBe(1);
33
+ });
34
+ globalThis.test("replay returns empty array for unknown id", async () => {
35
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
36
+ let events = await ops.replay("unknown-id");
37
+ globalThis.expect(events.length).toBe(0);
38
+ });
39
+ globalThis.test("multiple appends accumulate events", async () => {
40
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
41
+ await ops.append(0, "agg-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-1", {
42
+ TAG: "ItemCreated",
43
+ name: "First"
44
+ })]);
45
+ await ops.append(1, "agg-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-1", {
46
+ TAG: "ItemDeleted",
47
+ id: "agg-1"
48
+ })]);
49
+ let replayed = await ops.replay("agg-1");
50
+ globalThis.expect(replayed.length).toBe(2);
51
+ });
52
+ globalThis.test("separate aggregates have independent event logs", async () => {
53
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
54
+ await ops.append(0, "agg-A", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-A", {
55
+ TAG: "ItemCreated",
56
+ name: "A"
57
+ })]);
58
+ await ops.append(0, "agg-B", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-B", {
59
+ TAG: "ItemDeleted",
60
+ id: "B"
61
+ })]);
62
+ let eventsA = await ops.replay("agg-A");
63
+ let eventsB = await ops.replay("agg-B");
64
+ globalThis.expect([
65
+ eventsA.length,
66
+ eventsB.length
67
+ ]).toEqual([
68
+ 1,
69
+ 1
70
+ ]);
71
+ });
72
+ });
73
+
74
+ /* Not a pure module */
@@ -0,0 +1,47 @@
1
+ // Integration test fixtures for EventTopic builder (in-memory).
2
+
3
+ open TestFixtures
4
+
5
+ module ItemEventTopicSpec = {
6
+ module Id = Reventless.Id.StringPure
7
+ let name = "TestItemEventTopic"
8
+
9
+ @schema
10
+ type event = | ItemPublished({name: string}) | ItemRemoved({id: string})
11
+ }
12
+
13
+ // ─────────────────────────────────────────────────────────────
14
+ // Bus and Pulumi setup
15
+ // ─────────────────────────────────────────────────────────────
16
+
17
+ module Bus = LocalBus.Make()
18
+
19
+ // Subscribe before building to capture published events
20
+ let capturedEventCount: ref<int> = ref(0)
21
+ // Topic name in bus = make name ++ ComponentType.toName(EventTopic) = "TestItemEventTopic" ++ "EventTopic"
22
+ let _ = Bus.subscribeToEvents("TestItemEventTopicEventTopic", async (_, _, _) => {
23
+ capturedEventCount := capturedEventCount.contents + 1
24
+ })
25
+
26
+ let _ = TestRunner.setup()
27
+
28
+ // ─────────────────────────────────────────────────────────────
29
+ // Build EventTopic using in-memory publisher
30
+ // ─────────────────────────────────────────────────────────────
31
+
32
+ module EventTopicMaker = ReventlessCore.EventTopic_Builder.Make(
33
+ ItemEventTopicSpec,
34
+ LocalEventTopicPublisher.Make(Bus),
35
+ )
36
+
37
+ let eventTopic = EventTopicMaker.make(~name="TestItemEventTopic", ~storageResources=[])
38
+
39
+ let makeEvent' = (id, event) => ({
40
+ Reventless.Message.id,
41
+ meta: testMeta,
42
+ event,
43
+ }: Reventless.Message.event'<string, ItemEventTopicSpec.event>)
44
+
45
+ let reset = () => {
46
+ capturedEventCount := 0
47
+ }
@@ -0,0 +1,77 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
5
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
7
+ import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
8
+ import * as EventTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventTopic/EventTopic_Builder.res.mjs";
9
+ import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
10
+
11
+ let name = "TestItemEventTopic";
12
+
13
+ let eventSchema = S.union([
14
+ S.schema(s => ({
15
+ TAG: "ItemPublished",
16
+ name: s.m(S.string)
17
+ })),
18
+ S.schema(s => ({
19
+ TAG: "ItemRemoved",
20
+ id: s.m(S.string)
21
+ }))
22
+ ]);
23
+
24
+ let ItemEventTopicSpec = {
25
+ Id: undefined,
26
+ name: name,
27
+ eventSchema: eventSchema
28
+ };
29
+
30
+ let Bus = LocalBus$ReventlessLocal.Make({});
31
+
32
+ let capturedEventCount = {
33
+ contents: 0
34
+ };
35
+
36
+ Bus.subscribeToEvents("TestItemEventTopicEventTopic", async (param, param$1, param$2) => {
37
+ capturedEventCount.contents = capturedEventCount.contents + 1 | 0;
38
+ });
39
+
40
+ TestRunner$ReventlessLocal.setup();
41
+
42
+ let EventTopicMaker = EventTopic_Builder$ReventlessCore.Make({
43
+ Id: {
44
+ schema: Id$Reventless.StringPure.schema,
45
+ make: prim => prim,
46
+ makeFromString: prim => prim,
47
+ toString: prim => prim,
48
+ cmp: Id$Reventless.StringPure.cmp
49
+ },
50
+ name: name,
51
+ eventSchema: eventSchema
52
+ })(LocalEventTopicPublisher$ReventlessLocal.Make(Bus));
53
+
54
+ let eventTopic = EventTopicMaker.make("TestItemEventTopic", [], undefined);
55
+
56
+ function makeEvent$p(id, event) {
57
+ return {
58
+ id: id,
59
+ meta: TestFixtures$ReventlessLocal.testMeta,
60
+ event: event
61
+ };
62
+ }
63
+
64
+ function reset() {
65
+ capturedEventCount.contents = 0;
66
+ }
67
+
68
+ export {
69
+ ItemEventTopicSpec,
70
+ Bus,
71
+ capturedEventCount,
72
+ EventTopicMaker,
73
+ eventTopic,
74
+ makeEvent$p,
75
+ reset,
76
+ }
77
+ /* eventSchema Not a pure module */
@@ -0,0 +1,27 @@
1
+ // Fixtures for EventTopic.publishJsonStream tests (Phase I).
2
+
3
+ module ItemStreamSpec = {
4
+ module Id = Reventless.Id.StringPure
5
+ let name = "StreamEvtItem"
6
+
7
+ @schema
8
+ type event = | ItemPublished({name: string}) | ItemRemoved({id: string})
9
+ }
10
+
11
+ module StreamEvtBus = LocalBus.Make()
12
+
13
+ let _ = TestRunner.setup()
14
+
15
+ // Topic name = make name ++ "EventTopic" = "StreamEvtTopic" ++ "EventTopic"
16
+ let received: ref<int> = ref(0)
17
+ let _ = StreamEvtBus.subscribeToEvents("StreamEvtTopicEventTopic", async (_, _, _) => {
18
+ received := received.contents + 1
19
+ })
20
+
21
+ module StreamEvtTopicMaker = ReventlessCore.EventTopic_Builder.Make(
22
+ ItemStreamSpec,
23
+ LocalEventTopicPublisher.Make(StreamEvtBus),
24
+ )
25
+
26
+ let evtTopic = StreamEvtTopicMaker.make(~name="StreamEvtTopic", ~storageResources=[])
27
+
@@ -0,0 +1,62 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
5
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
7
+ import * as EventTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventTopic/EventTopic_Builder.res.mjs";
8
+ import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
9
+
10
+ let name = "StreamEvtItem";
11
+
12
+ let eventSchema = S.union([
13
+ S.schema(s => ({
14
+ TAG: "ItemPublished",
15
+ name: s.m(S.string)
16
+ })),
17
+ S.schema(s => ({
18
+ TAG: "ItemRemoved",
19
+ id: s.m(S.string)
20
+ }))
21
+ ]);
22
+
23
+ let ItemStreamSpec = {
24
+ Id: undefined,
25
+ name: name,
26
+ eventSchema: eventSchema
27
+ };
28
+
29
+ let StreamEvtBus = LocalBus$ReventlessLocal.Make({});
30
+
31
+ TestRunner$ReventlessLocal.setup();
32
+
33
+ let received = {
34
+ contents: 0
35
+ };
36
+
37
+ StreamEvtBus.subscribeToEvents("StreamEvtTopicEventTopic", async (param, param$1, param$2) => {
38
+ received.contents = received.contents + 1 | 0;
39
+ });
40
+
41
+ let StreamEvtTopicMaker = EventTopic_Builder$ReventlessCore.Make({
42
+ Id: {
43
+ schema: Id$Reventless.StringPure.schema,
44
+ make: prim => prim,
45
+ makeFromString: prim => prim,
46
+ toString: prim => prim,
47
+ cmp: Id$Reventless.StringPure.cmp
48
+ },
49
+ name: name,
50
+ eventSchema: eventSchema
51
+ })(LocalEventTopicPublisher$ReventlessLocal.Make(StreamEvtBus));
52
+
53
+ let evtTopic = StreamEvtTopicMaker.make("StreamEvtTopic", [], undefined);
54
+
55
+ export {
56
+ ItemStreamSpec,
57
+ StreamEvtBus,
58
+ received,
59
+ StreamEvtTopicMaker,
60
+ evtTopic,
61
+ }
62
+ /* eventSchema Not a pure module */
@@ -0,0 +1,35 @@
1
+ // Tests for EventTopic.publishJsonStream (Phase I of effect-stream-integration plan).
2
+ // Verifies that a Stream<publishJsonStreamItem> drives publishing without collecting into an array.
3
+
4
+ open TestFixtures
5
+ open JestGlobals
6
+ open EventTopicStreamFixtures
7
+
8
+ describe("EventTopic.publishJsonStream", () => {
9
+ let _ = beforeAllAsync(async () => {
10
+ let _ = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
11
+ })
12
+
13
+ let _ = beforeEach(() => {
14
+ received := 0
15
+ })
16
+
17
+ testPromise("streams 2 events to all subscribers", async () => {
18
+ let ops = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
19
+ let stream = [
20
+ ({service: "svc", meta: testMeta, json: JSON.parseOrThrow("{\"ev\":1}")}: ReventlessInfra.EventTopic.publishJsonStreamItem),
21
+ {service: "svc", meta: testMeta, json: JSON.parseOrThrow("{\"ev\":2}")},
22
+ ]->Stream.fromIterable
23
+ let _ = await ops.publishJsonStream(stream)->Effect.runPromise
24
+ let _ = await Promise.resolve()
25
+ let _ = await Promise.resolve()
26
+ expect(received.contents)->toBe(2)
27
+ })
28
+
29
+ testPromise("empty stream publishes nothing to subscribers", async () => {
30
+ let ops = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
31
+ let _ = await ops.publishJsonStream(Stream.empty)->Effect.runPromise
32
+ let _ = await Promise.resolve()
33
+ expect(received.contents)->toBe(0)
34
+ })
35
+ })
@@ -0,0 +1,44 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Effect from "effect/Effect";
4
+ import * as Stream from "effect/Stream";
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 TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
8
+ import * as EventTopicStreamFixtures$ReventlessLocal from "./EventTopicStreamFixtures.res.mjs";
9
+
10
+ globalThis.describe("EventTopic.publishJsonStream", () => {
11
+ globalThis.beforeAll(async () => {
12
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
13
+ });
14
+ globalThis.beforeEach(() => {
15
+ EventTopicStreamFixtures$ReventlessLocal.received.contents = 0;
16
+ });
17
+ globalThis.test("streams 2 events to all subscribers", async () => {
18
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
19
+ let stream = Stream.fromIterable([
20
+ {
21
+ service: "svc",
22
+ meta: TestFixtures$ReventlessLocal.testMeta,
23
+ json: JSON.parse("{\"ev\":1}")
24
+ },
25
+ {
26
+ service: "svc",
27
+ meta: TestFixtures$ReventlessLocal.testMeta,
28
+ json: JSON.parse("{\"ev\":2}")
29
+ }
30
+ ]);
31
+ await Effect.runPromise(ops.publishJsonStream(stream));
32
+ await Promise.resolve();
33
+ await Promise.resolve();
34
+ globalThis.expect(EventTopicStreamFixtures$ReventlessLocal.received.contents).toBe(2);
35
+ });
36
+ globalThis.test("empty stream publishes nothing to subscribers", async () => {
37
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
38
+ await Effect.runPromise(ops.publishJsonStream(Stream.empty));
39
+ await Promise.resolve();
40
+ globalThis.expect(EventTopicStreamFixtures$ReventlessLocal.received.contents).toBe(0);
41
+ });
42
+ });
43
+
44
+ /* Not a pure module */
@@ -0,0 +1,35 @@
1
+ // Integration tests for EventTopic_Builder with in-memory publisher.
2
+
3
+ open JestGlobals
4
+ open EventTopicFixtures
5
+
6
+ describe("EventTopic (in-memory)", () => {
7
+ let _ = beforeAllAsync(async () => {
8
+ let _ = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
9
+ })
10
+
11
+ let _ = beforeEach(() => reset())
12
+
13
+ testPromise("publish sends event to bus subscribers", async () => {
14
+ let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
15
+ let event' = makeEvent'("item-1", ItemEventTopicSpec.ItemPublished({name: "Widget"}))
16
+ await ops.publish([event'])
17
+ expect(capturedEventCount.contents)->toBe(1)
18
+ })
19
+
20
+ testPromise("publish multiple events notifies subscribers for each", async () => {
21
+ let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
22
+ let events = [
23
+ makeEvent'("item-1", ItemEventTopicSpec.ItemPublished({name: "Widget"})),
24
+ makeEvent'("item-2", ItemEventTopicSpec.ItemRemoved({id: "item-2"})),
25
+ ]
26
+ await ops.publish(events)
27
+ expect(capturedEventCount.contents)->toBe(2)
28
+ })
29
+
30
+ testPromise("publish empty array does not notify subscribers", async () => {
31
+ let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
32
+ await ops.publish([])
33
+ expect(capturedEventCount.contents)->toBe(0)
34
+ })
35
+ })
@@ -0,0 +1,43 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
4
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
5
+ import * as EventTopicFixtures$ReventlessLocal from "./EventTopicFixtures.res.mjs";
6
+
7
+ globalThis.describe("EventTopic (in-memory)", () => {
8
+ globalThis.beforeAll(async () => {
9
+ await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
10
+ });
11
+ globalThis.beforeEach(() => EventTopicFixtures$ReventlessLocal.reset());
12
+ globalThis.test("publish sends event to bus subscribers", async () => {
13
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
14
+ let event$p = EventTopicFixtures$ReventlessLocal.makeEvent$p("item-1", {
15
+ TAG: "ItemPublished",
16
+ name: "Widget"
17
+ });
18
+ await ops.publish([event$p]);
19
+ globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(1);
20
+ });
21
+ globalThis.test("publish multiple events notifies subscribers for each", async () => {
22
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
23
+ let events = [
24
+ EventTopicFixtures$ReventlessLocal.makeEvent$p("item-1", {
25
+ TAG: "ItemPublished",
26
+ name: "Widget"
27
+ }),
28
+ EventTopicFixtures$ReventlessLocal.makeEvent$p("item-2", {
29
+ TAG: "ItemRemoved",
30
+ id: "item-2"
31
+ })
32
+ ];
33
+ await ops.publish(events);
34
+ globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(2);
35
+ });
36
+ globalThis.test("publish empty array does not notify subscribers", async () => {
37
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
38
+ await ops.publish([]);
39
+ globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(0);
40
+ });
41
+ });
42
+
43
+ /* Not a pure module */
@@ -0,0 +1,145 @@
1
+ // Fixtures for ExtensionPoint integration tests.
2
+ // Verifies that dispatching a command to the EP channel calls publishToAggregates.
3
+
4
+ open TestFixtures
5
+
6
+ S.enableJson()
7
+
8
+ // ─────────────────────────────────────────────────────────────
9
+ // Isolated bus + Pulumi mock mode
10
+ // ─────────────────────────────────────────────────────────────
11
+
12
+ module Bus = LocalBus.Make()
13
+ let _ = TestRunner.setup()
14
+
15
+ // ─────────────────────────────────────────────────────────────
16
+ // ExtensionPoint spec
17
+ // EP CommandTopic channel = Spec.name ++ "ExtPoint" ++ "CmdTopic" = "TestEPExtPointCmdTopic"
18
+ // ─────────────────────────────────────────────────────────────
19
+
20
+ module TestEPSpec = {
21
+ let name = "TestEP"
22
+
23
+ @schema
24
+ type command = | Forward({targetId: string})
25
+
26
+ @schema
27
+ type event = | TEPNoEvent // unused — mapOutgoingEvent = None
28
+
29
+ @schema
30
+ type directive = | TEPNoDirective // unused — mapIncomingCommand only uses PublishCommand
31
+
32
+ let moduleUrl: string = %raw(`import.meta.url`)
33
+ }
34
+
35
+ // ─────────────────────────────────────────────────────────────
36
+ // Target aggregate spec (receives forwarded commands)
37
+ // ─────────────────────────────────────────────────────────────
38
+
39
+ module DelegateAggSpec = {
40
+ module Id = Reventless.Id.StringPure
41
+ let name = "TargetAgg"
42
+
43
+ @schema
44
+ type command = | Execute({targetId: string})
45
+
46
+ @schema
47
+ type event = | Executed({targetId: string}) // unused but required by Aggregate.Spec
48
+
49
+ @schema
50
+ type error = | TEAggNoError // unused but required by Aggregate.Spec
51
+
52
+ let moduleUrl: string = %raw(`import.meta.url`)
53
+ }
54
+
55
+ // ─────────────────────────────────────────────────────────────
56
+ // Mapping: Forward → Execute
57
+ // ─────────────────────────────────────────────────────────────
58
+
59
+ module ForwardMapping = {
60
+ module ExtensionPoint = TestEPSpec
61
+ module Delegate = DelegateAggSpec
62
+
63
+ let moduleUrl = "test:ExtensionPointFixtures:ForwardMapping"
64
+
65
+ let mapIncomingCommand = (
66
+ _id: string,
67
+ cmd: TestEPSpec.command,
68
+ _meta: Reventless.Message.meta,
69
+ ): array<ReventlessInfra.ExtensionPointMapping.commandAction<DelegateAggSpec.command, TestEPSpec.directive>> =>
70
+ switch cmd {
71
+ | Forward({targetId}) =>
72
+ let execCmd = DelegateAggSpec.Execute({targetId: targetId})
73
+ [ReventlessInfra.ExtensionPointMapping.PublishCommand(targetId, execCmd)]
74
+ }
75
+
76
+ let mapOutgoingEvent: option<
77
+ ReventlessInfra.ExtensionPointMapping.mapOutgoingEvent<
78
+ DelegateAggSpec.event,
79
+ TestEPSpec.event,
80
+ TestEPSpec.directive,
81
+ >,
82
+ > = None
83
+ }
84
+
85
+ // ─────────────────────────────────────────────────────────────
86
+ // Pre-compiled mapping (Spec + Impl → T)
87
+ // ─────────────────────────────────────────────────────────────
88
+
89
+ module TestEPMapping1 = ReventlessInfra.ExtensionPointMapping.Make(ForwardMapping)
90
+
91
+ // ─────────────────────────────────────────────────────────────
92
+ // Mappings collection satisfying ExtensionPoint.Mappings
93
+ // ─────────────────────────────────────────────────────────────
94
+
95
+ module TestEPMappings = {
96
+ module Spec = TestEPSpec
97
+ module type Mapping = ReventlessInfra.ExtensionPointMapping.T with module ExtensionPoint := TestEPSpec
98
+ let name = "TestEPMappings"
99
+ let moduleUrl: string = %raw(`import.meta.url`)
100
+ let mappings: array<module(Mapping)> = [module(TestEPMapping1)]
101
+ }
102
+
103
+ // ─────────────────────────────────────────────────────────────
104
+ // In-memory ExtensionPoint builder
105
+ // ─────────────────────────────────────────────────────────────
106
+
107
+ module EPBuilderWithBus = ExtensionPoint_Builder.Make(Bus)
108
+ module TestEP = EPBuilderWithBus.Make(TestEPSpec, TestEPMappings)
109
+
110
+ // ─────────────────────────────────────────────────────────────
111
+ // Captured state
112
+ // ─────────────────────────────────────────────────────────────
113
+
114
+ let capturedCmds: ref<array<Reventless.Message.commandJson>> = ref([])
115
+
116
+ // ─────────────────────────────────────────────────────────────
117
+ // Mock infrastructure
118
+ // ─────────────────────────────────────────────────────────────
119
+
120
+ let mockPublishFn: ReventlessInfra.CommandTopic.publishJsons = async cmds => {
121
+ capturedCmds := capturedCmds.contents->Array.concat(cmds)
122
+ }
123
+
124
+ // ─────────────────────────────────────────────────────────────
125
+ // Build ExtensionPoint component
126
+ // ─────────────────────────────────────────────────────────────
127
+
128
+ let ep = TestEP.make(
129
+ ~aggregateResources=Dict.fromArray([("TargetAgg", [])]),
130
+ ~publishToAggregates=Dict.fromArray([("TargetAgg", mockPublishFn)]),
131
+ ~scheduler=mockScheduler,
132
+ ~queryEngine=mockQueryEngine,
133
+ ~resourceNaming=mockResourceNaming,
134
+ ~opts=None,
135
+ )
136
+
137
+ // ─────────────────────────────────────────────────────────────
138
+ // Test meta + helpers
139
+ // ─────────────────────────────────────────────────────────────
140
+
141
+ let testMeta = makeTestMeta(~service="TestEP")
142
+
143
+ let resetMocks = () => {
144
+ capturedCmds := []
145
+ }