@reventlessdev/reventless-local 3.0.0-alpha.113
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 +1197 -0
- package/LICENSE +202 -0
- package/__mocks__/emptyModule.js +2 -0
- package/__mocks__/nodeSqlite.mjs +6 -0
- package/package.json +67 -0
- package/rescript.json +39 -0
- package/src/Platform.res +2162 -0
- package/src/Platform.res.mjs +3389 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
- package/src/adapter/Auth/LocalAuth.res +239 -0
- package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
- package/src/adapter/Auth/UserStore.res +134 -0
- package/src/adapter/Auth/UserStore.res.mjs +146 -0
- package/src/adapter/Backend.res +46 -0
- package/src/adapter/Backend.res.mjs +66 -0
- package/src/adapter/BackendState.res +34 -0
- package/src/adapter/BackendState.res.mjs +42 -0
- package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
- package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
- package/src/adapter/Counter/LocalCounterHandler.res +42 -0
- package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
- package/src/adapter/DomainGraphQL_Server.res +565 -0
- package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
- package/src/adapter/DomainMCP_Server.res +369 -0
- package/src/adapter/DomainMCP_Server.res.mjs +358 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
- package/src/adapter/GraphQL_Server.res +6 -0
- package/src/adapter/GraphQL_Server.res.mjs +154 -0
- package/src/adapter/GraphQL_ServerInstance.res +310 -0
- package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
- package/src/adapter/LocalBus.res +498 -0
- package/src/adapter/LocalBus.res.mjs +1011 -0
- package/src/adapter/LocalPluginSpec.res +16 -0
- package/src/adapter/LocalPluginSpec.res.mjs +33 -0
- package/src/adapter/LocalSideEffectHandler.res +44 -0
- package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
- package/src/adapter/MCP_Server.res +4 -0
- package/src/adapter/MCP_Server.res.mjs +67 -0
- package/src/adapter/MCP_ServerInstance.res +362 -0
- package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
- package/src/adapter/PlatformGraphQL_Server.res +75 -0
- package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
- package/src/adapter/PlatformMCP_Server.res +23 -0
- package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
- package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
- package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
- package/src/adapter/SqliteDriver.res +52 -0
- package/src/adapter/SqliteDriver.res.mjs +76 -0
- package/src/adapter/SqliteDriver.resi +31 -0
- package/src/adapter/Task/LocalTaskBucket.res +75 -0
- package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
- package/src/components/Aggregate_Builder.res +55 -0
- package/src/components/Aggregate_Builder.res.mjs +140 -0
- package/src/components/AutomationSlice_Builder.res +41 -0
- package/src/components/AutomationSlice_Builder.res.mjs +57 -0
- package/src/components/Counter_Builder.res +14 -0
- package/src/components/Counter_Builder.res.mjs +32 -0
- package/src/components/DcbEventLog_Builder.res +18 -0
- package/src/components/DcbEventLog_Builder.res.mjs +24 -0
- package/src/components/ExtensionPoint_Builder.res +25 -0
- package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
- package/src/components/InboundTranslationSlice_Builder.res +34 -0
- package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
- package/src/components/OutboundTranslationSlice_Builder.res +43 -0
- package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
- package/src/components/Plugin_Builder.res +37 -0
- package/src/components/Plugin_Builder.res.mjs +67 -0
- package/src/components/ReadModel_Builder.res +47 -0
- package/src/components/ReadModel_Builder.res.mjs +54 -0
- package/src/components/StateChangeSlice_Builder.res +19 -0
- package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
- package/src/components/StateViewSlice_Builder.res +42 -0
- package/src/components/StateViewSlice_Builder.res.mjs +58 -0
- package/src/components/Task_Builder.res +28 -0
- package/src/components/Task_Builder.res.mjs +41 -0
- package/src/reexport/CommandTopic.res +3 -0
- package/src/reexport/CommandTopic.res.mjs +55 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
- package/src/test/Mocks/MockEventLogStorage.res +57 -0
- package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
- package/src/test/Mocks/MockPublisher.res +29 -0
- package/src/test/Mocks/MockPublisher.res.mjs +28 -0
- package/src/test/Mocks/MockQueryDbStorage.res +104 -0
- package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
- package/src/test/TestRunner.res +96 -0
- package/src/test/TestRunner.res.mjs +71 -0
- package/tests/SplitApiFixtures.res +84 -0
- package/tests/SplitApiFixtures.res.mjs +88 -0
- package/tests/SplitApiTest.res +102 -0
- package/tests/SplitApiTest.res.mjs +82 -0
- package/tests/TestFixtures.res +54 -0
- package/tests/TestFixtures.res.mjs +65 -0
- package/tests/adapter/BackendParityTest.res +94 -0
- package/tests/adapter/BackendParityTest.res.mjs +96 -0
- package/tests/adapter/CollectNEventsTest.res +82 -0
- package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
- package/tests/adapter/CommandAuthorizationTest.res +200 -0
- package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
- package/tests/adapter/CommandTopicChannelTest.res +174 -0
- package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
- package/tests/adapter/CounterHandlerTest.res +113 -0
- package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
- package/tests/adapter/DcbEventLogStorageTest.res +187 -0
- package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
- package/tests/adapter/EventCollectorChannelTest.res +166 -0
- package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
- package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
- package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
- package/tests/adapter/EventTapTest.res +102 -0
- package/tests/adapter/EventTapTest.res.mjs +94 -0
- package/tests/adapter/EventTopicPublisherTest.res +76 -0
- package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
- package/tests/adapter/HeartbeatRunnerTest.res +136 -0
- package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
- package/tests/adapter/LocalAuthHttpTest.res +224 -0
- package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
- package/tests/adapter/LocalAuthLoginTest.res +180 -0
- package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
- package/tests/adapter/LocalAuthTest.res +106 -0
- package/tests/adapter/LocalAuthTest.res.mjs +145 -0
- package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
- package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
- package/tests/adapter/LocalBusBoundedTest.res +157 -0
- package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
- package/tests/adapter/LocalBusPubSubTest.res +81 -0
- package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
- package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
- package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
- package/tests/adapter/QueryDbListResolverTest.res +361 -0
- package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
- package/tests/adapter/QueryDbStorageTest.res +171 -0
- package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
- package/tests/adapter/QueryEngineTest.res +152 -0
- package/tests/adapter/QueryEngineTest.res.mjs +148 -0
- package/tests/adapter/ScheduledPublisherTest.res +199 -0
- package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
- package/tests/adapter/SortKey_FilterTest.res +103 -0
- package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
- package/tests/adapter/SqliteDriverTest.res +86 -0
- package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
- package/tests/adapter/TaskBucketSqliteTest.res +44 -0
- package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
- package/tests/adapter/TaskBucketTest.res +106 -0
- package/tests/adapter/TaskBucketTest.res.mjs +118 -0
- package/tests/components/aggregate/AggregateFixtures.res +78 -0
- package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
- package/tests/components/aggregate/AggregateTest.res +129 -0
- package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
- package/tests/components/commandtopic/CommandTopicTest.res +55 -0
- package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
- package/tests/components/counter/CounterFixtures.res +42 -0
- package/tests/components/counter/CounterFixtures.res.mjs +34 -0
- package/tests/components/counter/CounterTest.res +46 -0
- package/tests/components/counter/CounterTest.res.mjs +61 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
- package/tests/components/dcb/DcbFixtures.res +145 -0
- package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
- package/tests/components/dcb/DcbTest.res +55 -0
- package/tests/components/dcb/DcbTest.res.mjs +55 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
- package/tests/components/eventcollector/EventCollectorTest.res +37 -0
- package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
- package/tests/components/eventlog/EventLogConflictTest.res +86 -0
- package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
- package/tests/components/eventlog/EventLogFixtures.res +52 -0
- package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
- package/tests/components/eventlog/EventLogStreamTest.res +98 -0
- package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
- package/tests/components/eventlog/EventLogTest.res +53 -0
- package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
- package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
- package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
- package/tests/components/eventtopic/EventTopicTest.res +35 -0
- package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
- package/tests/components/heartbeat/HeartbeatTest.res +67 -0
- package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
- package/tests/components/querydb/QueryDbFixtures.res +39 -0
- package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
- package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
- package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
- package/tests/components/querydb/QueryDbTest.res +81 -0
- package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
- package/tests/components/readmodel/ReadModelFixtures.res +138 -0
- package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
- package/tests/components/readmodel/ReadModelTest.res +46 -0
- package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
- package/tests/components/scheduler/SchedulerFixtures.res +59 -0
- package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
- package/tests/components/scheduler/SchedulerTest.res +76 -0
- package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
- package/tests/components/task/TaskFixtures.res +87 -0
- package/tests/components/task/TaskFixtures.res.mjs +82 -0
- package/tests/components/task/TaskTest.res +98 -0
- package/tests/components/task/TaskTest.res.mjs +46 -0
- package/tests/plugin/PluginBehavior_GWT.res +146 -0
- package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
- package/tests/plugin/Plugin_Fixtures.res +61 -0
- package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
- package/tests/plugin/PluginsProjection_GWT.res +95 -0
- package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
- package/tests/setup/sqliteGlobal.cjs +12 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
4
|
+
|
|
5
|
+
let current = {
|
|
6
|
+
contents: "Memory"
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
function setMemory() {
|
|
10
|
+
current.contents = "Memory";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function setSqlite(db, path) {
|
|
14
|
+
current.contents = {
|
|
15
|
+
TAG: "Sqlite",
|
|
16
|
+
db: db,
|
|
17
|
+
path: path
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getDb() {
|
|
22
|
+
let match = current.contents;
|
|
23
|
+
if (typeof match !== "object") {
|
|
24
|
+
return;
|
|
25
|
+
} else {
|
|
26
|
+
return Primitive_option.some(match.db);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isSqlite() {
|
|
31
|
+
let match = current.contents;
|
|
32
|
+
return typeof match === "object";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
current,
|
|
37
|
+
setMemory,
|
|
38
|
+
setSqlite,
|
|
39
|
+
getDb,
|
|
40
|
+
isSqlite,
|
|
41
|
+
}
|
|
42
|
+
/* No side effect */
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// No-op ClonerRunner for in-memory mode.
|
|
2
|
+
// Satisfies Cloner.Adapter.Runner with type api = unit.
|
|
3
|
+
|
|
4
|
+
type api = unit
|
|
5
|
+
|
|
6
|
+
let make: ReventlessCore.Cloner.Adapter.runnerMaker<api> = (
|
|
7
|
+
~name as _,
|
|
8
|
+
~api as _,
|
|
9
|
+
~fullQualifiedStackName as _,
|
|
10
|
+
~reventlessCiSecretUrn as _,
|
|
11
|
+
~secretUrns as _,
|
|
12
|
+
~opts as _=?,
|
|
13
|
+
) => ReventlessCore.Cloner.Adapter.noRunner
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Cloner$ReventlessCore from "@reventlessdev/reventless-core/src/components/Cloner.res.mjs";
|
|
4
|
+
|
|
5
|
+
function make(param, param$1, param$2, param$3, param$4, param$5) {
|
|
6
|
+
return Cloner$ReventlessCore.Adapter.noRunner;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
make,
|
|
11
|
+
}
|
|
12
|
+
/* Cloner-ReventlessCore Not a pure module */
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// GraphQL mutation resolvers for in-memory CommandGenerator.
|
|
2
|
+
//
|
|
3
|
+
// Two-phase registration for both Aggregate and DCB StateChangeSlice mutations:
|
|
4
|
+
// Phase 1 (synchronous): Plugin_Builder/Dcb_Builder calls register/registerDcb via hooks
|
|
5
|
+
// during construct(). This registers SDL fields and resolver stubs in GraphQL_Server
|
|
6
|
+
// immediately — before Output.apply chains fire.
|
|
7
|
+
// Phase 2 (async, inside Output.apply):
|
|
8
|
+
// - Aggregates: AggregateRuntime_Builder calls handleResolversEvent then make().
|
|
9
|
+
// - DCB: Dcb_Builder calls bindHandler() directly.
|
|
10
|
+
|
|
11
|
+
@@warning("-44")
|
|
12
|
+
open ReventlessCore
|
|
13
|
+
|
|
14
|
+
type api = unit
|
|
15
|
+
type runtimeParts = LocalRuntimeEnvironment.parts
|
|
16
|
+
|
|
17
|
+
// -- Identity extraction from GraphQL context ---------------------------------
|
|
18
|
+
// graphql-yoga's `context` factory in DomainGraphQL_Server.buildAuthContext
|
|
19
|
+
// runs LocalAuth.authenticate per request and attaches the resolved
|
|
20
|
+
// `Identity.t` to `ctx.identity`. Resolvers read it from there; fallback to
|
|
21
|
+
// anonymous only when ctx is malformed.
|
|
22
|
+
|
|
23
|
+
let extractIdentity = (ctx: JSON.t): Reventless.Identity.t => {
|
|
24
|
+
try {
|
|
25
|
+
switch (ctx->Obj.magic)["identity"]->Nullable.toOption {
|
|
26
|
+
| Some(id) => (id: Reventless.Identity.t)
|
|
27
|
+
| None => Reventless.Identity.anonymous
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
| _ => Reventless.Identity.anonymous
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// -- Authorization rejection --------------------------------------------------
|
|
35
|
+
// Returns a `CommandRejected` outcome with a fresh msgId so the GraphQL union
|
|
36
|
+
// resolves consistently — matches the existing CommandResult contract.
|
|
37
|
+
|
|
38
|
+
let rejectForbidden = (~field: string): JSON.t =>
|
|
39
|
+
JSON.Object(
|
|
40
|
+
Dict.fromArray([
|
|
41
|
+
("__typename", JSON.String("CommandRejected")),
|
|
42
|
+
("msgId", JSON.String(ReventlessCore.Message.uuid())),
|
|
43
|
+
("errorCode", JSON.String("Forbidden")),
|
|
44
|
+
("errorDetail", JSON.String(`Mutation.${field}: identity is not authorized`)),
|
|
45
|
+
]),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
// -- Plugin status gate -------------------------------------------------------
|
|
49
|
+
// Set by the platform after Admin.construct to wire a per-mutation lookup against
|
|
50
|
+
// the Plugin read model. Takes a mutation field name (e.g. "Catalog_Product_Add"),
|
|
51
|
+
// returns `Some((errorCode, errorDetail))` if the mutation should be rejected,
|
|
52
|
+
// or `None` otherwise. Platform_* admin mutations are exempt — the gate function
|
|
53
|
+
// should return None for them. The error code distinguishes the two off-tiers
|
|
54
|
+
// from `docs/analysis/plugin-lifecycle-tiers.md`:
|
|
55
|
+
// - `PluginUnavailable` — tier 1 (Disconnected); retryable.
|
|
56
|
+
// - `PluginInactive` — tier 2 (Inactive); admin-controlled, do not retry.
|
|
57
|
+
// Wrapping a ref instead of a functor argument keeps the module callable as-is
|
|
58
|
+
// from existing call sites.
|
|
59
|
+
|
|
60
|
+
let pluginStatusGate: ref<option<string => option<(string, string)>>> = ref(None)
|
|
61
|
+
let setPluginStatusGate = fn => pluginStatusGate := Some(fn)
|
|
62
|
+
let resetPluginStatusGate = () => pluginStatusGate := None
|
|
63
|
+
|
|
64
|
+
let rejectPluginStatus = (~field: string, ~errorCode: string, ~detail: string): JSON.t =>
|
|
65
|
+
JSON.Object(
|
|
66
|
+
Dict.fromArray([
|
|
67
|
+
("__typename", JSON.String("CommandRejected")),
|
|
68
|
+
("msgId", JSON.String(ReventlessCore.Message.uuid())),
|
|
69
|
+
("errorCode", JSON.String(errorCode)),
|
|
70
|
+
("errorDetail", JSON.String(`Mutation.${field}: ${detail}`)),
|
|
71
|
+
]),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
let checkPluginStatus = (~field: string): option<JSON.t> =>
|
|
75
|
+
switch pluginStatusGate.contents {
|
|
76
|
+
| Some(gate) =>
|
|
77
|
+
switch gate(field) {
|
|
78
|
+
| Some((errorCode, detail)) => Some(rejectPluginStatus(~field, ~errorCode, ~detail))
|
|
79
|
+
| None => None
|
|
80
|
+
}
|
|
81
|
+
| None => None
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Build a synthetic command value sufficient for evaluating
|
|
85
|
+
// `commandAuthorization`. ReScript variants with record payloads compile to
|
|
86
|
+
// `{TAG: cname, ...payload}` and the PPX-generated switch matches `Ctor(_)`
|
|
87
|
+
// which only checks `command.TAG === cname`. Payload-less constructors
|
|
88
|
+
// compile to bare string literals and the switch matches them with
|
|
89
|
+
// `command === "Cname"`, so the synthetic value must be a bare string in
|
|
90
|
+
// that case — otherwise the wildcard branch (file-level default) wins
|
|
91
|
+
// instead of the per-constructor rule.
|
|
92
|
+
let syntheticCommand = (cname: string, ~hasPayload: bool): unknown =>
|
|
93
|
+
hasPayload ? {"TAG": cname}->Obj.magic : cname->Obj.magic
|
|
94
|
+
|
|
95
|
+
let capitalize = s =>
|
|
96
|
+
s->String.charAt(0)->String.toUpperCase ++ s->String.slice(~start=1)
|
|
97
|
+
|
|
98
|
+
// -- CommandResult SDL types --------------------------------------------------
|
|
99
|
+
// Source of truth lives in GraphQL_FragmentGenerator.commandResultSdlTypes so
|
|
100
|
+
// the AWS stitched schema and the in-memory graphql-yoga server agree on the
|
|
101
|
+
// CommandResult shape. We join the 4 declarations into a single SDL block for
|
|
102
|
+
// the in-memory server's registerTypes API.
|
|
103
|
+
// Registered once per server (guards against duplicate registration after reset).
|
|
104
|
+
|
|
105
|
+
let commandResultSdl = GraphQL_FragmentGenerator.commandResultSdlTypes->Array.join("\n\n")
|
|
106
|
+
|
|
107
|
+
let ensureCommandResultTypes = (server: GraphQL_ServerInstance.t) => {
|
|
108
|
+
if !(server.buildSdl()->String.includes("CommandAccepted")) {
|
|
109
|
+
server.registerTypes(~sdlTypes=[commandResultSdl])
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Re-export the shared encoder. Source of truth is
|
|
114
|
+
// CommandTopic_Helpers.commandOutcomeToJson — same encoder is also reused by
|
|
115
|
+
// the AWS Lambda direct-invocation entry point so both surfaces produce
|
|
116
|
+
// AppSync-compatible CommandResult payloads.
|
|
117
|
+
let commandOutcomeToJson = CommandTopic.commandOutcomeToJson
|
|
118
|
+
|
|
119
|
+
let extractCommandName = (fieldName: string) => {
|
|
120
|
+
let parts = fieldName->String.split("_")
|
|
121
|
+
parts->Array.get(parts->Array.length - 1)->Option.getOr(fieldName)->capitalize
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// -- Shared SDL derivation helpers --------------------------------------------
|
|
125
|
+
|
|
126
|
+
let extractVariantSchema = (commandSchema: S.t<unknown>, ~index=0) =>
|
|
127
|
+
switch commandSchema {
|
|
128
|
+
| Union({anyOf}) => anyOf->Array.get(index)->Option.getOr(commandSchema)
|
|
129
|
+
| _ => commandSchema
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Find the variant index in commandSchema that matches the constructor name
|
|
133
|
+
// extracted from `field` (e.g. `Platform_Plugin_Activate` → `Activate`). When
|
|
134
|
+
// the auto-flow filters @noApi variants out of `fields` but passes the
|
|
135
|
+
// unfiltered commandSchema, position-based lookup mismatches names against
|
|
136
|
+
// variant payloads — e.g. it would marry the `Platform_Plugin_Deactivate`
|
|
137
|
+
// field name to the `Connect(pluginDefinition)` variant schema, leaking a
|
|
138
|
+
// stale `_0` payload arg into the SDL. Looking up by name avoids that.
|
|
139
|
+
let variantIndexForField = (commandSchema: S.t<unknown>, ~field: string): int => {
|
|
140
|
+
let cname = extractCommandName(field)
|
|
141
|
+
let allNames = Reventless.DcbTag.extractAllVariantNames(commandSchema->Obj.magic)
|
|
142
|
+
allNames->Array.indexOf(cname)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
let deriveSdlField = (~fieldName, variantSchema: S.t<unknown>) =>
|
|
146
|
+
switch GraphQL_FragmentGenerator.deriveMutationFieldFromObject(
|
|
147
|
+
~fieldName,
|
|
148
|
+
~collectedTypes=[],
|
|
149
|
+
~seenTypes=Set.make(),
|
|
150
|
+
variantSchema,
|
|
151
|
+
) {
|
|
152
|
+
| Some(field) => field
|
|
153
|
+
| None => ` ${fieldName}: CommandResult!`
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// -- Per-field handler refs ---------------------------------------------------
|
|
157
|
+
// Populated by register()/registerDcb() with empty refs; bound by make() or
|
|
158
|
+
// bindHandler() when generateCommand becomes available.
|
|
159
|
+
|
|
160
|
+
let handlerRefs: dict<ref<option<CommandGenerator.commandGenerator>>> = Dict.make()
|
|
161
|
+
|
|
162
|
+
// -- register (Phase 1 — synchronous, Aggregates) ----------------------------
|
|
163
|
+
// Called by Plugin_Builder via aggregateMutationResolverHook before any
|
|
164
|
+
// Output.apply chains fire. Registers SDL + resolver stubs in GraphQL_Server.
|
|
165
|
+
|
|
166
|
+
let register = (
|
|
167
|
+
~fields: array<string>,
|
|
168
|
+
~commandSchema: S.t<unknown>,
|
|
169
|
+
~commandAuthorization: unknown => Reventless.Authorization.permission,
|
|
170
|
+
~server: GraphQL_ServerInstance.t,
|
|
171
|
+
) => {
|
|
172
|
+
ensureCommandResultTypes(server)
|
|
173
|
+
// Aggregate commands target a specific instance — prepend id: ID!
|
|
174
|
+
let sdlFields = fields->Array.map(field => {
|
|
175
|
+
let variantIndex = variantIndexForField(commandSchema, ~field)
|
|
176
|
+
let sdl = deriveSdlField(~fieldName=field, extractVariantSchema(commandSchema, ~index=variantIndex))
|
|
177
|
+
if sdl->String.includes("(") {
|
|
178
|
+
sdl->String.replace(`${field}(`, `${field}(id: ID!, `)
|
|
179
|
+
} else {
|
|
180
|
+
sdl->String.replace(`${field}:`, `${field}(id: ID!):`)
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
let resolvers = Dict.make()
|
|
185
|
+
fields->Array.forEach(field => {
|
|
186
|
+
let handlerRef = ref(None)
|
|
187
|
+
handlerRefs->Dict.set(field, handlerRef)
|
|
188
|
+
// hasPayload is fixed per field — capture once at registration time so
|
|
189
|
+
// the resolver doesn't re-walk the schema per request.
|
|
190
|
+
let variantIndex = variantIndexForField(commandSchema, ~field)
|
|
191
|
+
let hasPayload = switch extractVariantSchema(commandSchema, ~index=variantIndex) {
|
|
192
|
+
| Object(_) => true
|
|
193
|
+
| _ => false
|
|
194
|
+
}
|
|
195
|
+
let commandName = extractCommandName(field)
|
|
196
|
+
let resolver: GraphQL_ServerInstance.resolverFn = async (_root, args, ctx) => {
|
|
197
|
+
switch handlerRef.contents {
|
|
198
|
+
| Some(generateCommand) =>
|
|
199
|
+
switch checkPluginStatus(~field) {
|
|
200
|
+
| Some(rejected) => rejected
|
|
201
|
+
| None =>
|
|
202
|
+
let identity = extractIdentity(ctx)
|
|
203
|
+
let rule = commandAuthorization(syntheticCommand(commandName, ~hasPayload))
|
|
204
|
+
if !Reventless.Authorization.isAllowed(rule, identity) {
|
|
205
|
+
rejectForbidden(~field)
|
|
206
|
+
} else {
|
|
207
|
+
let payload: CommandGenerator.payload = {
|
|
208
|
+
command: commandName,
|
|
209
|
+
arguments: args->Obj.magic,
|
|
210
|
+
meta: {ip: [], user: identity.userId, info: `Mutation.${field}`},
|
|
211
|
+
identity,
|
|
212
|
+
}
|
|
213
|
+
let outcome = await generateCommand(payload)->Effect.runPromise
|
|
214
|
+
outcome->commandOutcomeToJson
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
| None => JSON.Encode.null
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
resolvers->Dict.set(field, resolver)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
server.registerMutations(~sdlFields, ~resolvers)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// -- registerDcb (Phase 1 — synchronous, DCB StateChangeSlices) ---------------
|
|
227
|
+
// Called by Dcb_Builder via dcbMutationResolverHook. Registers SDL + resolver
|
|
228
|
+
// stubs for DCB mutations. Unlike aggregate mutations, DCB commands use tagged
|
|
229
|
+
// ID field(s) (e.g., itemId, or composite-partition members) — the envelope id
|
|
230
|
+
// is derived inside makeGenerateCommand from the command schema, so the resolver
|
|
231
|
+
// just forwards args verbatim.
|
|
232
|
+
|
|
233
|
+
let registerDcb = (
|
|
234
|
+
~fieldName: string,
|
|
235
|
+
~commandSchema: S.t<unknown>,
|
|
236
|
+
~commandAuthorization: unknown => Reventless.Authorization.permission,
|
|
237
|
+
~server: GraphQL_ServerInstance.t,
|
|
238
|
+
) => {
|
|
239
|
+
ensureCommandResultTypes(server)
|
|
240
|
+
let variantSchema = extractVariantSchema(commandSchema)
|
|
241
|
+
let sdlFields = [deriveSdlField(~fieldName, variantSchema)]
|
|
242
|
+
|
|
243
|
+
// Extract TAG (variant constructor name) for routing
|
|
244
|
+
let constructorNames = Reventless.DcbTag.extractAllVariantNames(commandSchema->Obj.magic)
|
|
245
|
+
let tag = constructorNames->Array.get(0)->Option.getOr(fieldName)
|
|
246
|
+
let hasPayload = Reventless.DcbTag.isVariantPayloadBearing(commandSchema->Obj.magic, tag)
|
|
247
|
+
|
|
248
|
+
let handlerRef = ref(None)
|
|
249
|
+
handlerRefs->Dict.set(fieldName, handlerRef)
|
|
250
|
+
|
|
251
|
+
let resolver: GraphQL_ServerInstance.resolverFn = async (_root, args, ctx) => {
|
|
252
|
+
switch handlerRef.contents {
|
|
253
|
+
| Some(generateCommand) =>
|
|
254
|
+
switch checkPluginStatus(~field=fieldName) {
|
|
255
|
+
| Some(rejected) => rejected
|
|
256
|
+
| None =>
|
|
257
|
+
let identity = extractIdentity(ctx)
|
|
258
|
+
let rule = commandAuthorization(syntheticCommand(tag, ~hasPayload))
|
|
259
|
+
if !Reventless.Authorization.isAllowed(rule, identity) {
|
|
260
|
+
rejectForbidden(~field=fieldName)
|
|
261
|
+
} else {
|
|
262
|
+
let payload: CommandGenerator.payload = {
|
|
263
|
+
command: tag,
|
|
264
|
+
arguments: args->Obj.magic,
|
|
265
|
+
meta: {ip: [], user: identity.userId, info: `Mutation.${fieldName}`},
|
|
266
|
+
identity,
|
|
267
|
+
}
|
|
268
|
+
let outcome = await generateCommand(payload)->Effect.runPromise
|
|
269
|
+
outcome->commandOutcomeToJson
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
| None => JSON.Encode.null
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
let resolvers = Dict.make()
|
|
277
|
+
resolvers->Dict.set(fieldName, resolver)
|
|
278
|
+
server.registerMutations(~sdlFields, ~resolvers)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// -- bindHandler (Phase 2 — direct binding) -----------------------------------
|
|
282
|
+
// Binds a generateCommand function to a pre-registered resolver stub.
|
|
283
|
+
// Used by DCB StateChangeSlices via dcbMutationBindHook.
|
|
284
|
+
|
|
285
|
+
let bindHandler = (~field: string, ~generateCommand: CommandGenerator.commandGenerator) => {
|
|
286
|
+
switch handlerRefs->Dict.get(field) {
|
|
287
|
+
| Some(handlerRef) => handlerRef.contents = Some(generateCommand)
|
|
288
|
+
| None => ()
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// -- Pending handler slot (Phase 2, Aggregates) -------------------------------
|
|
293
|
+
|
|
294
|
+
let pending: ref<option<CommandGenerator.commandGenerator>> = ref(None)
|
|
295
|
+
|
|
296
|
+
let handleResolversEvent = (generateCommand: CommandGenerator.commandGenerator) => {
|
|
297
|
+
pending.contents = Some(generateCommand)
|
|
298
|
+
Pulumi.Output.make((event, _context) => event->generateCommand)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// -- make (Phase 2 — inside Output.apply, Aggregates) -------------------------
|
|
302
|
+
// Binds the real generateCommand to resolver stubs created by register().
|
|
303
|
+
|
|
304
|
+
let make: CommandGenerator_Adapter.resolversMaker<unit, runtimeParts> = (
|
|
305
|
+
~name as _,
|
|
306
|
+
~api as _,
|
|
307
|
+
~fields,
|
|
308
|
+
~commandSchema as _,
|
|
309
|
+
~runtime as _,
|
|
310
|
+
~resources as _,
|
|
311
|
+
~opts as _,
|
|
312
|
+
) => {
|
|
313
|
+
let generateCommand = switch pending.contents {
|
|
314
|
+
| Some(fn) =>
|
|
315
|
+
pending.contents = None
|
|
316
|
+
fn
|
|
317
|
+
| None => JsError.throwWithMessage("CommandGeneratorResolvers_GraphQL.make: no pending handler")
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Bind generateCommand to the pre-registered resolver stubs
|
|
321
|
+
fields->Array.forEach(field => {
|
|
322
|
+
switch handlerRefs->Dict.get(field) {
|
|
323
|
+
| Some(handlerRef) => handlerRef.contents = Some(generateCommand)
|
|
324
|
+
| None => ()
|
|
325
|
+
}
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
{resources: []}
|
|
329
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Pulumi from "@pulumi/pulumi";
|
|
6
|
+
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
|
|
7
|
+
import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
|
|
8
|
+
import * as Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
|
|
9
|
+
import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
|
|
10
|
+
import * as Authorization$Reventless from "@reventlessdev/reventless-spec/src/types/Authorization.res.mjs";
|
|
11
|
+
import * as CommandTopic$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic.res.mjs";
|
|
12
|
+
import * as GraphQL_FragmentGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_FragmentGenerator.res.mjs";
|
|
13
|
+
|
|
14
|
+
function extractIdentity(ctx) {
|
|
15
|
+
try {
|
|
16
|
+
let id = ctx.identity;
|
|
17
|
+
if (id == null) {
|
|
18
|
+
return Identity$Reventless.anonymous;
|
|
19
|
+
} else {
|
|
20
|
+
return id;
|
|
21
|
+
}
|
|
22
|
+
} catch (exn) {
|
|
23
|
+
return Identity$Reventless.anonymous;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function rejectForbidden(field) {
|
|
28
|
+
return Object.fromEntries([
|
|
29
|
+
[
|
|
30
|
+
"__typename",
|
|
31
|
+
"CommandRejected"
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"msgId",
|
|
35
|
+
Message$ReventlessCore.uuid()
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
"errorCode",
|
|
39
|
+
"Forbidden"
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
"errorDetail",
|
|
43
|
+
`Mutation.` + field + `: identity is not authorized`
|
|
44
|
+
]
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let pluginStatusGate = {
|
|
49
|
+
contents: undefined
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
function setPluginStatusGate(fn) {
|
|
53
|
+
pluginStatusGate.contents = fn;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function resetPluginStatusGate() {
|
|
57
|
+
pluginStatusGate.contents = undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function rejectPluginStatus(field, errorCode, detail) {
|
|
61
|
+
return Object.fromEntries([
|
|
62
|
+
[
|
|
63
|
+
"__typename",
|
|
64
|
+
"CommandRejected"
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
"msgId",
|
|
68
|
+
Message$ReventlessCore.uuid()
|
|
69
|
+
],
|
|
70
|
+
[
|
|
71
|
+
"errorCode",
|
|
72
|
+
errorCode
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
"errorDetail",
|
|
76
|
+
`Mutation.` + field + `: ` + detail
|
|
77
|
+
]
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function checkPluginStatus(field) {
|
|
82
|
+
let gate = pluginStatusGate.contents;
|
|
83
|
+
if (gate === undefined) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
let match = gate(field);
|
|
87
|
+
if (match !== undefined) {
|
|
88
|
+
return rejectPluginStatus(field, match[0], match[1]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function syntheticCommand(cname, hasPayload) {
|
|
93
|
+
if (hasPayload) {
|
|
94
|
+
return {
|
|
95
|
+
TAG: cname
|
|
96
|
+
};
|
|
97
|
+
} else {
|
|
98
|
+
return cname;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function capitalize(s) {
|
|
103
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
let commandResultSdl = GraphQL_FragmentGenerator$ReventlessCore.commandResultSdlTypes.join("\n\n");
|
|
107
|
+
|
|
108
|
+
function ensureCommandResultTypes(server) {
|
|
109
|
+
if (!server.buildSdl().includes("CommandAccepted")) {
|
|
110
|
+
return server.registerTypes([commandResultSdl]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function extractCommandName(fieldName) {
|
|
115
|
+
let parts = fieldName.split("_");
|
|
116
|
+
return capitalize(Stdlib_Option.getOr(parts[parts.length - 1 | 0], fieldName));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function extractVariantSchema(commandSchema, indexOpt) {
|
|
120
|
+
let index = indexOpt !== undefined ? indexOpt : 0;
|
|
121
|
+
if (commandSchema.type === "union") {
|
|
122
|
+
return Stdlib_Option.getOr(commandSchema.anyOf[index], commandSchema);
|
|
123
|
+
} else {
|
|
124
|
+
return commandSchema;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function variantIndexForField(commandSchema, field) {
|
|
129
|
+
let cname = extractCommandName(field);
|
|
130
|
+
let allNames = DcbTag$Reventless.extractAllVariantNames(commandSchema);
|
|
131
|
+
return allNames.indexOf(cname);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function deriveSdlField(fieldName, variantSchema) {
|
|
135
|
+
let field = GraphQL_FragmentGenerator$ReventlessCore.deriveMutationFieldFromObject(fieldName, [], new Set(), variantSchema);
|
|
136
|
+
if (field !== undefined) {
|
|
137
|
+
return field;
|
|
138
|
+
} else {
|
|
139
|
+
return ` ` + fieldName + `: CommandResult!`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let handlerRefs = {};
|
|
144
|
+
|
|
145
|
+
function register(fields, commandSchema, commandAuthorization, server) {
|
|
146
|
+
ensureCommandResultTypes(server);
|
|
147
|
+
let sdlFields = fields.map(field => {
|
|
148
|
+
let variantIndex = variantIndexForField(commandSchema, field);
|
|
149
|
+
let sdl = deriveSdlField(field, extractVariantSchema(commandSchema, variantIndex));
|
|
150
|
+
if (sdl.includes("(")) {
|
|
151
|
+
return sdl.replace(field + `(`, field + `(id: ID!, `);
|
|
152
|
+
} else {
|
|
153
|
+
return sdl.replace(field + `:`, field + `(id: ID!):`);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
let resolvers = {};
|
|
157
|
+
fields.forEach(field => {
|
|
158
|
+
let handlerRef = {
|
|
159
|
+
contents: undefined
|
|
160
|
+
};
|
|
161
|
+
handlerRefs[field] = handlerRef;
|
|
162
|
+
let variantIndex = variantIndexForField(commandSchema, field);
|
|
163
|
+
let match = extractVariantSchema(commandSchema, variantIndex);
|
|
164
|
+
let hasPayload;
|
|
165
|
+
hasPayload = match.type === "object";
|
|
166
|
+
let commandName = extractCommandName(field);
|
|
167
|
+
let resolver = async (_root, args, ctx) => {
|
|
168
|
+
let generateCommand = handlerRef.contents;
|
|
169
|
+
if (generateCommand === undefined) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
let rejected = checkPluginStatus(field);
|
|
173
|
+
if (rejected !== undefined) {
|
|
174
|
+
return rejected;
|
|
175
|
+
}
|
|
176
|
+
let identity = extractIdentity(ctx);
|
|
177
|
+
let rule = commandAuthorization(syntheticCommand(commandName, hasPayload));
|
|
178
|
+
if (!Authorization$Reventless.isAllowed(rule, identity)) {
|
|
179
|
+
return rejectForbidden(field);
|
|
180
|
+
}
|
|
181
|
+
let payload_meta = {
|
|
182
|
+
ip: [],
|
|
183
|
+
user: identity.userId,
|
|
184
|
+
info: `Mutation.` + field
|
|
185
|
+
};
|
|
186
|
+
let payload = {
|
|
187
|
+
command: commandName,
|
|
188
|
+
arguments: args,
|
|
189
|
+
meta: payload_meta,
|
|
190
|
+
identity: identity
|
|
191
|
+
};
|
|
192
|
+
return CommandTopic$ReventlessCore.commandOutcomeToJson(await Effect.runPromise(generateCommand(payload)));
|
|
193
|
+
};
|
|
194
|
+
resolvers[field] = resolver;
|
|
195
|
+
});
|
|
196
|
+
server.registerMutations(sdlFields, resolvers);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function registerDcb(fieldName, commandSchema, commandAuthorization, server) {
|
|
200
|
+
ensureCommandResultTypes(server);
|
|
201
|
+
let variantSchema = extractVariantSchema(commandSchema, undefined);
|
|
202
|
+
let sdlFields = [deriveSdlField(fieldName, variantSchema)];
|
|
203
|
+
let constructorNames = DcbTag$Reventless.extractAllVariantNames(commandSchema);
|
|
204
|
+
let tag = Stdlib_Option.getOr(constructorNames[0], fieldName);
|
|
205
|
+
let hasPayload = DcbTag$Reventless.isVariantPayloadBearing(commandSchema, tag);
|
|
206
|
+
let handlerRef = {
|
|
207
|
+
contents: undefined
|
|
208
|
+
};
|
|
209
|
+
handlerRefs[fieldName] = handlerRef;
|
|
210
|
+
let resolver = async (_root, args, ctx) => {
|
|
211
|
+
let generateCommand = handlerRef.contents;
|
|
212
|
+
if (generateCommand === undefined) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
let rejected = checkPluginStatus(fieldName);
|
|
216
|
+
if (rejected !== undefined) {
|
|
217
|
+
return rejected;
|
|
218
|
+
}
|
|
219
|
+
let identity = extractIdentity(ctx);
|
|
220
|
+
let rule = commandAuthorization(syntheticCommand(tag, hasPayload));
|
|
221
|
+
if (!Authorization$Reventless.isAllowed(rule, identity)) {
|
|
222
|
+
return rejectForbidden(fieldName);
|
|
223
|
+
}
|
|
224
|
+
let payload_meta = {
|
|
225
|
+
ip: [],
|
|
226
|
+
user: identity.userId,
|
|
227
|
+
info: `Mutation.` + fieldName
|
|
228
|
+
};
|
|
229
|
+
let payload = {
|
|
230
|
+
command: tag,
|
|
231
|
+
arguments: args,
|
|
232
|
+
meta: payload_meta,
|
|
233
|
+
identity: identity
|
|
234
|
+
};
|
|
235
|
+
return CommandTopic$ReventlessCore.commandOutcomeToJson(await Effect.runPromise(generateCommand(payload)));
|
|
236
|
+
};
|
|
237
|
+
let resolvers = {};
|
|
238
|
+
resolvers[fieldName] = resolver;
|
|
239
|
+
server.registerMutations(sdlFields, resolvers);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function bindHandler(field, generateCommand) {
|
|
243
|
+
let handlerRef = handlerRefs[field];
|
|
244
|
+
if (handlerRef !== undefined) {
|
|
245
|
+
handlerRef.contents = generateCommand;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
let pending = {
|
|
251
|
+
contents: undefined
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
function handleResolversEvent(generateCommand) {
|
|
255
|
+
pending.contents = generateCommand;
|
|
256
|
+
return Pulumi.output((event, _context) => generateCommand(event));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function make(param, param$1, fields, param$2, param$3, param$4, param$5) {
|
|
260
|
+
let fn = pending.contents;
|
|
261
|
+
let generateCommand = fn !== undefined ? (pending.contents = undefined, fn) : Stdlib_JsError.throwWithMessage("CommandGeneratorResolvers_GraphQL.make: no pending handler");
|
|
262
|
+
fields.forEach(field => {
|
|
263
|
+
let handlerRef = handlerRefs[field];
|
|
264
|
+
if (handlerRef !== undefined) {
|
|
265
|
+
handlerRef.contents = generateCommand;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
resources: []
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
let commandOutcomeToJson = CommandTopic$ReventlessCore.commandOutcomeToJson;
|
|
275
|
+
|
|
276
|
+
export {
|
|
277
|
+
extractIdentity,
|
|
278
|
+
rejectForbidden,
|
|
279
|
+
pluginStatusGate,
|
|
280
|
+
setPluginStatusGate,
|
|
281
|
+
resetPluginStatusGate,
|
|
282
|
+
rejectPluginStatus,
|
|
283
|
+
checkPluginStatus,
|
|
284
|
+
syntheticCommand,
|
|
285
|
+
capitalize,
|
|
286
|
+
commandResultSdl,
|
|
287
|
+
ensureCommandResultTypes,
|
|
288
|
+
commandOutcomeToJson,
|
|
289
|
+
extractCommandName,
|
|
290
|
+
extractVariantSchema,
|
|
291
|
+
variantIndexForField,
|
|
292
|
+
deriveSdlField,
|
|
293
|
+
handlerRefs,
|
|
294
|
+
register,
|
|
295
|
+
registerDcb,
|
|
296
|
+
bindHandler,
|
|
297
|
+
pending,
|
|
298
|
+
handleResolversEvent,
|
|
299
|
+
make,
|
|
300
|
+
}
|
|
301
|
+
/* commandResultSdl Not a pure module */
|