@reventlessdev/reventless-aws 3.0.0-alpha.388 → 3.0.0-alpha.390

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.
Files changed (25) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/package.json +7 -7
  3. package/src/Platform.res +1 -1
  4. package/src/Platform.res.mjs +2 -2
  5. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +1 -1
  6. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res +7 -7
  7. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res.mjs +5 -5
  8. package/src/adapter/Runtime/AggregateEntryPoint.mjs +2 -0
  9. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +12 -2
  10. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +12 -2
  11. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +12 -2
  12. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +12 -2
  13. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +12 -2
  14. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +12 -2
  15. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +6 -1
  16. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +6 -1
  17. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +6 -1
  18. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +2 -2
  19. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +6 -1
  20. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +6 -1
  21. package/src/adapter/StateTopic/StateTopic_AppSync.res +1 -1
  22. package/src/components/Api/AppSync_SdlDecorate.res +4 -0
  23. package/src/plugin/runtime/PluginRuntime_Builder.res +3 -3
  24. package/tests/AppSync_SdlDecorateTest.res +14 -0
  25. package/tests/AppSync_SdlDecorateTest.res.mjs +8 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,37 @@
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.390 (2026-10-21)
7
+
8
+ * feat!: a rejected command says whether the model, the access check or the platform said no ([6a8a6b0](https://github.com/ReventlessDev/reventless-core/commit/6a8a6b0f2f31e766ae26a944c23b0904e51a5865))
9
+
10
+ ### BREAKING CHANGES
11
+
12
+ * a type error variant with one of those names fails to
13
+ compile; rename it for what the model means, such as AlreadyBooked. On
14
+ AWS, rebuild every plugin against this release before a client selects
15
+ cause: a plugin built earlier answers it with a non-null error.
16
+
17
+
18
+
19
+ # 3.0.0-alpha.389 (2026-10-21)
20
+
21
+ * feat!: a state view's row key is module Id ([08c9726](https://github.com/ReventlessDev/reventless-core/commit/08c972659a3d689a39fd5e2f2026597155e92210))
22
+ * feat!: a plugin structure's component definitions are read-side and write-side defs ([ea2ab69](https://github.com/ReventlessDev/reventless-core/commit/ea2ab69e928ba16d7e640e4c66ab0e9ba034fe5c))
23
+
24
+ ### BREAKING CHANGES
25
+
26
+ * a state view spec declares its row key as module Id. A
27
+ hand-written module Key in a spec under StateView/ or StateViewStream/
28
+ fails the build with "A state view's row key is `module Id`, not
29
+ `module Key`".
30
+ * Plugin.queryableDef, Plugin.writableDef, their schemas,
31
+ isPublicQueryable and encodeQueryableDef no longer exist; a reader names
32
+ readSideDef, writeSideDef, isPublicReadSide and encodeReadSideDef. There
33
+ are no aliases, so the compiler lists every reader.
34
+
35
+
36
+
6
37
  # 3.0.0-alpha.388 (2026-10-21)
7
38
 
8
39
  * 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))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-aws",
3
- "version": "3.0.0-alpha.388",
3
+ "version": "3.0.0-alpha.390",
4
4
  "description": "AWS adapters for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -25,16 +25,16 @@
25
25
  "@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.33",
26
26
  "@reventlessdev/rescript-effect": "1.0.0-alpha.1",
27
27
  "@reventlessdev/rescript-jest": "1.0.0-alpha.13",
28
- "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.31",
29
28
  "@reventlessdev/rescript-node": "2.0.0-alpha.23",
29
+ "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.31",
30
30
  "@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
31
- "@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
32
- "@reventlessdev/reventless-core": "3.0.0-alpha.301",
33
31
  "@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",
32
+ "@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
36
33
  "@reventlessdev/reventless-interop": "3.0.0-alpha.42",
37
- "@reventlessdev/reventless-spec": "3.0.0-alpha.170"
34
+ "@reventlessdev/reventless-core": "3.0.0-alpha.303",
35
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.200",
36
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.167",
37
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.172"
38
38
  },
39
39
  "devDependencies": {
40
40
  "rescript": "12.3.1",
package/src/Platform.res CHANGED
@@ -964,7 +964,7 @@ module MakeWithConfig = (
964
964
  allQueryDbs->Dict.forEachWithKey((_queryDbOutputs, readModelName) => {
965
965
  if QueryDbStorage_DynamoDbStream.streamRegistry->Set.has(readModelName) {
966
966
  // Channel root MUST equal what the host-shell subscribes to. The
967
- // AutoUI manifest sets queryableDef.queryField = listFieldName
967
+ // AutoUI manifest sets readSideDef.queryField = listFieldName
968
968
  // (plural, e.g. "Catalog_Products") and AutoLive subscribes on that.
969
969
  // Publishing on the singular returnTypeName ("Catalog_Product")
970
970
  // would land descriptors on a channel no client listens to.
@@ -506,7 +506,7 @@ function MakeWithConfig(Config) {
506
506
  name: UiFragments$ReventlessCore.name,
507
507
  moduleUrl: UiFragments$ReventlessCore.moduleUrl,
508
508
  stateSchema: UiFragments$ReventlessCore.stateSchema,
509
- Key: {
509
+ Id: {
510
510
  schema: Id$Reventless.StringPure.schema,
511
511
  make: prim => prim,
512
512
  makeFromString: prim => prim,
@@ -1923,7 +1923,7 @@ function Make($star) {
1923
1923
  name: UiFragments$ReventlessCore.name,
1924
1924
  moduleUrl: UiFragments$ReventlessCore.moduleUrl,
1925
1925
  stateSchema: UiFragments$ReventlessCore.stateSchema,
1926
- Key: {
1926
+ Id: {
1927
1927
  schema: Id$Reventless.StringPure.schema,
1928
1928
  make: prim => prim,
1929
1929
  makeFromString: prim => prim,
@@ -8,7 +8,7 @@
8
8
  // handler wraps each persisted structure with `pluginId` without decoding.
9
9
  // One caveat: the persisted structure is PRE-filter — it still carries Internal
10
10
  // ReadModels / StateViewSlices for developer tooling. The handler re-applies the
11
- // `isPublicQueryable` filter (mirroring `encodePluginStructureEntry`) so Internal
11
+ // `isPublicReadSide` filter (mirroring `encodePluginStructureEntry`) so Internal
12
12
  // components stay out of the deployed AutoUI, matching the in-memory adapter.
13
13
 
14
14
  open PulumiAws
@@ -6,7 +6,7 @@
6
6
  //
7
7
  // Scans the Plugin read model for Connected plugins carrying a `structure`,
8
8
  // collapses to the highest version per plugin name, re-applies the
9
- // `isPublicQueryable` filter (the persisted structure is PRE-filter — it still
9
+ // `isPublicReadSide` filter (the persisted structure is PRE-filter — it still
10
10
  // carries Internal ReadModels / StateViewSlices for developer tooling), and
11
11
  // prepends the built-in Platform_Admin entry. The persisted structure is
12
12
  // sury-encoded with the same shape as the in-memory adapter's
@@ -128,9 +128,9 @@ let healStructure = (structure: dict<JSON.t>): dict<JSON.t> => {
128
128
  out
129
129
  }
130
130
 
131
- // Mirror ReventlessCore.Platform_ComponentDefinitionsApi.isPublicQueryable on
131
+ // Mirror ReventlessCore.Platform_ComponentDefinitionsApi.isPublicReadSide on
132
132
  // the read path: a component is public unless its visibility is "Internal".
133
- let isPublicQueryable = (q: JSON.t): bool =>
133
+ let isPublicReadSide = (q: JSON.t): bool =>
134
134
  switch q
135
135
  ->JSON.Decode.object
136
136
  ->Option.flatMap(o => o->Dict.get("visibility"))
@@ -154,15 +154,15 @@ let filterStructure = (structure: dict<JSON.t>): dict<JSON.t> => {
154
154
  let arrAt = key => out->Dict.get(key)->Option.flatMap(JSON.Decode.array)->Option.getOr([])
155
155
  let readModels = arrAt("readModels")
156
156
  let stateViewSlices = arrAt("stateViewSlices")
157
- out->Dict.set("readModels", readModels->Array.filter(isPublicQueryable)->JSON.Encode.array)
157
+ out->Dict.set("readModels", readModels->Array.filter(isPublicReadSide)->JSON.Encode.array)
158
158
  out->Dict.set(
159
159
  "stateViewSlices",
160
- stateViewSlices->Array.filter(isPublicQueryable)->JSON.Encode.array,
160
+ stateViewSlices->Array.filter(isPublicReadSide)->JSON.Encode.array,
161
161
  )
162
162
  out->Dict.set(
163
163
  "internalQueryables",
164
164
  Array.concat(readModels, stateViewSlices)
165
- ->Array.filter(q => !isPublicQueryable(q))
165
+ ->Array.filter(q => !isPublicReadSide(q))
166
166
  ->JSON.Encode.array,
167
167
  )
168
168
  out
@@ -173,7 +173,7 @@ let filterStructure = (structure: dict<JSON.t>): dict<JSON.t> => {
173
173
  // no decodable structure (former `!item.structure`).
174
174
  //
175
175
  // `~filter` is what separates the two fields this handler serves: AutoUI
176
- // (`Platform_ComponentDefinitions`) gets the public-queryable subset, developer
176
+ // (`Platform_ComponentDefinitions`) gets the public read-side subset, developer
177
177
  // tooling (`Platform_PluginStructures`) gets the structure exactly as persisted,
178
178
  // including Internal components and the producer-side `extensionPoints` that the
179
179
  // AutoUI entry type does not declare. Both are healed first — the SDL's non-null
@@ -182,7 +182,7 @@ function healStructure(structure) {
182
182
  return out;
183
183
  }
184
184
 
185
- function isPublicQueryable(q) {
185
+ function isPublicReadSide(q) {
186
186
  let match = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(q), o => o["visibility"]), Stdlib_JSON.Decode.string);
187
187
  if (match !== undefined) {
188
188
  return match !== "Internal";
@@ -196,9 +196,9 @@ function filterStructure(structure) {
196
196
  let arrAt = key => Stdlib_Option.getOr(Stdlib_Option.flatMap(out[key], Stdlib_JSON.Decode.array), []);
197
197
  let readModels = arrAt("readModels");
198
198
  let stateViewSlices = arrAt("stateViewSlices");
199
- out["readModels"] = readModels.filter(isPublicQueryable);
200
- out["stateViewSlices"] = stateViewSlices.filter(isPublicQueryable);
201
- out["internalQueryables"] = readModels.concat(stateViewSlices).filter(q => !isPublicQueryable(q));
199
+ out["readModels"] = readModels.filter(isPublicReadSide);
200
+ out["stateViewSlices"] = stateViewSlices.filter(isPublicReadSide);
201
+ out["internalQueryables"] = readModels.concat(stateViewSlices).filter(q => !isPublicReadSide(q));
202
202
  return out;
203
203
  }
204
204
 
@@ -644,7 +644,7 @@ export {
644
644
  fillLifecycleField,
645
645
  readSideCollections,
646
646
  healStructure,
647
- isPublicQueryable,
647
+ isPublicReadSide,
648
648
  filterStructure,
649
649
  toEntryWith,
650
650
  adminEntry,
@@ -84,12 +84,14 @@ function extractFieldName(event) {
84
84
  return dot >= 0 ? info.slice(dot + 1) : info;
85
85
  }
86
86
 
87
+ // The plugin, not the model, said no: cause INFRASTRUCTURE.
87
88
  function pluginRejection(msgId, errorCode, detail) {
88
89
  return {
89
90
  __typename: "CommandRejected",
90
91
  msgId,
91
92
  errorCode,
92
93
  errorDetail: detail,
94
+ cause: "INFRASTRUCTURE",
93
95
  };
94
96
  }
95
97
 
@@ -95,7 +95,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
95
95
  }
96
96
 
97
97
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
98
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
98
+ ReventlessCore.Runtime.effectInvocationHandler<
99
+ CommandTopicChannel.callbackEvent,
100
+ context,
101
+ unit,
102
+ string,
103
+ >,
99
104
  runtimeParts,
100
105
  ReventlessCore.CommandTopic.component<'op>,
101
106
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -126,7 +131,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
126
131
  }
127
132
 
128
133
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
129
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
134
+ ReventlessCore.Runtime.effectInvocationHandler<
135
+ EventCollectorChannel.callbackEvent,
136
+ context,
137
+ unit,
138
+ string,
139
+ >,
130
140
  ReventlessCore.EventCollector.component,
131
141
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=2048, ~timeout=180, eventCollector) => {
132
142
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -99,7 +99,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
99
99
  }
100
100
 
101
101
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
102
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
102
+ ReventlessCore.Runtime.effectInvocationHandler<
103
+ CommandTopicChannel.callbackEvent,
104
+ context,
105
+ unit,
106
+ string,
107
+ >,
103
108
  runtimeParts,
104
109
  ReventlessCore.CommandTopic.component<'op>,
105
110
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -132,7 +137,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
132
137
  }
133
138
 
134
139
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
135
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
140
+ ReventlessCore.Runtime.effectInvocationHandler<
141
+ EventCollectorChannel.callbackEvent,
142
+ context,
143
+ unit,
144
+ string,
145
+ >,
136
146
  ReventlessCore.EventCollector.component,
137
147
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=2048, ~timeout=180, eventCollector) => {
138
148
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -80,7 +80,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
80
80
  }
81
81
 
82
82
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
83
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
83
+ ReventlessCore.Runtime.effectInvocationHandler<
84
+ CommandTopicChannel.callbackEvent,
85
+ context,
86
+ unit,
87
+ string,
88
+ >,
84
89
  runtimeParts,
85
90
  ReventlessCore.CommandTopic.component<'op>,
86
91
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -113,7 +118,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
113
118
  }
114
119
 
115
120
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
116
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
121
+ ReventlessCore.Runtime.effectInvocationHandler<
122
+ EventCollectorChannel.callbackEvent,
123
+ context,
124
+ unit,
125
+ string,
126
+ >,
117
127
  ReventlessCore.EventCollector.component,
118
128
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
119
129
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -84,7 +84,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
84
84
  }
85
85
 
86
86
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
87
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
87
+ ReventlessCore.Runtime.effectInvocationHandler<
88
+ CommandTopicChannel.callbackEvent,
89
+ context,
90
+ unit,
91
+ string,
92
+ >,
88
93
  runtimeParts,
89
94
  ReventlessCore.CommandTopic.component<'op>,
90
95
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -117,7 +122,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
117
122
  }
118
123
 
119
124
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
120
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
125
+ ReventlessCore.Runtime.effectInvocationHandler<
126
+ EventCollectorChannel.callbackEvent,
127
+ context,
128
+ unit,
129
+ string,
130
+ >,
121
131
  ReventlessCore.EventCollector.component,
122
132
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
123
133
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -102,7 +102,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
102
102
  }
103
103
 
104
104
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
105
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
105
+ ReventlessCore.Runtime.effectInvocationHandler<
106
+ CommandTopicChannel.callbackEvent,
107
+ context,
108
+ unit,
109
+ string,
110
+ >,
106
111
  runtimeParts,
107
112
  ReventlessCore.CommandTopic.component<'op>,
108
113
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -136,7 +141,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
136
141
  }
137
142
 
138
143
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
139
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
144
+ ReventlessCore.Runtime.effectInvocationHandler<
145
+ EventCollectorChannel.callbackEvent,
146
+ context,
147
+ unit,
148
+ string,
149
+ >,
140
150
  ReventlessCore.EventCollector.component,
141
151
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
142
152
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -91,7 +91,12 @@ let forCommandGenerator: ReventlessCore.Runtime.forComponent<
91
91
  }
92
92
 
93
93
  let forCommandTopic: ReventlessCore.Runtime.forComponent<
94
- ReventlessCore.Runtime.effectHandler<CommandTopicChannel.callbackEvent, context, unit, string>,
94
+ ReventlessCore.Runtime.effectInvocationHandler<
95
+ CommandTopicChannel.callbackEvent,
96
+ context,
97
+ unit,
98
+ string,
99
+ >,
95
100
  runtimeParts,
96
101
  ReventlessCore.CommandTopic.component<'op>,
97
102
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, commandTopic) => {
@@ -125,7 +130,12 @@ let forCommandTopic: ReventlessCore.Runtime.forComponent<
125
130
  }
126
131
 
127
132
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
128
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
133
+ ReventlessCore.Runtime.effectInvocationHandler<
134
+ EventCollectorChannel.callbackEvent,
135
+ context,
136
+ unit,
137
+ string,
138
+ >,
129
139
  ReventlessCore.EventCollector.component,
130
140
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
131
141
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -138,7 +138,12 @@ let storedSpecs: array<storedSpec> = []
138
138
  let grandParent = ref(None)
139
139
 
140
140
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
141
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
141
+ ReventlessCore.Runtime.effectInvocationHandler<
142
+ EventCollectorChannel.callbackEvent,
143
+ context,
144
+ unit,
145
+ string,
146
+ >,
142
147
  ReventlessCore.EventCollector.component,
143
148
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
144
149
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -18,7 +18,12 @@ let registerReadModel = (~readModelName, ~specModulePath, ~mappingsModulePath, ~
18
18
  readModelInfos->Dict.set(readModelName, {specModulePath, mappingsModulePath, queryDbTableName})
19
19
 
20
20
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
21
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
21
+ ReventlessCore.Runtime.effectInvocationHandler<
22
+ EventCollectorChannel.callbackEvent,
23
+ context,
24
+ unit,
25
+ string,
26
+ >,
22
27
  ReventlessCore.EventCollector.component,
23
28
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
24
29
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -66,7 +66,12 @@ let storedSpecs: array<storedSpec> = []
66
66
  let grandParent = ref(None)
67
67
 
68
68
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
69
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
69
+ ReventlessCore.Runtime.effectInvocationHandler<
70
+ EventCollectorChannel.callbackEvent,
71
+ context,
72
+ unit,
73
+ string,
74
+ >,
70
75
  ReventlessCore.EventCollector.component,
71
76
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
72
77
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -447,9 +447,9 @@ let extractRetryCount = (event: event) =>
447
447
  ->Option.flatMap(attrs => attrs.approximateReceiveCount)
448
448
  ->Option.flatMap(Int.fromString(_))
449
449
 
450
- external asEventHandler: 'a => ReventlessCore.Runtime.eventHandler<event, context, 'result> =
450
+ external asEventHandler: 'a => ReventlessCore.Runtime.invocationHandler<event, context, 'result> =
451
451
  "%identity"
452
- external asEffectHandler: 'a => ReventlessCore.Runtime.effectHandler<
452
+ external asEffectHandler: 'a => ReventlessCore.Runtime.effectInvocationHandler<
453
453
  event,
454
454
  context,
455
455
  'result,
@@ -41,7 +41,12 @@ let storedSpecs: array<storedSpec> = []
41
41
  let grandParent = ref(None)
42
42
 
43
43
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
44
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
44
+ ReventlessCore.Runtime.effectInvocationHandler<
45
+ EventCollectorChannel.callbackEvent,
46
+ context,
47
+ unit,
48
+ string,
49
+ >,
45
50
  ReventlessCore.EventCollector.component,
46
51
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
47
52
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -93,7 +93,12 @@ let storedSpecs: array<storedSpec> = []
93
93
  let grandParent = ref(None)
94
94
 
95
95
  let forEventCollector: ReventlessCore.Runtime.forEventCollector<
96
- ReventlessCore.Runtime.effectHandler<EventCollectorChannel.callbackEvent, context, unit, string>,
96
+ ReventlessCore.Runtime.effectInvocationHandler<
97
+ EventCollectorChannel.callbackEvent,
98
+ context,
99
+ unit,
100
+ string,
101
+ >,
97
102
  ReventlessCore.EventCollector.component,
98
103
  > = (~handler as _, ~eventTopics, ~resources, ~memorySize=1024, ~timeout=30, eventCollector) => {
99
104
  let eventCollectorResource = eventCollector->ReventlessCore.Component.toPulumiResource
@@ -10,7 +10,7 @@
10
10
  //
11
11
  // Channel layout: /default/{topicName}/{pathSegment(entityKey)}
12
12
  // topicName = plugin-prefixed query LIST field name (e.g. "Catalog-Products").
13
- // MUST match the AutoUI manifest's queryableDef.queryField,
13
+ // MUST match the AutoUI manifest's readSideDef.queryField,
14
14
  // which the host-shell's AutoLive subscribes on. Using the
15
15
  // singular return type here would orphan the channel.
16
16
  // entityKey = the table's primary-key value(s) extracted from record.Keys.
@@ -524,6 +524,10 @@ let assertGateable = (sdl: string): string => {
524
524
  // Object types the admin source owns canonically. `interface Node` and
525
525
  // `union CommandResult` are handled structurally below (their def lines don't
526
526
  // start with `type `).
527
+ //
528
+ // `enum CommandRejectionCause` is left unstamped, like `SortOrder`: every source
529
+ // emits a byte-identical copy, which the merge unions. Only object types,
530
+ // interfaces and unions were spike-validated with `@canonical`.
527
531
  let canonicalTypeNames = ["PageInfo", "CommandAccepted", "CommandRejected", "CommandPending"]
528
532
 
529
533
  let stampCanonicalTypes = (sdl: string): string =>
@@ -338,7 +338,7 @@ module Make = (
338
338
  }
339
339
 
340
340
  let forPluginEventCollector: ReventlessCore.Runtime.forEventCollector<
341
- ReventlessCore.Runtime.effectHandler<
341
+ ReventlessCore.Runtime.effectInvocationHandler<
342
342
  EventCollectorChannel.callbackEvent,
343
343
  context,
344
344
  unit,
@@ -873,7 +873,7 @@ module Make = (
873
873
  }
874
874
 
875
875
  let forPluginHeartbeat: ReventlessCore.Runtime.forComponent<
876
- ReventlessCore.Runtime.eventHandler<unit, context, unit>,
876
+ ReventlessCore.Runtime.invocationHandler<unit, context, unit>,
877
877
  runtimeParts,
878
878
  ReventlessCore.Heartbeat.component,
879
879
  > = (~handler as _, ~connect, ~memorySize=1024, ~timeout=30, heartbeat) => {
@@ -922,7 +922,7 @@ module Make = (
922
922
  // here). Merges slice module paths: auto-registered (from moduleUrl) + manually
923
923
  // registered (from registerDcbConfig).
924
924
  let forDcbCommandTopic: ReventlessCore.Runtime.forComponent<
925
- ReventlessCore.Runtime.effectHandler<'callbackEvent, context, unit, string>,
925
+ ReventlessCore.Runtime.effectInvocationHandler<'callbackEvent, context, unit, string>,
926
926
  runtimeParts,
927
927
  ReventlessCore.CommandTopic.component<'op>,
928
928
  // `~memorySize`/`~timeout` carry the per-component runtime floor (max across
@@ -151,6 +151,20 @@ describe("AppSync_SdlDecorate.stampCanonicalTypes", () => {
151
151
  expect(sdl->String.includes("type Product @canonical"))->toBe(false)
152
152
  })
153
153
 
154
+ testSync("leaves the rejection-cause enum identical in every source", () => {
155
+ let types = ReventlessCore.GraphQL_FragmentGenerator.commandResultSdlTypes->Array.join("\n\n")
156
+ let stamped =
157
+ types
158
+ ->AppSync_SdlDecorate.stampSharedIamTypes
159
+ ->AppSync_SdlDecorate.stampAllTypesCognito
160
+ ->AppSync_SdlDecorate.stampCanonicalTypes
161
+ expect(stamped)->toContain(
162
+ "enum CommandRejectionCause {\n DOMAIN\n ACCESS\n INFRASTRUCTURE\n}",
163
+ )
164
+ expect(stamped)->toContain("type CommandRejected @aws_cognito_user_pools @aws_iam @canonical {")
165
+ expect(stamped)->toContain(" cause: CommandRejectionCause!")
166
+ })
167
+
154
168
  testSync("is idempotent", () => {
155
169
  let once = AppSync_SdlDecorate.stampCanonicalTypes("type PageInfo {\n x: Int\n}")
156
170
  expect(AppSync_SdlDecorate.stampCanonicalTypes(once))->toBe(once)
@@ -5,6 +5,7 @@ import * as AppSync_Adapter$ReventlessAws from "../src/components/Api/AppSync_Ad
5
5
  import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
6
6
  import * as Platform_AdminApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_AdminApi.res.mjs";
7
7
  import * as AppSync_SdlDecorate$ReventlessAws from "../src/components/Api/AppSync_SdlDecorate.res.mjs";
8
+ import * as GraphQL_FragmentGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_FragmentGenerator.res.mjs";
8
9
 
9
10
  let sources = [
10
11
  {
@@ -127,6 +128,13 @@ globalThis.describe("AppSync_SdlDecorate.stampCanonicalTypes", () => {
127
128
  globalThis.expect(sdl).toContain("type Product {");
128
129
  globalThis.expect(sdl.includes("type Product @canonical")).toBe(false);
129
130
  });
131
+ globalThis.test("leaves the rejection-cause enum identical in every source", () => {
132
+ let types = GraphQL_FragmentGenerator$ReventlessCore.commandResultSdlTypes.join("\n\n");
133
+ let stamped = AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_SdlDecorate$ReventlessAws.stampAllTypesCognito(AppSync_SdlDecorate$ReventlessAws.stampSharedIamTypes(types)));
134
+ globalThis.expect(stamped).toContain("enum CommandRejectionCause {\n DOMAIN\n ACCESS\n INFRASTRUCTURE\n}");
135
+ globalThis.expect(stamped).toContain("type CommandRejected @aws_cognito_user_pools @aws_iam @canonical {");
136
+ globalThis.expect(stamped).toContain(" cause: CommandRejectionCause!");
137
+ });
130
138
  globalThis.test("is idempotent", () => {
131
139
  let once = AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes("type PageInfo {\n x: Int\n}");
132
140
  globalThis.expect(AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(once)).toBe(once);