@reventlessdev/reventless-aws 3.0.0-alpha.386 → 3.0.0-alpha.388
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 +21 -0
- package/README.md +1 -1
- package/package.json +12 -12
- package/scripts/ProvisionIdentity.res +1 -1
- package/src/Platform.res +20 -13
- package/src/Platform.res.mjs +34 -30
- package/src/Platform_Stack.res +3 -3
- package/src/adapter/AWS_Tags.res +1 -1
- package/src/adapter/Auth/Auth_ActiveRolePoolAttachment.res +1 -1
- package/src/adapter/Auth/Auth_ActiveRoleStore_Ops.res +2 -2
- package/src/adapter/Auth/Auth_ActiveRoleStore_Schema.res +1 -1
- package/src/adapter/Auth/Auth_Cognito.res +1 -1
- package/src/adapter/Auth/Auth_LoginIdentifier.res +1 -1
- package/src/adapter/Auth/Auth_SignUpMode.res +1 -1
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +2 -2
- package/src/adapter/EventLog/EventLogBackend.res +1 -1
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +2 -2
- package/src/adapter/Runtime/AggregateEntryPoint.mjs +6 -6
- package/src/adapter/Runtime/AggregateEntryPoint_Ops.res +1 -1
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +8 -8
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +8 -8
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +6 -6
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +6 -6
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +6 -6
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +7 -7
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +6 -6
- package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +1 -1
- package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +2 -2
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs +7 -7
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +7 -7
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res.mjs +2 -2
- package/src/adapter/Runtime/EventCollectorEntryPoint.mjs +1 -1
- package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +2 -2
- package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +2 -2
- package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +10 -10
- package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +3 -3
- package/src/adapter/StateTopic/StateTopic_AppSync.res +1 -1
- package/src/capability/Capability_Messaging.res +2 -2
- package/src/components/Aggregate_Builder_Micro.res +3 -3
- package/src/components/Aggregate_Builder_Micro.res.mjs +3 -3
- package/src/components/Aggregate_Builder_NoResolver.res +3 -3
- package/src/components/Aggregate_Builder_NoResolver.res.mjs +3 -3
- package/src/components/Aggregate_Builder_PerAggregate.res +3 -3
- package/src/components/Aggregate_Builder_PerAggregate.res.mjs +3 -3
- package/src/components/Aggregate_Builder_Single.res +3 -3
- package/src/components/Aggregate_Builder_Single.res.mjs +3 -3
- package/src/components/Aggregate_Builder_Single_Async.res +3 -3
- package/src/components/Aggregate_Builder_Single_Async.res.mjs +3 -3
- package/src/components/Api/AppSync_Adapter.res +3 -3
- package/src/components/Api/AppSync_SdlDecorate.res +3 -3
- package/src/components/SideEffectHandler_PerSideEffectHandler.res +1 -1
- package/src/components/StateChangeSlice_Builder.res +4 -4
- package/src/components/StateChangeSlice_Builder.res.mjs +4 -4
- package/src/plugin/runtime/PluginRuntime_Builder.res +4 -4
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +3 -3
- package/src/plugin/stack/Plugin_Stack.res +1 -1
- package/src/util/Util_Bundle.res +1 -1
- package/src/util/Util_ShellConfig.res +7 -1
- package/src/util/Util_ShellConfig.res.mjs +8 -2
- package/tests/AppSync_AdapterTest.res +1 -1
- package/tests/AppSync_RetirementNarrowingTest.res +1 -1
- package/tests/AppSync_SdlDecorateTest.res +1 -1
- package/tests/Auth_LoginIdentifierTest.res +1 -1
- package/tests/Auth_SignUpModeTest.res +1 -1
- package/tests/BakeConvergenceTest.res +11 -11
- package/tests/BakeConvergenceTest.res.mjs +13 -13
- package/tests/QueryDbResolvers_AppSyncTest.res +1 -1
- package/tests/Upload_ClaimTest.res +1 -1
- package/tests/Util_AwsErrorTest.res +1 -1
- package/tests/Util_ShellConfigTest.res +40 -0
- package/tests/Util_ShellConfigTest.res.mjs +76 -21
- package/tests/Util_StoreLayoutTest.res +1 -1
- package/tests/dcbColdStartPartition.mjs +3 -3
- package/tests/integration/{AggTestAggregateBehavior.res → AggTestAggregateDecision.res} +2 -2
- package/tests/integration/{AggTestAggregateBehavior.res.mjs → AggTestAggregateDecision.res.mjs} +1 -1
- package/tests/integration/AggregateEntryPoint_IntegrationTest.res +3 -3
- package/tests/integration/AggregateEntryPoint_IntegrationTest.res.mjs +2 -2
- package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +5 -5
- package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res.mjs +4 -4
- package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +1 -1
- package/tests/integration/{EpCompositeSliceBehavior.res → EpCompositeSliceDecision.res} +2 -2
- package/tests/integration/{EpCompositeSliceBehavior.res.mjs → EpCompositeSliceDecision.res.mjs} +1 -1
- package/tests/integration/{EpTestSliceBehavior.res → EpTestSliceDecision.res} +2 -2
- package/tests/integration/{EpTestSliceBehavior.res.mjs → EpTestSliceDecision.res.mjs} +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
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.388 (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
|
+
|
|
20
|
+
# 3.0.0-alpha.387 (2026-10-19)
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
* **spec,aws,local:** tell the host shell which environment it runs in, and write local host UI files into a chosen assetsDir ([4f896d1](https://github.com/ReventlessDev/reventless-core/commit/4f896d13ae9ec0d211c33dbd9271e7197cfebc41))
|
|
25
|
+
|
|
26
|
+
|
|
6
27
|
# 3.0.0-alpha.386 (2026-10-17)
|
|
7
28
|
|
|
8
29
|
**Note:** Version bump only for package @reventlessdev/reventless-aws
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ ReScript modules, consumed by adding the package to your `rescript.json` `depend
|
|
|
21
21
|
|
|
22
22
|
- **`Platform`** — the AWS platform functor (`Platform.Make()` / `Platform.MakeWithConfig({...})`).
|
|
23
23
|
Applying it wires up AWS builders once; your plugin functor then takes only the
|
|
24
|
-
application-defined `Spec`, `
|
|
24
|
+
application-defined `Spec`, `Decision`, and `Mappings`.
|
|
25
25
|
- **Component builders** (`Aggregate_Builder`, `ReadModel_Builder`, `Plugin`,
|
|
26
26
|
the slice builders, `Task_Builder`, `Counter_Builder`, `Scheduler`, …) —
|
|
27
27
|
AWS-preconfigured versions of the core hierarchical components, including the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/reventless-aws",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.388",
|
|
4
4
|
"description": "AWS adapters for Reventless",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"bin": {
|
|
@@ -22,19 +22,19 @@
|
|
|
22
22
|
"sury": "11.0.0",
|
|
23
23
|
"uuid": "^13.0.0",
|
|
24
24
|
"yaml": "^2.8.3",
|
|
25
|
-
"@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.
|
|
26
|
-
"@reventlessdev/rescript-effect": "1.0.0-alpha.
|
|
27
|
-
"@reventlessdev/rescript-jest": "1.0.0-alpha.
|
|
28
|
-
"@reventlessdev/rescript-
|
|
29
|
-
"@reventlessdev/rescript-
|
|
25
|
+
"@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.33",
|
|
26
|
+
"@reventlessdev/rescript-effect": "1.0.0-alpha.1",
|
|
27
|
+
"@reventlessdev/rescript-jest": "1.0.0-alpha.13",
|
|
28
|
+
"@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.31",
|
|
29
|
+
"@reventlessdev/rescript-node": "2.0.0-alpha.23",
|
|
30
30
|
"@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
|
|
31
31
|
"@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
|
|
32
|
-
"@reventlessdev/
|
|
33
|
-
"@reventlessdev/
|
|
34
|
-
"@reventlessdev/reventless-infra": "3.0.0-alpha.
|
|
35
|
-
"@reventlessdev/reventless-
|
|
36
|
-
"@reventlessdev/reventless-
|
|
37
|
-
"@reventlessdev/reventless-spec": "3.0.0-alpha.
|
|
32
|
+
"@reventlessdev/reventless-core": "3.0.0-alpha.301",
|
|
33
|
+
"@reventlessdev/rescript-web": "1.0.0-alpha.8",
|
|
34
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.198",
|
|
35
|
+
"@reventlessdev/reventless-postgres": "3.0.0-alpha.165",
|
|
36
|
+
"@reventlessdev/reventless-interop": "3.0.0-alpha.42",
|
|
37
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.170"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"rescript": "12.3.1",
|
|
@@ -10,7 +10,7 @@ outside every stack. That is this.
|
|
|
10
10
|
🚨 **It does not attach a pre-token-generation trigger, and must not.** The pool's
|
|
11
11
|
one trigger slot is the deploy's business: a script that filled it would be the
|
|
12
12
|
hand-run `UpdateUserPool` this whole area refuses, leaving the deployment's
|
|
13
|
-
|
|
13
|
+
behavior depending on an act no source describes.
|
|
14
14
|
|
|
15
15
|
The store's name and key schema come from [Auth_ActiveRoleStore_Schema] rather
|
|
16
16
|
than from constants here. A second copy of either would be one edit away from
|
package/src/Platform.res
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Creates a platform instance with pre-wired AWS builders (DynamoDB, Lambda, SQS, SNS).
|
|
4
4
|
// Config is applied once at platform creation; component Make functors then take only
|
|
5
|
-
// the application-defined arguments (Spec,
|
|
5
|
+
// the application-defined arguments (Spec, Decision, Mappings).
|
|
6
6
|
//
|
|
7
7
|
// Example:
|
|
8
8
|
// module Platform = Platform.Make()
|
|
@@ -593,19 +593,19 @@ module MakeWithConfig = (
|
|
|
593
593
|
// _Micro, _NoResolver) — see docs/plans/Backlog/aws-deployment-strategy.md.
|
|
594
594
|
module Make = (
|
|
595
595
|
Spec: Reventless.Aggregate.Spec,
|
|
596
|
-
|
|
596
|
+
Decision: Reventless.Decision.T with module Spec := Spec,
|
|
597
597
|
EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
|
|
598
598
|
): (
|
|
599
599
|
ReventlessInfra.Aggregate.T with type api = Types.AppSync.api
|
|
600
|
-
) => Aggregate_Builder_Single.Make(Spec,
|
|
600
|
+
) => Aggregate_Builder_Single.Make(Spec, Decision, EventMappings)
|
|
601
601
|
/** Async variant — uses FIFO SQS channel, commands return `CommandPending`. */
|
|
602
602
|
module MakeAsync = (
|
|
603
603
|
Spec: Reventless.Aggregate.Spec,
|
|
604
|
-
|
|
604
|
+
Decision: Reventless.Decision.T with module Spec := Spec,
|
|
605
605
|
EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
|
|
606
606
|
): (
|
|
607
607
|
ReventlessInfra.Aggregate.T with type api = Types.AppSync.api
|
|
608
|
-
) => Aggregate_Builder_Single_Async.Make(Spec,
|
|
608
|
+
) => Aggregate_Builder_Single_Async.Make(Spec, Decision, EventMappings)
|
|
609
609
|
}
|
|
610
610
|
|
|
611
611
|
module ReadModel = {
|
|
@@ -734,16 +734,16 @@ module MakeWithConfig = (
|
|
|
734
734
|
module StateChangeSlice = {
|
|
735
735
|
module Make = (
|
|
736
736
|
Spec: Reventless.StateChangeSlice.Spec,
|
|
737
|
-
|
|
737
|
+
Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
|
|
738
738
|
): (
|
|
739
739
|
ReventlessInfra.StateChangeSlice.T with module Spec = Spec
|
|
740
|
-
) => StateChangeSlice_Builder.Make(Spec,
|
|
740
|
+
) => StateChangeSlice_Builder.Make(Spec, Decision)
|
|
741
741
|
/** Async variant — uses FIFO SQS channel, commands return `CommandPending`. */
|
|
742
742
|
module MakeAsync = (
|
|
743
743
|
Spec: Reventless.StateChangeSlice.Spec,
|
|
744
|
-
|
|
744
|
+
Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
|
|
745
745
|
): (ReventlessInfra.StateChangeSlice.T with module Spec = Spec) => {
|
|
746
|
-
include StateChangeSlice_Builder.Make(Spec,
|
|
746
|
+
include StateChangeSlice_Builder.Make(Spec, Decision)
|
|
747
747
|
let isAsync = true
|
|
748
748
|
}
|
|
749
749
|
}
|
|
@@ -769,7 +769,7 @@ module MakeWithConfig = (
|
|
|
769
769
|
// slice's command handler exactly once).
|
|
770
770
|
module UiFragmentRegistrySlice = StateChangeSlice.Make(
|
|
771
771
|
ReventlessCore.UiFragmentRegistry,
|
|
772
|
-
ReventlessCore.
|
|
772
|
+
ReventlessCore.UiFragmentRegistry_Decision,
|
|
773
773
|
)
|
|
774
774
|
module UiFragmentsViewSlice = StateViewSlice.Make(
|
|
775
775
|
ReventlessCore.UiFragments,
|
|
@@ -1085,7 +1085,7 @@ module MakeWithConfig = (
|
|
|
1085
1085
|
module PluginAggregate: ReventlessInfra.Aggregate.T
|
|
1086
1086
|
with type api = Types.AppSync.api = Aggregate_Builder_Single.Make(
|
|
1087
1087
|
ReventlessCore.PluginSpec,
|
|
1088
|
-
ReventlessCore.
|
|
1088
|
+
ReventlessCore.PluginDecision,
|
|
1089
1089
|
ReventlessInfra.NoEventMappings.Make(ReventlessCore.PluginSpec),
|
|
1090
1090
|
)
|
|
1091
1091
|
|
|
@@ -2355,6 +2355,12 @@ module MakeWithConfig = (
|
|
|
2355
2355
|
// `platformApiEndpoint`, already present) with the store it declares, so there
|
|
2356
2356
|
// is no per-store URL to publish. The store's *serving* base URL still travels
|
|
2357
2357
|
// in the `objectStores` stack output above.
|
|
2358
|
+
// Outside the apply; the same name the deployment record carries.
|
|
2359
|
+
let shellEnvironment = Reventless.ShellEnvironment.resolve(
|
|
2360
|
+
~provenance=Reventless.DeploymentProvenance.current(),
|
|
2361
|
+
~stack=stackName,
|
|
2362
|
+
~prodStacks=Util_HostUiDomain.resolveProdStacks(),
|
|
2363
|
+
)
|
|
2358
2364
|
let configJsonContent =
|
|
2359
2365
|
(
|
|
2360
2366
|
(
|
|
@@ -2407,6 +2413,7 @@ module MakeWithConfig = (
|
|
|
2407
2413
|
// public Function URL and its config key are both gone.
|
|
2408
2414
|
Util_ShellConfig.fields(
|
|
2409
2415
|
~computed=withEvents,
|
|
2416
|
+
~environment=shellEnvironment,
|
|
2410
2417
|
~viewModes=?cfg.viewModes,
|
|
2411
2418
|
~bakedManifest=?cfg.bakedManifest,
|
|
2412
2419
|
~uiSlotsFile=?cfg.uiSlotsFile,
|
|
@@ -2697,7 +2704,7 @@ module MakeWithConfig = (
|
|
|
2697
2704
|
//
|
|
2698
2705
|
// A platform that provisioned no geocoder yields "", and the plugin's client
|
|
2699
2706
|
// reports `Unavailable` — retried, then surfaced by the heartbeat sweep. That
|
|
2700
|
-
// is a
|
|
2707
|
+
// is a modeled outcome, which is the point of the empty string: a plugin
|
|
2701
2708
|
// deployed against a platform without the capability degrades rather than
|
|
2702
2709
|
// failing to deploy.
|
|
2703
2710
|
// The place index, not the Function URL. A slice's Lambda reaches Amazon
|
|
@@ -2900,7 +2907,7 @@ module MakeWithConfig = (
|
|
|
2900
2907
|
// why a *declared* need fails the deploy.
|
|
2901
2908
|
//
|
|
2902
2909
|
// Only a declared need. A plugin that says nothing still degrades
|
|
2903
|
-
// exactly as before: the empty endpoint is a
|
|
2910
|
+
// exactly as before: the empty endpoint is a modeled outcome for a
|
|
2904
2911
|
// deployment that simply has no geocoder, and failing those would break
|
|
2905
2912
|
// deployments that work.
|
|
2906
2913
|
switch Reventless.CapabilityNeed.unmet(
|
package/src/Platform.res.mjs
CHANGED
|
@@ -35,6 +35,7 @@ import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs
|
|
|
35
35
|
import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateView/UiFragments.res.mjs";
|
|
36
36
|
import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
|
|
37
37
|
import * as AccountsManifest$Reventless from "@reventlessdev/reventless-spec/src/types/AccountsManifest.res.mjs";
|
|
38
|
+
import * as ShellEnvironment$Reventless from "@reventlessdev/reventless-spec/src/types/ShellEnvironment.res.mjs";
|
|
38
39
|
import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
|
|
39
40
|
import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
|
|
40
41
|
import * as QueryDbBackend$ReventlessAws from "./adapter/QueryDb/QueryDbBackend.res.mjs";
|
|
@@ -42,7 +43,7 @@ import * as AppSync_Adapter$ReventlessAws from "./components/Api/AppSync_Adapter
|
|
|
42
43
|
import * as Counter_Builder$ReventlessAws from "./components/Counter_Builder.res.mjs";
|
|
43
44
|
import * as EventLogBackend$ReventlessAws from "./adapter/EventLog/EventLogBackend.res.mjs";
|
|
44
45
|
import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
|
|
45
|
-
import * as
|
|
46
|
+
import * as PluginDecision$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginDecision.res.mjs";
|
|
46
47
|
import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
|
|
47
48
|
import * as Upload_Claim_S3$ReventlessAws from "./adapter/Upload/Upload_Claim_S3.res.mjs";
|
|
48
49
|
import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjectionFeed.res.mjs";
|
|
@@ -52,6 +53,7 @@ import * as Util_StoreLayout$ReventlessAws from "./util/Util_StoreLayout.res.mjs
|
|
|
52
53
|
import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
|
|
53
54
|
import * as AppSync_EventsApi$ReventlessAws from "./adapter/Api/AppSync_EventsApi.res.mjs";
|
|
54
55
|
import * as AppSync_MergedApi$ReventlessAws from "./components/Api/AppSync_MergedApi.res.mjs";
|
|
56
|
+
import * as DeploymentProvenance$Reventless from "@reventlessdev/reventless-spec/src/types/DeploymentProvenance.res.mjs";
|
|
55
57
|
import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
|
|
56
58
|
import * as NoEventMappings$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/NoEventMappings.res.mjs";
|
|
57
59
|
import * as Platform_UiSlots$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_UiSlots.res.mjs";
|
|
@@ -93,7 +95,7 @@ import * as PluginExtensionPointSpec$ReventlessInfra from "@reventlessdev/revent
|
|
|
93
95
|
import * as Platform_UIFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_UIFragments_Lambda.res.mjs";
|
|
94
96
|
import * as CommandTopicChannel_SQS_Sync$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs";
|
|
95
97
|
import * as EventLogSubscription_AppSync$ReventlessAws from "./adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs";
|
|
96
|
-
import * as
|
|
98
|
+
import * as UiFragmentRegistry_Decision$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Decision.res.mjs";
|
|
97
99
|
import * as CommandTopicChannel_SQS_Async$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
|
|
98
100
|
import * as Geocoder_AwsLocation_Resolver$ReventlessAws from "./adapter/Geocoder/Geocoder_AwsLocation_Resolver.res.mjs";
|
|
99
101
|
import * as Plugin_ExtensionPoint_Builder$ReventlessAws from "./plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs";
|
|
@@ -381,8 +383,8 @@ function MakeWithConfig(Config) {
|
|
|
381
383
|
api: resolveTargetApi,
|
|
382
384
|
apiRole: resolveTargetApiRole
|
|
383
385
|
};
|
|
384
|
-
let Make = Spec => (
|
|
385
|
-
let MakeAsync = Spec => (
|
|
386
|
+
let Make = Spec => (Decision => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
|
|
387
|
+
let MakeAsync = Spec => (Decision => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
|
|
386
388
|
let Aggregate = {
|
|
387
389
|
Make: Make,
|
|
388
390
|
MakeAsync: MakeAsync
|
|
@@ -462,12 +464,12 @@ function MakeWithConfig(Config) {
|
|
|
462
464
|
Make: Make$5
|
|
463
465
|
};
|
|
464
466
|
let Counter = Counter_Builder$ReventlessAws.Make(ApiConfig);
|
|
465
|
-
let Make$6 = Spec => (
|
|
466
|
-
let MakeAsync$1 = Spec => (
|
|
467
|
-
let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(
|
|
467
|
+
let Make$6 = Spec => (Decision => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision));
|
|
468
|
+
let MakeAsync$1 = Spec => (Decision => {
|
|
469
|
+
let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision);
|
|
468
470
|
return {
|
|
469
471
|
Spec: include.Spec,
|
|
470
|
-
|
|
472
|
+
Decision: include.Decision,
|
|
471
473
|
isAsync: true,
|
|
472
474
|
make: include.make
|
|
473
475
|
};
|
|
@@ -496,9 +498,9 @@ function MakeWithConfig(Config) {
|
|
|
496
498
|
};
|
|
497
499
|
let UiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec)({
|
|
498
500
|
initialState: undefined,
|
|
499
|
-
evolve:
|
|
500
|
-
decide:
|
|
501
|
-
moduleUrl:
|
|
501
|
+
evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
|
|
502
|
+
decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
|
|
503
|
+
moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
|
|
502
504
|
});
|
|
503
505
|
let UiFragmentsViewSlice = Make$7({
|
|
504
506
|
name: UiFragments$ReventlessCore.name,
|
|
@@ -690,11 +692,11 @@ function MakeWithConfig(Config) {
|
|
|
690
692
|
commandTransition: PluginSpec$ReventlessCore.commandTransition,
|
|
691
693
|
traits: PluginSpec$ReventlessCore.traits
|
|
692
694
|
})({
|
|
693
|
-
initialState:
|
|
694
|
-
evolve:
|
|
695
|
-
decide:
|
|
695
|
+
initialState: PluginDecision$ReventlessCore.initialState,
|
|
696
|
+
evolve: PluginDecision$ReventlessCore.evolve,
|
|
697
|
+
decide: PluginDecision$ReventlessCore.decide,
|
|
696
698
|
snapshot: undefined,
|
|
697
|
-
moduleUrl:
|
|
699
|
+
moduleUrl: PluginDecision$ReventlessCore.moduleUrl
|
|
698
700
|
})(NoEventMappings$ReventlessInfra.Make({
|
|
699
701
|
name: PluginSpec$ReventlessCore.name,
|
|
700
702
|
Id: Id$Reventless.$$String,
|
|
@@ -1235,6 +1237,7 @@ function MakeWithConfig(Config) {
|
|
|
1235
1237
|
if (capabilities.includes("Messaging") && !emailSenderProvisioned) {
|
|
1236
1238
|
Stdlib_JsError.throwWithMessage(`A plugin of this deployment declares the Messaging capability, but this platform provisions no email sender.\n The sender is configuration and has no default: set \`platform:messagingEmailSender\` in Pulumi.<stack>.yaml (or the env var REVENTLESS_MESSAGING_EMAIL_SENDER), then verify the address with SES.\n A stack that should not mail anybody sets \`platform:messagingEmailProvider: log\` instead — every message is logged and none is sent, and the address is optional.\n The root must also pass \`~messagingSender\` in \`~hostUiBundle\`, from \`ReventlessAws.Capability_Messaging.make(~name=…)\`.\n The declaration is generated from the plugins' capabilities.json — regenerate with \`pnpm run generate:platform\` if it is stale.`);
|
|
1237
1239
|
}
|
|
1240
|
+
let shellEnvironment = ShellEnvironment$Reventless.resolve(DeploymentProvenance$Reventless.current(), stackName, Util_HostUiDomain$ReventlessAws.resolveProdStacks());
|
|
1238
1241
|
let configJsonContent = Pulumi.all([
|
|
1239
1242
|
Pulumi.all([
|
|
1240
1243
|
resolvedDomainApiEndpoint,
|
|
@@ -1286,7 +1289,7 @@ function MakeWithConfig(Config) {
|
|
|
1286
1289
|
AppSync_EventsApi$ReventlessAws.clientNamespaceName
|
|
1287
1290
|
]
|
|
1288
1291
|
]) : computed;
|
|
1289
|
-
return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
|
|
1292
|
+
return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, shellEnvironment, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
|
|
1290
1293
|
});
|
|
1291
1294
|
let bootFileCacheControl = "no-cache";
|
|
1292
1295
|
new (Aws.s3.BucketObject)("host-ui-config-json", {
|
|
@@ -1797,8 +1800,8 @@ function Make($star) {
|
|
|
1797
1800
|
api: resolveTargetApi,
|
|
1798
1801
|
apiRole: resolveTargetApiRole
|
|
1799
1802
|
};
|
|
1800
|
-
let Make$1 = Spec => (
|
|
1801
|
-
let MakeAsync = Spec => (
|
|
1803
|
+
let Make$1 = Spec => (Decision => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
|
|
1804
|
+
let MakeAsync = Spec => (Decision => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
|
|
1802
1805
|
let Aggregate = {
|
|
1803
1806
|
Make: Make$1,
|
|
1804
1807
|
MakeAsync: MakeAsync
|
|
@@ -1878,12 +1881,12 @@ function Make($star) {
|
|
|
1878
1881
|
Make: Make$6
|
|
1879
1882
|
};
|
|
1880
1883
|
let Counter = Counter_Builder$ReventlessAws.Make(ApiConfig);
|
|
1881
|
-
let Make$7 = Spec => (
|
|
1882
|
-
let MakeAsync$1 = Spec => (
|
|
1883
|
-
let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(
|
|
1884
|
+
let Make$7 = Spec => (Decision => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision));
|
|
1885
|
+
let MakeAsync$1 = Spec => (Decision => {
|
|
1886
|
+
let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision);
|
|
1884
1887
|
return {
|
|
1885
1888
|
Spec: include.Spec,
|
|
1886
|
-
|
|
1889
|
+
Decision: include.Decision,
|
|
1887
1890
|
isAsync: true,
|
|
1888
1891
|
make: include.make
|
|
1889
1892
|
};
|
|
@@ -1912,9 +1915,9 @@ function Make($star) {
|
|
|
1912
1915
|
};
|
|
1913
1916
|
let UiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec)({
|
|
1914
1917
|
initialState: undefined,
|
|
1915
|
-
evolve:
|
|
1916
|
-
decide:
|
|
1917
|
-
moduleUrl:
|
|
1918
|
+
evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
|
|
1919
|
+
decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
|
|
1920
|
+
moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
|
|
1918
1921
|
});
|
|
1919
1922
|
let UiFragmentsViewSlice = Make$8({
|
|
1920
1923
|
name: UiFragments$ReventlessCore.name,
|
|
@@ -2106,11 +2109,11 @@ function Make($star) {
|
|
|
2106
2109
|
commandTransition: PluginSpec$ReventlessCore.commandTransition,
|
|
2107
2110
|
traits: PluginSpec$ReventlessCore.traits
|
|
2108
2111
|
})({
|
|
2109
|
-
initialState:
|
|
2110
|
-
evolve:
|
|
2111
|
-
decide:
|
|
2112
|
+
initialState: PluginDecision$ReventlessCore.initialState,
|
|
2113
|
+
evolve: PluginDecision$ReventlessCore.evolve,
|
|
2114
|
+
decide: PluginDecision$ReventlessCore.decide,
|
|
2112
2115
|
snapshot: undefined,
|
|
2113
|
-
moduleUrl:
|
|
2116
|
+
moduleUrl: PluginDecision$ReventlessCore.moduleUrl
|
|
2114
2117
|
})(NoEventMappings$ReventlessInfra.Make({
|
|
2115
2118
|
name: PluginSpec$ReventlessCore.name,
|
|
2116
2119
|
Id: Id$Reventless.$$String,
|
|
@@ -2628,6 +2631,7 @@ function Make($star) {
|
|
|
2628
2631
|
if (capabilities.includes("Messaging") && !emailSenderProvisioned) {
|
|
2629
2632
|
Stdlib_JsError.throwWithMessage(`A plugin of this deployment declares the Messaging capability, but this platform provisions no email sender.\n The sender is configuration and has no default: set \`platform:messagingEmailSender\` in Pulumi.<stack>.yaml (or the env var REVENTLESS_MESSAGING_EMAIL_SENDER), then verify the address with SES.\n A stack that should not mail anybody sets \`platform:messagingEmailProvider: log\` instead — every message is logged and none is sent, and the address is optional.\n The root must also pass \`~messagingSender\` in \`~hostUiBundle\`, from \`ReventlessAws.Capability_Messaging.make(~name=…)\`.\n The declaration is generated from the plugins' capabilities.json — regenerate with \`pnpm run generate:platform\` if it is stale.`);
|
|
2630
2633
|
}
|
|
2634
|
+
let shellEnvironment = ShellEnvironment$Reventless.resolve(DeploymentProvenance$Reventless.current(), stackName, Util_HostUiDomain$ReventlessAws.resolveProdStacks());
|
|
2631
2635
|
let configJsonContent = Pulumi.all([
|
|
2632
2636
|
Pulumi.all([
|
|
2633
2637
|
resolvedDomainApiEndpoint,
|
|
@@ -2679,7 +2683,7 @@ function Make($star) {
|
|
|
2679
2683
|
AppSync_EventsApi$ReventlessAws.clientNamespaceName
|
|
2680
2684
|
]
|
|
2681
2685
|
]) : computed;
|
|
2682
|
-
return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
|
|
2686
|
+
return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, shellEnvironment, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
|
|
2683
2687
|
});
|
|
2684
2688
|
let bootFileCacheControl = "no-cache";
|
|
2685
2689
|
new (Aws.s3.BucketObject)("host-ui-config-json", {
|
package/src/Platform_Stack.res
CHANGED
|
@@ -110,7 +110,7 @@ let _identityProviderId = (~cfg: Pulumi.Config.t): option<string> => {
|
|
|
110
110
|
`platform:loginIdentifier` (or `REVENTLESS_LOGIN_IDENTIFIER` / the sidecar).
|
|
111
111
|
|
|
112
112
|
Absent means `email`, which is what every pool so far was created with. An
|
|
113
|
-
|
|
113
|
+
unrecognized spelling fails the deploy — see [Auth_LoginIdentifier] for why
|
|
114
114
|
defaulting past a typo here is unrecoverable. */
|
|
115
115
|
let _loginIdentifier = (~cfg: Pulumi.Config.t): Auth_LoginIdentifier.t => {
|
|
116
116
|
let raw = switch Util_LocalConfig.get("loginIdentifier") {
|
|
@@ -128,7 +128,7 @@ let _loginIdentifier = (~cfg: Pulumi.Config.t): Auth_LoginIdentifier.t => {
|
|
|
128
128
|
|
|
129
129
|
Absent means `adminOnly`, which is what every pool so far was created with, so
|
|
130
130
|
an existing stack redeploys unchanged. Unlike the sign-in attribute this is an
|
|
131
|
-
ordinary in-place update on a live pool — but an
|
|
131
|
+
ordinary in-place update on a live pool — but an unrecognized spelling still
|
|
132
132
|
fails the deploy, because defaulting past it would refuse every registration
|
|
133
133
|
while the config read as if it allowed them. See [Auth_SignUpMode]. */
|
|
134
134
|
let _signUpMode = (~cfg: Pulumi.Config.t): Auth_SignUpMode.t => {
|
|
@@ -215,7 +215,7 @@ let _resolveUncached = (): cognitoUserPool => {
|
|
|
215
215
|
// separate attachment resource — so the trigger is attached by a declared
|
|
216
216
|
// resource that describes the pool, merges into what it finds, and sends the
|
|
217
217
|
// result back whole. Never a hand-run command: that would leave the
|
|
218
|
-
// deployment's
|
|
218
|
+
// deployment's behavior depending on an act no source describes.
|
|
219
219
|
// The code hash is an input so a new build of the trigger reaches this
|
|
220
220
|
// resource: the function ARN is stable, so it alone would let a broken
|
|
221
221
|
// version onto the pool unchecked after the first deploy.
|
package/src/adapter/AWS_Tags.res
CHANGED
|
@@ -14,7 +14,7 @@ dimension; the bare spelling bought nothing.
|
|
|
14
14
|
The three attribution facts are independent and all three are needed to identify
|
|
15
15
|
a resource (see `ResourceAttribution`):
|
|
16
16
|
|
|
17
|
-
- `~kind` — the
|
|
17
|
+
- `~kind` — the modeling kind of the owning component (Aggregate, …)
|
|
18
18
|
- `~role` — the deployment piece this resource implements (EventLog, Runtime, …)
|
|
19
19
|
- `~scope` — component / plugin / platform
|
|
20
20
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
attachment resource, so something has to call `UpdateUserPool` against a pool
|
|
15
15
|
no stack owns. That belongs in a declared resource executed at deploy time,
|
|
16
16
|
never a hand-run command against a live pool, which would leave the
|
|
17
|
-
deployment's
|
|
17
|
+
deployment's behavior depending on an act no source describes.
|
|
18
18
|
|
|
19
19
|
🚨 **The slot is the pool's, and this resource takes it only when it is
|
|
20
20
|
free or already ours.** Cognito allows a pool exactly one
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// the pre-token-generation trigger ([Auth_ActiveRoleTrigger_Ops.res]) reads this
|
|
9
9
|
// row on the next refresh and narrows the group claim to it. Nothing here can
|
|
10
10
|
// grant anything: the trigger re-checks the stored role against real membership
|
|
11
|
-
// before applying it, so a row is at most a request that the trigger may
|
|
11
|
+
// before applying it, so a row is at most a request that the trigger may honor.
|
|
12
12
|
//
|
|
13
13
|
// 🚨 **The subject is taken from the verified identity, never from the arguments.**
|
|
14
14
|
// The row key is `ctx.identity.sub` as the AppSync Cognito authorizer resolved it.
|
|
@@ -115,7 +115,7 @@ type appSyncEvent = {
|
|
|
115
115
|
The name to address this caller by when asking Cognito what groups they are in.
|
|
116
116
|
|
|
117
117
|
The username when the authorizer supplied one, the subject otherwise. The
|
|
118
|
-
fallback is not a guess at a username: it is the
|
|
118
|
+
fallback is not a guess at a username: it is the behavior this handler had
|
|
119
119
|
before the username was forwarded, kept for the pool shapes where it is correct —
|
|
120
120
|
one whose username *is* the subject — rather than turning a working deployment
|
|
121
121
|
into a hard failure on an absent field. Pure so the choice can be tested without
|
|
@@ -74,7 +74,7 @@ repaired for. So adoption checks the schema and refuses, rather than reporting
|
|
|
74
74
|
success.
|
|
75
75
|
|
|
76
76
|
The pre-`clientId` store is exactly this case: keyed on the subject alone. An
|
|
77
|
-
operator upgrading meets a sentence instead of a silent
|
|
77
|
+
operator upgrading meets a sentence instead of a silent misbehavior.
|
|
78
78
|
|
|
79
79
|
Order-insensitive, because `DescribeTable` does not promise one.
|
|
80
80
|
*/
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
//
|
|
12
12
|
// * `fromAppSyncIdentity` — AppSync-resolver path. Reads the
|
|
13
13
|
// already-validated identity context attached by AppSync to the
|
|
14
|
-
// resolver event (`event.identity`).
|
|
14
|
+
// resolver event (`event.identity`). Recognizes both the Cognito
|
|
15
15
|
// UserPool shape (`sub`, `username`, `claims['cognito:groups']`) and
|
|
16
16
|
// the AWS_IAM additional-provider shape (`userArn`, `accountId`) used
|
|
17
17
|
// by server-to-server lambdas signed via the existing IAM role.
|
|
@@ -44,7 +44,7 @@ let usernameAttributes = (identifier: t): array<string> =>
|
|
|
44
44
|
/**
|
|
45
45
|
The deploy-time choice, or why the deploy cannot proceed.
|
|
46
46
|
|
|
47
|
-
An
|
|
47
|
+
An unrecognized spelling refuses rather than falling back to the default: a typo
|
|
48
48
|
that defaulted would create a pool signing in on the wrong attribute, which is
|
|
49
49
|
the one property no later deploy can correct.
|
|
50
50
|
*/
|
|
@@ -53,7 +53,7 @@ let allowAdminCreateUserOnly = (mode: t): bool =>
|
|
|
53
53
|
/**
|
|
54
54
|
The deploy-time choice, or why the deploy cannot proceed.
|
|
55
55
|
|
|
56
|
-
An
|
|
56
|
+
An unrecognized spelling refuses rather than falling back to the default, and the
|
|
57
57
|
reason is *not* [Auth_LoginIdentifier]'s — this setting is correctable at any
|
|
58
58
|
time. It is that the mistake would be silent. The default is closed, so a typo
|
|
59
59
|
fails safe, but it fails safe *invisibly*: the deploy is green, the config says
|
|
@@ -138,7 +138,7 @@ let toItem = (
|
|
|
138
138
|
item->Dict.set("tags", tagsJson->JSON.Encode.array)
|
|
139
139
|
|
|
140
140
|
// Flatten meta.* to top-level item attributes so individual meta keys stay
|
|
141
|
-
// GSI-projectable (matches the EventLog adapter
|
|
141
|
+
// GSI-projectable (matches the EventLog adapter behavior). The DCB read
|
|
142
142
|
// path reassembles meta via `Reventless.Message.composeMeta`.
|
|
143
143
|
event.meta
|
|
144
144
|
->ReventlessCore.Message.decomposeMeta
|
|
@@ -986,7 +986,7 @@ let appendUnconditional = async (
|
|
|
986
986
|
// The synthetic fence tag is keyed on `getCompositePartitionKeyValue` — the same
|
|
987
987
|
// value `derivePartitionKey` uses for the base-table `id` — so it is exactly as
|
|
988
988
|
// selective as the entity's storage partition (and the `tag_composite` read
|
|
989
|
-
// scope). Fencing per-member (the historical
|
|
989
|
+
// scope). Fencing per-member (the historical behavior) gave every low-cardinality
|
|
990
990
|
// member (e.g. `environment`, `platformName`) its own fence, which a deploy-time
|
|
991
991
|
// fan-out sharing those prefixes turns into a hot partition → `TransactionConflict`
|
|
992
992
|
// → `retries exhausted`; it also over-fenced (two DISTINCT composite entities
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// its plugin's EventCollector SQS queue.
|
|
15
15
|
//
|
|
16
16
|
// All classic EventLogs in the platform share one selection, mirroring the DCB
|
|
17
|
-
// toggle. Only the Single (sync/async) aggregate strategies
|
|
17
|
+
// toggle. Only the Single (sync/async) aggregate strategies honor it; the
|
|
18
18
|
// PerAggregate and Micro strategies stay DynamoDB-only.
|
|
19
19
|
|
|
20
20
|
type selection = {
|
|
@@ -143,7 +143,7 @@ let emptyConnection = (): JSON.t =>
|
|
|
143
143
|
|
|
144
144
|
// Spec-level authorization then the (optional) user interceptor — mirrors
|
|
145
145
|
// QueryDbResolvers_GraphQL.runInterceptor. Denials return the kind's empty shape
|
|
146
|
-
// (the provider-agnostic resolver
|
|
146
|
+
// (the provider-agnostic resolver behavior), not an error.
|
|
147
147
|
let runInterceptor = async (
|
|
148
148
|
~binding,
|
|
149
149
|
~payload,
|
|
@@ -192,7 +192,7 @@ let dispatch = async (
|
|
|
192
192
|
| RefuseOwned => false
|
|
193
193
|
| ScopeTo(field, required) => item->argStr(field)->Option.mapOr(false, v => v == required)
|
|
194
194
|
}
|
|
195
|
-
// The caller's request to see the archive,
|
|
195
|
+
// The caller's request to see the archive, honored only where the
|
|
196
196
|
// classification says it counts.
|
|
197
197
|
let askedForRetired =
|
|
198
198
|
payload.arguments
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Aggregate Lambda entry point.
|
|
2
|
-
// At cold start: reads HANDLER_CONFIG, dynamically imports Spec+
|
|
2
|
+
// At cold start: reads HANDLER_CONFIG, dynamically imports Spec+Decision modules,
|
|
3
3
|
// wires EventLog_Operations, Aggregate_Callback, CommandTopic_Callback.
|
|
4
4
|
// Handles both SQS CommandTopic events (Route 2) and AppSync direct invocation (Route 1).
|
|
5
5
|
|
|
@@ -135,7 +135,7 @@ async function checkPluginStatus(event) {
|
|
|
135
135
|
// Postgres EventLog runtime; absence keeps the DynamoDB path byte-identical.
|
|
136
136
|
// `eventLogTableName` doubles as the Postgres `event_log.log_name` discriminator
|
|
137
137
|
// (all aggregates share one Postgres table, unlike DynamoDB's table-per-aggregate).
|
|
138
|
-
function buildAggregateParts(specModule,
|
|
138
|
+
function buildAggregateParts(specModule, decisionModule, eventLogTableName, queueUrl, pgConnection) {
|
|
139
139
|
const patchedSpec = patchSpecId(specModule);
|
|
140
140
|
// Typed core: backend-specific EventLog storage ops (Postgres when pgConnection
|
|
141
141
|
// is present, else DynamoDB). Returns the full 6-field EventLog_Adapter.operations
|
|
@@ -147,7 +147,7 @@ function buildAggregateParts(specModule, behaviorModule, eventLogTableName, queu
|
|
|
147
147
|
eventTopic: { publish: async () => {} },
|
|
148
148
|
storage: rawStorageOps,
|
|
149
149
|
});
|
|
150
|
-
const aggregateCallback = aggregateCallbackMake(patchedSpec)(
|
|
150
|
+
const aggregateCallback = aggregateCallbackMake(patchedSpec)(decisionModule)({
|
|
151
151
|
Spec: patchedSpec,
|
|
152
152
|
EventLog: { Spec: patchedSpec },
|
|
153
153
|
eventLog: eventLogOps,
|
|
@@ -227,7 +227,7 @@ const DISPATCH_MODE = process.env["DISPATCH_MODE"] === "async" ? "async" : "sync
|
|
|
227
227
|
// already-parsed `HANDLER_CONFIG` shape, with an injectable module loader. In
|
|
228
228
|
// production, `buildAllHandlers` wraps this with the env config + the Lambda's
|
|
229
229
|
// `/var/task/node_modules` dynamic import; the integration test injects a loader
|
|
230
|
-
// returning pre-imported spec/
|
|
230
|
+
// returning pre-imported spec/decision modules so it can drive the real
|
|
231
231
|
// cmdGenHandler end-to-end against DynamoDB Local. (Mirrors the DCB entry point.)
|
|
232
232
|
export async function buildHandlersForConfig(config, opts = {}) {
|
|
233
233
|
const loadModule = opts.loadModule ?? dynamicImport;
|
|
@@ -236,8 +236,8 @@ export async function buildHandlersForConfig(config, opts = {}) {
|
|
|
236
236
|
const cmdGenHandlers = {};
|
|
237
237
|
await Promise.all((config.handlers || []).map(async h => {
|
|
238
238
|
const specModule = await loadModule(h.specModule);
|
|
239
|
-
const
|
|
240
|
-
const parts = buildAggregateParts(specModule,
|
|
239
|
+
const decisionModule = await loadModule(h.decisionModule);
|
|
240
|
+
const parts = buildAggregateParts(specModule, decisionModule, h.eventLogTable, h.queueUrl, h.pgConnection);
|
|
241
241
|
// Pair each handler with the comp of the aggregate it belongs to: this
|
|
242
242
|
// Lambda can host every aggregate in the platform, so the comp is what keeps
|
|
243
243
|
// their log lines separable.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// The "typed core, thin shell" split (docs/plans/done/minimize-lambda-entrypoint-mjs-shell.md).
|
|
4
4
|
// The `.mjs` shell owns the untyped seams — reading `HANDLER_CONFIG`, the dynamic
|
|
5
|
-
// `import()` of user Spec/
|
|
5
|
+
// `import()` of user Spec/Decision modules, and the functor wiring that consumes
|
|
6
6
|
// those runtime-loaded modules (`EventLog_Operations.Make`, `Aggregate_Callback.Make`,
|
|
7
7
|
// `CommandTopic_Callback.Make`). This module owns the one piece that is pure
|
|
8
8
|
// typed framework wiring: selecting and building the EventLog storage operations.
|