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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/package.json +8 -8
  3. package/src/Platform.res +348 -707
  4. package/src/Platform.res.mjs +271 -739
  5. package/src/adapter/QueryDb/PgQueryResolver_Builder.res +4 -47
  6. package/src/adapter/QueryDb/PgQueryResolver_Builder.res.mjs +1 -30
  7. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +0 -11
  8. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs +0 -5
  9. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +6 -7
  10. package/src/components/Api/AppSync_Adapter.res +143 -101
  11. package/src/components/Api/AppSync_Adapter.res.mjs +60 -57
  12. package/src/components/Api/AppSync_MergedApi.res +218 -0
  13. package/src/components/Api/AppSync_MergedApi.res.mjs +122 -0
  14. package/src/components/Api/AppSync_SdlDecorate.res +49 -61
  15. package/src/components/Api/AppSync_SdlDecorate.res.mjs +38 -29
  16. package/src/components/Plugin.res.mjs +1 -2
  17. package/tests/AppSync_AdapterTest.res +184 -0
  18. package/tests/AppSync_AdapterTest.res.mjs +136 -0
  19. package/tests/AppSync_SdlDecorateTest.res +33 -86
  20. package/tests/AppSync_SdlDecorateTest.res.mjs +26 -71
  21. package/tests/MCP_LambdaTest.res +4 -6
  22. package/tests/MCP_LambdaTest.res.mjs +2 -2
  23. package/src/adapter/Api/ApiFragmentDeregistration.res +0 -138
  24. package/src/adapter/Api/ApiFragmentDeregistration.res.mjs +0 -108
  25. package/src/adapter/Api/ApiSchemaPush.res +0 -79
  26. package/src/adapter/Api/ApiSchemaPush.res.mjs +0 -64
  27. package/src/adapter/Api/Platform_ApiFragments_Lambda.res +0 -222
  28. package/src/adapter/Api/Platform_ApiFragments_Lambda.res.mjs +0 -202
  29. package/src/adapter/QueryDb/NodeResolver_AppSync.res +0 -71
  30. package/src/adapter/QueryDb/NodeResolver_AppSync.res.mjs +0 -44
  31. package/src/adapter/Runtime/ApiSchemaPush_Runtime.mjs +0 -204
  32. package/tests/ApiSchemaPushTest.res +0 -32
  33. package/tests/ApiSchemaPushTest.res.mjs +0 -20
@@ -11,8 +11,6 @@ import * as Output$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Output
11
11
  import * as Pulumi$Pulumi from "@reventlessdev/rescript-pulumi-pulumi/src/Pulumi.res.mjs";
12
12
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
13
13
  import * as Pulumi from "@pulumi/pulumi";
14
- import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
15
- import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
16
14
  import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
17
15
  import * as Plugin$ReventlessAws from "./components/Plugin.res.mjs";
18
16
  import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
@@ -24,11 +22,9 @@ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/co
24
22
  import * as DcbBackend$ReventlessAws from "./adapter/DcbEventLog/DcbBackend.res.mjs";
25
23
  import * as ReadModel$ReventlessCore from "@reventlessdev/reventless-core/src/components/ReadModel/ReadModel.res.mjs";
26
24
  import * as PluginSpec$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginSpec.res.mjs";
27
- import * as Api_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/Api_Builder.res.mjs";
28
25
  import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs";
29
26
  import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments.res.mjs";
30
27
  import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
31
- import * as ApiSchemaPush$ReventlessAws from "./adapter/Api/ApiSchemaPush.res.mjs";
32
28
  import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
33
29
  import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
34
30
  import * as QueryDbBackend$ReventlessAws from "./adapter/QueryDb/QueryDbBackend.res.mjs";
@@ -42,6 +38,7 @@ import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjection
42
38
  import * as Util_LocalConfig$ReventlessAws from "./util/Util_LocalConfig.res.mjs";
43
39
  import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
44
40
  import * as AppSync_EventsApi$ReventlessAws from "./adapter/Api/AppSync_EventsApi.res.mjs";
41
+ import * as AppSync_MergedApi$ReventlessAws from "./components/Api/AppSync_MergedApi.res.mjs";
45
42
  import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
46
43
  import * as NoEventMappings$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/NoEventMappings.res.mjs";
47
44
  import * as Util_HostUiDomain$ReventlessAws from "./util/Util_HostUiDomain.res.mjs";
@@ -49,8 +46,8 @@ import * as DcbEventLogStorage$ReventlessAws from "./adapter/DcbEventLog/DcbEven
49
46
  import * as ExtensionMapping$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/ExtensionMapping.res.mjs";
50
47
  import * as PluginsProjection$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginsProjection.res.mjs";
51
48
  import * as StateTopic_AppSync$ReventlessAws from "./adapter/StateTopic/StateTopic_AppSync.res.mjs";
49
+ import * as AppSync_SdlDecorate$ReventlessAws from "./components/Api/AppSync_SdlDecorate.res.mjs";
52
50
  import * as UiFragmentRegistry$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry.res.mjs";
53
- import * as Util_AppSync_Caller$ReventlessAws from "./util/Util_AppSync_Caller.res.mjs";
54
51
  import * as Util_ResourceNaming$ReventlessAws from "./util/Util_ResourceNaming.res.mjs";
55
52
  import * as ClonerRunner_Fargate$ReventlessAws from "./plugin/cloner/ClonerRunner_Fargate.res.mjs";
56
53
  import * as QueryEngine_DynamoDb$ReventlessAws from "./adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs";
@@ -59,28 +56,21 @@ import * as PluginsReadModelSpec$ReventlessCore from "@reventlessdev/reventless-
59
56
  import * as ExtensionPoint_Builder$ReventlessAws from "./components/ExtensionPoint_Builder.res.mjs";
60
57
  import * as StateViewSlice_Builder$ReventlessAws from "./components/StateViewSlice_Builder.res.mjs";
61
58
  import * as Task_Builder_PerBucket$ReventlessAws from "./components/Task_Builder_PerBucket.res.mjs";
62
- import * as ApiFragmentsProjection$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentsProjection.res.mjs";
63
59
  import * as AutomationSlice_Builder$ReventlessAws from "./components/AutomationSlice_Builder.res.mjs";
64
60
  import * as EventTopicPublisher_SNS$ReventlessAws from "./adapter/EventTopic/EventTopicPublisher_SNS.res.mjs";
65
61
  import * as ExtensionPointMapping$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/ExtensionPointMapping.res.mjs";
66
62
  import * as PgQueryResolver_Builder$ReventlessAws from "./adapter/QueryDb/PgQueryResolver_Builder.res.mjs";
67
63
  import * as UiFragments_Projection$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments_Projection.res.mjs";
68
64
  import * as Aggregate_Builder_Single$ReventlessAws from "./components/Aggregate_Builder_Single.res.mjs";
69
- import * as ApiFragmentRegistrySpec$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentRegistrySpec.res.mjs";
70
65
  import * as ReadModel_Builder_Single$ReventlessAws from "./components/ReadModel_Builder_Single.res.mjs";
71
- import * as SideEffectHandler_Single$ReventlessAws from "./components/SideEffectHandler_Single.res.mjs";
72
66
  import * as StateChangeSlice_Builder$ReventlessAws from "./components/StateChangeSlice_Builder.res.mjs";
73
- import * as ApiFragmentDeregistration$ReventlessAws from "./adapter/Api/ApiFragmentDeregistration.res.mjs";
74
67
  import * as EventCollectorChannel_SQS$ReventlessAws from "./adapter/EventCollector/EventCollectorChannel_SQS.res.mjs";
75
68
  import * as PgChangeFeedRelay_Builder$ReventlessAws from "./adapter/Postgres/PgChangeFeedRelay_Builder.res.mjs";
76
69
  import * as RuntimeEnvironment_Lambda$ReventlessAws from "./adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs";
77
- import * as ApiFragmentsReadModelSpec$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentsReadModelSpec.res.mjs";
78
70
  import * as PluginExtensionPointSpec$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/PluginExtensionPointSpec.res.mjs";
79
71
  import * as Platform_UIFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_UIFragments_Lambda.res.mjs";
80
- import * as ApiFragmentRegistryBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/ApiFragmentRegistry/ApiFragmentRegistryBehavior.res.mjs";
81
72
  import * as CommandTopicChannel_SQS_Sync$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs";
82
73
  import * as EventLogSubscription_AppSync$ReventlessAws from "./adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs";
83
- import * as Platform_ApiFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_ApiFragments_Lambda.res.mjs";
84
74
  import * as UiFragmentRegistry_Behavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry_Behavior.res.mjs";
85
75
  import * as CommandTopicChannel_SQS_Async$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
86
76
  import * as Plugin_ExtensionPoint_Builder$ReventlessAws from "./plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs";
@@ -96,13 +86,11 @@ import * as CommandGeneratorResolvers_AppSync$ReventlessAws from "./adapter/Comm
96
86
  import * as EventTopicPublisher_DynamoDbStream$ReventlessAws from "./adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs";
97
87
  import * as InboundTranslationResolvers_AppSync$ReventlessAws from "./adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res.mjs";
98
88
  import * as PluginExtensionPointRuntime_Builder$ReventlessAws from "./plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs";
99
- import * as ReadModel_Builder_NoResolver_Stream$ReventlessAws from "./components/ReadModel_Builder_NoResolver_Stream.res.mjs";
100
89
  import * as EventCollectorRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs";
101
90
  import * as Platform_ComponentDefinitions_Lambda$ReventlessAws from "./adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs";
102
91
  import * as StateViewSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs";
103
92
  import * as AggregateRuntime_Builder_Single_Async$ReventlessAws from "./adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs";
104
93
  import * as AutomationSliceRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs";
105
- import * as SideEffectHandlerRuntime_Builder_Single$ReventlessAws from "./adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs";
106
94
 
107
95
  let log = Logger$ReventlessCore.fromEnv();
108
96
 
@@ -147,85 +135,44 @@ function MakeWithConfig(Config) {
147
135
  });
148
136
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
149
137
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
150
- QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
151
138
  });
152
139
  let currentDeployTarget = {
153
140
  contents: "Domain"
154
141
  };
155
142
  let platformStackRef = Stdlib_Option.map(new Pulumi.Config("platform").get("stack"), stack => new Pulumi.StackReference(stack));
156
- let makePhantomApi = (apiId, apiEndpoint) => ({
157
- id: Pulumi.output(apiId),
158
- arn: Pulumi.output(""),
159
- name: Pulumi.output(""),
160
- uris: Pulumi.output({
161
- GRAPHQL: apiEndpoint,
162
- REALTIME: ""
163
- })
143
+ let domainBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
144
+ types: [],
145
+ mutations: [],
146
+ queries: [" Platform_ping: String"],
147
+ subscriptions: [],
148
+ subscriptionSources: []
164
149
  });
165
- let makePhantomRole = apiRoleArn => {
166
- let roleName = Stdlib_Option.getOr(apiRoleArn.split("/").at(-1), apiRoleArn);
167
- return {
168
- arn: Pulumi.output(apiRoleArn),
169
- name: Pulumi.output(roleName),
170
- id: Pulumi.output(roleName)
171
- };
150
+ let adminSourceSdl = () => {
151
+ let baseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", undefined);
152
+ return AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(baseFragment));
172
153
  };
173
154
  let match;
174
155
  if (platformStackRef !== undefined) {
175
156
  let stackRef = Primitive_option.valFromOption(platformStackRef);
176
157
  let defaultOutput = stackRef.getOutput("default");
177
- let domainApiIdOutput = stackRef.getOutput("domainApiId");
178
- let domainApiEndpointOutput = stackRef.getOutput("domainApiEndpoint");
179
- let domainApiRoleArnOutput = stackRef.getOutput("domainApiRoleArn");
180
- let phantomApi = Pulumi.all([
181
- domainApiIdOutput,
182
- domainApiEndpointOutput,
158
+ let cognitoPoolIdOutput = stackRef.getOutput("cognitoUserPoolId");
159
+ let cognitoRegionOutput = stackRef.getOutput("cognitoRegion");
160
+ let userPoolConfig = Pulumi.all([
161
+ cognitoPoolIdOutput,
162
+ cognitoRegionOutput,
183
163
  defaultOutput
184
164
  ]).apply(param => {
185
165
  let $$default = param[2];
186
- let directEndpoint = param[1];
187
- let directId = param[0];
188
- let apiId = directId !== undefined ? directId : Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d["domainApiId"]), v => Stdlib_JSON.Decode.string(v)), undefined);
189
- 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");
190
- return makePhantomApi(apiId, apiEndpoint);
191
- });
192
- let phantomRole = Pulumi.all([
193
- domainApiRoleArnOutput,
194
- defaultOutput
195
- ]).apply(param => {
196
- let direct = param[0];
197
- return makePhantomRole(direct !== undefined ? direct : Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d["domainApiRoleArn"]), v => Stdlib_JSON.Decode.string(v)), undefined));
198
- });
199
- let platformApiIdOutput = stackRef.getOutput("platformApiId");
200
- let platformApiEndpointOutput = stackRef.getOutput("platformApiEndpoint");
201
- let platformApiRoleArnOutput = stackRef.getOutput("platformApiRoleArn");
202
- let phantomPlatformApi = Pulumi.all([
203
- platformApiIdOutput,
204
- platformApiEndpointOutput,
205
- defaultOutput
206
- ]).apply(param => {
207
- let $$default = param[2];
208
- 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));
209
- let platformApiId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiId")), undefined);
210
- let platformApiEndpoint = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[1], getFromDefault("platformApiEndpoint")), undefined);
211
- return makePhantomApi(platformApiId, platformApiEndpoint);
212
- });
213
- let phantomPlatformRole = Pulumi.all([
214
- platformApiRoleArnOutput,
215
- defaultOutput
216
- ]).apply(param => {
217
- let $$default = param[1];
218
166
  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
- return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
167
+ let userPoolId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("cognitoUserPoolId")), "Platform stack does not export 'cognitoUserPoolId' — redeploy the platform stack first");
168
+ let awsRegion = Stdlib_Option.orElse(param[1], getFromDefault("cognitoRegion"));
169
+ return {
170
+ userPoolId: userPoolId,
171
+ defaultAction: "ALLOW",
172
+ awsRegion: awsRegion
173
+ };
220
174
  });
221
- match = [
222
- phantomApi,
223
- phantomRole,
224
- phantomPlatformApi,
225
- phantomPlatformRole
226
- ];
227
- } else {
228
- let match$1 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
175
+ let match$1 = AppSync_Adapter$ReventlessAws.makePluginSourceApiResource("PluginSourceApi", userPoolConfig, {});
229
176
  let role = match$1[1];
230
177
  let api = match$1[0];
231
178
  match = [
@@ -234,6 +181,17 @@ function MakeWithConfig(Config) {
234
181
  api,
235
182
  role
236
183
  ];
184
+ } else {
185
+ let schema = Config.splitApi ? AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(domainBaseFragment)) : adminSourceSdl();
186
+ let match$2 = AppSync_Adapter$ReventlessAws.makeSourceApiResource("DomainApi", schema, {});
187
+ let role$1 = match$2[1];
188
+ let api$1 = match$2[0];
189
+ match = [
190
+ api$1,
191
+ role$1,
192
+ api$1,
193
+ role$1
194
+ ];
237
195
  }
238
196
  let domainApiRole = match[1];
239
197
  let domainApi = match[0];
@@ -264,7 +222,7 @@ function MakeWithConfig(Config) {
264
222
  http: dnsHttp
265
223
  }));
266
224
  let api_name = Pulumi.output("");
267
- let api$1 = {
225
+ let api$2 = {
268
226
  apiId: api_apiId,
269
227
  apiArn: api_apiArn,
270
228
  dns: api_dns,
@@ -272,7 +230,7 @@ function MakeWithConfig(Config) {
272
230
  };
273
231
  domainEventsApiOpt = {
274
232
  name: "DomainEventsApi",
275
- api: api$1,
233
+ api: api$2,
276
234
  defaultNamespace: undefined
277
235
  };
278
236
  } else {
@@ -452,28 +410,6 @@ function MakeWithConfig(Config) {
452
410
  project: UiFragments_Projection$ReventlessCore.project,
453
411
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
454
412
  });
455
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
456
- types: [],
457
- mutations: [],
458
- queries: [],
459
- subscriptions: [],
460
- subscriptionSources: []
461
- });
462
- let Make$8 = FragmentConfig => {
463
- let Builder = Api_Builder$ReventlessCore.Make({
464
- makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
465
- generateFragment: AppSync_Adapter$ReventlessAws.generateFragment,
466
- updateSchema: AppSync_Adapter$ReventlessAws.updateSchema
467
- });
468
- let effectiveBaseFragment = Config.splitApi ? emptyBaseFragment : FragmentConfig.baseFragment;
469
- let make = (name, opts) => Builder.make(name, effectiveBaseFragment, opts);
470
- return {
471
- make: make
472
- };
473
- };
474
- let Api = {
475
- Make: Make$8
476
- };
477
413
  let hooksApiRef = {
478
414
  contents: undefined
479
415
  };
@@ -483,6 +419,9 @@ function MakeWithConfig(Config) {
483
419
  let hooksAdminApiRef = {
484
420
  contents: undefined
485
421
  };
422
+ let mergedSchemaPushedRef = {
423
+ contents: undefined
424
+ };
486
425
  let resolveHookedApi = () => {
487
426
  let match = hooksApiRef.contents;
488
427
  if (match !== undefined) {
@@ -499,34 +438,6 @@ function MakeWithConfig(Config) {
499
438
  return resolveHookedApi();
500
439
  }
501
440
  };
502
- let deployWaiterDelay = ms => new Promise((resolve, param) => {
503
- setTimeout(() => resolve(), ms);
504
- });
505
- let waitForApiFragmentPush = async (endpoint, region, pluginId, sinceAt) => {
506
- let loop = async attempt => {
507
- if (attempt >= 90) {
508
- return Stdlib_JsError.throwWithMessage(`Timed out (>3min) waiting for the platform to push ` + pluginId + `'s API fragment — check the AdminEventCollector Lambda logs.`);
509
- }
510
- let data = await Util_AppSync_Caller$ReventlessAws.sendQuery(endpoint, region, "query { Platform_ApiFragments { pluginId pushStatus pushMessage pushedAt } }");
511
- 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);
512
- if (row !== undefined) {
513
- let field = k => Stdlib_Option.getOr(Stdlib_Option.flatMap(row[k], Stdlib_JSON.Decode.string), "");
514
- let status = field("pushStatus");
515
- let fresh = field("pushedAt") >= sinceAt;
516
- if (fresh && status === "ok") {
517
- return log.info("registerFragmentViaApi", undefined, pluginId + ` schema push confirmed ACTIVE`);
518
- } else if (fresh && status === "error") {
519
- return Stdlib_JsError.throwWithMessage(`Schema push failed for ` + pluginId + `: ` + field("pushMessage"));
520
- } else {
521
- await deployWaiterDelay(2000);
522
- return await loop(attempt + 1 | 0);
523
- }
524
- }
525
- await deployWaiterDelay(2000);
526
- return await loop(attempt + 1 | 0);
527
- };
528
- return await loop(0);
529
- };
530
441
  let hooks_subscriptionInfraHook = Stdlib_Option.map(domainEventsApiOpt, eventsApi => (params => {
531
442
  let allEventTopics = params.allEventTopics;
532
443
  let allQueryDbs = params.allQueryDbs;
@@ -546,83 +457,22 @@ function MakeWithConfig(Config) {
546
457
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
547
458
  }));
548
459
  let hooks_preResolversSchemaHook = (name, version, pluginFragment) => {
549
- log.info("preResolversSchemaHook", undefined, `Pushing schema for plugin ` + name + `@` + version + ` to AppSync`);
550
- let capturedDeployTarget = currentDeployTarget.contents;
551
- if (platformStackRef === undefined) {
552
- 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).");
553
- }
554
- let apiTargetName;
555
- apiTargetName = capturedDeployTarget === "Domain" ? "Domain" : "Platform";
556
- let match = apiConfigRef.contents;
557
- let platformApi = match !== undefined ? match.platformApi : domainApi;
558
- let region = Stdlib_Option.getOr(new Pulumi.Config("aws").get("region"), "unknown");
559
- let endpointOutput = Output$Pulumi.flatMap(platformApi, api => api.uris).apply(uris => uris.GRAPHQL);
560
- ApiFragmentDeregistration$ReventlessAws.make(name + `ApiFragmentRegistration`, name, endpointOutput, region, undefined);
561
- return Output$Pulumi.flatMap(endpointOutput, endpoint => {
562
- let run = async () => {
563
- let at = new Date().toISOString();
564
- let variables = {
565
- id: "registry",
566
- pluginId: name,
567
- fragment: {
568
- encoded: pluginFragment.encoded,
569
- protocol: pluginFragment.protocol
570
- },
571
- apiTarget: Util_AppSync_Caller$ReventlessAws.graphqlEnum(apiTargetName),
572
- at: at
573
- };
574
- log.info("registerFragmentViaApi", undefined, `Registering API fragment for ` + name + ` (` + apiTargetName + `) via ` + endpoint);
575
- let result = await Util_AppSync_Caller$ReventlessAws.sendMutation(endpoint, region, "Platform_ApiFragmentRegistry_RegisterApiFragment", "{ __typename ... on CommandAccepted { eventCount } ... on CommandRejected { errorCode errorDetail } }", variables);
576
- 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);
577
- if (outcome === undefined) {
578
- return await waitForApiFragmentPush(endpoint, region, name, at);
579
- }
580
- let typename = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["__typename"], Stdlib_JSON.Decode.string), "");
581
- switch (typename) {
582
- case "CommandAccepted" :
583
- let eventCount = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["eventCount"], Stdlib_JSON.Decode.float), 0.0);
584
- if (eventCount > 0.0) {
585
- return await waitForApiFragmentPush(endpoint, region, name, at);
586
- } else {
587
- return log.info("registerFragmentViaApi", undefined, name + ` fragment unchanged — no push needed`);
588
- }
589
- case "CommandRejected" :
590
- let code = Stdlib_Option.getOr(Stdlib_Option.flatMap(outcome["errorCode"], Stdlib_JSON.Decode.string), "unknown");
591
- return Stdlib_JsError.throwWithMessage(`RegisterApiFragment rejected for ` + name + `: ` + code);
592
- default:
593
- return await waitForApiFragmentPush(endpoint, region, name, at);
594
- }
595
- };
596
- return run();
597
- });
598
- };
599
- let hooks_preAdminResolversSchemaHook = adminBarrier => {
600
- let match = splitApiOutputsRef.contents;
601
- let targetApiOpt = match !== undefined ? match.platformApi : (
602
- Config.splitApi ? undefined : domainApi
603
- );
604
- if (targetApiOpt !== undefined) {
605
- let adminBaseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(Config.cloner), "Admin", AdminApi$ReventlessCore.systemCallerFieldNames);
606
- let sdl = AppSync_Adapter$ReventlessAws.stitchWithAwsDirectives(adminBaseFragment, []);
607
- return Output$Pulumi.flatMap(Pulumi.all([
608
- targetApiOpt,
609
- adminBarrier
610
- ]), param => Output$Pulumi.flatMap(param[0].id, apiId => {
611
- log.info("preAdminResolversSchemaHook", undefined, `Pushing admin schema to ` + apiId);
612
- let client = AppSync_Adapter$ReventlessAws.getClient();
613
- return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
614
- apiId: apiId,
615
- definition: sdl
616
- }).then(async () => {
617
- log.info("preAdminResolversSchemaHook", undefined, "startSchemaCreation called, waiting for ACTIVE");
618
- await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
619
- return log.info("preAdminResolversSchemaHook", undefined, "schema is ACTIVE");
620
- });
621
- }));
622
- }
623
- 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)");
624
- return adminBarrier;
460
+ let sdl = AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(pluginFragment);
461
+ let pushed = Output$Pulumi.flatMap(domainApi, api => Output$Pulumi.flatMap(api.id, apiId => {
462
+ log.info("preResolversSchemaHook", undefined, `Pushing subgraph schema for ` + name + `@` + version + ` to source API ` + apiId);
463
+ let client = AppSync_Adapter$ReventlessAws.getClient();
464
+ return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
465
+ apiId: apiId,
466
+ definition: sdl
467
+ }).then(async () => {
468
+ await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
469
+ return log.info("preResolversSchemaHook", undefined, "subgraph schema is ACTIVE");
470
+ });
471
+ }));
472
+ mergedSchemaPushedRef.contents = pushed;
473
+ return pushed;
625
474
  };
475
+ let hooks_preAdminResolversSchemaHook = adminBarrier => adminBarrier;
626
476
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
627
477
  let hooks_dcbAppSyncResolverHook = param => {
628
478
  let onAdminApi = param.onAdminApi;
@@ -744,40 +594,6 @@ function MakeWithConfig(Config) {
744
594
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
745
595
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
746
596
  })(PluginReadModelMappings);
747
- let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
748
- Id: Id$Reventless.$$String,
749
- name: ApiFragmentRegistrySpec$ReventlessCore.name,
750
- eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
751
- errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
752
- commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
753
- moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
754
- commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
755
- })({
756
- initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
757
- evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
758
- decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
759
- snapshot: undefined,
760
- moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
761
- })(NoEventMappings$ReventlessInfra.Make({
762
- name: ApiFragmentRegistrySpec$ReventlessCore.name,
763
- Id: Id$Reventless.$$String,
764
- commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
765
- }));
766
- let ApiFragmentsReadModelMappings = {
767
- moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
768
- mappings: ApiFragmentsProjection$ReventlessCore.mappings
769
- };
770
- let ApiFragmentsReadModel = ReadModel_Builder_NoResolver_Stream$ReventlessAws.Make({
771
- Id: Id$Reventless.$$String,
772
- name: ApiFragmentsReadModelSpec$ReventlessCore.name,
773
- moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
774
- stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
775
- config: ApiFragmentsReadModelSpec$ReventlessCore.config,
776
- subIdConfig: undefined,
777
- authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
778
- visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
779
- })(ApiFragmentsReadModelMappings);
780
- let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
781
597
  let makeScheduler = () => {
782
598
  let component = Scheduler$ReventlessAws.make(undefined);
783
599
  let outputs = Component$ReventlessCore.outputs(component);
@@ -883,96 +699,43 @@ function MakeWithConfig(Config) {
883
699
  };
884
700
  let makePlatform = (version, plugins) => {
885
701
  log.info("Platform", undefined, `v` + version);
702
+ return Pervasives.failwith("makePlatform is not supported on AWS — deploy the platform with deployPlatform and each plugin with deployPlugin (merged-API composition).");
703
+ };
704
+ let deployPlatform = (version, hostUiBundle) => {
705
+ log.info("Platform:deployPlatform", undefined, `v` + version);
886
706
  let scheduler = makeScheduler();
887
707
  hooks_scheduler.contents = scheduler;
888
708
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
889
709
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
890
- let match = Config.splitApi ? AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {}) : [
710
+ let match = Config.splitApi ? AppSync_Adapter$ReventlessAws.makeSourceApiResource("PlatformApi", adminSourceSdl(), {}) : [
891
711
  domainApi,
892
712
  domainApiRole
893
713
  ];
894
714
  let platformApiRole = match[1];
895
715
  let platformApi = match[0];
896
- hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
716
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), AppSync_MergedApi$ReventlessAws.primaryAuthMode);
717
+ let domainMerged = AppSync_MergedApi$ReventlessAws.make("DomainMergedApi", {});
718
+ let mergedOutputs;
897
719
  if (Config.splitApi) {
898
- splitApiOutputsRef.contents = {
899
- platformApi: platformApi,
900
- platformApiRole: platformApiRole
720
+ let platformMerged = AppSync_MergedApi$ReventlessAws.make("PlatformMergedApi", {});
721
+ let platformAssoc = AppSync_MergedApi$ReventlessAws.associateSource("PlatformAdminSourceAssociation", platformMerged, platformApi, {});
722
+ let domainAssoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainBaseSourceAssociation", domainMerged, domainApi, {});
723
+ mergedOutputs = {
724
+ domainMerged: domainMerged,
725
+ platformMerged: platformMerged,
726
+ domainMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, domainAssoc),
727
+ platformMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(platformMerged, platformAssoc)
901
728
  };
902
- let c = apiConfigRef.contents;
903
- if (c !== undefined) {
904
- apiConfigRef.contents = {
905
- domainApi: c.domainApi,
906
- domainApiRole: c.domainApiRole,
907
- platformApi: platformApi,
908
- platformApiRole: platformApiRole
909
- };
910
- }
911
- }
912
- let admin = Admin.construct(version, [], [
913
- PluginAggregate,
914
- ApiFragmentRegistryAggregate
915
- ], [
916
- PluginReadModel,
917
- ApiFragmentsReadModel
918
- ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
919
- let pluginRm = admin.readModelsOutputs["Plugins"];
920
- if (pluginRm !== undefined) {
921
- let r = pluginRm.queryDb.resources[0];
922
- if (r !== undefined) {
923
- Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, r.name, {});
924
- AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(r.name);
925
- }
926
- }
927
- let rm = admin.stateViewSlicesOutputs["UiFragments"];
928
- if (rm !== undefined) {
929
- let r$1 = rm.queryDb.resources[0];
930
- if (r$1 !== undefined) {
931
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
932
- }
933
- }
934
- let rm$1 = admin.readModelsOutputs["ApiFragments"];
935
- if (rm$1 !== undefined) {
936
- let r$2 = rm$1.queryDb.resources[0];
937
- if (r$2 !== undefined) {
938
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
939
- }
940
- }
941
- let pluginComponents = plugins.map(plugin => plugin.make());
942
- let pluginComponent = pluginComponents[0];
943
- if (pluginComponent !== undefined) {
944
- Plugin_Helpers$ReventlessCore.exportPluginOutputs(Component$ReventlessCore.outputs(Primitive_option.valFromOption(pluginComponent)));
945
- }
946
- provisionPgChangeFeedRelay();
947
- let sel = QueryDbBackend$ReventlessAws.get();
948
- if (sel !== undefined) {
949
- PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {}, undefined);
950
- }
951
- if (Config.splitApi) {
952
- Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
953
- Pulumi$Pulumi.$$export("platformApiEndpoint", Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL)));
954
- Pulumi$Pulumi.$$export("platformApiRoleArn", Output$Pulumi.flatMap(platformApiRole, role => role.arn));
955
729
  } else {
956
- Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
957
- Pulumi$Pulumi.$$export("platformApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
958
- Pulumi$Pulumi.$$export("platformApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
730
+ let assoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainAdminSourceAssociation", domainMerged, domainApi, {});
731
+ let gate = AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, assoc);
732
+ mergedOutputs = {
733
+ domainMerged: domainMerged,
734
+ platformMerged: domainMerged,
735
+ domainMergeGate: gate,
736
+ platformMergeGate: gate
737
+ };
959
738
  }
960
- Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
961
- Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
962
- Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
963
- };
964
- let deployPlatform = (version, hostUiBundle) => {
965
- log.info("Platform:deployPlatform", undefined, `v` + version);
966
- let scheduler = makeScheduler();
967
- hooks_scheduler.contents = scheduler;
968
- hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
969
- hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
970
- let match = Config.splitApi ? AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {}) : [
971
- domainApi,
972
- domainApiRole
973
- ];
974
- let platformApiRole = match[1];
975
- let platformApi = match[0];
976
739
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
977
740
  if (Config.splitApi) {
978
741
  splitApiOutputsRef.contents = {
@@ -994,62 +757,7 @@ function MakeWithConfig(Config) {
994
757
  updateApiSchema: undefined,
995
758
  manageSubscriptions: undefined
996
759
  });
997
- let admin = Admin.construct(version, [PluginExtensionPoint], [
998
- PluginAggregate,
999
- ApiFragmentRegistryAggregate
1000
- ], [
1001
- PluginReadModel,
1002
- ApiFragmentsReadModel
1003
- ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1004
- let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
1005
- let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
1006
- let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
1007
- let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
1008
- let r = ct.resources[0];
1009
- if (r !== undefined) {
1010
- return r.id;
1011
- } else {
1012
- return Pulumi.output("");
1013
- }
1014
- }) : Pulumi.output("");
1015
- let apiSchemaPushEnv = Object.fromEntries([
1016
- [
1017
- "API_SCHEMA_PUSH_DOMAIN_API_ID",
1018
- domainApiId
1019
- ],
1020
- [
1021
- "API_SCHEMA_PUSH_PLATFORM_API_ID",
1022
- Output$Pulumi.flatMap(platformApi, api => api.id)
1023
- ],
1024
- [
1025
- "API_SCHEMA_PUSH_SPLIT_API",
1026
- Pulumi.output(Config.splitApi ? "true" : "false")
1027
- ],
1028
- [
1029
- "API_SCHEMA_PUSH_CLONER",
1030
- Pulumi.output(Config.cloner ? "true" : "false")
1031
- ],
1032
- [
1033
- "API_SCHEMA_PUSH_CMD_TOPIC_URL",
1034
- apiSchemaPushCmdTopicUrl
1035
- ]
1036
- ]);
1037
- let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
1038
- Pulumi.all([
1039
- scheduler,
1040
- apiSchemaPushQueryEngine
1041
- ]).apply(param => {
1042
- AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
1043
- Source: {
1044
- name: ApiSchemaPush$ReventlessAws.Source.name,
1045
- Id: ApiSchemaPush$ReventlessAws.Source.Id,
1046
- eventSchema: ApiSchemaPush$ReventlessAws.Source.eventSchema
1047
- },
1048
- moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
1049
- execute: ApiSchemaPush$ReventlessAws.execute
1050
- }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
1051
- apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
1052
- });
760
+ let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
1053
761
  let pluginRm = admin.readModelsOutputs["Plugins"];
1054
762
  let pluginReadModelTableName;
1055
763
  if (pluginRm !== undefined) {
@@ -1086,13 +794,6 @@ function MakeWithConfig(Config) {
1086
794
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
1087
795
  }
1088
796
  }
1089
- let rm$1 = admin.readModelsOutputs["ApiFragments"];
1090
- if (rm$1 !== undefined) {
1091
- let r$2 = rm$1.queryDb.resources[0];
1092
- if (r$2 !== undefined) {
1093
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
1094
- }
1095
- }
1096
797
  if (Config.splitApi) {
1097
798
  Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
1098
799
  Pulumi$Pulumi.$$export("platformApiEndpoint", Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL)));
@@ -1105,6 +806,22 @@ function MakeWithConfig(Config) {
1105
806
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1106
807
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1107
808
  Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
809
+ if (mergedOutputs !== undefined) {
810
+ let platformMerged$1 = mergedOutputs.platformMerged;
811
+ let domainMerged$1 = mergedOutputs.domainMerged;
812
+ let mergeGatedArn = (merged, gate) => Pulumi.all([
813
+ Output$Pulumi.flatMap(merged.api, api => api.arn),
814
+ gate
815
+ ]).apply(param => param[0]);
816
+ let mergedEndpoint = merged => Output$Pulumi.flatMap(merged.api, api => api.uris.apply(uris => uris.GRAPHQL));
817
+ Pulumi$Pulumi.$$export("domainMergedApiArn", mergeGatedArn(domainMerged$1, mergedOutputs.domainMergeGate));
818
+ Pulumi$Pulumi.$$export("domainMergedApiId", Output$Pulumi.flatMap(domainMerged$1.api, api => api.id));
819
+ Pulumi$Pulumi.$$export("domainMergedApiEndpoint", mergedEndpoint(domainMerged$1));
820
+ Pulumi$Pulumi.$$export("platformMergedApiArn", mergeGatedArn(platformMerged$1, mergedOutputs.platformMergeGate));
821
+ Pulumi$Pulumi.$$export("platformMergedApiId", Output$Pulumi.flatMap(platformMerged$1.api, api => api.id));
822
+ Pulumi$Pulumi.$$export("platformMergedApiEndpoint", mergedEndpoint(platformMerged$1));
823
+ Pulumi$Pulumi.$$export("mergedApiPrimaryAuth", Pulumi.output(AppSync_MergedApi$ReventlessAws.primaryAuthMode));
824
+ }
1108
825
  if (domainEventsApiOpt !== undefined) {
1109
826
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
1110
827
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -1113,9 +830,11 @@ function MakeWithConfig(Config) {
1113
830
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
1114
831
  }
1115
832
  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));
833
+ let clientDomainApi = mergedOutputs !== undefined ? mergedOutputs.domainMerged.api : domainApi;
834
+ let clientPlatformApi = mergedOutputs !== undefined ? mergedOutputs.platformMerged.api : platformApi;
835
+ let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(clientDomainApi, api => api.uris.apply(uris => uris.GRAPHQL));
1117
836
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
1118
- let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL));
837
+ let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(clientPlatformApi, api => api.uris.apply(uris => uris.GRAPHQL));
1119
838
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
1120
839
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
1121
840
  r.eventLog.resources,
@@ -1246,10 +965,51 @@ function MakeWithConfig(Config) {
1246
965
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
1247
966
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
1248
967
  Plugin_Helpers$ReventlessCore.exportPluginOutputs(pluginOutputs);
968
+ if (platformStackRef !== undefined) {
969
+ let stackRef = Primitive_option.valFromOption(platformStackRef);
970
+ let defaultOutput = stackRef.getOutput("default");
971
+ let getMergedExport = key => {
972
+ let direct = stackRef.getOutput(key);
973
+ return Pulumi.all([
974
+ direct,
975
+ defaultOutput
976
+ ]).apply(param => {
977
+ let direct = param[0];
978
+ if (direct !== undefined) {
979
+ return direct;
980
+ } else {
981
+ 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`);
982
+ }
983
+ });
984
+ };
985
+ let mergedApiArn;
986
+ mergedApiArn = apiTarget === "Domain" ? getMergedExport("domainMergedApiArn") : getMergedExport("platformMergedApiArn");
987
+ let checkedMergedApiArn = Pulumi.all([
988
+ mergedApiArn,
989
+ getMergedExport("mergedApiPrimaryAuth")
990
+ ]).apply(param => {
991
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), param[1]);
992
+ return param[0];
993
+ });
994
+ let pushed = mergedSchemaPushedRef.contents;
995
+ let schemaPushed = pushed !== undefined ? pushed : Pulumi.output();
996
+ let arnAfterSchemaPush = Pulumi.all([
997
+ checkedMergedApiArn,
998
+ schemaPushed
999
+ ]).apply(param => param[0]);
1000
+ let association = AppSync_MergedApi$ReventlessAws.associateSourceWithMergedArn("PluginSourceAssociation", arnAfterSchemaPush, domainApi, {});
1001
+ let mergeGate = AppSync_MergedApi$ReventlessAws.mergeStatusGateWith(checkedMergedApiArn, association);
1002
+ Pulumi$Pulumi.$$export("sourceApiAssociationId", Pulumi.all([
1003
+ association.associationId,
1004
+ mergeGate
1005
+ ]).apply(param => param[0]));
1006
+ Pulumi$Pulumi.$$export("pluginSourceApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1007
+ Pulumi$Pulumi.$$export("pluginSourceApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1008
+ }
1249
1009
  provisionPgChangeFeedRelay();
1250
1010
  let sel = QueryDbBackend$ReventlessAws.get();
1251
1011
  if (sel !== undefined) {
1252
- PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {}, false);
1012
+ PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {});
1253
1013
  }
1254
1014
  let hbConfig = PluginRuntime_Builder$ReventlessAws.heartbeatConfigRef.contents;
1255
1015
  let match = IndexJs.isDryRun();
@@ -1312,7 +1072,6 @@ function MakeWithConfig(Config) {
1312
1072
  InboundTranslationSlice: {
1313
1073
  Make: InboundTranslationSlice.Make
1314
1074
  },
1315
- Api: Api,
1316
1075
  mcpSupported: false,
1317
1076
  Plugin: Plugin,
1318
1077
  makePlatform: makePlatform,
@@ -1348,85 +1107,44 @@ function Make($star) {
1348
1107
  });
1349
1108
  QueryDbBackend$ReventlessAws.exempt(PluginsReadModelSpec$ReventlessCore.name);
1350
1109
  QueryDbBackend$ReventlessAws.exempt(UiFragments$ReventlessCore.name);
1351
- QueryDbBackend$ReventlessAws.exempt(ApiFragmentsReadModelSpec$ReventlessCore.name);
1352
1110
  });
1353
1111
  let currentDeployTarget = {
1354
1112
  contents: "Domain"
1355
1113
  };
1356
1114
  let platformStackRef = Stdlib_Option.map(new Pulumi.Config("platform").get("stack"), stack => new Pulumi.StackReference(stack));
1357
- let makePhantomApi = (apiId, apiEndpoint) => ({
1358
- id: Pulumi.output(apiId),
1359
- arn: Pulumi.output(""),
1360
- name: Pulumi.output(""),
1361
- uris: Pulumi.output({
1362
- GRAPHQL: apiEndpoint,
1363
- REALTIME: ""
1364
- })
1115
+ let domainBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1116
+ types: [],
1117
+ mutations: [],
1118
+ queries: [" Platform_ping: String"],
1119
+ subscriptions: [],
1120
+ subscriptionSources: []
1365
1121
  });
1366
- let makePhantomRole = apiRoleArn => {
1367
- let roleName = Stdlib_Option.getOr(apiRoleArn.split("/").at(-1), apiRoleArn);
1368
- return {
1369
- arn: Pulumi.output(apiRoleArn),
1370
- name: Pulumi.output(roleName),
1371
- id: Pulumi.output(roleName)
1372
- };
1122
+ let adminSourceSdl = () => {
1123
+ let baseFragment = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(AdminApi$ReventlessCore.baseFragment(false), "Admin", undefined);
1124
+ return AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(baseFragment));
1373
1125
  };
1374
1126
  let match;
1375
1127
  if (platformStackRef !== undefined) {
1376
1128
  let stackRef = Primitive_option.valFromOption(platformStackRef);
1377
1129
  let defaultOutput = stackRef.getOutput("default");
1378
- let domainApiIdOutput = stackRef.getOutput("domainApiId");
1379
- let domainApiEndpointOutput = stackRef.getOutput("domainApiEndpoint");
1380
- let domainApiRoleArnOutput = stackRef.getOutput("domainApiRoleArn");
1381
- let phantomApi = Pulumi.all([
1382
- domainApiIdOutput,
1383
- domainApiEndpointOutput,
1130
+ let cognitoPoolIdOutput = stackRef.getOutput("cognitoUserPoolId");
1131
+ let cognitoRegionOutput = stackRef.getOutput("cognitoRegion");
1132
+ let userPoolConfig = Pulumi.all([
1133
+ cognitoPoolIdOutput,
1134
+ cognitoRegionOutput,
1384
1135
  defaultOutput
1385
1136
  ]).apply(param => {
1386
1137
  let $$default = param[2];
1387
- let directEndpoint = param[1];
1388
- let directId = param[0];
1389
- let apiId = directId !== undefined ? directId : Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap($$default, d => Stdlib_JSON.Decode.object(d)), d => d["domainApiId"]), v => Stdlib_JSON.Decode.string(v)), undefined);
1390
- 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
- return makePhantomApi(apiId, apiEndpoint);
1392
- });
1393
- let phantomRole = Pulumi.all([
1394
- domainApiRoleArnOutput,
1395
- defaultOutput
1396
- ]).apply(param => {
1397
- let direct = param[0];
1398
- return makePhantomRole(direct !== undefined ? direct : Stdlib_Option.getOrThrow(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_Option.flatMap(param[1], d => Stdlib_JSON.Decode.object(d)), d => d["domainApiRoleArn"]), v => Stdlib_JSON.Decode.string(v)), undefined));
1399
- });
1400
- let platformApiIdOutput = stackRef.getOutput("platformApiId");
1401
- let platformApiEndpointOutput = stackRef.getOutput("platformApiEndpoint");
1402
- let platformApiRoleArnOutput = stackRef.getOutput("platformApiRoleArn");
1403
- let phantomPlatformApi = Pulumi.all([
1404
- platformApiIdOutput,
1405
- platformApiEndpointOutput,
1406
- defaultOutput
1407
- ]).apply(param => {
1408
- let $$default = param[2];
1409
- 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));
1410
- let platformApiId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiId")), undefined);
1411
- let platformApiEndpoint = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[1], getFromDefault("platformApiEndpoint")), undefined);
1412
- return makePhantomApi(platformApiId, platformApiEndpoint);
1413
- });
1414
- let phantomPlatformRole = Pulumi.all([
1415
- platformApiRoleArnOutput,
1416
- defaultOutput
1417
- ]).apply(param => {
1418
- let $$default = param[1];
1419
1138
  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
- return makePhantomRole(Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("platformApiRoleArn")), undefined));
1139
+ let userPoolId = Stdlib_Option.getOrThrow(Stdlib_Option.orElse(param[0], getFromDefault("cognitoUserPoolId")), "Platform stack does not export 'cognitoUserPoolId' — redeploy the platform stack first");
1140
+ let awsRegion = Stdlib_Option.orElse(param[1], getFromDefault("cognitoRegion"));
1141
+ return {
1142
+ userPoolId: userPoolId,
1143
+ defaultAction: "ALLOW",
1144
+ awsRegion: awsRegion
1145
+ };
1421
1146
  });
1422
- match = [
1423
- phantomApi,
1424
- phantomRole,
1425
- phantomPlatformApi,
1426
- phantomPlatformRole
1427
- ];
1428
- } else {
1429
- let match$1 = AppSync_Adapter$ReventlessAws.makeApiResource("DomainApi", {});
1147
+ let match$1 = AppSync_Adapter$ReventlessAws.makePluginSourceApiResource("PluginSourceApi", userPoolConfig, {});
1430
1148
  let role = match$1[1];
1431
1149
  let api = match$1[0];
1432
1150
  match = [
@@ -1435,6 +1153,17 @@ function Make($star) {
1435
1153
  api,
1436
1154
  role
1437
1155
  ];
1156
+ } else {
1157
+ let schema = AppSync_SdlDecorate$ReventlessAws.stampCanonicalTypes(AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(domainBaseFragment));
1158
+ let match$2 = AppSync_Adapter$ReventlessAws.makeSourceApiResource("DomainApi", schema, {});
1159
+ let role$1 = match$2[1];
1160
+ let api$1 = match$2[0];
1161
+ match = [
1162
+ api$1,
1163
+ role$1,
1164
+ api$1,
1165
+ role$1
1166
+ ];
1438
1167
  }
1439
1168
  let domainApiRole = match[1];
1440
1169
  let domainApi = match[0];
@@ -1465,7 +1194,7 @@ function Make($star) {
1465
1194
  http: dnsHttp
1466
1195
  }));
1467
1196
  let api_name = Pulumi.output("");
1468
- let api$1 = {
1197
+ let api$2 = {
1469
1198
  apiId: api_apiId,
1470
1199
  apiArn: api_apiArn,
1471
1200
  dns: api_dns,
@@ -1473,7 +1202,7 @@ function Make($star) {
1473
1202
  };
1474
1203
  domainEventsApiOpt = {
1475
1204
  name: "DomainEventsApi",
1476
- api: api$1,
1205
+ api: api$2,
1477
1206
  defaultNamespace: undefined
1478
1207
  };
1479
1208
  } else {
@@ -1653,27 +1382,6 @@ function Make($star) {
1653
1382
  project: UiFragments_Projection$ReventlessCore.project,
1654
1383
  moduleUrl: UiFragments_Projection$ReventlessCore.moduleUrl
1655
1384
  });
1656
- let emptyBaseFragment = GraphQL_Stitcher$ReventlessCore.encode({
1657
- types: [],
1658
- mutations: [],
1659
- queries: [],
1660
- subscriptions: [],
1661
- subscriptionSources: []
1662
- });
1663
- let Make$9 = FragmentConfig => {
1664
- let Builder = Api_Builder$ReventlessCore.Make({
1665
- makeApiResource: AppSync_Adapter$ReventlessAws.makeApiResource,
1666
- generateFragment: AppSync_Adapter$ReventlessAws.generateFragment,
1667
- updateSchema: AppSync_Adapter$ReventlessAws.updateSchema
1668
- });
1669
- let make = (name, opts) => Builder.make(name, emptyBaseFragment, opts);
1670
- return {
1671
- make: make
1672
- };
1673
- };
1674
- let Api = {
1675
- Make: Make$9
1676
- };
1677
1385
  let hooksApiRef = {
1678
1386
  contents: undefined
1679
1387
  };
@@ -1683,6 +1391,9 @@ function Make($star) {
1683
1391
  let hooksAdminApiRef = {
1684
1392
  contents: undefined
1685
1393
  };
1394
+ let mergedSchemaPushedRef = {
1395
+ contents: undefined
1396
+ };
1686
1397
  let resolveHookedApi = () => {
1687
1398
  let match = hooksApiRef.contents;
1688
1399
  if (match !== undefined) {
@@ -1699,34 +1410,6 @@ function Make($star) {
1699
1410
  return resolveHookedApi();
1700
1411
  }
1701
1412
  };
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
1413
  let hooks_subscriptionInfraHook = Stdlib_Option.map(domainEventsApiOpt, eventsApi => (params => {
1731
1414
  let allEventTopics = params.allEventTopics;
1732
1415
  let allQueryDbs = params.allQueryDbs;
@@ -1746,81 +1429,22 @@ function Make($star) {
1746
1429
  StateTopic_AppSync$ReventlessAws.finish(eventsApi, {});
1747
1430
  }));
1748
1431
  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;
1432
+ let sdl = AppSync_Adapter$ReventlessAws.stitchStandaloneWithAwsDirectives(pluginFragment);
1433
+ let pushed = Output$Pulumi.flatMap(domainApi, api => Output$Pulumi.flatMap(api.id, apiId => {
1434
+ log.info("preResolversSchemaHook", undefined, `Pushing subgraph schema for ` + name + `@` + version + ` to source API ` + apiId);
1435
+ let client = AppSync_Adapter$ReventlessAws.getClient();
1436
+ return AppSync_Adapter$ReventlessAws.startSchemaCreationRetrying(client, {
1437
+ apiId: apiId,
1438
+ definition: sdl
1439
+ }).then(async () => {
1440
+ await AppSync_Adapter$ReventlessAws.waitForSchemaActive(client, apiId, undefined, undefined);
1441
+ return log.info("preResolversSchemaHook", undefined, "subgraph schema is ACTIVE");
1442
+ });
1443
+ }));
1444
+ mergedSchemaPushedRef.contents = pushed;
1445
+ return pushed;
1823
1446
  };
1447
+ let hooks_preAdminResolversSchemaHook = adminBarrier => adminBarrier;
1824
1448
  let hooks_inboundAppSyncResolverHook = param => InboundTranslationResolvers_AppSync$ReventlessAws.make(resolveHookedApi(), param.runtime, param.fieldNames, param.opts);
1825
1449
  let hooks_dcbAppSyncResolverHook = param => {
1826
1450
  let onAdminApi = param.onAdminApi;
@@ -1942,40 +1566,6 @@ function Make($star) {
1942
1566
  authorization: PluginsReadModelSpec$ReventlessCore.authorization,
1943
1567
  visibility: PluginsReadModelSpec$ReventlessCore.visibility
1944
1568
  })(PluginReadModelMappings);
1945
- let ApiFragmentRegistryAggregate = Aggregate_Builder_Single$ReventlessAws.Make({
1946
- Id: Id$Reventless.$$String,
1947
- name: ApiFragmentRegistrySpec$ReventlessCore.name,
1948
- eventSchema: ApiFragmentRegistrySpec$ReventlessCore.eventSchema,
1949
- errorSchema: ApiFragmentRegistrySpec$ReventlessCore.errorSchema,
1950
- commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema,
1951
- moduleUrl: ApiFragmentRegistrySpec$ReventlessCore.moduleUrl,
1952
- commandAuthorization: ApiFragmentRegistrySpec$ReventlessCore.commandAuthorization
1953
- })({
1954
- initialState: ApiFragmentRegistryBehavior$ReventlessCore.initialState,
1955
- evolve: ApiFragmentRegistryBehavior$ReventlessCore.evolve,
1956
- decide: ApiFragmentRegistryBehavior$ReventlessCore.decide,
1957
- snapshot: undefined,
1958
- moduleUrl: ApiFragmentRegistryBehavior$ReventlessCore.moduleUrl
1959
- })(NoEventMappings$ReventlessInfra.Make({
1960
- name: ApiFragmentRegistrySpec$ReventlessCore.name,
1961
- Id: Id$Reventless.$$String,
1962
- commandSchema: ApiFragmentRegistrySpec$ReventlessCore.commandSchema
1963
- }));
1964
- let ApiFragmentsReadModelMappings = {
1965
- moduleUrl: ApiFragmentsProjection$ReventlessCore.moduleUrl,
1966
- mappings: ApiFragmentsProjection$ReventlessCore.mappings
1967
- };
1968
- let ApiFragmentsReadModel = ReadModel_Builder_NoResolver_Stream$ReventlessAws.Make({
1969
- Id: Id$Reventless.$$String,
1970
- name: ApiFragmentsReadModelSpec$ReventlessCore.name,
1971
- moduleUrl: ApiFragmentsReadModelSpec$ReventlessCore.moduleUrl,
1972
- stateSchema: ApiFragmentsReadModelSpec$ReventlessCore.stateSchema,
1973
- config: ApiFragmentsReadModelSpec$ReventlessCore.config,
1974
- subIdConfig: undefined,
1975
- authorization: ApiFragmentsReadModelSpec$ReventlessCore.authorization,
1976
- visibility: ApiFragmentsReadModelSpec$ReventlessCore.visibility
1977
- })(ApiFragmentsReadModelMappings);
1978
- let AdminApiSchemaPushHandler = SideEffectHandler_Single$ReventlessAws.Make({});
1979
1569
  let makeScheduler = () => {
1980
1570
  let component = Scheduler$ReventlessAws.make(undefined);
1981
1571
  let outputs = Component$ReventlessCore.outputs(component);
@@ -2081,72 +1671,7 @@ function Make($star) {
2081
1671
  };
2082
1672
  let makePlatform = (version, plugins) => {
2083
1673
  log.info("Platform", undefined, `v` + version);
2084
- let scheduler = makeScheduler();
2085
- hooks_scheduler.contents = scheduler;
2086
- hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
2087
- hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
2088
- let match = AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {});
2089
- let platformApiRole = match[1];
2090
- let platformApi = match[0];
2091
- hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
2092
- splitApiOutputsRef.contents = {
2093
- platformApi: platformApi,
2094
- platformApiRole: platformApiRole
2095
- };
2096
- let c = apiConfigRef.contents;
2097
- if (c !== undefined) {
2098
- apiConfigRef.contents = {
2099
- domainApi: c.domainApi,
2100
- domainApiRole: c.domainApiRole,
2101
- platformApi: platformApi,
2102
- platformApiRole: platformApiRole
2103
- };
2104
- }
2105
- let admin = Admin.construct(version, [], [
2106
- PluginAggregate,
2107
- ApiFragmentRegistryAggregate
2108
- ], [
2109
- PluginReadModel,
2110
- ApiFragmentsReadModel
2111
- ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2112
- let pluginRm = admin.readModelsOutputs["Plugins"];
2113
- if (pluginRm !== undefined) {
2114
- let r = pluginRm.queryDb.resources[0];
2115
- if (r !== undefined) {
2116
- Platform_ComponentDefinitions_Lambda$ReventlessAws.make(platformApi, r.name, {});
2117
- AggregateRuntime_Builder_Single$ReventlessAws.setPluginReadModelTable(r.name);
2118
- }
2119
- }
2120
- let rm = admin.stateViewSlicesOutputs["UiFragments"];
2121
- if (rm !== undefined) {
2122
- let r$1 = rm.queryDb.resources[0];
2123
- if (r$1 !== undefined) {
2124
- Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2125
- }
2126
- }
2127
- let rm$1 = admin.readModelsOutputs["ApiFragments"];
2128
- if (rm$1 !== undefined) {
2129
- let r$2 = rm$1.queryDb.resources[0];
2130
- if (r$2 !== undefined) {
2131
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2132
- }
2133
- }
2134
- let pluginComponents = plugins.map(plugin => plugin.make());
2135
- let pluginComponent = pluginComponents[0];
2136
- if (pluginComponent !== undefined) {
2137
- Plugin_Helpers$ReventlessCore.exportPluginOutputs(Component$ReventlessCore.outputs(Primitive_option.valFromOption(pluginComponent)));
2138
- }
2139
- provisionPgChangeFeedRelay();
2140
- let sel = QueryDbBackend$ReventlessAws.get();
2141
- if (sel !== undefined) {
2142
- PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {}, undefined);
2143
- }
2144
- Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
2145
- Pulumi$Pulumi.$$export("platformApiEndpoint", Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2146
- Pulumi$Pulumi.$$export("platformApiRoleArn", Output$Pulumi.flatMap(platformApiRole, role => role.arn));
2147
- Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
2148
- Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2149
- Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
1674
+ return Pervasives.failwith("makePlatform is not supported on AWS — deploy the platform with deployPlatform and each plugin with deployPlugin (merged-API composition).");
2150
1675
  };
2151
1676
  let deployPlatform = (version, hostUiBundle) => {
2152
1677
  log.info("Platform:deployPlatform", undefined, `v` + version);
@@ -2154,9 +1679,20 @@ function Make($star) {
2154
1679
  hooks_scheduler.contents = scheduler;
2155
1680
  hooksApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApi);
2156
1681
  hooksApiRoleRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(domainApiRole);
2157
- let match = AppSync_Adapter$ReventlessAws.makeApiResource("PlatformApi", {});
1682
+ let match = AppSync_Adapter$ReventlessAws.makeSourceApiResource("PlatformApi", adminSourceSdl(), {});
2158
1683
  let platformApiRole = match[1];
2159
1684
  let platformApi = match[0];
1685
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), AppSync_MergedApi$ReventlessAws.primaryAuthMode);
1686
+ let domainMerged = AppSync_MergedApi$ReventlessAws.make("DomainMergedApi", {});
1687
+ let platformMerged = AppSync_MergedApi$ReventlessAws.make("PlatformMergedApi", {});
1688
+ let platformAssoc = AppSync_MergedApi$ReventlessAws.associateSource("PlatformAdminSourceAssociation", platformMerged, platformApi, {});
1689
+ let domainAssoc = AppSync_MergedApi$ReventlessAws.associateSource("DomainBaseSourceAssociation", domainMerged, domainApi, {});
1690
+ let mergedOutputs = {
1691
+ domainMerged: domainMerged,
1692
+ platformMerged: platformMerged,
1693
+ domainMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(domainMerged, domainAssoc),
1694
+ platformMergeGate: AppSync_MergedApi$ReventlessAws.mergeStatusGate(platformMerged, platformAssoc)
1695
+ };
2160
1696
  hooksAdminApiRef.contents = Platform_Casts$ReventlessAws.wrapHookedValue(platformApi);
2161
1697
  splitApiOutputsRef.contents = {
2162
1698
  platformApi: platformApi,
@@ -2176,62 +1712,7 @@ function Make($star) {
2176
1712
  updateApiSchema: undefined,
2177
1713
  manageSubscriptions: undefined
2178
1714
  });
2179
- let admin = Admin.construct(version, [PluginExtensionPoint], [
2180
- PluginAggregate,
2181
- ApiFragmentRegistryAggregate
2182
- ], [
2183
- PluginReadModel,
2184
- ApiFragmentsReadModel
2185
- ], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2186
- let apiSchemaPushEventTopics = Aggregate$ReventlessCore.allEventTopics(admin.aggregatesOutputs);
2187
- let apiSchemaPushCmdTopics = Aggregate$ReventlessCore.allCommandTopics(admin.aggregatesOutputs);
2188
- let agg = admin.aggregatesOutputs[ApiFragmentRegistrySpec$ReventlessCore.name];
2189
- let apiSchemaPushCmdTopicUrl = agg !== undefined ? Output$Pulumi.flatMap(agg.commandTopic, ct => {
2190
- let r = ct.resources[0];
2191
- if (r !== undefined) {
2192
- return r.id;
2193
- } else {
2194
- return Pulumi.output("");
2195
- }
2196
- }) : Pulumi.output("");
2197
- let apiSchemaPushEnv = Object.fromEntries([
2198
- [
2199
- "API_SCHEMA_PUSH_DOMAIN_API_ID",
2200
- domainApiId
2201
- ],
2202
- [
2203
- "API_SCHEMA_PUSH_PLATFORM_API_ID",
2204
- Output$Pulumi.flatMap(platformApi, api => api.id)
2205
- ],
2206
- [
2207
- "API_SCHEMA_PUSH_SPLIT_API",
2208
- Pulumi.output("true")
2209
- ],
2210
- [
2211
- "API_SCHEMA_PUSH_CLONER",
2212
- Pulumi.output("false")
2213
- ],
2214
- [
2215
- "API_SCHEMA_PUSH_CMD_TOPIC_URL",
2216
- apiSchemaPushCmdTopicUrl
2217
- ]
2218
- ]);
2219
- let apiSchemaPushQueryEngine = QueryEngine_DynamoDb$ReventlessAws.make({});
2220
- Pulumi.all([
2221
- scheduler,
2222
- apiSchemaPushQueryEngine
2223
- ]).apply(param => {
2224
- AdminApiSchemaPushHandler.make("AdminApiSchemaPush", [{
2225
- Source: {
2226
- name: ApiSchemaPush$ReventlessAws.Source.name,
2227
- Id: ApiSchemaPush$ReventlessAws.Source.Id,
2228
- eventSchema: ApiSchemaPush$ReventlessAws.Source.eventSchema
2229
- },
2230
- moduleUrl: ApiSchemaPush$ReventlessAws.moduleUrl,
2231
- execute: ApiSchemaPush$ReventlessAws.execute
2232
- }], apiSchemaPushEventTopics, apiSchemaPushCmdTopics, [ApiFragmentRegistrySpec$ReventlessCore.name], param[1], param[0], Util_ResourceNaming$ReventlessAws.operations, undefined, undefined, apiSchemaPushEnv, {});
2233
- apiSchemaPushCmdTopics.apply(param => SideEffectHandlerRuntime_Builder_Single$ReventlessAws.finish());
2234
- });
1715
+ let admin = Admin.construct(version, [PluginExtensionPoint], [PluginAggregate], [PluginReadModel], scheduler, Util_ResourceNaming$ReventlessAws.operations, platformApi, platformApiRole, [UiFragmentRegistrySlice], [UiFragmentsViewSlice], [], [], []);
2235
1716
  let pluginRm = admin.readModelsOutputs["Plugins"];
2236
1717
  let pluginReadModelTableName;
2237
1718
  if (pluginRm !== undefined) {
@@ -2268,19 +1749,28 @@ function Make($star) {
2268
1749
  Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$1.name, admin.adminSchemaPushed, {});
2269
1750
  }
2270
1751
  }
2271
- let rm$1 = admin.readModelsOutputs["ApiFragments"];
2272
- if (rm$1 !== undefined) {
2273
- let r$2 = rm$1.queryDb.resources[0];
2274
- if (r$2 !== undefined) {
2275
- Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$2.name, admin.adminSchemaPushed, {});
2276
- }
2277
- }
2278
1752
  Pulumi$Pulumi.$$export("platformApiId", Output$Pulumi.flatMap(platformApi, api => api.id));
2279
1753
  Pulumi$Pulumi.$$export("platformApiEndpoint", Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2280
1754
  Pulumi$Pulumi.$$export("platformApiRoleArn", Output$Pulumi.flatMap(platformApiRole, role => role.arn));
2281
1755
  Pulumi$Pulumi.$$export("domainApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
2282
1756
  Pulumi$Pulumi.$$export("domainApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
2283
1757
  Pulumi$Pulumi.$$export("domainApiRoleArn", Output$Pulumi.flatMap(domainApiRole, role => role.arn));
1758
+ if (mergedOutputs !== undefined) {
1759
+ let platformMerged$1 = mergedOutputs.platformMerged;
1760
+ let domainMerged$1 = mergedOutputs.domainMerged;
1761
+ let mergeGatedArn = (merged, gate) => Pulumi.all([
1762
+ Output$Pulumi.flatMap(merged.api, api => api.arn),
1763
+ gate
1764
+ ]).apply(param => param[0]);
1765
+ let mergedEndpoint = merged => Output$Pulumi.flatMap(merged.api, api => api.uris.apply(uris => uris.GRAPHQL));
1766
+ Pulumi$Pulumi.$$export("domainMergedApiArn", mergeGatedArn(domainMerged$1, mergedOutputs.domainMergeGate));
1767
+ Pulumi$Pulumi.$$export("domainMergedApiId", Output$Pulumi.flatMap(domainMerged$1.api, api => api.id));
1768
+ Pulumi$Pulumi.$$export("domainMergedApiEndpoint", mergedEndpoint(domainMerged$1));
1769
+ Pulumi$Pulumi.$$export("platformMergedApiArn", mergeGatedArn(platformMerged$1, mergedOutputs.platformMergeGate));
1770
+ Pulumi$Pulumi.$$export("platformMergedApiId", Output$Pulumi.flatMap(platformMerged$1.api, api => api.id));
1771
+ Pulumi$Pulumi.$$export("platformMergedApiEndpoint", mergedEndpoint(platformMerged$1));
1772
+ Pulumi$Pulumi.$$export("mergedApiPrimaryAuth", Pulumi.output(AppSync_MergedApi$ReventlessAws.primaryAuthMode));
1773
+ }
2284
1774
  if (domainEventsApiOpt !== undefined) {
2285
1775
  Pulumi$Pulumi.$$export("eventsApiArn", domainEventsApiOpt.api.apiArn);
2286
1776
  Pulumi$Pulumi.$$export("eventsApiDns", domainEventsApiOpt.api.dns.apply(dns => Stdlib_Option.getOr(dns.http, "")));
@@ -2289,9 +1779,11 @@ function Make($star) {
2289
1779
  Pulumi$Pulumi.$$export("pluginRmTableName", pluginReadModelTableName);
2290
1780
  }
2291
1781
  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));
1782
+ let clientDomainApi = mergedOutputs !== undefined ? mergedOutputs.domainMerged.api : domainApi;
1783
+ let clientPlatformApi = mergedOutputs !== undefined ? mergedOutputs.platformMerged.api : platformApi;
1784
+ let resolvedDomainApiEndpoint = Output$Pulumi.flatMap(clientDomainApi, api => api.uris.apply(uris => uris.GRAPHQL));
2293
1785
  let resolvedDomainApiRoleArn = Output$Pulumi.flatMap(domainApiRole, role => role.arn);
2294
- let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(platformApi, api => api.uris.apply(uris => uris.GRAPHQL));
1786
+ let resolvedPlatformApiEndpoint = Output$Pulumi.flatMap(clientPlatformApi, api => api.uris.apply(uris => uris.GRAPHQL));
2295
1787
  let resolvedPlatformApiRoleArn = Output$Pulumi.flatMap(platformApiRole, role => role.arn);
2296
1788
  let adminResourcesOutput = Pulumi.all(Object.values(admin.aggregatesOutputs).map(agg => Aggregate$ReventlessCore.toResolvedOutputs(agg).apply(r => [
2297
1789
  r.eventLog.resources,
@@ -2422,10 +1914,51 @@ function Make($star) {
2422
1914
  Pulumi$Pulumi.$$export("_interopMeta", Plugin_Helpers$ReventlessCore.getInteropMeta());
2423
1915
  let pluginOutputs = Component$ReventlessCore.outputs(pluginComponent);
2424
1916
  Plugin_Helpers$ReventlessCore.exportPluginOutputs(pluginOutputs);
1917
+ if (platformStackRef !== undefined) {
1918
+ let stackRef = Primitive_option.valFromOption(platformStackRef);
1919
+ let defaultOutput = stackRef.getOutput("default");
1920
+ let getMergedExport = key => {
1921
+ let direct = stackRef.getOutput(key);
1922
+ return Pulumi.all([
1923
+ direct,
1924
+ defaultOutput
1925
+ ]).apply(param => {
1926
+ let direct = param[0];
1927
+ if (direct !== undefined) {
1928
+ return direct;
1929
+ } else {
1930
+ 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`);
1931
+ }
1932
+ });
1933
+ };
1934
+ let mergedApiArn;
1935
+ mergedApiArn = apiTarget === "Domain" ? getMergedExport("domainMergedApiArn") : getMergedExport("platformMergedApiArn");
1936
+ let checkedMergedApiArn = Pulumi.all([
1937
+ mergedApiArn,
1938
+ getMergedExport("mergedApiPrimaryAuth")
1939
+ ]).apply(param => {
1940
+ AppSync_MergedApi$ReventlessAws.assertCompatiblePrimaryAuth(AppSync_MergedApi$ReventlessAws.authenticationTypeName(AppSync_Adapter$ReventlessAws.primaryAuthenticationType), param[1]);
1941
+ return param[0];
1942
+ });
1943
+ let pushed = mergedSchemaPushedRef.contents;
1944
+ let schemaPushed = pushed !== undefined ? pushed : Pulumi.output();
1945
+ let arnAfterSchemaPush = Pulumi.all([
1946
+ checkedMergedApiArn,
1947
+ schemaPushed
1948
+ ]).apply(param => param[0]);
1949
+ let association = AppSync_MergedApi$ReventlessAws.associateSourceWithMergedArn("PluginSourceAssociation", arnAfterSchemaPush, domainApi, {});
1950
+ let mergeGate = AppSync_MergedApi$ReventlessAws.mergeStatusGateWith(checkedMergedApiArn, association);
1951
+ Pulumi$Pulumi.$$export("sourceApiAssociationId", Pulumi.all([
1952
+ association.associationId,
1953
+ mergeGate
1954
+ ]).apply(param => param[0]));
1955
+ Pulumi$Pulumi.$$export("pluginSourceApiId", Output$Pulumi.flatMap(domainApi, api => api.id));
1956
+ Pulumi$Pulumi.$$export("pluginSourceApiEndpoint", Output$Pulumi.flatMap(domainApi, api => api.uris.apply(uris => uris.GRAPHQL)));
1957
+ }
2425
1958
  provisionPgChangeFeedRelay();
2426
1959
  let sel = QueryDbBackend$ReventlessAws.get();
2427
1960
  if (sel !== undefined) {
2428
- PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {}, false);
1961
+ PgQueryResolver_Builder$ReventlessAws.provision(domainApi, sel, {});
2429
1962
  }
2430
1963
  let hbConfig = PluginRuntime_Builder$ReventlessAws.heartbeatConfigRef.contents;
2431
1964
  let match = IndexJs.isDryRun();
@@ -2493,7 +2026,6 @@ function Make($star) {
2493
2026
  AutomationSlice: AutomationSlice,
2494
2027
  OutboundTranslationSlice: OutboundTranslationSlice,
2495
2028
  InboundTranslationSlice: InboundTranslationSlice$1,
2496
- Api: Api,
2497
2029
  mcpSupported: false,
2498
2030
  Plugin: Plugin,
2499
2031
  makePlatform: makePlatform,