@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,310 @@
1
+ // GraphQL server instance factory.
2
+ // Creates independent server instances with isolated registries.
3
+ // Used by Platform to create separate core and plugin servers in split mode.
4
+
5
+ module YG = GraphqlYoga
6
+
7
+ let log = ReventlessCore.Logger.fromEnv()
8
+
9
+ type resolverFn = YG.resolverFn
10
+
11
+ // graphql-ws WebSocket transport for subscriptions. Yoga's built-in
12
+ // subscription transport is SSE-over-POST; clients using the graphql-ws
13
+ // protocol (e.g. host-shell, AppSync clients in prod) need an explicit
14
+ // WebSocket endpoint. We attach a `WebSocketServer` to the same HTTP server
15
+ // and hand it to `graphql-ws/lib/use/ws::useServer` along with the live
16
+ // schema, which fans out subscription events to connected sockets.
17
+ type wsServer
18
+ @new @module("ws")
19
+ external newWebSocketServer: {"server": YG.httpServer, "path": string} => wsServer =
20
+ "WebSocketServer"
21
+ @module("graphql-ws/lib/use/ws")
22
+ external wsUseServer: ({"schema": YG.schema}, wsServer) => unit = "useServer"
23
+
24
+ @val external processEnv: dict<string> = "process.env"
25
+ let debug = processEnv->Dict.get("GRAPHQL_DEBUG")->Option.isSome
26
+
27
+ type diagnostics = {
28
+ registeredTypeDefinitions: array<string>,
29
+ registeredMutationFields: array<string>,
30
+ registeredQueryFields: array<string>,
31
+ registeredMutationResolvers: array<string>,
32
+ registeredQueryResolvers: array<string>,
33
+ typeCount: int,
34
+ sdlMutationCount: int,
35
+ sdlQueryCount: int,
36
+ resolverMutationCount: int,
37
+ resolverQueryCount: int,
38
+ mismatches: array<string>,
39
+ fullSdl: option<string>,
40
+ serverRunning: bool,
41
+ }
42
+
43
+ type t = {
44
+ registerMutations: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
45
+ registerQueries: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
46
+ registerSubscriptions: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
47
+ registerTypes: (~sdlTypes: array<string>) => unit,
48
+ getMutationResolver: string => option<resolverFn>,
49
+ getQueryResolver: string => option<resolverFn>,
50
+ // `~contextFactory` is the yoga context factory — when supplied, requests
51
+ // run through it so resolvers see `ctx.identity`. Omit (or pass None) for
52
+ // unauthenticated servers. In-memory `Platform.res` wires
53
+ // `Auth_GraphqlContext.buildAuthContext` here so the admin server enforces
54
+ // the same bearer-token rules as the data server instead of leaving
55
+ // Platform_* queries / mutations wide open.
56
+ start: (~port: int=?, ~contextFactory: YG.contextFactory=?, unit) => unit,
57
+ stop: unit => unit,
58
+ reset: unit => unit,
59
+ buildSdl: unit => string,
60
+ getFullSdl: unit => option<string>,
61
+ getSchema: unit => option<YG.schema>,
62
+ diagnostics: unit => diagnostics,
63
+ printDiagnostics: unit => unit,
64
+ }
65
+
66
+ let extractFieldName = (sdlField: string): string => {
67
+ let trimmed = sdlField->String.trim
68
+ trimmed
69
+ ->String.split("(")
70
+ ->Array.get(0)
71
+ ->Option.getOr("")
72
+ ->String.trim
73
+ ->String.split(":")
74
+ ->Array.get(0)
75
+ ->Option.getOr("")
76
+ ->String.trim
77
+ }
78
+
79
+ let make = (~label: string="GraphQL"): t => {
80
+ let mutationResolvers: ref<dict<resolverFn>> = ref(Dict.make())
81
+ let queryResolvers: ref<dict<resolverFn>> = ref(Dict.make())
82
+ let subscriptionResolvers: ref<dict<resolverFn>> = ref(Dict.make())
83
+ let mutationFields: ref<array<string>> = ref([])
84
+ let queryFields: ref<array<string>> = ref([])
85
+ let subscriptionFields: ref<array<string>> = ref([])
86
+ let typeDefinitions: ref<array<string>> = ref([])
87
+ let activeServer: ref<option<YG.httpServer>> = ref(None)
88
+ let activeSchema: ref<option<YG.schema>> = ref(None)
89
+ let lastFullSdl: ref<option<string>> = ref(None)
90
+
91
+ let registerMutations = (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => {
92
+ mutationFields.contents = mutationFields.contents->Array.concat(sdlFields)
93
+ resolvers->Dict.toArray->Array.forEach(((k, v)) => mutationResolvers.contents->Dict.set(k, v))
94
+ }
95
+
96
+ let registerQueries = (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => {
97
+ queryFields.contents = queryFields.contents->Array.concat(sdlFields)
98
+ resolvers->Dict.toArray->Array.forEach(((k, v)) => queryResolvers.contents->Dict.set(k, v))
99
+ }
100
+
101
+ let registerSubscriptions = (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => {
102
+ subscriptionFields.contents = subscriptionFields.contents->Array.concat(sdlFields)
103
+ resolvers->Dict.toArray->Array.forEach(((k, v)) =>
104
+ subscriptionResolvers.contents->Dict.set(k, v)
105
+ )
106
+ }
107
+
108
+ let registerTypes = (~sdlTypes: array<string>) => {
109
+ typeDefinitions.contents = typeDefinitions.contents->Array.concat(sdlTypes)
110
+ }
111
+
112
+ let getMutationResolver = (fieldName: string): option<resolverFn> =>
113
+ mutationResolvers.contents->Dict.get(fieldName)
114
+
115
+ let getQueryResolver = (fieldName: string): option<resolverFn> =>
116
+ queryResolvers.contents->Dict.get(fieldName)
117
+
118
+ let buildSdl = () => {
119
+ let typesSdl =
120
+ typeDefinitions.contents->Array.length > 0
121
+ ? typeDefinitions.contents->Array.join("\n\n")
122
+ : ""
123
+ let mutations =
124
+ mutationFields.contents->Array.length > 0
125
+ ? mutationFields.contents->Array.join("\n")
126
+ : " _noop: String"
127
+ let queries =
128
+ queryFields.contents->Array.length > 0
129
+ ? queryFields.contents->Array.join("\n")
130
+ : " _noop: String"
131
+ let queriesMutationsSdl = `type Query {
132
+ ${queries}
133
+ }
134
+ type Mutation {
135
+ ${mutations}
136
+ }`
137
+ let subscriptionsSdl =
138
+ subscriptionFields.contents->Array.length > 0
139
+ ? `\n\ntype Subscription {\n${subscriptionFields.contents->Array.join("\n")}\n}`
140
+ : ""
141
+ let base =
142
+ typesSdl->String.length > 0
143
+ ? typesSdl ++ "\n\n" ++ queriesMutationsSdl
144
+ : queriesMutationsSdl
145
+ base ++ subscriptionsSdl
146
+ }
147
+
148
+ let stop = () =>
149
+ switch activeServer.contents {
150
+ | Some(server) =>
151
+ server->YG.close(() => ())
152
+ activeServer.contents = None
153
+ activeSchema.contents = None
154
+ | None => ()
155
+ }
156
+
157
+ let start = (~port: int=4000, ~contextFactory: option<YG.contextFactory>=?, ()) => {
158
+ let resolvers = Dict.make()
159
+ resolvers->Dict.set("Query", queryResolvers.contents)
160
+ resolvers->Dict.set("Mutation", mutationResolvers.contents)
161
+ if subscriptionResolvers.contents->Dict.keysToArray->Array.length > 0 {
162
+ resolvers->Dict.set("Subscription", subscriptionResolvers.contents)
163
+ }
164
+ let sdl = buildSdl()
165
+ lastFullSdl.contents = Some(sdl)
166
+ let schema = YG.createSchema({"typeDefs": sdl, "resolvers": resolvers})
167
+ activeSchema.contents = Some(schema)
168
+ let yoga = switch contextFactory {
169
+ | Some(ctx) =>
170
+ YG.createYogaWithContext({
171
+ "schema": schema,
172
+ "graphiql": true,
173
+ "logging": debug,
174
+ "maskedErrors": !debug,
175
+ "context": ctx,
176
+ })
177
+ | None =>
178
+ YG.createYoga({
179
+ "schema": schema,
180
+ "graphiql": true,
181
+ "logging": debug,
182
+ "maskedErrors": !debug,
183
+ })
184
+ }
185
+ let server = YG.createServer(yoga)
186
+ server->YG.listen(port, () =>
187
+ log.info(~comp=label, `listening on http://localhost:${port->Int.toString}/graphql`)
188
+ )
189
+ if subscriptionResolvers.contents->Dict.keysToArray->Array.length > 0 {
190
+ let wss = newWebSocketServer({"server": server, "path": "/graphql"})
191
+ wsUseServer({"schema": schema}, wss)
192
+ log.info(~comp=label, `graphql-ws subscriptions on ws://localhost:${port->Int.toString}/graphql`)
193
+ }
194
+ activeServer.contents = Some(server)
195
+ }
196
+
197
+ let reset = () => {
198
+ mutationResolvers.contents = Dict.make()
199
+ queryResolvers.contents = Dict.make()
200
+ subscriptionResolvers.contents = Dict.make()
201
+ mutationFields.contents = []
202
+ queryFields.contents = []
203
+ subscriptionFields.contents = []
204
+ typeDefinitions.contents = []
205
+ activeSchema.contents = None
206
+ lastFullSdl.contents = None
207
+ }
208
+
209
+ let getFullSdl = () => lastFullSdl.contents
210
+ let getSchema = () => activeSchema.contents
211
+
212
+ let diagnostics = (): diagnostics => {
213
+ let mutFieldNames =
214
+ mutationFields.contents->Array.map(extractFieldName)->Array.filter(n => n != "_noop")
215
+ let queryFieldNames =
216
+ queryFields.contents->Array.map(extractFieldName)->Array.filter(n => n != "_noop")
217
+ let mutResolverNames = mutationResolvers.contents->Dict.keysToArray
218
+ let queryResolverNames = queryResolvers.contents->Dict.keysToArray
219
+
220
+ let mismatches: array<string> = []
221
+
222
+ let mutResolverSet = Set.fromArray(mutResolverNames)
223
+ mutFieldNames->Array.forEach(name =>
224
+ if !(mutResolverSet->Set.has(name)) {
225
+ mismatches->Array.push(`Mutation "${name}": SDL field but no resolver`)
226
+ }
227
+ )
228
+ let queryResolverSet = Set.fromArray(queryResolverNames)
229
+ queryFieldNames->Array.forEach(name =>
230
+ if !(queryResolverSet->Set.has(name)) {
231
+ mismatches->Array.push(`Query "${name}": SDL field but no resolver`)
232
+ }
233
+ )
234
+ let mutFieldSet = Set.fromArray(mutFieldNames)
235
+ mutResolverNames->Array.forEach(name =>
236
+ if !(mutFieldSet->Set.has(name)) {
237
+ mismatches->Array.push(`Mutation "${name}": resolver but no SDL field`)
238
+ }
239
+ )
240
+ let queryFieldSet = Set.fromArray(queryFieldNames)
241
+ queryResolverNames->Array.forEach(name =>
242
+ if !(queryFieldSet->Set.has(name)) {
243
+ mismatches->Array.push(`Query "${name}": resolver but no SDL field`)
244
+ }
245
+ )
246
+ let typeNames =
247
+ typeDefinitions.contents->Array.map(ReventlessCore.GraphQL_Stitcher.extractLeadingName)
248
+
249
+ {
250
+ registeredTypeDefinitions: typeNames,
251
+ registeredMutationFields: mutFieldNames,
252
+ registeredQueryFields: queryFieldNames,
253
+ registeredMutationResolvers: mutResolverNames,
254
+ registeredQueryResolvers: queryResolverNames,
255
+ typeCount: typeNames->Array.length,
256
+ sdlMutationCount: mutFieldNames->Array.length,
257
+ sdlQueryCount: queryFieldNames->Array.length,
258
+ resolverMutationCount: mutResolverNames->Array.length,
259
+ resolverQueryCount: queryResolverNames->Array.length,
260
+ mismatches,
261
+ fullSdl: lastFullSdl.contents,
262
+ serverRunning: activeServer.contents->Option.isSome,
263
+ }
264
+ }
265
+
266
+ let printDiagnostics = () => {
267
+ let p = s => log.info(~comp=label, s)
268
+ let d = diagnostics()
269
+ p("Diagnostics")
270
+ p(` Types: ${d.typeCount->Int.toString}`)
271
+ p(
272
+ ` Mutations: ${d.sdlMutationCount->Int.toString} SDL fields, ${d.resolverMutationCount->Int.toString} resolvers`,
273
+ )
274
+ p(
275
+ ` Queries: ${d.sdlQueryCount->Int.toString} SDL fields, ${d.resolverQueryCount->Int.toString} resolvers`,
276
+ )
277
+ if d.mismatches->Array.length > 0 {
278
+ p(` Mismatches (${d.mismatches->Array.length->Int.toString}):`)
279
+ d.mismatches->Array.forEach(m => p(` - ${m}`))
280
+ } else {
281
+ p(" No mismatches")
282
+ }
283
+ p(` Server running: ${d.serverRunning ? "yes" : "no"}`)
284
+ switch d.fullSdl {
285
+ | Some(sdl) =>
286
+ p("")
287
+ p("--- Full SDL ---")
288
+ sdl->String.split("\n")->Array.forEach(line => p(line))
289
+ p("--- End ---")
290
+ | None => p(" No SDL recorded")
291
+ }
292
+ }
293
+
294
+ {
295
+ registerMutations,
296
+ registerQueries,
297
+ registerSubscriptions,
298
+ registerTypes,
299
+ getMutationResolver,
300
+ getQueryResolver,
301
+ start,
302
+ stop,
303
+ reset,
304
+ buildSdl,
305
+ getFullSdl,
306
+ getSchema,
307
+ diagnostics,
308
+ printDiagnostics,
309
+ }
310
+ }
@@ -0,0 +1,257 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Ws from "ws";
4
+ import * as Http from "http";
5
+ import * as GraphqlYoga from "graphql-yoga";
6
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
7
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
8
+ import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
9
+ import * as Ws$1 from "graphql-ws/lib/use/ws";
10
+ import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
11
+
12
+ let log = Logger$ReventlessCore.fromEnv();
13
+
14
+ let debug = Stdlib_Option.isSome(process.env["GRAPHQL_DEBUG"]);
15
+
16
+ function extractFieldName(sdlField) {
17
+ let trimmed = sdlField.trim();
18
+ return Stdlib_Option.getOr(Stdlib_Option.getOr(trimmed.split("(")[0], "").trim().split(":")[0], "").trim();
19
+ }
20
+
21
+ function make(labelOpt) {
22
+ let label = labelOpt !== undefined ? labelOpt : "GraphQL";
23
+ let mutationResolvers = {
24
+ contents: {}
25
+ };
26
+ let queryResolvers = {
27
+ contents: {}
28
+ };
29
+ let subscriptionResolvers = {
30
+ contents: {}
31
+ };
32
+ let mutationFields = {
33
+ contents: []
34
+ };
35
+ let queryFields = {
36
+ contents: []
37
+ };
38
+ let subscriptionFields = {
39
+ contents: []
40
+ };
41
+ let typeDefinitions = {
42
+ contents: []
43
+ };
44
+ let activeServer = {
45
+ contents: undefined
46
+ };
47
+ let activeSchema = {
48
+ contents: undefined
49
+ };
50
+ let lastFullSdl = {
51
+ contents: undefined
52
+ };
53
+ let registerMutations = (sdlFields, resolvers) => {
54
+ mutationFields.contents = mutationFields.contents.concat(sdlFields);
55
+ Object.entries(resolvers).forEach(param => {
56
+ mutationResolvers.contents[param[0]] = param[1];
57
+ });
58
+ };
59
+ let registerQueries = (sdlFields, resolvers) => {
60
+ queryFields.contents = queryFields.contents.concat(sdlFields);
61
+ Object.entries(resolvers).forEach(param => {
62
+ queryResolvers.contents[param[0]] = param[1];
63
+ });
64
+ };
65
+ let registerSubscriptions = (sdlFields, resolvers) => {
66
+ subscriptionFields.contents = subscriptionFields.contents.concat(sdlFields);
67
+ Object.entries(resolvers).forEach(param => {
68
+ subscriptionResolvers.contents[param[0]] = param[1];
69
+ });
70
+ };
71
+ let registerTypes = sdlTypes => {
72
+ typeDefinitions.contents = typeDefinitions.contents.concat(sdlTypes);
73
+ };
74
+ let getMutationResolver = fieldName => mutationResolvers.contents[fieldName];
75
+ let getQueryResolver = fieldName => queryResolvers.contents[fieldName];
76
+ let buildSdl = () => {
77
+ let typesSdl = typeDefinitions.contents.length !== 0 ? typeDefinitions.contents.join("\n\n") : "";
78
+ let mutations = mutationFields.contents.length !== 0 ? mutationFields.contents.join("\n") : " _noop: String";
79
+ let queries = queryFields.contents.length !== 0 ? queryFields.contents.join("\n") : " _noop: String";
80
+ let queriesMutationsSdl = `type Query {
81
+ ` + queries + `
82
+ }
83
+ type Mutation {
84
+ ` + mutations + `
85
+ }`;
86
+ let subscriptionsSdl = subscriptionFields.contents.length !== 0 ? `\n\ntype Subscription {\n` + subscriptionFields.contents.join("\n") + `\n}` : "";
87
+ let base = typesSdl.length > 0 ? typesSdl + "\n\n" + queriesMutationsSdl : queriesMutationsSdl;
88
+ return base + subscriptionsSdl;
89
+ };
90
+ let stop = () => {
91
+ let server = activeServer.contents;
92
+ if (server !== undefined) {
93
+ Primitive_option.valFromOption(server).close(() => {});
94
+ activeServer.contents = undefined;
95
+ activeSchema.contents = undefined;
96
+ return;
97
+ }
98
+ };
99
+ let start = (portOpt, contextFactory, param) => {
100
+ let port = portOpt !== undefined ? portOpt : 4000;
101
+ let resolvers = {};
102
+ resolvers["Query"] = queryResolvers.contents;
103
+ resolvers["Mutation"] = mutationResolvers.contents;
104
+ if (Object.keys(subscriptionResolvers.contents).length !== 0) {
105
+ resolvers["Subscription"] = subscriptionResolvers.contents;
106
+ }
107
+ let sdl = buildSdl();
108
+ lastFullSdl.contents = sdl;
109
+ let schema = GraphqlYoga.createSchema({
110
+ typeDefs: sdl,
111
+ resolvers: resolvers
112
+ });
113
+ activeSchema.contents = Primitive_option.some(schema);
114
+ let yoga = contextFactory !== undefined ? GraphqlYoga.createYoga({
115
+ schema: schema,
116
+ graphiql: true,
117
+ logging: debug,
118
+ maskedErrors: !debug,
119
+ context: contextFactory
120
+ }) : GraphqlYoga.createYoga({
121
+ schema: schema,
122
+ graphiql: true,
123
+ logging: debug,
124
+ maskedErrors: !debug
125
+ });
126
+ let server = Http.createServer(yoga);
127
+ server.listen(port, () => log.info(label, undefined, `listening on http://localhost:` + port.toString() + `/graphql`));
128
+ if (Object.keys(subscriptionResolvers.contents).length !== 0) {
129
+ let wss = new Ws.WebSocketServer({
130
+ server: server,
131
+ path: "/graphql"
132
+ });
133
+ Ws$1.useServer({
134
+ schema: schema
135
+ }, wss);
136
+ log.info(label, undefined, `graphql-ws subscriptions on ws://localhost:` + port.toString() + `/graphql`);
137
+ }
138
+ activeServer.contents = Primitive_option.some(server);
139
+ };
140
+ let reset = () => {
141
+ mutationResolvers.contents = {};
142
+ queryResolvers.contents = {};
143
+ subscriptionResolvers.contents = {};
144
+ mutationFields.contents = [];
145
+ queryFields.contents = [];
146
+ subscriptionFields.contents = [];
147
+ typeDefinitions.contents = [];
148
+ activeSchema.contents = undefined;
149
+ lastFullSdl.contents = undefined;
150
+ };
151
+ let getFullSdl = () => lastFullSdl.contents;
152
+ let getSchema = () => activeSchema.contents;
153
+ let diagnostics = () => {
154
+ let mutFieldNames = mutationFields.contents.map(extractFieldName).filter(n => n !== "_noop");
155
+ let queryFieldNames = queryFields.contents.map(extractFieldName).filter(n => n !== "_noop");
156
+ let mutResolverNames = Object.keys(mutationResolvers.contents);
157
+ let queryResolverNames = Object.keys(queryResolvers.contents);
158
+ let mismatches = [];
159
+ let mutResolverSet = new Set(mutResolverNames);
160
+ mutFieldNames.forEach(name => {
161
+ if (!mutResolverSet.has(name)) {
162
+ mismatches.push(`Mutation "` + name + `": SDL field but no resolver`);
163
+ return;
164
+ }
165
+ });
166
+ let queryResolverSet = new Set(queryResolverNames);
167
+ queryFieldNames.forEach(name => {
168
+ if (!queryResolverSet.has(name)) {
169
+ mismatches.push(`Query "` + name + `": SDL field but no resolver`);
170
+ return;
171
+ }
172
+ });
173
+ let mutFieldSet = new Set(mutFieldNames);
174
+ mutResolverNames.forEach(name => {
175
+ if (!mutFieldSet.has(name)) {
176
+ mismatches.push(`Mutation "` + name + `": resolver but no SDL field`);
177
+ return;
178
+ }
179
+ });
180
+ let queryFieldSet = new Set(queryFieldNames);
181
+ queryResolverNames.forEach(name => {
182
+ if (!queryFieldSet.has(name)) {
183
+ mismatches.push(`Query "` + name + `": resolver but no SDL field`);
184
+ return;
185
+ }
186
+ });
187
+ let typeNames = typeDefinitions.contents.map(GraphQL_Stitcher$ReventlessCore.extractLeadingName);
188
+ return {
189
+ registeredTypeDefinitions: typeNames,
190
+ registeredMutationFields: mutFieldNames,
191
+ registeredQueryFields: queryFieldNames,
192
+ registeredMutationResolvers: mutResolverNames,
193
+ registeredQueryResolvers: queryResolverNames,
194
+ typeCount: typeNames.length,
195
+ sdlMutationCount: mutFieldNames.length,
196
+ sdlQueryCount: queryFieldNames.length,
197
+ resolverMutationCount: mutResolverNames.length,
198
+ resolverQueryCount: queryResolverNames.length,
199
+ mismatches: mismatches,
200
+ fullSdl: lastFullSdl.contents,
201
+ serverRunning: Stdlib_Option.isSome(activeServer.contents)
202
+ };
203
+ };
204
+ let printDiagnostics = () => {
205
+ let p = s => log.info(label, undefined, s);
206
+ let d = diagnostics();
207
+ p("Diagnostics");
208
+ p(` Types: ` + d.typeCount.toString());
209
+ p(` Mutations: ` + d.sdlMutationCount.toString() + ` SDL fields, ` + d.resolverMutationCount.toString() + ` resolvers`);
210
+ p(` Queries: ` + d.sdlQueryCount.toString() + ` SDL fields, ` + d.resolverQueryCount.toString() + ` resolvers`);
211
+ if (d.mismatches.length !== 0) {
212
+ p(` Mismatches (` + d.mismatches.length.toString() + `):`);
213
+ d.mismatches.forEach(m => p(` - ` + m));
214
+ } else {
215
+ p(" No mismatches");
216
+ }
217
+ p(` Server running: ` + (
218
+ d.serverRunning ? "yes" : "no"
219
+ ));
220
+ let sdl = d.fullSdl;
221
+ if (sdl !== undefined) {
222
+ p("");
223
+ p("--- Full SDL ---");
224
+ sdl.split("\n").forEach(p);
225
+ return p("--- End ---");
226
+ } else {
227
+ return p(" No SDL recorded");
228
+ }
229
+ };
230
+ return {
231
+ registerMutations: registerMutations,
232
+ registerQueries: registerQueries,
233
+ registerSubscriptions: registerSubscriptions,
234
+ registerTypes: registerTypes,
235
+ getMutationResolver: getMutationResolver,
236
+ getQueryResolver: getQueryResolver,
237
+ start: start,
238
+ stop: stop,
239
+ reset: reset,
240
+ buildSdl: buildSdl,
241
+ getFullSdl: getFullSdl,
242
+ getSchema: getSchema,
243
+ diagnostics: diagnostics,
244
+ printDiagnostics: printDiagnostics
245
+ };
246
+ }
247
+
248
+ let YG;
249
+
250
+ export {
251
+ YG,
252
+ log,
253
+ debug,
254
+ extractFieldName,
255
+ make,
256
+ }
257
+ /* log Not a pure module */
@@ -0,0 +1,57 @@
1
+ // In-memory HeartbeatRunner — satisfies Heartbeat_Adapter.Runner.
2
+ //
3
+ // Instead of creating a CloudWatch Event Rule (as in AWS), sets up a setInterval
4
+ // that fires the heartbeat handler directly at the configured timeout interval.
5
+ //
6
+ // Awaits the handler Deferred on each tick — no None check, no warning log.
7
+ // After the first tick the Deferred is already completed, so subsequent await_
8
+ // calls return immediately.
9
+ //
10
+ // Usage: pass LocalHeartbeatRunner to Plugin_Builder.Make as the HeartbeatRunner
11
+ // parameter when building a plugin in test/local mode.
12
+ //
13
+ // Call reset() in afterAll/afterEach to clear active timers between test suites.
14
+
15
+ type runtimeParts = LocalRuntimeEnvironment.parts
16
+
17
+ type timerHandle
18
+
19
+ @val
20
+ external setIntervalJs: (unit => unit, int) => timerHandle = "setInterval"
21
+ @val
22
+ external clearIntervalJs: timerHandle => unit = "clearInterval"
23
+
24
+ let activeTimers: ref<dict<timerHandle>> = ref(Dict.make())
25
+
26
+ let make: ReventlessCore.Heartbeat_Adapter.runnerMaker<runtimeParts> = (
27
+ ~name,
28
+ ~remoteChannel as _,
29
+ ~timeout,
30
+ ~runtime,
31
+ ~opts as _,
32
+ ) => {
33
+ let handlerDeferred = runtime.parts.handlerDeferred
34
+ let intervalMs = timeout * 60 * 1000
35
+ let handle = setIntervalJs(
36
+ () => {
37
+ // Await the handler Deferred on each tick. Since the Deferred is completed
38
+ // during make() setup, this resolves immediately after the first tick.
39
+ handlerDeferred
40
+ ->Deferred.await_
41
+ ->Effect.flatMap(handler =>
42
+ Effect.promise(() => handler(Obj.magic(()), ()))
43
+ )
44
+ ->Effect.runPromise
45
+ ->ignore
46
+ },
47
+ intervalMs,
48
+ )
49
+ activeTimers.contents->Dict.set(name, handle)
50
+ {resources: []}
51
+ }
52
+
53
+ // Clear all active heartbeat timers. Call in afterAll for test isolation.
54
+ let reset = () => {
55
+ activeTimers.contents->Dict.valuesToArray->Array.forEach(clearIntervalJs)
56
+ activeTimers.contents = Dict.make()
57
+ }
@@ -0,0 +1,34 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Effect from "effect/Effect";
4
+ import * as Deferred from "effect/Deferred";
5
+
6
+ let activeTimers = {
7
+ contents: {}
8
+ };
9
+
10
+ function make(name, param, timeout, runtime, param$1) {
11
+ let handlerDeferred = runtime.parts.handlerDeferred;
12
+ let intervalMs = (timeout * 60 | 0) * 1000 | 0;
13
+ let handle = setInterval(() => {
14
+ Effect.runPromise(Effect.flatMap(Deferred.await(handlerDeferred), handler => Effect.promise(() => handler(undefined, undefined))));
15
+ }, intervalMs);
16
+ activeTimers.contents[name] = handle;
17
+ return {
18
+ resources: []
19
+ };
20
+ }
21
+
22
+ function reset() {
23
+ Object.values(activeTimers.contents).forEach(prim => {
24
+ clearInterval(prim);
25
+ });
26
+ activeTimers.contents = {};
27
+ }
28
+
29
+ export {
30
+ activeTimers,
31
+ make,
32
+ reset,
33
+ }
34
+ /* effect/Effect Not a pure module */