@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,81 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
5
+ import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
6
+
7
+ let consumedEventSchema = S.union([
8
+ S.schema(s => ({
9
+ TAG: "OrderPlaced",
10
+ orderId: s.m(DcbTag$Reventless.string),
11
+ customerName: s.m(S.string)
12
+ })),
13
+ S.schema(s => ({
14
+ TAG: "OrderShipped",
15
+ orderId: s.m(DcbTag$Reventless.string)
16
+ })),
17
+ S.schema(s => ({
18
+ TAG: "OrderCancelled",
19
+ orderId: s.m(DcbTag$Reventless.string)
20
+ }))
21
+ ]);
22
+
23
+ let stateSchema = S.schema(s => ({
24
+ orderId: s.m(S.string),
25
+ customerName: s.m(S.string)
26
+ }));
27
+
28
+ function project(event) {
29
+ switch (event.TAG) {
30
+ case "OrderPlaced" :
31
+ let orderId = event.orderId;
32
+ return [{
33
+ TAG: "Set",
34
+ _0: orderId,
35
+ _1: {
36
+ orderId: orderId,
37
+ customerName: event.customerName
38
+ }
39
+ }];
40
+ case "OrderShipped" :
41
+ return [{
42
+ TAG: "Update",
43
+ _0: event.orderId,
44
+ _1: s => s
45
+ }];
46
+ case "OrderCancelled" :
47
+ return [{
48
+ TAG: "Update",
49
+ _0: event.orderId,
50
+ _1: s => s
51
+ }];
52
+ }
53
+ }
54
+
55
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
56
+
57
+ let name = "Orders";
58
+
59
+ let Id;
60
+
61
+ let subIdConfig;
62
+
63
+ let moduleUrl = "@reventlessdev/reventless-core/tests/plugin/StateViewSlice/PsOrdersView.res.mjs";
64
+
65
+ let authorization = "AllowAuthenticated";
66
+
67
+ let visibility = "Public";
68
+
69
+ export {
70
+ name,
71
+ Id,
72
+ consumedEventSchema,
73
+ stateSchema,
74
+ project,
75
+ config,
76
+ subIdConfig,
77
+ moduleUrl,
78
+ authorization,
79
+ visibility,
80
+ }
81
+ /* consumedEventSchema Not a pure module */
@@ -0,0 +1,211 @@
1
+ // Phase 0 Proof-of-Concept: Validate structural subtyping for platform-to-reventless-spec migration
2
+ //
3
+ // This file tests the critical assumption from plans/platform-to-reventless-spec.md:
4
+ // Can a module satisfying a superset module type (with AggregateRuntimeBuilder)
5
+ // be used where a subset module type (without AggregateRuntimeBuilder) is expected?
6
+ //
7
+ // Tests:
8
+ // 1. Basic structural subtyping: superset module satisfies subset module type
9
+ // 2. `with type` constraints work across subset/superset boundary
10
+ // 3. Array of first-class superset modules can be passed where subset is expected
11
+ // 4. The "finish" pattern: internal fields accessible when needed, hidden from spec users
12
+
13
+ // ============================================================================
14
+ // Simulated "spec" types (what would live in reventless-spec)
15
+ // ============================================================================
16
+
17
+ module type SpecLike = {
18
+ module Id: Reventless.Id.T
19
+ let name: string
20
+ @schema
21
+ type command
22
+ @schema
23
+ type event
24
+ @schema
25
+ type error
26
+ }
27
+
28
+ // Simplified component output type — what app developers would see
29
+ // This is the "Subset" — no AggregateRuntimeBuilder
30
+ module type Aggregate_Subset = {
31
+ module Spec: SpecLike
32
+ type api
33
+ let make: (~api: api, ~opts: Pulumi.ComponentResource.options=?) => Aggregate.component
34
+ }
35
+
36
+ // ============================================================================
37
+ // Simulated "reventless" types (what would stay in reventless)
38
+ // ============================================================================
39
+
40
+ // Full component output type — includes internal adapter module
41
+ // This is the "Superset" — has AggregateRuntimeBuilder
42
+ module type Aggregate_Superset = {
43
+ module Spec: SpecLike
44
+ type api
45
+ let make: (~api: api, ~opts: Pulumi.ComponentResource.options=?) => Aggregate.component
46
+ module AggregateRuntimeBuilder: AggregateRuntime_Builder.T
47
+ }
48
+
49
+ // ============================================================================
50
+ // Test 1: Basic coercion — can a Superset module be used as a Subset?
51
+ // ============================================================================
52
+
53
+ // This function accepts the subset type
54
+ let acceptSubset = (module(M: Aggregate_Subset)): string => {
55
+ M.Spec.name
56
+ }
57
+
58
+ // This function tries to pass a superset where subset is expected
59
+ let coerceSuperset = (module(M: Aggregate_Superset)): module(Aggregate_Subset) => {
60
+ module(M: Aggregate_Subset)
61
+ }
62
+
63
+ // ============================================================================
64
+ // Test 2: `with type` constraints across the boundary
65
+ // ============================================================================
66
+
67
+ // Simulated Plugin.T.make signature using subset types
68
+ module type PluginMaker_WithSubset = {
69
+ type api
70
+ let make: (~aggregates: array<module(Aggregate_Subset with type api = api)>) => unit
71
+ }
72
+
73
+ // Can we pass superset modules where subset with type constraint is expected?
74
+ let passSupersetsAsSubsets = (
75
+ type a,
76
+ aggregates: array<module(Aggregate_Superset with type api = a)>,
77
+ ): array<module(Aggregate_Subset with type api = a)> => {
78
+ aggregates->Array.map((
79
+ module(M: Aggregate_Superset with type api = a),
80
+ ): module(Aggregate_Subset with type api = a) => module(M))
81
+ }
82
+
83
+ // ============================================================================
84
+ // Test 3: The "finish" pattern — can we keep internal access when needed?
85
+ // ============================================================================
86
+
87
+ // The plugin builder internally needs AggregateRuntimeBuilder.finish()
88
+ // but the Platform.T signature only exposes the subset.
89
+ // Solution: Plugin_Builder accepts the full type internally,
90
+ // but Platform.T returns the subset to app developers.
91
+
92
+ // This simulates what Plugin_Helpers.finishAggregates does
93
+ let finishAggregates = (
94
+ type a,
95
+ aggregates: array<module(Aggregate_Superset with type api = a)>,
96
+ ) => {
97
+ aggregates->Array.forEach((module(M: Aggregate_Superset with type api = a)) => {
98
+ M.AggregateRuntimeBuilder.finish()
99
+ })
100
+ }
101
+
102
+ // ============================================================================
103
+ // Test 4: Platform.T pattern — builder returns subset, internal uses superset
104
+ // ============================================================================
105
+
106
+ // What Platform.T would look like in spec (returns subset)
107
+ module type Platform_Spec = {
108
+ module Aggregate: {
109
+ module Make: (Spec: SpecLike) => Aggregate_Subset
110
+ }
111
+ }
112
+
113
+ // What the actual platform implementation returns (superset)
114
+ module type Platform_Impl = {
115
+ module Aggregate: {
116
+ module Make: (Spec: SpecLike) => Aggregate_Superset
117
+ }
118
+ }
119
+
120
+ // Can Platform_Impl satisfy Platform_Spec?
121
+ // This is the KEY test — if this compiles, the whole approach works
122
+ let platformImplSatisfiesSpec = (module(P: Platform_Impl)): module(Platform_Spec) => {
123
+ module(P: Platform_Spec)
124
+ }
125
+
126
+ // ============================================================================
127
+ // Test 5: ReadModel pattern (has EventCollectorRuntimeBuilder)
128
+ // ============================================================================
129
+
130
+ module type ReadModel_Subset = {
131
+ module Spec: ReventlessInfra.ReadModel.T
132
+ type api
133
+ type role
134
+ let make: (
135
+ ~api: api,
136
+ ~apiRole: role,
137
+ ~allEventTopics: EventTopic.allOutputs,
138
+ ~opts: Pulumi.ComponentResource.options=?,
139
+ ) => ReadModel.component
140
+ }
141
+
142
+ module type ReadModel_Superset = {
143
+ module Spec: ReventlessInfra.ReadModel.T
144
+ type api
145
+ type role
146
+ let make: (
147
+ ~api: api,
148
+ ~apiRole: role,
149
+ ~allEventTopics: EventTopic.allOutputs,
150
+ ~opts: Pulumi.ComponentResource.options=?,
151
+ ) => ReadModel.component
152
+ module EventCollectorRuntimeBuilder: EventCollectorRuntime_Builder.T
153
+ }
154
+
155
+ let coerceReadModelSuperset = (module(M: ReadModel_Superset)): module(ReadModel_Subset) => {
156
+ module(M: ReadModel_Subset)
157
+ }
158
+
159
+ // ============================================================================
160
+ // Test 6: include-based definition (the actual approach from the plan)
161
+ // ============================================================================
162
+
163
+ // In the plan, the superset would be defined using `include`:
164
+ // module type Superset = { include Subset; module Extra: ... }
165
+ // Let's verify this works too
166
+
167
+ module type Aggregate_Subset_V2 = {
168
+ module Spec: SpecLike
169
+ type api
170
+ let make: (~api: api, ~opts: Pulumi.ComponentResource.options=?) => Aggregate.component
171
+ }
172
+
173
+ module type Aggregate_Superset_V2 = {
174
+ include Aggregate_Subset_V2
175
+ module AggregateRuntimeBuilder: AggregateRuntime_Builder.T
176
+ }
177
+
178
+ let coerceSupersetV2 = (module(M: Aggregate_Superset_V2)): module(Aggregate_Subset_V2) => {
179
+ module(M: Aggregate_Subset_V2)
180
+ }
181
+
182
+ let passSupersetsAsSubsetsV2 = (
183
+ type a,
184
+ aggregates: array<module(Aggregate_Superset_V2 with type api = a)>,
185
+ ): array<module(Aggregate_Subset_V2 with type api = a)> => {
186
+ aggregates->Array.map((
187
+ module(M: Aggregate_Superset_V2 with type api = a),
188
+ ): module(Aggregate_Subset_V2 with type api = a) => module(M))
189
+ }
190
+
191
+ let platformImplSatisfiesSpecV2 = (module(P: Platform_Impl)): module(Platform_Spec) => {
192
+ module(P: Platform_Spec)
193
+ }
194
+
195
+ // ============================================================================
196
+ // Summary
197
+ // ============================================================================
198
+ // If this file compiles, it proves:
199
+ // 1. ✅ Superset modules can be coerced to subset module types
200
+ // 2. ✅ `with type` constraints work across the boundary
201
+ // 3. ✅ Arrays of first-class modules can be mapped from superset to subset
202
+ // 4. ✅ Platform_Impl (returning superset) satisfies Platform_Spec (returning subset)
203
+ // 5. ✅ ReadModel pattern works the same way
204
+ // 6. ✅ `include`-based superset definition works
205
+ //
206
+ // Key insight for the plan:
207
+ // - Plugin_Builder.res DOES use AggregateRuntimeBuilder.finish() internally
208
+ // (see Plugin_Helpers.res:136-143)
209
+ // - This means Plugin_Builder must continue to accept the full Aggregate.T internally
210
+ // - But Platform.T can return the subset type to app developers
211
+ // - The coercion happens at the Platform.T boundary, not at Plugin_Builder
@@ -0,0 +1,61 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ function acceptSubset(M) {
5
+ return M.Spec.name;
6
+ }
7
+
8
+ function coerceSuperset(M) {
9
+ return M;
10
+ }
11
+
12
+ function passSupersetsAsSubsets(aggregates) {
13
+ return aggregates.map(M => M);
14
+ }
15
+
16
+ function finishAggregates(aggregates) {
17
+ aggregates.forEach(M => M.AggregateRuntimeBuilder.finish());
18
+ }
19
+
20
+ function platformImplSatisfiesSpec(P) {
21
+ let $$let = P.Aggregate.Make;
22
+ return {
23
+ Aggregate: {
24
+ Make: funarg => $$let(funarg)
25
+ }
26
+ };
27
+ }
28
+
29
+ function coerceReadModelSuperset(M) {
30
+ return M;
31
+ }
32
+
33
+ function coerceSupersetV2(M) {
34
+ return M;
35
+ }
36
+
37
+ function passSupersetsAsSubsetsV2(aggregates) {
38
+ return aggregates.map(M => M);
39
+ }
40
+
41
+ function platformImplSatisfiesSpecV2(P) {
42
+ let $$let = P.Aggregate.Make;
43
+ return {
44
+ Aggregate: {
45
+ Make: funarg => $$let(funarg)
46
+ }
47
+ };
48
+ }
49
+
50
+ export {
51
+ acceptSubset,
52
+ coerceSuperset,
53
+ passSupersetsAsSubsets,
54
+ finishAggregates,
55
+ platformImplSatisfiesSpec,
56
+ coerceReadModelSuperset,
57
+ coerceSupersetV2,
58
+ passSupersetsAsSubsetsV2,
59
+ platformImplSatisfiesSpecV2,
60
+ }
61
+ /* No side effect */
@@ -0,0 +1,65 @@
1
+ S.enableJson()
2
+
3
+ // ─────────────────────────────────────────────────────────────
4
+ // Test state spec
5
+ // ─────────────────────────────────────────────────────────────
6
+
7
+ module ItemQueryDbSpec = {
8
+ module Id = Reventless.Id.StringPure
9
+ let name = "TestItemQueryDb"
10
+ let moduleUrl: string = %raw(`import.meta.url`)
11
+
12
+ @schema
13
+ type state = {name: string, count: int}
14
+
15
+ let config = Reventless.ReadModel.config()
16
+ let subIdConfig = None
17
+ }
18
+
19
+ // ─────────────────────────────────────────────────────────────
20
+ // Mock JSON storage operations
21
+ // ─────────────────────────────────────────────────────────────
22
+
23
+ let store: ref<dict<array<JSON.t>>> = ref(Dict.make())
24
+ let failNextWrite = ref(false)
25
+
26
+ let mockJsonOps: QueryDb.operations<string, JSON.t> = {
27
+ load: async id => Ok(store.contents->Dict.get(id)->Option.getOr([])),
28
+ loadStream: id => store.contents->Dict.get(id)->Option.getOr([])->Stream.fromIterable,
29
+ save: async (id, state, _saveMode, _ttl) => {
30
+ if failNextWrite.contents {
31
+ failNextWrite := false
32
+ Error(ReventlessInfra.QueryDb.NotSavedToStorage("mock failure"))
33
+ } else {
34
+ store.contents->Dict.set(id, [state])
35
+ Ok()
36
+ }
37
+ },
38
+ saveBatch: async batch => {
39
+ if failNextWrite.contents {
40
+ failNextWrite := false
41
+ Error(ReventlessInfra.QueryDb.BatchNotFullyWrittenToStorage("mock failure"))
42
+ } else {
43
+ batch->Array.forEach(((id, state, _ttl)) => {
44
+ store.contents->Dict.set(id, [state])
45
+ })
46
+ Ok()
47
+ }
48
+ },
49
+ count: async (_id, _field, inc) => Ok(inc),
50
+ delete: async (id, _subId) => {
51
+ store.contents->Dict.delete(id)
52
+ Ok()
53
+ },
54
+ deleteBatch: async ids => {
55
+ ids->Array.forEach(((id, _subId)) => {
56
+ store.contents->Dict.delete(id)
57
+ })
58
+ Ok()
59
+ },
60
+ }
61
+
62
+ let reset = () => {
63
+ store := Dict.make()
64
+ failNextWrite := false
65
+ }
@@ -0,0 +1,135 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
5
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
+ import * as Stream from "effect/Stream";
7
+ import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
8
+
9
+ S.enableJson();
10
+
11
+ let moduleUrl = import.meta.url;
12
+
13
+ let stateSchema = S.schema(s => ({
14
+ name: s.m(S.string),
15
+ count: s.m(S.int)
16
+ }));
17
+
18
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
19
+
20
+ let ItemQueryDbSpec = {
21
+ Id: undefined,
22
+ name: "TestItemQueryDb",
23
+ moduleUrl: moduleUrl,
24
+ stateSchema: stateSchema,
25
+ config: config,
26
+ subIdConfig: undefined,
27
+ authorization: "AllowAuthenticated",
28
+ visibility: "Public"
29
+ };
30
+
31
+ let store = {
32
+ contents: {}
33
+ };
34
+
35
+ let failNextWrite = {
36
+ contents: false
37
+ };
38
+
39
+ async function mockJsonOps_load(id) {
40
+ return {
41
+ TAG: "Ok",
42
+ _0: Stdlib_Option.getOr(store.contents[id], [])
43
+ };
44
+ }
45
+
46
+ function mockJsonOps_loadStream(id) {
47
+ return Stream.fromIterable(Stdlib_Option.getOr(store.contents[id], []));
48
+ }
49
+
50
+ async function mockJsonOps_save(id, state, _saveMode, _ttl) {
51
+ if (failNextWrite.contents) {
52
+ failNextWrite.contents = false;
53
+ return {
54
+ TAG: "Error",
55
+ _0: {
56
+ TAG: "NotSavedToStorage",
57
+ _0: "mock failure"
58
+ }
59
+ };
60
+ } else {
61
+ store.contents[id] = [state];
62
+ return {
63
+ TAG: "Ok",
64
+ _0: undefined
65
+ };
66
+ }
67
+ }
68
+
69
+ async function mockJsonOps_saveBatch(batch) {
70
+ if (failNextWrite.contents) {
71
+ failNextWrite.contents = false;
72
+ return {
73
+ TAG: "Error",
74
+ _0: {
75
+ TAG: "BatchNotFullyWrittenToStorage",
76
+ _0: "mock failure"
77
+ }
78
+ };
79
+ } else {
80
+ batch.forEach(param => {
81
+ store.contents[param[0]] = [param[1]];
82
+ });
83
+ return {
84
+ TAG: "Ok",
85
+ _0: undefined
86
+ };
87
+ }
88
+ }
89
+
90
+ async function mockJsonOps_count(_id, _field, inc) {
91
+ return {
92
+ TAG: "Ok",
93
+ _0: inc
94
+ };
95
+ }
96
+
97
+ async function mockJsonOps_delete(id, _subId) {
98
+ Stdlib_Dict.$$delete(store.contents, id);
99
+ return {
100
+ TAG: "Ok",
101
+ _0: undefined
102
+ };
103
+ }
104
+
105
+ async function mockJsonOps_deleteBatch(ids) {
106
+ ids.forEach(param => Stdlib_Dict.$$delete(store.contents, param[0]));
107
+ return {
108
+ TAG: "Ok",
109
+ _0: undefined
110
+ };
111
+ }
112
+
113
+ let mockJsonOps = {
114
+ load: mockJsonOps_load,
115
+ loadStream: mockJsonOps_loadStream,
116
+ save: mockJsonOps_save,
117
+ saveBatch: mockJsonOps_saveBatch,
118
+ count: mockJsonOps_count,
119
+ delete: mockJsonOps_delete,
120
+ deleteBatch: mockJsonOps_deleteBatch
121
+ };
122
+
123
+ function reset() {
124
+ store.contents = {};
125
+ failNextWrite.contents = false;
126
+ }
127
+
128
+ export {
129
+ ItemQueryDbSpec,
130
+ store,
131
+ failNextWrite,
132
+ mockJsonOps,
133
+ reset,
134
+ }
135
+ /* Not a pure module */
@@ -0,0 +1,94 @@
1
+ open JestGlobals
2
+ open QueryDbFixtures
3
+
4
+ module Ops = QueryDb_Operations.Make(
5
+ ItemQueryDbSpec,
6
+ {
7
+ let jsonOps = mockJsonOps
8
+ },
9
+ )
10
+
11
+ let _ = beforeEach(() => reset())
12
+
13
+ describe("QueryDb_Operations:", () => {
14
+ describe("loadStream", () => {
15
+ testPromise("returns empty stream for unknown id", async () => {
16
+ let result = await Ops.loadStream("unknown-id")->Stream.runCollect->Effect.runPromise
17
+ expect(result)->toEqual([])
18
+ })
19
+
20
+ testPromise("decodes saved state back to typed state", async () => {
21
+ let state: ItemQueryDbSpec.state = {name: "Widget", count: 5}
22
+ let _ = await Ops.save("item-1", state, Init, None)
23
+ let result = await Ops.loadStream("item-1")->Stream.runCollect->Effect.runPromise
24
+ switch result {
25
+ | [s] => expect((s.name, s.count))->toEqual(("Widget", 5))
26
+ | _ => expect("unexpected result")->toEqual("Ok([state])")
27
+ }
28
+ })
29
+
30
+ testPromise("returns updated state after overwrite", async () => {
31
+ let _ = await Ops.save("item-1", {name: "Widget", count: 1}, Init, None)
32
+ let _ = await Ops.save("item-1", {name: "Widget Updated", count: 2}, Overwrite, None)
33
+ let result = await Ops.loadStream("item-1")->Stream.runCollect->Effect.runPromise
34
+ switch result {
35
+ | [s] => expect(s.name)->toBe("Widget Updated")
36
+ | _ => expect("unexpected result")->toEqual("Ok([state])")
37
+ }
38
+ })
39
+ })
40
+
41
+ describe("save", () => {
42
+ testPromise("returns Ok on success", async () => {
43
+ let result = await Ops.save("item-1", {name: "Widget", count: 1}, Init, None)
44
+ expect(Result.isOk(result))->toBe(true)
45
+ })
46
+
47
+ testPromise("stores id field in JSON", async () => {
48
+ let _ = await Ops.save("item-42", {name: "Widget", count: 0}, Init, None)
49
+ let stored = store.contents->Dict.get("item-42")->Option.getOr([])
50
+ expect(stored->Array.length)->toBe(1)
51
+ let json = stored->Array.getUnsafe(0)
52
+ let idField =
53
+ json
54
+ ->JSON.Decode.object
55
+ ->Option.flatMap(d => d->Dict.get("id"))
56
+ ->Option.flatMap(j => switch j { | JSON.String(s) => Some(s) | _ => None })
57
+ expect(idField)->toEqual(Some("item-42"))
58
+ })
59
+
60
+ testPromise("returns Error when storage fails", async () => {
61
+ failNextWrite := true
62
+ let result = await Ops.save("item-1", {name: "Widget", count: 1}, Init, None)
63
+ expect(Result.isError(result))->toBe(true)
64
+ })
65
+ })
66
+
67
+ describe("saveBatch", () => {
68
+ testPromise("saves multiple states", async () => {
69
+ let batch = [
70
+ ("item-1", ({name: "A", count: 1}: ItemQueryDbSpec.state), None),
71
+ ("item-2", ({name: "B", count: 2}: ItemQueryDbSpec.state), None),
72
+ ]
73
+ let _ = await Ops.saveBatch(batch)
74
+ let r1 = await Ops.loadStream("item-1")->Stream.runCollect->Effect.runPromise
75
+ let r2 = await Ops.loadStream("item-2")->Stream.runCollect->Effect.runPromise
76
+ expect((r1->Array.length > 0, r2->Array.length > 0))->toEqual((true, true))
77
+ })
78
+
79
+ testPromise("returns Error when storage fails", async () => {
80
+ failNextWrite := true
81
+ let result = await Ops.saveBatch([("item-1", ({name: "A", count: 1}: ItemQueryDbSpec.state), None)])
82
+ expect(Result.isError(result))->toBe(true)
83
+ })
84
+ })
85
+
86
+ describe("delete", () => {
87
+ testPromise("removes state from storage", async () => {
88
+ let _ = await Ops.save("item-1", {name: "Widget", count: 1}, Init, None)
89
+ let _ = await Ops.delete("item-1", None)
90
+ let result = await Ops.loadStream("item-1")->Stream.runCollect->Effect.runPromise
91
+ expect(result)->toEqual([])
92
+ })
93
+ })
94
+ })