@reventlessdev/reventless-aws 3.0.0-alpha.198 → 3.0.0-alpha.200

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 CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.200 (2026-07-12)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **admin:** fix admin-DCB-on-AWS deploy — Output-in-option corruption + orphan resolvers ([edde07d](https://github.com/ReventlessDev/reventless-core/commit/edde07d1d7a89a47a7496d46fbf83fbadffa74a9))
11
+
12
+
13
+ # 3.0.0-alpha.199 (2026-07-12)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **deploy:** gate admin status-query resolvers on the schema push ([2634694](https://github.com/ReventlessDev/reventless-core/commit/2634694b3a122bc1db44d129769f5442e124d9b7))
18
+
19
+
6
20
  # 3.0.0-alpha.198 (2026-07-12)
7
21
 
8
22
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-aws",
3
- "version": "3.0.0-alpha.198",
3
+ "version": "3.0.0-alpha.200",
4
4
  "description": "AWS adapters for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "dependencies": {
@@ -9,16 +9,16 @@
9
9
  "sury": "11.0.0-alpha.4",
10
10
  "uuid": "^13.0.0",
11
11
  "@reventlessdev/rescript-aws-sdk": "2.2.0-alpha.21",
12
+ "@reventlessdev/rescript-effect": "0.1.0-alpha.27",
12
13
  "@reventlessdev/rescript-pulumi-aws": "2.4.0-alpha.50",
13
- "@reventlessdev/rescript-jest": "1.0.0-alpha.7",
14
14
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.15",
15
- "@reventlessdev/rescript-effect": "0.1.0-alpha.27",
16
- "@reventlessdev/reventless-core": "3.0.0-alpha.157",
15
+ "@reventlessdev/rescript-jest": "1.0.0-alpha.7",
17
16
  "@reventlessdev/rescript-uuid": "1.1.0-alpha.15",
17
+ "@reventlessdev/reventless-core": "3.0.0-alpha.159",
18
18
  "@reventlessdev/reventless-infra": "3.0.0-alpha.98",
19
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.21",
20
19
  "@reventlessdev/reventless-interop": "3.0.0-alpha.26",
21
- "@reventlessdev/reventless-spec": "3.0.0-alpha.76"
20
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.76",
21
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.23"
22
22
  },
23
23
  "devDependencies": {
24
24
  "rescript": "^12.3.0",
package/src/Platform.res CHANGED
@@ -862,6 +862,7 @@ module MakeWithConfig = (
862
862
  ~runtime=runtimeTyped,
863
863
  ~fieldNames,
864
864
  ~tags,
865
+ ~onAdminApi,
865
866
  ~opts,
866
867
  )
867
868
  },
@@ -1691,6 +1692,7 @@ module MakeWithConfig = (
1691
1692
  Platform_UIFragments_Lambda.make(
1692
1693
  ~api=platformApi,
1693
1694
  ~uiFragmentRegistryTableName=r.name,
1695
+ ~schemaReady=admin.adminSchemaPushed,
1694
1696
  ~opts={},
1695
1697
  )
1696
1698
  | None => ()
@@ -1709,6 +1711,7 @@ module MakeWithConfig = (
1709
1711
  Platform_ApiFragments_Lambda.make(
1710
1712
  ~api=platformApi,
1711
1713
  ~apiFragmentRegistryTableName=r.name,
1714
+ ~schemaReady=admin.adminSchemaPushed,
1712
1715
  ~opts={},
1713
1716
  )
1714
1717
  | None => ()
@@ -1979,10 +1982,21 @@ module MakeWithConfig = (
1979
1982
  // table it re-folds from; the admin DCB command-topic FIFO URL it dispatches
1980
1983
  // RecordApiFragmentPush to (captured during Admin.construct); and the mode flag.
1981
1984
  ~platformApiId=platformApi->Pulumi.Output.flatMap(api => api.id),
1982
- ~apiFragmentRegistryTableName=?admin.stateViewSlicesOutputs
1985
+ // NB: must NOT be `->Option.map(r => r.name)`. `apiFragmentRegistryTableName`
1986
+ // is `option<Pulumi.Output.t<string>>` (the forbidden pattern, CLAUDE.md code
1987
+ // smells). The generic `Option.map` body runs `Primitive_option.some(r.name)`,
1988
+ // and because a Pulumi Output lifts arbitrary property access, `some` inspects
1989
+ // `.BS_PRIVATE_NESTED_SOME_NONE`, mis-reads the Output as a nested option, and
1990
+ // stores the sentinel `{BS_PRIVATE_NESTED_SOME_NONE: 0}` instead of the Output —
1991
+ // so the consumer's `tableOutput->Pulumi.Output.apply` crashes with
1992
+ // "apply is not a function". A `Some(r.name)` LITERAL compiles unboxed (bare
1993
+ // r.name), preserving the Output — the same dodge `pluginReadModelTableName` uses.
1994
+ ~apiFragmentRegistryTableName=?switch admin.stateViewSlicesOutputs
1983
1995
  ->Dict.get("ApiFragments")
1984
- ->Option.flatMap(rm => rm.queryDb.resources->Array.get(0))
1985
- ->Option.map(r => r.name),
1996
+ ->Option.flatMap(rm => rm.queryDb.resources->Array.get(0)) {
1997
+ | Some(r) => Some(r.name)
1998
+ | None => None
1999
+ },
1986
2000
  ~adminDcbCmdTopicUrl=?AutomationSliceRuntime_Builder_Single.getDcbQueueUrl(),
1987
2001
  ~splitApi=Config.splitApi,
1988
2002
  (),
@@ -2014,6 +2028,7 @@ module MakeWithConfig = (
2014
2028
  Platform_UIFragments_Lambda.make(
2015
2029
  ~api=platformApi,
2016
2030
  ~uiFragmentRegistryTableName=r.name,
2031
+ ~schemaReady=admin.adminSchemaPushed,
2017
2032
  ~opts={},
2018
2033
  )
2019
2034
  | None => ()
@@ -2032,6 +2047,7 @@ module MakeWithConfig = (
2032
2047
  Platform_ApiFragments_Lambda.make(
2033
2048
  ~api=platformApi,
2034
2049
  ~apiFragmentRegistryTableName=r.name,
2050
+ ~schemaReady=admin.adminSchemaPushed,
2035
2051
  ~opts={},
2036
2052
  )
2037
2053
  | None => ()
@@ -867,7 +867,10 @@ function MakeWithConfig(Config) {
867
867
  return adminBarrier;
868
868
  };
869
869
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
870
- let hooks_dcbAppSyncResolverHook = param => CommandGeneratorResolvers_AppSync$ReventlessAws.makeDcb(param.onAdminApi ? resolveAdminHookedApi() : resolveHookedApi(), param.runtime, param.fieldNames, param.tags, param.opts);
870
+ let hooks_dcbAppSyncResolverHook = param => {
871
+ let onAdminApi = param.onAdminApi;
872
+ CommandGeneratorResolvers_AppSync$ReventlessAws.makeDcb(onAdminApi ? resolveAdminHookedApi() : resolveHookedApi(), param.runtime, param.fieldNames, param.tags, onAdminApi, param.opts);
873
+ };
871
874
  let hooks_onDcbEventLogCreated = dcbEventLogUnknown => {
872
875
  if (DcbBackend$ReventlessAws.isPostgres()) {
873
876
  return;
@@ -1134,14 +1137,14 @@ function MakeWithConfig(Config) {
1134
1137
  if (rm !== undefined) {
1135
1138
  let r$1 = rm.queryDb.resources[0];
1136
1139
  if (r$1 !== undefined) {
1137
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, {});
1140
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1138
1141
  }
1139
1142
  }
1140
1143
  let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1141
1144
  if (rm$1 !== undefined) {
1142
1145
  let r$2 = rm$1.queryDb.resources[0];
1143
1146
  if (r$2 !== undefined) {
1144
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, {});
1147
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1145
1148
  }
1146
1149
  }
1147
1150
  let pluginComponents = plugins.map(plugin => plugin.make());
@@ -1265,23 +1268,24 @@ function MakeWithConfig(Config) {
1265
1268
  return Pulumi.output("NOT_AVAILABLE");
1266
1269
  }
1267
1270
  });
1268
- PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, Config.cloner, Output$Pulumi.flatMap(platformApi, api => api.id), Stdlib_Option.map(Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]), r => r.name), AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), Config.splitApi, undefined);
1271
+ let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1272
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, Config.cloner, Output$Pulumi.flatMap(platformApi, api => api.id), r$1 !== undefined ? r$1.name : undefined, AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), Config.splitApi, undefined);
1269
1273
  if (pluginReadModelTableName !== undefined) {
1270
1274
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
1271
1275
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
1272
1276
  }
1273
1277
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
1274
1278
  if (rm !== undefined) {
1275
- let r$1 = rm.queryDb.resources[0];
1276
- if (r$1 !== undefined) {
1277
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, {});
1279
+ let r$2 = rm.queryDb.resources[0];
1280
+ if (r$2 !== undefined) {
1281
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1278
1282
  }
1279
1283
  }
1280
1284
  let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
1281
1285
  if (rm$1 !== undefined) {
1282
- let r$2 = rm$1.queryDb.resources[0];
1283
- if (r$2 !== undefined) {
1284
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, {});
1286
+ let r$3 = rm$1.queryDb.resources[0];
1287
+ if (r$3 !== undefined) {
1288
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
1285
1289
  }
1286
1290
  }
1287
1291
  if (Config.splitApi) {
@@ -2248,7 +2252,10 @@ function Make($star) {
2248
2252
  return adminBarrier;
2249
2253
  };
2250
2254
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
2251
- let hooks_dcbAppSyncResolverHook = param => CommandGeneratorResolvers_AppSync$ReventlessAws.makeDcb(param.onAdminApi ? resolveAdminHookedApi() : resolveHookedApi(), param.runtime, param.fieldNames, param.tags, param.opts);
2255
+ let hooks_dcbAppSyncResolverHook = param => {
2256
+ let onAdminApi = param.onAdminApi;
2257
+ CommandGeneratorResolvers_AppSync$ReventlessAws.makeDcb(onAdminApi ? resolveAdminHookedApi() : resolveHookedApi(), param.runtime, param.fieldNames, param.tags, onAdminApi, param.opts);
2258
+ };
2252
2259
  let hooks_onDcbEventLogCreated = dcbEventLogUnknown => {
2253
2260
  if (DcbBackend$ReventlessAws.isPostgres()) {
2254
2261
  return;
@@ -2510,14 +2517,14 @@ function Make($star) {
2510
2517
  if (rm !== undefined) {
2511
2518
  let r$1 = rm.queryDb.resources[0];
2512
2519
  if (r$1 !== undefined) {
2513
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, {});
2520
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2514
2521
  }
2515
2522
  }
2516
2523
  let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2517
2524
  if (rm$1 !== undefined) {
2518
2525
  let r$2 = rm$1.queryDb.resources[0];
2519
2526
  if (r$2 !== undefined) {
2520
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, {});
2527
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2521
2528
  }
2522
2529
  }
2523
2530
  let pluginComponents = plugins.map(plugin => plugin.make());
@@ -2629,23 +2636,24 @@ function Make($star) {
2629
2636
  return Pulumi.output("NOT_AVAILABLE");
2630
2637
  }
2631
2638
  });
2632
- PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, false, Output$Pulumi.flatMap(platformApi, api => api.id), Stdlib_Option.map(Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]), r => r.name), AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), true, undefined);
2639
+ let r$1 = Stdlib_Option.flatMap(admin.stateViewSlicesOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2640
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, pluginSchemaPersistenceTable.name, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, false, Output$Pulumi.flatMap(platformApi, api => api.id), r$1 !== undefined ? r$1.name : undefined, AutomationSliceRuntime_Builder_Single$ReventlessAws.getDcbQueueUrl(), true, undefined);
2633
2641
  if (pluginReadModelTableName !== undefined) {
2634
2642
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
2635
2643
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
2636
2644
  }
2637
2645
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
2638
2646
  if (rm !== undefined) {
2639
- let r$1 = rm.queryDb.resources[0];
2640
- if (r$1 !== undefined) {
2641
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, {});
2647
+ let r$2 = rm.queryDb.resources[0];
2648
+ if (r$2 !== undefined) {
2649
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2642
2650
  }
2643
2651
  }
2644
2652
  let rm$1 = admin.stateViewSlicesOutputs["ApiFragments"];
2645
2653
  if (rm$1 !== undefined) {
2646
- let r$2 = rm$1.queryDb.resources[0];
2647
- if (r$2 !== undefined) {
2648
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, {});
2654
+ let r$3 = rm$1.queryDb.resources[0];
2655
+ if (r$3 !== undefined) {
2656
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
2649
2657
  }
2650
2658
  }
2651
2659
  Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
@@ -67,6 +67,10 @@ export function response(ctx) {
67
67
  let make = (
68
68
  ~api: Pulumi.Output.t<AppSync.GraphQLApi.t>,
69
69
  ~apiFragmentRegistryTableName: Pulumi.Output.t<string>,
70
+ // Resolves when the admin-base schema push has completed and the API is ACTIVE
71
+ // (Platform_Admin.adminSchemaPushed). CreateResolver is gated on it so it never
72
+ // races StartSchemaCreation on this first-ever-deployed field.
73
+ ~schemaReady: Pulumi.Output.t<unit>,
70
74
  ~opts: Pulumi.ComponentResource.options,
71
75
  ) => {
72
76
  let opts = opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
@@ -200,13 +204,19 @@ let make = (
200
204
  ~opts=Some(opts),
201
205
  )
202
206
 
203
- let _resolver = AppSync_Resolver_Native.makeUnitJsResolver(
204
- ~name=name ++ "Resolver",
205
- ~api,
206
- ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
207
- ~type_="Query"->Pulumi.Input.make,
208
- ~field="Platform_ApiFragments"->Pulumi.Input.make,
209
- ~code=resolverCode,
210
- ~opts,
211
- )
207
+ // Create the resolver only after the admin schema push is ACTIVE — otherwise
208
+ // CreateResolver races StartSchemaCreation and fails with "No field named
209
+ // Platform_ApiFragments found on type Query" the first time this field ships.
210
+ let _resolver =
211
+ schemaReady->Pulumi.Output.apply(() =>
212
+ AppSync_Resolver_Native.makeUnitJsResolver(
213
+ ~name=name ++ "Resolver",
214
+ ~api,
215
+ ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
216
+ ~type_="Query"->Pulumi.Input.make,
217
+ ~field="Platform_ApiFragments"->Pulumi.Input.make,
218
+ ~code=resolverCode,
219
+ ~opts,
220
+ )
221
+ )
212
222
  }
@@ -68,7 +68,7 @@ export function response(ctx) {
68
68
  }
69
69
  `;
70
70
 
71
- function make(api, apiFragmentRegistryTableName, opts) {
71
+ function make(api, apiFragmentRegistryTableName, schemaReady, opts) {
72
72
  let opts$1 = Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts);
73
73
  let name = "PlatformApiFragments";
74
74
  let lambdaRole = IAM$PulumiAws.Role.makeWithDefaultPolicy(name + "Lambda", Pulumi.output(AWS$ReventlessAws.Lambda.principal), opts$1);
@@ -191,7 +191,7 @@ export async function handler() {
191
191
  },
192
192
  serviceRoleArn: dataSourceRole.arn
193
193
  }, opts$1);
194
- AppSync_Resolver_Native$ReventlessAws.makeUnitJsResolver(name + "Resolver", api, dataSource.name, "Query", "Platform_ApiFragments", resolverCode, opts$1);
194
+ schemaReady.apply(() => AppSync_Resolver_Native$ReventlessAws.makeUnitJsResolver(name + "Resolver", api, dataSource.name, "Query", "Platform_ApiFragments", resolverCode, opts$1));
195
195
  }
196
196
 
197
197
  export {
@@ -90,6 +90,11 @@ export function response(ctx) {
90
90
  let make = (
91
91
  ~api: Pulumi.Output.t<AppSync.GraphQLApi.t>,
92
92
  ~uiFragmentRegistryTableName: Pulumi.Output.t<string>,
93
+ // Resolves when the admin-base schema push has completed and the API is ACTIVE
94
+ // (Platform_Admin.adminSchemaPushed). CreateResolver is gated on it so it never
95
+ // races StartSchemaCreation — the same first-deploy race that clobbered
96
+ // Platform_ApiFragments; harmless here today only because the field predates it.
97
+ ~schemaReady: Pulumi.Output.t<unit>,
93
98
  ~opts: Pulumi.ComponentResource.options,
94
99
  ) => {
95
100
  let opts = opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
@@ -223,13 +228,18 @@ let make = (
223
228
  ~opts=Some(opts),
224
229
  )
225
230
 
226
- let _resolver = AppSync_Resolver_Native.makeUnitJsResolver(
227
- ~name=name ++ "Resolver",
228
- ~api,
229
- ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
230
- ~type_="Query"->Pulumi.Input.make,
231
- ~field="Platform_UIFragments"->Pulumi.Input.make,
232
- ~code=resolverCode,
233
- ~opts,
234
- )
231
+ // Create the resolver only after the admin schema push is ACTIVE — otherwise
232
+ // CreateResolver races StartSchemaCreation the first time this field ships.
233
+ let _resolver =
234
+ schemaReady->Pulumi.Output.apply(() =>
235
+ AppSync_Resolver_Native.makeUnitJsResolver(
236
+ ~name=name ++ "Resolver",
237
+ ~api,
238
+ ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
239
+ ~type_="Query"->Pulumi.Input.make,
240
+ ~field="Platform_UIFragments"->Pulumi.Input.make,
241
+ ~code=resolverCode,
242
+ ~opts,
243
+ )
244
+ )
235
245
  }
@@ -94,7 +94,7 @@ export function response(ctx) {
94
94
  }
95
95
  `;
96
96
 
97
- function make(api, uiFragmentRegistryTableName, opts) {
97
+ function make(api, uiFragmentRegistryTableName, schemaReady, opts) {
98
98
  let opts$1 = Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts);
99
99
  let name = "PlatformUIFragments";
100
100
  let lambdaRole = IAM$PulumiAws.Role.makeWithDefaultPolicy(name + "Lambda", Pulumi.output(AWS$ReventlessAws.Lambda.principal), opts$1);
@@ -243,7 +243,7 @@ export async function handler() {
243
243
  },
244
244
  serviceRoleArn: dataSourceRole.arn
245
245
  }, opts$1);
246
- AppSync_Resolver_Native$ReventlessAws.makeUnitJsResolver(name + "Resolver", api, dataSource.name, "Query", "Platform_UIFragments", resolverCode, opts$1);
246
+ schemaReady.apply(() => AppSync_Resolver_Native$ReventlessAws.makeUnitJsResolver(name + "Resolver", api, dataSource.name, "Query", "Platform_UIFragments", resolverCode, opts$1));
247
247
  }
248
248
 
249
249
  export {
@@ -174,6 +174,12 @@ let makeDcb = (
174
174
  ~runtime: ReventlessCore.Runtime.environment<runtimeParts>,
175
175
  ~fieldNames: array<string>,
176
176
  ~tags: array<string>,
177
+ // Admin (onAdminApi) DCB slices expose ONLY their mutation fields (declared in the
178
+ // static AdminApi.baseFragment). The static base does NOT declare their `on<Field>`
179
+ // subscription counterparts, so creating Source-C subscription resolvers would fail
180
+ // with CreateResolver NotFound. Suppress subscriptions for admin; plugins keep them
181
+ // (their generated fragment declares the matching subscription fields).
182
+ ~onAdminApi: bool=false,
177
183
  ~opts: Pulumi.ComponentResource.options,
178
184
  ) => {
179
185
  let opts = opts->ReventlessCore.Util.Pulumi.ComponentResourceOptions.toCustomResourceOptions
@@ -242,11 +248,14 @@ let makeDcb = (
242
248
  )
243
249
  })
244
250
 
245
- // Source C: create Subscription.onX resolver for each DCB mutation field.
246
- CommandSubscriptionResolvers_AppSync.make(
247
- ~api,
248
- ~mutationFields=fieldNames,
249
- ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
250
- ~opts,
251
- )
251
+ // Source C: create Subscription.onX resolver for each DCB mutation field — skipped
252
+ // for admin slices, whose static base declares no such subscription fields.
253
+ if !onAdminApi {
254
+ CommandSubscriptionResolvers_AppSync.make(
255
+ ~api,
256
+ ~mutationFields=fieldNames,
257
+ ~dataSourceName=dataSource.name->Pulumi.Output.asInput,
258
+ ~opts,
259
+ )
260
+ }
252
261
  }
@@ -85,7 +85,8 @@ function make(name, api, fields, param, runtime, resources, opts) {
85
85
  };
86
86
  }
87
87
 
88
- function makeDcb(api, runtime, fieldNames, tags, opts) {
88
+ function makeDcb(api, runtime, fieldNames, tags, onAdminApiOpt, opts) {
89
+ let onAdminApi = onAdminApiOpt !== undefined ? onAdminApiOpt : false;
89
90
  let opts$1 = Util_Pulumi$ReventlessCore.ComponentResourceOptions.toCustomResourceOptions(opts);
90
91
  let lambda = runtime.parts.lambda;
91
92
  let dataSourceRole = IAM$PulumiAws.Role.makeWithDefaultPolicy("DcbMutationDS", Pulumi.output(AWS$ReventlessAws.AppSync.principal), opts$1);
@@ -115,7 +116,9 @@ function makeDcb(api, runtime, fieldNames, tags, opts) {
115
116
  let fieldName = param[0];
116
117
  AppSync_Resolver_Retrying$ReventlessAws.makeUnitJsResolver(Stdlib_String.capitalize(fieldName), api, dataSource.name, "Mutation", fieldName, AppSync_Resolver_Functions$PulumiAws.invokeDcbMutation(param[1]), opts$1);
117
118
  });
118
- CommandSubscriptionResolvers_AppSync$ReventlessAws.make(api, fieldNames, dataSource.name, opts$1);
119
+ if (!onAdminApi) {
120
+ return CommandSubscriptionResolvers_AppSync$ReventlessAws.make(api, fieldNames, dataSource.name, opts$1);
121
+ }
119
122
  }
120
123
 
121
124
  export {