@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.
- package/CHANGELOG.md +17 -0
- package/package.json +7 -7
- package/src/Platform.res +478 -545
- package/src/Platform.res.mjs +393 -717
- package/src/adapter/Runtime/AdminEventCollectorEntryPoint.mjs +7 -382
- package/src/adapter/Runtime/ApiSchemaPush_Runtime.mjs +8 -1
- package/src/components/Api/AppSync_Adapter.res +144 -101
- package/src/components/Api/AppSync_Adapter.res.mjs +62 -91
- package/src/components/Api/AppSync_MergedApi.res +218 -0
- package/src/components/Api/AppSync_MergedApi.res.mjs +122 -0
- package/src/components/Api/AppSync_SdlDecorate.res +47 -0
- package/src/components/Api/AppSync_SdlDecorate.res.mjs +39 -0
- package/src/plugin/runtime/PluginRuntime_Builder.res +0 -139
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +4 -80
- package/tests/AppSync_AdapterTest.res +176 -0
- package/tests/AppSync_AdapterTest.res.mjs +134 -0
- package/tests/AppSync_SdlDecorateTest.res +27 -0
- package/tests/AppSync_SdlDecorateTest.res.mjs +20 -0
- package/tests/MCP_LambdaTest.res +6 -4
- package/tests/MCP_LambdaTest.res.mjs +2 -2
package/src/Platform.res.mjs
CHANGED
|
@@ -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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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$
|
|
240
|
-
|
|
241
|
-
|
|
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$
|
|
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$
|
|
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
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
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
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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("
|
|
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
|
-
|
|
809
|
-
|
|
810
|
-
|
|
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 ?
|
|
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:
|
|
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
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
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
|
-
|
|
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$
|
|
1336
|
-
if (r$
|
|
1337
|
-
Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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$
|
|
1343
|
-
if (r$
|
|
1344
|
-
Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
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$
|
|
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$
|
|
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
|
-
|
|
2034
|
-
let
|
|
2035
|
-
|
|
2036
|
-
let
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
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
|
-
}
|
|
2127
|
-
|
|
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.
|
|
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:
|
|
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
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
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
|
-
|
|
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$
|
|
2756
|
-
if (r$
|
|
2757
|
-
Platform_UIFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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$
|
|
2763
|
-
if (r$
|
|
2764
|
-
Platform_ApiFragments_Lambda$ReventlessAws.make(platformApi, r$
|
|
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
|
|
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(
|
|
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,
|