@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,137 @@
|
|
|
1
|
+
// Verifies that ReadModel.Spec.visibility flows through PPX injection, that the
|
|
2
|
+
// filter predicate used by Plugin_Builder.makeAutoUIManifest excludes Internal
|
|
3
|
+
// entries while leaving Public ones intact, and that Plugin_Structure.make
|
|
4
|
+
// CARRIES Internal entries but tags them via `queryableDef.visibility` (the
|
|
5
|
+
// dev-graph contract). Does NOT instantiate the full Plugin_Builder.Make functor
|
|
6
|
+
// — the filter is a pure switch on a Spec field and is therefore testable in
|
|
7
|
+
// isolation via stubbed ReadModel.T modules.
|
|
8
|
+
|
|
9
|
+
open JestGlobals
|
|
10
|
+
|
|
11
|
+
// Public ReadModel — no @@reventless.visibility attribute, PPX defaults to Public.
|
|
12
|
+
module PublicSpec = {
|
|
13
|
+
module Id = Reventless.Id.StringPure
|
|
14
|
+
let name = "PublicView"
|
|
15
|
+
let moduleUrl = ""
|
|
16
|
+
|
|
17
|
+
@schema
|
|
18
|
+
type state = {id: string, name: string}
|
|
19
|
+
|
|
20
|
+
let config = Reventless.ReadModel.config()
|
|
21
|
+
let subIdConfig = None
|
|
22
|
+
// PPX walk_inline_specs injects authorization = AllowAuthenticated
|
|
23
|
+
// visibility = Public
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Internal ReadModel — manually setting visibility = Internal here mirrors what
|
|
27
|
+
// @@reventless.visibility(Internal) injects in a real spec file.
|
|
28
|
+
module InternalSpec = {
|
|
29
|
+
module Id = Reventless.Id.StringPure
|
|
30
|
+
let name = "InternalView"
|
|
31
|
+
let moduleUrl = ""
|
|
32
|
+
|
|
33
|
+
@schema
|
|
34
|
+
type state = {id: string, name: string}
|
|
35
|
+
|
|
36
|
+
let config = Reventless.ReadModel.config()
|
|
37
|
+
let subIdConfig = None
|
|
38
|
+
let visibility: Reventless.Visibility.t = Internal
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module PublicReadModel: ReventlessInfra.ReadModel.T
|
|
42
|
+
with type api = unit and type role = unit = {
|
|
43
|
+
module Spec = PublicSpec
|
|
44
|
+
type api = unit
|
|
45
|
+
type role = unit
|
|
46
|
+
type component
|
|
47
|
+
let sourceNames: array<string> = []
|
|
48
|
+
let make = (~api as _, ~apiRole as _, ~allEventTopics as _, ~opts as _=?): component =>
|
|
49
|
+
Obj.magic(0)
|
|
50
|
+
let outputs = (_: component): ReventlessInfra.ReadModel.outputs => Obj.magic(0)
|
|
51
|
+
let operations = (_: component): Pulumi.Output.t<ReventlessInfra.ReadModel.operations> =>
|
|
52
|
+
Obj.magic(0)
|
|
53
|
+
let finish = () => ()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module InternalReadModel: ReventlessInfra.ReadModel.T
|
|
57
|
+
with type api = unit and type role = unit = {
|
|
58
|
+
module Spec = InternalSpec
|
|
59
|
+
type api = unit
|
|
60
|
+
type role = unit
|
|
61
|
+
type component
|
|
62
|
+
let sourceNames: array<string> = []
|
|
63
|
+
let make = (~api as _, ~apiRole as _, ~allEventTopics as _, ~opts as _=?): component =>
|
|
64
|
+
Obj.magic(0)
|
|
65
|
+
let outputs = (_: component): ReventlessInfra.ReadModel.outputs => Obj.magic(0)
|
|
66
|
+
let operations = (_: component): Pulumi.Output.t<ReventlessInfra.ReadModel.operations> =>
|
|
67
|
+
Obj.magic(0)
|
|
68
|
+
let finish = () => ()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let isVisible = (
|
|
72
|
+
module(R: ReventlessInfra.ReadModel.T with type api = unit and type role = unit),
|
|
73
|
+
): bool =>
|
|
74
|
+
switch R.Spec.visibility {
|
|
75
|
+
| Public => true
|
|
76
|
+
| Internal => false
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let readModels: array<
|
|
80
|
+
module(ReventlessInfra.ReadModel.T with type api = unit and type role = unit),
|
|
81
|
+
> = [module(PublicReadModel), module(InternalReadModel)]
|
|
82
|
+
|
|
83
|
+
describe("ReadModel visibility filter", () => {
|
|
84
|
+
testSync("PPX defaults visibility to Public when no attribute is present", () => {
|
|
85
|
+
expect(PublicSpec.visibility)->toEqual(Reventless.Visibility.Public)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
testSync("Internal spec retains Internal value", () => {
|
|
89
|
+
expect(InternalSpec.visibility)->toEqual(Reventless.Visibility.Internal)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
testSync("filter predicate excludes Internal", () => {
|
|
93
|
+
let visible = readModels->Array.filter(isVisible)
|
|
94
|
+
expect(visible->Array.length)->toBe(1)
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
testSync("filter predicate retains Public name", () => {
|
|
98
|
+
let visible = readModels->Array.filter(isVisible)
|
|
99
|
+
let first = visible->Array.getUnsafe(0)
|
|
100
|
+
let module(R) = first
|
|
101
|
+
expect(R.Spec.name)->toEqual("PublicView")
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
testSync("unfiltered list still contains both entries (no over-filtering)", () => {
|
|
105
|
+
expect(readModels->Array.length)->toBe(2)
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
describe("Plugin_Structure.make — visibility tagging", () => {
|
|
110
|
+
// pluginStructure CARRIES Internal read models (so the dev graph / dead-code
|
|
111
|
+
// tools can see them) and tags each via `queryableDef.visibility`
|
|
112
|
+
// (`None` = Public, `Some("Internal")` = Internal). The deployed AutoUI
|
|
113
|
+
// consumers re-filter on that tag — visibility does not remove entries from
|
|
114
|
+
// pluginStructure itself. See Plugin_Structure.res / Visibility.res.
|
|
115
|
+
let structure = Plugin_Structure.make(~name="VisibilityPlugin", ~readModels)
|
|
116
|
+
|
|
117
|
+
testSync("readModels carries both Public and Internal entries", () => {
|
|
118
|
+
expect(structure.readModels->Array.length)->toBe(2)
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
testSync("the Public entry is tagged visibility = None", () => {
|
|
122
|
+
let public = structure.readModels->Array.find(d => d.name == "PublicView")
|
|
123
|
+
expect(public->Option.map(d => d.visibility))->toEqual(Some(None))
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
testSync("the Internal entry is carried and tagged visibility = Some(\"Internal\")", () => {
|
|
127
|
+
let internal = structure.readModels->Array.find(d => d.name == "InternalView")
|
|
128
|
+
expect(internal->Option.map(d => d.visibility))->toEqual(Some(Some("Internal")))
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
testSync("aggregates / stateViewSlices stay empty when none are passed (sanity)", () => {
|
|
132
|
+
expect((
|
|
133
|
+
structure.aggregates->Array.length,
|
|
134
|
+
structure.stateViewSlices->Array.length,
|
|
135
|
+
))->toEqual((0, 0))
|
|
136
|
+
})
|
|
137
|
+
})
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
|
|
5
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
6
|
+
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
7
|
+
import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
|
|
8
|
+
import * as Plugin_Structure$ReventlessCore from "../../src/plugin/component/Plugin_Structure.res.mjs";
|
|
9
|
+
|
|
10
|
+
let name = "PublicView";
|
|
11
|
+
|
|
12
|
+
let moduleUrl = "";
|
|
13
|
+
|
|
14
|
+
let stateSchema = S.schema(s => ({
|
|
15
|
+
id: s.m(S.string),
|
|
16
|
+
name: s.m(S.string)
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
let config = ReadModel$Reventless.config(undefined, undefined, undefined);
|
|
20
|
+
|
|
21
|
+
let PublicSpec = {
|
|
22
|
+
Id: undefined,
|
|
23
|
+
name: name,
|
|
24
|
+
moduleUrl: moduleUrl,
|
|
25
|
+
stateSchema: stateSchema,
|
|
26
|
+
config: config,
|
|
27
|
+
subIdConfig: undefined,
|
|
28
|
+
authorization: "AllowAuthenticated",
|
|
29
|
+
visibility: "Public"
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
let name$1 = "InternalView";
|
|
33
|
+
|
|
34
|
+
let moduleUrl$1 = "";
|
|
35
|
+
|
|
36
|
+
let stateSchema$1 = S.schema(s => ({
|
|
37
|
+
id: s.m(S.string),
|
|
38
|
+
name: s.m(S.string)
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
let config$1 = ReadModel$Reventless.config(undefined, undefined, undefined);
|
|
42
|
+
|
|
43
|
+
let InternalSpec = {
|
|
44
|
+
Id: undefined,
|
|
45
|
+
name: name$1,
|
|
46
|
+
moduleUrl: moduleUrl$1,
|
|
47
|
+
stateSchema: stateSchema$1,
|
|
48
|
+
config: config$1,
|
|
49
|
+
subIdConfig: undefined,
|
|
50
|
+
visibility: "Internal",
|
|
51
|
+
authorization: "AllowAuthenticated"
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let sourceNames = [];
|
|
55
|
+
|
|
56
|
+
function make(param, param$1, param$2, param$3) {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function outputs(param) {
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function operations(param) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function finish() {
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let PublicReadModel_Spec = {
|
|
73
|
+
Id: {
|
|
74
|
+
schema: Id$Reventless.StringPure.schema,
|
|
75
|
+
make: prim => prim,
|
|
76
|
+
makeFromString: prim => prim,
|
|
77
|
+
toString: prim => prim,
|
|
78
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
79
|
+
},
|
|
80
|
+
name: name,
|
|
81
|
+
moduleUrl: moduleUrl,
|
|
82
|
+
stateSchema: stateSchema,
|
|
83
|
+
config: config,
|
|
84
|
+
subIdConfig: undefined,
|
|
85
|
+
authorization: "AllowAuthenticated",
|
|
86
|
+
visibility: "Public"
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
let PublicReadModel = {
|
|
90
|
+
Spec: PublicReadModel_Spec,
|
|
91
|
+
sourceNames: sourceNames,
|
|
92
|
+
make: make,
|
|
93
|
+
outputs: outputs,
|
|
94
|
+
operations: operations,
|
|
95
|
+
finish: finish
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
let sourceNames$1 = [];
|
|
99
|
+
|
|
100
|
+
function make$1(param, param$1, param$2, param$3) {
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function outputs$1(param) {
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function operations$1(param) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function finish$1() {
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let InternalReadModel_Spec = {
|
|
117
|
+
Id: {
|
|
118
|
+
schema: Id$Reventless.StringPure.schema,
|
|
119
|
+
make: prim => prim,
|
|
120
|
+
makeFromString: prim => prim,
|
|
121
|
+
toString: prim => prim,
|
|
122
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
123
|
+
},
|
|
124
|
+
name: name$1,
|
|
125
|
+
moduleUrl: moduleUrl$1,
|
|
126
|
+
stateSchema: stateSchema$1,
|
|
127
|
+
config: config$1,
|
|
128
|
+
subIdConfig: undefined,
|
|
129
|
+
authorization: "AllowAuthenticated",
|
|
130
|
+
visibility: "Internal"
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
let InternalReadModel = {
|
|
134
|
+
Spec: InternalReadModel_Spec,
|
|
135
|
+
sourceNames: sourceNames$1,
|
|
136
|
+
make: make$1,
|
|
137
|
+
outputs: outputs$1,
|
|
138
|
+
operations: operations$1,
|
|
139
|
+
finish: finish$1
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
function isVisible(R) {
|
|
143
|
+
let match = R.Spec.visibility;
|
|
144
|
+
return match === "Public";
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let readModels = [
|
|
148
|
+
PublicReadModel,
|
|
149
|
+
InternalReadModel
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
globalThis.describe("ReadModel visibility filter", () => {
|
|
153
|
+
globalThis.test("PPX defaults visibility to Public when no attribute is present", () => {
|
|
154
|
+
globalThis.expect("Public").toEqual("Public");
|
|
155
|
+
});
|
|
156
|
+
globalThis.test("Internal spec retains Internal value", () => {
|
|
157
|
+
globalThis.expect("Internal").toEqual("Internal");
|
|
158
|
+
});
|
|
159
|
+
globalThis.test("filter predicate excludes Internal", () => {
|
|
160
|
+
let visible = readModels.filter(isVisible);
|
|
161
|
+
globalThis.expect(visible.length).toBe(1);
|
|
162
|
+
});
|
|
163
|
+
globalThis.test("filter predicate retains Public name", () => {
|
|
164
|
+
let visible = readModels.filter(isVisible);
|
|
165
|
+
let first = visible[0];
|
|
166
|
+
globalThis.expect(first.Spec.name).toEqual("PublicView");
|
|
167
|
+
});
|
|
168
|
+
globalThis.test("unfiltered list still contains both entries (no over-filtering)", () => {
|
|
169
|
+
globalThis.expect(readModels.length).toBe(2);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
globalThis.describe("Plugin_Structure.make — visibility tagging", () => {
|
|
174
|
+
let structure = Plugin_Structure$ReventlessCore.make("VisibilityPlugin", undefined, readModels, undefined, undefined, undefined, undefined, undefined, undefined, undefined);
|
|
175
|
+
globalThis.test("readModels carries both Public and Internal entries", () => {
|
|
176
|
+
globalThis.expect(structure.readModels.length).toBe(2);
|
|
177
|
+
});
|
|
178
|
+
globalThis.test("the Public entry is tagged visibility = None", () => {
|
|
179
|
+
let $$public = structure.readModels.find(d => d.name === "PublicView");
|
|
180
|
+
globalThis.expect(Stdlib_Option.map($$public, d => d.visibility)).toEqual(Primitive_option.some(undefined));
|
|
181
|
+
});
|
|
182
|
+
globalThis.test("the Internal entry is carried and tagged visibility = Some(\"Internal\")", () => {
|
|
183
|
+
let internal = structure.readModels.find(d => d.name === "InternalView");
|
|
184
|
+
globalThis.expect(Stdlib_Option.map(internal, d => d.visibility)).toEqual("Internal");
|
|
185
|
+
});
|
|
186
|
+
globalThis.test("aggregates / stateViewSlices stay empty when none are passed (sanity)", () => {
|
|
187
|
+
globalThis.expect([
|
|
188
|
+
structure.aggregates.length,
|
|
189
|
+
structure.stateViewSlices.length
|
|
190
|
+
]).toEqual([
|
|
191
|
+
0,
|
|
192
|
+
0
|
|
193
|
+
]);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
export {
|
|
198
|
+
PublicSpec,
|
|
199
|
+
InternalSpec,
|
|
200
|
+
PublicReadModel,
|
|
201
|
+
InternalReadModel,
|
|
202
|
+
isVisible,
|
|
203
|
+
readModels,
|
|
204
|
+
}
|
|
205
|
+
/* stateSchema Not a pure module */
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
S.enableJson()
|
|
2
|
+
|
|
3
|
+
@schema
|
|
4
|
+
type record = {
|
|
5
|
+
a: @s.meta({description: "aaa"}) string,
|
|
6
|
+
b: string,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@schema
|
|
10
|
+
type variant = | @s.meta({description: "QQQ"}) Q(int) | @s.meta({description: "XXX"}) X | Y
|
|
11
|
+
|
|
12
|
+
Console.log2("Record:", recordSchema->S.toJSONSchema->JSON.stringifyAny(~space=2))
|
|
13
|
+
Console.log2("Variant:", variantSchema->S.toJSONSchema->JSON.stringifyAny(~space=2))
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
|
|
5
|
+
S.enableJson();
|
|
6
|
+
|
|
7
|
+
let recordSchema = S.schema(s => ({
|
|
8
|
+
a: s.m(S.meta(S.string, {
|
|
9
|
+
description: "aaa"
|
|
10
|
+
})),
|
|
11
|
+
b: s.m(S.string)
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
let variantSchema = S.union([
|
|
15
|
+
S.schema(s => ({
|
|
16
|
+
TAG: "Q",
|
|
17
|
+
_0: s.m(S.int)
|
|
18
|
+
})),
|
|
19
|
+
S.literal("X"),
|
|
20
|
+
S.literal("Y")
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
console.log("Record:", JSON.stringify(S.toJSONSchema(recordSchema), undefined, 2));
|
|
24
|
+
|
|
25
|
+
console.log("Variant:", JSON.stringify(S.toJSONSchema(variantSchema), undefined, 2));
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
recordSchema,
|
|
29
|
+
variantSchema,
|
|
30
|
+
}
|
|
31
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// Phase 2 validation: Plugin_Structure.make populates all graph fields correctly.
|
|
2
|
+
// Uses simplified test specs (PsPlaceOrder, PsShipOrder, PsOrdersView, PsAvailableProductsView)
|
|
3
|
+
// and calls Plugin_Structure.make directly — no Platform needed.
|
|
4
|
+
|
|
5
|
+
open JestGlobals
|
|
6
|
+
|
|
7
|
+
// Stub T modules — Plugin_Structure.make only reads `Spec` fields; `make` is never called.
|
|
8
|
+
type scsComponent = Component.t<
|
|
9
|
+
ReventlessInfra.StateChangeSlice.t,
|
|
10
|
+
ReventlessInfra.StateChangeSlice.outputs,
|
|
11
|
+
ReventlessInfra.StateChangeSlice.operations,
|
|
12
|
+
>
|
|
13
|
+
type svsComponent = Component.t<
|
|
14
|
+
ReventlessInfra.StateViewSlice.t,
|
|
15
|
+
ReventlessInfra.StateViewSlice.outputs,
|
|
16
|
+
ReventlessInfra.StateViewSlice.operations,
|
|
17
|
+
>
|
|
18
|
+
|
|
19
|
+
module PsPlaceOrderSlice: ReventlessInfra.StateChangeSlice.T = {
|
|
20
|
+
module Spec = PsPlaceOrder
|
|
21
|
+
module Behavior = {
|
|
22
|
+
type state = PsPlaceOrder.state
|
|
23
|
+
let initialState = PsPlaceOrder.initialState
|
|
24
|
+
let evolve = PsPlaceOrder.evolve
|
|
25
|
+
let decide = PsPlaceOrder.decide
|
|
26
|
+
let moduleUrl = PsPlaceOrder.moduleUrl
|
|
27
|
+
}
|
|
28
|
+
let isAsync = false
|
|
29
|
+
type component = scsComponent
|
|
30
|
+
let make = (~dcbEventLog as _, ~publishJsons as _, ~tagKeysByEventType as _=?, ~crossPartitionTagKeys as _=?, ~opts as _=?): component => Obj.magic(0)
|
|
31
|
+
}
|
|
32
|
+
module PsShipOrderSlice: ReventlessInfra.StateChangeSlice.T = {
|
|
33
|
+
module Spec = PsShipOrder
|
|
34
|
+
module Behavior = {
|
|
35
|
+
type state = PsShipOrder.state
|
|
36
|
+
let initialState = PsShipOrder.initialState
|
|
37
|
+
let evolve = PsShipOrder.evolve
|
|
38
|
+
let decide = PsShipOrder.decide
|
|
39
|
+
let moduleUrl = PsShipOrder.moduleUrl
|
|
40
|
+
}
|
|
41
|
+
let isAsync = false
|
|
42
|
+
type component = scsComponent
|
|
43
|
+
let make = (~dcbEventLog as _, ~publishJsons as _, ~tagKeysByEventType as _=?, ~crossPartitionTagKeys as _=?, ~opts as _=?): component => Obj.magic(0)
|
|
44
|
+
}
|
|
45
|
+
module PsOrdersViewSlice: ReventlessInfra.StateViewSlice.T = {
|
|
46
|
+
module Spec = PsOrdersView
|
|
47
|
+
module Projection = {
|
|
48
|
+
let project = PsOrdersView.project
|
|
49
|
+
let moduleUrl = PsOrdersView.moduleUrl
|
|
50
|
+
}
|
|
51
|
+
type component = svsComponent
|
|
52
|
+
let make = (~dcbEventLog as _, ~opts as _=?): component => Obj.magic(0)
|
|
53
|
+
}
|
|
54
|
+
module PsAvailableProductsViewSlice: ReventlessInfra.StateViewSlice.T = {
|
|
55
|
+
module Spec = PsAvailableProductsView
|
|
56
|
+
module Projection = {
|
|
57
|
+
let project = PsAvailableProductsView.project
|
|
58
|
+
let moduleUrl = PsAvailableProductsView.moduleUrl
|
|
59
|
+
}
|
|
60
|
+
type component = svsComponent
|
|
61
|
+
let make = (~dcbEventLog as _, ~opts as _=?): component => Obj.magic(0)
|
|
62
|
+
}
|
|
63
|
+
module PsCustomersViewSlice: ReventlessInfra.StateViewSlice.T = {
|
|
64
|
+
module Spec = PsCustomersView
|
|
65
|
+
module Projection = {
|
|
66
|
+
let project = PsCustomersView.project
|
|
67
|
+
let moduleUrl = PsCustomersView.moduleUrl
|
|
68
|
+
}
|
|
69
|
+
type component = svsComponent
|
|
70
|
+
let make = (~dcbEventLog as _, ~opts as _=?): component => Obj.magic(0)
|
|
71
|
+
}
|
|
72
|
+
module PsAnnotatedViewSlice: ReventlessInfra.StateViewSlice.T = {
|
|
73
|
+
module Spec = PsAnnotatedView
|
|
74
|
+
module Projection = {
|
|
75
|
+
let project = PsAnnotatedView.project
|
|
76
|
+
let moduleUrl = PsAnnotatedView.moduleUrl
|
|
77
|
+
}
|
|
78
|
+
type component = svsComponent
|
|
79
|
+
let make = (~dcbEventLog as _, ~opts as _=?): component => Obj.magic(0)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let structure = Plugin_Structure.make(
|
|
83
|
+
~name="TestPlugin",
|
|
84
|
+
~stateChangeSlices=[module(PsPlaceOrderSlice), module(PsShipOrderSlice)],
|
|
85
|
+
~stateViewSlices=[
|
|
86
|
+
module(PsOrdersViewSlice),
|
|
87
|
+
module(PsAvailableProductsViewSlice),
|
|
88
|
+
module(PsCustomersViewSlice),
|
|
89
|
+
module(PsAnnotatedViewSlice),
|
|
90
|
+
],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
describe("Plugin_Structure.make — Phase 2 graph fields", () => {
|
|
94
|
+
describe("stateChangeSlices", () => {
|
|
95
|
+
testSync("produces two SCS entries in declaration order", () => {
|
|
96
|
+
expect(structure.stateChangeSlices->Array.length)->toBe(2)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
testSync("PlaceOrder: producedEventTypes contains OrderPlaced (qualified)", () => {
|
|
100
|
+
let placeOrder = structure.stateChangeSlices->Array.getUnsafe(0)
|
|
101
|
+
expect(placeOrder.producedEventTypes)->toEqual(["TestPlugin.OrderPlaced"])
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
testSync("PlaceOrder: consumedEventTypes contains CatalogProductSynced qualified (payload-less variants excluded)", () => {
|
|
105
|
+
let placeOrder = structure.stateChangeSlices->Array.getUnsafe(0)
|
|
106
|
+
expect(placeOrder.consumedEventTypes)->toEqual(["TestPlugin.CatalogProductSynced"])
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
testSync("PlaceOrder: linkedViews contains Orders (consumes its OrderPlaced)", () => {
|
|
110
|
+
let placeOrder = structure.stateChangeSlices->Array.getUnsafe(0)
|
|
111
|
+
expect(placeOrder.linkedViews)->toEqual(["Orders"])
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
testSync("PlaceOrder: consistencyRead is AvailableProducts (only SVS consuming CatalogProductSynced)", () => {
|
|
115
|
+
let placeOrder = structure.stateChangeSlices->Array.getUnsafe(0)
|
|
116
|
+
expect(placeOrder.consistencyRead)->toEqual(Some("AvailableProducts"))
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
testSync("PlaceOrder command: level Collection (creation command), aggregateIdField orderId for UUID injection", () => {
|
|
120
|
+
let placeOrder = structure.stateChangeSlices->Array.getUnsafe(0)
|
|
121
|
+
let cmd = placeOrder.commands->Array.getUnsafe(0)
|
|
122
|
+
expect((cmd.level, cmd.aggregateIdField))->toEqual((
|
|
123
|
+
Reventless.Plugin.Collection,
|
|
124
|
+
Some("orderId"),
|
|
125
|
+
))
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
testSync("ShipOrder: producedEventTypes contains OrderShipped (qualified)", () => {
|
|
129
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
130
|
+
expect(shipOrder.producedEventTypes)->toEqual(["TestPlugin.OrderShipped"])
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
testSync("ShipOrder: consumedEventTypes is empty (all consumed events are payload-less literals)", () => {
|
|
134
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
135
|
+
expect(shipOrder.consumedEventTypes)->toEqual([])
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
testSync("ShipOrder: linkedViews contains Orders (consumes its OrderShipped)", () => {
|
|
139
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
140
|
+
expect(shipOrder.linkedViews)->toEqual(["Orders"])
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
testSync("ShipOrder: consistencyRead is None (empty consumedEventTypes cannot overlap any SVS)", () => {
|
|
144
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
145
|
+
expect(shipOrder.consistencyRead)->toEqual(None)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
testSync("ShipOrder command: level Instance, aggregateIdField orderId", () => {
|
|
149
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
150
|
+
let cmd = shipOrder.commands->Array.getUnsafe(0)
|
|
151
|
+
expect((cmd.level, cmd.aggregateIdField))->toEqual((
|
|
152
|
+
Reventless.Plugin.Instance,
|
|
153
|
+
Some("orderId"),
|
|
154
|
+
))
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
testSync("ShipOrder: payload-less command CancelShipment is surfaced in commands", () => {
|
|
158
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
159
|
+
expect(shipOrder.commands->Array.map(c => c.name))->toEqual(["ShipOrder", "CancelShipment"])
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
testSync("ShipOrder: payload-less event ShipmentVoided is surfaced in events", () => {
|
|
163
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
164
|
+
expect(shipOrder.events->Array.map(e => e.name))->toEqual(["OrderShipped", "ShipmentVoided"])
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
testSync("ShipOrder: producedEventTypes still excludes the payload-less ShipmentVoided (DCB filter intact)", () => {
|
|
168
|
+
let shipOrder = structure.stateChangeSlices->Array.getUnsafe(1)
|
|
169
|
+
expect(shipOrder.producedEventTypes)->toEqual(["TestPlugin.OrderShipped"])
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
describe("stateViewSlices", () => {
|
|
174
|
+
testSync("produces four SVS entries in declaration order", () => {
|
|
175
|
+
expect(structure.stateViewSlices->Array.length)->toBe(4)
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
testSync("OrdersView: consumedEventTypes contains the three order events (qualified)", () => {
|
|
179
|
+
let ordersView = structure.stateViewSlices->Array.getUnsafe(0)
|
|
180
|
+
expect(ordersView.consumedEventTypes)->toEqual([
|
|
181
|
+
"TestPlugin.OrderPlaced",
|
|
182
|
+
"TestPlugin.OrderShipped",
|
|
183
|
+
"TestPlugin.OrderCancelled",
|
|
184
|
+
])
|
|
185
|
+
})
|
|
186
|
+
|
|
187
|
+
testSync("OrdersView: linkedWriteSide contains both SCS producing order events", () => {
|
|
188
|
+
let ordersView = structure.stateViewSlices->Array.getUnsafe(0)
|
|
189
|
+
expect(ordersView.linkedWriteSide)->toEqual(["PlaceOrder", "ShipOrder"])
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
testSync("AvailableProductsView: consumedEventTypes contains catalog events (qualified)", () => {
|
|
193
|
+
let apv = structure.stateViewSlices->Array.getUnsafe(1)
|
|
194
|
+
expect(apv.consumedEventTypes)->toEqual([
|
|
195
|
+
"TestPlugin.CatalogProductSynced",
|
|
196
|
+
"TestPlugin.CatalogProductPriceChanged",
|
|
197
|
+
])
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
testSync("AvailableProductsView: linkedWriteSide is empty (no SCS produces these events)", () => {
|
|
201
|
+
let apv = structure.stateViewSlices->Array.getUnsafe(1)
|
|
202
|
+
expect(apv.linkedWriteSide)->toEqual([])
|
|
203
|
+
})
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
describe("labelField / searchableFields", () => {
|
|
207
|
+
testSync("OrdersView: no @displayName → first non-`*Id` string field wins (customerName)", () => {
|
|
208
|
+
let ordersView = structure.stateViewSlices->Array.getUnsafe(0)
|
|
209
|
+
expect((ordersView.labelField, ordersView.searchableFields))->toEqual((
|
|
210
|
+
"customerName",
|
|
211
|
+
["customerName"],
|
|
212
|
+
))
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
testSync("AvailableProductsView: no @displayName → first non-`*Id` string field wins (name)", () => {
|
|
216
|
+
let apv = structure.stateViewSlices->Array.getUnsafe(1)
|
|
217
|
+
expect((apv.labelField, apv.searchableFields))->toEqual(("name", ["name"]))
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
testSync("Customers: composite @displayName → labelField=displayName, searchableFields=raw source fields in declaration order", () => {
|
|
221
|
+
let customers = structure.stateViewSlices->Array.getUnsafe(2)
|
|
222
|
+
expect((customers.labelField, customers.searchableFields))->toEqual((
|
|
223
|
+
"displayName",
|
|
224
|
+
["firstName", "lastName"],
|
|
225
|
+
))
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
// Phase 4: queryableDef.schema must carry x-reventless-* extension keys for
|
|
230
|
+
// annotated state types. Plugin_Structure now uses SuryToJsonSchema.deriveObjectSchema
|
|
231
|
+
// (annotation-aware) instead of S.toJSONSchema (metadata-blind).
|
|
232
|
+
describe("queryableDef.schema propagates x-reventless-* annotations", () => {
|
|
233
|
+
let getProperty = (json: JSON.t, key: string): option<JSON.t> =>
|
|
234
|
+
switch json->JSON.Decode.object {
|
|
235
|
+
| Some(obj) => obj->Dict.get(key)
|
|
236
|
+
| None => None
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
let getPropertyOf = (json: JSON.t, fieldName: string): option<JSON.t> =>
|
|
240
|
+
switch getProperty(json, "properties") {
|
|
241
|
+
| Some(props) =>
|
|
242
|
+
switch props->JSON.Decode.object {
|
|
243
|
+
| Some(obj) => obj->Dict.get(fieldName)
|
|
244
|
+
| None => None
|
|
245
|
+
}
|
|
246
|
+
| None => None
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
let parseSchema = (svs: Reventless.Plugin.queryableDef): JSON.t =>
|
|
250
|
+
svs.schema->JSON.parseOrThrow
|
|
251
|
+
|
|
252
|
+
let annotatedSchema = structure.stateViewSlices->Array.getUnsafe(3)->parseSchema
|
|
253
|
+
|
|
254
|
+
testSync("itemId carries x-reventless-id", () => {
|
|
255
|
+
expect(
|
|
256
|
+
annotatedSchema
|
|
257
|
+
->getPropertyOf("itemId")
|
|
258
|
+
->Option.flatMap(s => getProperty(s, "x-reventless-id"))
|
|
259
|
+
->Option.flatMap(JSON.Decode.bool),
|
|
260
|
+
)->toBe(Some(true))
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
testSync("version carries x-reventless-subId", () => {
|
|
264
|
+
expect(
|
|
265
|
+
annotatedSchema
|
|
266
|
+
->getPropertyOf("version")
|
|
267
|
+
->Option.flatMap(s => getProperty(s, "x-reventless-subId"))
|
|
268
|
+
->Option.flatMap(JSON.Decode.bool),
|
|
269
|
+
)->toBe(Some(true))
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
testSync("ownerId carries x-reventless-index = byOwner", () => {
|
|
273
|
+
expect(
|
|
274
|
+
annotatedSchema
|
|
275
|
+
->getPropertyOf("ownerId")
|
|
276
|
+
->Option.flatMap(s => getProperty(s, "x-reventless-index"))
|
|
277
|
+
->Option.flatMap(JSON.Decode.string),
|
|
278
|
+
)->toBe(Some("byOwner"))
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
testSync("unannotated field 'name' has no x-reventless-* keys", () => {
|
|
282
|
+
let nameField = annotatedSchema->getPropertyOf("name")
|
|
283
|
+
expect((
|
|
284
|
+
nameField->Option.flatMap(s => getProperty(s, "x-reventless-id")),
|
|
285
|
+
nameField->Option.flatMap(s => getProperty(s, "x-reventless-subId")),
|
|
286
|
+
nameField->Option.flatMap(s => getProperty(s, "x-reventless-index")),
|
|
287
|
+
))->toEqual((None, None, None))
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
testSync("unannotated state-view slice (Orders) emits no x-reventless-* keys", () => {
|
|
291
|
+
let ordersSchema = structure.stateViewSlices->Array.getUnsafe(0)->parseSchema
|
|
292
|
+
let orderIdField = ordersSchema->getPropertyOf("orderId")
|
|
293
|
+
expect(
|
|
294
|
+
orderIdField->Option.flatMap(s => getProperty(s, "x-reventless-id")),
|
|
295
|
+
)->toBe(None)
|
|
296
|
+
})
|
|
297
|
+
})
|
|
298
|
+
})
|