@reventlessdev/reventless-aws 3.0.0-alpha.354 → 3.0.0-alpha.356
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 +21 -0
- package/package.json +11 -11
- package/scripts/BakeManifest.res +31 -51
- package/scripts/BakeManifest.res.mjs +46 -130
- package/scripts/DeployApp.res +40 -54
- package/scripts/DeployApp.res.mjs +84 -149
- package/scripts/ProvisionAccounts.res +39 -60
- package/scripts/ProvisionAccounts.res.mjs +41 -131
- package/scripts/ProvisionAdmin.res +54 -69
- package/scripts/ProvisionAdmin.res.mjs +67 -141
- package/scripts/ProvisionIdentity.res +50 -70
- package/scripts/ProvisionIdentity.res.mjs +59 -141
- package/tests/CommandLineTest.res +94 -0
- package/tests/CommandLineTest.res.mjs +125 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 3.0.0-alpha.356 (2026-09-23)
|
|
7
|
+
|
|
8
|
+
* feat(node)!: every command-line tool reads its arguments through parseArgs ([2e41979](https://github.com/ReventlessDev/reventless-core/commit/2e41979b73646c46356e197e17eb4a3da0154c73))
|
|
9
|
+
|
|
10
|
+
### BREAKING CHANGES
|
|
11
|
+
|
|
12
|
+
* NodeProcess.onSignal takes the new NodeProcess.signal
|
|
13
|
+
variant (SIGINT | SIGTERM | SIGHUP) instead of a polymorphic variant:
|
|
14
|
+
write onSignal(SIGINT, …) for onSignal(#SIGINT, …). Node receives the
|
|
15
|
+
same string.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# 3.0.0-alpha.355 (2026-09-23)
|
|
20
|
+
|
|
21
|
+
**Note:** Version bump only for package @reventlessdev/reventless-aws
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
6
27
|
# 3.0.0-alpha.354 (2026-09-22)
|
|
7
28
|
|
|
8
29
|
**Note:** Version bump only for package @reventlessdev/reventless-aws
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/reventless-aws",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.356",
|
|
4
4
|
"description": "AWS adapters for Reventless",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"bin": {
|
|
@@ -20,19 +20,19 @@
|
|
|
20
20
|
"sury": "11.0.0",
|
|
21
21
|
"uuid": "^13.0.0",
|
|
22
22
|
"yaml": "^2.8.3",
|
|
23
|
-
"@reventlessdev/rescript-
|
|
24
|
-
"@reventlessdev/rescript-node": "2.0.0-alpha.13",
|
|
23
|
+
"@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.22",
|
|
25
24
|
"@reventlessdev/rescript-jest": "1.0.0-alpha.11",
|
|
26
|
-
"@reventlessdev/rescript-
|
|
27
|
-
"@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.
|
|
25
|
+
"@reventlessdev/rescript-node": "2.0.0-alpha.15",
|
|
26
|
+
"@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.17",
|
|
27
|
+
"@reventlessdev/rescript-effect": "0.1.0-alpha.34",
|
|
28
28
|
"@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.22",
|
|
29
|
+
"@reventlessdev/rescript-web": "1.0.0-alpha.5",
|
|
30
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.172",
|
|
31
|
+
"@reventlessdev/reventless-postgres": "3.0.0-alpha.136",
|
|
32
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.144",
|
|
33
|
+
"@reventlessdev/reventless-core": "3.0.0-alpha.272",
|
|
29
34
|
"@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
|
|
30
|
-
"@reventlessdev/reventless-interop": "3.0.0-alpha.38"
|
|
31
|
-
"@reventlessdev/reventless-infra": "3.0.0-alpha.170",
|
|
32
|
-
"@reventlessdev/reventless-core": "3.0.0-alpha.270",
|
|
33
|
-
"@reventlessdev/reventless-spec": "3.0.0-alpha.142",
|
|
34
|
-
"@reventlessdev/reventless-postgres": "3.0.0-alpha.134",
|
|
35
|
-
"@reventlessdev/rescript-web": "1.0.0-alpha.5"
|
|
35
|
+
"@reventlessdev/reventless-interop": "3.0.0-alpha.38"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"rescript": "12.3.1",
|
package/scripts/BakeManifest.res
CHANGED
|
@@ -30,36 +30,19 @@ type args = {
|
|
|
30
30
|
help: bool,
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
let parseArgs = (argv: array<string>): result<args, string> =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
| (Ok(a), "--manifest", Some(v)) =>
|
|
43
|
-
acc := Ok({...a, manifest: Some(v)})
|
|
44
|
-
i := i.contents + 2
|
|
45
|
-
| (Ok(a), "--stack", Some(v)) =>
|
|
46
|
-
acc := Ok({...a, stack: Some(v)})
|
|
47
|
-
i := i.contents + 2
|
|
48
|
-
| (Ok(a), "--since", Some(v)) =>
|
|
49
|
-
acc := Ok({...a, since: v == "" ? None : Some(v)})
|
|
50
|
-
i := i.contents + 2
|
|
51
|
-
| (Ok(a), "--help", _) | (Ok(a), "-h", _) =>
|
|
52
|
-
acc := Ok({...a, help: true})
|
|
53
|
-
i := i.contents + 1
|
|
54
|
-
| (Ok(_), "--manifest", None) | (Ok(_), "--stack", None) | (Ok(_), "--since", None) =>
|
|
55
|
-
acc := Error(`${flag} needs a value`)
|
|
56
|
-
| (Ok(_), unknown, _) => acc := Error(`unknown argument "${unknown}"`)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
acc.contents
|
|
60
|
-
}
|
|
33
|
+
let parseArgs = (argv: array<string>): result<args, string> =>
|
|
34
|
+
Reventless.CliArgs.parse(~strings=["manifest", "stack", "since"], argv)
|
|
35
|
+
->Result.flatMap(Reventless.CliArgs.noPositionals)
|
|
36
|
+
->Result.map(a => {
|
|
37
|
+
manifest: a->Reventless.CliArgs.string("manifest"),
|
|
38
|
+
stack: a->Reventless.CliArgs.string("stack"),
|
|
39
|
+
since: a->Reventless.CliArgs.string("since")->Option.flatMap(v => v == "" ? None : Some(v)),
|
|
40
|
+
help: a->Reventless.CliArgs.help,
|
|
41
|
+
})
|
|
61
42
|
|
|
62
43
|
let usage = `
|
|
44
|
+
Usage: bake-manifest [--manifest <path>] [--stack <name>] [--since <instant>]
|
|
45
|
+
|
|
63
46
|
Bake the component manifest of a deployed platform.
|
|
64
47
|
|
|
65
48
|
--manifest <path> The deploy manifest. Defaults to ${DeployManifest.defaultFile}
|
|
@@ -363,33 +346,30 @@ let bake = async (~manifest: DeployManifest.resolved, ~stack: string, ~since: op
|
|
|
363
346
|
}
|
|
364
347
|
}
|
|
365
348
|
|
|
366
|
-
let run = async (): result<unit, string> =>
|
|
367
|
-
switch
|
|
349
|
+
let run = async (args: args): result<unit, string> =>
|
|
350
|
+
switch DeployManifest.load(args.manifest->Option.getOr(DeployManifest.defaultFile)) {
|
|
368
351
|
| Error(_) as e => e
|
|
369
|
-
| Ok(
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
switch DeployManifest.load(args.manifest->Option.getOr(DeployManifest.defaultFile)) {
|
|
374
|
-
| Error(_) as e => e
|
|
375
|
-
| Ok(manifest) =>
|
|
376
|
-
switch args.stack->Option.orElse(PulumiCli.selectedStack(~dir=manifest.platform.dir)) {
|
|
377
|
-
| None => Error(`no stack selected in ${manifest.platform.dir} — pass --stack`)
|
|
378
|
-
| Some(stack) => await bake(~manifest, ~stack, ~since=args.since)
|
|
379
|
-
}
|
|
352
|
+
| Ok(manifest) =>
|
|
353
|
+
switch args.stack->Option.orElse(PulumiCli.selectedStack(~dir=manifest.platform.dir)) {
|
|
354
|
+
| None => Error(`no stack selected in ${manifest.platform.dir} — pass --stack`)
|
|
355
|
+
| Some(stack) => await bake(~manifest, ~stack, ~since=args.since)
|
|
380
356
|
}
|
|
381
357
|
}
|
|
382
358
|
|
|
383
|
-
let
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
359
|
+
let cli: Reventless.CliArgs.cli<args> = {bin: "bake-manifest", usage, parse: parseArgs}
|
|
360
|
+
|
|
361
|
+
let main = () =>
|
|
362
|
+
Reventless.CliArgs.run(cli, async args =>
|
|
363
|
+
switch await run(args) {
|
|
364
|
+
| Ok() => ()
|
|
365
|
+
| Error(message) =>
|
|
366
|
+
Console.error(inGitHubActions() ? `::error::${message}` : `bake-manifest: ${message}`)
|
|
367
|
+
NodeProcess.exit(1)
|
|
368
|
+
| exception exn =>
|
|
369
|
+
Console.error(`bake-manifest: ${Util_AwsError.describe(exn)}`)
|
|
370
|
+
NodeProcess.exit(1)
|
|
371
|
+
}
|
|
372
|
+
)
|
|
393
373
|
|
|
394
374
|
// No top-level call: `../run-bake-manifest.mjs` invokes [main], so a test can
|
|
395
375
|
// import this module.
|
|
@@ -5,7 +5,9 @@ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
|
5
5
|
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
6
6
|
import * as Lambda$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/Lambda.res.mjs";
|
|
7
7
|
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
8
|
+
import * as Stdlib_Result from "@rescript/runtime/lib/es6/Stdlib_Result.js";
|
|
8
9
|
import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
|
|
10
|
+
import * as CliArgs$Reventless from "@reventlessdev/reventless-spec/src/CliArgs.res.mjs";
|
|
9
11
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
10
12
|
import * as ClientLambda from "@aws-sdk/client-lambda";
|
|
11
13
|
import * as PulumiCli$ReventlessAws from "./PulumiCli.res.mjs";
|
|
@@ -13,110 +15,27 @@ import * as Util_AwsError$ReventlessAws from "../src/util/Util_AwsError.res.mjs"
|
|
|
13
15
|
import * as DeployManifest$ReventlessAws from "./DeployManifest.res.mjs";
|
|
14
16
|
|
|
15
17
|
function parseArgs(argv) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
let flag = argv[i];
|
|
29
|
-
let value = argv[i + 1 | 0];
|
|
30
|
-
let match = acc;
|
|
31
|
-
let exit = 0;
|
|
32
|
-
if (match.TAG === "Ok") {
|
|
33
|
-
let a = match._0;
|
|
34
|
-
let exit$1 = 0;
|
|
35
|
-
switch (flag) {
|
|
36
|
-
case "--manifest" :
|
|
37
|
-
if (value !== undefined) {
|
|
38
|
-
acc = {
|
|
39
|
-
TAG: "Ok",
|
|
40
|
-
_0: {
|
|
41
|
-
manifest: value,
|
|
42
|
-
stack: a.stack,
|
|
43
|
-
since: a.since,
|
|
44
|
-
help: a.help
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
i = i + 2 | 0;
|
|
48
|
-
} else {
|
|
49
|
-
exit = 1;
|
|
50
|
-
}
|
|
51
|
-
break;
|
|
52
|
-
case "--since" :
|
|
53
|
-
if (value !== undefined) {
|
|
54
|
-
acc = {
|
|
55
|
-
TAG: "Ok",
|
|
56
|
-
_0: {
|
|
57
|
-
manifest: a.manifest,
|
|
58
|
-
stack: a.stack,
|
|
59
|
-
since: value === "" ? undefined : value,
|
|
60
|
-
help: a.help
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
i = i + 2 | 0;
|
|
64
|
-
} else {
|
|
65
|
-
exit = 1;
|
|
66
|
-
}
|
|
67
|
-
break;
|
|
68
|
-
case "--stack" :
|
|
69
|
-
if (value !== undefined) {
|
|
70
|
-
acc = {
|
|
71
|
-
TAG: "Ok",
|
|
72
|
-
_0: {
|
|
73
|
-
manifest: a.manifest,
|
|
74
|
-
stack: value,
|
|
75
|
-
since: a.since,
|
|
76
|
-
help: a.help
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
i = i + 2 | 0;
|
|
80
|
-
} else {
|
|
81
|
-
exit = 1;
|
|
82
|
-
}
|
|
83
|
-
break;
|
|
84
|
-
case "--help" :
|
|
85
|
-
case "-h" :
|
|
86
|
-
exit$1 = 2;
|
|
87
|
-
break;
|
|
88
|
-
default:
|
|
89
|
-
acc = {
|
|
90
|
-
TAG: "Error",
|
|
91
|
-
_0: `unknown argument "` + flag + `"`
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
if (exit$1 === 2) {
|
|
95
|
-
acc = {
|
|
96
|
-
TAG: "Ok",
|
|
97
|
-
_0: {
|
|
98
|
-
manifest: a.manifest,
|
|
99
|
-
stack: a.stack,
|
|
100
|
-
since: a.since,
|
|
101
|
-
help: true
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
i = i + 1 | 0;
|
|
18
|
+
return Stdlib_Result.map(Stdlib_Result.flatMap(CliArgs$Reventless.parse([
|
|
19
|
+
"manifest",
|
|
20
|
+
"stack",
|
|
21
|
+
"since"
|
|
22
|
+
], undefined, undefined, undefined, argv), CliArgs$Reventless.noPositionals), a => ({
|
|
23
|
+
manifest: CliArgs$Reventless.string(a, "manifest"),
|
|
24
|
+
stack: CliArgs$Reventless.string(a, "stack"),
|
|
25
|
+
since: Stdlib_Option.flatMap(CliArgs$Reventless.string(a, "since"), v => {
|
|
26
|
+
if (v === "") {
|
|
27
|
+
return;
|
|
28
|
+
} else {
|
|
29
|
+
return v;
|
|
105
30
|
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (exit === 1) {
|
|
110
|
-
acc = {
|
|
111
|
-
TAG: "Error",
|
|
112
|
-
_0: flag + ` needs a value`
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
return acc;
|
|
31
|
+
}),
|
|
32
|
+
help: CliArgs$Reventless.help(a)
|
|
33
|
+
}));
|
|
117
34
|
}
|
|
118
35
|
|
|
119
36
|
let usage = `
|
|
37
|
+
Usage: bake-manifest [--manifest <path>] [--stack <name>] [--since <instant>]
|
|
38
|
+
|
|
120
39
|
Bake the component manifest of a deployed platform.
|
|
121
40
|
|
|
122
41
|
--manifest <path> The deploy manifest. Defaults to ` + DeployManifest$ReventlessAws.defaultFile + `
|
|
@@ -409,24 +328,12 @@ async function bake(manifest, stack, since) {
|
|
|
409
328
|
};
|
|
410
329
|
}
|
|
411
330
|
|
|
412
|
-
async function run() {
|
|
413
|
-
let e =
|
|
331
|
+
async function run(args) {
|
|
332
|
+
let e = DeployManifest$ReventlessAws.load(Stdlib_Option.getOr(args.manifest, DeployManifest$ReventlessAws.defaultFile));
|
|
414
333
|
if (e.TAG !== "Ok") {
|
|
415
334
|
return e;
|
|
416
335
|
}
|
|
417
|
-
let
|
|
418
|
-
if (args.help) {
|
|
419
|
-
console.log(usage);
|
|
420
|
-
return {
|
|
421
|
-
TAG: "Ok",
|
|
422
|
-
_0: undefined
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
let e$1 = DeployManifest$ReventlessAws.load(Stdlib_Option.getOr(args.manifest, DeployManifest$ReventlessAws.defaultFile));
|
|
426
|
-
if (e$1.TAG !== "Ok") {
|
|
427
|
-
return e$1;
|
|
428
|
-
}
|
|
429
|
-
let manifest = e$1._0;
|
|
336
|
+
let manifest = e._0;
|
|
430
337
|
let stack = Stdlib_Option.orElse(args.stack, PulumiCli$ReventlessAws.selectedStack(manifest.platform.dir));
|
|
431
338
|
if (stack !== undefined) {
|
|
432
339
|
return await bake(manifest, stack, args.since);
|
|
@@ -438,22 +345,30 @@ async function run() {
|
|
|
438
345
|
}
|
|
439
346
|
}
|
|
440
347
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
348
|
+
let cli = {
|
|
349
|
+
bin: "bake-manifest",
|
|
350
|
+
usage: usage,
|
|
351
|
+
parse: parseArgs
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
function main() {
|
|
355
|
+
return CliArgs$Reventless.run(cli, undefined, undefined, async args => {
|
|
356
|
+
let message;
|
|
357
|
+
try {
|
|
358
|
+
message = await run(args);
|
|
359
|
+
} catch (raw_exn) {
|
|
360
|
+
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
361
|
+
console.error(`bake-manifest: ` + Util_AwsError$ReventlessAws.describe(exn));
|
|
362
|
+
process.exit(1);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (message.TAG === "Ok") {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
let message$1 = message._0;
|
|
369
|
+
console.error(inGitHubActions() ? `::error::` + message$1 : `bake-manifest: ` + message$1);
|
|
448
370
|
process.exit(1);
|
|
449
|
-
|
|
450
|
-
}
|
|
451
|
-
if (message.TAG === "Ok") {
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
let message$1 = message._0;
|
|
455
|
-
console.error(inGitHubActions() ? `::error::` + message$1 : `bake-manifest: ` + message$1);
|
|
456
|
-
process.exit(1);
|
|
371
|
+
});
|
|
457
372
|
}
|
|
458
373
|
|
|
459
374
|
let Lambda;
|
|
@@ -482,6 +397,7 @@ export {
|
|
|
482
397
|
invokeWith,
|
|
483
398
|
bake,
|
|
484
399
|
run,
|
|
400
|
+
cli,
|
|
485
401
|
main,
|
|
486
402
|
}
|
|
487
403
|
/* Lambda-AwsSdk Not a pure module */
|
package/scripts/DeployApp.res
CHANGED
|
@@ -37,39 +37,28 @@ type args = {
|
|
|
37
37
|
|
|
38
38
|
let defaultStack = "dev"
|
|
39
39
|
|
|
40
|
-
let parseArgs = (argv: array<string>): result<args, string> =>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
| (Error(_), _, _) => i := count
|
|
49
|
-
| (Ok(a), "up", _) if a.command == None =>
|
|
50
|
-
acc := Ok({...a, command: Some(Up)})
|
|
51
|
-
i := i.contents + 1
|
|
52
|
-
| (Ok(a), "down", _) if a.command == None =>
|
|
53
|
-
acc := Ok({...a, command: Some(Down)})
|
|
54
|
-
i := i.contents + 1
|
|
55
|
-
| (Ok(a), "--manifest", Some(v)) =>
|
|
56
|
-
acc := Ok({...a, manifest: Some(v)})
|
|
57
|
-
i := i.contents + 2
|
|
58
|
-
| (Ok(a), "--stack", Some(v)) =>
|
|
59
|
-
acc := Ok({...a, stack: v})
|
|
60
|
-
i := i.contents + 2
|
|
61
|
-
| (Ok(a), "--help", _) | (Ok(a), "-h", _) =>
|
|
62
|
-
acc := Ok({...a, help: true})
|
|
63
|
-
i := i.contents + 1
|
|
64
|
-
| (Ok(_), "--manifest", None) | (Ok(_), "--stack", None) =>
|
|
65
|
-
acc := Error(`${flag} needs a value`)
|
|
66
|
-
| (Ok(_), unknown, _) => acc := Error(`unknown argument "${unknown}"`)
|
|
40
|
+
let parseArgs = (argv: array<string>): result<args, string> =>
|
|
41
|
+
Reventless.CliArgs.parse(~strings=["manifest", "stack"], argv)->Result.flatMap(a => {
|
|
42
|
+
let help = a->Reventless.CliArgs.help
|
|
43
|
+
let args = {
|
|
44
|
+
command: None,
|
|
45
|
+
manifest: a->Reventless.CliArgs.string("manifest"),
|
|
46
|
+
stack: a->Reventless.CliArgs.string("stack")->Option.getOr(defaultStack),
|
|
47
|
+
help,
|
|
67
48
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
49
|
+
let positionals = a->Reventless.CliArgs.positionals
|
|
50
|
+
switch (positionals->Array.get(0), positionals->Array.get(1)) {
|
|
51
|
+
| (_, Some(surplus)) => Reventless.CliArgs.extra(surplus)
|
|
52
|
+
| (Some("up"), None) => Ok({...args, command: Some(Up)})
|
|
53
|
+
| (Some("down"), None) => Ok({...args, command: Some(Down)})
|
|
54
|
+
| (Some(other), None) => Reventless.CliArgs.extra(other)
|
|
55
|
+
| (None, None) => help ? Ok(args) : Error("say `up` or `down`")
|
|
56
|
+
}
|
|
57
|
+
})
|
|
71
58
|
|
|
72
59
|
let usage = `
|
|
60
|
+
Usage: deploy-app up|down [--manifest <path>] [--stack <name>]
|
|
61
|
+
|
|
73
62
|
Deploy an app to AWS, or remove it again.
|
|
74
63
|
|
|
75
64
|
deploy-app up Deploy the platform and every plugin, bake the component
|
|
@@ -675,34 +664,31 @@ let down = async (~manifest: DeployManifest.resolved, ~stack: string): result<un
|
|
|
675
664
|
}
|
|
676
665
|
}
|
|
677
666
|
|
|
678
|
-
let run = async (): result<unit, string> =>
|
|
679
|
-
switch
|
|
667
|
+
let run = async ({command, manifest, stack}: args): result<unit, string> =>
|
|
668
|
+
switch DeployManifest.load(manifest->Option.getOr(DeployManifest.defaultFile)) {
|
|
680
669
|
| Error(_) as e => e
|
|
681
|
-
| Ok(
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
switch DeployManifest.load(manifest->Option.getOr(DeployManifest.defaultFile)) {
|
|
687
|
-
| Error(_) as e => e
|
|
688
|
-
| Ok(manifest) =>
|
|
689
|
-
switch command {
|
|
690
|
-
| Up => await up(~manifest, ~stack)
|
|
691
|
-
| Down => await down(~manifest, ~stack)
|
|
692
|
-
}
|
|
670
|
+
| Ok(manifest) =>
|
|
671
|
+
switch command {
|
|
672
|
+
| Some(Up) => await up(~manifest, ~stack)
|
|
673
|
+
| Some(Down) => await down(~manifest, ~stack)
|
|
674
|
+
| None => Error("say `up` or `down`")
|
|
693
675
|
}
|
|
694
676
|
}
|
|
695
677
|
|
|
696
|
-
let
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
678
|
+
let cli: Reventless.CliArgs.cli<args> = {bin: "deploy-app", usage, parse: parseArgs}
|
|
679
|
+
|
|
680
|
+
let main = () =>
|
|
681
|
+
Reventless.CliArgs.run(cli, async args =>
|
|
682
|
+
switch await run(args) {
|
|
683
|
+
| Ok() => ()
|
|
684
|
+
| Error(message) =>
|
|
685
|
+
Console.error(`deploy-app: ${message}`)
|
|
686
|
+
NodeProcess.exit(1)
|
|
687
|
+
| exception exn =>
|
|
688
|
+
Console.error(`deploy-app: ${Util_AwsError.describe(exn)}`)
|
|
689
|
+
NodeProcess.exit(1)
|
|
690
|
+
}
|
|
691
|
+
)
|
|
706
692
|
|
|
707
693
|
// No top-level call: `../run-deploy-app.mjs` invokes [main], so a test can import
|
|
708
694
|
// this module.
|