@reventlessdev/reventless-aws 3.0.0-alpha.355 → 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 CHANGED
@@ -3,6 +3,19 @@
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
+
6
19
  # 3.0.0-alpha.355 (2026-09-23)
7
20
 
8
21
  **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.355",
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-aws-sdk": "3.0.0-alpha.21",
23
+ "@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.22",
24
24
  "@reventlessdev/rescript-jest": "1.0.0-alpha.11",
25
- "@reventlessdev/rescript-node": "2.0.0-alpha.14",
25
+ "@reventlessdev/rescript-node": "2.0.0-alpha.15",
26
+ "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.17",
26
27
  "@reventlessdev/rescript-effect": "0.1.0-alpha.34",
27
- "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.16",
28
28
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.22",
29
- "@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
30
29
  "@reventlessdev/rescript-web": "1.0.0-alpha.5",
31
- "@reventlessdev/reventless-interop": "3.0.0-alpha.38",
32
- "@reventlessdev/reventless-infra": "3.0.0-alpha.171",
33
- "@reventlessdev/reventless-core": "3.0.0-alpha.271",
34
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.135",
35
- "@reventlessdev/reventless-spec": "3.0.0-alpha.143"
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",
34
+ "@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
35
+ "@reventlessdev/reventless-interop": "3.0.0-alpha.38"
36
36
  },
37
37
  "devDependencies": {
38
38
  "rescript": "12.3.1",
@@ -30,36 +30,19 @@ type args = {
30
30
  help: bool,
31
31
  }
32
32
 
33
- let parseArgs = (argv: array<string>): result<args, string> => {
34
- let acc = ref(Ok({manifest: None, stack: None, since: None, help: false}))
35
- let i = ref(0)
36
- let count = argv->Array.length
37
- while i.contents < count {
38
- let flag = argv->Array.getUnsafe(i.contents)
39
- let value = argv->Array.get(i.contents + 1)
40
- switch (acc.contents, flag, value) {
41
- | (Error(_), _, _) => i := count
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 parseArgs(NodeProcess.argv->Array.slice(~start=2, ~end=NodeProcess.argv->Array.length)) {
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(args) if args.help =>
370
- Console.log(usage)
371
- Ok()
372
- | Ok(args) =>
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 main = async () =>
384
- switch await run() {
385
- | Ok() => ()
386
- | Error(message) =>
387
- Console.error(inGitHubActions() ? `::error::${message}` : `bake-manifest: ${message}`)
388
- NodeProcess.exit(1)
389
- | exception exn =>
390
- Console.error(`bake-manifest: ${Util_AwsError.describe(exn)}`)
391
- NodeProcess.exit(1)
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
- let acc = {
17
- TAG: "Ok",
18
- _0: {
19
- manifest: undefined,
20
- stack: undefined,
21
- since: undefined,
22
- help: false
23
- }
24
- };
25
- let i = 0;
26
- let count = argv.length;
27
- while (i < count) {
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
- } else {
107
- i = count;
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 = parseArgs(process.argv.slice(2, process.argv.length));
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 args = e._0;
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
- async function main() {
442
- let message;
443
- try {
444
- message = await run();
445
- } catch (raw_exn) {
446
- let exn = Primitive_exceptions.internalToException(raw_exn);
447
- console.error(`bake-manifest: ` + Util_AwsError$ReventlessAws.describe(exn));
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
- return;
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 */
@@ -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
- let acc = ref(Ok({command: None, manifest: None, stack: defaultStack, help: false}))
42
- let i = ref(0)
43
- let count = argv->Array.length
44
- while i.contents < count {
45
- let flag = argv->Array.getUnsafe(i.contents)
46
- let value = argv->Array.get(i.contents + 1)
47
- switch (acc.contents, flag, value) {
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
- acc.contents
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 parseArgs(NodeProcess.argv->Array.slice(~start=2, ~end=NodeProcess.argv->Array.length)) {
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(args) if args.help =>
682
- Console.log(usage)
683
- Ok()
684
- | Ok({command: None}) => Error("say `up` or `down` (--help for more)")
685
- | Ok({command: Some(command), manifest, stack}) =>
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 main = async () =>
697
- switch await run() {
698
- | Ok() => ()
699
- | Error(message) =>
700
- Console.error(`deploy-app: ${message}`)
701
- NodeProcess.exit(1)
702
- | exception exn =>
703
- Console.error(`deploy-app: ${Util_AwsError.describe(exn)}`)
704
- NodeProcess.exit(1)
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.