@reventlessdev/reventless-local 3.0.0-alpha.291 → 3.0.0-alpha.292
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 +14 -0
- package/package.json +12 -12
- package/src/Platform.res +13 -13
- package/src/Platform.res.mjs +44 -44
- package/src/UiHints.res +1 -1
- package/src/adapter/Auth/LocalAuth.res +2 -2
- package/src/adapter/Backend.res +2 -2
- package/src/adapter/LocalBus.res +1 -1
- package/src/adapter/LocalUploadResolvers.res +1 -1
- package/src/components/Aggregate_Builder.res +2 -2
- package/src/components/Aggregate_Builder.res.mjs +4 -4
- package/src/components/DcbEventLog_Builder.res +1 -1
- package/src/components/StateChangeSlice_Builder.res +3 -3
- package/src/components/StateChangeSlice_Builder.res.mjs +3 -3
- package/src/reset/LocalSeedReset.res +1 -1
- package/tests/adapter/BackendParityTest.res +1 -1
- package/tests/adapter/EventHistoryResolverTest.res +2 -2
- package/tests/adapter/GraphQL_SchemaInspectorTest.res +1 -1
- package/tests/adapter/LocalAuthLoginTest.res +1 -1
- package/tests/adapter/QueryDbListResolverTest.res +1 -1
- package/tests/adapter/QueryDbResolvedFieldsTest.res +1 -1
- package/tests/components/aggregate/AggregateFixtures.res +6 -6
- package/tests/components/aggregate/AggregateFixtures.res.mjs +3 -3
- package/tests/components/aggregate/AggregateSelfMappingFixtures.res +2 -2
- package/tests/components/aggregate/AggregateSelfMappingFixtures.res.mjs +3 -3
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +4 -4
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +4 -4
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res +3 -3
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +4 -4
- package/tests/components/dcb/DcbCrossPartitionFixtures.res +2 -2
- package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +2 -2
- package/tests/components/dcb/DcbFixtures.res +2 -2
- package/tests/components/dcb/DcbFixtures.res.mjs +2 -2
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +1 -1
- package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res +2 -2
- package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res.mjs +2 -2
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res +2 -2
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +2 -2
- package/tests/plugin/{PluginBehavior_GWT.res → PluginDecision_GWT.res} +2 -2
- package/tests/plugin/{PluginBehavior_GWT.res.mjs → PluginDecision_GWT.res.mjs} +8 -8
- package/tests/plugin/UiFragmentRegistry_GWT.res +1 -1
- package/tests/plugin/UiFragmentRegistry_GWT.res.mjs +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 3.0.0-alpha.292 (2026-10-21)
|
|
7
|
+
|
|
8
|
+
* feat!: the write-side logic module is called the decision, and a codemod moves an app over ([cb573ff](https://github.com/ReventlessDev/reventless-core/commit/cb573ff5b928c7d7f3e75988dfaa65066f8c95eb))
|
|
9
|
+
|
|
10
|
+
### BREAKING CHANGES
|
|
11
|
+
|
|
12
|
+
* <Spec>_Behavior.res, @@reventless.behavior,
|
|
13
|
+
Reventless.Behavior.T, StateChangeSlice.Behavior, Behavior_GWT and
|
|
14
|
+
thenRefused no longer exist. Run `npx reventless-rename-to-decision` at an
|
|
15
|
+
app's root, then rebuild; comments are not rewritten. The PPX must be the
|
|
16
|
+
matching release.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
6
20
|
# 3.0.0-alpha.291 (2026-10-19)
|
|
7
21
|
|
|
8
22
|
### Features
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/reventless-local",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.292",
|
|
4
4
|
"description": "Local platform for Reventless (in-memory or SQLite backend, for development and testing without AWS)",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"bin": {
|
|
@@ -34,19 +34,19 @@
|
|
|
34
34
|
"graphql-yoga": "^5.21.0",
|
|
35
35
|
"sury": "11.0.0",
|
|
36
36
|
"ws": "^8.18.0",
|
|
37
|
-
"@reventlessdev/rescript-
|
|
38
|
-
"@reventlessdev/rescript-
|
|
37
|
+
"@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.29",
|
|
38
|
+
"@reventlessdev/rescript-jest": "1.0.0-alpha.13",
|
|
39
|
+
"@reventlessdev/rescript-effect": "1.0.0-alpha.1",
|
|
40
|
+
"@reventlessdev/rescript-node": "2.0.0-alpha.23",
|
|
39
41
|
"@reventlessdev/rescript-mcp-sdk": "1.0.0-alpha.23",
|
|
40
|
-
"@reventlessdev/rescript-node": "2.0.0-alpha.22",
|
|
41
42
|
"@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
|
|
42
|
-
"@reventlessdev/
|
|
43
|
-
"@reventlessdev/reventless-
|
|
44
|
-
"@reventlessdev/reventless-
|
|
45
|
-
"@reventlessdev/reventless-
|
|
46
|
-
"@reventlessdev/reventless-
|
|
47
|
-
"@reventlessdev/reventless-
|
|
48
|
-
"@reventlessdev/reventless-
|
|
49
|
-
"@reventlessdev/reventless-seed": "1.0.0-alpha.34"
|
|
43
|
+
"@reventlessdev/reventless-core": "3.0.0-alpha.301",
|
|
44
|
+
"@reventlessdev/reventless-gwt": "1.0.0-alpha.249",
|
|
45
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.198",
|
|
46
|
+
"@reventlessdev/reventless-graphql-server": "1.0.0-alpha.149",
|
|
47
|
+
"@reventlessdev/reventless-postgres": "3.0.0-alpha.165",
|
|
48
|
+
"@reventlessdev/reventless-seed": "1.0.0-alpha.35",
|
|
49
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.170"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"rescript": "12.3.1",
|
package/src/Platform.res
CHANGED
|
@@ -585,21 +585,21 @@ module MakeWithConfig = (
|
|
|
585
585
|
module Aggregate = {
|
|
586
586
|
module Make = (
|
|
587
587
|
Spec: Reventless.Aggregate.Spec,
|
|
588
|
-
|
|
588
|
+
Decision: Reventless.Decision.T with module Spec := Spec,
|
|
589
589
|
EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
|
|
590
590
|
): (ReventlessInfra.Aggregate.T with type api = unit) => AggregateMaker.Make(
|
|
591
591
|
Spec,
|
|
592
|
-
|
|
592
|
+
Decision,
|
|
593
593
|
EventMappings,
|
|
594
594
|
)
|
|
595
595
|
/** Async variant — in-memory uses the same channel (no FIFO distinction). */
|
|
596
596
|
module MakeAsync = (
|
|
597
597
|
Spec: Reventless.Aggregate.Spec,
|
|
598
|
-
|
|
598
|
+
Decision: Reventless.Decision.T with module Spec := Spec,
|
|
599
599
|
EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
|
|
600
600
|
): (ReventlessInfra.Aggregate.T with type api = unit) => AggregateMaker.Make(
|
|
601
601
|
Spec,
|
|
602
|
-
|
|
602
|
+
Decision,
|
|
603
603
|
EventMappings,
|
|
604
604
|
)
|
|
605
605
|
}
|
|
@@ -717,16 +717,16 @@ module MakeWithConfig = (
|
|
|
717
717
|
module StateChangeSlice = {
|
|
718
718
|
module Make = (
|
|
719
719
|
Spec: Reventless.StateChangeSlice.Spec,
|
|
720
|
-
|
|
720
|
+
Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
|
|
721
721
|
): (
|
|
722
722
|
ReventlessInfra.StateChangeSlice.T with module Spec = Spec
|
|
723
|
-
) => StateChangeSlice_Builder.Make(Spec,
|
|
723
|
+
) => StateChangeSlice_Builder.Make(Spec, Decision)
|
|
724
724
|
/** Async variant — in-memory uses the same channel (no FIFO distinction). */
|
|
725
725
|
module MakeAsync = (
|
|
726
726
|
Spec: Reventless.StateChangeSlice.Spec,
|
|
727
|
-
|
|
727
|
+
Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
|
|
728
728
|
): (ReventlessInfra.StateChangeSlice.T with module Spec = Spec) => {
|
|
729
|
-
include StateChangeSlice_Builder.Make(Spec,
|
|
729
|
+
include StateChangeSlice_Builder.Make(Spec, Decision)
|
|
730
730
|
let isAsync = true
|
|
731
731
|
}
|
|
732
732
|
}
|
|
@@ -746,7 +746,7 @@ module MakeWithConfig = (
|
|
|
746
746
|
// Built once and passed into Admin.construct below.
|
|
747
747
|
module UiFragmentRegistrySlice = StateChangeSlice.Make(
|
|
748
748
|
ReventlessCore.UiFragmentRegistry,
|
|
749
|
-
ReventlessCore.
|
|
749
|
+
ReventlessCore.UiFragmentRegistry_Decision,
|
|
750
750
|
)
|
|
751
751
|
module UiFragmentsViewSlice = StateViewSlice.Make(
|
|
752
752
|
ReventlessCore.UiFragments,
|
|
@@ -822,7 +822,7 @@ module MakeWithConfig = (
|
|
|
822
822
|
module LocalPluginAggregate: ReventlessInfra.Aggregate.T
|
|
823
823
|
with type api = unit = AggregateMaker.Make(
|
|
824
824
|
ReventlessCore.PluginSpec,
|
|
825
|
-
ReventlessCore.
|
|
825
|
+
ReventlessCore.PluginDecision,
|
|
826
826
|
ReventlessInfra.NoEventMappings.Make(ReventlessCore.PluginSpec),
|
|
827
827
|
)
|
|
828
828
|
|
|
@@ -879,7 +879,7 @@ module MakeWithConfig = (
|
|
|
879
879
|
// Per-session server ports for the VS Code local platform runner (features
|
|
880
880
|
// plan Phase 9). The runner spawns one platform child per app folder; default
|
|
881
881
|
// ports (4000/4001/3001/3002) collide when several run, so each is overridable
|
|
882
|
-
// via env. Defaults preserve today's
|
|
882
|
+
// via env. Defaults preserve today's behavior for all non-runner callers.
|
|
883
883
|
let resolvePort = (key, fallback) =>
|
|
884
884
|
NodeProcess.env->Dict.get(key)->Option.flatMap(v => Int.fromString(v))->Option.getOr(fallback)
|
|
885
885
|
let domainPort = resolvePort("REVENTLESS_DOMAIN_PORT", 4000)
|
|
@@ -2196,7 +2196,7 @@ module MakeWithConfig = (
|
|
|
2196
2196
|
// own explicit `Platform_UIFragments` flat-array resolver registered
|
|
2197
2197
|
// above; it isn't exposed as an MCP resource because the auto-generated
|
|
2198
2198
|
// single/list field shape was removed when the auto-generated query
|
|
2199
|
-
// entry was dropped in
|
|
2199
|
+
// entry was dropped in favor of that explicit field.
|
|
2200
2200
|
let adminFieldToQueryDb = Dict.fromArray([
|
|
2201
2201
|
(singleQueryField, pluginQueryDbName),
|
|
2202
2202
|
(listQueryField, pluginQueryDbName),
|
|
@@ -2475,7 +2475,7 @@ module MakeWithConfig = (
|
|
|
2475
2475
|
| Platform => None
|
|
2476
2476
|
}
|
|
2477
2477
|
|
|
2478
|
-
// Each plugin creates its own scheduler (mirrors AWS
|
|
2478
|
+
// Each plugin creates its own scheduler (mirrors AWS behavior).
|
|
2479
2479
|
let scheduler = makeScheduler()
|
|
2480
2480
|
hooks.scheduler := Some(scheduler)
|
|
2481
2481
|
hooks.api := Some({val: ()->Obj.magic})
|
package/src/Platform.res.mjs
CHANGED
|
@@ -41,7 +41,7 @@ import * as BakedManifest$ReventlessLocal from "./BakedManifest.res.mjs";
|
|
|
41
41
|
import * as HostShellDist$ReventlessLocal from "./HostShellDist.res.mjs";
|
|
42
42
|
import * as LocalEventTap$ReventlessLocal from "./adapter/LocalEventTap.res.mjs";
|
|
43
43
|
import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
|
|
44
|
-
import * as
|
|
44
|
+
import * as PluginDecision$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginDecision.res.mjs";
|
|
45
45
|
import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
|
|
46
46
|
import * as Plugin_Builder$ReventlessLocal from "./components/Plugin_Builder.res.mjs";
|
|
47
47
|
import * as Counter_Builder$ReventlessLocal from "./components/Counter_Builder.res.mjs";
|
|
@@ -97,7 +97,7 @@ import * as StateChangeSlice_Builder$ReventlessLocal from "./components/StateCha
|
|
|
97
97
|
import * as DcbEventLogStorage_Sqlite$ReventlessLocal from "./adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs";
|
|
98
98
|
import * as LocalEventCollectorChannel$ReventlessLocal from "./adapter/EventCollector/LocalEventCollectorChannel.res.mjs";
|
|
99
99
|
import * as PluginRuntime_Builder_Micro$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs";
|
|
100
|
-
import * as
|
|
100
|
+
import * as UiFragmentRegistry_Decision$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Decision.res.mjs";
|
|
101
101
|
import * as Platform_PluginStructuresApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_PluginStructuresApi.res.mjs";
|
|
102
102
|
import * as EventHistoryResolvers_GraphQL$ReventlessLocal from "./adapter/EventHistory/EventHistoryResolvers_GraphQL.res.mjs";
|
|
103
103
|
import * as InboundTranslationSlice_Builder$ReventlessLocal from "./components/InboundTranslationSlice_Builder.res.mjs";
|
|
@@ -489,8 +489,8 @@ function MakeWithConfig(Config) {
|
|
|
489
489
|
let AutomationSliceMaker = AutomationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
490
490
|
let OutboundTranslationSliceMaker = OutboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
491
491
|
let InboundTranslationSliceMaker = InboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
492
|
-
let Make = Spec => (
|
|
493
|
-
let $$let = AggregateMaker.Make(Spec)(
|
|
492
|
+
let Make = Spec => (Decision => (EventMappings => {
|
|
493
|
+
let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
|
|
494
494
|
return {
|
|
495
495
|
Spec: $$let.Spec,
|
|
496
496
|
make: $$let.make,
|
|
@@ -499,8 +499,8 @@ function MakeWithConfig(Config) {
|
|
|
499
499
|
finish: $$let.finish
|
|
500
500
|
};
|
|
501
501
|
}));
|
|
502
|
-
let MakeAsync = Spec => (
|
|
503
|
-
let $$let = AggregateMaker.Make(Spec)(
|
|
502
|
+
let MakeAsync = Spec => (Decision => (EventMappings => {
|
|
503
|
+
let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
|
|
504
504
|
return {
|
|
505
505
|
Spec: $$let.Spec,
|
|
506
506
|
make: $$let.make,
|
|
@@ -610,20 +610,20 @@ function MakeWithConfig(Config) {
|
|
|
610
610
|
Make: Make$5
|
|
611
611
|
};
|
|
612
612
|
let Counter = Counter_Builder$ReventlessLocal.Make(Bus);
|
|
613
|
-
let Make$6 = Spec => (
|
|
614
|
-
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
613
|
+
let Make$6 = Spec => (Decision => {
|
|
614
|
+
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
615
615
|
return {
|
|
616
616
|
Spec: $$let.Spec,
|
|
617
|
-
|
|
617
|
+
Decision: $$let.Decision,
|
|
618
618
|
isAsync: $$let.isAsync,
|
|
619
619
|
make: $$let.make
|
|
620
620
|
};
|
|
621
621
|
});
|
|
622
|
-
let MakeAsync$1 = Spec => (
|
|
623
|
-
let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
622
|
+
let MakeAsync$1 = Spec => (Decision => {
|
|
623
|
+
let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
624
624
|
return {
|
|
625
625
|
Spec: include.Spec,
|
|
626
|
-
|
|
626
|
+
Decision: include.Decision,
|
|
627
627
|
isAsync: true,
|
|
628
628
|
make: include.make
|
|
629
629
|
};
|
|
@@ -655,20 +655,20 @@ function MakeWithConfig(Config) {
|
|
|
655
655
|
traits: UiFragmentRegistry$ReventlessCore.traits,
|
|
656
656
|
readConsistency: UiFragmentRegistry$ReventlessCore.readConsistency
|
|
657
657
|
};
|
|
658
|
-
let
|
|
658
|
+
let Decision = {
|
|
659
659
|
initialState: undefined,
|
|
660
|
-
evolve:
|
|
661
|
-
decide:
|
|
662
|
-
moduleUrl:
|
|
660
|
+
evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
|
|
661
|
+
decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
|
|
662
|
+
moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
|
|
663
663
|
};
|
|
664
|
-
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
664
|
+
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
665
665
|
let UiFragmentRegistrySlice_Spec = $$let.Spec;
|
|
666
|
-
let
|
|
666
|
+
let UiFragmentRegistrySlice_Decision = $$let.Decision;
|
|
667
667
|
let UiFragmentRegistrySlice_isAsync = $$let.isAsync;
|
|
668
668
|
let UiFragmentRegistrySlice_make = $$let.make;
|
|
669
669
|
let UiFragmentRegistrySlice = {
|
|
670
670
|
Spec: UiFragmentRegistrySlice_Spec,
|
|
671
|
-
|
|
671
|
+
Decision: UiFragmentRegistrySlice_Decision,
|
|
672
672
|
isAsync: UiFragmentRegistrySlice_isAsync,
|
|
673
673
|
make: UiFragmentRegistrySlice_make
|
|
674
674
|
};
|
|
@@ -766,11 +766,11 @@ function MakeWithConfig(Config) {
|
|
|
766
766
|
commandTransition: PluginSpec$ReventlessCore.commandTransition,
|
|
767
767
|
traits: PluginSpec$ReventlessCore.traits
|
|
768
768
|
})({
|
|
769
|
-
initialState:
|
|
770
|
-
evolve:
|
|
771
|
-
decide:
|
|
769
|
+
initialState: PluginDecision$ReventlessCore.initialState,
|
|
770
|
+
evolve: PluginDecision$ReventlessCore.evolve,
|
|
771
|
+
decide: PluginDecision$ReventlessCore.decide,
|
|
772
772
|
snapshot: undefined,
|
|
773
|
-
moduleUrl:
|
|
773
|
+
moduleUrl: PluginDecision$ReventlessCore.moduleUrl
|
|
774
774
|
})(NoEventMappings$ReventlessInfra.Make({
|
|
775
775
|
name: PluginSpec$ReventlessCore.name,
|
|
776
776
|
Id: Id$Reventless.$$String,
|
|
@@ -2250,8 +2250,8 @@ function Make($star) {
|
|
|
2250
2250
|
let AutomationSliceMaker = AutomationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
2251
2251
|
let OutboundTranslationSliceMaker = OutboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
2252
2252
|
let InboundTranslationSliceMaker = InboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
|
|
2253
|
-
let Make$1 = Spec => (
|
|
2254
|
-
let $$let = AggregateMaker.Make(Spec)(
|
|
2253
|
+
let Make$1 = Spec => (Decision => (EventMappings => {
|
|
2254
|
+
let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
|
|
2255
2255
|
return {
|
|
2256
2256
|
Spec: $$let.Spec,
|
|
2257
2257
|
make: $$let.make,
|
|
@@ -2260,8 +2260,8 @@ function Make($star) {
|
|
|
2260
2260
|
finish: $$let.finish
|
|
2261
2261
|
};
|
|
2262
2262
|
}));
|
|
2263
|
-
let MakeAsync = Spec => (
|
|
2264
|
-
let $$let = AggregateMaker.Make(Spec)(
|
|
2263
|
+
let MakeAsync = Spec => (Decision => (EventMappings => {
|
|
2264
|
+
let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
|
|
2265
2265
|
return {
|
|
2266
2266
|
Spec: $$let.Spec,
|
|
2267
2267
|
make: $$let.make,
|
|
@@ -2371,20 +2371,20 @@ function Make($star) {
|
|
|
2371
2371
|
Make: Make$6
|
|
2372
2372
|
};
|
|
2373
2373
|
let Counter = Counter_Builder$ReventlessLocal.Make(Bus);
|
|
2374
|
-
let Make$7 = Spec => (
|
|
2375
|
-
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
2374
|
+
let Make$7 = Spec => (Decision => {
|
|
2375
|
+
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
2376
2376
|
return {
|
|
2377
2377
|
Spec: $$let.Spec,
|
|
2378
|
-
|
|
2378
|
+
Decision: $$let.Decision,
|
|
2379
2379
|
isAsync: $$let.isAsync,
|
|
2380
2380
|
make: $$let.make
|
|
2381
2381
|
};
|
|
2382
2382
|
});
|
|
2383
|
-
let MakeAsync$1 = Spec => (
|
|
2384
|
-
let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
2383
|
+
let MakeAsync$1 = Spec => (Decision => {
|
|
2384
|
+
let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
2385
2385
|
return {
|
|
2386
2386
|
Spec: include.Spec,
|
|
2387
|
-
|
|
2387
|
+
Decision: include.Decision,
|
|
2388
2388
|
isAsync: true,
|
|
2389
2389
|
make: include.make
|
|
2390
2390
|
};
|
|
@@ -2416,20 +2416,20 @@ function Make($star) {
|
|
|
2416
2416
|
traits: UiFragmentRegistry$ReventlessCore.traits,
|
|
2417
2417
|
readConsistency: UiFragmentRegistry$ReventlessCore.readConsistency
|
|
2418
2418
|
};
|
|
2419
|
-
let
|
|
2419
|
+
let Decision = {
|
|
2420
2420
|
initialState: undefined,
|
|
2421
|
-
evolve:
|
|
2422
|
-
decide:
|
|
2423
|
-
moduleUrl:
|
|
2421
|
+
evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
|
|
2422
|
+
decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
|
|
2423
|
+
moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
|
|
2424
2424
|
};
|
|
2425
|
-
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(
|
|
2425
|
+
let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
|
|
2426
2426
|
let UiFragmentRegistrySlice_Spec = $$let.Spec;
|
|
2427
|
-
let
|
|
2427
|
+
let UiFragmentRegistrySlice_Decision = $$let.Decision;
|
|
2428
2428
|
let UiFragmentRegistrySlice_isAsync = $$let.isAsync;
|
|
2429
2429
|
let UiFragmentRegistrySlice_make = $$let.make;
|
|
2430
2430
|
let UiFragmentRegistrySlice = {
|
|
2431
2431
|
Spec: UiFragmentRegistrySlice_Spec,
|
|
2432
|
-
|
|
2432
|
+
Decision: UiFragmentRegistrySlice_Decision,
|
|
2433
2433
|
isAsync: UiFragmentRegistrySlice_isAsync,
|
|
2434
2434
|
make: UiFragmentRegistrySlice_make
|
|
2435
2435
|
};
|
|
@@ -2527,11 +2527,11 @@ function Make($star) {
|
|
|
2527
2527
|
commandTransition: PluginSpec$ReventlessCore.commandTransition,
|
|
2528
2528
|
traits: PluginSpec$ReventlessCore.traits
|
|
2529
2529
|
})({
|
|
2530
|
-
initialState:
|
|
2531
|
-
evolve:
|
|
2532
|
-
decide:
|
|
2530
|
+
initialState: PluginDecision$ReventlessCore.initialState,
|
|
2531
|
+
evolve: PluginDecision$ReventlessCore.evolve,
|
|
2532
|
+
decide: PluginDecision$ReventlessCore.decide,
|
|
2533
2533
|
snapshot: undefined,
|
|
2534
|
-
moduleUrl:
|
|
2534
|
+
moduleUrl: PluginDecision$ReventlessCore.moduleUrl
|
|
2535
2535
|
})(NoEventMappings$ReventlessInfra.Make({
|
|
2536
2536
|
name: PluginSpec$ReventlessCore.name,
|
|
2537
2537
|
Id: Id$Reventless.$$String,
|
package/src/UiHints.res
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// withdrawn declaration leaves yesterday's hints in place with nothing in the
|
|
13
13
|
// diff to explain them. Unlike `ShellConfig` there is no merge — AWS writes the
|
|
14
14
|
// declared file verbatim, and layering a deployment's hints over the shell
|
|
15
|
-
// package's demonstration hints would invent a third
|
|
15
|
+
// package's demonstration hints would invent a third behavior neither platform
|
|
16
16
|
// has.
|
|
17
17
|
|
|
18
18
|
let log = ReventlessCore.Logger.fromEnv()
|
|
@@ -113,7 +113,7 @@ module Login = {
|
|
|
113
113
|
// every ReScript rebuild, so a per-process secret logs the developer out
|
|
114
114
|
// several times an hour, mid-task, with a "reconnecting" spinner as the
|
|
115
115
|
// only explanation.
|
|
116
|
-
// 3. A random 32 bytes, per process — today's
|
|
116
|
+
// 3. A random 32 bytes, per process — today's behavior, kept for the run
|
|
117
117
|
// that has no `.reventless/` to write to.
|
|
118
118
|
//
|
|
119
119
|
// The directory is used but never created. Its presence is what distinguishes
|
|
@@ -389,7 +389,7 @@ let authenticate = async (ctx: ReventlessCore.Auth_Adapter.requestContext): Iden
|
|
|
389
389
|
| None =>
|
|
390
390
|
// No headers: in-memory mode defaults to defaultUser so local dev
|
|
391
391
|
// against an AllowAuthenticated-defaulted backend "just works" without
|
|
392
|
-
// setting headers. Anonymous
|
|
392
|
+
// setting headers. Anonymous behavior is reachable only by building
|
|
393
393
|
// an Identity.anonymous explicitly in code.
|
|
394
394
|
Authenticated(defaultUser)
|
|
395
395
|
| Some(g) =>
|
package/src/adapter/Backend.res
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Selects which storage backend the in-memory Platform uses.
|
|
2
2
|
//
|
|
3
|
-
// Memory — pure in-memory dicts/refs, current default
|
|
3
|
+
// Memory — pure in-memory dicts/refs, current default behavior, wiped on restart.
|
|
4
4
|
// Sqlite — opt-in on-disk SQLite file via SqliteDriver. Survives process restart.
|
|
5
5
|
// resetOnStart=true wipes the file when the Platform is constructed.
|
|
6
6
|
|
|
@@ -41,7 +41,7 @@ let removeFileIfExists = (path: string) =>
|
|
|
41
41
|
| _ => ()
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
// Parses REVENTLESS_LOCAL_BACKEND.
|
|
44
|
+
// Parses REVENTLESS_LOCAL_BACKEND. Recognized forms:
|
|
45
45
|
// sqlite:./local.db — Sqlite backend, no reset on start
|
|
46
46
|
// sqlite:./local.db?reset — Sqlite backend, wipes file at Platform.Make time
|
|
47
47
|
// memory — explicit Memory selector
|
package/src/adapter/LocalBus.res
CHANGED
|
@@ -117,7 +117,7 @@ module type T = {
|
|
|
117
117
|
let registerQueryDbScan: (string, unit => array<JSON.t>) => unit
|
|
118
118
|
let getQueryDbScan: string => option<unit => array<JSON.t>>
|
|
119
119
|
// Stream variant: lazily creates a Stream from current storage contents.
|
|
120
|
-
// Used by LocalQueryEngine to
|
|
120
|
+
// Used by LocalQueryEngine to honor ~limit via Stream.take without loading all items.
|
|
121
121
|
let registerQueryDbStream: (string, unit => Stream.t<JSON.t, string, unit>) => unit
|
|
122
122
|
let getQueryDbStream: string => option<unit => Stream.t<JSON.t, string, unit>>
|
|
123
123
|
// Indexed equality lookup: (field, value) → matching items. The SQLite backend
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Local upload resolver logic (route B), backed by `LocalObjectStore`. Shared by the
|
|
2
2
|
// dev platform (`Platform.res` registers these on the domain server) and
|
|
3
|
-
// `ServedBucketHttpTest`, so the mint/release
|
|
3
|
+
// `ServedBucketHttpTest`, so the mint/release behavior has one definition.
|
|
4
4
|
//
|
|
5
5
|
// The dev store has no identities and no clock, so release enforces only the *shape*
|
|
6
6
|
// of the rule (key under a served prefix), not the identity/age conditions AWS applies
|
|
@@ -28,12 +28,12 @@ module MakeWithHooks = (
|
|
|
28
28
|
|
|
29
29
|
module Make = (
|
|
30
30
|
Spec: Reventless.Aggregate.Spec,
|
|
31
|
-
|
|
31
|
+
Decision: Reventless.Decision.T with module Spec := Spec,
|
|
32
32
|
EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
|
|
33
33
|
) => {
|
|
34
34
|
include ReventlessCore.Aggregate_Builder.Make(
|
|
35
35
|
Spec,
|
|
36
|
-
|
|
36
|
+
Decision,
|
|
37
37
|
EventMappings,
|
|
38
38
|
RuntimeEnvironment,
|
|
39
39
|
CommandGeneratorResolvers_GraphQL,
|
|
@@ -56,8 +56,8 @@ function MakeWithHooks(Bus) {
|
|
|
56
56
|
let AggregateRuntimeBuilder = LocalAggregateRuntime_Builder$ReventlessLocal.Make(Bus)({
|
|
57
57
|
make: CommandTopicChannel.make
|
|
58
58
|
})(EventCollectorChannel);
|
|
59
|
-
let Make = Spec => (
|
|
60
|
-
let include = Aggregate_Builder$ReventlessCore.Make(Spec)(
|
|
59
|
+
let Make = Spec => (Decision => (EventMappings => {
|
|
60
|
+
let include = Aggregate_Builder$ReventlessCore.Make(Spec)(Decision)({
|
|
61
61
|
mappings: EventMappings.mappings,
|
|
62
62
|
counter: EventMappings.counter
|
|
63
63
|
})({
|
|
@@ -105,8 +105,8 @@ function Make(Bus) {
|
|
|
105
105
|
let AggregateRuntimeBuilder = LocalAggregateRuntime_Builder$ReventlessLocal.Make(Bus)({
|
|
106
106
|
make: CommandTopicChannel.make
|
|
107
107
|
})(EventCollectorChannel);
|
|
108
|
-
let Make$1 = Spec => (
|
|
109
|
-
let include = Aggregate_Builder$ReventlessCore.Make(Spec)(
|
|
108
|
+
let Make$1 = Spec => (Decision => (EventMappings => {
|
|
109
|
+
let include = Aggregate_Builder$ReventlessCore.Make(Spec)(Decision)({
|
|
110
110
|
mappings: EventMappings.mappings,
|
|
111
111
|
counter: EventMappings.counter
|
|
112
112
|
})({
|
|
@@ -4,7 +4,7 @@ module Make = (Bus: LocalBus.T) => {
|
|
|
4
4
|
module EventTopicPublisher = LocalEventTopicPublisher.Make(Bus)
|
|
5
5
|
|
|
6
6
|
// Use the backend-aware storage functor (as Platform does), not the plain
|
|
7
|
-
// module: the functor consults BackendState so a standalone DCB log
|
|
7
|
+
// module: the functor consults BackendState so a standalone DCB log honors
|
|
8
8
|
// REVENTLESS_LOCAL_BACKEND=sqlite, and it registers the read with the Bus so
|
|
9
9
|
// `Bus.getDcbEventLogRead` can see it. The plain module did neither — the log
|
|
10
10
|
// silently stayed in memory under SQLite and was invisible to bus readers.
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
module Make = (
|
|
4
4
|
Spec: Reventless.StateChangeSlice.Spec,
|
|
5
|
-
|
|
5
|
+
Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
|
|
6
6
|
) => {
|
|
7
|
-
module Inner = ReventlessCore.StateChangeSlice_Builder.Make(Spec,
|
|
7
|
+
module Inner = ReventlessCore.StateChangeSlice_Builder.Make(Spec, Decision)
|
|
8
8
|
module Spec = Spec
|
|
9
|
-
module
|
|
9
|
+
module Decision = Decision
|
|
10
10
|
let isAsync = Inner.isAsync
|
|
11
11
|
type component = Inner.component
|
|
12
12
|
let make: (
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import * as StateChangeSlice_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/StateChangeSlice/StateChangeSlice_Builder.res.mjs";
|
|
4
4
|
|
|
5
5
|
function Make(Spec) {
|
|
6
|
-
return
|
|
7
|
-
let Inner = StateChangeSlice_Builder$ReventlessCore.Make(Spec)(
|
|
6
|
+
return Decision => {
|
|
7
|
+
let Inner = StateChangeSlice_Builder$ReventlessCore.Make(Spec)(Decision);
|
|
8
8
|
return {
|
|
9
9
|
Inner: Inner,
|
|
10
10
|
Spec: Spec,
|
|
11
|
-
|
|
11
|
+
Decision: Decision,
|
|
12
12
|
isAsync: Inner.isAsync,
|
|
13
13
|
make: Inner.make
|
|
14
14
|
};
|
|
@@ -552,7 +552,7 @@ let run = (~dbPath: option<string>=?): unit => {
|
|
|
552
552
|
Console.log("Nothing to do.")
|
|
553
553
|
} else {
|
|
554
554
|
// Set at all ⇒ it is the answer, affirmative or not. Falling through to
|
|
555
|
-
// the prompt on an
|
|
555
|
+
// the prompt on an unrecognized value would ask for a TTY the runs this
|
|
556
556
|
// variable exists for do not have, so `SEED_RESET_CONFIRM=no` would
|
|
557
557
|
// throw where it plainly means "don't". Both arms read the reply
|
|
558
558
|
// through one predicate, which is what keeps the typed `y` and the
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Behavioral parity between Memory, Sqlite, and Postgres backends at the adapter
|
|
2
2
|
// layer. Each test runs the same scenario against every BackendState setting.
|
|
3
3
|
//
|
|
4
4
|
// The Postgres arm is exercised only when PG_URL is set (so the default test run
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Behavioral tests for the event-history query resolver's pure core —
|
|
2
2
|
// position ordering, filtering, and keyset pagination. That is where the
|
|
3
|
-
//
|
|
3
|
+
// behavior lives; the Bus fork around them is two registry lookups.
|
|
4
4
|
|
|
5
5
|
@@warning("-44")
|
|
6
6
|
|
|
@@ -755,7 +755,7 @@ describe("GraphQL_SchemaInspector", () => {
|
|
|
755
755
|
// Per-field eq inputs derived from @id and @index
|
|
756
756
|
expect(sdl->String.includes("input IndexedProductFilter"))->toBe(true)
|
|
757
757
|
expect(sdl->String.includes("productIdEq: ID"))->toBe(true)
|
|
758
|
-
// ownerId is detected as an entity reference → ID (matches SchemaType.fromSury
|
|
758
|
+
// ownerId is detected as an entity reference → ID (matches SchemaType.fromSury behavior)
|
|
759
759
|
expect(sdl->String.includes("ownerIdEq: ID"))->toBe(true)
|
|
760
760
|
// OrderField enum lists the same fields
|
|
761
761
|
expect(sdl->String.includes("enum IndexedProductOrderField"))->toBe(true)
|
|
@@ -418,7 +418,7 @@ describe("the conformance table, minted locally", () => {
|
|
|
418
418
|
)
|
|
419
419
|
switch (minted, expected) {
|
|
420
420
|
| (Ok(token), Some(groups)) => expect(decodeOrThrow(token).groups)->toEqual(groups)
|
|
421
|
-
// `None` means refused — not
|
|
421
|
+
// `None` means refused — not honored, not ignored, and not reduced to the
|
|
422
422
|
// empty set. A token minted here at all would be the vulnerability.
|
|
423
423
|
| (Ok(_), None) => JsError.throwWithMessage("expected the request to be refused")
|
|
424
424
|
| (Error(msg), Some(_)) => JsError.throwWithMessage("expected a token, got: " ++ msg)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Behavioral tests for the in-memory cross-table field resolvers
|
|
2
2
|
// (`@resolves` / `@resolvesMany`). An Orders view carries a foreign `productId`
|
|
3
3
|
// and a `productIds` array; both follow into a Products view's rows.
|
|
4
4
|
//
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// E2E test fixtures for the Aggregate E2E test.
|
|
2
|
-
// Contains specs,
|
|
2
|
+
// Contains specs, decision, bus setup, and shared test data.
|
|
3
3
|
|
|
4
4
|
// ─────────────────────────────────────────────────────────────
|
|
5
5
|
// Simple Item aggregate spec
|
|
@@ -22,16 +22,16 @@ module ItemSpec = {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// ─────────────────────────────────────────────────────────────
|
|
25
|
-
// Item
|
|
25
|
+
// Item decision: CreateItem → ItemCreated
|
|
26
26
|
// ─────────────────────────────────────────────────────────────
|
|
27
27
|
|
|
28
|
-
module
|
|
28
|
+
module ItemDecision: ReventlessCore.Decision.T with module Spec := ItemSpec = {
|
|
29
29
|
type state = bool // true = item exists
|
|
30
30
|
|
|
31
31
|
let initialState = false
|
|
32
32
|
|
|
33
|
-
// Hand-written
|
|
34
|
-
//
|
|
33
|
+
// Hand-written decision (no @@reventless.decision PPX) — satisfy the
|
|
34
|
+
// Decision.T snapshot field manually.
|
|
35
35
|
let snapshot = None
|
|
36
36
|
|
|
37
37
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
@@ -75,7 +75,7 @@ let _ = TestRunner.setup()
|
|
|
75
75
|
module ItemAggregateMaker = Aggregate_Builder.Make(Bus)
|
|
76
76
|
module ItemAgg = ItemAggregateMaker.Make(
|
|
77
77
|
ItemSpec,
|
|
78
|
-
|
|
78
|
+
ItemDecision,
|
|
79
79
|
ReventlessInfra.NoEventMappings.Make(ItemSpec),
|
|
80
80
|
)
|
|
81
81
|
|
|
@@ -68,7 +68,7 @@ function decide(state, command) {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
let
|
|
71
|
+
let ItemDecision = {
|
|
72
72
|
initialState: false,
|
|
73
73
|
evolve: evolve,
|
|
74
74
|
decide: decide,
|
|
@@ -100,7 +100,7 @@ let ItemAgg = ItemAggregateMaker.Make({
|
|
|
100
100
|
authorizationOf: authorizationOf,
|
|
101
101
|
commandTransition: commandTransition,
|
|
102
102
|
traits: traits
|
|
103
|
-
})(
|
|
103
|
+
})(ItemDecision)(NoEventMappings$ReventlessInfra.Make({
|
|
104
104
|
name: name,
|
|
105
105
|
Id: Id$Reventless.$$String,
|
|
106
106
|
commandSchema: commandSchema
|
|
@@ -110,7 +110,7 @@ let agg = ItemAgg.make(undefined, undefined, undefined);
|
|
|
110
110
|
|
|
111
111
|
export {
|
|
112
112
|
ItemSpec,
|
|
113
|
-
|
|
113
|
+
ItemDecision,
|
|
114
114
|
Bus,
|
|
115
115
|
capturedEventCount,
|
|
116
116
|
ItemAggregateMaker,
|
|
@@ -22,7 +22,7 @@ module ShipmentSpec = {
|
|
|
22
22
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
module
|
|
25
|
+
module ShipmentDecision: ReventlessCore.Decision.T with module Spec := ShipmentSpec = {
|
|
26
26
|
type state = int // events seen
|
|
27
27
|
|
|
28
28
|
let initialState = 0
|
|
@@ -68,7 +68,7 @@ let _ = Bus.subscribeToEvents("TestShipmentAggrEventTopic", async (_, _, _) => {
|
|
|
68
68
|
let _ = TestRunner.setup()
|
|
69
69
|
|
|
70
70
|
module ShipmentAggregateMaker = Aggregate_Builder.Make(Bus)
|
|
71
|
-
module ShipmentAgg = ShipmentAggregateMaker.Make(ShipmentSpec,
|
|
71
|
+
module ShipmentAgg = ShipmentAggregateMaker.Make(ShipmentSpec, ShipmentDecision, ShipmentMappings)
|
|
72
72
|
|
|
73
73
|
let agg = ShipmentAgg.make(~api=())
|
|
74
74
|
|
|
@@ -84,7 +84,7 @@ function decide(state, command) {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
let
|
|
87
|
+
let ShipmentDecision = {
|
|
88
88
|
initialState: 0,
|
|
89
89
|
evolve: evolve,
|
|
90
90
|
decide: decide,
|
|
@@ -158,7 +158,7 @@ let ShipmentAgg = ShipmentAggregateMaker.Make({
|
|
|
158
158
|
authorizationOf: authorizationOf,
|
|
159
159
|
commandTransition: commandTransition,
|
|
160
160
|
traits: traits
|
|
161
|
-
})(
|
|
161
|
+
})(ShipmentDecision)({
|
|
162
162
|
moduleUrl: moduleUrl$2,
|
|
163
163
|
mappings: mappings,
|
|
164
164
|
counter: undefined
|
|
@@ -191,7 +191,7 @@ async function withTimeout(p, ms) {
|
|
|
191
191
|
|
|
192
192
|
export {
|
|
193
193
|
ShipmentSpec,
|
|
194
|
-
|
|
194
|
+
ShipmentDecision,
|
|
195
195
|
ShipmentMappings,
|
|
196
196
|
Bus,
|
|
197
197
|
publishedEvents,
|
|
@@ -43,7 +43,7 @@ module PlaceSpec = {
|
|
|
43
43
|
let commandSchema = commandSchema
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
module
|
|
46
|
+
module PlaceDecision = {
|
|
47
47
|
module Spec = PlaceSpec
|
|
48
48
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
49
49
|
|
|
@@ -86,7 +86,7 @@ module ShipSpec = {
|
|
|
86
86
|
let commandSchema = commandSchema
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
module
|
|
89
|
+
module ShipDecision = {
|
|
90
90
|
module Spec = ShipSpec
|
|
91
91
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
92
92
|
|
|
@@ -234,10 +234,10 @@ let publishJsonsOutput = publishJsons->Pulumi.Output.make
|
|
|
234
234
|
// Wire StateChangeSlices to the DcbEventLog + AutomationSlice to the topic
|
|
235
235
|
// ─────────────────────────────────────────────────────────────
|
|
236
236
|
|
|
237
|
-
module PlaceMaker = StateChangeSlice_Builder.Make(PlaceSpec,
|
|
237
|
+
module PlaceMaker = StateChangeSlice_Builder.Make(PlaceSpec, PlaceDecision)
|
|
238
238
|
let _placeSlice = PlaceMaker.make(~dcbEventLog, ~publishJsons=publishJsonsOutput)
|
|
239
239
|
|
|
240
|
-
module ShipMaker = StateChangeSlice_Builder.Make(ShipSpec,
|
|
240
|
+
module ShipMaker = StateChangeSlice_Builder.Make(ShipSpec, ShipDecision)
|
|
241
241
|
let _shipSlice = ShipMaker.make(~dcbEventLog, ~publishJsons=publishJsonsOutput)
|
|
242
242
|
|
|
243
243
|
let dcbTopicOutputs: ReventlessInfra.EventTopic.outputs = (
|
|
@@ -84,7 +84,7 @@ function decide(state, command) {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
let
|
|
87
|
+
let PlaceDecision = {
|
|
88
88
|
Spec: undefined,
|
|
89
89
|
moduleUrl: moduleUrl$1,
|
|
90
90
|
initialState: false,
|
|
@@ -185,7 +185,7 @@ function decide$1(state, command) {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
let
|
|
188
|
+
let ShipDecision = {
|
|
189
189
|
Spec: undefined,
|
|
190
190
|
moduleUrl: moduleUrl$3,
|
|
191
191
|
initialState: initialState,
|
|
@@ -461,9 +461,9 @@ async function readEventTypes(orderId) {
|
|
|
461
461
|
|
|
462
462
|
export {
|
|
463
463
|
PlaceSpec,
|
|
464
|
-
|
|
464
|
+
PlaceDecision,
|
|
465
465
|
ShipSpec,
|
|
466
|
-
|
|
466
|
+
ShipDecision,
|
|
467
467
|
DcbSource,
|
|
468
468
|
AutoShipSpec,
|
|
469
469
|
FromDcb,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
let _ = TestRunner.setup()
|
|
6
6
|
|
|
7
7
|
// ─────────────────────────────────────────────────────────────
|
|
8
|
-
// Aggregate spec (matches the
|
|
8
|
+
// Aggregate spec (matches the Decision used in CommandGenerator_Builder.Make)
|
|
9
9
|
// ─────────────────────────────────────────────────────────────
|
|
10
10
|
|
|
11
11
|
module CGSpec = {
|
|
@@ -25,10 +25,10 @@ module CGSpec = {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// ─────────────────────────────────────────────────────────────
|
|
28
|
-
//
|
|
28
|
+
// Decision
|
|
29
29
|
// ─────────────────────────────────────────────────────────────
|
|
30
30
|
|
|
31
|
-
module
|
|
31
|
+
module CGDecision = {
|
|
32
32
|
module Spec = CGSpec
|
|
33
33
|
type state = {name: string}
|
|
34
34
|
|
|
@@ -64,14 +64,14 @@ function decide(_state, command) {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
let
|
|
67
|
+
let CGDecision_initialState = {
|
|
68
68
|
name: ""
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
let
|
|
71
|
+
let CGDecision = {
|
|
72
72
|
Spec: undefined,
|
|
73
73
|
moduleUrl: moduleUrl$1,
|
|
74
|
-
initialState:
|
|
74
|
+
initialState: CGDecision_initialState,
|
|
75
75
|
evolve: evolve,
|
|
76
76
|
decide: decide
|
|
77
77
|
};
|
|
@@ -108,7 +108,7 @@ function resetMocks() {
|
|
|
108
108
|
|
|
109
109
|
export {
|
|
110
110
|
CGSpec,
|
|
111
|
-
|
|
111
|
+
CGDecision,
|
|
112
112
|
CGMaker,
|
|
113
113
|
capturedCmds,
|
|
114
114
|
mockPublish,
|
|
@@ -56,7 +56,7 @@ module AddProductSpec = {
|
|
|
56
56
|
let commandSchema = commandSchema
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
module
|
|
59
|
+
module AddProductDecision = {
|
|
60
60
|
module Spec = AddProductSpec
|
|
61
61
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
62
62
|
|
|
@@ -107,7 +107,7 @@ let eventLog = CatalogLogMaker.make(
|
|
|
107
107
|
)
|
|
108
108
|
|
|
109
109
|
// ─── StateChangeSlice, threaded with the INFERRED scope ───
|
|
110
|
-
module AddProductMaker = StateChangeSlice_Builder.Make(AddProductSpec,
|
|
110
|
+
module AddProductMaker = StateChangeSlice_Builder.Make(AddProductSpec, AddProductDecision)
|
|
111
111
|
|
|
112
112
|
let publishJsons: ReventlessInfra.CommandTopic.publishJsons = async cmdJsons => {
|
|
113
113
|
let _ = await cmdJsons
|
|
@@ -141,7 +141,7 @@ function decide(state, command) {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
let
|
|
144
|
+
let AddProductDecision = {
|
|
145
145
|
Spec: undefined,
|
|
146
146
|
moduleUrl: moduleUrl$1,
|
|
147
147
|
initialState: initialState,
|
|
@@ -269,7 +269,7 @@ function addProductJson(productId, categoryId, name) {
|
|
|
269
269
|
export {
|
|
270
270
|
CatalogLog,
|
|
271
271
|
AddProductSpec,
|
|
272
|
-
|
|
272
|
+
AddProductDecision,
|
|
273
273
|
Bus,
|
|
274
274
|
capturedEventCount,
|
|
275
275
|
CatalogLogMaker,
|
|
@@ -36,7 +36,7 @@ module AddItemSpec = {
|
|
|
36
36
|
let commandSchema = commandSchema // auto-generated by @schema
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
module
|
|
39
|
+
module AddItemDecision = {
|
|
40
40
|
module Spec = AddItemSpec
|
|
41
41
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
42
42
|
|
|
@@ -87,7 +87,7 @@ let eventLog = ItemEventLogMaker.make(
|
|
|
87
87
|
// Build StateChangeSlice
|
|
88
88
|
// ─────────────────────────────────────────────────────────────
|
|
89
89
|
|
|
90
|
-
module AddItemMaker = StateChangeSlice_Builder.Make(AddItemSpec,
|
|
90
|
+
module AddItemMaker = StateChangeSlice_Builder.Make(AddItemSpec, AddItemDecision)
|
|
91
91
|
|
|
92
92
|
// publishJsons routing — dispatches each command to its registered handler.
|
|
93
93
|
let publishJsons: ReventlessInfra.CommandTopic.publishJsons = async cmdJsons => {
|
|
@@ -93,7 +93,7 @@ function decide(state, command) {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
let
|
|
96
|
+
let AddItemDecision = {
|
|
97
97
|
Spec: undefined,
|
|
98
98
|
moduleUrl: moduleUrl$1,
|
|
99
99
|
initialState: false,
|
|
@@ -213,7 +213,7 @@ function addItemJson(id, name) {
|
|
|
213
213
|
export {
|
|
214
214
|
ItemEventLog,
|
|
215
215
|
AddItemSpec,
|
|
216
|
-
|
|
216
|
+
AddItemDecision,
|
|
217
217
|
Bus,
|
|
218
218
|
capturedEventCount,
|
|
219
219
|
ItemEventLogMaker,
|
|
@@ -72,7 +72,7 @@ module ProcessPaymentSpec = {
|
|
|
72
72
|
(string, outboundItem) => promise<result<option<(string, inboundCommand)>, string>>,
|
|
73
73
|
> = ref(async (id, _item) => Ok(Some((id, ConfirmPayment({orderId: id})))))
|
|
74
74
|
|
|
75
|
-
// The mock stays two-arg: a test that wants to vary
|
|
75
|
+
// The mock stays two-arg: a test that wants to vary behavior varies it on
|
|
76
76
|
// the item, and threading capabilities into every fixture would make each
|
|
77
77
|
// one restate a type it does not use.
|
|
78
78
|
let translate = (id, item, ~capabilities as _) => translateFn.contents(id, item)
|
package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res
CHANGED
|
@@ -39,7 +39,7 @@ module PlaceSpec = {
|
|
|
39
39
|
let commandSchema = commandSchema
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
module
|
|
42
|
+
module PlaceDecision = {
|
|
43
43
|
module Spec = PlaceSpec
|
|
44
44
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
45
45
|
|
|
@@ -172,7 +172,7 @@ let publishJsonsOutput = publishJsons->Pulumi.Output.make
|
|
|
172
172
|
// Wire the StateChangeSlice + the OutboundTranslationSlice
|
|
173
173
|
// ─────────────────────────────────────────────────────────────
|
|
174
174
|
|
|
175
|
-
module PlaceMaker = StateChangeSlice_Builder.Make(PlaceSpec,
|
|
175
|
+
module PlaceMaker = StateChangeSlice_Builder.Make(PlaceSpec, PlaceDecision)
|
|
176
176
|
let _placeSlice = PlaceMaker.make(~dcbEventLog, ~publishJsons=publishJsonsOutput)
|
|
177
177
|
|
|
178
178
|
let dcbTopicOutputs: ReventlessInfra.EventTopic.outputs = (
|
package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res.mjs
CHANGED
|
@@ -85,7 +85,7 @@ function decide(state, command) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
let
|
|
88
|
+
let PlaceDecision = {
|
|
89
89
|
Spec: undefined,
|
|
90
90
|
moduleUrl: moduleUrl$1,
|
|
91
91
|
initialState: false,
|
|
@@ -274,7 +274,7 @@ async function flush() {
|
|
|
274
274
|
|
|
275
275
|
export {
|
|
276
276
|
PlaceSpec,
|
|
277
|
-
|
|
277
|
+
PlaceDecision,
|
|
278
278
|
SendConfirmSpec,
|
|
279
279
|
collectCalls,
|
|
280
280
|
externalCalls,
|
|
@@ -35,7 +35,7 @@ module AddProductSpec = {
|
|
|
35
35
|
let commandSchema = commandSchema
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
module
|
|
38
|
+
module AddProductDecision = {
|
|
39
39
|
module Spec = AddProductSpec
|
|
40
40
|
let moduleUrl: string = %raw(`import.meta.url`)
|
|
41
41
|
|
|
@@ -130,7 +130,7 @@ let dcbEventLog = DcbLogMaker.make(
|
|
|
130
130
|
~partitionTag=Reventless.DcbTag.Simple({key: "productId"}),
|
|
131
131
|
)
|
|
132
132
|
|
|
133
|
-
module AddProductMaker = StateChangeSlice_Builder.Make(AddProductSpec,
|
|
133
|
+
module AddProductMaker = StateChangeSlice_Builder.Make(AddProductSpec, AddProductDecision)
|
|
134
134
|
|
|
135
135
|
let publishJsons: ReventlessInfra.CommandTopic.publishJsons = async cmdJsons => {
|
|
136
136
|
let _ = await cmdJsons
|
|
@@ -89,7 +89,7 @@ function decide(state, command) {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
let
|
|
92
|
+
let AddProductDecision = {
|
|
93
93
|
Spec: undefined,
|
|
94
94
|
moduleUrl: moduleUrl$1,
|
|
95
95
|
initialState: false,
|
|
@@ -294,7 +294,7 @@ async function loadState(productId) {
|
|
|
294
294
|
|
|
295
295
|
export {
|
|
296
296
|
AddProductSpec,
|
|
297
|
-
|
|
297
|
+
AddProductDecision,
|
|
298
298
|
ProductCatalogDcbSource,
|
|
299
299
|
ProductsReadModelSpec,
|
|
300
300
|
ProductsFromDcb,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
open ReventlessCore
|
|
2
2
|
open PluginSpec
|
|
3
3
|
open Plugin_Fixtures
|
|
4
|
-
module PluginTest = ReventlessGwt.
|
|
4
|
+
module PluginTest = ReventlessGwt.Decision_GWT.MakeFromAggregate(PluginSpec, PluginDecision)
|
|
5
5
|
open PluginTest
|
|
6
6
|
|
|
7
7
|
// Name-keyed lifecycle aggregate. Commands carry the version; the aggregate
|
|
@@ -15,7 +15,7 @@ let supersededV1ByV2 = VersionSuperseded({
|
|
|
15
15
|
newDefinition: pluginDefinitionV2,
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
-
describe("
|
|
18
|
+
describe("PluginDecision:", () => {
|
|
19
19
|
// ── Detection → connect handshake ──────────────────────────────────────────
|
|
20
20
|
test("Heartbeat for an unknown version triggers detection", () =>
|
|
21
21
|
givenEvents([])->whenCmd(Heartbeat("1"))->thenEvents([VersionDetected("1")])
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
3
|
import * as PluginSpec$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginSpec.res.mjs";
|
|
4
|
-
import * as
|
|
5
|
-
import * as
|
|
4
|
+
import * as Decision_GWT$ReventlessGwt from "@reventlessdev/reventless-gwt/src/Decision_GWT.res.mjs";
|
|
5
|
+
import * as PluginDecision$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginDecision.res.mjs";
|
|
6
6
|
import * as Plugin_Fixtures$ReventlessLocal from "./Plugin_Fixtures.res.mjs";
|
|
7
7
|
|
|
8
|
-
let PluginTest =
|
|
8
|
+
let PluginTest = Decision_GWT$ReventlessGwt.MakeFromAggregate({
|
|
9
9
|
name: PluginSpec$ReventlessCore.name,
|
|
10
10
|
commandSchema: PluginSpec$ReventlessCore.commandSchema,
|
|
11
11
|
eventSchema: PluginSpec$ReventlessCore.eventSchema,
|
|
@@ -19,11 +19,11 @@ let PluginTest = Behavior_GWT$ReventlessGwt.MakeFromAggregate({
|
|
|
19
19
|
errorSchema: PluginSpec$ReventlessCore.errorSchema,
|
|
20
20
|
authorizationOf: PluginSpec$ReventlessCore.authorizationOf
|
|
21
21
|
},
|
|
22
|
-
initialState:
|
|
23
|
-
evolve:
|
|
24
|
-
decide:
|
|
22
|
+
initialState: PluginDecision$ReventlessCore.initialState,
|
|
23
|
+
evolve: PluginDecision$ReventlessCore.evolve,
|
|
24
|
+
decide: PluginDecision$ReventlessCore.decide,
|
|
25
25
|
snapshot: undefined,
|
|
26
|
-
moduleUrl:
|
|
26
|
+
moduleUrl: PluginDecision$ReventlessCore.moduleUrl
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
let supersededV1ByV2 = {
|
|
@@ -36,7 +36,7 @@ let supersededV1ByV2 = {
|
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
PluginTest.describe("
|
|
39
|
+
PluginTest.describe("PluginDecision:", () => {
|
|
40
40
|
PluginTest.test("Heartbeat for an unknown version triggers detection", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([]), {
|
|
41
41
|
TAG: "Heartbeat",
|
|
42
42
|
_0: "1"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
open ReventlessCore
|
|
4
4
|
open Plugin_Fixtures
|
|
5
5
|
|
|
6
|
-
module Test = ReventlessGwt.
|
|
6
|
+
module Test = ReventlessGwt.Decision_GWT.Make(UiFragmentRegistry, UiFragmentRegistry_Decision)
|
|
7
7
|
open Test
|
|
8
8
|
open UiFragmentRegistry
|
|
9
9
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as
|
|
3
|
+
import * as Decision_GWT$ReventlessGwt from "@reventlessdev/reventless-gwt/src/Decision_GWT.res.mjs";
|
|
4
4
|
import * as Plugin_Fixtures$ReventlessLocal from "./Plugin_Fixtures.res.mjs";
|
|
5
5
|
import * as UiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry.res.mjs";
|
|
6
|
-
import * as
|
|
6
|
+
import * as UiFragmentRegistry_Decision$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Decision.res.mjs";
|
|
7
7
|
|
|
8
|
-
let Test =
|
|
8
|
+
let Test = Decision_GWT$ReventlessGwt.Make({
|
|
9
9
|
name: UiFragmentRegistry$ReventlessCore.name,
|
|
10
10
|
consumedEventSchema: UiFragmentRegistry$ReventlessCore.consumedEventSchema,
|
|
11
11
|
commandSchema: UiFragmentRegistry$ReventlessCore.commandSchema,
|
|
@@ -14,8 +14,8 @@ let Test = Behavior_GWT$ReventlessGwt.Make({
|
|
|
14
14
|
authorizationOf: UiFragmentRegistry$ReventlessCore.authorizationOf
|
|
15
15
|
})({
|
|
16
16
|
initialState: undefined,
|
|
17
|
-
evolve:
|
|
18
|
-
decide:
|
|
17
|
+
evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
|
|
18
|
+
decide: UiFragmentRegistry_Decision$ReventlessCore.decide
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
let manifest2_panels = [];
|