@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.
- package/CHANGELOG.md +1355 -0
- package/LICENSE +202 -0
- package/README.md +173 -0
- package/__mocks__/emptyModule.js +2 -0
- package/jest.setup.cjs +5 -0
- package/package.json +73 -0
- package/rescript.json +41 -0
- package/scripts/deploy.sh +6 -0
- package/scripts/post-deploy.sh +5 -0
- package/scripts/pre-deploy.sh +18 -0
- package/scripts/pulumi-up.sh +30 -0
- package/src/Behavior.res +18 -0
- package/src/Behavior.res.mjs +2 -0
- package/src/ComponentType.res +125 -0
- package/src/ComponentType.res.mjs +199 -0
- package/src/Env.res +5 -0
- package/src/Env.res.mjs +2 -0
- package/src/Mapper.res +36 -0
- package/src/Mapper.res.mjs +18 -0
- package/src/Mapper1toN.res +107 -0
- package/src/Mapper1toN.res.mjs +2 -0
- package/src/MapperNto1.res +78 -0
- package/src/MapperNto1.res.mjs +35 -0
- package/src/Message.res +353 -0
- package/src/Message.res.mjs +418 -0
- package/src/PluginRuntimeOperations.res +15 -0
- package/src/PluginRuntimeOperations.res.mjs +2 -0
- package/src/Projection.res +447 -0
- package/src/Projection.res.mjs +712 -0
- package/src/ProjectionMapper.res +44 -0
- package/src/ProjectionMapper.res.mjs +51 -0
- package/src/RequestContext.res +42 -0
- package/src/RequestContext.res.mjs +39 -0
- package/src/adapter/Adapter.res +178 -0
- package/src/adapter/Adapter.res.mjs +201 -0
- package/src/adapter/AdapterDeploytime.res +56 -0
- package/src/adapter/AdapterDeploytime.res.mjs +42 -0
- package/src/adapter/Auth/Auth_Adapter.res +42 -0
- package/src/adapter/Auth/Auth_Adapter.res.mjs +2 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder.res +22 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder.res.mjs +2 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res +259 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res.mjs +190 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +92 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +59 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +52 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +49 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +64 -0
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +59 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder.res +11 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder.res.mjs +2 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +46 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +40 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +204 -0
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +150 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder.res +18 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder.res.mjs +2 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +36 -0
- package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +28 -0
- package/src/adapter/Runtime/PluginRuntime_Builder.res +23 -0
- package/src/adapter/Runtime/PluginRuntime_Builder.res.mjs +2 -0
- package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res +97 -0
- package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs +62 -0
- package/src/adapter/Runtime/PluginRuntime_Builder_Single.res +89 -0
- package/src/adapter/Runtime/PluginRuntime_Builder_Single.res.mjs +62 -0
- package/src/adapter/Runtime/Runtime.res +106 -0
- package/src/adapter/Runtime/Runtime.res.mjs +22 -0
- package/src/adapter/Runtime/TaskRuntime_Builder.res +32 -0
- package/src/adapter/Runtime/TaskRuntime_Builder.res.mjs +2 -0
- package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +42 -0
- package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +29 -0
- package/src/admin/AdminApi.res +88 -0
- package/src/admin/AdminApi.res.mjs +89 -0
- package/src/admin/Admin_Callback.res +27 -0
- package/src/admin/Admin_Callback.res.mjs +20 -0
- package/src/admin/Platform_Admin.res +402 -0
- package/src/admin/Platform_Admin.res.mjs +250 -0
- package/src/admin/Platform_Admin_Structure.res +125 -0
- package/src/admin/Platform_Admin_Structure.res.mjs +182 -0
- package/src/admin/Platform_ComponentDefinitionsApi.res +160 -0
- package/src/admin/Platform_ComponentDefinitionsApi.res.mjs +299 -0
- package/src/admin/Platform_UIFragmentsApi.res +55 -0
- package/src/admin/Platform_UIFragmentsApi.res.mjs +124 -0
- package/src/admin/UIFragmentRegistryProjection.res +43 -0
- package/src/admin/UIFragmentRegistryProjection.res.mjs +81 -0
- package/src/admin/UIFragmentRegistryReadModelSpec.res +13 -0
- package/src/admin/UIFragmentRegistryReadModelSpec.res.mjs +40 -0
- package/src/components/Aggregate/Aggregate.res +96 -0
- package/src/components/Aggregate/Aggregate.res.mjs +82 -0
- package/src/components/Aggregate/Aggregate_Builder.res +175 -0
- package/src/components/Aggregate/Aggregate_Builder.res.mjs +119 -0
- package/src/components/Aggregate/Aggregate_Callback.res +273 -0
- package/src/components/Aggregate/Aggregate_Callback.res.mjs +208 -0
- package/src/components/Api/ApiAllowedStatesHelpers.res +19 -0
- package/src/components/Api/ApiAllowedStatesHelpers.res.mjs +16 -0
- package/src/components/Api/ApiNoApiHelpers.res +13 -0
- package/src/components/Api/ApiNoApiHelpers.res.mjs +29 -0
- package/src/components/Api/Api_Builder.res +40 -0
- package/src/components/Api/Api_Builder.res.mjs +33 -0
- package/src/components/Api/Api_Naming.res +92 -0
- package/src/components/Api/Api_Naming.res.mjs +103 -0
- package/src/components/Api/Api_Operations.res +13 -0
- package/src/components/Api/Api_Operations.res.mjs +12 -0
- package/src/components/Api/GraphQL_FragmentGenerator.res +612 -0
- package/src/components/Api/GraphQL_FragmentGenerator.res.mjs +503 -0
- package/src/components/Api/GraphQL_SchemaInspector.res +156 -0
- package/src/components/Api/GraphQL_SchemaInspector.res.mjs +123 -0
- package/src/components/Api/GraphQL_Stitcher.res +271 -0
- package/src/components/Api/GraphQL_Stitcher.res.mjs +229 -0
- package/src/components/Api/MCP_SchemaGenerator.res +185 -0
- package/src/components/Api/MCP_SchemaGenerator.res.mjs +146 -0
- package/src/components/Api/SchemaType.res +126 -0
- package/src/components/Api/SchemaType.res.mjs +143 -0
- package/src/components/Api/SuryToJsonSchema.res +142 -0
- package/src/components/Api/SuryToJsonSchema.res.mjs +210 -0
- package/src/components/AutomationSlice/AutomationSlice.res +39 -0
- package/src/components/AutomationSlice/AutomationSlice.res.mjs +24 -0
- package/src/components/AutomationSlice/AutomationSlice_Builder.res +207 -0
- package/src/components/AutomationSlice/AutomationSlice_Builder.res.mjs +123 -0
- package/src/components/AutomationSlice/AutomationSlice_Callback.res +212 -0
- package/src/components/AutomationSlice/AutomationSlice_Callback.res.mjs +189 -0
- package/src/components/Builder_Helpers.res +196 -0
- package/src/components/Builder_Helpers.res.mjs +142 -0
- package/src/components/Cloner.res +84 -0
- package/src/components/Cloner.res.mjs +88 -0
- package/src/components/CommandGenerator/CommandGenerator.res +54 -0
- package/src/components/CommandGenerator/CommandGenerator.res.mjs +15 -0
- package/src/components/CommandGenerator/CommandGenerator_Adapter.res +22 -0
- package/src/components/CommandGenerator/CommandGenerator_Adapter.res.mjs +2 -0
- package/src/components/CommandGenerator/CommandGenerator_Builder.res +70 -0
- package/src/components/CommandGenerator/CommandGenerator_Builder.res.mjs +68 -0
- package/src/components/CommandGenerator/CommandGenerator_Callback.res +191 -0
- package/src/components/CommandGenerator/CommandGenerator_Callback.res.mjs +161 -0
- package/src/components/CommandTopic/CommandTopic.res +79 -0
- package/src/components/CommandTopic/CommandTopic.res.mjs +68 -0
- package/src/components/CommandTopic/CommandTopic_Adapter.res +53 -0
- package/src/components/CommandTopic/CommandTopic_Adapter.res.mjs +2 -0
- package/src/components/CommandTopic/CommandTopic_Builder.res +146 -0
- package/src/components/CommandTopic/CommandTopic_Builder.res.mjs +127 -0
- package/src/components/CommandTopic/CommandTopic_Callback.res +38 -0
- package/src/components/CommandTopic/CommandTopic_Callback.res.mjs +49 -0
- package/src/components/CommandTopic/CommandTopic_Helpers.res +176 -0
- package/src/components/CommandTopic/CommandTopic_Helpers.res.mjs +195 -0
- package/src/components/CommandTopic/CommandTopic_Operations.res +40 -0
- package/src/components/CommandTopic/CommandTopic_Operations.res.mjs +49 -0
- package/src/components/Component.res +1 -0
- package/src/components/Component.res.mjs +34 -0
- package/src/components/Component.resi +1 -0
- package/src/components/Counter/Counter.res +47 -0
- package/src/components/Counter/Counter.res.mjs +55 -0
- package/src/components/Counter/Counter_Adapter.res +18 -0
- package/src/components/Counter/Counter_Adapter.res.mjs +2 -0
- package/src/components/Counter/Counter_Builder.res +142 -0
- package/src/components/Counter/Counter_Builder.res.mjs +112 -0
- package/src/components/Counter/Counter_Callback.res +94 -0
- package/src/components/Counter/Counter_Callback.res.mjs +70 -0
- package/src/components/Counter/Counter_Operations.res +70 -0
- package/src/components/Counter/Counter_Operations.res.mjs +91 -0
- package/src/components/Dcb/Dcb_Builder.res +971 -0
- package/src/components/Dcb/Dcb_Builder.res.mjs +572 -0
- package/src/components/DcbEventLog/DcbEventLog.res +43 -0
- package/src/components/DcbEventLog/DcbEventLog.res.mjs +24 -0
- package/src/components/DcbEventLog/DcbEventLog_Adapter.res +57 -0
- package/src/components/DcbEventLog/DcbEventLog_Adapter.res.mjs +2 -0
- package/src/components/DcbEventLog/DcbEventLog_Builder.res +72 -0
- package/src/components/DcbEventLog/DcbEventLog_Builder.res.mjs +67 -0
- package/src/components/DcbEventLog/DcbEventLog_Operations.res +160 -0
- package/src/components/DcbEventLog/DcbEventLog_Operations.res.mjs +121 -0
- package/src/components/EventCollector/EventCollector.res +34 -0
- package/src/components/EventCollector/EventCollector.res.mjs +9 -0
- package/src/components/EventCollector/EventCollector_Adapter.res +45 -0
- package/src/components/EventCollector/EventCollector_Adapter.res.mjs +2 -0
- package/src/components/EventCollector/EventCollector_Builder.res +91 -0
- package/src/components/EventCollector/EventCollector_Builder.res.mjs +64 -0
- package/src/components/EventLog/EventLog.res +27 -0
- package/src/components/EventLog/EventLog.res.mjs +13 -0
- package/src/components/EventLog/EventLog_Adapter.res +15 -0
- package/src/components/EventLog/EventLog_Adapter.res.mjs +2 -0
- package/src/components/EventLog/EventLog_Builder.res +65 -0
- package/src/components/EventLog/EventLog_Builder.res.mjs +57 -0
- package/src/components/EventLog/EventLog_Operations.res +209 -0
- package/src/components/EventLog/EventLog_Operations.res.mjs +202 -0
- package/src/components/EventLog/EventPublish_Callback.res +29 -0
- package/src/components/EventLog/EventPublish_Callback.res.mjs +32 -0
- package/src/components/EventMapper/EventMapper.res +72 -0
- package/src/components/EventMapper/EventMapper.res.mjs +54 -0
- package/src/components/EventMapper/EventMapper_Builder.res +128 -0
- package/src/components/EventMapper/EventMapper_Builder.res.mjs +81 -0
- package/src/components/EventMapper/EventMapper_Callback.res +323 -0
- package/src/components/EventMapper/EventMapper_Callback.res.mjs +231 -0
- package/src/components/EventTopic/EventTopic.res +69 -0
- package/src/components/EventTopic/EventTopic.res.mjs +50 -0
- package/src/components/EventTopic/EventTopic_Adapter.res +15 -0
- package/src/components/EventTopic/EventTopic_Adapter.res.mjs +2 -0
- package/src/components/EventTopic/EventTopic_Builder.res +53 -0
- package/src/components/EventTopic/EventTopic_Builder.res.mjs +46 -0
- package/src/components/EventTopic/EventTopic_Operations.res +37 -0
- package/src/components/EventTopic/EventTopic_Operations.res.mjs +39 -0
- package/src/components/Extension/Extension.res +32 -0
- package/src/components/Extension/Extension.res.mjs +9 -0
- package/src/components/Extension/Extension_Builder.res +82 -0
- package/src/components/Extension/Extension_Builder.res.mjs +57 -0
- package/src/components/Extension/Extension_Operations.res +203 -0
- package/src/components/Extension/Extension_Operations.res.mjs +154 -0
- package/src/components/ExtensionPoint/ExtensionPoint.res +49 -0
- package/src/components/ExtensionPoint/ExtensionPoint.res.mjs +25 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Builder.res +163 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Builder.res.mjs +113 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Callback.res +110 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Callback.res.mjs +76 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Operations.res +146 -0
- package/src/components/ExtensionPoint/ExtensionPoint_Operations.res.mjs +122 -0
- package/src/components/Heartbeat/Heartbeat.res +25 -0
- package/src/components/Heartbeat/Heartbeat.res.mjs +9 -0
- package/src/components/Heartbeat/Heartbeat_Adapter.res +14 -0
- package/src/components/Heartbeat/Heartbeat_Adapter.res.mjs +2 -0
- package/src/components/Heartbeat/Heartbeat_Builder.res +43 -0
- package/src/components/Heartbeat/Heartbeat_Builder.res.mjs +47 -0
- package/src/components/Heartbeat/Heartbeat_Callback.res +32 -0
- package/src/components/Heartbeat/Heartbeat_Callback.res.mjs +40 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice.res +34 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice.res.mjs +24 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res +98 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res.mjs +87 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res +191 -0
- package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res.mjs +175 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res +35 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res.mjs +24 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res +181 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res.mjs +137 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res +173 -0
- package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res.mjs +173 -0
- package/src/components/QueryDb/QueryDb.res +74 -0
- package/src/components/QueryDb/QueryDb.res.mjs +37 -0
- package/src/components/QueryDb/QueryDb_Adapter.res +78 -0
- package/src/components/QueryDb/QueryDb_Adapter.res.mjs +17 -0
- package/src/components/QueryDb/QueryDb_Builder.res +76 -0
- package/src/components/QueryDb/QueryDb_Builder.res.mjs +53 -0
- package/src/components/QueryDb/QueryDb_Callback.res +18 -0
- package/src/components/QueryDb/QueryDb_Callback.res.mjs +21 -0
- package/src/components/QueryDb/QueryDb_Operations.res +116 -0
- package/src/components/QueryDb/QueryDb_Operations.res.mjs +165 -0
- package/src/components/ReadModel/ReadModel.res +42 -0
- package/src/components/ReadModel/ReadModel.res.mjs +27 -0
- package/src/components/ReadModel/ReadModel_Builder.res +155 -0
- package/src/components/ReadModel/ReadModel_Builder.res.mjs +101 -0
- package/src/components/ReadModel/ReadModel_Callback.res +48 -0
- package/src/components/ReadModel/ReadModel_Callback.res.mjs +48 -0
- package/src/components/Scheduler/Scheduler.res +13 -0
- package/src/components/Scheduler/Scheduler.res.mjs +9 -0
- package/src/components/Scheduler/Scheduler_Adapter.res +13 -0
- package/src/components/Scheduler/Scheduler_Adapter.res.mjs +2 -0
- package/src/components/Scheduler/Scheduler_Builder.res +19 -0
- package/src/components/Scheduler/Scheduler_Builder.res.mjs +29 -0
- package/src/components/SideEffectHandler/SideEffectHandler.res +30 -0
- package/src/components/SideEffectHandler/SideEffectHandler.res.mjs +12 -0
- package/src/components/SideEffectHandler/SideEffectHandler_Builder.res +117 -0
- package/src/components/SideEffectHandler/SideEffectHandler_Builder.res.mjs +64 -0
- package/src/components/SideEffectHandler/SideEffectHandler_Callback.res +116 -0
- package/src/components/SideEffectHandler/SideEffectHandler_Callback.res.mjs +95 -0
- package/src/components/StateChangeSlice/StateChangeSlice.res +38 -0
- package/src/components/StateChangeSlice/StateChangeSlice.res.mjs +17 -0
- package/src/components/StateChangeSlice/StateChangeSlice_Builder.res +91 -0
- package/src/components/StateChangeSlice/StateChangeSlice_Builder.res.mjs +81 -0
- package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +412 -0
- package/src/components/StateChangeSlice/StateChangeSlice_Callback.res.mjs +299 -0
- package/src/components/StateTopic.res +91 -0
- package/src/components/StateTopic.res.mjs +41 -0
- package/src/components/StateViewSlice/StateViewSlice.res +33 -0
- package/src/components/StateViewSlice/StateViewSlice.res.mjs +24 -0
- package/src/components/StateViewSlice/StateViewSlice_Builder.res +176 -0
- package/src/components/StateViewSlice/StateViewSlice_Builder.res.mjs +134 -0
- package/src/components/StateViewSlice/StateViewSlice_Callback.res +64 -0
- package/src/components/StateViewSlice/StateViewSlice_Callback.res.mjs +56 -0
- package/src/components/Task/Task.res +81 -0
- package/src/components/Task/Task.res.mjs +51 -0
- package/src/components/Task/Task_Adapter.res +31 -0
- package/src/components/Task/Task_Adapter.res.mjs +2 -0
- package/src/components/Task/Task_Builder.res +223 -0
- package/src/components/Task/Task_Builder.res.mjs +115 -0
- package/src/plugin/api/PluginBaseFragment.res +104 -0
- package/src/plugin/api/PluginBaseFragment.res.mjs +64 -0
- package/src/plugin/component/Plugin.res +100 -0
- package/src/plugin/component/Plugin.res.mjs +61 -0
- package/src/plugin/component/Plugin_Builder.res +1017 -0
- package/src/plugin/component/Plugin_Builder.res.mjs +608 -0
- package/src/plugin/component/Plugin_BuiltHook.res +141 -0
- package/src/plugin/component/Plugin_BuiltHook.res.mjs +39 -0
- package/src/plugin/component/Plugin_Callback.res +98 -0
- package/src/plugin/component/Plugin_Callback.res.mjs +55 -0
- package/src/plugin/component/Plugin_Helpers.res +1730 -0
- package/src/plugin/component/Plugin_Helpers.res.mjs +1010 -0
- package/src/plugin/component/Plugin_ResolverError.res +27 -0
- package/src/plugin/component/Plugin_ResolverError.res.mjs +21 -0
- package/src/plugin/component/Plugin_Structure.res +570 -0
- package/src/plugin/component/Plugin_Structure.res.mjs +458 -0
- package/src/plugin/component/Plugin_SubscriptionSchema.res +103 -0
- package/src/plugin/component/Plugin_SubscriptionSchema.res.mjs +71 -0
- package/src/plugin/component/SchemaWalker.res +164 -0
- package/src/plugin/component/SchemaWalker.res.mjs +183 -0
- package/src/plugin/connect/PluginConnectExtension_Builder.res +14 -0
- package/src/plugin/connect/PluginConnectExtension_Builder.res.mjs +36 -0
- package/src/plugin/connect/PluginConnectExtension_Mapping.res +76 -0
- package/src/plugin/connect/PluginConnectExtension_Mapping.res.mjs +89 -0
- package/src/plugin/connect/PluginExtensionPoint_Builder.res +39 -0
- package/src/plugin/connect/PluginExtensionPoint_Builder.res.mjs +33 -0
- package/src/plugin/connect/PluginExtensionPoint_Plugin.res +231 -0
- package/src/plugin/connect/PluginExtensionPoint_Plugin.res.mjs +353 -0
- package/src/plugin/lifecycle/PluginBehavior.res +250 -0
- package/src/plugin/lifecycle/PluginBehavior.res.mjs +391 -0
- package/src/plugin/lifecycle/PluginSpec.res +84 -0
- package/src/plugin/lifecycle/PluginSpec.res.mjs +148 -0
- package/src/plugin/lifecycle/PluginsProjection.res +154 -0
- package/src/plugin/lifecycle/PluginsProjection.res.mjs +230 -0
- package/src/plugin/lifecycle/PluginsReadModelSpec.res +66 -0
- package/src/plugin/lifecycle/PluginsReadModelSpec.res.mjs +58 -0
- package/src/util/AWS.res +7 -0
- package/src/util/AWS.res.mjs +20 -0
- package/src/util/CSV.res +27 -0
- package/src/util/CSV.res.mjs +56 -0
- package/src/util/CommandPublisher.res +133 -0
- package/src/util/CommandPublisher.res.mjs +161 -0
- package/src/util/CsvStream.res +39 -0
- package/src/util/CsvStream.res.mjs +42 -0
- package/src/util/EffectLogger.res +178 -0
- package/src/util/EffectLogger.res.mjs +171 -0
- package/src/util/FTP.res +69 -0
- package/src/util/FTP.res.mjs +101 -0
- package/src/util/FTPHandler.res +142 -0
- package/src/util/FTPHandler.res.mjs +136 -0
- package/src/util/Hash.res +1 -0
- package/src/util/Hash.res.mjs +10 -0
- package/src/util/Interstack.res +74 -0
- package/src/util/Interstack.res.mjs +126 -0
- package/src/util/Interstack.resi +25 -0
- package/src/util/LogFormat.res +222 -0
- package/src/util/LogFormat.res.mjs +257 -0
- package/src/util/Logger.res +196 -0
- package/src/util/Logger.res.mjs +238 -0
- package/src/util/Lru.res +51 -0
- package/src/util/Lru.res.mjs +59 -0
- package/src/util/Lru.resi +32 -0
- package/src/util/Metrics.res +32 -0
- package/src/util/Metrics.res.mjs +42 -0
- package/src/util/OutputFailsafeDeploytime.res +16 -0
- package/src/util/OutputFailsafeDeploytime.res.mjs +20 -0
- package/src/util/OutputFailsafeRuntime.res +6 -0
- package/src/util/OutputFailsafeRuntime.res.mjs +15 -0
- package/src/util/OutputLogger.res +9 -0
- package/src/util/OutputLogger.res.mjs +19 -0
- package/src/util/ResourceQuery.res +14 -0
- package/src/util/ResourceQuery.res.mjs +17 -0
- package/src/util/ResourceQueryRuntime.res +17 -0
- package/src/util/ResourceQueryRuntime.res.mjs +18 -0
- package/src/util/ScheduleOps.res +124 -0
- package/src/util/ScheduleOps.res.mjs +132 -0
- package/src/util/Util.res +12 -0
- package/src/util/Util.res.mjs +42 -0
- package/src/util/Util_Adapter.res +97 -0
- package/src/util/Util_Adapter.res.mjs +82 -0
- package/src/util/Util_AdapterRuntime.res +39 -0
- package/src/util/Util_AdapterRuntime.res.mjs +42 -0
- package/src/util/Util_Array.res +2 -0
- package/src/util/Util_Array.res.mjs +12 -0
- package/src/util/Util_Error.res +16 -0
- package/src/util/Util_Error.res.mjs +19 -0
- package/src/util/Util_Promise.res +67 -0
- package/src/util/Util_Promise.res.mjs +105 -0
- package/src/util/Util_Pulumi.res +35 -0
- package/src/util/Util_Pulumi.res.mjs +55 -0
- package/src/util/Util_Pulumi.resi +21 -0
- package/src/util/Util_QueryDb.res +14 -0
- package/src/util/Util_QueryDb.res.mjs +21 -0
- package/src/util/Util_QueryDbRuntime.res +11 -0
- package/src/util/Util_QueryDbRuntime.res.mjs +19 -0
- package/src/util/Util_ReadModel.res +2 -0
- package/src/util/Util_ReadModel.res.mjs +10 -0
- package/src/util/Util_StackRefs.res +24 -0
- package/src/util/Util_StackRefs.res.mjs +39 -0
- package/src/util/Validation.res +75 -0
- package/src/util/Validation.res.mjs +181 -0
- package/tests/.gitkeep +0 -0
- package/tests/IdentityTest.res +155 -0
- package/tests/IdentityTest.res.mjs +174 -0
- package/tests/admin/Platform_ComponentDefinitionsApiTest.res +237 -0
- package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +298 -0
- package/tests/admin/Platform_UIFragmentsApiTest.res +96 -0
- package/tests/admin/Platform_UIFragmentsApiTest.res.mjs +101 -0
- package/tests/aggregate/AggregateCallbackTest.res +81 -0
- package/tests/aggregate/AggregateCallbackTest.res.mjs +140 -0
- package/tests/aggregate/AggregateCausationTest.res +49 -0
- package/tests/aggregate/AggregateCausationTest.res.mjs +44 -0
- package/tests/aggregate/AggregateConflictTest.res +212 -0
- package/tests/aggregate/AggregateConflictTest.res.mjs +363 -0
- package/tests/aggregate/AggregateFixtures.res +177 -0
- package/tests/aggregate/AggregateFixtures.res.mjs +285 -0
- package/tests/aggregate/AggregateRejectionTest.res +139 -0
- package/tests/aggregate/AggregateRejectionTest.res.mjs +163 -0
- package/tests/api/ApiNoApiTest.res +62 -0
- package/tests/api/ApiNoApiTest.res.mjs +90 -0
- package/tests/api/GraphQL_StitcherTest.res +107 -0
- package/tests/api/GraphQL_StitcherTest.res.mjs +99 -0
- package/tests/api/SimpleTest.res +7 -0
- package/tests/api/SimpleTest.res.mjs +10 -0
- package/tests/api/SuryToJsonSchemaTest.res +405 -0
- package/tests/api/SuryToJsonSchemaTest.res.mjs +623 -0
- package/tests/commandgenerator/CommandGeneratorCallbackTest.res +128 -0
- package/tests/commandgenerator/CommandGeneratorCallbackTest.res.mjs +160 -0
- package/tests/commandgenerator/CommandGeneratorFixtures.res +139 -0
- package/tests/commandgenerator/CommandGeneratorFixtures.res.mjs +197 -0
- package/tests/commandtopic/CommandTopicCallbackFixtures.res +87 -0
- package/tests/commandtopic/CommandTopicCallbackFixtures.res.mjs +152 -0
- package/tests/commandtopic/CommandTopicCallbackTest.res +66 -0
- package/tests/commandtopic/CommandTopicCallbackTest.res.mjs +106 -0
- package/tests/commandtopic/CommandTopicHelpersRejectionTest.res +83 -0
- package/tests/commandtopic/CommandTopicHelpersRejectionTest.res.mjs +109 -0
- package/tests/counter/CounterCallbackTest.res +83 -0
- package/tests/counter/CounterCallbackTest.res.mjs +140 -0
- package/tests/counter/CounterFixtures.res +57 -0
- package/tests/counter/CounterFixtures.res.mjs +67 -0
- package/tests/dcb/DcbDecodeTest.res +122 -0
- package/tests/dcb/DcbDecodeTest.res.mjs +194 -0
- package/tests/dcb/DcbEventLogOperationsTest.res +195 -0
- package/tests/dcb/DcbEventLogOperationsTest.res.mjs +268 -0
- package/tests/dcb/DcbFixtures.res +422 -0
- package/tests/dcb/DcbFixtures.res.mjs +534 -0
- package/tests/dcb/DcbScopeInferenceTest.res +242 -0
- package/tests/dcb/DcbScopeInferenceTest.res.mjs +480 -0
- package/tests/dcb/DcbStateChangeSliceTest.res +362 -0
- package/tests/dcb/DcbStateChangeSliceTest.res.mjs +546 -0
- package/tests/dcb/DcbTagTest.res +978 -0
- package/tests/dcb/DcbTagTest.res.mjs +867 -0
- package/tests/dcb/DcbValidationTest.res +349 -0
- package/tests/dcb/DcbValidationTest.res.mjs +476 -0
- package/tests/eventlog/EventLogFixtures.res +113 -0
- package/tests/eventlog/EventLogFixtures.res.mjs +166 -0
- package/tests/eventlog/EventLogOperationsTest.res +96 -0
- package/tests/eventlog/EventLogOperationsTest.res.mjs +192 -0
- package/tests/eventlog/EventLogRetryTest.res +121 -0
- package/tests/eventlog/EventLogRetryTest.res.mjs +171 -0
- package/tests/eventmapper/EventMapperCallbackTest.res +134 -0
- package/tests/eventmapper/EventMapperCallbackTest.res.mjs +141 -0
- package/tests/eventmapper/EventMapperFixtures.res +255 -0
- package/tests/eventmapper/EventMapperFixtures.res.mjs +440 -0
- package/tests/eventmapper/EventMapperTest.res +53 -0
- package/tests/eventmapper/EventMapperTest.res.mjs +83 -0
- package/tests/eventtopic/EventTopicFixtures.res +36 -0
- package/tests/eventtopic/EventTopicFixtures.res.mjs +65 -0
- package/tests/eventtopic/EventTopicOperationsTest.res +48 -0
- package/tests/eventtopic/EventTopicOperationsTest.res.mjs +71 -0
- package/tests/extensionpoint/ExtensionPointCallbackTest.res +84 -0
- package/tests/extensionpoint/ExtensionPointCallbackTest.res.mjs +94 -0
- package/tests/extensionpoint/ExtensionPointFixtures.res +173 -0
- package/tests/extensionpoint/ExtensionPointFixtures.res.mjs +205 -0
- package/tests/extensionpoint/ExtensionPointOperationsTest.res +261 -0
- package/tests/extensionpoint/ExtensionPointOperationsTest.res.mjs +304 -0
- package/tests/ftp/FTPTest.res +64 -0
- package/tests/ftp/FTPTest.res.mjs +88 -0
- package/tests/logger/LogFormatTest.res +348 -0
- package/tests/logger/LogFormatTest.res.mjs +309 -0
- package/tests/message/MessageTest.res +95 -0
- package/tests/message/MessageTest.res.mjs +93 -0
- package/tests/message/MetaEnvelopeTest.res +200 -0
- package/tests/message/MetaEnvelopeTest.res.mjs +188 -0
- package/tests/plugin/ManifestVisibilityTest.res +137 -0
- package/tests/plugin/ManifestVisibilityTest.res.mjs +205 -0
- package/tests/plugin/PluginSpecExperiment.res +13 -0
- package/tests/plugin/PluginSpecExperiment.res.mjs +31 -0
- package/tests/plugin/PluginStructureTest.res +298 -0
- package/tests/plugin/PluginStructureTest.res.mjs +388 -0
- package/tests/plugin/PluginVersionTest.res +34 -0
- package/tests/plugin/PluginVersionTest.res.mjs +30 -0
- package/tests/plugin/SchemaWalkerTest.res +115 -0
- package/tests/plugin/SchemaWalkerTest.res.mjs +160 -0
- package/tests/plugin/StateChangeSlice/PsPlaceOrder.res +24 -0
- package/tests/plugin/StateChangeSlice/PsPlaceOrder.res.mjs +62 -0
- package/tests/plugin/StateChangeSlice/PsShipOrder.res +29 -0
- package/tests/plugin/StateChangeSlice/PsShipOrder.res.mjs +69 -0
- package/tests/plugin/StateViewSlice/PsAnnotatedView.res +24 -0
- package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +94 -0
- package/tests/plugin/StateViewSlice/PsAvailableProductsView.res +18 -0
- package/tests/plugin/StateViewSlice/PsAvailableProductsView.res.mjs +69 -0
- package/tests/plugin/StateViewSlice/PsCustomersView.res +22 -0
- package/tests/plugin/StateViewSlice/PsCustomersView.res.mjs +69 -0
- package/tests/plugin/StateViewSlice/PsOrdersView.res +20 -0
- package/tests/plugin/StateViewSlice/PsOrdersView.res.mjs +81 -0
- package/tests/poc/StructuralSubtypingPoc.res +211 -0
- package/tests/poc/StructuralSubtypingPoc.res.mjs +61 -0
- package/tests/querydb/QueryDbFixtures.res +65 -0
- package/tests/querydb/QueryDbFixtures.res.mjs +135 -0
- package/tests/querydb/QueryDbOperationsTest.res +94 -0
- package/tests/querydb/QueryDbOperationsTest.res.mjs +168 -0
- package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res +56 -0
- package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res.mjs +77 -0
- package/tests/sideeffecthandler/SideEffectHandlerFixtures.res +96 -0
- package/tests/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +139 -0
- package/tests/util/CsvStreamTest.res +54 -0
- package/tests/util/CsvStreamTest.res.mjs +51 -0
- package/tests/util/LruTest.res +73 -0
- package/tests/util/LruTest.res.mjs +105 -0
- package/tests/util/MetricsTest.res +36 -0
- 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
|
+
})
|