@reventlessdev/reventless-core 3.0.0-alpha.134

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 (502) hide show
  1. package/CHANGELOG.md +1355 -0
  2. package/LICENSE +202 -0
  3. package/README.md +173 -0
  4. package/__mocks__/emptyModule.js +2 -0
  5. package/jest.setup.cjs +5 -0
  6. package/package.json +73 -0
  7. package/rescript.json +41 -0
  8. package/scripts/deploy.sh +6 -0
  9. package/scripts/post-deploy.sh +5 -0
  10. package/scripts/pre-deploy.sh +18 -0
  11. package/scripts/pulumi-up.sh +30 -0
  12. package/src/Behavior.res +18 -0
  13. package/src/Behavior.res.mjs +2 -0
  14. package/src/ComponentType.res +125 -0
  15. package/src/ComponentType.res.mjs +199 -0
  16. package/src/Env.res +5 -0
  17. package/src/Env.res.mjs +2 -0
  18. package/src/Mapper.res +36 -0
  19. package/src/Mapper.res.mjs +18 -0
  20. package/src/Mapper1toN.res +107 -0
  21. package/src/Mapper1toN.res.mjs +2 -0
  22. package/src/MapperNto1.res +78 -0
  23. package/src/MapperNto1.res.mjs +35 -0
  24. package/src/Message.res +353 -0
  25. package/src/Message.res.mjs +418 -0
  26. package/src/PluginRuntimeOperations.res +15 -0
  27. package/src/PluginRuntimeOperations.res.mjs +2 -0
  28. package/src/Projection.res +447 -0
  29. package/src/Projection.res.mjs +712 -0
  30. package/src/ProjectionMapper.res +44 -0
  31. package/src/ProjectionMapper.res.mjs +51 -0
  32. package/src/RequestContext.res +42 -0
  33. package/src/RequestContext.res.mjs +39 -0
  34. package/src/adapter/Adapter.res +178 -0
  35. package/src/adapter/Adapter.res.mjs +201 -0
  36. package/src/adapter/AdapterDeploytime.res +56 -0
  37. package/src/adapter/AdapterDeploytime.res.mjs +42 -0
  38. package/src/adapter/Auth/Auth_Adapter.res +42 -0
  39. package/src/adapter/Auth/Auth_Adapter.res.mjs +2 -0
  40. package/src/adapter/Runtime/AggregateRuntime_Builder.res +22 -0
  41. package/src/adapter/Runtime/AggregateRuntime_Builder.res.mjs +2 -0
  42. package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res +259 -0
  43. package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res.mjs +190 -0
  44. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +92 -0
  45. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +59 -0
  46. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +52 -0
  47. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +49 -0
  48. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +64 -0
  49. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +59 -0
  50. package/src/adapter/Runtime/EventCollectorRuntime_Builder.res +11 -0
  51. package/src/adapter/Runtime/EventCollectorRuntime_Builder.res.mjs +2 -0
  52. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +46 -0
  53. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +40 -0
  54. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +204 -0
  55. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +150 -0
  56. package/src/adapter/Runtime/ExtensionPointRuntime_Builder.res +18 -0
  57. package/src/adapter/Runtime/ExtensionPointRuntime_Builder.res.mjs +2 -0
  58. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +36 -0
  59. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +28 -0
  60. package/src/adapter/Runtime/PluginRuntime_Builder.res +23 -0
  61. package/src/adapter/Runtime/PluginRuntime_Builder.res.mjs +2 -0
  62. package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res +97 -0
  63. package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs +62 -0
  64. package/src/adapter/Runtime/PluginRuntime_Builder_Single.res +89 -0
  65. package/src/adapter/Runtime/PluginRuntime_Builder_Single.res.mjs +62 -0
  66. package/src/adapter/Runtime/Runtime.res +106 -0
  67. package/src/adapter/Runtime/Runtime.res.mjs +22 -0
  68. package/src/adapter/Runtime/TaskRuntime_Builder.res +32 -0
  69. package/src/adapter/Runtime/TaskRuntime_Builder.res.mjs +2 -0
  70. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +42 -0
  71. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +29 -0
  72. package/src/admin/AdminApi.res +88 -0
  73. package/src/admin/AdminApi.res.mjs +89 -0
  74. package/src/admin/Admin_Callback.res +27 -0
  75. package/src/admin/Admin_Callback.res.mjs +20 -0
  76. package/src/admin/Platform_Admin.res +402 -0
  77. package/src/admin/Platform_Admin.res.mjs +250 -0
  78. package/src/admin/Platform_Admin_Structure.res +125 -0
  79. package/src/admin/Platform_Admin_Structure.res.mjs +182 -0
  80. package/src/admin/Platform_ComponentDefinitionsApi.res +160 -0
  81. package/src/admin/Platform_ComponentDefinitionsApi.res.mjs +299 -0
  82. package/src/admin/Platform_UIFragmentsApi.res +55 -0
  83. package/src/admin/Platform_UIFragmentsApi.res.mjs +124 -0
  84. package/src/admin/UIFragmentRegistryProjection.res +43 -0
  85. package/src/admin/UIFragmentRegistryProjection.res.mjs +81 -0
  86. package/src/admin/UIFragmentRegistryReadModelSpec.res +13 -0
  87. package/src/admin/UIFragmentRegistryReadModelSpec.res.mjs +40 -0
  88. package/src/components/Aggregate/Aggregate.res +96 -0
  89. package/src/components/Aggregate/Aggregate.res.mjs +82 -0
  90. package/src/components/Aggregate/Aggregate_Builder.res +175 -0
  91. package/src/components/Aggregate/Aggregate_Builder.res.mjs +119 -0
  92. package/src/components/Aggregate/Aggregate_Callback.res +273 -0
  93. package/src/components/Aggregate/Aggregate_Callback.res.mjs +208 -0
  94. package/src/components/Api/ApiAllowedStatesHelpers.res +19 -0
  95. package/src/components/Api/ApiAllowedStatesHelpers.res.mjs +16 -0
  96. package/src/components/Api/ApiNoApiHelpers.res +13 -0
  97. package/src/components/Api/ApiNoApiHelpers.res.mjs +29 -0
  98. package/src/components/Api/Api_Builder.res +40 -0
  99. package/src/components/Api/Api_Builder.res.mjs +33 -0
  100. package/src/components/Api/Api_Naming.res +92 -0
  101. package/src/components/Api/Api_Naming.res.mjs +103 -0
  102. package/src/components/Api/Api_Operations.res +13 -0
  103. package/src/components/Api/Api_Operations.res.mjs +12 -0
  104. package/src/components/Api/GraphQL_FragmentGenerator.res +612 -0
  105. package/src/components/Api/GraphQL_FragmentGenerator.res.mjs +503 -0
  106. package/src/components/Api/GraphQL_SchemaInspector.res +156 -0
  107. package/src/components/Api/GraphQL_SchemaInspector.res.mjs +123 -0
  108. package/src/components/Api/GraphQL_Stitcher.res +271 -0
  109. package/src/components/Api/GraphQL_Stitcher.res.mjs +229 -0
  110. package/src/components/Api/MCP_SchemaGenerator.res +185 -0
  111. package/src/components/Api/MCP_SchemaGenerator.res.mjs +146 -0
  112. package/src/components/Api/SchemaType.res +126 -0
  113. package/src/components/Api/SchemaType.res.mjs +143 -0
  114. package/src/components/Api/SuryToJsonSchema.res +142 -0
  115. package/src/components/Api/SuryToJsonSchema.res.mjs +210 -0
  116. package/src/components/AutomationSlice/AutomationSlice.res +39 -0
  117. package/src/components/AutomationSlice/AutomationSlice.res.mjs +24 -0
  118. package/src/components/AutomationSlice/AutomationSlice_Builder.res +207 -0
  119. package/src/components/AutomationSlice/AutomationSlice_Builder.res.mjs +123 -0
  120. package/src/components/AutomationSlice/AutomationSlice_Callback.res +212 -0
  121. package/src/components/AutomationSlice/AutomationSlice_Callback.res.mjs +189 -0
  122. package/src/components/Builder_Helpers.res +196 -0
  123. package/src/components/Builder_Helpers.res.mjs +142 -0
  124. package/src/components/Cloner.res +84 -0
  125. package/src/components/Cloner.res.mjs +88 -0
  126. package/src/components/CommandGenerator/CommandGenerator.res +54 -0
  127. package/src/components/CommandGenerator/CommandGenerator.res.mjs +15 -0
  128. package/src/components/CommandGenerator/CommandGenerator_Adapter.res +22 -0
  129. package/src/components/CommandGenerator/CommandGenerator_Adapter.res.mjs +2 -0
  130. package/src/components/CommandGenerator/CommandGenerator_Builder.res +70 -0
  131. package/src/components/CommandGenerator/CommandGenerator_Builder.res.mjs +68 -0
  132. package/src/components/CommandGenerator/CommandGenerator_Callback.res +191 -0
  133. package/src/components/CommandGenerator/CommandGenerator_Callback.res.mjs +161 -0
  134. package/src/components/CommandTopic/CommandTopic.res +79 -0
  135. package/src/components/CommandTopic/CommandTopic.res.mjs +68 -0
  136. package/src/components/CommandTopic/CommandTopic_Adapter.res +53 -0
  137. package/src/components/CommandTopic/CommandTopic_Adapter.res.mjs +2 -0
  138. package/src/components/CommandTopic/CommandTopic_Builder.res +146 -0
  139. package/src/components/CommandTopic/CommandTopic_Builder.res.mjs +127 -0
  140. package/src/components/CommandTopic/CommandTopic_Callback.res +38 -0
  141. package/src/components/CommandTopic/CommandTopic_Callback.res.mjs +49 -0
  142. package/src/components/CommandTopic/CommandTopic_Helpers.res +176 -0
  143. package/src/components/CommandTopic/CommandTopic_Helpers.res.mjs +195 -0
  144. package/src/components/CommandTopic/CommandTopic_Operations.res +40 -0
  145. package/src/components/CommandTopic/CommandTopic_Operations.res.mjs +49 -0
  146. package/src/components/Component.res +1 -0
  147. package/src/components/Component.res.mjs +34 -0
  148. package/src/components/Component.resi +1 -0
  149. package/src/components/Counter/Counter.res +47 -0
  150. package/src/components/Counter/Counter.res.mjs +55 -0
  151. package/src/components/Counter/Counter_Adapter.res +18 -0
  152. package/src/components/Counter/Counter_Adapter.res.mjs +2 -0
  153. package/src/components/Counter/Counter_Builder.res +142 -0
  154. package/src/components/Counter/Counter_Builder.res.mjs +112 -0
  155. package/src/components/Counter/Counter_Callback.res +94 -0
  156. package/src/components/Counter/Counter_Callback.res.mjs +70 -0
  157. package/src/components/Counter/Counter_Operations.res +70 -0
  158. package/src/components/Counter/Counter_Operations.res.mjs +91 -0
  159. package/src/components/Dcb/Dcb_Builder.res +971 -0
  160. package/src/components/Dcb/Dcb_Builder.res.mjs +572 -0
  161. package/src/components/DcbEventLog/DcbEventLog.res +43 -0
  162. package/src/components/DcbEventLog/DcbEventLog.res.mjs +24 -0
  163. package/src/components/DcbEventLog/DcbEventLog_Adapter.res +57 -0
  164. package/src/components/DcbEventLog/DcbEventLog_Adapter.res.mjs +2 -0
  165. package/src/components/DcbEventLog/DcbEventLog_Builder.res +72 -0
  166. package/src/components/DcbEventLog/DcbEventLog_Builder.res.mjs +67 -0
  167. package/src/components/DcbEventLog/DcbEventLog_Operations.res +160 -0
  168. package/src/components/DcbEventLog/DcbEventLog_Operations.res.mjs +121 -0
  169. package/src/components/EventCollector/EventCollector.res +34 -0
  170. package/src/components/EventCollector/EventCollector.res.mjs +9 -0
  171. package/src/components/EventCollector/EventCollector_Adapter.res +45 -0
  172. package/src/components/EventCollector/EventCollector_Adapter.res.mjs +2 -0
  173. package/src/components/EventCollector/EventCollector_Builder.res +91 -0
  174. package/src/components/EventCollector/EventCollector_Builder.res.mjs +64 -0
  175. package/src/components/EventLog/EventLog.res +27 -0
  176. package/src/components/EventLog/EventLog.res.mjs +13 -0
  177. package/src/components/EventLog/EventLog_Adapter.res +15 -0
  178. package/src/components/EventLog/EventLog_Adapter.res.mjs +2 -0
  179. package/src/components/EventLog/EventLog_Builder.res +65 -0
  180. package/src/components/EventLog/EventLog_Builder.res.mjs +57 -0
  181. package/src/components/EventLog/EventLog_Operations.res +209 -0
  182. package/src/components/EventLog/EventLog_Operations.res.mjs +202 -0
  183. package/src/components/EventLog/EventPublish_Callback.res +29 -0
  184. package/src/components/EventLog/EventPublish_Callback.res.mjs +32 -0
  185. package/src/components/EventMapper/EventMapper.res +72 -0
  186. package/src/components/EventMapper/EventMapper.res.mjs +54 -0
  187. package/src/components/EventMapper/EventMapper_Builder.res +128 -0
  188. package/src/components/EventMapper/EventMapper_Builder.res.mjs +81 -0
  189. package/src/components/EventMapper/EventMapper_Callback.res +323 -0
  190. package/src/components/EventMapper/EventMapper_Callback.res.mjs +231 -0
  191. package/src/components/EventTopic/EventTopic.res +69 -0
  192. package/src/components/EventTopic/EventTopic.res.mjs +50 -0
  193. package/src/components/EventTopic/EventTopic_Adapter.res +15 -0
  194. package/src/components/EventTopic/EventTopic_Adapter.res.mjs +2 -0
  195. package/src/components/EventTopic/EventTopic_Builder.res +53 -0
  196. package/src/components/EventTopic/EventTopic_Builder.res.mjs +46 -0
  197. package/src/components/EventTopic/EventTopic_Operations.res +37 -0
  198. package/src/components/EventTopic/EventTopic_Operations.res.mjs +39 -0
  199. package/src/components/Extension/Extension.res +32 -0
  200. package/src/components/Extension/Extension.res.mjs +9 -0
  201. package/src/components/Extension/Extension_Builder.res +82 -0
  202. package/src/components/Extension/Extension_Builder.res.mjs +57 -0
  203. package/src/components/Extension/Extension_Operations.res +203 -0
  204. package/src/components/Extension/Extension_Operations.res.mjs +154 -0
  205. package/src/components/ExtensionPoint/ExtensionPoint.res +49 -0
  206. package/src/components/ExtensionPoint/ExtensionPoint.res.mjs +25 -0
  207. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res +163 -0
  208. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res.mjs +113 -0
  209. package/src/components/ExtensionPoint/ExtensionPoint_Callback.res +110 -0
  210. package/src/components/ExtensionPoint/ExtensionPoint_Callback.res.mjs +76 -0
  211. package/src/components/ExtensionPoint/ExtensionPoint_Operations.res +146 -0
  212. package/src/components/ExtensionPoint/ExtensionPoint_Operations.res.mjs +122 -0
  213. package/src/components/Heartbeat/Heartbeat.res +25 -0
  214. package/src/components/Heartbeat/Heartbeat.res.mjs +9 -0
  215. package/src/components/Heartbeat/Heartbeat_Adapter.res +14 -0
  216. package/src/components/Heartbeat/Heartbeat_Adapter.res.mjs +2 -0
  217. package/src/components/Heartbeat/Heartbeat_Builder.res +43 -0
  218. package/src/components/Heartbeat/Heartbeat_Builder.res.mjs +47 -0
  219. package/src/components/Heartbeat/Heartbeat_Callback.res +32 -0
  220. package/src/components/Heartbeat/Heartbeat_Callback.res.mjs +40 -0
  221. package/src/components/InboundTranslationSlice/InboundTranslationSlice.res +34 -0
  222. package/src/components/InboundTranslationSlice/InboundTranslationSlice.res.mjs +24 -0
  223. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res +98 -0
  224. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res.mjs +87 -0
  225. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res +191 -0
  226. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res.mjs +175 -0
  227. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res +35 -0
  228. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res.mjs +24 -0
  229. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res +181 -0
  230. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res.mjs +137 -0
  231. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res +173 -0
  232. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res.mjs +173 -0
  233. package/src/components/QueryDb/QueryDb.res +74 -0
  234. package/src/components/QueryDb/QueryDb.res.mjs +37 -0
  235. package/src/components/QueryDb/QueryDb_Adapter.res +78 -0
  236. package/src/components/QueryDb/QueryDb_Adapter.res.mjs +17 -0
  237. package/src/components/QueryDb/QueryDb_Builder.res +76 -0
  238. package/src/components/QueryDb/QueryDb_Builder.res.mjs +53 -0
  239. package/src/components/QueryDb/QueryDb_Callback.res +18 -0
  240. package/src/components/QueryDb/QueryDb_Callback.res.mjs +21 -0
  241. package/src/components/QueryDb/QueryDb_Operations.res +116 -0
  242. package/src/components/QueryDb/QueryDb_Operations.res.mjs +165 -0
  243. package/src/components/ReadModel/ReadModel.res +42 -0
  244. package/src/components/ReadModel/ReadModel.res.mjs +27 -0
  245. package/src/components/ReadModel/ReadModel_Builder.res +155 -0
  246. package/src/components/ReadModel/ReadModel_Builder.res.mjs +101 -0
  247. package/src/components/ReadModel/ReadModel_Callback.res +48 -0
  248. package/src/components/ReadModel/ReadModel_Callback.res.mjs +48 -0
  249. package/src/components/Scheduler/Scheduler.res +13 -0
  250. package/src/components/Scheduler/Scheduler.res.mjs +9 -0
  251. package/src/components/Scheduler/Scheduler_Adapter.res +13 -0
  252. package/src/components/Scheduler/Scheduler_Adapter.res.mjs +2 -0
  253. package/src/components/Scheduler/Scheduler_Builder.res +19 -0
  254. package/src/components/Scheduler/Scheduler_Builder.res.mjs +29 -0
  255. package/src/components/SideEffectHandler/SideEffectHandler.res +30 -0
  256. package/src/components/SideEffectHandler/SideEffectHandler.res.mjs +12 -0
  257. package/src/components/SideEffectHandler/SideEffectHandler_Builder.res +117 -0
  258. package/src/components/SideEffectHandler/SideEffectHandler_Builder.res.mjs +64 -0
  259. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res +116 -0
  260. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res.mjs +95 -0
  261. package/src/components/StateChangeSlice/StateChangeSlice.res +38 -0
  262. package/src/components/StateChangeSlice/StateChangeSlice.res.mjs +17 -0
  263. package/src/components/StateChangeSlice/StateChangeSlice_Builder.res +91 -0
  264. package/src/components/StateChangeSlice/StateChangeSlice_Builder.res.mjs +81 -0
  265. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +412 -0
  266. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res.mjs +299 -0
  267. package/src/components/StateTopic.res +91 -0
  268. package/src/components/StateTopic.res.mjs +41 -0
  269. package/src/components/StateViewSlice/StateViewSlice.res +33 -0
  270. package/src/components/StateViewSlice/StateViewSlice.res.mjs +24 -0
  271. package/src/components/StateViewSlice/StateViewSlice_Builder.res +176 -0
  272. package/src/components/StateViewSlice/StateViewSlice_Builder.res.mjs +134 -0
  273. package/src/components/StateViewSlice/StateViewSlice_Callback.res +64 -0
  274. package/src/components/StateViewSlice/StateViewSlice_Callback.res.mjs +56 -0
  275. package/src/components/Task/Task.res +81 -0
  276. package/src/components/Task/Task.res.mjs +51 -0
  277. package/src/components/Task/Task_Adapter.res +31 -0
  278. package/src/components/Task/Task_Adapter.res.mjs +2 -0
  279. package/src/components/Task/Task_Builder.res +223 -0
  280. package/src/components/Task/Task_Builder.res.mjs +115 -0
  281. package/src/plugin/api/PluginBaseFragment.res +104 -0
  282. package/src/plugin/api/PluginBaseFragment.res.mjs +64 -0
  283. package/src/plugin/component/Plugin.res +100 -0
  284. package/src/plugin/component/Plugin.res.mjs +61 -0
  285. package/src/plugin/component/Plugin_Builder.res +1017 -0
  286. package/src/plugin/component/Plugin_Builder.res.mjs +608 -0
  287. package/src/plugin/component/Plugin_BuiltHook.res +141 -0
  288. package/src/plugin/component/Plugin_BuiltHook.res.mjs +39 -0
  289. package/src/plugin/component/Plugin_Callback.res +98 -0
  290. package/src/plugin/component/Plugin_Callback.res.mjs +55 -0
  291. package/src/plugin/component/Plugin_Helpers.res +1730 -0
  292. package/src/plugin/component/Plugin_Helpers.res.mjs +1010 -0
  293. package/src/plugin/component/Plugin_ResolverError.res +27 -0
  294. package/src/plugin/component/Plugin_ResolverError.res.mjs +21 -0
  295. package/src/plugin/component/Plugin_Structure.res +570 -0
  296. package/src/plugin/component/Plugin_Structure.res.mjs +458 -0
  297. package/src/plugin/component/Plugin_SubscriptionSchema.res +103 -0
  298. package/src/plugin/component/Plugin_SubscriptionSchema.res.mjs +71 -0
  299. package/src/plugin/component/SchemaWalker.res +164 -0
  300. package/src/plugin/component/SchemaWalker.res.mjs +183 -0
  301. package/src/plugin/connect/PluginConnectExtension_Builder.res +14 -0
  302. package/src/plugin/connect/PluginConnectExtension_Builder.res.mjs +36 -0
  303. package/src/plugin/connect/PluginConnectExtension_Mapping.res +76 -0
  304. package/src/plugin/connect/PluginConnectExtension_Mapping.res.mjs +89 -0
  305. package/src/plugin/connect/PluginExtensionPoint_Builder.res +39 -0
  306. package/src/plugin/connect/PluginExtensionPoint_Builder.res.mjs +33 -0
  307. package/src/plugin/connect/PluginExtensionPoint_Plugin.res +231 -0
  308. package/src/plugin/connect/PluginExtensionPoint_Plugin.res.mjs +353 -0
  309. package/src/plugin/lifecycle/PluginBehavior.res +250 -0
  310. package/src/plugin/lifecycle/PluginBehavior.res.mjs +391 -0
  311. package/src/plugin/lifecycle/PluginSpec.res +84 -0
  312. package/src/plugin/lifecycle/PluginSpec.res.mjs +148 -0
  313. package/src/plugin/lifecycle/PluginsProjection.res +154 -0
  314. package/src/plugin/lifecycle/PluginsProjection.res.mjs +230 -0
  315. package/src/plugin/lifecycle/PluginsReadModelSpec.res +66 -0
  316. package/src/plugin/lifecycle/PluginsReadModelSpec.res.mjs +58 -0
  317. package/src/util/AWS.res +7 -0
  318. package/src/util/AWS.res.mjs +20 -0
  319. package/src/util/CSV.res +27 -0
  320. package/src/util/CSV.res.mjs +56 -0
  321. package/src/util/CommandPublisher.res +133 -0
  322. package/src/util/CommandPublisher.res.mjs +161 -0
  323. package/src/util/CsvStream.res +39 -0
  324. package/src/util/CsvStream.res.mjs +42 -0
  325. package/src/util/EffectLogger.res +178 -0
  326. package/src/util/EffectLogger.res.mjs +171 -0
  327. package/src/util/FTP.res +69 -0
  328. package/src/util/FTP.res.mjs +101 -0
  329. package/src/util/FTPHandler.res +142 -0
  330. package/src/util/FTPHandler.res.mjs +136 -0
  331. package/src/util/Hash.res +1 -0
  332. package/src/util/Hash.res.mjs +10 -0
  333. package/src/util/Interstack.res +74 -0
  334. package/src/util/Interstack.res.mjs +126 -0
  335. package/src/util/Interstack.resi +25 -0
  336. package/src/util/LogFormat.res +222 -0
  337. package/src/util/LogFormat.res.mjs +257 -0
  338. package/src/util/Logger.res +196 -0
  339. package/src/util/Logger.res.mjs +238 -0
  340. package/src/util/Lru.res +51 -0
  341. package/src/util/Lru.res.mjs +59 -0
  342. package/src/util/Lru.resi +32 -0
  343. package/src/util/Metrics.res +32 -0
  344. package/src/util/Metrics.res.mjs +42 -0
  345. package/src/util/OutputFailsafeDeploytime.res +16 -0
  346. package/src/util/OutputFailsafeDeploytime.res.mjs +20 -0
  347. package/src/util/OutputFailsafeRuntime.res +6 -0
  348. package/src/util/OutputFailsafeRuntime.res.mjs +15 -0
  349. package/src/util/OutputLogger.res +9 -0
  350. package/src/util/OutputLogger.res.mjs +19 -0
  351. package/src/util/ResourceQuery.res +14 -0
  352. package/src/util/ResourceQuery.res.mjs +17 -0
  353. package/src/util/ResourceQueryRuntime.res +17 -0
  354. package/src/util/ResourceQueryRuntime.res.mjs +18 -0
  355. package/src/util/ScheduleOps.res +124 -0
  356. package/src/util/ScheduleOps.res.mjs +132 -0
  357. package/src/util/Util.res +12 -0
  358. package/src/util/Util.res.mjs +42 -0
  359. package/src/util/Util_Adapter.res +97 -0
  360. package/src/util/Util_Adapter.res.mjs +82 -0
  361. package/src/util/Util_AdapterRuntime.res +39 -0
  362. package/src/util/Util_AdapterRuntime.res.mjs +42 -0
  363. package/src/util/Util_Array.res +2 -0
  364. package/src/util/Util_Array.res.mjs +12 -0
  365. package/src/util/Util_Error.res +16 -0
  366. package/src/util/Util_Error.res.mjs +19 -0
  367. package/src/util/Util_Promise.res +67 -0
  368. package/src/util/Util_Promise.res.mjs +105 -0
  369. package/src/util/Util_Pulumi.res +35 -0
  370. package/src/util/Util_Pulumi.res.mjs +55 -0
  371. package/src/util/Util_Pulumi.resi +21 -0
  372. package/src/util/Util_QueryDb.res +14 -0
  373. package/src/util/Util_QueryDb.res.mjs +21 -0
  374. package/src/util/Util_QueryDbRuntime.res +11 -0
  375. package/src/util/Util_QueryDbRuntime.res.mjs +19 -0
  376. package/src/util/Util_ReadModel.res +2 -0
  377. package/src/util/Util_ReadModel.res.mjs +10 -0
  378. package/src/util/Util_StackRefs.res +24 -0
  379. package/src/util/Util_StackRefs.res.mjs +39 -0
  380. package/src/util/Validation.res +75 -0
  381. package/src/util/Validation.res.mjs +181 -0
  382. package/tests/.gitkeep +0 -0
  383. package/tests/IdentityTest.res +155 -0
  384. package/tests/IdentityTest.res.mjs +174 -0
  385. package/tests/admin/Platform_ComponentDefinitionsApiTest.res +237 -0
  386. package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +298 -0
  387. package/tests/admin/Platform_UIFragmentsApiTest.res +96 -0
  388. package/tests/admin/Platform_UIFragmentsApiTest.res.mjs +101 -0
  389. package/tests/aggregate/AggregateCallbackTest.res +81 -0
  390. package/tests/aggregate/AggregateCallbackTest.res.mjs +140 -0
  391. package/tests/aggregate/AggregateCausationTest.res +49 -0
  392. package/tests/aggregate/AggregateCausationTest.res.mjs +44 -0
  393. package/tests/aggregate/AggregateConflictTest.res +212 -0
  394. package/tests/aggregate/AggregateConflictTest.res.mjs +363 -0
  395. package/tests/aggregate/AggregateFixtures.res +177 -0
  396. package/tests/aggregate/AggregateFixtures.res.mjs +285 -0
  397. package/tests/aggregate/AggregateRejectionTest.res +139 -0
  398. package/tests/aggregate/AggregateRejectionTest.res.mjs +163 -0
  399. package/tests/api/ApiNoApiTest.res +62 -0
  400. package/tests/api/ApiNoApiTest.res.mjs +90 -0
  401. package/tests/api/GraphQL_StitcherTest.res +107 -0
  402. package/tests/api/GraphQL_StitcherTest.res.mjs +99 -0
  403. package/tests/api/SimpleTest.res +7 -0
  404. package/tests/api/SimpleTest.res.mjs +10 -0
  405. package/tests/api/SuryToJsonSchemaTest.res +405 -0
  406. package/tests/api/SuryToJsonSchemaTest.res.mjs +623 -0
  407. package/tests/commandgenerator/CommandGeneratorCallbackTest.res +128 -0
  408. package/tests/commandgenerator/CommandGeneratorCallbackTest.res.mjs +160 -0
  409. package/tests/commandgenerator/CommandGeneratorFixtures.res +139 -0
  410. package/tests/commandgenerator/CommandGeneratorFixtures.res.mjs +197 -0
  411. package/tests/commandtopic/CommandTopicCallbackFixtures.res +87 -0
  412. package/tests/commandtopic/CommandTopicCallbackFixtures.res.mjs +152 -0
  413. package/tests/commandtopic/CommandTopicCallbackTest.res +66 -0
  414. package/tests/commandtopic/CommandTopicCallbackTest.res.mjs +106 -0
  415. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res +83 -0
  416. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res.mjs +109 -0
  417. package/tests/counter/CounterCallbackTest.res +83 -0
  418. package/tests/counter/CounterCallbackTest.res.mjs +140 -0
  419. package/tests/counter/CounterFixtures.res +57 -0
  420. package/tests/counter/CounterFixtures.res.mjs +67 -0
  421. package/tests/dcb/DcbDecodeTest.res +122 -0
  422. package/tests/dcb/DcbDecodeTest.res.mjs +194 -0
  423. package/tests/dcb/DcbEventLogOperationsTest.res +195 -0
  424. package/tests/dcb/DcbEventLogOperationsTest.res.mjs +268 -0
  425. package/tests/dcb/DcbFixtures.res +422 -0
  426. package/tests/dcb/DcbFixtures.res.mjs +534 -0
  427. package/tests/dcb/DcbScopeInferenceTest.res +242 -0
  428. package/tests/dcb/DcbScopeInferenceTest.res.mjs +480 -0
  429. package/tests/dcb/DcbStateChangeSliceTest.res +362 -0
  430. package/tests/dcb/DcbStateChangeSliceTest.res.mjs +546 -0
  431. package/tests/dcb/DcbTagTest.res +978 -0
  432. package/tests/dcb/DcbTagTest.res.mjs +867 -0
  433. package/tests/dcb/DcbValidationTest.res +349 -0
  434. package/tests/dcb/DcbValidationTest.res.mjs +476 -0
  435. package/tests/eventlog/EventLogFixtures.res +113 -0
  436. package/tests/eventlog/EventLogFixtures.res.mjs +166 -0
  437. package/tests/eventlog/EventLogOperationsTest.res +96 -0
  438. package/tests/eventlog/EventLogOperationsTest.res.mjs +192 -0
  439. package/tests/eventlog/EventLogRetryTest.res +121 -0
  440. package/tests/eventlog/EventLogRetryTest.res.mjs +171 -0
  441. package/tests/eventmapper/EventMapperCallbackTest.res +134 -0
  442. package/tests/eventmapper/EventMapperCallbackTest.res.mjs +141 -0
  443. package/tests/eventmapper/EventMapperFixtures.res +255 -0
  444. package/tests/eventmapper/EventMapperFixtures.res.mjs +440 -0
  445. package/tests/eventmapper/EventMapperTest.res +53 -0
  446. package/tests/eventmapper/EventMapperTest.res.mjs +83 -0
  447. package/tests/eventtopic/EventTopicFixtures.res +36 -0
  448. package/tests/eventtopic/EventTopicFixtures.res.mjs +65 -0
  449. package/tests/eventtopic/EventTopicOperationsTest.res +48 -0
  450. package/tests/eventtopic/EventTopicOperationsTest.res.mjs +71 -0
  451. package/tests/extensionpoint/ExtensionPointCallbackTest.res +84 -0
  452. package/tests/extensionpoint/ExtensionPointCallbackTest.res.mjs +94 -0
  453. package/tests/extensionpoint/ExtensionPointFixtures.res +173 -0
  454. package/tests/extensionpoint/ExtensionPointFixtures.res.mjs +205 -0
  455. package/tests/extensionpoint/ExtensionPointOperationsTest.res +261 -0
  456. package/tests/extensionpoint/ExtensionPointOperationsTest.res.mjs +304 -0
  457. package/tests/ftp/FTPTest.res +64 -0
  458. package/tests/ftp/FTPTest.res.mjs +88 -0
  459. package/tests/logger/LogFormatTest.res +348 -0
  460. package/tests/logger/LogFormatTest.res.mjs +309 -0
  461. package/tests/message/MessageTest.res +95 -0
  462. package/tests/message/MessageTest.res.mjs +93 -0
  463. package/tests/message/MetaEnvelopeTest.res +200 -0
  464. package/tests/message/MetaEnvelopeTest.res.mjs +188 -0
  465. package/tests/plugin/ManifestVisibilityTest.res +137 -0
  466. package/tests/plugin/ManifestVisibilityTest.res.mjs +205 -0
  467. package/tests/plugin/PluginSpecExperiment.res +13 -0
  468. package/tests/plugin/PluginSpecExperiment.res.mjs +31 -0
  469. package/tests/plugin/PluginStructureTest.res +298 -0
  470. package/tests/plugin/PluginStructureTest.res.mjs +388 -0
  471. package/tests/plugin/PluginVersionTest.res +34 -0
  472. package/tests/plugin/PluginVersionTest.res.mjs +30 -0
  473. package/tests/plugin/SchemaWalkerTest.res +115 -0
  474. package/tests/plugin/SchemaWalkerTest.res.mjs +160 -0
  475. package/tests/plugin/StateChangeSlice/PsPlaceOrder.res +24 -0
  476. package/tests/plugin/StateChangeSlice/PsPlaceOrder.res.mjs +62 -0
  477. package/tests/plugin/StateChangeSlice/PsShipOrder.res +29 -0
  478. package/tests/plugin/StateChangeSlice/PsShipOrder.res.mjs +69 -0
  479. package/tests/plugin/StateViewSlice/PsAnnotatedView.res +24 -0
  480. package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +94 -0
  481. package/tests/plugin/StateViewSlice/PsAvailableProductsView.res +18 -0
  482. package/tests/plugin/StateViewSlice/PsAvailableProductsView.res.mjs +69 -0
  483. package/tests/plugin/StateViewSlice/PsCustomersView.res +22 -0
  484. package/tests/plugin/StateViewSlice/PsCustomersView.res.mjs +69 -0
  485. package/tests/plugin/StateViewSlice/PsOrdersView.res +20 -0
  486. package/tests/plugin/StateViewSlice/PsOrdersView.res.mjs +81 -0
  487. package/tests/poc/StructuralSubtypingPoc.res +211 -0
  488. package/tests/poc/StructuralSubtypingPoc.res.mjs +61 -0
  489. package/tests/querydb/QueryDbFixtures.res +65 -0
  490. package/tests/querydb/QueryDbFixtures.res.mjs +135 -0
  491. package/tests/querydb/QueryDbOperationsTest.res +94 -0
  492. package/tests/querydb/QueryDbOperationsTest.res.mjs +168 -0
  493. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res +56 -0
  494. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res.mjs +77 -0
  495. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res +96 -0
  496. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +139 -0
  497. package/tests/util/CsvStreamTest.res +54 -0
  498. package/tests/util/CsvStreamTest.res.mjs +51 -0
  499. package/tests/util/LruTest.res +73 -0
  500. package/tests/util/LruTest.res.mjs +105 -0
  501. package/tests/util/MetricsTest.res +36 -0
  502. package/tests/util/MetricsTest.res.mjs +53 -0
@@ -0,0 +1,612 @@
1
+ // GraphQL schema fragment generator.
2
+ // Derives GraphQL SDL fragments from sury schemas (commandSchema, stateSchema)
3
+ // using SchemaType as the shared intermediate representation.
4
+
5
+ open ReventlessInfra.Api
6
+
7
+ // Every aggregate-derived mutation returns the CommandResult union — the
8
+ // shape carries the outcome from CommandTopic processing (Accepted / Rejected
9
+ // for sync slices, Pending for async). Consumers select sub-fields via inline
10
+ // fragments. These SDL declarations are injected into any fragment that emits
11
+ // at least one mutation field; the stitcher dedupes by type name so
12
+ // concatenating across plugin + admin fragments stays safe.
13
+ let commandResultSdlTypes: array<string> = [
14
+ `union CommandResult = CommandAccepted | CommandRejected | CommandPending`,
15
+ `type CommandAccepted {
16
+ msgId: ID!
17
+ entityId: ID
18
+ eventCount: Int!
19
+ }`,
20
+ `type CommandRejected {
21
+ msgId: ID!
22
+ errorCode: String!
23
+ errorDetail: String
24
+ }`,
25
+ `type CommandPending {
26
+ msgId: ID!
27
+ }`,
28
+ ]
29
+
30
+ // ── SchemaType → GraphQL type reference ──────────────────────────────────────
31
+
32
+ let rec fromSchemaType = (
33
+ ~required: bool,
34
+ ~asInput: bool=false,
35
+ st: SchemaType.schemaType,
36
+ collectedTypes: array<string>,
37
+ seenTypes: Set.t<string>,
38
+ ): string => {
39
+ let bang = required ? "!" : ""
40
+ switch st {
41
+ | ScalarString => `String${bang}`
42
+ | ScalarNumber => `Float${bang}`
43
+ | ScalarBoolean => `Boolean${bang}`
44
+ | ScalarBigInt => `String${bang}`
45
+ | EntityId => `ID${bang}`
46
+ | Nullable(inner) => fromSchemaType(~required=false, ~asInput, inner, collectedTypes, seenTypes)
47
+ | ArrayOf(item) =>
48
+ let itemType = fromSchemaType(~required=true, ~asInput, item, collectedTypes, seenTypes)
49
+ `[${itemType}]${bang}`
50
+ | ObjectRef(name, fields) =>
51
+ if !(seenTypes->Set.has(name)) {
52
+ seenTypes->Set.add(name)
53
+ let typeDef = objectRefToGraphQL(~asInput, name, fields, collectedTypes, seenTypes)
54
+ collectedTypes->Array.push(typeDef)
55
+ }
56
+ `${name}${bang}`
57
+ | Enum(name, values) =>
58
+ if !(seenTypes->Set.has(name)) {
59
+ seenTypes->Set.add(name)
60
+ let valuesStr = values->Array.join("\n ")
61
+ collectedTypes->Array.push(`enum ${name} {\n ${valuesStr}\n}`)
62
+ }
63
+ `${name}${bang}`
64
+ | Unknown => `String${bang}`
65
+ }
66
+ }
67
+
68
+ and objectRefToGraphQL = (
69
+ ~asInput: bool=false,
70
+ typeName: string,
71
+ fields: dict<SchemaType.schemaType>,
72
+ collectedTypes: array<string>,
73
+ seenTypes: Set.t<string>,
74
+ ): string => {
75
+ let fieldStrs =
76
+ fields
77
+ ->Dict.toArray
78
+ ->Array.map(((fieldName, fieldType)) => {
79
+ let gqlType = fromSchemaType(~required=true, ~asInput, fieldType, collectedTypes, seenTypes)
80
+ ` ${fieldName}: ${gqlType}`
81
+ })
82
+ ->Array.join("\n")
83
+ let keyword = asInput ? "input" : "type"
84
+ `${keyword} ${typeName} {\n${fieldStrs}\n}`
85
+ }
86
+
87
+ // ── Legacy bridge: sury → GraphQL via SchemaType ─────────────────────────────
88
+
89
+ let deriveFieldType = (
90
+ ~parentTypeName: string,
91
+ ~fieldName: string,
92
+ ~required: bool,
93
+ fieldSchema: S.t<unknown>,
94
+ collectedTypes: array<string>,
95
+ seenTypes: Set.t<string>,
96
+ ): string => {
97
+ let st = SchemaType.fromSury(~parentName=parentTypeName, ~fieldName, fieldSchema)
98
+ fromSchemaType(~required, st, collectedTypes, seenTypes)
99
+ }
100
+
101
+ // ── Object type derivation ─────────────────────────────────────────────────
102
+
103
+ let deriveObjectTypeWithNested = (
104
+ ~typeName: string,
105
+ ~excludeFields: array<string>=[],
106
+ ~includeIdParam: bool=true,
107
+ schema: S.t<unknown>,
108
+ ): array<string> =>
109
+ switch SchemaType.fromSuryObject(~typeName, schema) {
110
+ | Some(fields) =>
111
+ let filteredFields = if excludeFields->Array.length > 0 {
112
+ let d = Dict.make()
113
+ fields
114
+ ->Dict.toArray
115
+ ->Array.forEach(((k, v)) => {
116
+ if !(excludeFields->Array.some(ex => ex == k)) {
117
+ d->Dict.set(k, v)
118
+ }
119
+ })
120
+ d
121
+ } else {
122
+ fields
123
+ }
124
+ let collectedTypes: array<string> = []
125
+ let seenTypes = Set.make()
126
+ seenTypes->Set.add(typeName)
127
+ let mainType = objectRefToGraphQL(typeName, filteredFields, collectedTypes, seenTypes)
128
+ let mainTypeWithId = if includeIdParam {
129
+ mainType->String.replace(
130
+ `type ${typeName} {\n`,
131
+ `type ${typeName} implements Node {\n id: ID!\n`,
132
+ )
133
+ } else {
134
+ mainType
135
+ }
136
+ Array.concat(collectedTypes, [mainTypeWithId])
137
+ | None => []
138
+ }
139
+
140
+ let derivePluralWrapperType = (~pluralTypeName: string, ~singularTypeName: string): string =>
141
+ `type ${pluralTypeName} {\n nextToken: String\n scannedCount: Int!\n items: [${singularTypeName}!]!\n}`
142
+
143
+ let deriveConnectionTypes = (~singularTypeName: string): array<string> => [
144
+ `type ${singularTypeName}Edge {\n node: ${singularTypeName}!\n cursor: String!\n}`,
145
+ `type ${singularTypeName}Connection {\n edges: [${singularTypeName}Edge!]!\n pageInfo: PageInfo!\n}`,
146
+ ]
147
+
148
+ let deriveSubIdFilterType = (~filterTypeName: string): string =>
149
+ `input ${filterTypeName} {\n prefix: String\n from: String\n to: String\n eq: String\n order: SortOrder\n}`
150
+
151
+ // ── Server-side filter / sort capability ─────────────────────────────────────
152
+ // Derived from the structural annotations carried on the state schema
153
+ // (`@id`, `@compositeId`, `@subId`, `@compositeSubId`, `@index`). Both the
154
+ // SDL emitter and the in-memory resolver consume the same record so the
155
+ // emitted Filter / OrderBy and the runtime narrow / sort cannot drift.
156
+
157
+ type filterField = {
158
+ name: string,
159
+ gqlType: string,
160
+ range: bool,
161
+ }
162
+
163
+ type serverCapability = {
164
+ filterFields: array<filterField>,
165
+ sortFields: array<string>,
166
+ }
167
+
168
+ let emptyCapability: serverCapability = {filterFields: [], sortFields: []}
169
+
170
+ // Convert a SchemaType.schemaType to its GraphQL scalar name (input position).
171
+ // Mirrors the scalar branches of fromSchemaType — kept inline because we don't
172
+ // emit `!`/list wrappers for filter inputs.
173
+ let scalarOfSchemaType = (st: SchemaType.schemaType): string =>
174
+ switch st {
175
+ | ScalarString => "String"
176
+ | ScalarNumber => "Float"
177
+ | ScalarBoolean => "Boolean"
178
+ | ScalarBigInt => "String"
179
+ | EntityId => "ID"
180
+ | _ => "String"
181
+ }
182
+
183
+ let deriveServerCapability = (schema: S.t<unknown>): serverCapability => {
184
+ switch Reventless.StateAnnotations.getSpec(schema) {
185
+ | None => emptyCapability
186
+ | Some(spec) =>
187
+ let fieldTypes = SchemaType.fromSuryObject(~typeName="", schema)->Option.getOr(Dict.make())
188
+ let scalarOf = (fieldName: string): string =>
189
+ fieldTypes->Dict.get(fieldName)->Option.mapOr("String", scalarOfSchemaType)
190
+
191
+ let filterFields: array<filterField> = []
192
+ let sortFields: array<string> = []
193
+ let seenFilter: Set.t<string> = Set.make()
194
+ let seenSort: Set.t<string> = Set.make()
195
+
196
+ let pushFilter = (name, ~range) =>
197
+ if !(seenFilter->Set.has(name)) {
198
+ seenFilter->Set.add(name)
199
+ filterFields->Array.push({name, gqlType: scalarOf(name), range})
200
+ }
201
+ let pushSort = name =>
202
+ if !(seenSort->Set.has(name)) {
203
+ seenSort->Set.add(name)
204
+ sortFields->Array.push(name)
205
+ }
206
+
207
+ spec.ids->Array.forEach(name => {
208
+ pushFilter(name, ~range=false)
209
+ pushSort(name)
210
+ })
211
+ spec.compositeIds->Array.forEach(name => pushFilter(name, ~range=false))
212
+ spec.subIds->Array.forEach(name => {
213
+ pushFilter(name, ~range=true)
214
+ pushSort(name)
215
+ })
216
+ spec.compositeSubIds->Array.forEach(name => {
217
+ pushFilter(name, ~range=true)
218
+ pushSort(name)
219
+ })
220
+ spec.indexes->Array.forEach(((name, _indexName)) => {
221
+ pushFilter(name, ~range=false)
222
+ pushSort(name)
223
+ })
224
+ // @scan / @scanSort are explicit opt-ins for non-indexed fields. They
225
+ // expand the SDL surface only — the in-memory resolver's narrow / sort
226
+ // helpers already operate on arbitrary fields, so no additional code
227
+ // path is needed here.
228
+ spec.scan->Array.forEach(name => pushFilter(name, ~range=false))
229
+ spec.scanSort->Array.forEach(name => pushSort(name))
230
+
231
+ {filterFields, sortFields}
232
+ }
233
+ }
234
+
235
+ // Returns one warning per `@scanSort` field that is NOT also a sort key of the
236
+ // table or any GSI. The Scan-based AWS resolver evaluates such requests as a
237
+ // JS-runtime per-page sort over a full Scan — correct, but expensive. The
238
+ // schema author should either point the field at an index sort key or
239
+ // explicitly accept the per-page-sort caveat. Returns [] when validation is
240
+ // not applicable (no schema, no `@scanSort` fields).
241
+ let validateScanSortAlignment = (
242
+ ~schema: S.t<unknown>,
243
+ ~readModelName: string,
244
+ ~knownSortFields: array<string>,
245
+ ): array<string> =>
246
+ switch Reventless.StateAnnotations.getSpec(schema) {
247
+ | None => []
248
+ | Some(spec) =>
249
+ spec.scanSort->Array.filterMap(field =>
250
+ if knownSortFields->Array.includes(field) {
251
+ None
252
+ } else {
253
+ Some(
254
+ `Read model "${readModelName}": @scanSort field "${field}" is not the sort key of any table or GSI. Sort requests for this field will be evaluated as a JS-runtime per-page sort over a full Scan — expensive in production. Add it as the sort key of an index, or accept the per-page-sort caveat.`,
255
+ )
256
+ }
257
+ )
258
+ }
259
+
260
+ let deriveConnectionFilterType = (
261
+ ~filterTypeName: string,
262
+ ~capability: serverCapability=emptyCapability,
263
+ ): string => {
264
+ let baseFields = ["search: String", "searchPrefix: String", "ids: [ID!]"]
265
+ let perFieldFilters =
266
+ capability.filterFields->Array.flatMap(f => {
267
+ let eq = `${f.name}Eq: ${f.gqlType}`
268
+ if f.range {
269
+ [eq, `${f.name}From: ${f.gqlType}`, `${f.name}To: ${f.gqlType}`]
270
+ } else {
271
+ [eq]
272
+ }
273
+ })
274
+ let allFields = Array.concat(baseFields, perFieldFilters)
275
+ let body = allFields->Array.map(f => ` ${f}`)->Array.join("\n")
276
+ `input ${filterTypeName} {\n${body}\n}`
277
+ }
278
+
279
+ // Emits an `enum <Type>OrderField` and `input <Type>OrderBy` pair when the
280
+ // capability has any sort fields. Returns [] when no field is sortable so
281
+ // the connection field doesn't reference a non-existent OrderBy type.
282
+ let deriveConnectionOrderByType = (
283
+ ~singularTypeName: string,
284
+ ~capability: serverCapability,
285
+ ): array<string> =>
286
+ if capability.sortFields->Array.length == 0 {
287
+ []
288
+ } else {
289
+ let orderFieldEnumName = singularTypeName ++ "OrderField"
290
+ let orderByInputName = singularTypeName ++ "OrderBy"
291
+ let valuesStr = capability.sortFields->Array.map(f => ` ${f}`)->Array.join("\n")
292
+ [
293
+ `enum ${orderFieldEnumName} {\n${valuesStr}\n}`,
294
+ `input ${orderByInputName} {\n field: ${orderFieldEnumName}!\n direction: SortOrder!\n}`,
295
+ ]
296
+ }
297
+
298
+ let deriveItemsQueryField = (
299
+ ~singleFieldName: string,
300
+ ~returnTypeName: string,
301
+ ~filterTypeName: string,
302
+ ): string =>
303
+ ` ${singleFieldName}Items(id: ID!, filter: ${filterTypeName}, first: Int, after: String, last: Int, before: String): ${returnTypeName}Connection!`
304
+
305
+ // ── Query field derivation ─────────────────────────────────────────────────
306
+
307
+ let deriveObjectQueryField = (
308
+ ~singleFieldName: string,
309
+ ~typeName: string,
310
+ ~includeIdParam: bool=true,
311
+ ~subIdField: option<string>=?,
312
+ ): string =>
313
+ if includeIdParam {
314
+ switch subIdField {
315
+ | Some(sortField) => ` ${singleFieldName}(id: ID!, ${sortField}: String!): ${typeName}`
316
+ | None => ` ${singleFieldName}(id: ID!): ${typeName}`
317
+ }
318
+ } else {
319
+ ` ${singleFieldName}: ${typeName}`
320
+ }
321
+
322
+ let deriveListQueryField = (
323
+ ~listFieldName: string,
324
+ ~pluralTypeName: string,
325
+ ): string =>
326
+ ` ${listFieldName}(nextToken: String, limit: Int): ${pluralTypeName}!`
327
+
328
+ // Batched-by-ids query: fetches multiple entities in a single BatchGetItem.
329
+ // Cardinality is not preserved (missing ids drop out of the response), so the
330
+ // caller correlates by `id` on each returned item. Single-key tables only —
331
+ // composite-key BatchGetItem requires both pk + sk per key entry, which is
332
+ // out of scope for this field.
333
+ let deriveByIdsQueryField = (
334
+ ~listFieldName: string,
335
+ ~returnTypeName: string,
336
+ ): string =>
337
+ ` ${listFieldName}ByIds(ids: [String!]!): [${returnTypeName}!]!`
338
+
339
+ let deriveConnectionQueryField = (
340
+ ~listFieldName: string,
341
+ ~singularTypeName: string,
342
+ ~filterTypeName: string,
343
+ ~hasOrderBy: bool=false,
344
+ ): string => {
345
+ let orderByArg = hasOrderBy ? `, orderBy: ${singularTypeName}OrderBy` : ""
346
+ ` ${listFieldName}(filter: ${filterTypeName}${orderByArg}, first: Int, after: String, last: Int, before: String): ${singularTypeName}Connection!`
347
+ }
348
+
349
+ // ── Mutation field derivation ──────────────────────────────────────────────
350
+
351
+ let deriveMutationFieldFromObject = (
352
+ ~fieldName: string,
353
+ ~collectedTypes: array<string>,
354
+ ~seenTypes: Set.t<string>,
355
+ variantSchema: S.t<unknown>,
356
+ ): option<string> =>
357
+ switch SchemaType.fromSuryObject(~typeName=fieldName, variantSchema) {
358
+ | Some(fields) =>
359
+ let args =
360
+ fields
361
+ ->Dict.toArray
362
+ ->Array.map(((argName, argType)) => {
363
+ let gqlType = fromSchemaType(
364
+ ~required=true,
365
+ ~asInput=true,
366
+ argType,
367
+ collectedTypes,
368
+ seenTypes,
369
+ )
370
+ `${argName}: ${gqlType}`
371
+ })
372
+ ->Array.join(", ")
373
+ let argsPart = args->String.length > 0 ? `(${args})` : ""
374
+ Some(` ${fieldName}${argsPart}: CommandResult!`)
375
+ | None => None
376
+ }
377
+
378
+ // ── Main generate function ─────────────────────────────────────────────────
379
+
380
+ let generate = (
381
+ ~mutationEntries: array<mutationSchemaEntry>,
382
+ ~queryEntries: array<querySchemaEntry>,
383
+ ): Reventless.Plugin.apiSchemaFragment => {
384
+ let types: array<string> = []
385
+ let mutations: array<string> = []
386
+ let queries: array<string> = []
387
+ let seenTypes = Set.make()
388
+
389
+ // Extract the constructor name from a mutation field name like
390
+ // `Plugin_Activate` / `Platform_Plugin_Activate` — always the last
391
+ // underscore-separated segment (e.g. `Activate`).
392
+ let constructorNameOf = (fieldName: string): string =>
393
+ fieldName->String.split("_")->Array.get(fieldName->String.split("_")->Array.length - 1)
394
+ ->Option.getOr(fieldName)
395
+
396
+ mutationEntries->Array.forEach(entry => {
397
+ let schema = entry.commandSchema
398
+ switch schema {
399
+ | Union({anyOf}) =>
400
+ // Map each fieldName to its variant in anyOf by matching the constructor
401
+ // name. Position-based pairing (anyOf index ↔ fieldNames index) breaks
402
+ // when `@noApi` filters out some variants but the schema still carries
403
+ // them — the field name "Platform_Plugin_Deactivate" would otherwise be
404
+ // married to the `Connect(pluginDefinition)` variant at unfiltered
405
+ // index 1, leaking a stale `_0: Platform_Plugin_Deactivate_0` arg.
406
+ let variantNames = anyOf->Array.map(v =>
407
+ switch v {
408
+ | Object({items}) =>
409
+ items
410
+ ->Array.find(item => item.location == "TAG")
411
+ ->Option.flatMap(item =>
412
+ switch item.schema {
413
+ | String({const}) => Some(const)
414
+ | _ => None
415
+ }
416
+ )
417
+ ->Option.getOr("")
418
+ | String({const}) => const
419
+ | _ => ""
420
+ }
421
+ )
422
+ entry.fieldNames->Array.forEach(fieldName => {
423
+ let cname = constructorNameOf(fieldName)
424
+ let variantIndex = variantNames->Array.indexOf(cname)
425
+ let variantSchema = variantIndex >= 0
426
+ ? anyOf->Array.get(variantIndex)->Option.getOr(schema)
427
+ : schema
428
+ switch deriveMutationFieldFromObject(
429
+ ~fieldName,
430
+ ~collectedTypes=types,
431
+ ~seenTypes,
432
+ variantSchema,
433
+ ) {
434
+ | Some(field) =>
435
+ let withId = if field->String.includes("(") {
436
+ field->String.replace(`${fieldName}(`, `${fieldName}(id: ID!, `)
437
+ } else {
438
+ field->String.replace(`${fieldName}:`, `${fieldName}(id: ID!):`)
439
+ }
440
+ mutations->Array.push(withId)
441
+ | None =>
442
+ // Payload-less variant (S.literal("Ctor")) — no Object fields to
443
+ // derive args from, but still a valid mutation.
444
+ mutations->Array.push(` ${fieldName}(id: ID!): CommandResult!`)
445
+ }
446
+ })
447
+ | Object(_) =>
448
+ let fieldName = entry.fieldNames->Array.get(0)->Option.getOr("")
449
+ if fieldName->String.length > 0 {
450
+ deriveMutationFieldFromObject(
451
+ ~fieldName,
452
+ ~collectedTypes=types,
453
+ ~seenTypes,
454
+ schema,
455
+ )
456
+ ->Option.forEach(field => mutations->Array.push(field))
457
+ }
458
+ | _ => ()
459
+ }
460
+ })
461
+
462
+ queryEntries->Array.forEach(entry => {
463
+ let includeIdParam = entry.includeIdParam->Option.getOr(true)
464
+ let connectionSpec = entry.connectionSpec->Option.getOr(true)
465
+ if !(seenTypes->Set.has(entry.returnTypeName)) {
466
+ seenTypes->Set.add(entry.returnTypeName)
467
+ let excludeFields = switch entry.excludeFields {
468
+ | Some(fields) => fields
469
+ | None => []
470
+ }
471
+ let nestedTypes = deriveObjectTypeWithNested(
472
+ ~typeName=entry.returnTypeName,
473
+ ~excludeFields,
474
+ ~includeIdParam,
475
+ entry.stateSchema,
476
+ )
477
+ nestedTypes->Array.forEach(t => {
478
+ types->Array.push(t)
479
+ })
480
+ }
481
+
482
+ let singleField = deriveObjectQueryField(
483
+ ~singleFieldName=entry.singleFieldName,
484
+ ~typeName=entry.returnTypeName,
485
+ ~includeIdParam,
486
+ ~subIdField=?entry.subIdField,
487
+ )
488
+ queries->Array.push(singleField)
489
+
490
+ // Batched-by-ids field for single-key projections (subIdField=None).
491
+ // Skipped for composite-key projections — BatchGetItem requires both
492
+ // partition + sort attributes per key entry.
493
+ if includeIdParam && entry.subIdField === None {
494
+ queries->Array.push(
495
+ deriveByIdsQueryField(
496
+ ~listFieldName=entry.listFieldName,
497
+ ~returnTypeName=entry.returnTypeName,
498
+ ),
499
+ )
500
+ }
501
+
502
+ let listFieldName = entry.listFieldName
503
+ // Items query (sort key conditions, Relay connection) — generated when subIdField is set
504
+ switch entry.subIdField {
505
+ | Some(_sf) =>
506
+ let itemsFilterTypeName = entry.returnTypeName ++ "ItemsFilter"
507
+ if !(seenTypes->Set.has(itemsFilterTypeName)) {
508
+ seenTypes->Set.add(itemsFilterTypeName)
509
+ types->Array.push(deriveSubIdFilterType(~filterTypeName=itemsFilterTypeName))
510
+ }
511
+ queries->Array.push(
512
+ deriveItemsQueryField(
513
+ ~singleFieldName=entry.singleFieldName,
514
+ ~returnTypeName=entry.returnTypeName,
515
+ ~filterTypeName=itemsFilterTypeName,
516
+ ),
517
+ )
518
+ | None => ()
519
+ }
520
+
521
+ // By-index connection queries — generated for each GSI on the entry
522
+ switch entry.indexQueries {
523
+ | Some(indexes) =>
524
+ let connectionTypeName = entry.returnTypeName ++ "Connection"
525
+ indexes->Array.forEach(({index}) => {
526
+ let stripped = if index->String.startsWith("by") && index->String.length > 2 {
527
+ index->String.slice(~start=2, ~end=index->String.length)
528
+ } else {
529
+ index
530
+ }
531
+ let fieldName = entry.singleFieldName ++ "By" ++ stripped->String.capitalize
532
+ queries->Array.push(
533
+ ` ${fieldName}(id: ID!, first: Int, after: String, last: Int, before: String): ${connectionTypeName}!`,
534
+ )
535
+ })
536
+ | None => ()
537
+ }
538
+
539
+ if connectionSpec {
540
+ // Relay Connection spec: Edge + Connection types
541
+ let connectionTypeName = entry.returnTypeName ++ "Connection"
542
+ if !(seenTypes->Set.has(connectionTypeName)) {
543
+ let edgeName = entry.returnTypeName ++ "Edge"
544
+ seenTypes->Set.add(edgeName)
545
+ seenTypes->Set.add(connectionTypeName)
546
+ deriveConnectionTypes(~singularTypeName=entry.returnTypeName)
547
+ ->Array.forEach(t => types->Array.push(t))
548
+ }
549
+ let capability = deriveServerCapability(entry.stateSchema)
550
+ let connectionFilterTypeName = entry.returnTypeName ++ "Filter"
551
+ if !(seenTypes->Set.has(connectionFilterTypeName)) {
552
+ seenTypes->Set.add(connectionFilterTypeName)
553
+ types->Array.push(
554
+ deriveConnectionFilterType(~filterTypeName=connectionFilterTypeName, ~capability),
555
+ )
556
+ }
557
+ let orderByTypes =
558
+ deriveConnectionOrderByType(~singularTypeName=entry.returnTypeName, ~capability)
559
+ let hasOrderBy = orderByTypes->Array.length > 0
560
+ if hasOrderBy {
561
+ let orderFieldEnumName = entry.returnTypeName ++ "OrderField"
562
+ let orderByInputName = entry.returnTypeName ++ "OrderBy"
563
+ if !(seenTypes->Set.has(orderFieldEnumName)) {
564
+ seenTypes->Set.add(orderFieldEnumName)
565
+ seenTypes->Set.add(orderByInputName)
566
+ orderByTypes->Array.forEach(t => types->Array.push(t))
567
+ }
568
+ }
569
+ let listField = deriveConnectionQueryField(
570
+ ~listFieldName,
571
+ ~singularTypeName=entry.returnTypeName,
572
+ ~filterTypeName=connectionFilterTypeName,
573
+ ~hasOrderBy,
574
+ )
575
+ queries->Array.push(listField)
576
+ } else {
577
+ // Legacy AppSync-style: items/nextToken/scannedCount
578
+ if !(seenTypes->Set.has(listFieldName)) {
579
+ seenTypes->Set.add(listFieldName)
580
+ let pluralType = derivePluralWrapperType(
581
+ ~pluralTypeName=listFieldName,
582
+ ~singularTypeName=entry.returnTypeName,
583
+ )
584
+ types->Array.push(pluralType)
585
+ }
586
+ let listField = deriveListQueryField(
587
+ ~listFieldName,
588
+ ~pluralTypeName=listFieldName,
589
+ )
590
+ queries->Array.push(listField)
591
+ }
592
+ })
593
+
594
+ // If any mutation fields were emitted, every one of them returns
595
+ // `CommandResult!` — inject the union + 3 outcome types so the fragment is
596
+ // self-contained. Stitcher dedupes by type name across fragments.
597
+ if mutations->Array.length > 0 {
598
+ commandResultSdlTypes->Array.forEach(t => types->Array.push(t))
599
+ }
600
+
601
+ let encoded =
602
+ JSON.Encode.object(
603
+ Dict.fromArray([
604
+ ("types", JSON.Encode.array(types->Array.map(JSON.Encode.string))),
605
+ ("mutations", JSON.Encode.array(mutations->Array.map(JSON.Encode.string))),
606
+ ("queries", JSON.Encode.array(queries->Array.map(JSON.Encode.string))),
607
+ ("subscriptions", JSON.Encode.array([])),
608
+ ]),
609
+ )->JSON.stringify
610
+
611
+ {Reventless.Plugin.encoded, protocol: "graphql"}
612
+ }