@reventlessdev/reventless-aws 3.0.0-alpha.397 → 3.0.0-alpha.398
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 +33 -0
- package/package.json +9 -9
- package/scripts/BakeManifest.res +15 -15
- package/scripts/DeployApp.res +8 -9
- package/scripts/DeployApp.res.mjs +4 -13
- package/scripts/DeployManifest.res +4 -5
- package/scripts/DeployManifest.res.mjs +0 -1
- package/scripts/ProvisionAccounts.res +41 -33
- package/scripts/ProvisionAccounts.res.mjs +6 -9
- package/scripts/ProvisionAdmin.res +10 -10
- package/scripts/ProvisionIdentity.res +2 -2
- package/scripts/ResolveEnvironment.res +3 -3
- package/src/Platform.res +6 -4
- package/src/Platform.res.mjs +6 -4
- package/src/Platform_ProvidedGroups.res +4 -4
- package/src/Platform_Stack.res +2 -3
- package/src/Platform_Stack.res.mjs +1 -2
- package/src/adapter/Api/AppSyncEventsSigner_Ops.res +2 -2
- package/src/adapter/Api/AppSync_EventsApi.res +2 -2
- package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res +6 -6
- package/src/adapter/DcbEventLog/DcbBackend.res +3 -3
- package/src/adapter/DcbEventLog/DcbBackend.res.mjs +1 -3
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +11 -9
- package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res.mjs +4 -6
- package/src/adapter/EventLog/EventLogBackend.res +3 -3
- package/src/adapter/EventLog/EventLogBackend.res.mjs +1 -3
- package/src/adapter/Geocoder/Geocoder_AwsLocation_Backend.res +1 -1
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +5 -5
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +2 -2
- package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +2 -2
- package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +32 -32
- package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res.mjs +4 -3
- package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +6 -6
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +16 -5
- package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res.mjs +3 -3
- package/src/adapter/Runtime/EventCollectorEntryPoint_Ops.res +5 -5
- package/src/adapter/Runtime/PgQueryResolverEntryPoint_Ops.res +24 -18
- package/src/adapter/Runtime/ReadModelEntryPoint_Ops.res +16 -14
- package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +2 -2
- package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +4 -4
- package/src/adapter/Runtime/SideEffectEntryPoint_Ops.res +4 -4
- package/src/adapter/Runtime/StateViewSliceEntryPoint_Ops.res +9 -9
- package/src/adapter/Runtime/TaskBucketEntryPoint_Ops.res +11 -9
- package/src/components/Api/AppSync_Adapter.res +4 -4
- package/src/components/InboundTranslationSlice_Builder.res +19 -0
- package/src/components/InboundTranslationSlice_Builder.res.mjs +12 -2
- package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +4 -7
- package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs +1 -4
- package/src/plugin/runtime/PluginRuntime_Builder.res +17 -26
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +7 -22
- package/tests/AppSyncEventsSigner_OpsTest.res +1 -1
- package/tests/AppSync_AdapterTest.res +4 -4
- package/tests/AppSync_AdapterTest.res.mjs +4 -8
- package/tests/Auth_ActiveRoleStoreTest.res +1 -1
- package/tests/Auth_ActiveRoleTrigger_OpsTest.res +1 -1
- package/tests/AutomationSliceEntryPoint_OpsTest.res +0 -2
- package/tests/AutomationSliceEntryPoint_OpsTest.res.mjs +3 -6
- package/tests/BakeConvergenceTest.res +1 -8
- package/tests/BakeConvergenceTest.res.mjs +3 -23
- package/tests/BakeManifestTest.res +5 -10
- package/tests/BakeManifestTest.res.mjs +1 -6
- package/tests/CommandLineTest.res +3 -3
- package/tests/DeployAppTest.res +3 -4
- package/tests/DeployAppTest.res.mjs +6 -15
- package/tests/EpInboundTestSlice.res +1 -0
- package/tests/EpInboundTestSlice.res.mjs +3 -0
- package/tests/EventCollectorPluginDefinitionAssetTest.res +1 -2
- package/tests/EventCollectorPluginDefinitionAssetTest.res.mjs +11 -21
- package/tests/IdentityProvider_Cognito_BackendTest.res +0 -3
- package/tests/IdentityProvider_Cognito_BackendTest.res.mjs +0 -3
- package/tests/PgQueryResolver_LambdaTest.res +6 -10
- package/tests/PgQueryResolver_LambdaTest.res.mjs +4 -34
- package/tests/Platform_ProvidedGroupsTest.res +2 -2
- package/tests/Platform_ProvidedGroupsTest.res.mjs +1 -2
- package/tests/ProvisionAccountsTest.res +5 -10
- package/tests/ProvisionAccountsTest.res.mjs +0 -9
- package/tests/ProvisionAdminTest.res +4 -9
- package/tests/ProvisionAdminTest.res.mjs +0 -7
- package/tests/ProvisionIdentityTest.res +2 -4
- package/tests/ProvisionIdentityTest.res.mjs +0 -2
- package/tests/SideEffectEntryPoint_OpsTest.res +2 -2
- package/tests/Util_ShellConfigTest.res +3 -3
- package/tests/Util_ShellConfigTest.res.mjs +1 -2
|
@@ -853,20 +853,17 @@ globalThis.describe("AppSync_Adapter.waitForMergeSuccess", () => {
|
|
|
853
853
|
let client = makeFakeClient([
|
|
854
854
|
{
|
|
855
855
|
sourceApiAssociation: {
|
|
856
|
-
sourceApiAssociationStatus: "MERGE_SCHEDULED"
|
|
857
|
-
sourceApiAssociationStatusDetail: undefined
|
|
856
|
+
sourceApiAssociationStatus: "MERGE_SCHEDULED"
|
|
858
857
|
}
|
|
859
858
|
},
|
|
860
859
|
{
|
|
861
860
|
sourceApiAssociation: {
|
|
862
|
-
sourceApiAssociationStatus: "MERGE_IN_PROGRESS"
|
|
863
|
-
sourceApiAssociationStatusDetail: undefined
|
|
861
|
+
sourceApiAssociationStatus: "MERGE_IN_PROGRESS"
|
|
864
862
|
}
|
|
865
863
|
},
|
|
866
864
|
{
|
|
867
865
|
sourceApiAssociation: {
|
|
868
|
-
sourceApiAssociationStatus: "MERGE_SUCCESS"
|
|
869
|
-
sourceApiAssociationStatusDetail: undefined
|
|
866
|
+
sourceApiAssociationStatus: "MERGE_SUCCESS"
|
|
870
867
|
}
|
|
871
868
|
}
|
|
872
869
|
]);
|
|
@@ -892,8 +889,7 @@ globalThis.describe("AppSync_Adapter.waitForMergeSuccess", () => {
|
|
|
892
889
|
globalThis.test("times out after maxAttempts on a status that never settles", async () => {
|
|
893
890
|
let client = makeFakeClient([{
|
|
894
891
|
sourceApiAssociation: {
|
|
895
|
-
sourceApiAssociationStatus: "MERGE_IN_PROGRESS"
|
|
896
|
-
sourceApiAssociationStatusDetail: undefined
|
|
892
|
+
sourceApiAssociationStatus: "MERGE_IN_PROGRESS"
|
|
897
893
|
}
|
|
898
894
|
}]);
|
|
899
895
|
let message = "";
|
|
@@ -12,7 +12,7 @@ module Ops = Auth_ActiveRoleStore_Ops
|
|
|
12
12
|
module Contract = ReventlessCore.Auth_ActiveRole
|
|
13
13
|
|
|
14
14
|
describe("Auth_ActiveRoleStore_Ops.mayActAs — the conformance table", () => {
|
|
15
|
-
Contract.conformanceCases->Array.forEach(({label, membership, requested, expected}) =>
|
|
15
|
+
Contract.conformanceCases->Array.forEach(({label, membership, ?requested, ?expected}) =>
|
|
16
16
|
switch requested {
|
|
17
17
|
// "no role requested" has no subset decision to make — it is the clearing
|
|
18
18
|
// path, exercised against the handler rather than the predicate.
|
|
@@ -53,7 +53,7 @@ let claimOf = (e: Trigger.event, key) =>
|
|
|
53
53
|
let effectiveGroups = (e: Trigger.event, ~membership) => groupsOf(e)->Option.getOr(membership)
|
|
54
54
|
|
|
55
55
|
describe("the conformance table, minted by the trigger", () => {
|
|
56
|
-
Contract.conformanceCases->Array.forEach(({label, membership, requested, expected}) =>
|
|
56
|
+
Contract.conformanceCases->Array.forEach(({label, membership, ?requested, ?expected}) =>
|
|
57
57
|
testSync(
|
|
58
58
|
label,
|
|
59
59
|
() => {
|
|
@@ -309,7 +309,6 @@ describe("AutomationSliceEntryPoint_Ops.runSweeps", () => {
|
|
|
309
309
|
comp,
|
|
310
310
|
name: comp,
|
|
311
311
|
tick: None,
|
|
312
|
-
reconcile: None,
|
|
313
312
|
}
|
|
314
313
|
|
|
315
314
|
test("sweeps every slice", async () => {
|
|
@@ -346,7 +345,6 @@ describe("AutomationSliceEntryPoint_Ops.runTick", () => {
|
|
|
346
345
|
comp: name,
|
|
347
346
|
name,
|
|
348
347
|
tick,
|
|
349
|
-
reconcile: None,
|
|
350
348
|
}
|
|
351
349
|
let slices = [
|
|
352
350
|
slice(~name="Outbound", ~tick=None),
|
|
@@ -465,8 +465,7 @@ globalThis.describe("AutomationSliceEntryPoint_Ops.runSweeps", () => {
|
|
|
465
465
|
sweep: run,
|
|
466
466
|
comp: comp,
|
|
467
467
|
name: comp,
|
|
468
|
-
tick: undefined
|
|
469
|
-
reconcile: undefined
|
|
468
|
+
tick: undefined
|
|
470
469
|
});
|
|
471
470
|
globalThis.test("sweeps every slice", async () => {
|
|
472
471
|
let swept = [];
|
|
@@ -512,8 +511,7 @@ globalThis.describe("AutomationSliceEntryPoint_Ops.runTick", () => {
|
|
|
512
511
|
sweep: async () => {},
|
|
513
512
|
comp: name,
|
|
514
513
|
name: name,
|
|
515
|
-
tick: tick
|
|
516
|
-
reconcile: undefined
|
|
514
|
+
tick: tick
|
|
517
515
|
});
|
|
518
516
|
let slices = [
|
|
519
517
|
{
|
|
@@ -521,8 +519,7 @@ globalThis.describe("AutomationSliceEntryPoint_Ops.runTick", () => {
|
|
|
521
519
|
sweep: async () => {},
|
|
522
520
|
comp: "Outbound",
|
|
523
521
|
name: "Outbound",
|
|
524
|
-
tick: undefined
|
|
525
|
-
reconcile: undefined
|
|
522
|
+
tick: undefined
|
|
526
523
|
},
|
|
527
524
|
slice("DemandReport", async (key, at) => {
|
|
528
525
|
ticks.push([
|
|
@@ -48,11 +48,6 @@ let emptyStructure: Reventless.Plugin.pluginStructure = {
|
|
|
48
48
|
outboundTranslationSlices: [],
|
|
49
49
|
inboundTranslationSlices: [],
|
|
50
50
|
extensions: [],
|
|
51
|
-
extensionPoints: None,
|
|
52
|
-
requiredStores: None,
|
|
53
|
-
requiredStoreDeclarations: None,
|
|
54
|
-
requiredCapabilities: None,
|
|
55
|
-
traitDeclarations: None,
|
|
56
51
|
}
|
|
57
52
|
|
|
58
53
|
let definition = (~structure): Reventless.Plugin.pluginDefinition => {
|
|
@@ -64,9 +59,7 @@ let definition = (~structure): Reventless.Plugin.pluginDefinition => {
|
|
|
64
59
|
eventCollector: "arn:aws:sqs:eu-west-1:0:Ordering",
|
|
65
60
|
extensionProtocols: [],
|
|
66
61
|
apiSchemaFragment: None,
|
|
67
|
-
apiTarget: None,
|
|
68
62
|
structure: Some(structure),
|
|
69
|
-
dcbEventLog: None,
|
|
70
63
|
kind: Domain,
|
|
71
64
|
}
|
|
72
65
|
|
|
@@ -119,7 +112,7 @@ describe("the bake converges when a plugin's structure changes", () => {
|
|
|
119
112
|
let (keyA, structureA) = deployStructure(emptyStructure)
|
|
120
113
|
let (keyB, structureB) = deployStructure({
|
|
121
114
|
...emptyStructure,
|
|
122
|
-
requiredStores:
|
|
115
|
+
requiredStores: ["Ordering.receipts"],
|
|
123
116
|
})
|
|
124
117
|
let defA = definition(~structure=structureA)
|
|
125
118
|
let defB = definition(~structure=structureB)
|
|
@@ -60,12 +60,7 @@ let emptyStructure = {
|
|
|
60
60
|
automationSlices: emptyStructure_automationSlices,
|
|
61
61
|
outboundTranslationSlices: emptyStructure_outboundTranslationSlices,
|
|
62
62
|
inboundTranslationSlices: emptyStructure_inboundTranslationSlices,
|
|
63
|
-
extensions: emptyStructure_extensions
|
|
64
|
-
extensionPoints: undefined,
|
|
65
|
-
requiredStores: undefined,
|
|
66
|
-
requiredStoreDeclarations: undefined,
|
|
67
|
-
requiredCapabilities: undefined,
|
|
68
|
-
traitDeclarations: undefined
|
|
63
|
+
extensions: emptyStructure_extensions
|
|
69
64
|
};
|
|
70
65
|
|
|
71
66
|
function definition(structure) {
|
|
@@ -78,9 +73,7 @@ function definition(structure) {
|
|
|
78
73
|
eventCollector: "arn:aws:sqs:eu-west-1:0:Ordering",
|
|
79
74
|
extensionProtocols: [],
|
|
80
75
|
apiSchemaFragment: undefined,
|
|
81
|
-
apiTarget: undefined,
|
|
82
76
|
structure: structure,
|
|
83
|
-
dcbEventLog: undefined,
|
|
84
77
|
kind: "Domain"
|
|
85
78
|
};
|
|
86
79
|
}
|
|
@@ -125,21 +118,8 @@ let afterDeploy = "2026-08-27T10:05:00Z";
|
|
|
125
118
|
globalThis.describe("the bake converges when a plugin's structure changes", () => {
|
|
126
119
|
let match = deployStructure(emptyStructure);
|
|
127
120
|
let keyA = match[0];
|
|
128
|
-
let
|
|
129
|
-
|
|
130
|
-
stateViewSlices: emptyStructure_stateViewSlices,
|
|
131
|
-
stateChangeSlices: emptyStructure_stateChangeSlices,
|
|
132
|
-
aggregates: emptyStructure_aggregates,
|
|
133
|
-
automationSlices: emptyStructure_automationSlices,
|
|
134
|
-
outboundTranslationSlices: emptyStructure_outboundTranslationSlices,
|
|
135
|
-
inboundTranslationSlices: emptyStructure_inboundTranslationSlices,
|
|
136
|
-
extensions: emptyStructure_extensions,
|
|
137
|
-
extensionPoints: undefined,
|
|
138
|
-
requiredStores: ["Ordering.receipts"],
|
|
139
|
-
requiredStoreDeclarations: undefined,
|
|
140
|
-
requiredCapabilities: undefined,
|
|
141
|
-
traitDeclarations: undefined
|
|
142
|
-
});
|
|
121
|
+
let newrecord = {...emptyStructure};
|
|
122
|
+
let match$1 = deployStructure((newrecord.requiredStores = ["Ordering.receipts"], newrecord));
|
|
143
123
|
let keyB = match$1[0];
|
|
144
124
|
let defA = definition(match[1]);
|
|
145
125
|
let defB = definition(match$1[1]);
|
|
@@ -33,12 +33,11 @@ plugins:
|
|
|
33
33
|
expect(resolved)->toEqual(
|
|
34
34
|
Ok({
|
|
35
35
|
DeployManifest.file: "/repo/shop/deploy-manifest.yaml",
|
|
36
|
-
region:
|
|
36
|
+
region: "eu-west-1",
|
|
37
37
|
platform: {
|
|
38
38
|
name: "shop-platform",
|
|
39
39
|
dir: "/repo/shop/platform-aws",
|
|
40
40
|
stackDefaults: Dict.fromArray([("platform:messagingEmailProvider", "log")]),
|
|
41
|
-
region: None,
|
|
42
41
|
review: true,
|
|
43
42
|
},
|
|
44
43
|
plugins: [
|
|
@@ -46,14 +45,13 @@ plugins:
|
|
|
46
45
|
name: "catalog",
|
|
47
46
|
dir: "/repo/shop/catalog-aws",
|
|
48
47
|
stackDefaults: Dict.make(),
|
|
49
|
-
region: None,
|
|
50
48
|
review: true,
|
|
51
49
|
},
|
|
52
50
|
{
|
|
53
51
|
name: "ordering",
|
|
54
52
|
dir: "/repo/shop/ordering-aws",
|
|
55
53
|
stackDefaults: Dict.make(),
|
|
56
|
-
region:
|
|
54
|
+
region: "eu-central-1",
|
|
57
55
|
review: false,
|
|
58
56
|
},
|
|
59
57
|
],
|
|
@@ -79,9 +77,9 @@ describe("BakeManifest.parseArgs", () => {
|
|
|
79
77
|
]),
|
|
80
78
|
)->toEqual(
|
|
81
79
|
Ok({
|
|
82
|
-
Bake.manifest:
|
|
83
|
-
stack:
|
|
84
|
-
since:
|
|
80
|
+
Bake.manifest: "m.yaml",
|
|
81
|
+
stack: "alpha",
|
|
82
|
+
since: "2026-09-16T10:00:00Z",
|
|
85
83
|
review: false,
|
|
86
84
|
help: false,
|
|
87
85
|
}),
|
|
@@ -109,7 +107,6 @@ describe("BakeManifest.pluginsToRead", () => {
|
|
|
109
107
|
DeployManifest.name,
|
|
110
108
|
dir: `/repo/shop/${name}-aws`,
|
|
111
109
|
stackDefaults: Dict.make(),
|
|
112
|
-
region: None,
|
|
113
110
|
review,
|
|
114
111
|
}
|
|
115
112
|
let plugins = [plugin("catalog", ~review=true), plugin("ingest", ~review=false)]
|
|
@@ -213,8 +210,6 @@ describe("BakeManifest.readAnswer", () => {
|
|
|
213
210
|
plugin: "Catalog",
|
|
214
211
|
state: "missing",
|
|
215
212
|
expected: "sha256/new",
|
|
216
|
-
found: None,
|
|
217
|
-
writtenAt: None,
|
|
218
213
|
}),
|
|
219
214
|
)->toBe(" Catalog: missing — expected sha256/new, row holds no row (written never)")
|
|
220
215
|
)
|
|
@@ -40,7 +40,6 @@ plugins:
|
|
|
40
40
|
"platform:messagingEmailProvider",
|
|
41
41
|
"log"
|
|
42
42
|
]]),
|
|
43
|
-
region: undefined,
|
|
44
43
|
review: true
|
|
45
44
|
},
|
|
46
45
|
plugins: [
|
|
@@ -48,7 +47,6 @@ plugins:
|
|
|
48
47
|
name: "catalog",
|
|
49
48
|
dir: "/repo/shop/catalog-aws",
|
|
50
49
|
stackDefaults: {},
|
|
51
|
-
region: undefined,
|
|
52
50
|
review: true
|
|
53
51
|
},
|
|
54
52
|
{
|
|
@@ -122,7 +120,6 @@ globalThis.describe("BakeManifest.pluginsToRead", () => {
|
|
|
122
120
|
name: name,
|
|
123
121
|
dir: `/repo/shop/` + name + `-aws`,
|
|
124
122
|
stackDefaults: {},
|
|
125
|
-
region: undefined,
|
|
126
123
|
review: review
|
|
127
124
|
});
|
|
128
125
|
let plugins = [
|
|
@@ -229,9 +226,7 @@ globalThis.describe("BakeManifest.readAnswer", () => {
|
|
|
229
226
|
globalThis.expect(BakeManifest$ReventlessAws.registrationLine({
|
|
230
227
|
plugin: "Catalog",
|
|
231
228
|
state: "missing",
|
|
232
|
-
expected: "sha256/new"
|
|
233
|
-
found: undefined,
|
|
234
|
-
writtenAt: undefined
|
|
229
|
+
expected: "sha256/new"
|
|
235
230
|
})).toBe(" Catalog: missing — expected sha256/new, row holds no row (written never)");
|
|
236
231
|
});
|
|
237
232
|
});
|
|
@@ -11,14 +11,14 @@ let answersLikeEveryTool = (cli: CliArgs.cli<'args>, ~mistake, ~message) =>
|
|
|
11
11
|
test(`${cli.bin}: --help and a usage mistake`, async () => {
|
|
12
12
|
let usage = cli.usage->String.trim
|
|
13
13
|
expect(usage->String.startsWith(`Usage: ${cli.bin} `))->toBe(true)
|
|
14
|
-
let help = {CliArgs.stdout: [usage], stderr: [], exitCode:
|
|
14
|
+
let help = {CliArgs.stdout: [usage], stderr: [], exitCode: 0, reachedMain: false}
|
|
15
15
|
expect(await CliArgs.observe(cli, ["-h"]))->toEqual(help)
|
|
16
16
|
// Help wins: whoever asks what a tool takes is least sure of their arguments.
|
|
17
17
|
expect(await CliArgs.observe(cli, mistake->Array.concat(["--help"])))->toEqual(help)
|
|
18
18
|
expect(await CliArgs.observe(cli, mistake))->toEqual({
|
|
19
19
|
CliArgs.stdout: [],
|
|
20
20
|
stderr: [`${cli.bin}: ${message}\n\n${usage}`],
|
|
21
|
-
exitCode:
|
|
21
|
+
exitCode: 2,
|
|
22
22
|
reachedMain: false,
|
|
23
23
|
})
|
|
24
24
|
})
|
|
@@ -62,7 +62,7 @@ describe("a string flag's value", () => {
|
|
|
62
62
|
|
|
63
63
|
testSync("may be given inline", () =>
|
|
64
64
|
expect(DeployApp.parseArgs(["down", "--manifest=../m.yaml", "--stack=try"]))->toEqual(
|
|
65
|
-
Ok({DeployApp.command:
|
|
65
|
+
Ok({DeployApp.command: Down, manifest: "../m.yaml", stack: "try", help: false}),
|
|
66
66
|
)
|
|
67
67
|
)
|
|
68
68
|
|
package/tests/DeployAppTest.res
CHANGED
|
@@ -6,13 +6,13 @@ open JestGlobals
|
|
|
6
6
|
describe("DeployApp.parseArgs", () => {
|
|
7
7
|
testSync("up with the defaults", () =>
|
|
8
8
|
expect(DeployApp.parseArgs(["up"]))->toEqual(
|
|
9
|
-
Ok({DeployApp.command:
|
|
9
|
+
Ok({DeployApp.command: Up, stack: "dev", help: false}),
|
|
10
10
|
)
|
|
11
11
|
)
|
|
12
12
|
|
|
13
13
|
testSync("down with a manifest and a stack", () =>
|
|
14
14
|
expect(DeployApp.parseArgs(["down", "--manifest", "../m.yaml", "--stack", "try"]))->toEqual(
|
|
15
|
-
Ok({DeployApp.command:
|
|
15
|
+
Ok({DeployApp.command: Down, manifest: "../m.yaml", stack: "try", help: false}),
|
|
16
16
|
)
|
|
17
17
|
)
|
|
18
18
|
|
|
@@ -55,11 +55,10 @@ describe("DeployApp stacks and layer", () => {
|
|
|
55
55
|
projectName: "shop-platform-aws",
|
|
56
56
|
program: "/app/platform-aws/src/Main.res.mjs",
|
|
57
57
|
stackDefaults: Dict.fromArray([("aws:region", "us-east-1"), ("platform:x", "y")]),
|
|
58
|
-
region: None,
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
testSync("a stack the manifest puts in another region is refused", () => {
|
|
62
|
-
let ingest = {...project, label: "ingest", region:
|
|
61
|
+
let ingest = {...project, label: "ingest", region: "eu-central-1"}
|
|
63
62
|
expect(
|
|
64
63
|
DeployApp.regionProblems(~projects=[project, ingest], ~region="eu-west-1")->Array.length,
|
|
65
64
|
)->toBe(1)
|
|
@@ -9,7 +9,6 @@ globalThis.describe("DeployApp.parseArgs", () => {
|
|
|
9
9
|
TAG: "Ok",
|
|
10
10
|
_0: {
|
|
11
11
|
command: "Up",
|
|
12
|
-
manifest: undefined,
|
|
13
12
|
stack: "dev",
|
|
14
13
|
help: false
|
|
15
14
|
}
|
|
@@ -79,27 +78,19 @@ globalThis.describe("DeployApp stacks and layer", () => {
|
|
|
79
78
|
dir: "/app/platform-aws",
|
|
80
79
|
projectName: "shop-platform-aws",
|
|
81
80
|
program: "/app/platform-aws/src/Main.res.mjs",
|
|
82
|
-
stackDefaults: project_stackDefaults
|
|
83
|
-
region: undefined
|
|
81
|
+
stackDefaults: project_stackDefaults
|
|
84
82
|
};
|
|
85
83
|
globalThis.test("a stack the manifest puts in another region is refused", () => {
|
|
86
|
-
let
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
label: "ingest",
|
|
90
|
-
dir: "/app/platform-aws",
|
|
91
|
-
projectName: "shop-platform-aws",
|
|
92
|
-
program: "/app/platform-aws/src/Main.res.mjs",
|
|
93
|
-
stackDefaults: ingest_stackDefaults,
|
|
94
|
-
region: ingest_region
|
|
95
|
-
};
|
|
84
|
+
let newrecord = {...project};
|
|
85
|
+
newrecord.region = "eu-central-1";
|
|
86
|
+
newrecord.label = "ingest";
|
|
96
87
|
globalThis.expect(DeployApp$ReventlessAws.regionProblems([
|
|
97
88
|
project,
|
|
98
|
-
|
|
89
|
+
newrecord
|
|
99
90
|
], "eu-west-1").length).toBe(1);
|
|
100
91
|
globalThis.expect(DeployApp$ReventlessAws.regionProblems([
|
|
101
92
|
project,
|
|
102
|
-
|
|
93
|
+
newrecord
|
|
103
94
|
], "eu-central-1")).toEqual([]);
|
|
104
95
|
});
|
|
105
96
|
globalThis.test("a new stack gets the app's defaults, then the region and the try-out flag", () => {
|
|
@@ -12,6 +12,8 @@ let commandSchema = Sury.$schema(s => ({
|
|
|
12
12
|
thingId: s.m(Sury.string)
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
|
+
let capabilityNeeds = [];
|
|
16
|
+
|
|
15
17
|
function authorizationOf(param) {
|
|
16
18
|
return {
|
|
17
19
|
TAG: "AllowRoles",
|
|
@@ -36,6 +38,7 @@ export {
|
|
|
36
38
|
commandSchema,
|
|
37
39
|
targetName,
|
|
38
40
|
externalSystem,
|
|
41
|
+
capabilityNeeds,
|
|
39
42
|
endpoint,
|
|
40
43
|
authorizationOf,
|
|
41
44
|
}
|
|
@@ -31,29 +31,17 @@ let offloadedFragment = {
|
|
|
31
31
|
},
|
|
32
32
|
apiTarget: "Domain",
|
|
33
33
|
structure: undefined,
|
|
34
|
-
dcbEventLog: undefined,
|
|
35
34
|
kind: "Domain"
|
|
36
35
|
};
|
|
37
36
|
|
|
38
|
-
let
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
apiSchemaFragment: {
|
|
47
|
-
TAG: "Inline",
|
|
48
|
-
_0: {
|
|
49
|
-
encoded: "{\"types\":[]}",
|
|
50
|
-
protocol: "1"
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
apiTarget: offloadedFragment.apiTarget,
|
|
54
|
-
structure: offloadedFragment.structure,
|
|
55
|
-
dcbEventLog: offloadedFragment.dcbEventLog,
|
|
56
|
-
kind: offloadedFragment.kind
|
|
37
|
+
let newrecord = {...offloadedFragment};
|
|
38
|
+
|
|
39
|
+
newrecord.apiSchemaFragment = {
|
|
40
|
+
TAG: "Inline",
|
|
41
|
+
_0: {
|
|
42
|
+
encoded: "{\"types\":[]}",
|
|
43
|
+
protocol: "1"
|
|
44
|
+
}
|
|
57
45
|
};
|
|
58
46
|
|
|
59
47
|
function writeAsset(def) {
|
|
@@ -100,7 +88,7 @@ globalThis.describe("pluginDefinition.json write/read symmetry", () => {
|
|
|
100
88
|
globalThis.test("a definition read back from the asset can be published to the Connect handshake", () => {
|
|
101
89
|
[
|
|
102
90
|
offloadedFragment,
|
|
103
|
-
|
|
91
|
+
newrecord
|
|
104
92
|
].forEach(def => {
|
|
105
93
|
let published = Util_Sury$Reventless.toJson({
|
|
106
94
|
TAG: "ConnectPlugin",
|
|
@@ -126,6 +114,8 @@ globalThis.describe("pluginDefinition.json write/read symmetry", () => {
|
|
|
126
114
|
});
|
|
127
115
|
});
|
|
128
116
|
|
|
117
|
+
let inlineFragment = newrecord;
|
|
118
|
+
|
|
129
119
|
export {
|
|
130
120
|
offloadedFragment,
|
|
131
121
|
inlineFragment,
|
|
@@ -289,11 +289,8 @@ describe("AutomationSliceRuntime_Builder_Single.declaresIdentityProvider", () =>
|
|
|
289
289
|
callbackType: "outbound",
|
|
290
290
|
queryDbTableName: Pulumi.Output.make(""),
|
|
291
291
|
queryDbResources: [],
|
|
292
|
-
context: None,
|
|
293
292
|
sourceTopics: Dict.make(),
|
|
294
293
|
consumesDcbLog: true,
|
|
295
|
-
commandTargetName: None,
|
|
296
|
-
schedule: None,
|
|
297
294
|
schedulesResources: [],
|
|
298
295
|
capabilityNeeds: needs,
|
|
299
296
|
}
|
|
@@ -407,11 +407,8 @@ globalThis.describe("AutomationSliceRuntime_Builder_Single.declaresIdentityProvi
|
|
|
407
407
|
callbackType: "outbound",
|
|
408
408
|
queryDbTableName: Pulumi.output(""),
|
|
409
409
|
queryDbResources: [],
|
|
410
|
-
context: undefined,
|
|
411
410
|
sourceTopics: {},
|
|
412
411
|
consumesDcbLog: true,
|
|
413
|
-
commandTargetName: undefined,
|
|
414
|
-
schedule: undefined,
|
|
415
412
|
schedulesResources: [],
|
|
416
413
|
capabilityNeeds: needs
|
|
417
414
|
});
|
|
@@ -104,16 +104,16 @@ let makeBinding = (
|
|
|
104
104
|
indexes: [
|
|
105
105
|
{index: "byStatus", type_: "S", idField: "status", projectionType: Reventless.ReadModel.ALL},
|
|
106
106
|
],
|
|
107
|
-
subIdField,
|
|
107
|
+
?subIdField,
|
|
108
108
|
capability,
|
|
109
109
|
labelField: "name",
|
|
110
110
|
includeIdParam: true,
|
|
111
111
|
authorization,
|
|
112
|
-
ownerField,
|
|
113
|
-
retiredField,
|
|
114
|
-
retiredValues,
|
|
112
|
+
?ownerField,
|
|
113
|
+
?retiredField,
|
|
114
|
+
?retiredValues,
|
|
115
115
|
namedWhenRetired,
|
|
116
|
-
imageSource,
|
|
116
|
+
?imageSource,
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
let mkPayload = (
|
|
@@ -695,16 +695,12 @@ let geoBinding = (): PgQueryResolver_Lambda.binding => {
|
|
|
695
695
|
indexes: [
|
|
696
696
|
{index: "byStatus", type_: "S", idField: "status", projectionType: Reventless.ReadModel.ALL},
|
|
697
697
|
],
|
|
698
|
-
subIdField:
|
|
698
|
+
subIdField: "lineNo",
|
|
699
699
|
capability,
|
|
700
700
|
labelField: "name",
|
|
701
701
|
includeIdParam: true,
|
|
702
702
|
authorization: Reventless.Authorization.AllowAnonymous,
|
|
703
|
-
ownerField: None,
|
|
704
|
-
retiredField: None,
|
|
705
|
-
retiredValues: None,
|
|
706
703
|
namedWhenRetired: false,
|
|
707
|
-
imageSource: None,
|
|
708
704
|
}
|
|
709
705
|
|
|
710
706
|
// The member type of the first row a door answers with, whatever shape it took.
|
|
@@ -414,37 +414,11 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
|
|
|
414
414
|
delete: 0,
|
|
415
415
|
deleteBatch: 0
|
|
416
416
|
};
|
|
417
|
-
let
|
|
418
|
-
|
|
419
|
-
let authBinding_indexes = init.indexes;
|
|
420
|
-
let authBinding_subIdField = init.subIdField;
|
|
421
|
-
let authBinding_capability = init.capability;
|
|
422
|
-
let authBinding_labelField = init.labelField;
|
|
423
|
-
let authBinding_includeIdParam = init.includeIdParam;
|
|
424
|
-
let authBinding_authorization = init.authorization;
|
|
425
|
-
let authBinding_ownerField = init.ownerField;
|
|
426
|
-
let authBinding_retiredField = init.retiredField;
|
|
427
|
-
let authBinding_retiredValues = init.retiredValues;
|
|
428
|
-
let authBinding_namedWhenRetired = init.namedWhenRetired;
|
|
429
|
-
let authBinding_imageSource = init.imageSource;
|
|
430
|
-
let authBinding = {
|
|
431
|
-
ops: authOps,
|
|
432
|
-
pushdowns: authBinding_pushdowns,
|
|
433
|
-
indexes: authBinding_indexes,
|
|
434
|
-
subIdField: authBinding_subIdField,
|
|
435
|
-
capability: authBinding_capability,
|
|
436
|
-
labelField: authBinding_labelField,
|
|
437
|
-
includeIdParam: authBinding_includeIdParam,
|
|
438
|
-
authorization: authBinding_authorization,
|
|
439
|
-
ownerField: authBinding_ownerField,
|
|
440
|
-
retiredField: authBinding_retiredField,
|
|
441
|
-
retiredValues: authBinding_retiredValues,
|
|
442
|
-
namedWhenRetired: authBinding_namedWhenRetired,
|
|
443
|
-
imageSource: authBinding_imageSource
|
|
444
|
-
};
|
|
417
|
+
let newrecord = {...makeBinding(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined)};
|
|
418
|
+
newrecord.ops = authOps;
|
|
445
419
|
let lookupAuth = name => {
|
|
446
420
|
if (name === "AuthTable") {
|
|
447
|
-
return
|
|
421
|
+
return newrecord;
|
|
448
422
|
}
|
|
449
423
|
};
|
|
450
424
|
let ident = (username, groups) => ({
|
|
@@ -710,11 +684,7 @@ function geoBinding() {
|
|
|
710
684
|
labelField: "name",
|
|
711
685
|
includeIdParam: true,
|
|
712
686
|
authorization: "AllowAnonymous",
|
|
713
|
-
|
|
714
|
-
retiredField: undefined,
|
|
715
|
-
retiredValues: undefined,
|
|
716
|
-
namedWhenRetired: false,
|
|
717
|
-
imageSource: undefined
|
|
687
|
+
namedWhenRetired: false
|
|
718
688
|
};
|
|
719
689
|
}
|
|
720
690
|
|
|
@@ -34,7 +34,7 @@ describe("Platform_ProvidedGroups.poolFromExports", () => {
|
|
|
34
34
|
("identityProviderId", JSON.Encode.string("p1")),
|
|
35
35
|
("identityProviderRegion", JSON.Encode.string("eu-west-1")),
|
|
36
36
|
]),
|
|
37
|
-
)->toEqual(Some({Platform_ProvidedGroups.id: "p1", region:
|
|
37
|
+
)->toEqual(Some({Platform_ProvidedGroups.id: "p1", region: "eu-west-1"}))
|
|
38
38
|
)
|
|
39
39
|
|
|
40
40
|
testSync("reads them nested under default, as an ESM platform exports them", () =>
|
|
@@ -45,7 +45,7 @@ describe("Platform_ProvidedGroups.poolFromExports", () => {
|
|
|
45
45
|
JSON.Encode.object(Dict.fromArray([("cognitoUserPoolId", JSON.Encode.string("p-old"))])),
|
|
46
46
|
),
|
|
47
47
|
]),
|
|
48
|
-
)->toEqual(Some({Platform_ProvidedGroups.id: "p-old"
|
|
48
|
+
)->toEqual(Some({Platform_ProvidedGroups.id: "p-old"}))
|
|
49
49
|
)
|
|
50
50
|
|
|
51
51
|
testSync("no pool id is no pool to list", () => expect(from([]))->toEqual(None))
|
|
@@ -15,9 +15,7 @@ module Provision = ProvisionAccounts
|
|
|
15
15
|
|
|
16
16
|
describe("ProvisionAccounts.parseArgs", () => {
|
|
17
17
|
testSync("no arguments leaves every choice unanswered", () =>
|
|
18
|
-
expect(Provision.parseArgs([]))->toEqual(
|
|
19
|
-
Ok({Provision.providerId: None, stack: None, file: None, help: false}),
|
|
20
|
-
)
|
|
18
|
+
expect(Provision.parseArgs([]))->toEqual(Ok({Provision.providerId: ?None, help: false}))
|
|
21
19
|
)
|
|
22
20
|
|
|
23
21
|
testSync("a pool and a manifest parse", () =>
|
|
@@ -25,9 +23,8 @@ describe("ProvisionAccounts.parseArgs", () => {
|
|
|
25
23
|
Provision.parseArgs(["--provider-id", "eu-west-1_AbCdEfGhI", "--file", "cast.yaml"]),
|
|
26
24
|
)->toEqual(
|
|
27
25
|
Ok({
|
|
28
|
-
Provision.providerId:
|
|
29
|
-
|
|
30
|
-
file: Some("cast.yaml"),
|
|
26
|
+
Provision.providerId: "eu-west-1_AbCdEfGhI",
|
|
27
|
+
file: "cast.yaml",
|
|
31
28
|
help: false,
|
|
32
29
|
}),
|
|
33
30
|
)
|
|
@@ -35,7 +32,7 @@ describe("ProvisionAccounts.parseArgs", () => {
|
|
|
35
32
|
|
|
36
33
|
testSync("--stack picks the deployment to read the pool id from", () =>
|
|
37
34
|
expect(Provision.parseArgs(["--stack", "beta"]))->toEqual(
|
|
38
|
-
Ok({Provision.providerId: None, stack:
|
|
35
|
+
Ok({Provision.providerId: ?None, stack: "beta", help: false}),
|
|
39
36
|
)
|
|
40
37
|
)
|
|
41
38
|
|
|
@@ -54,9 +51,7 @@ describe("ProvisionAccounts.parseArgs", () => {
|
|
|
54
51
|
)
|
|
55
52
|
|
|
56
53
|
testSync("-h asks for the usage", () =>
|
|
57
|
-
expect(Provision.parseArgs(["-h"]))->toEqual(
|
|
58
|
-
Ok({Provision.providerId: None, stack: None, file: None, help: true}),
|
|
59
|
-
)
|
|
54
|
+
expect(Provision.parseArgs(["-h"]))->toEqual(Ok({Provision.providerId: ?None, help: true}))
|
|
60
55
|
)
|
|
61
56
|
})
|
|
62
57
|
|