@reventlessdev/reventless-local 3.0.0-alpha.291 → 3.0.0-alpha.293
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 +27 -0
- package/package.json +13 -13
- package/src/Platform.res +13 -13
- package/src/Platform.res.mjs +48 -48
- package/src/UiHints.res +1 -1
- package/src/adapter/Auth/LocalAuth.res +2 -2
- package/src/adapter/Backend.res +2 -2
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +1 -1
- package/src/adapter/LocalBus.res +1 -1
- package/src/adapter/LocalUploadResolvers.res +1 -1
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res +8 -3
- package/src/adapter/Task/LocalTaskBucket.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/heartbeat/HeartbeatFixtures.res +1 -1
- 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/components/stateviewslice/StateViewSliceDisplayNameFixtures.res +1 -1
- package/tests/components/stateviewslice/StateViewSliceDisplayNameFixtures.res.mjs +2 -2
- package/tests/components/stateviewslice/StateViewSliceFixtures.res +1 -1
- package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +2 -2
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +1 -1
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.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/tests/plugin/UiFragments_GWT.res.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@
|
|
|
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.293 (2026-10-21)
|
|
7
|
+
|
|
8
|
+
* feat!: a state view's row key is module Id ([08c9726](https://github.com/ReventlessDev/reventless-core/commit/08c972659a3d689a39fd5e2f2026597155e92210))
|
|
9
|
+
|
|
10
|
+
### BREAKING CHANGES
|
|
11
|
+
|
|
12
|
+
* a state view spec declares its row key as module Id. A
|
|
13
|
+
hand-written module Key in a spec under StateView/ or StateViewStream/
|
|
14
|
+
fails the build with "A state view's row key is `module Id`, not
|
|
15
|
+
`module Key`".
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# 3.0.0-alpha.292 (2026-10-21)
|
|
20
|
+
|
|
21
|
+
* 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))
|
|
22
|
+
|
|
23
|
+
### BREAKING CHANGES
|
|
24
|
+
|
|
25
|
+
* <Spec>_Behavior.res, @@reventless.behavior,
|
|
26
|
+
Reventless.Behavior.T, StateChangeSlice.Behavior, Behavior_GWT and
|
|
27
|
+
thenRefused no longer exist. Run `npx reventless-rename-to-decision` at an
|
|
28
|
+
app's root, then rebuild; comments are not rewritten. The PPX must be the
|
|
29
|
+
matching release.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
6
33
|
# 3.0.0-alpha.291 (2026-10-19)
|
|
7
34
|
|
|
8
35
|
### 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.293",
|
|
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,24 +34,24 @@
|
|
|
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-effect": "1.0.0-alpha.1",
|
|
38
|
+
"@reventlessdev/rescript-jest": "1.0.0-alpha.13",
|
|
39
|
+
"@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.29",
|
|
39
40
|
"@reventlessdev/rescript-mcp-sdk": "1.0.0-alpha.23",
|
|
40
|
-
"@reventlessdev/rescript-node": "2.0.0-alpha.
|
|
41
|
+
"@reventlessdev/rescript-node": "2.0.0-alpha.23",
|
|
41
42
|
"@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
|
|
42
|
-
"@reventlessdev/
|
|
43
|
-
"@reventlessdev/reventless-graphql-server": "1.0.0-alpha.
|
|
44
|
-
"@reventlessdev/reventless-gwt": "1.0.0-alpha.
|
|
45
|
-
"@reventlessdev/reventless-
|
|
46
|
-
"@reventlessdev/reventless-
|
|
47
|
-
"@reventlessdev/reventless-spec": "3.0.0-alpha.
|
|
48
|
-
"@reventlessdev/reventless-
|
|
49
|
-
"@reventlessdev/reventless-seed": "1.0.0-alpha.34"
|
|
43
|
+
"@reventlessdev/reventless-core": "3.0.0-alpha.302",
|
|
44
|
+
"@reventlessdev/reventless-graphql-server": "1.0.0-alpha.150",
|
|
45
|
+
"@reventlessdev/reventless-gwt": "1.0.0-alpha.250",
|
|
46
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.199",
|
|
47
|
+
"@reventlessdev/reventless-postgres": "3.0.0-alpha.166",
|
|
48
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.171",
|
|
49
|
+
"@reventlessdev/reventless-seed": "1.0.0-alpha.35"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"rescript": "12.3.1",
|
|
53
53
|
"sury-ppx": "11.0.0",
|
|
54
|
-
"@reventlessdev/reventless-ppx": "1.0.0-alpha.
|
|
54
|
+
"@reventlessdev/reventless-ppx": "1.0.0-alpha.104"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"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,24 +655,24 @@ 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
|
};
|
|
675
|
-
let
|
|
675
|
+
let Spec_Id = {
|
|
676
676
|
schema: Id$Reventless.StringPure.schema,
|
|
677
677
|
make: prim => prim,
|
|
678
678
|
makeFromString: prim => prim,
|
|
@@ -683,7 +683,7 @@ function MakeWithConfig(Config) {
|
|
|
683
683
|
name: UiFragments$ReventlessCore.name,
|
|
684
684
|
moduleUrl: UiFragments$ReventlessCore.moduleUrl,
|
|
685
685
|
stateSchema: UiFragments$ReventlessCore.stateSchema,
|
|
686
|
-
|
|
686
|
+
Id: Spec_Id,
|
|
687
687
|
consumedEventSchema: UiFragments$ReventlessCore.consumedEventSchema,
|
|
688
688
|
config: UiFragments$ReventlessCore.config,
|
|
689
689
|
subIdConfig: undefined,
|
|
@@ -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,24 +2416,24 @@ 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
|
};
|
|
2436
|
-
let
|
|
2436
|
+
let Spec_Id = {
|
|
2437
2437
|
schema: Id$Reventless.StringPure.schema,
|
|
2438
2438
|
make: prim => prim,
|
|
2439
2439
|
makeFromString: prim => prim,
|
|
@@ -2444,7 +2444,7 @@ function Make($star) {
|
|
|
2444
2444
|
name: UiFragments$ReventlessCore.name,
|
|
2445
2445
|
moduleUrl: UiFragments$ReventlessCore.moduleUrl,
|
|
2446
2446
|
stateSchema: UiFragments$ReventlessCore.stateSchema,
|
|
2447
|
-
|
|
2447
|
+
Id: Spec_Id,
|
|
2448
2448
|
consumedEventSchema: UiFragments$ReventlessCore.consumedEventSchema,
|
|
2449
2449
|
config: UiFragments$ReventlessCore.config,
|
|
2450
2450
|
subIdConfig: undefined,
|
|
@@ -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
|
|
@@ -62,7 +62,7 @@ module Make = (Bus: LocalBus.T) => {
|
|
|
62
62
|
let handleChannelEvent = (
|
|
63
63
|
handleCmds: ReventlessCore.CommandTopic.jsonCommandsHandler,
|
|
64
64
|
): Pulumi.Output.t<
|
|
65
|
-
ReventlessCore.Runtime.
|
|
65
|
+
ReventlessCore.Runtime.effectInvocationHandler<callbackEvent, 'context, unit, string>,
|
|
66
66
|
> => {
|
|
67
67
|
handleCmdsRef.contents = Some(handleCmds)
|
|
68
68
|
|
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
|
|
@@ -20,7 +20,7 @@ external asUnitHandler: ((JSON.t, unit) => promise<'r>) => (JSON.t, unit) => pro
|
|
|
20
20
|
|
|
21
21
|
let make = (
|
|
22
22
|
~name as _: string,
|
|
23
|
-
~handler: Pulumi.Output.t<ReventlessCore.Runtime.
|
|
23
|
+
~handler: Pulumi.Output.t<ReventlessCore.Runtime.invocationHandler<event, context, 'result>>,
|
|
24
24
|
~memorySize as _=1024,
|
|
25
25
|
~timeout as _=30,
|
|
26
26
|
~opts as _=?,
|
|
@@ -62,6 +62,11 @@ let extractSentTimestamp = (_event: event) => Some(Date.now())
|
|
|
62
62
|
// No redelivery in-process — the bus calls each handler once.
|
|
63
63
|
let extractRetryCount = (_event: event) => Some(1)
|
|
64
64
|
|
|
65
|
-
external asEventHandler: 'a => ReventlessCore.Runtime.
|
|
66
|
-
external asEffectHandler: 'a => ReventlessCore.Runtime.effectHandler<event, context, 'r, 'error> =
|
|
65
|
+
external asEventHandler: 'a => ReventlessCore.Runtime.invocationHandler<event, context, 'r> =
|
|
67
66
|
"%identity"
|
|
67
|
+
external asEffectHandler: 'a => ReventlessCore.Runtime.effectInvocationHandler<
|
|
68
|
+
event,
|
|
69
|
+
context,
|
|
70
|
+
'r,
|
|
71
|
+
'error,
|
|
72
|
+
> = "%identity"
|
|
@@ -17,7 +17,7 @@ let connect: Task_Adapter.connect<bucketParts, runtimeParts> = (
|
|
|
17
17
|
~opts as _,
|
|
18
18
|
) => ()
|
|
19
19
|
|
|
20
|
-
let makeHandler = (callback: Task.bucketCallback): Runtime.
|
|
20
|
+
let makeHandler = (callback: Task.bucketCallback): Runtime.invocationHandler<
|
|
21
21
|
callbackEvent,
|
|
22
22
|
context,
|
|
23
23
|
array<Task.taskAction>,
|
|
@@ -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)
|