@awsless/awsless 0.0.142 → 0.0.143

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/dist/bin.js CHANGED
@@ -6456,19 +6456,24 @@ var hr = () => {
6456
6456
  };
6457
6457
  };
6458
6458
 
6459
+ // src/cli/ui/layout/pad-text.ts
6460
+ var padText = (texts) => {
6461
+ const size = Math.max(...texts.map((text) => text.length));
6462
+ return (text, padding = 0) => {
6463
+ return text.padEnd(size + padding);
6464
+ };
6465
+ };
6466
+
6459
6467
  // src/cli/ui/layout/list.ts
6460
6468
  var list = (data) => {
6461
6469
  const padding = 2;
6462
- const gap = 1;
6463
- const size = Object.keys(data).reduce((total, name) => {
6464
- return name.length > total ? name.length : total;
6465
- }, 0);
6470
+ const padName = padText(Object.keys(data));
6466
6471
  return (term) => {
6467
6472
  term.out.gap();
6468
6473
  term.out.write(
6469
6474
  Object.entries(data).map(([name, value]) => [
6470
6475
  " ".repeat(padding),
6471
- style.label((name + ":").padEnd(size + gap + 1)),
6476
+ style.label(padName(name + ":", 2)),
6472
6477
  value,
6473
6478
  br()
6474
6479
  ])
@@ -7173,15 +7178,23 @@ var assetBuilder = (app) => {
7173
7178
  stop();
7174
7179
  }
7175
7180
  }, 3);
7181
+ let failure;
7176
7182
  await Promise.all(
7177
7183
  app.stacks.map(async (stack) => {
7178
7184
  await Promise.all(
7179
7185
  [...stack.assets].map(async (asset) => {
7180
- await queue2.push({ stack, asset });
7186
+ try {
7187
+ await queue2.push({ stack, asset });
7188
+ } catch (error) {
7189
+ failure = error;
7190
+ }
7181
7191
  })
7182
7192
  );
7183
7193
  })
7184
7194
  );
7195
+ if (failure) {
7196
+ throw failure;
7197
+ }
7185
7198
  done("Done building stack assets");
7186
7199
  if (showDetailedView) {
7187
7200
  term.out.gap();
@@ -7675,69 +7688,68 @@ var bootstrap = (program2) => {
7675
7688
  });
7676
7689
  };
7677
7690
 
7678
- // src/cli/ui/complex/deployer.ts
7679
- var stacksDeployer = (deploymentLine) => {
7680
- const stackNames = deploymentLine.map((line2) => line2.map((stack) => stack.name)).flat();
7681
- const stackNameSize = Math.max(...stackNames.map((name) => name.length));
7682
- return (term) => {
7683
- const ui = {};
7684
- term.out.gap();
7685
- for (const i in deploymentLine) {
7686
- const line2 = flexLine(term, [" "], [" ", style.placeholder(Number(i) + 1), style.placeholder(" \u2500\u2500")]);
7687
- term.out.write(line2);
7688
- term.out.write(br());
7689
- for (const stack of deploymentLine[i]) {
7690
- const icon = new Signal(" ");
7691
- const name = new Signal(style.label.dim(stack.name));
7692
- const status2 = new Signal(style.info.dim("waiting"));
7693
- let stopSpinner;
7694
- term.out.write([
7695
- icon,
7696
- " ",
7697
- name,
7698
- " ".repeat(stackNameSize - stack.name.length),
7699
- " ",
7700
- style.placeholder(symbol.pointerSmall),
7701
- " ",
7702
- status2,
7703
- br()
7704
- ]);
7705
- ui[stack.name] = {
7706
- start: (value) => {
7707
- const [spinner, stop] = createSpinner();
7708
- name.set(style.label(stack.name));
7709
- icon.set(spinner);
7710
- status2.set(style.warning(value));
7711
- stopSpinner = stop;
7712
- },
7713
- done(value) {
7714
- stopSpinner();
7715
- icon.set(style.success(symbol.success));
7716
- status2.set(style.success(value));
7717
- },
7718
- fail(value) {
7719
- stopSpinner();
7720
- icon.set(style.error(symbol.error));
7721
- status2.set(style.error(value));
7722
- },
7723
- warn(value) {
7724
- stopSpinner();
7725
- icon.set(style.warning(symbol.warning));
7726
- status2.set(style.warning(value));
7727
- }
7728
- };
7691
+ // src/cli/ui/complex/task-group.ts
7692
+ import { promise as promise2 } from "fastq";
7693
+ var runTaskGroup = (concurrency, tasks) => {
7694
+ const formatLabel = padText(tasks.map((task) => task?.label ?? ""));
7695
+ return async (term) => {
7696
+ const queue2 = promise2(async (task) => {
7697
+ const [icon, stop] = createSpinner();
7698
+ const status2 = new Signal("");
7699
+ const entry = new Signal([
7700
+ icon,
7701
+ " ",
7702
+ style.label(formatLabel(task.label)),
7703
+ " ",
7704
+ style.placeholder(symbol.pointerSmall),
7705
+ " ",
7706
+ status2,
7707
+ br()
7708
+ ]);
7709
+ term.out.write(entry);
7710
+ let result;
7711
+ try {
7712
+ result = await task.task((text) => {
7713
+ status2.set(text);
7714
+ });
7715
+ } catch (error) {
7716
+ result = "fail";
7717
+ throw error;
7718
+ } finally {
7719
+ stop();
7720
+ }
7721
+ switch (result) {
7722
+ case "done":
7723
+ icon.set(style.success(symbol.success));
7724
+ status2.update(style.success);
7725
+ break;
7726
+ case "fail":
7727
+ icon.set(style.error(symbol.error));
7728
+ status2.update(style.error);
7729
+ break;
7730
+ case "warn":
7731
+ icon.set(style.warning(symbol.warning));
7732
+ status2.update(style.warning);
7733
+ break;
7734
+ }
7735
+ }, concurrency);
7736
+ const results = await Promise.allSettled(
7737
+ tasks.map((task) => {
7738
+ return queue2.push(task);
7739
+ })
7740
+ );
7741
+ for (const result of results) {
7742
+ if (result.status === "rejected") {
7743
+ throw result.reason;
7729
7744
  }
7730
7745
  }
7731
- term.out.write(flexLine(term, [" "], [" ", style.warning("\u26A1\uFE0F"), style.placeholder("\u2500\u2500")]));
7732
- term.out.gap();
7733
- return ui;
7734
7746
  };
7735
7747
  };
7736
7748
 
7737
7749
  // src/cli/command/status.ts
7738
7750
  var status = (program2) => {
7739
7751
  program2.command("status").argument("[stacks...]", "Optionally filter stacks to lookup status").description("View the app status").action(async (filters) => {
7740
- await layout(async (config2, write) => {
7752
+ await layout(async (config2, write, term) => {
7741
7753
  const { app, deploymentLine } = await toApp(config2, filters);
7742
7754
  await cleanUp();
7743
7755
  await write(typesGenerator(config2));
@@ -7746,25 +7758,34 @@ var status = (program2) => {
7746
7758
  const doneLoading = write(loadingDialog("Loading stack information..."));
7747
7759
  const client = new StackClient(app, config2.account, config2.app.region, config2.credentials);
7748
7760
  const statuses = [];
7749
- const ui = write(stacksDeployer(deploymentLine));
7750
7761
  debug("Load metadata for all deployed stacks on AWS");
7751
- await Promise.all(
7752
- app.stacks.map(async (stack) => {
7753
- const item = ui[stack.name];
7754
- item.start("loading");
7755
- const info = await client.get(stack.name, stack.region);
7756
- if (!info) {
7757
- item.fail("NON EXISTENT");
7758
- statuses.push("non-existent");
7759
- } else if (info.template !== stack.toString()) {
7760
- item.warn("OUT OF DATE");
7761
- statuses.push("out-of-date");
7762
- } else {
7763
- item.done("UP TO DATE");
7764
- statuses.push("up-to-date");
7765
- }
7766
- })
7762
+ term.out.gap();
7763
+ await write(
7764
+ runTaskGroup(
7765
+ 5,
7766
+ deploymentLine.flat().map((stack) => ({
7767
+ label: stack.name,
7768
+ task: async (update) => {
7769
+ update("Loading...");
7770
+ const info = await client.get(stack.name, stack.region);
7771
+ if (!info) {
7772
+ update("NON EXISTENT");
7773
+ statuses.push("non-existent");
7774
+ return "fail";
7775
+ } else if (info.template !== stack.toString()) {
7776
+ update("OUT OF DATE");
7777
+ statuses.push("out-of-date");
7778
+ return "warn";
7779
+ } else {
7780
+ update("UP TO DATE");
7781
+ statuses.push("up-to-date");
7782
+ return "done";
7783
+ }
7784
+ }
7785
+ }))
7786
+ )
7767
7787
  );
7788
+ term.out.gap();
7768
7789
  doneLoading("Done loading stack information");
7769
7790
  debug("Done loading data for all deployed stacks on AWS");
7770
7791
  if (statuses.includes("non-existent") || statuses.includes("out-of-date")) {
@@ -7780,7 +7801,7 @@ var status = (program2) => {
7780
7801
  import { readFile as readFile7 } from "fs/promises";
7781
7802
  import { join as join10 } from "path";
7782
7803
  import { GetObjectCommand, ObjectCannedACL as ObjectCannedACL2, PutObjectCommand as PutObjectCommand2, S3Client as S3Client2, StorageClass as StorageClass2 } from "@aws-sdk/client-s3";
7783
- import { promise as promise2 } from "fastq";
7804
+ import { promise as promise3 } from "fastq";
7784
7805
  var assetPublisher = (config2, app) => {
7785
7806
  const client = new S3Client2({
7786
7807
  credentials: config2.credentials,
@@ -7789,7 +7810,7 @@ var assetPublisher = (config2, app) => {
7789
7810
  });
7790
7811
  return async (term) => {
7791
7812
  const done = term.out.write(loadingDialog("Publishing stack assets to AWS..."));
7792
- const queue2 = promise2(async ({ stack, asset }) => {
7813
+ const queue2 = promise3(async ({ stack, asset }) => {
7793
7814
  const getFullPath = (file) => {
7794
7815
  return join10(directories.asset, asset.type, app.name, stack.name, asset.id, file);
7795
7816
  };
@@ -8151,6 +8172,7 @@ var singleTester = (stack, dir, filters) => {
8151
8172
  };
8152
8173
  var runTester = (tests, filters = []) => {
8153
8174
  return async (term) => {
8175
+ term.out.gap();
8154
8176
  for (const [name, paths] of tests.entries()) {
8155
8177
  for (const path of paths) {
8156
8178
  const result = await term.out.write(singleTester(name, path, filters));
@@ -8159,6 +8181,7 @@ var runTester = (tests, filters = []) => {
8159
8181
  }
8160
8182
  }
8161
8183
  }
8184
+ term.out.gap();
8162
8185
  return true;
8163
8186
  };
8164
8187
  };
@@ -8166,7 +8189,7 @@ var runTester = (tests, filters = []) => {
8166
8189
  // src/cli/command/deploy.ts
8167
8190
  var deploy = (program2) => {
8168
8191
  program2.command("deploy").argument("[stacks...]", "Optionally filter stacks to deploy").description("Deploy your app to AWS").action(async (filters) => {
8169
- await layout(async (config2, write) => {
8192
+ await layout(async (config2, write, term) => {
8170
8193
  await write(bootstrapDeployer(config2));
8171
8194
  const { app, deploymentLine, tests } = await toApp(config2, filters);
8172
8195
  const stackNames = app.stacks.map((stack) => stack.name);
@@ -8195,28 +8218,30 @@ var deploy = (program2) => {
8195
8218
  await write(templateBuilder(app));
8196
8219
  const doneDeploying = write(loadingDialog("Deploying stacks to AWS..."));
8197
8220
  const client = new StackClient(app, config2.account, config2.app.region, config2.credentials);
8198
- const ui = write(stacksDeployer(deploymentLine));
8199
- for (const line2 of deploymentLine) {
8200
- const results = await Promise.allSettled(
8201
- line2.map(async (stack) => {
8202
- const item = ui[stack.name];
8203
- item.start("deploying");
8204
- try {
8205
- await client.deploy(stack);
8206
- } catch (error) {
8207
- debugError(error);
8208
- item.fail("failed");
8209
- throw error;
8210
- }
8211
- item.done("deployed");
8212
- })
8221
+ term.out.gap();
8222
+ for (const stacks of deploymentLine) {
8223
+ await write(
8224
+ runTaskGroup(
8225
+ 5,
8226
+ stacks.map((stack) => ({
8227
+ label: stack.name,
8228
+ task: async (update) => {
8229
+ update("deploying...");
8230
+ try {
8231
+ await client.deploy(stack);
8232
+ } catch (error) {
8233
+ debugError(error);
8234
+ update("failed");
8235
+ throw error;
8236
+ }
8237
+ update("deployed");
8238
+ return "done";
8239
+ }
8240
+ }))
8241
+ )
8213
8242
  );
8214
- for (const result of results) {
8215
- if (result.status === "rejected") {
8216
- throw result.reason;
8217
- }
8218
- }
8219
8243
  }
8244
+ term.out.gap();
8220
8245
  doneDeploying("Done deploying stacks to AWS");
8221
8246
  });
8222
8247
  });
@@ -8453,7 +8478,7 @@ var dev = (program2) => {
8453
8478
  // src/cli/command/delete.ts
8454
8479
  var del2 = (program2) => {
8455
8480
  program2.command("delete").argument("[stacks...]", "Optionally filter stacks to delete").description("Delete your app from AWS").action(async (filters) => {
8456
- await layout(async (config2, write) => {
8481
+ await layout(async (config2, write, term) => {
8457
8482
  const { app, deploymentLine } = await toApp(config2, filters);
8458
8483
  const deletingLine = deploymentLine.reverse();
8459
8484
  const stackNames = app.stacks.map((stack) => stack.name);
@@ -8477,33 +8502,65 @@ var del2 = (program2) => {
8477
8502
  }
8478
8503
  const doneDeploying = write(loadingDialog("Deleting stacks from AWS..."));
8479
8504
  const client = new StackClient(app, config2.account, config2.app.region, config2.credentials);
8480
- const ui = write(stacksDeployer(deletingLine));
8481
- for (const line2 of deletingLine) {
8482
- const results = await Promise.allSettled(
8483
- line2.map(async (stack) => {
8484
- const item = ui[stack.name];
8485
- item.start("deleting");
8486
- try {
8487
- await client.delete(stack.name, stack.region);
8488
- } catch (error) {
8489
- debugError(error);
8490
- item.fail("failed");
8491
- throw error;
8492
- }
8493
- item.done("deleted");
8494
- })
8505
+ term.out.gap();
8506
+ for (const stacks of deletingLine) {
8507
+ await write(
8508
+ runTaskGroup(
8509
+ 5,
8510
+ stacks.map((stack) => ({
8511
+ label: stack.name,
8512
+ task: async (update) => {
8513
+ update("deleting...");
8514
+ try {
8515
+ await client.delete(stack.name, stack.region);
8516
+ } catch (error) {
8517
+ debugError(error);
8518
+ update("failed");
8519
+ throw error;
8520
+ }
8521
+ update("deleted");
8522
+ return "done";
8523
+ }
8524
+ }))
8525
+ )
8495
8526
  );
8496
- for (const result of results) {
8497
- if (result.status === "rejected") {
8498
- throw result.reason;
8499
- }
8500
- }
8501
8527
  }
8528
+ term.out.gap();
8502
8529
  doneDeploying("Done deleting stacks from AWS");
8503
8530
  });
8504
8531
  });
8505
8532
  };
8506
8533
 
8534
+ // src/cli/command/draw.ts
8535
+ var draw = (program2) => {
8536
+ program2.command("draw").description("Test your app").action(async () => {
8537
+ await layout(async (config2, write) => {
8538
+ await write(
8539
+ runTaskGroup(1, [
8540
+ {
8541
+ label: "stack-1",
8542
+ task: async (update) => {
8543
+ update("Loading...");
8544
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
8545
+ update("Done");
8546
+ return "warn";
8547
+ }
8548
+ },
8549
+ {
8550
+ label: "stack-2",
8551
+ task: async (update) => {
8552
+ update("Loading...");
8553
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
8554
+ update("Done");
8555
+ return "done";
8556
+ }
8557
+ }
8558
+ ])
8559
+ );
8560
+ });
8561
+ });
8562
+ };
8563
+
8507
8564
  // src/cli/program.ts
8508
8565
  var program = new Command();
8509
8566
  program.name(logo().join("").replace(/\s+/, ""));
@@ -8533,7 +8590,8 @@ var commands2 = [
8533
8590
  del2,
8534
8591
  dev,
8535
8592
  config,
8536
- test
8593
+ test,
8594
+ draw
8537
8595
  // diff,
8538
8596
  // remove,
8539
8597
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awsless/awsless",
3
- "version": "0.0.142",
3
+ "version": "0.0.143",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -28,12 +28,12 @@
28
28
  }
29
29
  },
30
30
  "peerDependencies": {
31
- "@awsless/sns": "^0.0.7",
32
- "@awsless/redis": "^0.0.10",
33
31
  "@awsless/lambda": "^0.0.15",
32
+ "@awsless/redis": "^0.0.10",
33
+ "@awsless/sns": "^0.0.7",
34
34
  "@awsless/sqs": "^0.0.7",
35
- "@awsless/validate": "^0.0.10",
36
35
  "@awsless/ssm": "^0.0.7",
36
+ "@awsless/validate": "^0.0.10",
37
37
  "@awsless/weak-cache": "^0.0.1"
38
38
  },
39
39
  "dependencies": {