@effortless-aws/cli 0.5.0 → 0.7.0

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.
Files changed (2) hide show
  1. package/dist/cli/index.js +69 -29
  2. package/package.json +3 -3
package/dist/cli/index.js CHANGED
@@ -3832,6 +3832,7 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3832
3832
  name,
3833
3833
  visibilityTimeout = 30,
3834
3834
  retentionPeriod = 345600,
3835
+ delay = 0,
3835
3836
  contentBasedDeduplication = true,
3836
3837
  tags
3837
3838
  } = input;
@@ -3854,7 +3855,8 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3854
3855
  FifoQueue: "true",
3855
3856
  ContentBasedDeduplication: String(contentBasedDeduplication),
3856
3857
  VisibilityTimeout: String(visibilityTimeout),
3857
- MessageRetentionPeriod: String(retentionPeriod)
3858
+ MessageRetentionPeriod: String(retentionPeriod),
3859
+ DelaySeconds: String(delay)
3858
3860
  },
3859
3861
  ...tags ? { tags } : {}
3860
3862
  });
@@ -3867,7 +3869,8 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3867
3869
  Attributes: {
3868
3870
  ContentBasedDeduplication: String(contentBasedDeduplication),
3869
3871
  VisibilityTimeout: String(visibilityTimeout),
3870
- MessageRetentionPeriod: String(retentionPeriod)
3872
+ MessageRetentionPeriod: String(retentionPeriod),
3873
+ DelaySeconds: String(delay)
3871
3874
  }
3872
3875
  });
3873
3876
  if (tags) {
@@ -4052,7 +4055,14 @@ var extractDepsKeys = (obj) => {
4052
4055
  return false;
4053
4056
  });
4054
4057
  if (!depsProp || depsProp.getKind() !== SyntaxKind.PropertyAssignment) return [];
4055
- const init = depsProp.getInitializer();
4058
+ let init = depsProp.getInitializer();
4059
+ if (!init) return [];
4060
+ if (init.getKind() === SyntaxKind.ArrowFunction) {
4061
+ const body = init.getBody();
4062
+ if (body.getKind() === SyntaxKind.ParenthesizedExpression) {
4063
+ init = body.getExpression();
4064
+ }
4065
+ }
4056
4066
  if (!init || init.getKind() !== SyntaxKind.ObjectLiteralExpression) return [];
4057
4067
  const depsObj = init;
4058
4068
  return depsObj.getProperties().map((p) => {
@@ -4434,6 +4444,7 @@ var checkMissingParams = (params) => Effect25.gen(function* () {
4434
4444
 
4435
4445
  // src/deploy/deploy-table.ts
4436
4446
  import { Effect as Effect27 } from "effect";
4447
+ import { toSeconds } from "effortless-aws";
4437
4448
 
4438
4449
  // src/deploy/shared.ts
4439
4450
  import { Effect as Effect26 } from "effect";
@@ -4554,9 +4565,9 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4554
4565
  handlerName,
4555
4566
  defaultPermissions: TABLE_DEFAULT_PERMISSIONS,
4556
4567
  bundleType: "table",
4557
- ...config.permissions ? { permissions: config.permissions } : {},
4558
- ...config.memory ? { memory: config.memory } : {},
4559
- ...config.timeout ? { timeout: config.timeout } : {},
4568
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
4569
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
4570
+ ...config.lambda?.timeout ? { timeout: toSeconds(config.lambda.timeout) } : {},
4560
4571
  ...layerArn ? { layerArn } : {},
4561
4572
  ...external ? { external } : {},
4562
4573
  depsEnv: selfEnv,
@@ -4568,7 +4579,7 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4568
4579
  functionArn,
4569
4580
  streamArn,
4570
4581
  batchSize: config.batchSize ?? 100,
4571
- batchWindow: config.batchWindow ?? 2,
4582
+ batchWindow: toSeconds(config.batchWindow ?? 2),
4572
4583
  startingPosition: config.startingPosition ?? "LATEST"
4573
4584
  });
4574
4585
  yield* Effect27.logDebug(`Table deployment complete! Table: ${tableArn}`);
@@ -4646,6 +4657,7 @@ var deployAllTables = (input) => Effect27.gen(function* () {
4646
4657
 
4647
4658
  // src/deploy/deploy-api.ts
4648
4659
  import { Effect as Effect28 } from "effect";
4660
+ import { toSeconds as toSeconds2 } from "effortless-aws";
4649
4661
  var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect28.gen(function* () {
4650
4662
  const { exportName, config } = fn13;
4651
4663
  const handlerName = exportName;
@@ -4654,9 +4666,9 @@ var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPer
4654
4666
  exportName,
4655
4667
  handlerName,
4656
4668
  bundleType: "api",
4657
- ...config.permissions ? { permissions: config.permissions } : {},
4658
- ...config.memory ? { memory: config.memory } : {},
4659
- ...config.timeout ? { timeout: config.timeout } : {},
4669
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
4670
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
4671
+ ...config.lambda?.timeout ? { timeout: toSeconds2(config.lambda.timeout) } : {},
4660
4672
  ...layerArn ? { layerArn } : {},
4661
4673
  ...external ? { external } : {},
4662
4674
  ...depsEnv ? { depsEnv } : {},
@@ -4712,6 +4724,7 @@ var deploy = (input) => Effect28.gen(function* () {
4712
4724
 
4713
4725
  // src/deploy/deploy-app.ts
4714
4726
  import { Effect as Effect29 } from "effect";
4727
+ import { toSeconds as toSeconds3 } from "effortless-aws";
4715
4728
  import { execSync } from "child_process";
4716
4729
  import * as path5 from "path";
4717
4730
  var deployApp = (input) => Effect29.gen(function* () {
@@ -4749,7 +4762,7 @@ var deployApp = (input) => Effect29.gen(function* () {
4749
4762
  const serverDir = path5.resolve(projectDir, config.server);
4750
4763
  yield* Effect29.logDebug(`Zipping server directory: ${serverDir}`);
4751
4764
  const code = yield* zipDirectory(serverDir);
4752
- const permissions = config.permissions ?? [];
4765
+ const permissions = config.lambda?.permissions ?? [];
4753
4766
  const roleArn = yield* ensureRole(
4754
4767
  project,
4755
4768
  stage,
@@ -4765,8 +4778,8 @@ var deployApp = (input) => Effect29.gen(function* () {
4765
4778
  roleArn,
4766
4779
  code,
4767
4780
  handler: "index.handler",
4768
- memory: config.memory ?? 1024,
4769
- timeout: config.timeout ?? 30,
4781
+ memory: config.lambda?.memory ?? 1024,
4782
+ timeout: toSeconds3(config.lambda?.timeout ?? 30),
4770
4783
  tags: makeTags(tagCtx, "lambda"),
4771
4784
  environment: {
4772
4785
  EFF_PROJECT: project,
@@ -5282,6 +5295,7 @@ var deployStaticSite = (input) => Effect31.gen(function* () {
5282
5295
 
5283
5296
  // src/deploy/deploy-fifo-queue.ts
5284
5297
  import { Effect as Effect32 } from "effect";
5298
+ import { toSeconds as toSeconds4 } from "effortless-aws";
5285
5299
  var FIFO_QUEUE_DEFAULT_PERMISSIONS = ["sqs:*", "logs:*"];
5286
5300
  var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect32.gen(function* () {
5287
5301
  const { exportName, config } = fn13;
@@ -5293,11 +5307,12 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5293
5307
  };
5294
5308
  yield* Effect32.logDebug("Creating SQS FIFO queue...");
5295
5309
  const queueName = `${input.project}-${tagCtx.stage}-${handlerName}`;
5296
- const timeout = config.timeout ?? 30;
5310
+ const timeout = toSeconds4(config.lambda?.timeout ?? 30);
5297
5311
  const { queueUrl, queueArn } = yield* ensureFifoQueue({
5298
5312
  name: queueName,
5299
- visibilityTimeout: Math.max(config.visibilityTimeout ?? timeout, timeout),
5300
- retentionPeriod: config.retentionPeriod,
5313
+ visibilityTimeout: Math.max(config.visibilityTimeout ? toSeconds4(config.visibilityTimeout) : timeout, timeout),
5314
+ retentionPeriod: config.retentionPeriod ? toSeconds4(config.retentionPeriod) : void 0,
5315
+ delay: config.delay ? toSeconds4(config.delay) : void 0,
5301
5316
  contentBasedDeduplication: config.contentBasedDeduplication ?? true,
5302
5317
  tags: makeTags(tagCtx, "sqs")
5303
5318
  });
@@ -5312,9 +5327,9 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5312
5327
  handlerName,
5313
5328
  defaultPermissions: FIFO_QUEUE_DEFAULT_PERMISSIONS,
5314
5329
  bundleType: "fifoQueue",
5315
- ...config.permissions ? { permissions: config.permissions } : {},
5316
- ...config.memory ? { memory: config.memory } : {},
5317
- ...config.timeout ? { timeout: config.timeout } : {},
5330
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
5331
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
5332
+ ...config.lambda?.timeout ? { timeout: toSeconds4(config.lambda.timeout) } : {},
5318
5333
  ...layerArn ? { layerArn } : {},
5319
5334
  ...external ? { external } : {},
5320
5335
  depsEnv: queueEnv,
@@ -5326,7 +5341,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5326
5341
  functionArn,
5327
5342
  queueArn,
5328
5343
  batchSize: config.batchSize ?? 10,
5329
- batchWindow: config.batchWindow
5344
+ batchWindow: config.batchWindow ? toSeconds4(config.batchWindow) : void 0
5330
5345
  });
5331
5346
  yield* Effect32.logDebug(`FIFO queue deployment complete! Queue: ${queueUrl}`);
5332
5347
  return {
@@ -5340,6 +5355,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5340
5355
 
5341
5356
  // src/deploy/deploy-bucket.ts
5342
5357
  import { Effect as Effect33 } from "effect";
5358
+ import { toSeconds as toSeconds5 } from "effortless-aws";
5343
5359
  var BUCKET_DEFAULT_PERMISSIONS = ["s3:*", "logs:*"];
5344
5360
  var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect33.gen(function* () {
5345
5361
  const { exportName, config, hasHandler } = fn13;
@@ -5372,9 +5388,9 @@ var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, deps
5372
5388
  handlerName,
5373
5389
  defaultPermissions: BUCKET_DEFAULT_PERMISSIONS,
5374
5390
  bundleType: "bucket",
5375
- ...config.permissions ? { permissions: config.permissions } : {},
5376
- ...config.memory ? { memory: config.memory } : {},
5377
- ...config.timeout ? { timeout: config.timeout } : {},
5391
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
5392
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
5393
+ ...config.lambda?.timeout ? { timeout: toSeconds5(config.lambda.timeout) } : {},
5378
5394
  ...layerArn ? { layerArn } : {},
5379
5395
  ...external ? { external } : {},
5380
5396
  depsEnv: selfEnv,
@@ -5541,6 +5557,11 @@ var SES_PERMISSIONS = [
5541
5557
  "ses:SendEmail",
5542
5558
  "ses:SendRawEmail"
5543
5559
  ];
5560
+ var QUEUE_CLIENT_PERMISSIONS = [
5561
+ "sqs:SendMessage",
5562
+ "sqs:SendMessageBatch",
5563
+ "sqs:GetQueueUrl"
5564
+ ];
5544
5565
  var buildMailerDomainMap = (mailerHandlers) => {
5545
5566
  const map = /* @__PURE__ */ new Map();
5546
5567
  for (const { exports } of mailerHandlers) {
@@ -5570,7 +5591,16 @@ var buildBucketNameMap = (bucketHandlers, project, stage) => {
5570
5591
  }
5571
5592
  return map;
5572
5593
  };
5573
- var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) => {
5594
+ var buildQueueNameMap = (fifoQueueHandlers, project, stage) => {
5595
+ const map = /* @__PURE__ */ new Map();
5596
+ for (const { exports } of fifoQueueHandlers) {
5597
+ for (const fn13 of exports) {
5598
+ map.set(fn13.exportName, `${project}-${stage}-${fn13.exportName}`);
5599
+ }
5600
+ }
5601
+ return map;
5602
+ };
5603
+ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap) => {
5574
5604
  const errors = [];
5575
5605
  const allGroups = [
5576
5606
  ...discovered.apiHandlers,
@@ -5584,9 +5614,9 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5584
5614
  for (const { exports } of allGroups) {
5585
5615
  for (const fn13 of exports) {
5586
5616
  for (const key of fn13.depsKeys) {
5587
- if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key)) {
5617
+ if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key) && !queueNameMap.has(key)) {
5588
5618
  errors.push(
5589
- `Handler "${fn13.exportName}" depends on "${key}", but no matching table, bucket, or mailer handler was found. Make sure it is exported.`
5619
+ `Handler "${fn13.exportName}" depends on "${key}", but no matching table, bucket, mailer, or queue handler was found. Make sure it is exported.`
5590
5620
  );
5591
5621
  }
5592
5622
  }
@@ -5594,12 +5624,13 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5594
5624
  }
5595
5625
  return errors;
5596
5626
  };
5597
- var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5627
+ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap) => {
5598
5628
  if (depsKeys.length === 0) return void 0;
5599
5629
  const depsEnv = {};
5600
5630
  let hasTable = false;
5601
5631
  let hasBucket = false;
5602
5632
  let hasMailer = false;
5633
+ let hasQueue = false;
5603
5634
  for (const key of depsKeys) {
5604
5635
  const tableName = tableNameMap.get(key);
5605
5636
  if (tableName) {
@@ -5617,6 +5648,12 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5617
5648
  if (mailerDomain) {
5618
5649
  depsEnv[`EFF_DEP_${key}`] = `mailer:${mailerDomain}`;
5619
5650
  hasMailer = true;
5651
+ continue;
5652
+ }
5653
+ const queueName = queueNameMap.get(key);
5654
+ if (queueName) {
5655
+ depsEnv[`EFF_DEP_${key}`] = `queue:${queueName}`;
5656
+ hasQueue = true;
5620
5657
  }
5621
5658
  }
5622
5659
  if (Object.keys(depsEnv).length === 0) return void 0;
@@ -5624,6 +5661,7 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5624
5661
  if (hasTable) permissions.push(...TABLE_CLIENT_PERMISSIONS);
5625
5662
  if (hasBucket) permissions.push(...BUCKET_CLIENT_PERMISSIONS);
5626
5663
  if (hasMailer) permissions.push(...SES_PERMISSIONS);
5664
+ if (hasQueue) permissions.push(...QUEUE_CLIENT_PERMISSIONS);
5627
5665
  return { depsEnv, depsPermissions: permissions };
5628
5666
  };
5629
5667
  var SSM_PERMISSIONS = [
@@ -5654,7 +5692,7 @@ var makeDeployInput = (ctx, file) => ({
5654
5692
  });
5655
5693
  var resolveHandlerEnv = (depsKeys, paramEntries, ctx) => {
5656
5694
  const resolved = mergeResolved(
5657
- resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap),
5695
+ resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap, ctx.queueNameMap),
5658
5696
  resolveParams(paramEntries, ctx.input.project, ctx.stage)
5659
5697
  );
5660
5698
  return {
@@ -5901,7 +5939,8 @@ var deployProject = (input) => Effect35.gen(function* () {
5901
5939
  const tableNameMap = buildTableNameMap(tableHandlers, input.project, stage);
5902
5940
  const bucketNameMap = buildBucketNameMap(bucketHandlers, input.project, stage);
5903
5941
  const mailerDomainMap = buildMailerDomainMap(mailerHandlers);
5904
- const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap);
5942
+ const queueNameMap = buildQueueNameMap(fifoQueueHandlers, input.project, stage);
5943
+ const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap);
5905
5944
  if (depsErrors.length > 0) {
5906
5945
  yield* Console2.log("");
5907
5946
  for (const err of depsErrors) {
@@ -5948,6 +5987,7 @@ var deployProject = (input) => Effect35.gen(function* () {
5948
5987
  tableNameMap,
5949
5988
  bucketNameMap,
5950
5989
  mailerDomainMap,
5990
+ queueNameMap,
5951
5991
  logComplete
5952
5992
  };
5953
5993
  const tableResults = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effortless-aws/cli",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "CLI and deploy tooling for effortless-aws",
@@ -28,7 +28,7 @@
28
28
  "@aws-sdk/client-resource-groups-tagging-api": "^3.975.0",
29
29
  "@aws-sdk/client-s3": "^3.989.0",
30
30
  "@aws-sdk/client-sesv2": "^3.994.0",
31
- "@aws-sdk/client-sqs": "^3.989.0",
31
+ "@aws-sdk/client-sqs": "3.989.0",
32
32
  "@aws-sdk/client-ssm": "^3.985.0",
33
33
  "@aws-sdk/util-dynamodb": "^3.975.0",
34
34
  "@effect/cli": "^0.73.1",
@@ -39,7 +39,7 @@
39
39
  "esbuild": "^0.25.0",
40
40
  "glob": "^13.0.0",
41
41
  "ts-morph": "^27.0.2",
42
- "effortless-aws": "0.21.0"
42
+ "effortless-aws": "0.23.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@effect-ak/aws-sdk": "1.0.0-rc.3",