@reventlessdev/reventless-aws 3.0.0-alpha.209 → 3.0.0-alpha.210

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.
@@ -42,6 +42,7 @@ import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjection
42
42
  import * as Util_LocalConfig$ReventlessAws from "./util/Util_LocalConfig.res.mjs";
43
43
  import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
44
44
  import * as AppSync_EventsApi$ReventlessAws from "./adapter/Api/AppSync_EventsApi.res.mjs";
45
+ import * as AppSync_MergedApi$ReventlessAws from "./components/Api/AppSync_MergedApi.res.mjs";
45
46
  import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
46
47
  import * as NoEventMappings$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/NoEventMappings.res.mjs";
47
48
  import * as Util_HostUiDomain$ReventlessAws from "./util/Util_HostUiDomain.res.mjs";
@@ -49,6 +50,7 @@ import * as DcbEventLogStorage$ReventlessAws from "./adapter/DcbEventLog/DcbEven
49
50
  import * as ExtensionMapping$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/ExtensionMapping.res.mjs";
50
51
  import * as PluginsProjection$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginsProjection.res.mjs";
51
52
  import * as StateTopic_AppSync$ReventlessAws from "./adapter/StateTopic/StateTopic_AppSync.res.mjs";
53
+ import * as AppSync_SdlDecorate$ReventlessAws from "./components/Api/AppSync_SdlDecorate.res.mjs";
52
54
  import * as UiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry.res.mjs";
53
55
  import * as Util_AppSync_Caller$ReventlessAws from "./util/Util_AppSync_Caller.res.mjs";
54
56
  import * as Util_ResourceNaming$ReventlessAws from "./util/Util_ResourceNaming.res.mjs";
@@ -149,6 +151,7 @@ function MakeWithConfig(Config) {
149
151
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
150
152
  QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
151
153
  });
154
+ let mergedApiMode = Config.mergedApi;
152
155
  let currentDeployTarget = {
153
156
  contents: "Domain"
154
157
  };
@@ -170,6 +173,17 @@ function MakeWithConfig(Config) {
170
173
  id: Pulumi.output(roleName)
171
174
  };
172
175
  };
176
+ let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
177
+ types: [],
178
+ mutations: [],
179
+ queries: [],
180
+ subscriptions: [],
181
+ subscriptionSources: []
182
+ });
183
+ let adminSourceSdl = () => {
184
+ let baseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
185
+ return AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, []));
186
+ };
173
187
  let match;
174
188
  if (platformStackRef !== undefined) {
175
189
  let stackRef = Primitive_option.valFromOption(platformStackRef);
@@ -218,21 +232,56 @@ function MakeWithConfig(Config) {
218
232
  let getFromDefault = key => Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
219
233
  return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
220
234
  });
221
- match = [
222
- phantomApi,
223
- phantomRole,
224
- phantomPlatformApi,
225
- phantomPlatformRole
226
- ];
235
+ if (mergedApiMode) {
236
+ let cognitoPoolIdOutput = stackRef.getOutput("cognitoUserPoolId");
237
+ let cognitoRegionOutput = stackRef.getOutput("cognitoRegion");
238
+ let userPoolConfig = Pulumi.all([
239
+ cognitoPoolIdOutput,
240
+ cognitoRegionOutput,
241
+ defaultOutput
242
+ ]).apply(param => {
243
+ let $$default = param[2];
244
+ let getFromDefault = key => Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
245
+ let userPoolId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("cognitoUserPoolId")), "Platform stack does not export 'cognitoUserPoolId' — redeploy the platform stack first");
246
+ let awsRegion = Stdlib_Option.orElse(param[1], getFromDefault("cognitoRegion"));
247
+ return {
248
+ userPoolId: userPoolId,
249
+ defaultAction: "ALLOW",
250
+ awsRegion: awsRegion
251
+ };
252
+ });
253
+ let match$1 = AppSync_Adapter$ReventlessAws.makePluginSourceApiResource("PluginSourceApi", userPoolConfig, {});
254
+ let role = match$1[1];
255
+ let api = match$1[0];
256
+ match = [
257
+ api,
258
+ role,
259
+ api,
260
+ role
261
+ ];
262
+ } else {
263
+ match = [
264
+ phantomApi,
265
+ phantomRole,
266
+ phantomPlatformApi,
267
+ phantomPlatformRole
268
+ ];
269
+ }
227
270
  } else {
228
- let match$1 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
229
- let role = match$1[1];
230
- let api = match$1[0];
271
+ let match$2;
272
+ if (mergedApiMode) {
273
+ let schema = Config.splitApi ? AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(emptyBaseFragment, [])) : adminSourceSdl();
274
+ match$2 = AppSync_Adapter$ReventlessAws.makeSourceApiResource("DomainApi", schema, {});
275
+ } else {
276
+ match$2 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
277
+ }
278
+ let role$1 = match$2[1];
279
+ let api$1 = match$2[0];
231
280
  match = [
232
- api,
233
- role,
234
- api,
235
- role
281
+ api$1,
282
+ role$1,
283
+ api$1,
284
+ role$1
236
285
  ];
237
286
  }
238
287
  let domainApiRole = match[1];
@@ -264,7 +313,7 @@ function MakeWithConfig(Config) {
264
313
  http: dnsHttp
265
314
  }));
266
315
  let api_name = Pulumi.output("");
267
- let api$1 = {
316
+ let api$2 = {
268
317
  apiId: api_apiId,
269
318
  apiArn: api_apiArn,
270
319
  dns: api_dns,
@@ -272,7 +321,7 @@ function MakeWithConfig(Config) {
272
321
  };
273
322
  domainEventsApiOpt = {
274
323
  name: "DomainEventsApi",
275
- api: api$1,
324
+ api: api$2,
276
325
  defaultNamespace: undefined
277
326
  };
278
327
  } else {
@@ -452,13 +501,6 @@ function MakeWithConfig(Config) {
452
501
  project: UiFragments_Projection$ReventlessCore.project,
453
502
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
454
503
  });
455
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
456
- types: [],
457
- mutations: [],
458
- queries: [],
459
- subscriptions: [],
460
- subscriptionSources: []
461
- });
462
504
  let Make$8 = FragmentConfig => {
463
505
  let Builder = Api_Builder$ReventlessCore.Make({
464
506
  makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
@@ -483,6 +525,9 @@ function MakeWithConfig(Config) {
483
525
  let hooksAdminApiRef = {
484
526
  contents: undefined
485
527
  };
528
+ let mergedSchemaPushedRef = {
529
+ contents: undefined
530
+ };
486
531
  let resolveHookedApi = () => {
487
532
  let match = hooksApiRef.contents;
488
533
  if (match !== undefined) {
@@ -546,6 +591,22 @@ function MakeWithConfig(Config) {
546
591
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
547
592
  }));
548
593
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
594
+ if (mergedApiMode) {
595
+ let sdl = AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(pluginFragment);
596
+ let pushed = Output$Pulumi.flatMap(domainApi, api => Output$Pulumi.flatMap(api.id, apiId => {
597
+ log.info("preResolversSchemaHook", undefined, `Pushing subgraph schema for ` + name + `@` + version + ` to source API ` + apiId);
598
+ let client = AppSync_Adapter$ReventlessAws.getClient();
599
+ return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
600
+ apiId: apiId,
601
+ definition: sdl
602
+ }).then(async () => {
603
+ await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
604
+ return log.info("preResolversSchemaHook", undefined, "subgraph schema is ACTIVE");
605
+ });
606
+ }));
607
+ mergedSchemaPushedRef.contents = pushed;
608
+ return pushed;
609
+ }
549
610
  log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
550
611
  let capturedDeployTarget = currentDeployTarget.contents;
551
612
  if (platformStackRef === undefined) {
@@ -597,6 +658,9 @@ function MakeWithConfig(Config) {
597
658
  });
598
659
  };
599
660
  let hooks_preAdminResolversSchemaHook = adminBarrier => {
661
+ if (mergedApiMode) {
662
+ return adminBarrier;
663
+ }
600
664
  let match = splitApiOutputsRef.contents;
601
665
  let targetApiOpt = match !== undefined ? match.platformApi : (
602
666
  Config.splitApi ? undefined : domainApi
@@ -883,6 +947,9 @@ function MakeWithConfig(Config) {
883
947
  };
884
948
  let makePlatform = (version, plugins) => {
885
949
  log.info("Platform", undefined, `v` + version);
950
+ if (mergedApiMode) {
951
+ Pervasives.failwith("mergedApi mode is supported with deployPlatform only — deploy the platform with deployPlatform and each plugin with deployPlugin.");
952
+ }
886
953
  let scheduler = makeScheduler();
887
954
  hooks_scheduler.contents = scheduler;
888
955
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
@@ -967,12 +1034,41 @@ function MakeWithConfig(Config) {
967
1034
  hooks_scheduler.contents = scheduler;
968
1035
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
969
1036
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
970
- let match = Config.splitApi ? AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {}) : [
1037
+ let match = Config.splitApi ? (
1038
+ mergedApiMode ? AppSync_Adapter$ReventlessAws.makeSourceApiResource("PlatformApi", adminSourceSdl(), {}) : AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {})
1039
+ ) : [
971
1040
  domainApi,
972
1041
  domainApiRole
973
1042
  ];
974
1043
  let platformApiRole = match[1];
975
1044
  let platformApi = match[0];
1045
+ let mergedOutputs;
1046
+ if (mergedApiMode) {
1047
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), AppSync_MergedApi$ReventlessAws.primaryAuthMode);
1048
+ let domainMerged = AppSync_MergedApi$ReventlessAws.make("DomainMergedApi", {});
1049
+ if (Config.splitApi) {
1050
+ let platformMerged = AppSync_MergedApi$ReventlessAws.make("PlatformMergedApi", {});
1051
+ let platformAssoc = AppSync_MergedApi$ReventlessAws.associateSource("PlatformAdminSourceAssociation", platformMerged, platformApi, {});
1052
+ let domainAssoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainBaseSourceAssociation", domainMerged, domainApi, {});
1053
+ mergedOutputs = {
1054
+ domainMerged: domainMerged,
1055
+ platformMerged: platformMerged,
1056
+ domainMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, domainAssoc),
1057
+ platformMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(platformMerged, platformAssoc)
1058
+ };
1059
+ } else {
1060
+ let assoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainAdminSourceAssociation", domainMerged, domainApi, {});
1061
+ let gate = AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, assoc);
1062
+ mergedOutputs = {
1063
+ domainMerged: domainMerged,
1064
+ platformMerged: domainMerged,
1065
+ domainMergeGate: gate,
1066
+ platformMergeGate: gate
1067
+ };
1068
+ }
1069
+ } else {
1070
+ mergedOutputs = undefined;
1071
+ }
976
1072
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
977
1073
  if (Config.splitApi) {
978
1074
  splitApiOutputsRef.contents = {
@@ -1105,6 +1201,22 @@ function MakeWithConfig(Config) {
1105
1201
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1106
1202
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1107
1203
  Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
1204
+ if (mergedOutputs !== undefined) {
1205
+ let platformMerged$1 = mergedOutputs.platformMerged;
1206
+ let domainMerged$1 = mergedOutputs.domainMerged;
1207
+ let mergeGatedArn = (merged, gate) => Pulumi.all([
1208
+ Output$Pulumi.flatMap(merged.api, api => api.arn),
1209
+ gate
1210
+ ]).apply(param => param[0]);
1211
+ let mergedEndpoint = merged => Output$Pulumi.flatMap(merged.api, api => api.uris.apply(uris => uris.GRAPHQL));
1212
+ Pulumi$Pulumi.$$export("domainMergedApiArn", mergeGatedArn(domainMerged$1, mergedOutputs.domainMergeGate));
1213
+ Pulumi$Pulumi.$$export("domainMergedApiId", Output$Pulumi.flatMap(domainMerged$1.api, api => api.id));
1214
+ Pulumi$Pulumi.$$export("domainMergedApiEndpoint", mergedEndpoint(domainMerged$1));
1215
+ Pulumi$Pulumi.$$export("platformMergedApiArn", mergeGatedArn(platformMerged$1, mergedOutputs.platformMergeGate));
1216
+ Pulumi$Pulumi.$$export("platformMergedApiId", Output$Pulumi.flatMap(platformMerged$1.api, api => api.id));
1217
+ Pulumi$Pulumi.$$export("platformMergedApiEndpoint", mergedEndpoint(platformMerged$1));
1218
+ Pulumi$Pulumi.$$export("mergedApiPrimaryAuth", Pulumi.output(AppSync_MergedApi$ReventlessAws.primaryAuthMode));
1219
+ }
1108
1220
  if (domainEventsApiOpt !== undefined) {
1109
1221
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
1110
1222
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -1113,9 +1225,11 @@ function MakeWithConfig(Config) {
1113
1225
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
1114
1226
  }
1115
1227
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
1116
- let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL));
1228
+ let clientDomainApi = mergedOutputs !== undefined ? mergedOutputs.domainMerged.api : domainApi;
1229
+ let clientPlatformApi = mergedOutputs !== undefined ? mergedOutputs.platformMerged.api : platformApi;
1230
+ let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(clientDomainApi, api => api.uris.apply(uris => uris.GRAPHQL));
1117
1231
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
1118
- let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL));
1232
+ let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(clientPlatformApi, api => api.uris.apply(uris => uris.GRAPHQL));
1119
1233
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
1120
1234
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
1121
1235
  r.eventLog.resources,
@@ -1246,6 +1360,47 @@ function MakeWithConfig(Config) {
1246
1360
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
1247
1361
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
1248
1362
  Plugin_Helpers$ReventlessCore.exportPluginOutputs(pluginOutputs);
1363
+ if (mergedApiMode && platformStackRef !== undefined) {
1364
+ let stackRef = Primitive_option.valFromOption(platformStackRef);
1365
+ let defaultOutput = stackRef.getOutput("default");
1366
+ let getMergedExport = key => {
1367
+ let direct = stackRef.getOutput(key);
1368
+ return Pulumi.all([
1369
+ direct,
1370
+ defaultOutput
1371
+ ]).apply(param => {
1372
+ let direct = param[0];
1373
+ if (direct !== undefined) {
1374
+ return direct;
1375
+ } else {
1376
+ return Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v)), `Platform stack does not export '` + key + `' — deploy the platform with mergedApi=true first`);
1377
+ }
1378
+ });
1379
+ };
1380
+ let mergedApiArn;
1381
+ mergedApiArn = apiTarget === "Domain" ? getMergedExport("domainMergedApiArn") : getMergedExport("platformMergedApiArn");
1382
+ let checkedMergedApiArn = Pulumi.all([
1383
+ mergedApiArn,
1384
+ getMergedExport("mergedApiPrimaryAuth")
1385
+ ]).apply(param => {
1386
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), param[1]);
1387
+ return param[0];
1388
+ });
1389
+ let pushed = mergedSchemaPushedRef.contents;
1390
+ let schemaPushed = pushed !== undefined ? pushed : Pulumi.output();
1391
+ let arnAfterSchemaPush = Pulumi.all([
1392
+ checkedMergedApiArn,
1393
+ schemaPushed
1394
+ ]).apply(param => param[0]);
1395
+ let association = AppSync_MergedApi$ReventlessAws.associateSourceWithMergedArn("PluginSourceAssociation", arnAfterSchemaPush, domainApi, {});
1396
+ let mergeGate = AppSync_MergedApi$ReventlessAws.mergeStatusGateWith(checkedMergedApiArn, association);
1397
+ Pulumi$Pulumi.$$export("sourceApiAssociationId", Pulumi.all([
1398
+ association.associationId,
1399
+ mergeGate
1400
+ ]).apply(param => param[0]));
1401
+ Pulumi$Pulumi.$$export("pluginSourceApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1402
+ Pulumi$Pulumi.$$export("pluginSourceApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1403
+ }
1249
1404
  provisionPgChangeFeedRelay();
1250
1405
  let sel = QueryDbBackend$ReventlessAws.get();
1251
1406
  if (sel !== undefined) {
@@ -1371,6 +1526,17 @@ function Make($star) {
1371
1526
  id: Pulumi.output(roleName)
1372
1527
  };
1373
1528
  };
1529
+ let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1530
+ types: [],
1531
+ mutations: [],
1532
+ queries: [],
1533
+ subscriptions: [],
1534
+ subscriptionSources: []
1535
+ });
1536
+ let adminSourceSdl = () => {
1537
+ let baseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
1538
+ return AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, []));
1539
+ };
1374
1540
  let match;
1375
1541
  if (platformStackRef !== undefined) {
1376
1542
  let stackRef = Primitive_option.valFromOption(platformStackRef);
@@ -1378,7 +1544,7 @@ function Make($star) {
1378
1544
  let domainApiIdOutput = stackRef.getOutput("domainApiId");
1379
1545
  let domainApiEndpointOutput = stackRef.getOutput("domainApiEndpoint");
1380
1546
  let domainApiRoleArnOutput = stackRef.getOutput("domainApiRoleArn");
1381
- let phantomApi = Pulumi.all([
1547
+ Pulumi.all([
1382
1548
  domainApiIdOutput,
1383
1549
  domainApiEndpointOutput,
1384
1550
  defaultOutput
@@ -1390,7 +1556,7 @@ function Make($star) {
1390
1556
  let apiEndpoint = directEndpoint !== undefined ? directEndpoint : Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d["domainApiEndpoint"]), v => Stdlib_JSON.Decode.string(v)), "Platform stack does not export 'domainApiEndpoint' — redeploy the platform stack first");
1391
1557
  return makePhantomApi(apiId, apiEndpoint);
1392
1558
  });
1393
- let phantomRole = Pulumi.all([
1559
+ Pulumi.all([
1394
1560
  domainApiRoleArnOutput,
1395
1561
  defaultOutput
1396
1562
  ]).apply(param => {
@@ -1400,7 +1566,7 @@ function Make($star) {
1400
1566
  let platformApiIdOutput = stackRef.getOutput("platformApiId");
1401
1567
  let platformApiEndpointOutput = stackRef.getOutput("platformApiEndpoint");
1402
1568
  let platformApiRoleArnOutput = stackRef.getOutput("platformApiRoleArn");
1403
- let phantomPlatformApi = Pulumi.all([
1569
+ Pulumi.all([
1404
1570
  platformApiIdOutput,
1405
1571
  platformApiEndpointOutput,
1406
1572
  defaultOutput
@@ -1411,7 +1577,7 @@ function Make($star) {
1411
1577
  let platformApiEndpoint = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[1], getFromDefault("platformApiEndpoint")), undefined);
1412
1578
  return makePhantomApi(platformApiId, platformApiEndpoint);
1413
1579
  });
1414
- let phantomPlatformRole = Pulumi.all([
1580
+ Pulumi.all([
1415
1581
  platformApiRoleArnOutput,
1416
1582
  defaultOutput
1417
1583
  ]).apply(param => {
@@ -1419,14 +1585,24 @@ function Make($star) {
1419
1585
  let getFromDefault = key => Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
1420
1586
  return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
1421
1587
  });
1422
- match = [
1423
- phantomApi,
1424
- phantomRole,
1425
- phantomPlatformApi,
1426
- phantomPlatformRole
1427
- ];
1428
- } else {
1429
- let match$1 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
1588
+ let cognitoPoolIdOutput = stackRef.getOutput("cognitoUserPoolId");
1589
+ let cognitoRegionOutput = stackRef.getOutput("cognitoRegion");
1590
+ let userPoolConfig = Pulumi.all([
1591
+ cognitoPoolIdOutput,
1592
+ cognitoRegionOutput,
1593
+ defaultOutput
1594
+ ]).apply(param => {
1595
+ let $$default = param[2];
1596
+ let getFromDefault = key => Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v));
1597
+ let userPoolId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("cognitoUserPoolId")), "Platform stack does not export 'cognitoUserPoolId' — redeploy the platform stack first");
1598
+ let awsRegion = Stdlib_Option.orElse(param[1], getFromDefault("cognitoRegion"));
1599
+ return {
1600
+ userPoolId: userPoolId,
1601
+ defaultAction: "ALLOW",
1602
+ awsRegion: awsRegion
1603
+ };
1604
+ });
1605
+ let match$1 = AppSync_Adapter$ReventlessAws.makePluginSourceApiResource("PluginSourceApi", userPoolConfig, {});
1430
1606
  let role = match$1[1];
1431
1607
  let api = match$1[0];
1432
1608
  match = [
@@ -1435,6 +1611,17 @@ function Make($star) {
1435
1611
  api,
1436
1612
  role
1437
1613
  ];
1614
+ } else {
1615
+ let schema = AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(emptyBaseFragment, []));
1616
+ let match$2 = AppSync_Adapter$ReventlessAws.makeSourceApiResource("DomainApi", schema, {});
1617
+ let role$1 = match$2[1];
1618
+ let api$1 = match$2[0];
1619
+ match = [
1620
+ api$1,
1621
+ role$1,
1622
+ api$1,
1623
+ role$1
1624
+ ];
1438
1625
  }
1439
1626
  let domainApiRole = match[1];
1440
1627
  let domainApi = match[0];
@@ -1465,7 +1652,7 @@ function Make($star) {
1465
1652
  http: dnsHttp
1466
1653
  }));
1467
1654
  let api_name = Pulumi.output("");
1468
- let api$1 = {
1655
+ let api$2 = {
1469
1656
  apiId: api_apiId,
1470
1657
  apiArn: api_apiArn,
1471
1658
  dns: api_dns,
@@ -1473,7 +1660,7 @@ function Make($star) {
1473
1660
  };
1474
1661
  domainEventsApiOpt = {
1475
1662
  name: "DomainEventsApi",
1476
- api: api$1,
1663
+ api: api$2,
1477
1664
  defaultNamespace: undefined
1478
1665
  };
1479
1666
  } else {
@@ -1653,13 +1840,6 @@ function Make($star) {
1653
1840
  project: UiFragments_Projection$ReventlessCore.project,
1654
1841
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
1655
1842
  });
1656
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1657
- types: [],
1658
- mutations: [],
1659
- queries: [],
1660
- subscriptions: [],
1661
- subscriptionSources: []
1662
- });
1663
1843
  let Make$9 = FragmentConfig => {
1664
1844
  let Builder = Api_Builder$ReventlessCore.Make({
1665
1845
  makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
@@ -1683,6 +1863,9 @@ function Make($star) {
1683
1863
  let hooksAdminApiRef = {
1684
1864
  contents: undefined
1685
1865
  };
1866
+ let mergedSchemaPushedRef = {
1867
+ contents: undefined
1868
+ };
1686
1869
  let resolveHookedApi = () => {
1687
1870
  let match = hooksApiRef.contents;
1688
1871
  if (match !== undefined) {
@@ -1699,34 +1882,6 @@ function Make($star) {
1699
1882
  return resolveHookedApi();
1700
1883
  }
1701
1884
  };
1702
- let deployWaiterDelay = ms => new Promise((resolve, param) => {
1703
- setTimeout(() => resolve(), ms);
1704
- });
1705
- let waitForApiFragmentPush = async (endpoint, region, pluginId, sinceAt) => {
1706
- let loop = async attempt => {
1707
- if (attempt >= 90) {
1708
- return Stdlib_JsError.throwWithMessage(`Timed out (>3min) waiting for the platform to push ` + pluginId + `'s API fragment — check the AdminEventCollector Lambda logs.`);
1709
- }
1710
- let data = await Util_AppSync_Caller$ReventlessAws.sendQuery(endpoint, region, "query { Platform_ApiFragments { pluginId pushStatus pushMessage pushedAt } }");
1711
- let row = Stdlib_Option.flatMap(Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(data, Stdlib_JSON.Decode.object), d => d["Platform_ApiFragments"]), Stdlib_JSON.Decode.array), []).find(entry => Primitive_object.equal(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(entry), e => e["pluginId"]), Stdlib_JSON.Decode.string), pluginId)), Stdlib_JSON.Decode.object);
1712
- if (row !== undefined) {
1713
- let field = k => Stdlib_Option.getOr(Stdlib_Option.flatMap(row[k], Stdlib_JSON.Decode.string), "");
1714
- let status = field("pushStatus");
1715
- let fresh = field("pushedAt") >= sinceAt;
1716
- if (fresh && status === "ok") {
1717
- return log.info("registerFragmentViaApi", undefined, pluginId + ` schema push confirmed ACTIVE`);
1718
- } else if (fresh && status === "error") {
1719
- return Stdlib_JsError.throwWithMessage(`Schema push failed for ` + pluginId + `: ` + field("pushMessage"));
1720
- } else {
1721
- await deployWaiterDelay(2000);
1722
- return await loop(attempt + 1 | 0);
1723
- }
1724
- }
1725
- await deployWaiterDelay(2000);
1726
- return await loop(attempt + 1 | 0);
1727
- };
1728
- return await loop(0);
1729
- };
1730
1885
  let hooks_subscriptionInfraHook = Stdlib_Option.map(domainEventsApiOpt, eventsApi => (params => {
1731
1886
  let allEventTopics = params.allEventTopics;
1732
1887
  let allQueryDbs = params.allQueryDbs;
@@ -1746,81 +1901,22 @@ function Make($star) {
1746
1901
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
1747
1902
  }));
1748
1903
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
1749
- log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
1750
- let capturedDeployTarget = currentDeployTarget.contents;
1751
- if (platformStackRef === undefined) {
1752
- return Pervasives.failwith("makePlatform(~plugins=[…]) is no longer supported on AWS — deploy the platform with deployPlatform and each plugin with deployPlugin (staged register + reactive push).");
1753
- }
1754
- let apiTargetName;
1755
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
1756
- let match = apiConfigRef.contents;
1757
- let platformApi = match !== undefined ? match.platformApi : domainApi;
1758
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
1759
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
1760
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
1761
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
1762
- let run = async () => {
1763
- let at = new Date().toISOString();
1764
- let variables = {
1765
- id: "registry",
1766
- pluginId: name,
1767
- fragment: {
1768
- encoded: pluginFragment.encoded,
1769
- protocol: pluginFragment.protocol
1770
- },
1771
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
1772
- at: at
1773
- };
1774
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
1775
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
1776
- let outcome = Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result, Stdlib_JSON.Decode.object), d => d["Platform_ApiFragmentRegistry_RegisterApiFragment"]), Stdlib_JSON.Decode.object);
1777
- if (outcome === undefined) {
1778
- return await waitForApiFragmentPush(endpoint, region, name, at);
1779
- }
1780
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
1781
- switch (typename) {
1782
- case "CommandAccepted" :
1783
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
1784
- if (eventCount > 0.0) {
1785
- return await waitForApiFragmentPush(endpoint, region, name, at);
1786
- } else {
1787
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
1788
- }
1789
- case "CommandRejected" :
1790
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
1791
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
1792
- default:
1793
- return await waitForApiFragmentPush(endpoint, region, name, at);
1794
- }
1795
- };
1796
- return run();
1797
- });
1798
- };
1799
- let hooks_preAdminResolversSchemaHook = adminBarrier => {
1800
- let match = splitApiOutputsRef.contents;
1801
- let targetApiOpt = match !== undefined ? match.platformApi : undefined;
1802
- if (targetApiOpt !== undefined) {
1803
- let adminBaseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
1804
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(adminBaseFragment, []);
1805
- return Output$Pulumi.flatMap(Pulumi.all([
1806
- targetApiOpt,
1807
- adminBarrier
1808
- ]), param => Output$Pulumi.flatMap(param[0].id, apiId => {
1809
- log.info("preAdminResolversSchemaHook", undefined, `Pushing admin schema to ` + apiId);
1810
- let client = AppSync_Adapter$ReventlessAws.getClient();
1811
- return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
1812
- apiId: apiId,
1813
- definition: sdl
1814
- }).then(async () => {
1815
- log.info("preAdminResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
1816
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
1817
- return log.info("preAdminResolversSchemaHook", undefined, "schema is ACTIVE");
1818
- });
1819
- }));
1820
- }
1821
- log.error("preAdminResolversSchemaHook", undefined, "split mode but the PlatformApi is not available at hook time — SKIPPING the admin schema push to avoid clobbering the DomainApi (pushing admin-base here would wipe every plugin field)");
1822
- return adminBarrier;
1904
+ let sdl = AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(pluginFragment);
1905
+ let pushed = Output$Pulumi.flatMap(domainApi, api => Output$Pulumi.flatMap(api.id, apiId => {
1906
+ log.info("preResolversSchemaHook", undefined, `Pushing subgraph schema for ` + name + `@` + version + ` to source API ` + apiId);
1907
+ let client = AppSync_Adapter$ReventlessAws.getClient();
1908
+ return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
1909
+ apiId: apiId,
1910
+ definition: sdl
1911
+ }).then(async () => {
1912
+ await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
1913
+ return log.info("preResolversSchemaHook", undefined, "subgraph schema is ACTIVE");
1914
+ });
1915
+ }));
1916
+ mergedSchemaPushedRef.contents = pushed;
1917
+ return pushed;
1823
1918
  };
1919
+ let hooks_preAdminResolversSchemaHook = adminBarrier => adminBarrier;
1824
1920
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
1825
1921
  let hooks_dcbAppSyncResolverHook = param => {
1826
1922
  let onAdminApi = param.onAdminApi;
@@ -2081,6 +2177,7 @@ function Make($star) {
2081
2177
  };
2082
2178
  let makePlatform = (version, plugins) => {
2083
2179
  log.info("Platform", undefined, `v` + version);
2180
+ Pervasives.failwith("mergedApi mode is supported with deployPlatform only — deploy the platform with deployPlatform and each plugin with deployPlugin.");
2084
2181
  let scheduler = makeScheduler();
2085
2182
  hooks_scheduler.contents = scheduler;
2086
2183
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
@@ -2154,9 +2251,20 @@ function Make($star) {
2154
2251
  hooks_scheduler.contents = scheduler;
2155
2252
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
2156
2253
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
2157
- let match = AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {});
2254
+ let match = AppSync_Adapter$ReventlessAws.makeSourceApiResource("PlatformApi", adminSourceSdl(), {});
2158
2255
  let platformApiRole = match[1];
2159
2256
  let platformApi = match[0];
2257
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), AppSync_MergedApi$ReventlessAws.primaryAuthMode);
2258
+ let domainMerged = AppSync_MergedApi$ReventlessAws.make("DomainMergedApi", {});
2259
+ let platformMerged = AppSync_MergedApi$ReventlessAws.make("PlatformMergedApi", {});
2260
+ let platformAssoc = AppSync_MergedApi$ReventlessAws.associateSource("PlatformAdminSourceAssociation", platformMerged, platformApi, {});
2261
+ let domainAssoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainBaseSourceAssociation", domainMerged, domainApi, {});
2262
+ let mergedOutputs = {
2263
+ domainMerged: domainMerged,
2264
+ platformMerged: platformMerged,
2265
+ domainMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, domainAssoc),
2266
+ platformMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(platformMerged, platformAssoc)
2267
+ };
2160
2268
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
2161
2269
  splitApiOutputsRef.contents = {
2162
2270
  platformApi: platformApi,
@@ -2281,6 +2389,22 @@ function Make($star) {
2281
2389
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
2282
2390
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2283
2391
  Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
2392
+ if (mergedOutputs !== undefined) {
2393
+ let platformMerged$1 = mergedOutputs.platformMerged;
2394
+ let domainMerged$1 = mergedOutputs.domainMerged;
2395
+ let mergeGatedArn = (merged, gate) => Pulumi.all([
2396
+ Output$Pulumi.flatMap(merged.api, api => api.arn),
2397
+ gate
2398
+ ]).apply(param => param[0]);
2399
+ let mergedEndpoint = merged => Output$Pulumi.flatMap(merged.api, api => api.uris.apply(uris => uris.GRAPHQL));
2400
+ Pulumi$Pulumi.$$export("domainMergedApiArn", mergeGatedArn(domainMerged$1, mergedOutputs.domainMergeGate));
2401
+ Pulumi$Pulumi.$$export("domainMergedApiId", Output$Pulumi.flatMap(domainMerged$1.api, api => api.id));
2402
+ Pulumi$Pulumi.$$export("domainMergedApiEndpoint", mergedEndpoint(domainMerged$1));
2403
+ Pulumi$Pulumi.$$export("platformMergedApiArn", mergeGatedArn(platformMerged$1, mergedOutputs.platformMergeGate));
2404
+ Pulumi$Pulumi.$$export("platformMergedApiId", Output$Pulumi.flatMap(platformMerged$1.api, api => api.id));
2405
+ Pulumi$Pulumi.$$export("platformMergedApiEndpoint", mergedEndpoint(platformMerged$1));
2406
+ Pulumi$Pulumi.$$export("mergedApiPrimaryAuth", Pulumi.output(AppSync_MergedApi$ReventlessAws.primaryAuthMode));
2407
+ }
2284
2408
  if (domainEventsApiOpt !== undefined) {
2285
2409
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
2286
2410
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -2289,9 +2413,11 @@ function Make($star) {
2289
2413
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
2290
2414
  }
2291
2415
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
2292
- let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL));
2416
+ let clientDomainApi = mergedOutputs !== undefined ? mergedOutputs.domainMerged.api : domainApi;
2417
+ let clientPlatformApi = mergedOutputs !== undefined ? mergedOutputs.platformMerged.api : platformApi;
2418
+ let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(clientDomainApi, api => api.uris.apply(uris => uris.GRAPHQL));
2293
2419
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
2294
- let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL));
2420
+ let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(clientPlatformApi, api => api.uris.apply(uris => uris.GRAPHQL));
2295
2421
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
2296
2422
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
2297
2423
  r.eventLog.resources,
@@ -2422,6 +2548,47 @@ function Make($star) {
2422
2548
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
2423
2549
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
2424
2550
  Plugin_Helpers$ReventlessCore.exportPluginOutputs(pluginOutputs);
2551
+ if (platformStackRef !== undefined) {
2552
+ let stackRef = Primitive_option.valFromOption(platformStackRef);
2553
+ let defaultOutput = stackRef.getOutput("default");
2554
+ let getMergedExport = key => {
2555
+ let direct = stackRef.getOutput(key);
2556
+ return Pulumi.all([
2557
+ direct,
2558
+ defaultOutput
2559
+ ]).apply(param => {
2560
+ let direct = param[0];
2561
+ if (direct !== undefined) {
2562
+ return direct;
2563
+ } else {
2564
+ return Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d[key]), v => Stdlib_JSON.Decode.string(v)), `Platform stack does not export '` + key + `' — deploy the platform with mergedApi=true first`);
2565
+ }
2566
+ });
2567
+ };
2568
+ let mergedApiArn;
2569
+ mergedApiArn = apiTarget === "Domain" ? getMergedExport("domainMergedApiArn") : getMergedExport("platformMergedApiArn");
2570
+ let checkedMergedApiArn = Pulumi.all([
2571
+ mergedApiArn,
2572
+ getMergedExport("mergedApiPrimaryAuth")
2573
+ ]).apply(param => {
2574
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), param[1]);
2575
+ return param[0];
2576
+ });
2577
+ let pushed = mergedSchemaPushedRef.contents;
2578
+ let schemaPushed = pushed !== undefined ? pushed : Pulumi.output();
2579
+ let arnAfterSchemaPush = Pulumi.all([
2580
+ checkedMergedApiArn,
2581
+ schemaPushed
2582
+ ]).apply(param => param[0]);
2583
+ let association = AppSync_MergedApi$ReventlessAws.associateSourceWithMergedArn("PluginSourceAssociation", arnAfterSchemaPush, domainApi, {});
2584
+ let mergeGate = AppSync_MergedApi$ReventlessAws.mergeStatusGateWith(checkedMergedApiArn, association);
2585
+ Pulumi$Pulumi.$$export("sourceApiAssociationId", Pulumi.all([
2586
+ association.associationId,
2587
+ mergeGate
2588
+ ]).apply(param => param[0]));
2589
+ Pulumi$Pulumi.$$export("pluginSourceApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
2590
+ Pulumi$Pulumi.$$export("pluginSourceApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2591
+ }
2425
2592
  provisionPgChangeFeedRelay();
2426
2593
  let sel = QueryDbBackend$ReventlessAws.get();
2427
2594
  if (sel !== undefined) {