@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,42 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
4
+
5
+ let current = {
6
+ contents: "Memory"
7
+ };
8
+
9
+ function setMemory() {
10
+ current.contents = "Memory";
11
+ }
12
+
13
+ function setSqlite(db, path) {
14
+ current.contents = {
15
+ TAG: "Sqlite",
16
+ db: db,
17
+ path: path
18
+ };
19
+ }
20
+
21
+ function getDb() {
22
+ let match = current.contents;
23
+ if (typeof match !== "object") {
24
+ return;
25
+ } else {
26
+ return Primitive_option.some(match.db);
27
+ }
28
+ }
29
+
30
+ function isSqlite() {
31
+ let match = current.contents;
32
+ return typeof match === "object";
33
+ }
34
+
35
+ export {
36
+ current,
37
+ setMemory,
38
+ setSqlite,
39
+ getDb,
40
+ isSqlite,
41
+ }
42
+ /* No side effect */
@@ -0,0 +1,13 @@
1
+ // No-op ClonerRunner for in-memory mode.
2
+ // Satisfies Cloner.Adapter.Runner with type api = unit.
3
+
4
+ type api = unit
5
+
6
+ let make: ReventlessCore.Cloner.Adapter.runnerMaker<api> = (
7
+ ~name as _,
8
+ ~api as _,
9
+ ~fullQualifiedStackName as _,
10
+ ~reventlessCiSecretUrn as _,
11
+ ~secretUrns as _,
12
+ ~opts as _=?,
13
+ ) => ReventlessCore.Cloner.Adapter.noRunner
@@ -0,0 +1,12 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Cloner$ReventlessCore from "@reventlessdev/reventless-core/src/components/Cloner.res.mjs";
4
+
5
+ function make(param, param$1, param$2, param$3, param$4, param$5) {
6
+ return Cloner$ReventlessCore.Adapter.noRunner;
7
+ }
8
+
9
+ export {
10
+ make,
11
+ }
12
+ /* Cloner-ReventlessCore Not a pure module */
@@ -0,0 +1,329 @@
1
+ // GraphQL mutation resolvers for in-memory CommandGenerator.
2
+ //
3
+ // Two-phase registration for both Aggregate and DCB StateChangeSlice mutations:
4
+ // Phase 1 (synchronous): Plugin_Builder/Dcb_Builder calls register/registerDcb via hooks
5
+ // during construct(). This registers SDL fields and resolver stubs in GraphQL_Server
6
+ // immediately — before Output.apply chains fire.
7
+ // Phase 2 (async, inside Output.apply):
8
+ // - Aggregates: AggregateRuntime_Builder calls handleResolversEvent then make().
9
+ // - DCB: Dcb_Builder calls bindHandler() directly.
10
+
11
+ @@warning("-44")
12
+ open ReventlessCore
13
+
14
+ type api = unit
15
+ type runtimeParts = LocalRuntimeEnvironment.parts
16
+
17
+ // -- Identity extraction from GraphQL context ---------------------------------
18
+ // graphql-yoga's `context` factory in DomainGraphQL_Server.buildAuthContext
19
+ // runs LocalAuth.authenticate per request and attaches the resolved
20
+ // `Identity.t` to `ctx.identity`. Resolvers read it from there; fallback to
21
+ // anonymous only when ctx is malformed.
22
+
23
+ let extractIdentity = (ctx: JSON.t): Reventless.Identity.t => {
24
+ try {
25
+ switch (ctx->Obj.magic)["identity"]->Nullable.toOption {
26
+ | Some(id) => (id: Reventless.Identity.t)
27
+ | None => Reventless.Identity.anonymous
28
+ }
29
+ } catch {
30
+ | _ => Reventless.Identity.anonymous
31
+ }
32
+ }
33
+
34
+ // -- Authorization rejection --------------------------------------------------
35
+ // Returns a `CommandRejected` outcome with a fresh msgId so the GraphQL union
36
+ // resolves consistently — matches the existing CommandResult contract.
37
+
38
+ let rejectForbidden = (~field: string): JSON.t =>
39
+ JSON.Object(
40
+ Dict.fromArray([
41
+ ("__typename", JSON.String("CommandRejected")),
42
+ ("msgId", JSON.String(ReventlessCore.Message.uuid())),
43
+ ("errorCode", JSON.String("Forbidden")),
44
+ ("errorDetail", JSON.String(`Mutation.${field}: identity is not authorized`)),
45
+ ]),
46
+ )
47
+
48
+ // -- Plugin status gate -------------------------------------------------------
49
+ // Set by the platform after Admin.construct to wire a per-mutation lookup against
50
+ // the Plugin read model. Takes a mutation field name (e.g. "Catalog_Product_Add"),
51
+ // returns `Some((errorCode, errorDetail))` if the mutation should be rejected,
52
+ // or `None` otherwise. Platform_* admin mutations are exempt — the gate function
53
+ // should return None for them. The error code distinguishes the two off-tiers
54
+ // from `docs/analysis/plugin-lifecycle-tiers.md`:
55
+ // - `PluginUnavailable` — tier 1 (Disconnected); retryable.
56
+ // - `PluginInactive` — tier 2 (Inactive); admin-controlled, do not retry.
57
+ // Wrapping a ref instead of a functor argument keeps the module callable as-is
58
+ // from existing call sites.
59
+
60
+ let pluginStatusGate: ref<option<string => option<(string, string)>>> = ref(None)
61
+ let setPluginStatusGate = fn => pluginStatusGate := Some(fn)
62
+ let resetPluginStatusGate = () => pluginStatusGate := None
63
+
64
+ let rejectPluginStatus = (~field: string, ~errorCode: string, ~detail: string): JSON.t =>
65
+ JSON.Object(
66
+ Dict.fromArray([
67
+ ("__typename", JSON.String("CommandRejected")),
68
+ ("msgId", JSON.String(ReventlessCore.Message.uuid())),
69
+ ("errorCode", JSON.String(errorCode)),
70
+ ("errorDetail", JSON.String(`Mutation.${field}: ${detail}`)),
71
+ ]),
72
+ )
73
+
74
+ let checkPluginStatus = (~field: string): option<JSON.t> =>
75
+ switch pluginStatusGate.contents {
76
+ | Some(gate) =>
77
+ switch gate(field) {
78
+ | Some((errorCode, detail)) => Some(rejectPluginStatus(~field, ~errorCode, ~detail))
79
+ | None => None
80
+ }
81
+ | None => None
82
+ }
83
+
84
+ // Build a synthetic command value sufficient for evaluating
85
+ // `commandAuthorization`. ReScript variants with record payloads compile to
86
+ // `{TAG: cname, ...payload}` and the PPX-generated switch matches `Ctor(_)`
87
+ // which only checks `command.TAG === cname`. Payload-less constructors
88
+ // compile to bare string literals and the switch matches them with
89
+ // `command === "Cname"`, so the synthetic value must be a bare string in
90
+ // that case — otherwise the wildcard branch (file-level default) wins
91
+ // instead of the per-constructor rule.
92
+ let syntheticCommand = (cname: string, ~hasPayload: bool): unknown =>
93
+ hasPayload ? {"TAG": cname}->Obj.magic : cname->Obj.magic
94
+
95
+ let capitalize = s =>
96
+ s->String.charAt(0)->String.toUpperCase ++ s->String.slice(~start=1)
97
+
98
+ // -- CommandResult SDL types --------------------------------------------------
99
+ // Source of truth lives in GraphQL_FragmentGenerator.commandResultSdlTypes so
100
+ // the AWS stitched schema and the in-memory graphql-yoga server agree on the
101
+ // CommandResult shape. We join the 4 declarations into a single SDL block for
102
+ // the in-memory server's registerTypes API.
103
+ // Registered once per server (guards against duplicate registration after reset).
104
+
105
+ let commandResultSdl = GraphQL_FragmentGenerator.commandResultSdlTypes->Array.join("\n\n")
106
+
107
+ let ensureCommandResultTypes = (server: GraphQL_ServerInstance.t) => {
108
+ if !(server.buildSdl()->String.includes("CommandAccepted")) {
109
+ server.registerTypes(~sdlTypes=[commandResultSdl])
110
+ }
111
+ }
112
+
113
+ // Re-export the shared encoder. Source of truth is
114
+ // CommandTopic_Helpers.commandOutcomeToJson — same encoder is also reused by
115
+ // the AWS Lambda direct-invocation entry point so both surfaces produce
116
+ // AppSync-compatible CommandResult payloads.
117
+ let commandOutcomeToJson = CommandTopic.commandOutcomeToJson
118
+
119
+ let extractCommandName = (fieldName: string) => {
120
+ let parts = fieldName->String.split("_")
121
+ parts->Array.get(parts->Array.length - 1)->Option.getOr(fieldName)->capitalize
122
+ }
123
+
124
+ // -- Shared SDL derivation helpers --------------------------------------------
125
+
126
+ let extractVariantSchema = (commandSchema: S.t<unknown>, ~index=0) =>
127
+ switch commandSchema {
128
+ | Union({anyOf}) => anyOf->Array.get(index)->Option.getOr(commandSchema)
129
+ | _ => commandSchema
130
+ }
131
+
132
+ // Find the variant index in commandSchema that matches the constructor name
133
+ // extracted from `field` (e.g. `Platform_Plugin_Activate` → `Activate`). When
134
+ // the auto-flow filters @noApi variants out of `fields` but passes the
135
+ // unfiltered commandSchema, position-based lookup mismatches names against
136
+ // variant payloads — e.g. it would marry the `Platform_Plugin_Deactivate`
137
+ // field name to the `Connect(pluginDefinition)` variant schema, leaking a
138
+ // stale `_0` payload arg into the SDL. Looking up by name avoids that.
139
+ let variantIndexForField = (commandSchema: S.t<unknown>, ~field: string): int => {
140
+ let cname = extractCommandName(field)
141
+ let allNames = Reventless.DcbTag.extractAllVariantNames(commandSchema->Obj.magic)
142
+ allNames->Array.indexOf(cname)
143
+ }
144
+
145
+ let deriveSdlField = (~fieldName, variantSchema: S.t<unknown>) =>
146
+ switch GraphQL_FragmentGenerator.deriveMutationFieldFromObject(
147
+ ~fieldName,
148
+ ~collectedTypes=[],
149
+ ~seenTypes=Set.make(),
150
+ variantSchema,
151
+ ) {
152
+ | Some(field) => field
153
+ | None => ` ${fieldName}: CommandResult!`
154
+ }
155
+
156
+ // -- Per-field handler refs ---------------------------------------------------
157
+ // Populated by register()/registerDcb() with empty refs; bound by make() or
158
+ // bindHandler() when generateCommand becomes available.
159
+
160
+ let handlerRefs: dict<ref<option<CommandGenerator.commandGenerator>>> = Dict.make()
161
+
162
+ // -- register (Phase 1 — synchronous, Aggregates) ----------------------------
163
+ // Called by Plugin_Builder via aggregateMutationResolverHook before any
164
+ // Output.apply chains fire. Registers SDL + resolver stubs in GraphQL_Server.
165
+
166
+ let register = (
167
+ ~fields: array<string>,
168
+ ~commandSchema: S.t<unknown>,
169
+ ~commandAuthorization: unknown => Reventless.Authorization.permission,
170
+ ~server: GraphQL_ServerInstance.t,
171
+ ) => {
172
+ ensureCommandResultTypes(server)
173
+ // Aggregate commands target a specific instance — prepend id: ID!
174
+ let sdlFields = fields->Array.map(field => {
175
+ let variantIndex = variantIndexForField(commandSchema, ~field)
176
+ let sdl = deriveSdlField(~fieldName=field, extractVariantSchema(commandSchema, ~index=variantIndex))
177
+ if sdl->String.includes("(") {
178
+ sdl->String.replace(`${field}(`, `${field}(id: ID!, `)
179
+ } else {
180
+ sdl->String.replace(`${field}:`, `${field}(id: ID!):`)
181
+ }
182
+ })
183
+
184
+ let resolvers = Dict.make()
185
+ fields->Array.forEach(field => {
186
+ let handlerRef = ref(None)
187
+ handlerRefs->Dict.set(field, handlerRef)
188
+ // hasPayload is fixed per field — capture once at registration time so
189
+ // the resolver doesn't re-walk the schema per request.
190
+ let variantIndex = variantIndexForField(commandSchema, ~field)
191
+ let hasPayload = switch extractVariantSchema(commandSchema, ~index=variantIndex) {
192
+ | Object(_) => true
193
+ | _ => false
194
+ }
195
+ let commandName = extractCommandName(field)
196
+ let resolver: GraphQL_ServerInstance.resolverFn = async (_root, args, ctx) => {
197
+ switch handlerRef.contents {
198
+ | Some(generateCommand) =>
199
+ switch checkPluginStatus(~field) {
200
+ | Some(rejected) => rejected
201
+ | None =>
202
+ let identity = extractIdentity(ctx)
203
+ let rule = commandAuthorization(syntheticCommand(commandName, ~hasPayload))
204
+ if !Reventless.Authorization.isAllowed(rule, identity) {
205
+ rejectForbidden(~field)
206
+ } else {
207
+ let payload: CommandGenerator.payload = {
208
+ command: commandName,
209
+ arguments: args->Obj.magic,
210
+ meta: {ip: [], user: identity.userId, info: `Mutation.${field}`},
211
+ identity,
212
+ }
213
+ let outcome = await generateCommand(payload)->Effect.runPromise
214
+ outcome->commandOutcomeToJson
215
+ }
216
+ }
217
+ | None => JSON.Encode.null
218
+ }
219
+ }
220
+ resolvers->Dict.set(field, resolver)
221
+ })
222
+
223
+ server.registerMutations(~sdlFields, ~resolvers)
224
+ }
225
+
226
+ // -- registerDcb (Phase 1 — synchronous, DCB StateChangeSlices) ---------------
227
+ // Called by Dcb_Builder via dcbMutationResolverHook. Registers SDL + resolver
228
+ // stubs for DCB mutations. Unlike aggregate mutations, DCB commands use tagged
229
+ // ID field(s) (e.g., itemId, or composite-partition members) — the envelope id
230
+ // is derived inside makeGenerateCommand from the command schema, so the resolver
231
+ // just forwards args verbatim.
232
+
233
+ let registerDcb = (
234
+ ~fieldName: string,
235
+ ~commandSchema: S.t<unknown>,
236
+ ~commandAuthorization: unknown => Reventless.Authorization.permission,
237
+ ~server: GraphQL_ServerInstance.t,
238
+ ) => {
239
+ ensureCommandResultTypes(server)
240
+ let variantSchema = extractVariantSchema(commandSchema)
241
+ let sdlFields = [deriveSdlField(~fieldName, variantSchema)]
242
+
243
+ // Extract TAG (variant constructor name) for routing
244
+ let constructorNames = Reventless.DcbTag.extractAllVariantNames(commandSchema->Obj.magic)
245
+ let tag = constructorNames->Array.get(0)->Option.getOr(fieldName)
246
+ let hasPayload = Reventless.DcbTag.isVariantPayloadBearing(commandSchema->Obj.magic, tag)
247
+
248
+ let handlerRef = ref(None)
249
+ handlerRefs->Dict.set(fieldName, handlerRef)
250
+
251
+ let resolver: GraphQL_ServerInstance.resolverFn = async (_root, args, ctx) => {
252
+ switch handlerRef.contents {
253
+ | Some(generateCommand) =>
254
+ switch checkPluginStatus(~field=fieldName) {
255
+ | Some(rejected) => rejected
256
+ | None =>
257
+ let identity = extractIdentity(ctx)
258
+ let rule = commandAuthorization(syntheticCommand(tag, ~hasPayload))
259
+ if !Reventless.Authorization.isAllowed(rule, identity) {
260
+ rejectForbidden(~field=fieldName)
261
+ } else {
262
+ let payload: CommandGenerator.payload = {
263
+ command: tag,
264
+ arguments: args->Obj.magic,
265
+ meta: {ip: [], user: identity.userId, info: `Mutation.${fieldName}`},
266
+ identity,
267
+ }
268
+ let outcome = await generateCommand(payload)->Effect.runPromise
269
+ outcome->commandOutcomeToJson
270
+ }
271
+ }
272
+ | None => JSON.Encode.null
273
+ }
274
+ }
275
+
276
+ let resolvers = Dict.make()
277
+ resolvers->Dict.set(fieldName, resolver)
278
+ server.registerMutations(~sdlFields, ~resolvers)
279
+ }
280
+
281
+ // -- bindHandler (Phase 2 — direct binding) -----------------------------------
282
+ // Binds a generateCommand function to a pre-registered resolver stub.
283
+ // Used by DCB StateChangeSlices via dcbMutationBindHook.
284
+
285
+ let bindHandler = (~field: string, ~generateCommand: CommandGenerator.commandGenerator) => {
286
+ switch handlerRefs->Dict.get(field) {
287
+ | Some(handlerRef) => handlerRef.contents = Some(generateCommand)
288
+ | None => ()
289
+ }
290
+ }
291
+
292
+ // -- Pending handler slot (Phase 2, Aggregates) -------------------------------
293
+
294
+ let pending: ref<option<CommandGenerator.commandGenerator>> = ref(None)
295
+
296
+ let handleResolversEvent = (generateCommand: CommandGenerator.commandGenerator) => {
297
+ pending.contents = Some(generateCommand)
298
+ Pulumi.Output.make((event, _context) => event->generateCommand)
299
+ }
300
+
301
+ // -- make (Phase 2 — inside Output.apply, Aggregates) -------------------------
302
+ // Binds the real generateCommand to resolver stubs created by register().
303
+
304
+ let make: CommandGenerator_Adapter.resolversMaker<unit, runtimeParts> = (
305
+ ~name as _,
306
+ ~api as _,
307
+ ~fields,
308
+ ~commandSchema as _,
309
+ ~runtime as _,
310
+ ~resources as _,
311
+ ~opts as _,
312
+ ) => {
313
+ let generateCommand = switch pending.contents {
314
+ | Some(fn) =>
315
+ pending.contents = None
316
+ fn
317
+ | None => JsError.throwWithMessage("CommandGeneratorResolvers_GraphQL.make: no pending handler")
318
+ }
319
+
320
+ // Bind generateCommand to the pre-registered resolver stubs
321
+ fields->Array.forEach(field => {
322
+ switch handlerRefs->Dict.get(field) {
323
+ | Some(handlerRef) => handlerRef.contents = Some(generateCommand)
324
+ | None => ()
325
+ }
326
+ })
327
+
328
+ {resources: []}
329
+ }
@@ -0,0 +1,301 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Pulumi from "@pulumi/pulumi";
6
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
7
+ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
8
+ import * as Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
9
+ import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
10
+ import * as Authorization$Reventless from "@reventlessdev/reventless-spec/src/types/Authorization.res.mjs";
11
+ import * as CommandTopic$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic.res.mjs";
12
+ import * as GraphQL_FragmentGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_FragmentGenerator.res.mjs";
13
+
14
+ function extractIdentity(ctx) {
15
+ try {
16
+ let id = ctx.identity;
17
+ if (id == null) {
18
+ return Identity$Reventless.anonymous;
19
+ } else {
20
+ return id;
21
+ }
22
+ } catch (exn) {
23
+ return Identity$Reventless.anonymous;
24
+ }
25
+ }
26
+
27
+ function rejectForbidden(field) {
28
+ return Object.fromEntries([
29
+ [
30
+ "__typename",
31
+ "CommandRejected"
32
+ ],
33
+ [
34
+ "msgId",
35
+ Message$ReventlessCore.uuid()
36
+ ],
37
+ [
38
+ "errorCode",
39
+ "Forbidden"
40
+ ],
41
+ [
42
+ "errorDetail",
43
+ `Mutation.` + field + `: identity is not authorized`
44
+ ]
45
+ ]);
46
+ }
47
+
48
+ let pluginStatusGate = {
49
+ contents: undefined
50
+ };
51
+
52
+ function setPluginStatusGate(fn) {
53
+ pluginStatusGate.contents = fn;
54
+ }
55
+
56
+ function resetPluginStatusGate() {
57
+ pluginStatusGate.contents = undefined;
58
+ }
59
+
60
+ function rejectPluginStatus(field, errorCode, detail) {
61
+ return Object.fromEntries([
62
+ [
63
+ "__typename",
64
+ "CommandRejected"
65
+ ],
66
+ [
67
+ "msgId",
68
+ Message$ReventlessCore.uuid()
69
+ ],
70
+ [
71
+ "errorCode",
72
+ errorCode
73
+ ],
74
+ [
75
+ "errorDetail",
76
+ `Mutation.` + field + `: ` + detail
77
+ ]
78
+ ]);
79
+ }
80
+
81
+ function checkPluginStatus(field) {
82
+ let gate = pluginStatusGate.contents;
83
+ if (gate === undefined) {
84
+ return;
85
+ }
86
+ let match = gate(field);
87
+ if (match !== undefined) {
88
+ return rejectPluginStatus(field, match[0], match[1]);
89
+ }
90
+ }
91
+
92
+ function syntheticCommand(cname, hasPayload) {
93
+ if (hasPayload) {
94
+ return {
95
+ TAG: cname
96
+ };
97
+ } else {
98
+ return cname;
99
+ }
100
+ }
101
+
102
+ function capitalize(s) {
103
+ return s.charAt(0).toUpperCase() + s.slice(1);
104
+ }
105
+
106
+ let commandResultSdl = GraphQL_FragmentGenerator$ReventlessCore.commandResultSdlTypes.join("\n\n");
107
+
108
+ function ensureCommandResultTypes(server) {
109
+ if (!server.buildSdl().includes("CommandAccepted")) {
110
+ return server.registerTypes([commandResultSdl]);
111
+ }
112
+ }
113
+
114
+ function extractCommandName(fieldName) {
115
+ let parts = fieldName.split("_");
116
+ return capitalize(Stdlib_Option.getOr(parts[parts.length - 1 | 0], fieldName));
117
+ }
118
+
119
+ function extractVariantSchema(commandSchema, indexOpt) {
120
+ let index = indexOpt !== undefined ? indexOpt : 0;
121
+ if (commandSchema.type === "union") {
122
+ return Stdlib_Option.getOr(commandSchema.anyOf[index], commandSchema);
123
+ } else {
124
+ return commandSchema;
125
+ }
126
+ }
127
+
128
+ function variantIndexForField(commandSchema, field) {
129
+ let cname = extractCommandName(field);
130
+ let allNames = DcbTag$Reventless.extractAllVariantNames(commandSchema);
131
+ return allNames.indexOf(cname);
132
+ }
133
+
134
+ function deriveSdlField(fieldName, variantSchema) {
135
+ let field = GraphQL_FragmentGenerator$ReventlessCore.deriveMutationFieldFromObject(fieldName, [], new Set(), variantSchema);
136
+ if (field !== undefined) {
137
+ return field;
138
+ } else {
139
+ return ` ` + fieldName + `: CommandResult!`;
140
+ }
141
+ }
142
+
143
+ let handlerRefs = {};
144
+
145
+ function register(fields, commandSchema, commandAuthorization, server) {
146
+ ensureCommandResultTypes(server);
147
+ let sdlFields = fields.map(field => {
148
+ let variantIndex = variantIndexForField(commandSchema, field);
149
+ let sdl = deriveSdlField(field, extractVariantSchema(commandSchema, variantIndex));
150
+ if (sdl.includes("(")) {
151
+ return sdl.replace(field + `(`, field + `(id: ID!, `);
152
+ } else {
153
+ return sdl.replace(field + `:`, field + `(id: ID!):`);
154
+ }
155
+ });
156
+ let resolvers = {};
157
+ fields.forEach(field => {
158
+ let handlerRef = {
159
+ contents: undefined
160
+ };
161
+ handlerRefs[field] = handlerRef;
162
+ let variantIndex = variantIndexForField(commandSchema, field);
163
+ let match = extractVariantSchema(commandSchema, variantIndex);
164
+ let hasPayload;
165
+ hasPayload = match.type === "object";
166
+ let commandName = extractCommandName(field);
167
+ let resolver = async (_root, args, ctx) => {
168
+ let generateCommand = handlerRef.contents;
169
+ if (generateCommand === undefined) {
170
+ return null;
171
+ }
172
+ let rejected = checkPluginStatus(field);
173
+ if (rejected !== undefined) {
174
+ return rejected;
175
+ }
176
+ let identity = extractIdentity(ctx);
177
+ let rule = commandAuthorization(syntheticCommand(commandName, hasPayload));
178
+ if (!Authorization$Reventless.isAllowed(rule, identity)) {
179
+ return rejectForbidden(field);
180
+ }
181
+ let payload_meta = {
182
+ ip: [],
183
+ user: identity.userId,
184
+ info: `Mutation.` + field
185
+ };
186
+ let payload = {
187
+ command: commandName,
188
+ arguments: args,
189
+ meta: payload_meta,
190
+ identity: identity
191
+ };
192
+ return CommandTopic$ReventlessCore.commandOutcomeToJson(await Effect.runPromise(generateCommand(payload)));
193
+ };
194
+ resolvers[field] = resolver;
195
+ });
196
+ server.registerMutations(sdlFields, resolvers);
197
+ }
198
+
199
+ function registerDcb(fieldName, commandSchema, commandAuthorization, server) {
200
+ ensureCommandResultTypes(server);
201
+ let variantSchema = extractVariantSchema(commandSchema, undefined);
202
+ let sdlFields = [deriveSdlField(fieldName, variantSchema)];
203
+ let constructorNames = DcbTag$Reventless.extractAllVariantNames(commandSchema);
204
+ let tag = Stdlib_Option.getOr(constructorNames[0], fieldName);
205
+ let hasPayload = DcbTag$Reventless.isVariantPayloadBearing(commandSchema, tag);
206
+ let handlerRef = {
207
+ contents: undefined
208
+ };
209
+ handlerRefs[fieldName] = handlerRef;
210
+ let resolver = async (_root, args, ctx) => {
211
+ let generateCommand = handlerRef.contents;
212
+ if (generateCommand === undefined) {
213
+ return null;
214
+ }
215
+ let rejected = checkPluginStatus(fieldName);
216
+ if (rejected !== undefined) {
217
+ return rejected;
218
+ }
219
+ let identity = extractIdentity(ctx);
220
+ let rule = commandAuthorization(syntheticCommand(tag, hasPayload));
221
+ if (!Authorization$Reventless.isAllowed(rule, identity)) {
222
+ return rejectForbidden(fieldName);
223
+ }
224
+ let payload_meta = {
225
+ ip: [],
226
+ user: identity.userId,
227
+ info: `Mutation.` + fieldName
228
+ };
229
+ let payload = {
230
+ command: tag,
231
+ arguments: args,
232
+ meta: payload_meta,
233
+ identity: identity
234
+ };
235
+ return CommandTopic$ReventlessCore.commandOutcomeToJson(await Effect.runPromise(generateCommand(payload)));
236
+ };
237
+ let resolvers = {};
238
+ resolvers[fieldName] = resolver;
239
+ server.registerMutations(sdlFields, resolvers);
240
+ }
241
+
242
+ function bindHandler(field, generateCommand) {
243
+ let handlerRef = handlerRefs[field];
244
+ if (handlerRef !== undefined) {
245
+ handlerRef.contents = generateCommand;
246
+ return;
247
+ }
248
+ }
249
+
250
+ let pending = {
251
+ contents: undefined
252
+ };
253
+
254
+ function handleResolversEvent(generateCommand) {
255
+ pending.contents = generateCommand;
256
+ return Pulumi.output((event, _context) => generateCommand(event));
257
+ }
258
+
259
+ function make(param, param$1, fields, param$2, param$3, param$4, param$5) {
260
+ let fn = pending.contents;
261
+ let generateCommand = fn !== undefined ? (pending.contents = undefined, fn) : Stdlib_JsError.throwWithMessage("CommandGeneratorResolvers_GraphQL.make: no pending handler");
262
+ fields.forEach(field => {
263
+ let handlerRef = handlerRefs[field];
264
+ if (handlerRef !== undefined) {
265
+ handlerRef.contents = generateCommand;
266
+ return;
267
+ }
268
+ });
269
+ return {
270
+ resources: []
271
+ };
272
+ }
273
+
274
+ let commandOutcomeToJson = CommandTopic$ReventlessCore.commandOutcomeToJson;
275
+
276
+ export {
277
+ extractIdentity,
278
+ rejectForbidden,
279
+ pluginStatusGate,
280
+ setPluginStatusGate,
281
+ resetPluginStatusGate,
282
+ rejectPluginStatus,
283
+ checkPluginStatus,
284
+ syntheticCommand,
285
+ capitalize,
286
+ commandResultSdl,
287
+ ensureCommandResultTypes,
288
+ commandOutcomeToJson,
289
+ extractCommandName,
290
+ extractVariantSchema,
291
+ variantIndexForField,
292
+ deriveSdlField,
293
+ handlerRefs,
294
+ register,
295
+ registerDcb,
296
+ bindHandler,
297
+ pending,
298
+ handleResolversEvent,
299
+ make,
300
+ }
301
+ /* commandResultSdl Not a pure module */