@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,27 @@
1
+ // Runtime-safe resolver error hook.
2
+ //
3
+ // Fires when a generateCommand resolver receives a command type that cannot be
4
+ // decoded against the registered command schema. Fire-and-forget: the hook
5
+ // returns unit, async work is the consumer's concern.
6
+ //
7
+ // Extracted from Plugin_Helpers so the Lambda runtime path (which calls into
8
+ // CommandGenerator_Callback) doesn't transitively import Plugin_Helpers' Pulumi
9
+ // dependencies.
10
+
11
+ type resolverErrorInfo = {
12
+ pluginName: string,
13
+ componentName: string,
14
+ /** The GraphQL mutation field / command topic tag that was attempted. */
15
+ attemptedCommandType: string,
16
+ timestamp: string,
17
+ }
18
+
19
+ let onResolverErrorHook: ref<option<resolverErrorInfo => unit>> = ref(None)
20
+
21
+ let registerOnResolverError = (hook: resolverErrorInfo => unit) => {
22
+ onResolverErrorHook.contents = Some(hook)
23
+ }
24
+
25
+ let clearOnResolverError = () => {
26
+ onResolverErrorHook.contents = None
27
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ let onResolverErrorHook = {
5
+ contents: undefined
6
+ };
7
+
8
+ function registerOnResolverError(hook) {
9
+ onResolverErrorHook.contents = hook;
10
+ }
11
+
12
+ function clearOnResolverError() {
13
+ onResolverErrorHook.contents = undefined;
14
+ }
15
+
16
+ export {
17
+ onResolverErrorHook,
18
+ registerOnResolverError,
19
+ clearOnResolverError,
20
+ }
21
+ /* No side effect */
@@ -0,0 +1,570 @@
1
+ // Pure metadata extraction from spec modules.
2
+ // Extracts the pluginStructure (component graph metadata) that Auto UI, the
3
+ // event-graph view, and MCP tooling consume. Kept standalone so it can be
4
+ // unit-tested without spinning up a Platform.
5
+
6
+ let log = Logger.fromEnv()
7
+
8
+ // Returns (labelField, searchableFields) from a state schema.
9
+ // Source ladder:
10
+ // 1. @displayName spec present → "displayName" + spec.fields (raw underlying fields)
11
+ // 2. First non-id, non-`*Id`/`*Ids`, non-TAG, string-typed field in declaration order
12
+ // 3. "id" fallback with a logged warning (no searchable fields)
13
+ //
14
+ // `*Id` / `*Ids` fields (e.g. `productId`, `customerId`, `orderIds`) are entity
15
+ // references, not human-readable labels — skipping them lets a sibling like
16
+ // `name` win even when it appears later in declaration order.
17
+ let isIdLikeFieldName = (name: string): bool =>
18
+ name == "id" || name->String.endsWith("Id") || name->String.endsWith("Ids")
19
+
20
+ // Resolve the field that holds the entity's lifecycle status, used by
21
+ // AutoUI to filter the per-row command menu against each command's
22
+ // `allowedStates`. Resolution order:
23
+ // 1. Field annotated `@status` (PPX-emitted; see StateAnnotations).
24
+ // 2. Field literally named `"status"` (convention; mirrors how
25
+ // labelField falls back to a conventionally-named string field).
26
+ // 3. None — filter is inert for this read model.
27
+ let statusFieldFromStateSchema = (
28
+ stateSchema: S.t<unknown>,
29
+ ): option<string> => {
30
+ let annotated = switch Reventless.StateAnnotations.getSpec(stateSchema) {
31
+ | Some(spec) => spec.status
32
+ | None => None
33
+ }
34
+ switch annotated {
35
+ | Some(_) as some => some
36
+ | None =>
37
+ switch stateSchema {
38
+ | Object({items}) =>
39
+ items
40
+ ->Array.find(item => item.location == "status")
41
+ ->Option.map(item => item.location)
42
+ | _ => None
43
+ }
44
+ }
45
+ }
46
+
47
+ let labelFieldsFromStateSchema = (
48
+ ~entityName: string,
49
+ stateSchema: S.t<unknown>,
50
+ ): (string, array<string>) =>
51
+ switch Reventless.DisplayName.getSpec(stateSchema) {
52
+ | Some(spec) => ("displayName", spec.fields)
53
+ | None =>
54
+ let firstStringItem = switch stateSchema {
55
+ | Object({items}) =>
56
+ items->Array.find(item =>
57
+ item.location != "TAG" &&
58
+ !isIdLikeFieldName(item.location) &&
59
+ switch item.schema {
60
+ | String(_) => true
61
+ | _ => false
62
+ }
63
+ )
64
+ | _ => None
65
+ }
66
+ switch firstStringItem {
67
+ | Some(item) => (item.location, [item.location])
68
+ | None =>
69
+ log.warn(
70
+ ~comp="Plugin_Structure",
71
+ `${entityName}: no @displayName annotation and no suitable string field — labelField falls back to "id"`,
72
+ )
73
+ ("id", [])
74
+ }
75
+ }
76
+
77
+ let make = (
78
+ type api role,
79
+ ~name: string,
80
+ ~aggregates: array<module(ReventlessInfra.Aggregate.T with type api = api)>=[],
81
+ ~readModels: array<module(ReventlessInfra.ReadModel.T with type api = api and type role = role)>=[],
82
+ ~stateViewSlices: array<module(ReventlessInfra.StateViewSlice.T)>=[],
83
+ ~stateChangeSlices: array<module(ReventlessInfra.StateChangeSlice.T)>=[],
84
+ ~automationSlices: array<module(ReventlessInfra.AutomationSlice.T)>=[],
85
+ ~outboundTranslationSlices: array<module(ReventlessInfra.OutboundTranslationSlice.T)>=[],
86
+ ~inboundTranslationSlices: array<module(ReventlessInfra.InboundTranslationSlice.T)>=[],
87
+ ~extensions: array<module(ReventlessInfra.Extension.Blueprint)>=[],
88
+ ~extensionPoints: array<module(ReventlessInfra.ExtensionPointMapping.Mapping)>=[],
89
+ ): Reventless.Plugin.pluginStructure => {
90
+ // Event schemas: filter out payload-less variants — DCB event-type lookups
91
+ // can't WHERE-clause on bare-string events, so the plugin graph mustn't
92
+ // claim cross-component edges that the runtime can't honour.
93
+ let eventVariantNames = schema => Reventless.DcbTag.extractVariantNames(schema)
94
+ // Command schemas: keep every constructor (including payload-less) so the
95
+ // GraphQL mutation surface stays addressable.
96
+ let commandVariantNames = schema => Reventless.DcbTag.extractAllVariantNames(schema)
97
+ let qualify = (~prefix, names) => names->Array.map(n => prefix ++ "." ++ n)
98
+
99
+ // Aggregate commands that initialize a new aggregate instance are Collection-level
100
+ // (shown as table-top buttons); all others are Instance-level (shown per-row).
101
+ let isCreateCommandName = name =>
102
+ ["Add", "Create", "Register", "Open", "Initialize", "Submit", "Start", "Place"]->Array.some(p =>
103
+ name->String.startsWith(p)
104
+ )
105
+
106
+ let commandLevelAndId = (~isAggregate, ~variantName, properties: dict<S.t<unknown>>) =>
107
+ if isAggregate {
108
+ if isCreateCommandName(variantName) {
109
+ (Reventless.Plugin.Collection, None)
110
+ } else {
111
+ (Reventless.Plugin.Instance, None)
112
+ }
113
+ } else {
114
+ let taggedFields =
115
+ properties
116
+ ->Dict.toArray
117
+ ->Array.filter(((fieldName, fieldSchema)) =>
118
+ fieldName != "TAG" &&
119
+ (Reventless.DcbTag.isTagged(fieldSchema) ||
120
+ Reventless.DcbTag.isTaggedArray(fieldSchema))
121
+ )
122
+ let taggedField =
123
+ taggedFields
124
+ ->Array.find(((_, fieldSchema)) => Reventless.DcbTag.isPartitionTag(fieldSchema))
125
+ ->Option.orElse(taggedFields->Array.get(0))
126
+ switch taggedField {
127
+ | Some((fieldName, _)) =>
128
+ if isCreateCommandName(variantName) {
129
+ // Creation command: Collection-level, but UUID is injected into the tagged ID field.
130
+ (Reventless.Plugin.Collection, Some(fieldName))
131
+ } else {
132
+ (Reventless.Plugin.Instance, Some(fieldName))
133
+ }
134
+ | None => (Reventless.Plugin.Collection, None)
135
+ }
136
+ }
137
+
138
+ let toCommandDef = (
139
+ ~isAggregate,
140
+ ~mutationFieldFor: string => string,
141
+ ~parentSchema: S.t<unknown>,
142
+ v: S.t<unknown>,
143
+ ): option<Reventless.Plugin.commandDef> => {
144
+ // Build a commandDef for one variant. `properties` is the variant's field dict —
145
+ // empty for a payload-less variant (e.g. `| Archive`), which compiles to a bare
146
+ // `S.literal("Archive")` string rather than an `{TAG, ...}` object.
147
+ let mkDef = (~variantName, ~properties) => {
148
+ let (level, aggregateIdField) = commandLevelAndId(~isAggregate, ~variantName, properties)
149
+ let references =
150
+ properties
151
+ ->Dict.toArray
152
+ ->Array.filterMap(((fieldName, fieldSchema)) =>
153
+ Reventless.Reference.getTarget(fieldSchema)->Option.map(target => (
154
+ {
155
+ Reventless.Plugin.fieldName,
156
+ entity: target.entity,
157
+ plugin: target.plugin,
158
+ }: Reventless.Plugin.fieldReference
159
+ ))
160
+ )
161
+ // Per-variant `allowedStates` lives on the *parent* command schema
162
+ // (the PPX attaches a single dict<variantName, [|states|]> via
163
+ // markAllowedStates). Look it up by variant name; back-compat
164
+ // None when the variant lacks an @allowedStates annotation.
165
+ let allowedStates = ApiAllowedStatesHelpers.getAllowedStates(parentSchema, ~variantName)
166
+ // API-exposed iff the whole command isn't @noApi and this variant
167
+ // isn't in its @noApi-variants set — mirrors the API-generation filter
168
+ // (Plugin_Helpers / PluginBaseFragment). Drives the event-graph API badge.
169
+ let apiExposed =
170
+ !ApiNoApiHelpers.isNoApi(parentSchema) &&
171
+ switch ApiNoApiHelpers.getExcludedVariants(parentSchema) {
172
+ | Some(excluded) => !(excluded->Set.has(variantName))
173
+ | None => true
174
+ }
175
+ ({
176
+ Reventless.Plugin.name: variantName,
177
+ schema: (v->S.toJSONSchema->Obj.magic: JSON.t)->JSON.stringify,
178
+ level,
179
+ aggregateIdField,
180
+ mutationField: mutationFieldFor(variantName),
181
+ references,
182
+ allowedStates,
183
+ apiExposed: Some(apiExposed),
184
+ }: Reventless.Plugin.commandDef)
185
+ }
186
+ switch v {
187
+ | Object({properties}) =>
188
+ properties
189
+ ->Dict.get("TAG")
190
+ ->Option.flatMap(tagSchema =>
191
+ switch tagSchema {
192
+ | String({const: ?Some(variantName)}) => Some(mkDef(~variantName, ~properties))
193
+ | _ => None
194
+ }
195
+ )
196
+ // Payload-less command variants (`| Archive`) compile to a bare string literal,
197
+ // not an `{TAG, ...}` object. They still get a generated mutation (API generation
198
+ // walks the schema via extractAllVariantNames), so surface them here too —
199
+ // otherwise the event graph hides a command the API actually exposes.
200
+ | String({const: ?Some(variantName)}) => Some(mkDef(~variantName, ~properties=Dict.make()))
201
+ | _ => None
202
+ }
203
+ }
204
+
205
+ let extractCommandDefs = (
206
+ ~isAggregate,
207
+ ~mutationFieldFor: string => string,
208
+ commandSchema: S.t<unknown>,
209
+ ): array<Reventless.Plugin.commandDef> =>
210
+ switch commandSchema {
211
+ | Union({anyOf}) =>
212
+ anyOf->Array.filterMap(v =>
213
+ toCommandDef(~isAggregate, ~mutationFieldFor, ~parentSchema=commandSchema, v)
214
+ )
215
+ | _ =>
216
+ // Single-variant command types compile to a bare Object schema, not a Union.
217
+ toCommandDef(~isAggregate, ~mutationFieldFor, ~parentSchema=commandSchema, commandSchema)
218
+ ->Option.mapOr([], def => [def])
219
+ }
220
+
221
+ // ── Per-variant event field extraction (Phase 6.3) ─────────────────────────
222
+ // Mirrors toCommandDef/extractCommandDefs for emitted events: name (TAG const),
223
+ // payload JSON Schema, and cross-entity references.
224
+
225
+ let toEventDef = (v: S.t<unknown>): option<Reventless.Plugin.eventDef> => {
226
+ let mkDef = (~variantName, ~properties) => {
227
+ let references =
228
+ properties
229
+ ->Dict.toArray
230
+ ->Array.filterMap(((fieldName, fieldSchema)) =>
231
+ Reventless.Reference.getTarget(fieldSchema)->Option.map(target => (
232
+ {
233
+ Reventless.Plugin.fieldName,
234
+ entity: target.entity,
235
+ plugin: target.plugin,
236
+ }: Reventless.Plugin.fieldReference
237
+ ))
238
+ )
239
+ ({
240
+ Reventless.Plugin.name: variantName,
241
+ schema: (v->S.toJSONSchema->Obj.magic: JSON.t)->JSON.stringify,
242
+ references,
243
+ }: Reventless.Plugin.eventDef)
244
+ }
245
+ switch v {
246
+ | Object({properties}) =>
247
+ properties
248
+ ->Dict.get("TAG")
249
+ ->Option.flatMap(tagSchema =>
250
+ switch tagSchema {
251
+ | String({const: ?Some(variantName)}) => Some(mkDef(~variantName, ~properties))
252
+ | _ => None
253
+ }
254
+ )
255
+ // Payload-less event variants (`| Archived`) compile to a bare string literal.
256
+ // DCB-projection lookups can't WHERE-clause on them, so they stay out of
257
+ // producedEventTypes/consumedEventTypes; but the full `events` list carries them
258
+ // so the event graph can still draw the emitted (orphan) event node.
259
+ | String({const: ?Some(variantName)}) => Some(mkDef(~variantName, ~properties=Dict.make()))
260
+ | _ => None
261
+ }
262
+ }
263
+
264
+ let extractEventDefs = (eventSchema: S.t<unknown>): array<Reventless.Plugin.eventDef> =>
265
+ switch eventSchema {
266
+ | Union({anyOf}) => anyOf->Array.filterMap(toEventDef)
267
+ | _ => toEventDef(eventSchema)->Option.mapOr([], def => [def])
268
+ }
269
+
270
+ // ── Per-component event type extraction ────────────────────────────────────
271
+
272
+ let scsProduced =
273
+ stateChangeSlices->Array.map((module(SCS: ReventlessInfra.StateChangeSlice.T)) => (
274
+ SCS.Spec.name,
275
+ qualify(~prefix=name, eventVariantNames(SCS.Spec.eventSchema)),
276
+ ))
277
+ let scsConsumed =
278
+ stateChangeSlices->Array.map((module(SCS: ReventlessInfra.StateChangeSlice.T)) => (
279
+ SCS.Spec.name,
280
+ qualify(~prefix=name, eventVariantNames(SCS.Spec.consumedEventSchema)),
281
+ ))
282
+
283
+ let aggProduced =
284
+ aggregates->Array.map((module(A: ReventlessInfra.Aggregate.T with type api = api)) => (
285
+ A.Spec.name,
286
+ qualify(~prefix=name, eventVariantNames(A.Spec.eventSchema)),
287
+ ))
288
+
289
+ let svsConsumed =
290
+ stateViewSlices->Array.map((module(SVS: ReventlessInfra.StateViewSlice.T)) => (
291
+ SVS.Spec.name,
292
+ qualify(~prefix=name, eventVariantNames(SVS.Spec.consumedEventSchema)),
293
+ ))
294
+
295
+ let rmSourceNames =
296
+ readModels->Array.map((
297
+ module(R: ReventlessInfra.ReadModel.T with type api = api and type role = role),
298
+ ) => (R.Spec.name, R.sourceNames))
299
+
300
+ let allWritableProduced: array<(string, array<string>)> = Array.concat(scsProduced, aggProduced)
301
+
302
+ // ── Cross-reference helpers ────────────────────────────────────────────────
303
+
304
+ let intersects = (a: array<string>, b: array<string>) =>
305
+ a->Array.some(x => b->Array.includes(x))
306
+
307
+ let linkedSvsFor = (producedTypes: array<string>): array<string> =>
308
+ svsConsumed->Array.filterMap(((viewName, consumed)) =>
309
+ if intersects(producedTypes, consumed) {
310
+ Some(viewName)
311
+ } else {
312
+ None
313
+ }
314
+ )
315
+
316
+ let linkedReadModelsFor = (aggregateName: string): array<string> =>
317
+ rmSourceNames->Array.filterMap(((rmName, sources)) =>
318
+ if sources->Array.includes(aggregateName) {
319
+ Some(rmName)
320
+ } else {
321
+ None
322
+ }
323
+ )
324
+
325
+ let linkedWriteSideFor = (consumedTypes: array<string>): array<string> =>
326
+ allWritableProduced->Array.filterMap(((writableName, produced)) =>
327
+ if intersects(consumedTypes, produced) {
328
+ Some(writableName)
329
+ } else {
330
+ None
331
+ }
332
+ )
333
+
334
+ // For a StateChangeSlice's consumedEventTypes, find the single best-matching StateViewSlice.
335
+ // Primary sort: overlap score desc. Tie-break: total consumed events desc (larger view wins).
336
+ // Remaining ties resolve to None.
337
+ let consistencyReadFor = (scsConsumedTypes: array<string>): option<string> => {
338
+ let scored =
339
+ svsConsumed
340
+ ->Array.map(((viewName, consumed)) => {
341
+ let overlap = consumed->Array.filter(e => scsConsumedTypes->Array.includes(e))->Array.length
342
+ let total = consumed->Array.length
343
+ (viewName, overlap, total)
344
+ })
345
+ ->Array.filter(((_, overlap, _)) => overlap > 0)
346
+ ->Array.toSorted(((_, a, aTotal), (_, b, bTotal)) => {
347
+ let cmp = Int.compare(b, a)
348
+ if cmp != Ordering.equal { cmp } else { Int.compare(bTotal, aTotal) }
349
+ })
350
+ switch scored->Array.length {
351
+ | 0 => None
352
+ | 1 =>
353
+ let (viewName, _, _) = scored->Array.getUnsafe(0)
354
+ Some(viewName)
355
+ | _ =>
356
+ let (viewName, top, topTotal) = scored->Array.getUnsafe(0)
357
+ let (_, second, secondTotal) = scored->Array.getUnsafe(1)
358
+ if top > second {
359
+ Some(viewName)
360
+ } else if top == second && topTotal > secondTotal {
361
+ Some(viewName)
362
+ } else {
363
+ None
364
+ }
365
+ }
366
+ }
367
+
368
+ // ── Build queryable defs ───────────────────────────────────────────────────
369
+ //
370
+ // Internal ReadModels and StateViewSlices (marked `@@reventless.visibility(Internal)`)
371
+ // are CARRIED in pluginStructure, tagged via `queryableDef.visibility` (`None` = Public,
372
+ // `Some("Internal")` = Internal). Developer tools — the `reventless-gwt` / VSCode domain
373
+ // graph and dead-code analysis — read them so an Internal view still shows up there. The
374
+ // deployed AutoUI's consumers (Platform_ComponentDefinitionsApi menu/pages) re-filter on
375
+ // the tag so the live UI keeps hiding them — see Visibility.res, which documents this contract.
376
+ let visibilityTag = (v: Reventless.Visibility.t): option<string> =>
377
+ switch v {
378
+ | Public => None
379
+ | Internal => Some("Internal")
380
+ }
381
+
382
+ let readModelDefs =
383
+ readModels
384
+ ->Array.map((
385
+ module(R: ReventlessInfra.ReadModel.T with type api = api and type role = role),
386
+ ) => {
387
+ let qf = Api_Naming.queryFieldNamesForReadModel(~plugin=name, ~name=R.Spec.name)
388
+ let stateSchema = R.Spec.stateSchema->S.castToUnknown
389
+ let (labelField, searchableFields) = labelFieldsFromStateSchema(
390
+ ~entityName=R.Spec.name,
391
+ stateSchema,
392
+ )
393
+ ({
394
+ Reventless.Plugin.name: R.Spec.name,
395
+ queryField: qf.listFieldName,
396
+ schema: stateSchema->SuryToJsonSchema.deriveObjectSchema->JSON.stringify,
397
+ consumedEventTypes: [],
398
+ linkedWriteSide: [],
399
+ labelField,
400
+ searchableFields,
401
+ statusField: statusFieldFromStateSchema(stateSchema),
402
+ visibility: visibilityTag(R.Spec.visibility),
403
+ }: Reventless.Plugin.queryableDef)
404
+ })
405
+
406
+ let stateViewDefs =
407
+ stateViewSlices->Array.mapWithIndex((module(SVS: ReventlessInfra.StateViewSlice.T), i) => {
408
+ let qf = Api_Naming.queryFieldNamesForStateView(~plugin=name, ~viewName=SVS.Spec.name)
409
+ let (_, consumed) = svsConsumed->Array.getUnsafe(i)
410
+ let stateSchema = SVS.Spec.stateSchema->S.castToUnknown
411
+ let (labelField, searchableFields) = labelFieldsFromStateSchema(
412
+ ~entityName=SVS.Spec.name,
413
+ stateSchema,
414
+ )
415
+ ({
416
+ Reventless.Plugin.name: SVS.Spec.name,
417
+ queryField: qf.listFieldName,
418
+ schema: stateSchema->SuryToJsonSchema.deriveObjectSchema->JSON.stringify,
419
+ consumedEventTypes: consumed,
420
+ linkedWriteSide: linkedWriteSideFor(consumed),
421
+ labelField,
422
+ searchableFields,
423
+ statusField: statusFieldFromStateSchema(stateSchema),
424
+ visibility: visibilityTag(SVS.Spec.visibility),
425
+ }: Reventless.Plugin.queryableDef)
426
+ })
427
+
428
+ // ── Build writable defs ────────────────────────────────────────────────────
429
+
430
+ let stateChangeDefs =
431
+ stateChangeSlices->Array.mapWithIndex((module(SCS: ReventlessInfra.StateChangeSlice.T), i) => {
432
+ let (_, produced) = scsProduced->Array.getUnsafe(i)
433
+ let (_, consumed) = scsConsumed->Array.getUnsafe(i)
434
+ ({
435
+ Reventless.Plugin.name: SCS.Spec.name,
436
+ commands: extractCommandDefs(
437
+ ~isAggregate=false,
438
+ ~mutationFieldFor=_variantName => Api_Naming.sliceMutationField(~plugin=name, ~slice=SCS.Spec.name),
439
+ SCS.Spec.commandSchema->S.castToUnknown,
440
+ ),
441
+ producedEventTypes: produced,
442
+ consumedEventTypes: consumed,
443
+ linkedViews: linkedSvsFor(produced),
444
+ consistencyRead: consistencyReadFor(consumed),
445
+ events: extractEventDefs(SCS.Spec.eventSchema->S.castToUnknown),
446
+ }: Reventless.Plugin.writableDef)
447
+ })
448
+
449
+ let aggregateDefs =
450
+ aggregates->Array.mapWithIndex((
451
+ module(A: ReventlessInfra.Aggregate.T with type api = api),
452
+ i,
453
+ ) => {
454
+ let (_, produced) = aggProduced->Array.getUnsafe(i)
455
+ ({
456
+ Reventless.Plugin.name: A.Spec.name,
457
+ commands: extractCommandDefs(
458
+ ~isAggregate=true,
459
+ ~mutationFieldFor=variantName => Api_Naming.aggregateMutationField(~plugin=name, ~aggregate=A.Spec.name, ~command=variantName),
460
+ A.Spec.commandSchema->S.castToUnknown,
461
+ ),
462
+ producedEventTypes: produced,
463
+ consumedEventTypes: [],
464
+ linkedViews: Array.concat(linkedSvsFor(produced), linkedReadModelsFor(A.Spec.name)),
465
+ consistencyRead: None,
466
+ events: extractEventDefs(A.Spec.eventSchema->S.castToUnknown),
467
+ }: Reventless.Plugin.writableDef)
468
+ })
469
+
470
+ // ── Automation slices ────────────────────────────────────────────────────────
471
+
472
+ let automationSliceDefs =
473
+ automationSlices->Array.map((module(AS: ReventlessInfra.AutomationSlice.T)) => {
474
+ // Plan 04: gather variant names across every per-source mapping. A
475
+ // multi-source slice contributes the union; a single-source slice
476
+ // contributes that one source's variants.
477
+ let allConsumedVariants =
478
+ AS.Automation.mappings
479
+ ->Array.flatMap((module(M: AS.Automation.Mapping)) =>
480
+ eventVariantNames(M.sourceEventSchema->S.castToUnknown)
481
+ )
482
+ ->Belt.Set.String.fromArray
483
+ ->Belt.Set.String.toArray
484
+ ({
485
+ Reventless.Plugin.name: AS.Spec.name,
486
+ consumedEventTypes: qualify(~prefix=name, allConsumedVariants),
487
+ producedCommandTypes: qualify(~prefix=name, commandVariantNames(AS.Spec.commandSchema)),
488
+ targetName: AS.Spec.targetName,
489
+ }: Reventless.Plugin.automationSliceDef)
490
+ })
491
+
492
+ // ── Outbound translation slices ───────────────────────────────────────────
493
+
494
+ let outboundTranslationSliceDefs =
495
+ outboundTranslationSlices->Array.map((module(OTS: ReventlessInfra.OutboundTranslationSlice.T)) => ({
496
+ Reventless.Plugin.name: OTS.Spec.name,
497
+ consumedEventTypes: qualify(~prefix=name, eventVariantNames(OTS.Spec.consumedEventSchema)),
498
+ inboundCommandTypes: qualify(~prefix=name, commandVariantNames(OTS.Spec.inboundCommandSchema)),
499
+ targetName: OTS.Spec.targetName,
500
+ }: Reventless.Plugin.outboundTranslationSliceDef))
501
+
502
+ // ── Inbound translation slices ────────────────────────────────────────────
503
+
504
+ let inboundTranslationSliceDefs =
505
+ inboundTranslationSlices->Array.map((module(ITS: ReventlessInfra.InboundTranslationSlice.T)) => ({
506
+ Reventless.Plugin.name: ITS.Spec.name,
507
+ commandTypes: qualify(~prefix=name, commandVariantNames(ITS.Spec.commandSchema)),
508
+ targetName: ITS.Spec.targetName,
509
+ }: Reventless.Plugin.inboundTranslationSliceDef))
510
+
511
+ // ── Extensions ───────────────────────────────────────────────────────────
512
+
513
+ let extensionDefs =
514
+ extensions->Array.map((module(E: ReventlessInfra.Extension.Blueprint)) => {
515
+ let delegateNames = E.mappings->Array.map((module(M: E.Mapping)) => M.delegateName)
516
+ ({
517
+ Reventless.Plugin.name: E.Spec.name,
518
+ delegateNames,
519
+ eventTypes: qualify(~prefix=E.Spec.name, eventVariantNames(E.Spec.eventSchema)),
520
+ commandTypes: qualify(~prefix=E.Spec.name, commandVariantNames(E.Spec.commandSchema)),
521
+ }: Reventless.Plugin.extensionDef)
522
+ })
523
+
524
+ // ── Extension points (producer side) ──────────────────────────────────────
525
+ //
526
+ // The mapping modules connect one Delegate (an aggregate / DCB event log) to
527
+ // one extension point. Several mappings can target the SAME extension point
528
+ // (Make2 / Make3 / MakeMulti), so group by the EP's dotted spec name and union
529
+ // each delegate's name + its source event types. Source events are qualified
530
+ // with the plugin name to match `producedEventTypes` on the write-sides, so the
531
+ // event graph can draw producing-write-side → event → extension-point.
532
+
533
+ let dedupe = (xs: array<string>) =>
534
+ xs->Belt.Set.String.fromArray->Belt.Set.String.toArray
535
+
536
+ let epByName: Dict.t<(array<string>, array<string>, array<string>)> = Dict.make()
537
+ extensionPoints->Array.forEach((module(M: ReventlessInfra.ExtensionPointMapping.Mapping)) => {
538
+ let epName = M.ExtensionPoint.name
539
+ let sourceEvents = qualify(~prefix=name, eventVariantNames(M.Delegate.eventSchema->S.castToUnknown))
540
+ // The EP's inbound command protocol (variants of its `command` type). Empty
541
+ // for a `command = unit` EP — an events-out-only boundary that routes nothing.
542
+ let commands = qualify(~prefix=epName, commandVariantNames(M.ExtensionPoint.commandSchema))
543
+ let (dels, evs, cmds) = epByName->Dict.get(epName)->Option.getOr(([], [], []))
544
+ epByName->Dict.set(
545
+ epName,
546
+ (Array.concat(dels, [M.Delegate.name]), Array.concat(evs, sourceEvents), Array.concat(cmds, commands)),
547
+ )
548
+ })
549
+ let extensionPointDefs =
550
+ epByName
551
+ ->Dict.toArray
552
+ ->Array.map(((epName, (dels, evs, cmds))) => ({
553
+ Reventless.Plugin.name: epName,
554
+ delegateNames: dedupe(dels),
555
+ sourceEventTypes: dedupe(evs),
556
+ commandTypes: Some(dedupe(cmds)),
557
+ }: Reventless.Plugin.extensionPointDef))
558
+
559
+ {
560
+ readModels: readModelDefs,
561
+ stateViewSlices: stateViewDefs,
562
+ stateChangeSlices: stateChangeDefs,
563
+ aggregates: aggregateDefs,
564
+ automationSlices: automationSliceDefs,
565
+ outboundTranslationSlices: outboundTranslationSliceDefs,
566
+ inboundTranslationSlices: inboundTranslationSliceDefs,
567
+ extensions: extensionDefs,
568
+ extensionPoints: Some(extensionPointDefs),
569
+ }
570
+ }