@reventlessdev/reventless-aws 3.0.0-alpha.208 → 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.
@@ -1,23 +1,20 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
3
  import * as S from "sury/src/S.res.mjs";
4
+ import * as Pervasives from "@rescript/runtime/lib/es6/Pervasives.js";
4
5
  import * as Aws from "@pulumi/aws";
5
6
  import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
6
7
  import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
7
8
  import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
8
- import * as Stdlib_Float from "@rescript/runtime/lib/es6/Stdlib_Float.js";
9
- import * as Stdlib_JsExn from "@rescript/runtime/lib/es6/Stdlib_JsExn.js";
10
9
  import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
11
10
  import * as Output$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Output.res.mjs";
12
11
  import * as Pulumi$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Pulumi.res.mjs";
13
12
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
14
13
  import * as Pulumi from "@pulumi/pulumi";
15
14
  import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
16
- import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
17
15
  import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
18
16
  import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
19
17
  import * as Plugin$ReventlessAws from "./components/Plugin.res.mjs";
20
- import * as LibDynamodb from "@aws-sdk/lib-dynamodb";
21
18
  import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
22
19
  import * as Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
23
20
  import * as AdminApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/AdminApi.res.mjs";
@@ -32,7 +29,6 @@ import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs
32
29
  import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments.res.mjs";
33
30
  import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
34
31
  import * as ApiSchemaPush$ReventlessAws from "./adapter/Api/ApiSchemaPush.res.mjs";
35
- import * as Util_DynamoDb$ReventlessAws from "./util/Util_DynamoDb.res.mjs";
36
32
  import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
37
33
  import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
38
34
  import * as QueryDbBackend$ReventlessAws from "./adapter/QueryDb/QueryDbBackend.res.mjs";
@@ -42,11 +38,11 @@ import * as EventLogBackend$ReventlessAws from "./adapter/EventLog/EventLogBacke
42
38
  import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
43
39
  import * as PluginBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginBehavior.res.mjs";
44
40
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
45
- import * as DynamoDb_DocumentClient$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/DynamoDb_DocumentClient.res.mjs";
46
41
  import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjectionFeed.res.mjs";
47
42
  import * as Util_LocalConfig$ReventlessAws from "./util/Util_LocalConfig.res.mjs";
48
43
  import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
49
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";
50
46
  import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
51
47
  import * as NoEventMappings$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/NoEventMappings.res.mjs";
52
48
  import * as Util_HostUiDomain$ReventlessAws from "./util/Util_HostUiDomain.res.mjs";
@@ -54,6 +50,7 @@ import * as DcbEventLogStorage$ReventlessAws from "./adapter/DcbEventLog/DcbEven
54
50
  import * as ExtensionMapping$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/ExtensionMapping.res.mjs";
55
51
  import * as PluginsProjection$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginsProjection.res.mjs";
56
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";
57
54
  import * as UiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry.res.mjs";
58
55
  import * as Util_AppSync_Caller$ReventlessAws from "./util/Util_AppSync_Caller.res.mjs";
59
56
  import * as Util_ResourceNaming$ReventlessAws from "./util/Util_ResourceNaming.res.mjs";
@@ -111,12 +108,6 @@ import * as SideEffectHandlerRuntime_Builder_Single$ReventlessAws from "./adapte
111
108
 
112
109
  let log = Logger$ReventlessCore.fromEnv();
113
110
 
114
- let n = Stdlib_Option.flatMap(process.env["DEPLOY_SCHEMA_SHRINK_THRESHOLD"], Stdlib_Float.fromString);
115
-
116
- let deploySchemaShrinkThreshold = n !== undefined ? (
117
- n > 0 && n < 1 ? n : 0.5
118
- ) : 0.5;
119
-
120
111
  let apiConfigRef = {
121
112
  contents: undefined
122
113
  };
@@ -160,6 +151,7 @@ function MakeWithConfig(Config) {
160
151
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
161
152
  QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
162
153
  });
154
+ let mergedApiMode = Config.mergedApi;
163
155
  let currentDeployTarget = {
164
156
  contents: "Domain"
165
157
  };
@@ -181,6 +173,17 @@ function MakeWithConfig(Config) {
181
173
  id: Pulumi.output(roleName)
182
174
  };
183
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
+ };
184
187
  let match;
185
188
  if (platformStackRef !== undefined) {
186
189
  let stackRef = Primitive_option.valFromOption(platformStackRef);
@@ -229,21 +232,56 @@ function MakeWithConfig(Config) {
229
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));
230
233
  return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
231
234
  });
232
- match = [
233
- phantomApi,
234
- phantomRole,
235
- phantomPlatformApi,
236
- phantomPlatformRole
237
- ];
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
+ }
238
270
  } else {
239
- let match$1 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
240
- let role = match$1[1];
241
- 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];
242
280
  match = [
243
- api,
244
- role,
245
- api,
246
- role
281
+ api$1,
282
+ role$1,
283
+ api$1,
284
+ role$1
247
285
  ];
248
286
  }
249
287
  let domainApiRole = match[1];
@@ -275,7 +313,7 @@ function MakeWithConfig(Config) {
275
313
  http: dnsHttp
276
314
  }));
277
315
  let api_name = Pulumi.output("");
278
- let api$1 = {
316
+ let api$2 = {
279
317
  apiId: api_apiId,
280
318
  apiArn: api_apiArn,
281
319
  dns: api_dns,
@@ -283,7 +321,7 @@ function MakeWithConfig(Config) {
283
321
  };
284
322
  domainEventsApiOpt = {
285
323
  name: "DomainEventsApi",
286
- api: api$1,
324
+ api: api$2,
287
325
  defaultNamespace: undefined
288
326
  };
289
327
  } else {
@@ -463,13 +501,6 @@ function MakeWithConfig(Config) {
463
501
  project: UiFragments_Projection$ReventlessCore.project,
464
502
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
465
503
  });
466
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
467
- types: [],
468
- mutations: [],
469
- queries: [],
470
- subscriptions: [],
471
- subscriptionSources: []
472
- });
473
504
  let Make$8 = FragmentConfig => {
474
505
  let Builder = Api_Builder$ReventlessCore.Make({
475
506
  makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
@@ -485,38 +516,6 @@ function MakeWithConfig(Config) {
485
516
  let Api = {
486
517
  Make: Make$8
487
518
  };
488
- let deploySchemaHashPrefix = "deploy-schema-hash:";
489
- let readSchemaHash = async (tableName, apiId) => {
490
- let key = Object.fromEntries([[
491
- "id",
492
- deploySchemaHashPrefix + apiId
493
- ]]);
494
- try {
495
- let result = await DynamoDb_DocumentClient$AwsSdk.GetCommand.send(new LibDynamodb.GetCommand({
496
- TableName: tableName,
497
- Key: key
498
- }));
499
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result.Item, item => Stdlib_JSON.Decode.object(item)), d => d["hash"]), v => Stdlib_JSON.Decode.string(v));
500
- } catch (exn) {
501
- return;
502
- }
503
- };
504
- let writeSchemaHash = async (tableName, apiId, hash) => {
505
- let item = Object.fromEntries([
506
- [
507
- "id",
508
- deploySchemaHashPrefix + apiId
509
- ],
510
- [
511
- "hash",
512
- hash
513
- ]
514
- ]);
515
- await DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
516
- Item: item,
517
- TableName: tableName
518
- }));
519
- };
520
519
  let hooksApiRef = {
521
520
  contents: undefined
522
521
  };
@@ -526,6 +525,9 @@ function MakeWithConfig(Config) {
526
525
  let hooksAdminApiRef = {
527
526
  contents: undefined
528
527
  };
528
+ let mergedSchemaPushedRef = {
529
+ contents: undefined
530
+ };
529
531
  let resolveHookedApi = () => {
530
532
  let match = hooksApiRef.contents;
531
533
  if (match !== undefined) {
@@ -589,231 +591,76 @@ function MakeWithConfig(Config) {
589
591
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
590
592
  }));
591
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
+ }
592
610
  log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
593
611
  let capturedDeployTarget = currentDeployTarget.contents;
594
- if (platformStackRef !== undefined) {
595
- let apiTargetName;
596
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
597
- let match = apiConfigRef.contents;
598
- let platformApi = match !== undefined ? match.platformApi : domainApi;
599
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
600
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
601
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
602
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
603
- let run = async () => {
604
- let at = new Date().toISOString();
605
- let variables = {
606
- id: "registry",
607
- pluginId: name,
608
- fragment: {
609
- encoded: pluginFragment.encoded,
610
- protocol: pluginFragment.protocol
611
- },
612
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
613
- at: at
614
- };
615
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
616
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
617
- 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);
618
- if (outcome === undefined) {
619
- return await waitForApiFragmentPush(endpoint, region, name, at);
620
- }
621
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
622
- switch (typename) {
623
- case "CommandAccepted" :
624
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
625
- if (eventCount > 0.0) {
626
- return await waitForApiFragmentPush(endpoint, region, name, at);
627
- } else {
628
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
629
- }
630
- case "CommandRejected" :
631
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
632
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
633
- default:
634
- return await waitForApiFragmentPush(endpoint, region, name, at);
635
- }
612
+ if (platformStackRef === undefined) {
613
+ 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).");
614
+ }
615
+ let apiTargetName;
616
+ apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
617
+ let match = apiConfigRef.contents;
618
+ let platformApi = match !== undefined ? match.platformApi : domainApi;
619
+ let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
620
+ let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
621
+ ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
622
+ return Output$Pulumi.flatMap(endpointOutput, endpoint => {
623
+ let run = async () => {
624
+ let at = new Date().toISOString();
625
+ let variables = {
626
+ id: "registry",
627
+ pluginId: name,
628
+ fragment: {
629
+ encoded: pluginFragment.encoded,
630
+ protocol: pluginFragment.protocol
631
+ },
632
+ apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
633
+ at: at
636
634
  };
637
- return run();
638
- });
639
- }
640
- let match$1;
641
- if (capturedDeployTarget === "Domain") {
642
- match$1 = [
643
- "deploy-schema:",
644
- domainApi
645
- ];
646
- } else {
647
- let match$2 = apiConfigRef.contents;
648
- let api = match$2 !== undefined ? match$2.platformApi : domainApi;
649
- match$1 = [
650
- "deploy-schema-platform:",
651
- api
652
- ];
653
- }
654
- let targetApi = match$1[1];
655
- let schemaPrefix = match$1[0];
656
- let readStackRefString = (stackRef, key) => {
657
- let direct = stackRef.getOutput(key);
658
- let defaultOutput = stackRef.getOutput("default");
659
- return Pulumi.all([
660
- direct,
661
- defaultOutput
662
- ]).apply(param => {
663
- let name = Stdlib_Option.flatMap(param[0], v => Stdlib_JSON.Decode.string(v));
664
- if (name !== undefined) {
665
- return name;
666
- } else {
667
- return 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));
635
+ log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
636
+ let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
637
+ 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);
638
+ if (outcome === undefined) {
639
+ return await waitForApiFragmentPush(endpoint, region, name, at);
668
640
  }
669
- });
670
- };
671
- let schemaPersistenceTableNameOutput;
672
- if (platformStackRef !== undefined) {
673
- let stackRef = Primitive_option.valFromOption(platformStackRef);
674
- schemaPersistenceTableNameOutput = Pulumi.all([
675
- readStackRefString(stackRef, "pluginSchemaPersistenceTableName"),
676
- readStackRefString(stackRef, "pluginRmTableName")
677
- ]).apply(param => {
678
- let dedicated = param[0];
679
- if (dedicated !== undefined) {
680
- return dedicated;
681
- } else {
682
- return param[1];
683
- }
684
- });
685
- } else {
686
- schemaPersistenceTableNameOutput = Pulumi.output(undefined);
687
- }
688
- return Output$Pulumi.flatMap(schemaPersistenceTableNameOutput, tableNameOpt => {
689
- let writeAndScanFragments = () => {
690
- if (tableNameOpt !== undefined) {
691
- let deployItem = Object.fromEntries([
692
- [
693
- "id",
694
- schemaPrefix + name
695
- ],
696
- [
697
- "fragment",
698
- pluginFragment.encoded
699
- ]
700
- ]);
701
- log.info("preResolversSchemaHook", undefined, `Writing deploy-schema entry for ` + name + ` to ` + tableNameOpt);
702
- let scanAllDeploySchemaItems = async () => {
703
- let allItems = [];
704
- let startKey;
705
- let more = true;
706
- while (more) {
707
- let result = await DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand({
708
- TableName: tableNameOpt,
709
- ExclusiveStartKey: startKey,
710
- ExpressionAttributeNames: Object.fromEntries([[
711
- "#id",
712
- "id"
713
- ]]),
714
- ExpressionAttributeValues: Object.fromEntries([[
715
- ":prefix",
716
- schemaPrefix
717
- ]]),
718
- FilterExpression: "begins_with(#id, :prefix)"
719
- }));
720
- Stdlib_Option.getOr(result.Items, []).forEach(item => {
721
- allItems.push(item);
722
- });
723
- let k = result.LastEvaluatedKey;
724
- if (k !== undefined) {
725
- startKey = k;
726
- } else {
727
- more = false;
728
- }
729
- };
730
- return allItems;
731
- };
732
- return Stdlib_Promise.$$catch(DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
733
- Item: deployItem,
734
- TableName: tableNameOpt
735
- })).then(param => {
736
- log.info("preResolversSchemaHook", undefined, `Scanning ` + tableNameOpt + ` for deploy-schema entries`);
737
- return scanAllDeploySchemaItems();
738
- }).then(items => {
739
- let fragments = Stdlib_Array.filterMap(items, item => {
740
- try {
741
- let obj = JSON.parse(JSON.stringify(item));
742
- let fragmentJson = Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(obj), d => d["fragment"]);
743
- if (fragmentJson === undefined) {
744
- return;
745
- }
746
- let encoded = Stdlib_JSON.Decode.string(fragmentJson);
747
- if (encoded !== undefined) {
748
- return {
749
- encoded: encoded,
750
- protocol: "graphql"
751
- };
752
- } else {
753
- return;
754
- }
755
- } catch (exn) {
756
- return;
757
- }
758
- });
759
- log.info("preResolversSchemaHook", undefined, `Found ` + fragments.length.toString() + ` deploy-schema entries`);
760
- return Promise.resolve(fragments);
761
- }), err => {
762
- let msg = Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_JsExn.fromException(err), Stdlib_JsExn.message), "unknown");
763
- log.info("preResolversSchemaHook", undefined, `DynamoDB write/scan failed (` + msg + `) — using current plugin only`);
764
- return Promise.resolve([pluginFragment]);
765
- });
766
- }
767
- log.info("preResolversSchemaHook", undefined, "No pluginSchemaPersistenceTableName / pluginRmTableName — skipping fragment persistence");
768
- return Promise.resolve([pluginFragment]);
769
- };
770
- return Output$Pulumi.flatMap(targetApi, api => Output$Pulumi.flatMap(api.id, apiId => {
771
- let runSchemaPush = () => writeAndScanFragments().then(async allPluginFragments => {
772
- let baseFragment;
773
- baseFragment = capturedDeployTarget === "Domain" ? (
774
- Config.splitApi ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", undefined)
775
- ) : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
776
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, allPluginFragments);
777
- let currentHash = AppSync_Adapter$ReventlessAws.sha256Hex(sdl);
778
- let storedHash = tableNameOpt !== undefined ? await readSchemaHash(tableNameOpt, apiId) : undefined;
779
- let client = AppSync_Adapter$ReventlessAws.getClient();
780
- let liveSdl = await AppSync_Adapter$ReventlessAws.getIntrospectionSdl(client, apiId);
781
- let countRoots = s => (GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Mutation") + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Query") | 0) + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Subscription") | 0;
782
- let missingFields = GraphQL_Stitcher$ReventlessCore.missingRootFields(sdl, liveSdl);
783
- let skipPush = storedHash !== undefined && storedHash === currentHash ? (
784
- liveSdl === "" ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema could not be introspected — forcing repair push (check appsync:GetIntrospectionSchema permission)`), false) : (
785
- missingFields.length !== 0 ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema is missing ` + missingFields.length.toString() + ` expected root field(s) (e.g. ` + missingFields.slice(0, 5).join(", ") + `) — forcing repair push`), false) : (log.info("preResolversSchemaHook", undefined, `SDL unchanged (hash ` + currentHash.slice(0, 12) + `…) and live schema is a superset of the expected root fields (` + countRoots(liveSdl).toString() + ` live); skipping push`), true)
786
- )
787
- ) : false;
788
- if (!skipPush) {
789
- if (GraphQL_Stitcher$ReventlessCore.isCatastrophicSchemaShrink(liveSdl, sdl, deploySchemaShrinkThreshold)) {
790
- return log.error("preResolversSchemaHook", undefined, `ABORTED schema push for ` + apiId + `: stitched SDL (` + countRoots(sdl).toString() + ` root field(s)) would catastrophically shrink the live schema (` + countRoots(liveSdl).toString() + ` root field(s), threshold ` + deploySchemaShrinkThreshold.toString() + `) — refusing to clobber resolvers (likely a stale concurrent-deploy scan)`);
641
+ let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
642
+ switch (typename) {
643
+ case "CommandAccepted" :
644
+ let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
645
+ if (eventCount > 0.0) {
646
+ return await waitForApiFragmentPush(endpoint, region, name, at);
791
647
  } else {
792
- log.info("preResolversSchemaHook", undefined, `Pushing schema to API ` + apiId + ` (` + allPluginFragments.length.toString() + ` plugin fragments, new hash: ` + currentHash.slice(0, 12) + `…)`);
793
- await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
794
- apiId: apiId,
795
- definition: sdl
796
- });
797
- log.info("preResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
798
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
799
- log.info("preResolversSchemaHook", undefined, "Schema is ACTIVE");
800
- if (tableNameOpt !== undefined) {
801
- return await writeSchemaHash(tableNameOpt, apiId, currentHash);
802
- } else {
803
- return;
804
- }
648
+ return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged no push needed`);
805
649
  }
806
- }
807
- });
808
- if (tableNameOpt !== undefined) {
809
- return AppSync_Adapter$ReventlessAws.withSchemaPushLock(tableNameOpt, apiId, undefined, undefined, runSchemaPush);
810
- } else {
811
- return runSchemaPush();
650
+ case "CommandRejected" :
651
+ let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
652
+ return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
653
+ default:
654
+ return await waitForApiFragmentPush(endpoint, region, name, at);
812
655
  }
813
- }));
656
+ };
657
+ return run();
814
658
  });
815
659
  };
816
660
  let hooks_preAdminResolversSchemaHook = adminBarrier => {
661
+ if (mergedApiMode) {
662
+ return adminBarrier;
663
+ }
817
664
  let match = splitApiOutputsRef.contents;
818
665
  let targetApiOpt = match !== undefined ? match.platformApi : (
819
666
  Config.splitApi ? undefined : domainApi
@@ -1100,6 +947,9 @@ function MakeWithConfig(Config) {
1100
947
  };
1101
948
  let makePlatform = (version, plugins) => {
1102
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
+ }
1103
953
  let scheduler = makeScheduler();
1104
954
  hooks_scheduler.contents = scheduler;
1105
955
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
@@ -1184,12 +1034,41 @@ function MakeWithConfig(Config) {
1184
1034
  hooks_scheduler.contents = scheduler;
1185
1035
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
1186
1036
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
1187
- 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
+ ) : [
1188
1040
  domainApi,
1189
1041
  domainApiRole
1190
1042
  ];
1191
1043
  let platformApiRole = match[1];
1192
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
+ }
1193
1072
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
1194
1073
  if (Config.splitApi) {
1195
1074
  splitApiOutputsRef.contents = {
@@ -1207,38 +1086,8 @@ function MakeWithConfig(Config) {
1207
1086
  }
1208
1087
  }
1209
1088
  let domainApiId = Output$Pulumi.flatMap(domainApi, api => api.id);
1210
- let updateApiSchema = async queryEngine => {
1211
- let apiId = domainApiId.get();
1212
- let plugins = await queryEngine.scan("Plugins", [[
1213
- "status",
1214
- "Contains",
1215
- {
1216
- TAG: "String",
1217
- _0: "Connected"
1218
- }
1219
- ]], 1000);
1220
- let fragments = Stdlib_Array.filterMap(plugins, json => {
1221
- try {
1222
- let state = S.parseOrThrow(json, PluginsReadModelSpec$ReventlessCore.stateSchema);
1223
- let match = state.apiTarget;
1224
- if (match === "Platform") {
1225
- return;
1226
- } else {
1227
- return state.apiSchemaFragment;
1228
- }
1229
- } catch (exn) {
1230
- return;
1231
- }
1232
- });
1233
- let baseFragment = Config.splitApi ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
1234
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, fragments);
1235
- return await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(AppSync_Adapter$ReventlessAws.getClient(), {
1236
- apiId: apiId,
1237
- definition: sdl
1238
- });
1239
- };
1240
1089
  let PluginExtensionPoint = Plugin_ExtensionPoint_Builder$ReventlessAws.MakeWithConfig({
1241
- updateApiSchema: updateApiSchema,
1090
+ updateApiSchema: undefined,
1242
1091
  manageSubscriptions: undefined
1243
1092
  });
1244
1093
  let admin = Admin.construct(version, [PluginExtensionPoint], [
@@ -1250,14 +1099,15 @@ function MakeWithConfig(Config) {
1250
1099
  ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1251
1100
  let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
1252
1101
  let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
1253
- let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
1254
- let r = ct.resources[0];
1255
- if (r !== undefined) {
1256
- return r.id;
1257
- } else {
1258
- return Pulumi.output("");
1259
- }
1260
- })), Pulumi.output(""));
1102
+ let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
1103
+ let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
1104
+ let r = ct.resources[0];
1105
+ if (r !== undefined) {
1106
+ return r.id;
1107
+ } else {
1108
+ return Pulumi.output("");
1109
+ }
1110
+ }) : Pulumi.output("");
1261
1111
  let apiSchemaPushEnv = Object.fromEntries([
1262
1112
  [
1263
1113
  "API_SCHEMA_PUSH_DOMAIN_API_ID",
@@ -1304,10 +1154,6 @@ function MakeWithConfig(Config) {
1304
1154
  } else {
1305
1155
  pluginReadModelTableName = undefined;
1306
1156
  }
1307
- let pluginSchemaPersistenceTable = Util_DynamoDb$ReventlessAws.makeTable([{
1308
- name: "id",
1309
- type: "S"
1310
- }], undefined, undefined, undefined, undefined, {}, "PluginSchemaPersistence");
1311
1157
  PluginExtensionPointRuntime_Builder$ReventlessAws.registerPluginExtensionPoint(pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined);
1312
1158
  let pluginEpEventTopicArn = Output$Pulumi.flatMap(admin.extensionPointsOutputs, eps => {
1313
1159
  let ep = eps.find(ep => ep.name === PluginExtensionPointSpec$ReventlessInfra.name);
@@ -1324,24 +1170,23 @@ function MakeWithConfig(Config) {
1324
1170
  return Pulumi.output("NOT_AVAILABLE");
1325
1171
  }
1326
1172
  });
1327
- let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
1328
- 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);
1173
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, Config.cloner, undefined);
1329
1174
  if (pluginReadModelTableName !== undefined) {
1330
1175
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
1331
1176
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
1332
1177
  }
1333
1178
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
1334
1179
  if (rm !== undefined) {
1335
- let r$2 = rm.queryDb.resources[0];
1336
- if (r$2 !== undefined) {
1337
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1180
+ let r$1 = rm.queryDb.resources[0];
1181
+ if (r$1 !== undefined) {
1182
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1338
1183
  }
1339
1184
  }
1340
1185
  let rm$1 = admin.readModelsOutputs["ApiFragments"];
1341
1186
  if (rm$1 !== undefined) {
1342
- let r$3 = rm$1.queryDb.resources[0];
1343
- if (r$3 !== undefined) {
1344
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
1187
+ let r$2 = rm$1.queryDb.resources[0];
1188
+ if (r$2 !== undefined) {
1189
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1345
1190
  }
1346
1191
  }
1347
1192
  if (Config.splitApi) {
@@ -1356,6 +1201,22 @@ function MakeWithConfig(Config) {
1356
1201
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1357
1202
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1358
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
+ }
1359
1220
  if (domainEventsApiOpt !== undefined) {
1360
1221
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
1361
1222
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -1363,11 +1224,12 @@ function MakeWithConfig(Config) {
1363
1224
  if (pluginReadModelTableName !== undefined) {
1364
1225
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
1365
1226
  }
1366
- Pulumi$Pulumi.$$export("pluginSchemaPersistenceTableName", pluginSchemaPersistenceTable.name);
1367
1227
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
1368
- 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));
1369
1231
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
1370
- 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));
1371
1233
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
1372
1234
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
1373
1235
  r.eventLog.resources,
@@ -1498,6 +1360,47 @@ function MakeWithConfig(Config) {
1498
1360
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
1499
1361
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
1500
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
+ }
1501
1404
  provisionPgChangeFeedRelay();
1502
1405
  let sel = QueryDbBackend$ReventlessAws.get();
1503
1406
  if (sel !== undefined) {
@@ -1623,6 +1526,17 @@ function Make($star) {
1623
1526
  id: Pulumi.output(roleName)
1624
1527
  };
1625
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
+ };
1626
1540
  let match;
1627
1541
  if (platformStackRef !== undefined) {
1628
1542
  let stackRef = Primitive_option.valFromOption(platformStackRef);
@@ -1630,7 +1544,7 @@ function Make($star) {
1630
1544
  let domainApiIdOutput = stackRef.getOutput("domainApiId");
1631
1545
  let domainApiEndpointOutput = stackRef.getOutput("domainApiEndpoint");
1632
1546
  let domainApiRoleArnOutput = stackRef.getOutput("domainApiRoleArn");
1633
- let phantomApi = Pulumi.all([
1547
+ Pulumi.all([
1634
1548
  domainApiIdOutput,
1635
1549
  domainApiEndpointOutput,
1636
1550
  defaultOutput
@@ -1642,7 +1556,7 @@ function Make($star) {
1642
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");
1643
1557
  return makePhantomApi(apiId, apiEndpoint);
1644
1558
  });
1645
- let phantomRole = Pulumi.all([
1559
+ Pulumi.all([
1646
1560
  domainApiRoleArnOutput,
1647
1561
  defaultOutput
1648
1562
  ]).apply(param => {
@@ -1652,7 +1566,7 @@ function Make($star) {
1652
1566
  let platformApiIdOutput = stackRef.getOutput("platformApiId");
1653
1567
  let platformApiEndpointOutput = stackRef.getOutput("platformApiEndpoint");
1654
1568
  let platformApiRoleArnOutput = stackRef.getOutput("platformApiRoleArn");
1655
- let phantomPlatformApi = Pulumi.all([
1569
+ Pulumi.all([
1656
1570
  platformApiIdOutput,
1657
1571
  platformApiEndpointOutput,
1658
1572
  defaultOutput
@@ -1663,7 +1577,7 @@ function Make($star) {
1663
1577
  let platformApiEndpoint = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[1], getFromDefault("platformApiEndpoint")), undefined);
1664
1578
  return makePhantomApi(platformApiId, platformApiEndpoint);
1665
1579
  });
1666
- let phantomPlatformRole = Pulumi.all([
1580
+ Pulumi.all([
1667
1581
  platformApiRoleArnOutput,
1668
1582
  defaultOutput
1669
1583
  ]).apply(param => {
@@ -1671,14 +1585,24 @@ function Make($star) {
1671
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));
1672
1586
  return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
1673
1587
  });
1674
- match = [
1675
- phantomApi,
1676
- phantomRole,
1677
- phantomPlatformApi,
1678
- phantomPlatformRole
1679
- ];
1680
- } else {
1681
- 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, {});
1682
1606
  let role = match$1[1];
1683
1607
  let api = match$1[0];
1684
1608
  match = [
@@ -1687,6 +1611,17 @@ function Make($star) {
1687
1611
  api,
1688
1612
  role
1689
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
+ ];
1690
1625
  }
1691
1626
  let domainApiRole = match[1];
1692
1627
  let domainApi = match[0];
@@ -1717,7 +1652,7 @@ function Make($star) {
1717
1652
  http: dnsHttp
1718
1653
  }));
1719
1654
  let api_name = Pulumi.output("");
1720
- let api$1 = {
1655
+ let api$2 = {
1721
1656
  apiId: api_apiId,
1722
1657
  apiArn: api_apiArn,
1723
1658
  dns: api_dns,
@@ -1725,7 +1660,7 @@ function Make($star) {
1725
1660
  };
1726
1661
  domainEventsApiOpt = {
1727
1662
  name: "DomainEventsApi",
1728
- api: api$1,
1663
+ api: api$2,
1729
1664
  defaultNamespace: undefined
1730
1665
  };
1731
1666
  } else {
@@ -1905,13 +1840,6 @@ function Make($star) {
1905
1840
  project: UiFragments_Projection$ReventlessCore.project,
1906
1841
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
1907
1842
  });
1908
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1909
- types: [],
1910
- mutations: [],
1911
- queries: [],
1912
- subscriptions: [],
1913
- subscriptionSources: []
1914
- });
1915
1843
  let Make$9 = FragmentConfig => {
1916
1844
  let Builder = Api_Builder$ReventlessCore.Make({
1917
1845
  makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
@@ -1926,38 +1854,6 @@ function Make($star) {
1926
1854
  let Api = {
1927
1855
  Make: Make$9
1928
1856
  };
1929
- let deploySchemaHashPrefix = "deploy-schema-hash:";
1930
- let readSchemaHash = async (tableName, apiId) => {
1931
- let key = Object.fromEntries([[
1932
- "id",
1933
- deploySchemaHashPrefix + apiId
1934
- ]]);
1935
- try {
1936
- let result = await DynamoDb_DocumentClient$AwsSdk.GetCommand.send(new LibDynamodb.GetCommand({
1937
- TableName: tableName,
1938
- Key: key
1939
- }));
1940
- return Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(result.Item, item => Stdlib_JSON.Decode.object(item)), d => d["hash"]), v => Stdlib_JSON.Decode.string(v));
1941
- } catch (exn) {
1942
- return;
1943
- }
1944
- };
1945
- let writeSchemaHash = async (tableName, apiId, hash) => {
1946
- let item = Object.fromEntries([
1947
- [
1948
- "id",
1949
- deploySchemaHashPrefix + apiId
1950
- ],
1951
- [
1952
- "hash",
1953
- hash
1954
- ]
1955
- ]);
1956
- await DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
1957
- Item: item,
1958
- TableName: tableName
1959
- }));
1960
- };
1961
1857
  let hooksApiRef = {
1962
1858
  contents: undefined
1963
1859
  };
@@ -1967,6 +1863,9 @@ function Make($star) {
1967
1863
  let hooksAdminApiRef = {
1968
1864
  contents: undefined
1969
1865
  };
1866
+ let mergedSchemaPushedRef = {
1867
+ contents: undefined
1868
+ };
1970
1869
  let resolveHookedApi = () => {
1971
1870
  let match = hooksApiRef.contents;
1972
1871
  if (match !== undefined) {
@@ -1983,34 +1882,6 @@ function Make($star) {
1983
1882
  return resolveHookedApi();
1984
1883
  }
1985
1884
  };
1986
- let deployWaiterDelay = ms => new Promise((resolve, param) => {
1987
- setTimeout(() => resolve(), ms);
1988
- });
1989
- let waitForApiFragmentPush = async (endpoint, region, pluginId, sinceAt) => {
1990
- let loop = async attempt => {
1991
- if (attempt >= 90) {
1992
- return Stdlib_JsError.throwWithMessage(`Timed out (>3min) waiting for the platform to push ` + pluginId + `'s API fragment — check the AdminEventCollector Lambda logs.`);
1993
- }
1994
- let data = await Util_AppSync_Caller$ReventlessAws.sendQuery(endpoint, region, "query { Platform_ApiFragments { pluginId pushStatus pushMessage pushedAt } }");
1995
- 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);
1996
- if (row !== undefined) {
1997
- let field = k => Stdlib_Option.getOr(Stdlib_Option.flatMap(row[k], Stdlib_JSON.Decode.string), "");
1998
- let status = field("pushStatus");
1999
- let fresh = field("pushedAt") >= sinceAt;
2000
- if (fresh && status === "ok") {
2001
- return log.info("registerFragmentViaApi", undefined, pluginId + ` schema push confirmed ACTIVE`);
2002
- } else if (fresh && status === "error") {
2003
- return Stdlib_JsError.throwWithMessage(`Schema push failed for ` + pluginId + `: ` + field("pushMessage"));
2004
- } else {
2005
- await deployWaiterDelay(2000);
2006
- return await loop(attempt + 1 | 0);
2007
- }
2008
- }
2009
- await deployWaiterDelay(2000);
2010
- return await loop(attempt + 1 | 0);
2011
- };
2012
- return await loop(0);
2013
- };
2014
1885
  let hooks_subscriptionInfraHook = Stdlib_Option.map(domainEventsApiOpt, eventsApi => (params => {
2015
1886
  let allEventTopics = params.allEventTopics;
2016
1887
  let allQueryDbs = params.allQueryDbs;
@@ -2030,253 +1901,22 @@ function Make($star) {
2030
1901
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
2031
1902
  }));
2032
1903
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
2033
- log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
2034
- let capturedDeployTarget = currentDeployTarget.contents;
2035
- if (platformStackRef !== undefined) {
2036
- let apiTargetName;
2037
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
2038
- let match = apiConfigRef.contents;
2039
- let platformApi = match !== undefined ? match.platformApi : domainApi;
2040
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
2041
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
2042
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
2043
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
2044
- let run = async () => {
2045
- let at = new Date().toISOString();
2046
- let variables = {
2047
- id: "registry",
2048
- pluginId: name,
2049
- fragment: {
2050
- encoded: pluginFragment.encoded,
2051
- protocol: pluginFragment.protocol
2052
- },
2053
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
2054
- at: at
2055
- };
2056
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
2057
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
2058
- 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);
2059
- if (outcome === undefined) {
2060
- return await waitForApiFragmentPush(endpoint, region, name, at);
2061
- }
2062
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
2063
- switch (typename) {
2064
- case "CommandAccepted" :
2065
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
2066
- if (eventCount > 0.0) {
2067
- return await waitForApiFragmentPush(endpoint, region, name, at);
2068
- } else {
2069
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
2070
- }
2071
- case "CommandRejected" :
2072
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
2073
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
2074
- default:
2075
- return await waitForApiFragmentPush(endpoint, region, name, at);
2076
- }
2077
- };
2078
- return run();
2079
- });
2080
- }
2081
- let match$1;
2082
- if (capturedDeployTarget === "Domain") {
2083
- match$1 = [
2084
- "deploy-schema:",
2085
- domainApi
2086
- ];
2087
- } else {
2088
- let match$2 = apiConfigRef.contents;
2089
- let api = match$2 !== undefined ? match$2.platformApi : domainApi;
2090
- match$1 = [
2091
- "deploy-schema-platform:",
2092
- api
2093
- ];
2094
- }
2095
- let targetApi = match$1[1];
2096
- let schemaPrefix = match$1[0];
2097
- let readStackRefString = (stackRef, key) => {
2098
- let direct = stackRef.getOutput(key);
2099
- let defaultOutput = stackRef.getOutput("default");
2100
- return Pulumi.all([
2101
- direct,
2102
- defaultOutput
2103
- ]).apply(param => {
2104
- let name = Stdlib_Option.flatMap(param[0], v => Stdlib_JSON.Decode.string(v));
2105
- if (name !== undefined) {
2106
- return name;
2107
- } else {
2108
- return 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));
2109
- }
2110
- });
2111
- };
2112
- let schemaPersistenceTableNameOutput;
2113
- if (platformStackRef !== undefined) {
2114
- let stackRef = Primitive_option.valFromOption(platformStackRef);
2115
- schemaPersistenceTableNameOutput = Pulumi.all([
2116
- readStackRefString(stackRef, "pluginSchemaPersistenceTableName"),
2117
- readStackRefString(stackRef, "pluginRmTableName")
2118
- ]).apply(param => {
2119
- let dedicated = param[0];
2120
- if (dedicated !== undefined) {
2121
- return dedicated;
2122
- } else {
2123
- return param[1];
2124
- }
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");
2125
1914
  });
2126
- } else {
2127
- schemaPersistenceTableNameOutput = Pulumi.output(undefined);
2128
- }
2129
- return Output$Pulumi.flatMap(schemaPersistenceTableNameOutput, tableNameOpt => {
2130
- let writeAndScanFragments = () => {
2131
- if (tableNameOpt !== undefined) {
2132
- let deployItem = Object.fromEntries([
2133
- [
2134
- "id",
2135
- schemaPrefix + name
2136
- ],
2137
- [
2138
- "fragment",
2139
- pluginFragment.encoded
2140
- ]
2141
- ]);
2142
- log.info("preResolversSchemaHook", undefined, `Writing deploy-schema entry for ` + name + ` to ` + tableNameOpt);
2143
- let scanAllDeploySchemaItems = async () => {
2144
- let allItems = [];
2145
- let startKey;
2146
- let more = true;
2147
- while (more) {
2148
- let result = await DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand({
2149
- TableName: tableNameOpt,
2150
- ExclusiveStartKey: startKey,
2151
- ExpressionAttributeNames: Object.fromEntries([[
2152
- "#id",
2153
- "id"
2154
- ]]),
2155
- ExpressionAttributeValues: Object.fromEntries([[
2156
- ":prefix",
2157
- schemaPrefix
2158
- ]]),
2159
- FilterExpression: "begins_with(#id, :prefix)"
2160
- }));
2161
- Stdlib_Option.getOr(result.Items, []).forEach(item => {
2162
- allItems.push(item);
2163
- });
2164
- let k = result.LastEvaluatedKey;
2165
- if (k !== undefined) {
2166
- startKey = k;
2167
- } else {
2168
- more = false;
2169
- }
2170
- };
2171
- return allItems;
2172
- };
2173
- return Stdlib_Promise.$$catch(DynamoDb_DocumentClient$AwsSdk.PutCommand.send(new LibDynamodb.PutCommand({
2174
- Item: deployItem,
2175
- TableName: tableNameOpt
2176
- })).then(param => {
2177
- log.info("preResolversSchemaHook", undefined, `Scanning ` + tableNameOpt + ` for deploy-schema entries`);
2178
- return scanAllDeploySchemaItems();
2179
- }).then(items => {
2180
- let fragments = Stdlib_Array.filterMap(items, item => {
2181
- try {
2182
- let obj = JSON.parse(JSON.stringify(item));
2183
- let fragmentJson = Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(obj), d => d["fragment"]);
2184
- if (fragmentJson === undefined) {
2185
- return;
2186
- }
2187
- let encoded = Stdlib_JSON.Decode.string(fragmentJson);
2188
- if (encoded !== undefined) {
2189
- return {
2190
- encoded: encoded,
2191
- protocol: "graphql"
2192
- };
2193
- } else {
2194
- return;
2195
- }
2196
- } catch (exn) {
2197
- return;
2198
- }
2199
- });
2200
- log.info("preResolversSchemaHook", undefined, `Found ` + fragments.length.toString() + ` deploy-schema entries`);
2201
- return Promise.resolve(fragments);
2202
- }), err => {
2203
- let msg = Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_JsExn.fromException(err), Stdlib_JsExn.message), "unknown");
2204
- log.info("preResolversSchemaHook", undefined, `DynamoDB write/scan failed (` + msg + `) — using current plugin only`);
2205
- return Promise.resolve([pluginFragment]);
2206
- });
2207
- }
2208
- log.info("preResolversSchemaHook", undefined, "No pluginSchemaPersistenceTableName / pluginRmTableName — skipping fragment persistence");
2209
- return Promise.resolve([pluginFragment]);
2210
- };
2211
- return Output$Pulumi.flatMap(targetApi, api => Output$Pulumi.flatMap(api.id, apiId => {
2212
- let runSchemaPush = () => writeAndScanFragments().then(async allPluginFragments => {
2213
- let baseFragment;
2214
- baseFragment = capturedDeployTarget === "Domain" ? emptyBaseFragment : AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
2215
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(baseFragment, allPluginFragments);
2216
- let currentHash = AppSync_Adapter$ReventlessAws.sha256Hex(sdl);
2217
- let storedHash = tableNameOpt !== undefined ? await readSchemaHash(tableNameOpt, apiId) : undefined;
2218
- let client = AppSync_Adapter$ReventlessAws.getClient();
2219
- let liveSdl = await AppSync_Adapter$ReventlessAws.getIntrospectionSdl(client, apiId);
2220
- let countRoots = s => (GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Mutation") + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Query") | 0) + GraphQL_Stitcher$ReventlessCore.countRootTypeFields(s, "Subscription") | 0;
2221
- let missingFields = GraphQL_Stitcher$ReventlessCore.missingRootFields(sdl, liveSdl);
2222
- let skipPush = storedHash !== undefined && storedHash === currentHash ? (
2223
- liveSdl === "" ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema could not be introspected — forcing repair push (check appsync:GetIntrospectionSchema permission)`), false) : (
2224
- missingFields.length !== 0 ? (log.info("preResolversSchemaHook", undefined, `hash matches but live schema is missing ` + missingFields.length.toString() + ` expected root field(s) (e.g. ` + missingFields.slice(0, 5).join(", ") + `) — forcing repair push`), false) : (log.info("preResolversSchemaHook", undefined, `SDL unchanged (hash ` + currentHash.slice(0, 12) + `…) and live schema is a superset of the expected root fields (` + countRoots(liveSdl).toString() + ` live); skipping push`), true)
2225
- )
2226
- ) : false;
2227
- if (!skipPush) {
2228
- if (GraphQL_Stitcher$ReventlessCore.isCatastrophicSchemaShrink(liveSdl, sdl, deploySchemaShrinkThreshold)) {
2229
- return log.error("preResolversSchemaHook", undefined, `ABORTED schema push for ` + apiId + `: stitched SDL (` + countRoots(sdl).toString() + ` root field(s)) would catastrophically shrink the live schema (` + countRoots(liveSdl).toString() + ` root field(s), threshold ` + deploySchemaShrinkThreshold.toString() + `) — refusing to clobber resolvers (likely a stale concurrent-deploy scan)`);
2230
- } else {
2231
- log.info("preResolversSchemaHook", undefined, `Pushing schema to API ` + apiId + ` (` + allPluginFragments.length.toString() + ` plugin fragments, new hash: ` + currentHash.slice(0, 12) + `…)`);
2232
- await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
2233
- apiId: apiId,
2234
- definition: sdl
2235
- });
2236
- log.info("preResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
2237
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
2238
- log.info("preResolversSchemaHook", undefined, "Schema is ACTIVE");
2239
- if (tableNameOpt !== undefined) {
2240
- return await writeSchemaHash(tableNameOpt, apiId, currentHash);
2241
- } else {
2242
- return;
2243
- }
2244
- }
2245
- }
2246
- });
2247
- if (tableNameOpt !== undefined) {
2248
- return AppSync_Adapter$ReventlessAws.withSchemaPushLock(tableNameOpt, apiId, undefined, undefined, runSchemaPush);
2249
- } else {
2250
- return runSchemaPush();
2251
- }
2252
- }));
2253
- });
2254
- };
2255
- let hooks_preAdminResolversSchemaHook = adminBarrier => {
2256
- let match = splitApiOutputsRef.contents;
2257
- let targetApiOpt = match !== undefined ? match.platformApi : undefined;
2258
- if (targetApiOpt !== undefined) {
2259
- let adminBaseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
2260
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(adminBaseFragment, []);
2261
- return Output$Pulumi.flatMap(Pulumi.all([
2262
- targetApiOpt,
2263
- adminBarrier
2264
- ]), param => Output$Pulumi.flatMap(param[0].id, apiId => {
2265
- log.info("preAdminResolversSchemaHook", undefined, `Pushing admin schema to ` + apiId);
2266
- let client = AppSync_Adapter$ReventlessAws.getClient();
2267
- return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
2268
- apiId: apiId,
2269
- definition: sdl
2270
- }).then(async () => {
2271
- log.info("preAdminResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
2272
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
2273
- return log.info("preAdminResolversSchemaHook", undefined, "schema is ACTIVE");
2274
- });
2275
- }));
2276
- }
2277
- 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)");
2278
- return adminBarrier;
1915
+ }));
1916
+ mergedSchemaPushedRef.contents = pushed;
1917
+ return pushed;
2279
1918
  };
1919
+ let hooks_preAdminResolversSchemaHook = adminBarrier => adminBarrier;
2280
1920
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
2281
1921
  let hooks_dcbAppSyncResolverHook = param => {
2282
1922
  let onAdminApi = param.onAdminApi;
@@ -2537,6 +2177,7 @@ function Make($star) {
2537
2177
  };
2538
2178
  let makePlatform = (version, plugins) => {
2539
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.");
2540
2181
  let scheduler = makeScheduler();
2541
2182
  hooks_scheduler.contents = scheduler;
2542
2183
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
@@ -2610,9 +2251,20 @@ function Make($star) {
2610
2251
  hooks_scheduler.contents = scheduler;
2611
2252
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
2612
2253
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
2613
- let match = AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {});
2254
+ let match = AppSync_Adapter$ReventlessAws.makeSourceApiResource("PlatformApi", adminSourceSdl(), {});
2614
2255
  let platformApiRole = match[1];
2615
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
+ };
2616
2268
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
2617
2269
  splitApiOutputsRef.contents = {
2618
2270
  platformApi: platformApi,
@@ -2628,37 +2280,8 @@ function Make($star) {
2628
2280
  };
2629
2281
  }
2630
2282
  let domainApiId = Output$Pulumi.flatMap(domainApi, api => api.id);
2631
- let updateApiSchema = async queryEngine => {
2632
- let apiId = domainApiId.get();
2633
- let plugins = await queryEngine.scan("Plugins", [[
2634
- "status",
2635
- "Contains",
2636
- {
2637
- TAG: "String",
2638
- _0: "Connected"
2639
- }
2640
- ]], 1000);
2641
- let fragments = Stdlib_Array.filterMap(plugins, json => {
2642
- try {
2643
- let state = S.parseOrThrow(json, PluginsReadModelSpec$ReventlessCore.stateSchema);
2644
- let match = state.apiTarget;
2645
- if (match === "Platform") {
2646
- return;
2647
- } else {
2648
- return state.apiSchemaFragment;
2649
- }
2650
- } catch (exn) {
2651
- return;
2652
- }
2653
- });
2654
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(emptyBaseFragment, fragments);
2655
- return await AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(AppSync_Adapter$ReventlessAws.getClient(), {
2656
- apiId: apiId,
2657
- definition: sdl
2658
- });
2659
- };
2660
2283
  let PluginExtensionPoint = Plugin_ExtensionPoint_Builder$ReventlessAws.MakeWithConfig({
2661
- updateApiSchema: updateApiSchema,
2284
+ updateApiSchema: undefined,
2662
2285
  manageSubscriptions: undefined
2663
2286
  });
2664
2287
  let admin = Admin.construct(version, [PluginExtensionPoint], [
@@ -2670,14 +2293,15 @@ function Make($star) {
2670
2293
  ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2671
2294
  let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
2672
2295
  let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
2673
- let apiSchemaPushCmdTopicUrl = Stdlib_Option.getOr(Stdlib_Option.map(admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name], agg => Output$Pulumi.flatMap(agg.commandTopic, ct => {
2674
- let r = ct.resources[0];
2675
- if (r !== undefined) {
2676
- return r.id;
2677
- } else {
2678
- return Pulumi.output("");
2679
- }
2680
- })), Pulumi.output(""));
2296
+ let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
2297
+ let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
2298
+ let r = ct.resources[0];
2299
+ if (r !== undefined) {
2300
+ return r.id;
2301
+ } else {
2302
+ return Pulumi.output("");
2303
+ }
2304
+ }) : Pulumi.output("");
2681
2305
  let apiSchemaPushEnv = Object.fromEntries([
2682
2306
  [
2683
2307
  "API_SCHEMA_PUSH_DOMAIN_API_ID",
@@ -2724,10 +2348,6 @@ function Make($star) {
2724
2348
  } else {
2725
2349
  pluginReadModelTableName = undefined;
2726
2350
  }
2727
- let pluginSchemaPersistenceTable = Util_DynamoDb$ReventlessAws.makeTable([{
2728
- name: "id",
2729
- type: "S"
2730
- }], undefined, undefined, undefined, undefined, {}, "PluginSchemaPersistence");
2731
2351
  PluginExtensionPointRuntime_Builder$ReventlessAws.registerPluginExtensionPoint(pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined);
2732
2352
  let pluginEpEventTopicArn = Output$Pulumi.flatMap(admin.extensionPointsOutputs, eps => {
2733
2353
  let ep = eps.find(ep => ep.name === PluginExtensionPointSpec$ReventlessInfra.name);
@@ -2744,24 +2364,23 @@ function Make($star) {
2744
2364
  return Pulumi.output("NOT_AVAILABLE");
2745
2365
  }
2746
2366
  });
2747
- let r$1 = Stdlib_Option.flatMap(admin.readModelsOutputs["ApiFragments"], rm => rm.queryDb.resources[0]);
2748
- 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);
2367
+ PluginRuntime_Builder$ReventlessAws.registerConfig(pluginEpEventTopicArn, pluginReadModelTableName, hooks_schedulerRoleUrn.contents, undefined, undefined, domainApiId, false, undefined);
2749
2368
  if (pluginReadModelTableName !== undefined) {
2750
2369
  AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(pluginReadModelTableName);
2751
2370
  Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, pluginReadModelTableName, {});
2752
2371
  }
2753
2372
  let rm = admin.stateViewSlicesOutputs["UiFragments"];
2754
2373
  if (rm !== undefined) {
2755
- let r$2 = rm.queryDb.resources[0];
2756
- if (r$2 !== undefined) {
2757
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2374
+ let r$1 = rm.queryDb.resources[0];
2375
+ if (r$1 !== undefined) {
2376
+ Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2758
2377
  }
2759
2378
  }
2760
2379
  let rm$1 = admin.readModelsOutputs["ApiFragments"];
2761
2380
  if (rm$1 !== undefined) {
2762
- let r$3 = rm$1.queryDb.resources[0];
2763
- if (r$3 !== undefined) {
2764
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$3.name, admin.adminSchemaPushed, {});
2381
+ let r$2 = rm$1.queryDb.resources[0];
2382
+ if (r$2 !== undefined) {
2383
+ Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2765
2384
  }
2766
2385
  }
2767
2386
  Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
@@ -2770,6 +2389,22 @@ function Make($star) {
2770
2389
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
2771
2390
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2772
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
+ }
2773
2408
  if (domainEventsApiOpt !== undefined) {
2774
2409
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
2775
2410
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -2777,11 +2412,12 @@ function Make($star) {
2777
2412
  if (pluginReadModelTableName !== undefined) {
2778
2413
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
2779
2414
  }
2780
- Pulumi$Pulumi.$$export("pluginSchemaPersistenceTableName", pluginSchemaPersistenceTable.name);
2781
2415
  Plugin_Helpers$ReventlessCore.exportPlatformOutputs(admin.extensionPointsOutputs, admin.aggregatesOutputs, admin.readModelsOutputs, admin.dcbEventLogOutputs, admin.stateChangeSlicesOutputs, admin.stateViewSlicesOutputs, admin.automationSlicesOutputs, admin.outboundTranslationSlicesOutputs, admin.inboundTranslationSlicesOutputs);
2782
- 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));
2783
2419
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
2784
- 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));
2785
2421
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
2786
2422
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
2787
2423
  r.eventLog.resources,
@@ -2912,6 +2548,47 @@ function Make($star) {
2912
2548
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
2913
2549
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
2914
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
+ }
2915
2592
  provisionPgChangeFeedRelay();
2916
2593
  let sel = QueryDbBackend$ReventlessAws.get();
2917
2594
  if (sel !== undefined) {
@@ -2995,7 +2672,6 @@ function Make($star) {
2995
2672
 
2996
2673
  export {
2997
2674
  log,
2998
- deploySchemaShrinkThreshold,
2999
2675
  apiConfigRef,
3000
2676
  getApiConfig,
3001
2677
  splitApiOutputsRef,