@effortless-aws/cli 0.4.0 → 0.6.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 +66 -31
  2. package/package.json +3 -3
package/dist/cli/index.js CHANGED
@@ -1938,7 +1938,8 @@ var DEFAULT_CORS = {
1938
1938
  AllowMethods: ["*"],
1939
1939
  AllowHeaders: ["*"]
1940
1940
  };
1941
- var ensureFunctionUrl = (functionName) => Effect13.gen(function* () {
1941
+ var ensureFunctionUrl = (functionName, invokeMode) => Effect13.gen(function* () {
1942
+ const mode = invokeMode ?? "BUFFERED";
1942
1943
  const existing = yield* lambda_exports.make("get_function_url_config", {
1943
1944
  FunctionName: functionName
1944
1945
  }).pipe(
@@ -1951,6 +1952,7 @@ var ensureFunctionUrl = (functionName) => Effect13.gen(function* () {
1951
1952
  yield* lambda_exports.make("update_function_url_config", {
1952
1953
  FunctionName: functionName,
1953
1954
  AuthType: "NONE",
1955
+ InvokeMode: mode,
1954
1956
  Cors: DEFAULT_CORS
1955
1957
  });
1956
1958
  return { functionUrl: existing.FunctionUrl };
@@ -1959,7 +1961,7 @@ var ensureFunctionUrl = (functionName) => Effect13.gen(function* () {
1959
1961
  const result = yield* lambda_exports.make("create_function_url_config", {
1960
1962
  FunctionName: functionName,
1961
1963
  AuthType: "NONE",
1962
- InvokeMode: "BUFFERED",
1964
+ InvokeMode: mode,
1963
1965
  Cors: DEFAULT_CORS
1964
1966
  });
1965
1967
  return { functionUrl: result.FunctionUrl };
@@ -3830,6 +3832,7 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3830
3832
  name,
3831
3833
  visibilityTimeout = 30,
3832
3834
  retentionPeriod = 345600,
3835
+ delay = 0,
3833
3836
  contentBasedDeduplication = true,
3834
3837
  tags
3835
3838
  } = input;
@@ -3852,7 +3855,8 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3852
3855
  FifoQueue: "true",
3853
3856
  ContentBasedDeduplication: String(contentBasedDeduplication),
3854
3857
  VisibilityTimeout: String(visibilityTimeout),
3855
- MessageRetentionPeriod: String(retentionPeriod)
3858
+ MessageRetentionPeriod: String(retentionPeriod),
3859
+ DelaySeconds: String(delay)
3856
3860
  },
3857
3861
  ...tags ? { tags } : {}
3858
3862
  });
@@ -3865,7 +3869,8 @@ var ensureFifoQueue = (input) => Effect22.gen(function* () {
3865
3869
  Attributes: {
3866
3870
  ContentBasedDeduplication: String(contentBasedDeduplication),
3867
3871
  VisibilityTimeout: String(visibilityTimeout),
3868
- MessageRetentionPeriod: String(retentionPeriod)
3872
+ MessageRetentionPeriod: String(retentionPeriod),
3873
+ DelaySeconds: String(delay)
3869
3874
  }
3870
3875
  });
3871
3876
  if (tags) {
@@ -4432,6 +4437,7 @@ var checkMissingParams = (params) => Effect25.gen(function* () {
4432
4437
 
4433
4438
  // src/deploy/deploy-table.ts
4434
4439
  import { Effect as Effect27 } from "effect";
4440
+ import { toSeconds } from "effortless-aws";
4435
4441
 
4436
4442
  // src/deploy/shared.ts
4437
4443
  import { Effect as Effect26 } from "effect";
@@ -4552,9 +4558,9 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4552
4558
  handlerName,
4553
4559
  defaultPermissions: TABLE_DEFAULT_PERMISSIONS,
4554
4560
  bundleType: "table",
4555
- ...config.permissions ? { permissions: config.permissions } : {},
4556
- ...config.memory ? { memory: config.memory } : {},
4557
- ...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) } : {},
4558
4564
  ...layerArn ? { layerArn } : {},
4559
4565
  ...external ? { external } : {},
4560
4566
  depsEnv: selfEnv,
@@ -4566,7 +4572,7 @@ var deployTableFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsP
4566
4572
  functionArn,
4567
4573
  streamArn,
4568
4574
  batchSize: config.batchSize ?? 100,
4569
- batchWindow: config.batchWindow ?? 2,
4575
+ batchWindow: toSeconds(config.batchWindow ?? 2),
4570
4576
  startingPosition: config.startingPosition ?? "LATEST"
4571
4577
  });
4572
4578
  yield* Effect27.logDebug(`Table deployment complete! Table: ${tableArn}`);
@@ -4644,6 +4650,7 @@ var deployAllTables = (input) => Effect27.gen(function* () {
4644
4650
 
4645
4651
  // src/deploy/deploy-api.ts
4646
4652
  import { Effect as Effect28 } from "effect";
4653
+ import { toSeconds as toSeconds2 } from "effortless-aws";
4647
4654
  var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect28.gen(function* () {
4648
4655
  const { exportName, config } = fn13;
4649
4656
  const handlerName = exportName;
@@ -4652,9 +4659,9 @@ var deployApiFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPer
4652
4659
  exportName,
4653
4660
  handlerName,
4654
4661
  bundleType: "api",
4655
- ...config.permissions ? { permissions: config.permissions } : {},
4656
- ...config.memory ? { memory: config.memory } : {},
4657
- ...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) } : {},
4658
4665
  ...layerArn ? { layerArn } : {},
4659
4666
  ...external ? { external } : {},
4660
4667
  ...depsEnv ? { depsEnv } : {},
@@ -4691,7 +4698,7 @@ var deploy = (input) => Effect28.gen(function* () {
4691
4698
  ...external.length > 0 ? { external } : {}
4692
4699
  });
4693
4700
  const lambdaName = `${input.project}-${tagCtx.stage}-${handlerName}`;
4694
- const { functionUrl } = yield* ensureFunctionUrl(lambdaName);
4701
+ const { functionUrl } = yield* ensureFunctionUrl(lambdaName, fn13.config.stream ? "RESPONSE_STREAM" : void 0);
4695
4702
  yield* addFunctionUrlPublicAccess(lambdaName);
4696
4703
  yield* Effect28.logDebug(`Deployment complete! URL: ${functionUrl}`);
4697
4704
  return {
@@ -4710,6 +4717,7 @@ var deploy = (input) => Effect28.gen(function* () {
4710
4717
 
4711
4718
  // src/deploy/deploy-app.ts
4712
4719
  import { Effect as Effect29 } from "effect";
4720
+ import { toSeconds as toSeconds3 } from "effortless-aws";
4713
4721
  import { execSync } from "child_process";
4714
4722
  import * as path5 from "path";
4715
4723
  var deployApp = (input) => Effect29.gen(function* () {
@@ -4747,7 +4755,7 @@ var deployApp = (input) => Effect29.gen(function* () {
4747
4755
  const serverDir = path5.resolve(projectDir, config.server);
4748
4756
  yield* Effect29.logDebug(`Zipping server directory: ${serverDir}`);
4749
4757
  const code = yield* zipDirectory(serverDir);
4750
- const permissions = config.permissions ?? [];
4758
+ const permissions = config.lambda?.permissions ?? [];
4751
4759
  const roleArn = yield* ensureRole(
4752
4760
  project,
4753
4761
  stage,
@@ -4763,8 +4771,8 @@ var deployApp = (input) => Effect29.gen(function* () {
4763
4771
  roleArn,
4764
4772
  code,
4765
4773
  handler: "index.handler",
4766
- memory: config.memory ?? 1024,
4767
- timeout: config.timeout ?? 30,
4774
+ memory: config.lambda?.memory ?? 1024,
4775
+ timeout: toSeconds3(config.lambda?.timeout ?? 30),
4768
4776
  tags: makeTags(tagCtx, "lambda"),
4769
4777
  environment: {
4770
4778
  EFF_PROJECT: project,
@@ -5280,6 +5288,7 @@ var deployStaticSite = (input) => Effect31.gen(function* () {
5280
5288
 
5281
5289
  // src/deploy/deploy-fifo-queue.ts
5282
5290
  import { Effect as Effect32 } from "effect";
5291
+ import { toSeconds as toSeconds4 } from "effortless-aws";
5283
5292
  var FIFO_QUEUE_DEFAULT_PERMISSIONS = ["sqs:*", "logs:*"];
5284
5293
  var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect32.gen(function* () {
5285
5294
  const { exportName, config } = fn13;
@@ -5291,11 +5300,12 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5291
5300
  };
5292
5301
  yield* Effect32.logDebug("Creating SQS FIFO queue...");
5293
5302
  const queueName = `${input.project}-${tagCtx.stage}-${handlerName}`;
5294
- const timeout = config.timeout ?? 30;
5303
+ const timeout = toSeconds4(config.lambda?.timeout ?? 30);
5295
5304
  const { queueUrl, queueArn } = yield* ensureFifoQueue({
5296
5305
  name: queueName,
5297
- visibilityTimeout: Math.max(config.visibilityTimeout ?? timeout, timeout),
5298
- 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,
5299
5309
  contentBasedDeduplication: config.contentBasedDeduplication ?? true,
5300
5310
  tags: makeTags(tagCtx, "sqs")
5301
5311
  });
@@ -5310,9 +5320,9 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5310
5320
  handlerName,
5311
5321
  defaultPermissions: FIFO_QUEUE_DEFAULT_PERMISSIONS,
5312
5322
  bundleType: "fifoQueue",
5313
- ...config.permissions ? { permissions: config.permissions } : {},
5314
- ...config.memory ? { memory: config.memory } : {},
5315
- ...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) } : {},
5316
5326
  ...layerArn ? { layerArn } : {},
5317
5327
  ...external ? { external } : {},
5318
5328
  depsEnv: queueEnv,
@@ -5324,7 +5334,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5324
5334
  functionArn,
5325
5335
  queueArn,
5326
5336
  batchSize: config.batchSize ?? 10,
5327
- batchWindow: config.batchWindow
5337
+ batchWindow: config.batchWindow ? toSeconds4(config.batchWindow) : void 0
5328
5338
  });
5329
5339
  yield* Effect32.logDebug(`FIFO queue deployment complete! Queue: ${queueUrl}`);
5330
5340
  return {
@@ -5338,6 +5348,7 @@ var deployFifoQueueFunction = ({ input, fn: fn13, layerArn, external, depsEnv, d
5338
5348
 
5339
5349
  // src/deploy/deploy-bucket.ts
5340
5350
  import { Effect as Effect33 } from "effect";
5351
+ import { toSeconds as toSeconds5 } from "effortless-aws";
5341
5352
  var BUCKET_DEFAULT_PERMISSIONS = ["s3:*", "logs:*"];
5342
5353
  var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, depsPermissions, staticGlobs }) => Effect33.gen(function* () {
5343
5354
  const { exportName, config, hasHandler } = fn13;
@@ -5370,9 +5381,9 @@ var deployBucketFunction = ({ input, fn: fn13, layerArn, external, depsEnv, deps
5370
5381
  handlerName,
5371
5382
  defaultPermissions: BUCKET_DEFAULT_PERMISSIONS,
5372
5383
  bundleType: "bucket",
5373
- ...config.permissions ? { permissions: config.permissions } : {},
5374
- ...config.memory ? { memory: config.memory } : {},
5375
- ...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) } : {},
5376
5387
  ...layerArn ? { layerArn } : {},
5377
5388
  ...external ? { external } : {},
5378
5389
  depsEnv: selfEnv,
@@ -5539,6 +5550,11 @@ var SES_PERMISSIONS = [
5539
5550
  "ses:SendEmail",
5540
5551
  "ses:SendRawEmail"
5541
5552
  ];
5553
+ var QUEUE_CLIENT_PERMISSIONS = [
5554
+ "sqs:SendMessage",
5555
+ "sqs:SendMessageBatch",
5556
+ "sqs:GetQueueUrl"
5557
+ ];
5542
5558
  var buildMailerDomainMap = (mailerHandlers) => {
5543
5559
  const map = /* @__PURE__ */ new Map();
5544
5560
  for (const { exports } of mailerHandlers) {
@@ -5568,7 +5584,16 @@ var buildBucketNameMap = (bucketHandlers, project, stage) => {
5568
5584
  }
5569
5585
  return map;
5570
5586
  };
5571
- 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) => {
5572
5597
  const errors = [];
5573
5598
  const allGroups = [
5574
5599
  ...discovered.apiHandlers,
@@ -5582,9 +5607,9 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5582
5607
  for (const { exports } of allGroups) {
5583
5608
  for (const fn13 of exports) {
5584
5609
  for (const key of fn13.depsKeys) {
5585
- if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key)) {
5610
+ if (!tableNameMap.has(key) && !bucketNameMap.has(key) && !mailerDomainMap.has(key) && !queueNameMap.has(key)) {
5586
5611
  errors.push(
5587
- `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.`
5588
5613
  );
5589
5614
  }
5590
5615
  }
@@ -5592,12 +5617,13 @@ var validateDeps = (discovered, tableNameMap, bucketNameMap, mailerDomainMap) =>
5592
5617
  }
5593
5618
  return errors;
5594
5619
  };
5595
- var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5620
+ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap) => {
5596
5621
  if (depsKeys.length === 0) return void 0;
5597
5622
  const depsEnv = {};
5598
5623
  let hasTable = false;
5599
5624
  let hasBucket = false;
5600
5625
  let hasMailer = false;
5626
+ let hasQueue = false;
5601
5627
  for (const key of depsKeys) {
5602
5628
  const tableName = tableNameMap.get(key);
5603
5629
  if (tableName) {
@@ -5615,6 +5641,12 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5615
5641
  if (mailerDomain) {
5616
5642
  depsEnv[`EFF_DEP_${key}`] = `mailer:${mailerDomain}`;
5617
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;
5618
5650
  }
5619
5651
  }
5620
5652
  if (Object.keys(depsEnv).length === 0) return void 0;
@@ -5622,6 +5654,7 @@ var resolveDeps = (depsKeys, tableNameMap, bucketNameMap, mailerDomainMap) => {
5622
5654
  if (hasTable) permissions.push(...TABLE_CLIENT_PERMISSIONS);
5623
5655
  if (hasBucket) permissions.push(...BUCKET_CLIENT_PERMISSIONS);
5624
5656
  if (hasMailer) permissions.push(...SES_PERMISSIONS);
5657
+ if (hasQueue) permissions.push(...QUEUE_CLIENT_PERMISSIONS);
5625
5658
  return { depsEnv, depsPermissions: permissions };
5626
5659
  };
5627
5660
  var SSM_PERMISSIONS = [
@@ -5652,7 +5685,7 @@ var makeDeployInput = (ctx, file) => ({
5652
5685
  });
5653
5686
  var resolveHandlerEnv = (depsKeys, paramEntries, ctx) => {
5654
5687
  const resolved = mergeResolved(
5655
- resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap),
5688
+ resolveDeps(depsKeys, ctx.tableNameMap, ctx.bucketNameMap, ctx.mailerDomainMap, ctx.queueNameMap),
5656
5689
  resolveParams(paramEntries, ctx.input.project, ctx.stage)
5657
5690
  );
5658
5691
  return {
@@ -5899,7 +5932,8 @@ var deployProject = (input) => Effect35.gen(function* () {
5899
5932
  const tableNameMap = buildTableNameMap(tableHandlers, input.project, stage);
5900
5933
  const bucketNameMap = buildBucketNameMap(bucketHandlers, input.project, stage);
5901
5934
  const mailerDomainMap = buildMailerDomainMap(mailerHandlers);
5902
- const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap);
5935
+ const queueNameMap = buildQueueNameMap(fifoQueueHandlers, input.project, stage);
5936
+ const depsErrors = validateDeps(discovered, tableNameMap, bucketNameMap, mailerDomainMap, queueNameMap);
5903
5937
  if (depsErrors.length > 0) {
5904
5938
  yield* Console2.log("");
5905
5939
  for (const err of depsErrors) {
@@ -5946,6 +5980,7 @@ var deployProject = (input) => Effect35.gen(function* () {
5946
5980
  tableNameMap,
5947
5981
  bucketNameMap,
5948
5982
  mailerDomainMap,
5983
+ queueNameMap,
5949
5984
  logComplete
5950
5985
  };
5951
5986
  const tableResults = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effortless-aws/cli",
3
- "version": "0.4.0",
3
+ "version": "0.6.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.20.0"
42
+ "effortless-aws": "0.22.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@effect-ak/aws-sdk": "1.0.0-rc.3",