@effortless-aws/cli 0.5.0 → 1.0.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 +61 -28
  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) {
@@ -4434,6 +4437,7 @@ var checkMissingParams = (params) => Effect25.gen(function* () {
4434
4437
 
4435
4438
  // src/deploy/deploy-table.ts
4436
4439
  import { Effect as Effect27 } from "effect";
4440
+ import { toSeconds } from "effortless-aws";
4437
4441
 
4438
4442
  // src/deploy/shared.ts
4439
4443
  import { Effect as Effect26 } from "effect";
@@ -4554,9 +4558,9 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4554
4558
  handlerName,
4555
4559
  defaultPermissions: TABLE_DEFAULT_PERMISSIONS,
4556
4560
  bundleType: "table",
4557
- ...config.permissions ? { permissions: config.permissions } : {},
4558
- ...config.memory ? { memory: config.memory } : {},
4559
- ...config.timeout ? { timeout: config.timeout } : {},
4561
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
4562
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
4563
+ ...config.lambda?.timeout ? { timeout: toSeconds(config.lambda.timeout) } : {},
4560
4564
  ...layerArn ? { layerArn } : {},
4561
4565
  ...external ? { external } : {},
4562
4566
  depsEnv: selfEnv,
@@ -4568,7 +4572,7 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4568
4572
  functionArn,
4569
4573
  streamArn,
4570
4574
  batchSize: config.batchSize ?? 100,
4571
- batchWindow: config.batchWindow ?? 2,
4575
+ batchWindow: toSeconds(config.batchWindow ?? 2),
4572
4576
  startingPosition: config.startingPosition ?? "LATEST"
4573
4577
  });
4574
4578
  yield* Effect27.logDebug(`Table deployment complete! Table: ${tableArn}`);
@@ -4646,6 +4650,7 @@ var deployAllTables = (input) => Effect27.gen(function* () {
4646
4650
 
4647
4651
  // src/deploy/deploy-api.ts
4648
4652
  import { Effect as Effect28 } from "effect";
4653
+ import { toSeconds as toSeconds2 } from "effortless-aws";
4649
4654
  var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect28.gen(function* () {
4650
4655
  const { exportName, config } = fn13;
4651
4656
  const handlerName = exportName;
@@ -4654,9 +4659,9 @@ var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPer
4654
4659
  exportName,
4655
4660
  handlerName,
4656
4661
  bundleType: "api",
4657
- ...config.permissions ? { permissions: config.permissions } : {},
4658
- ...config.memory ? { memory: config.memory } : {},
4659
- ...config.timeout ? { timeout: config.timeout } : {},
4662
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
4663
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
4664
+ ...config.lambda?.timeout ? { timeout: toSeconds2(config.lambda.timeout) } : {},
4660
4665
  ...layerArn ? { layerArn } : {},
4661
4666
  ...external ? { external } : {},
4662
4667
  ...depsEnv ? { depsEnv } : {},
@@ -4712,6 +4717,7 @@ var deploy = (input) => Effect28.gen(function* () {
4712
4717
 
4713
4718
  // src/deploy/deploy-app.ts
4714
4719
  import { Effect as Effect29 } from "effect";
4720
+ import { toSeconds as toSeconds3 } from "effortless-aws";
4715
4721
  import { execSync } from "child_process";
4716
4722
  import * as path5 from "path";
4717
4723
  var deployApp = (input) => Effect29.gen(function* () {
@@ -4749,7 +4755,7 @@ var deployApp = (input) => Effect29.gen(function* () {
4749
4755
  const serverDir = path5.resolve(projectDir, config.server);
4750
4756
  yield* Effect29.logDebug(`Zipping server directory: ${serverDir}`);
4751
4757
  const code = yield* zipDirectory(serverDir);
4752
- const permissions = config.permissions ?? [];
4758
+ const permissions = config.lambda?.permissions ?? [];
4753
4759
  const roleArn = yield* ensureRole(
4754
4760
  project,
4755
4761
  stage,
@@ -4765,8 +4771,8 @@ var deployApp = (input) => Effect29.gen(function* () {
4765
4771
  roleArn,
4766
4772
  code,
4767
4773
  handler: "index.handler",
4768
- memory: config.memory ?? 1024,
4769
- timeout: config.timeout ?? 30,
4774
+ memory: config.lambda?.memory ?? 1024,
4775
+ timeout: toSeconds3(config.lambda?.timeout ?? 30),
4770
4776
  tags: makeTags(tagCtx, "lambda"),
4771
4777
  environment: {
4772
4778
  EFF_PROJECT: project,
@@ -5282,6 +5288,7 @@ var deployStaticSite = (input) => Effect31.gen(function* () {
5282
5288
 
5283
5289
  // src/deploy/deploy-fifo-queue.ts
5284
5290
  import { Effect as Effect32 } from "effect";
5291
+ import { toSeconds as toSeconds4 } from "effortless-aws";
5285
5292
  var FIFO_QUEUE_DEFAULT_PERMISSIONS = ["sqs:*", "logs:*"];
5286
5293
  var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect32.gen(function* () {
5287
5294
  const { exportName, config } = fn13;
@@ -5293,11 +5300,12 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5293
5300
  };
5294
5301
  yield* Effect32.logDebug("Creating SQS FIFO queue...");
5295
5302
  const queueName = `${input.project}-${tagCtx.stage}-${handlerName}`;
5296
- const timeout = config.timeout ?? 30;
5303
+ const timeout = toSeconds4(config.lambda?.timeout ?? 30);
5297
5304
  const { queueUrl, queueArn } = yield* ensureFifoQueue({
5298
5305
  name: queueName,
5299
- visibilityTimeout: Math.max(config.visibilityTimeout ?? timeout, timeout),
5300
- retentionPeriod: config.retentionPeriod,
5306
+ visibilityTimeout: Math.max(config.visibilityTimeout ? toSeconds4(config.visibilityTimeout) : timeout, timeout),
5307
+ retentionPeriod: config.retentionPeriod ? toSeconds4(config.retentionPeriod) : void 0,
5308
+ delay: config.delay ? toSeconds4(config.delay) : void 0,
5301
5309
  contentBasedDeduplication: config.contentBasedDeduplication ?? true,
5302
5310
  tags: makeTags(tagCtx, "sqs")
5303
5311
  });
@@ -5312,9 +5320,9 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5312
5320
  handlerName,
5313
5321
  defaultPermissions: FIFO_QUEUE_DEFAULT_PERMISSIONS,
5314
5322
  bundleType: "fifoQueue",
5315
- ...config.permissions ? { permissions: config.permissions } : {},
5316
- ...config.memory ? { memory: config.memory } : {},
5317
- ...config.timeout ? { timeout: config.timeout } : {},
5323
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
5324
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
5325
+ ...config.lambda?.timeout ? { timeout: toSeconds4(config.lambda.timeout) } : {},
5318
5326
  ...layerArn ? { layerArn } : {},
5319
5327
  ...external ? { external } : {},
5320
5328
  depsEnv: queueEnv,
@@ -5326,7 +5334,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5326
5334
  functionArn,
5327
5335
  queueArn,
5328
5336
  batchSize: config.batchSize ?? 10,
5329
- batchWindow: config.batchWindow
5337
+ batchWindow: config.batchWindow ? toSeconds4(config.batchWindow) : void 0
5330
5338
  });
5331
5339
  yield* Effect32.logDebug(`FIFO queue deployment complete! Queue: ${queueUrl}`);
5332
5340
  return {
@@ -5340,6 +5348,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5340
5348
 
5341
5349
  // src/deploy/deploy-bucket.ts
5342
5350
  import { Effect as Effect33 } from "effect";
5351
+ import { toSeconds as toSeconds5 } from "effortless-aws";
5343
5352
  var BUCKET_DEFAULT_PERMISSIONS = ["s3:*", "logs:*"];
5344
5353
  var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect33.gen(function* () {
5345
5354
  const { exportName, config, hasHandler } = fn13;
@@ -5372,9 +5381,9 @@ var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, deps
5372
5381
  handlerName,
5373
5382
  defaultPermissions: BUCKET_DEFAULT_PERMISSIONS,
5374
5383
  bundleType: "bucket",
5375
- ...config.permissions ? { permissions: config.permissions } : {},
5376
- ...config.memory ? { memory: config.memory } : {},
5377
- ...config.timeout ? { timeout: config.timeout } : {},
5384
+ ...config.lambda?.permissions ? { permissions: config.lambda.permissions } : {},
5385
+ ...config.lambda?.memory ? { memory: config.lambda.memory } : {},
5386
+ ...config.lambda?.timeout ? { timeout: toSeconds5(config.lambda.timeout) } : {},
5378
5387
  ...layerArn ? { layerArn } : {},
5379
5388
  ...external ? { external } : {},
5380
5389
  depsEnv: selfEnv,
@@ -5541,6 +5550,11 @@ var SES_PERMISSIONS = [
5541
5550
  "ses:SendEmail",
5542
5551
  "ses:SendRawEmail"
5543
5552
  ];
5553
+ var QUEUE_CLIENT_PERMISSIONS = [
5554
+ "sqs:SendMessage",
5555
+ "sqs:SendMessageBatch",
5556
+ "sqs:GetQueueUrl"
5557
+ ];
5544
5558
  var buildMailerDomainMap = (mailerHandlers) => {
5545
5559
  const map = /* @__PURE__ */ new Map();
5546
5560
  for (const { exports } of mailerHandlers) {
@@ -5570,7 +5584,16 @@ var buildBucketNameMap = (bucketHandlers, project, stage) => {
5570
5584
  }
5571
5585
  return map;
5572
5586
  };
5573
- var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) => {
5587
+ var buildQueueNameMap = (fifoQueueHandlers, project, stage) => {
5588
+ const map = /* @__PURE__ */ new Map();
5589
+ for (const { exports } of fifoQueueHandlers) {
5590
+ for (const fn13 of exports) {
5591
+ map.set(fn13.exportName, `${project}-${stage}-${fn13.exportName}`);
5592
+ }
5593
+ }
5594
+ return map;
5595
+ };
5596
+ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap) => {
5574
5597
  const errors = [];
5575
5598
  const allGroups = [
5576
5599
  ...discovered.apiHandlers,
@@ -5584,9 +5607,9 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5584
5607
  for (const { exports } of allGroups) {
5585
5608
  for (const fn13 of exports) {
5586
5609
  for (const key of fn13.depsKeys) {
5587
- if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key)) {
5610
+ if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key) && !queueNameMap.has(key)) {
5588
5611
  errors.push(
5589
- `Handler "${fn13.exportName}" depends on "${key}", but no matching table, bucket, or mailer handler was found. Make sure it is exported.`
5612
+ `Handler "${fn13.exportName}" depends on "${key}", but no matching table, bucket, mailer, or queue handler was found. Make sure it is exported.`
5590
5613
  );
5591
5614
  }
5592
5615
  }
@@ -5594,12 +5617,13 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5594
5617
  }
5595
5618
  return errors;
5596
5619
  };
5597
- var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5620
+ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap) => {
5598
5621
  if (depsKeys.length === 0) return void 0;
5599
5622
  const depsEnv = {};
5600
5623
  let hasTable = false;
5601
5624
  let hasBucket = false;
5602
5625
  let hasMailer = false;
5626
+ let hasQueue = false;
5603
5627
  for (const key of depsKeys) {
5604
5628
  const tableName = tableNameMap.get(key);
5605
5629
  if (tableName) {
@@ -5617,6 +5641,12 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5617
5641
  if (mailerDomain) {
5618
5642
  depsEnv[`EFF_DEP_${key}`] = `mailer:${mailerDomain}`;
5619
5643
  hasMailer = true;
5644
+ continue;
5645
+ }
5646
+ const queueName = queueNameMap.get(key);
5647
+ if (queueName) {
5648
+ depsEnv[`EFF_DEP_${key}`] = `queue:${queueName}`;
5649
+ hasQueue = true;
5620
5650
  }
5621
5651
  }
5622
5652
  if (Object.keys(depsEnv).length === 0) return void 0;
@@ -5624,6 +5654,7 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5624
5654
  if (hasTable) permissions.push(...TABLE_CLIENT_PERMISSIONS);
5625
5655
  if (hasBucket) permissions.push(...BUCKET_CLIENT_PERMISSIONS);
5626
5656
  if (hasMailer) permissions.push(...SES_PERMISSIONS);
5657
+ if (hasQueue) permissions.push(...QUEUE_CLIENT_PERMISSIONS);
5627
5658
  return { depsEnv, depsPermissions: permissions };
5628
5659
  };
5629
5660
  var SSM_PERMISSIONS = [
@@ -5654,7 +5685,7 @@ var makeDeployInput = (ctx, file) => ({
5654
5685
  });
5655
5686
  var resolveHandlerEnv = (depsKeys, paramEntries, ctx) => {
5656
5687
  const resolved = mergeResolved(
5657
- resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap),
5688
+ resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap, ctx.queueNameMap),
5658
5689
  resolveParams(paramEntries, ctx.input.project, ctx.stage)
5659
5690
  );
5660
5691
  return {
@@ -5901,7 +5932,8 @@ var deployProject = (input) => Effect35.gen(function* () {
5901
5932
  const tableNameMap = buildTableNameMap(tableHandlers, input.project, stage);
5902
5933
  const bucketNameMap = buildBucketNameMap(bucketHandlers, input.project, stage);
5903
5934
  const mailerDomainMap = buildMailerDomainMap(mailerHandlers);
5904
- const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap);
5935
+ const queueNameMap = buildQueueNameMap(fifoQueueHandlers, input.project, stage);
5936
+ const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap);
5905
5937
  if (depsErrors.length > 0) {
5906
5938
  yield* Console2.log("");
5907
5939
  for (const err of depsErrors) {
@@ -5948,6 +5980,7 @@ var deployProject = (input) => Effect35.gen(function* () {
5948
5980
  tableNameMap,
5949
5981
  bucketNameMap,
5950
5982
  mailerDomainMap,
5983
+ queueNameMap,
5951
5984
  logComplete
5952
5985
  };
5953
5986
  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": "1.0.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": "1.0.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@effect-ak/aws-sdk": "1.0.0-rc.3",