carlin 1.31.21 → 1.32.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/index.js +115 -49
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -2392,19 +2392,22 @@ var getCicdTemplate = ({
2392
2392
  };
2393
2393
  };
2394
2394
  var logPrefix5 = "lambda";
2395
- var outFolder = "dist";
2396
- var outFile = "index.js";
2397
- var buildLambdaSingleFile = async ({
2398
- lambdaExternals,
2399
- lambdaInput
2395
+ var buildLambdaCode = async ({
2396
+ lambdaEntryPoints,
2397
+ lambdaEntryPointsBaseDir = ".",
2398
+ lambdaExternal = [],
2399
+ lambdaOutdir
2400
2400
  }) => {
2401
2401
  log5.info(logPrefix5, "Building Lambda single file...");
2402
+ const entryPoints = lambdaEntryPoints.map((entryPoint) => {
2403
+ return path__default.resolve(process.cwd(), lambdaEntryPointsBaseDir, entryPoint);
2404
+ });
2402
2405
  const { errors } = esbuild.buildSync({
2403
2406
  banner: {
2404
2407
  js: "// Powered by carlin (https://ttoss.dev/docs/carlin/)"
2405
2408
  },
2406
2409
  bundle: true,
2407
- entryPoints: [path__default.resolve(process.cwd(), lambdaInput)],
2410
+ entryPoints,
2408
2411
  external: [
2409
2412
  /**
2410
2413
  * Only AWS SDK v3 on Node.js 18.x or higher.
@@ -2412,7 +2415,7 @@ var buildLambdaSingleFile = async ({
2412
2415
  */
2413
2416
  "@aws-sdk/*",
2414
2417
  ...builtins,
2415
- ...lambdaExternals
2418
+ ...lambdaExternal
2416
2419
  ],
2417
2420
  /**
2418
2421
  * Some packages as `graphql` are not compatible with ESM yet.
@@ -2424,7 +2427,8 @@ var buildLambdaSingleFile = async ({
2424
2427
  */
2425
2428
  minifySyntax: true,
2426
2429
  platform: "node",
2427
- outfile: path__default.join(process.cwd(), outFolder, outFile),
2430
+ outbase: path__default.join(process.cwd(), lambdaEntryPointsBaseDir),
2431
+ outdir: path__default.join(process.cwd(), lambdaOutdir),
2428
2432
  target: typescriptConfig.target,
2429
2433
  treeShaking: true
2430
2434
  });
@@ -2570,14 +2574,14 @@ var deployLambdaLayer = async ({
2570
2574
  };
2571
2575
  var logPrefix7 = "lambda";
2572
2576
  var deployLambdaLayers = async ({
2573
- lambdaExternals = []
2577
+ lambdaExternal = []
2574
2578
  }) => {
2575
- if (lambdaExternals.length === 0) {
2579
+ if (lambdaExternal.length === 0) {
2576
2580
  return;
2577
2581
  }
2578
2582
  log5.info(
2579
2583
  logPrefix7,
2580
- `--lambda-externals [${lambdaExternals.join(
2584
+ `--lambda-externals [${lambdaExternal.join(
2581
2585
  ", "
2582
2586
  )}] was found. Creating other layers...`
2583
2587
  );
@@ -2595,14 +2599,12 @@ var deployLambdaLayers = async ({
2595
2599
  return {};
2596
2600
  }
2597
2601
  })();
2598
- const packages = lambdaExternals.map((lambdaExternal) => {
2602
+ const packages = lambdaExternal.map((external) => {
2599
2603
  try {
2600
- const semver2 = dependencies[lambdaExternal].replace(/(~|\^)/g, "");
2601
- return `${lambdaExternal}@${semver2}`;
2604
+ const semver2 = dependencies[external].replace(/(~|\^)/g, "");
2605
+ return `${external}@${semver2}`;
2602
2606
  } catch {
2603
- throw new Error(
2604
- `Cannot find ${lambdaExternal} on package.json dependencies.`
2605
- );
2607
+ throw new Error(`Cannot find ${external} on package.json dependencies.`);
2606
2608
  }
2607
2609
  });
2608
2610
  await deployLambdaLayer({ packages, deployIfExists: false });
@@ -2611,7 +2613,7 @@ new AWS.CodeBuild({ region: AWS_DEFAULT_REGION });
2611
2613
  var uploadCodeToECR = async ({
2612
2614
  bucket,
2613
2615
  key,
2614
- lambdaExternals,
2616
+ lambdaExternal,
2615
2617
  lambdaDockerfile
2616
2618
  }) => {
2617
2619
  {
@@ -2620,15 +2622,18 @@ var uploadCodeToECR = async ({
2620
2622
  };
2621
2623
  var logPrefix8 = "lambda";
2622
2624
  var zipFileName = "lambda.zip";
2623
- var uploadCodeToS3 = async ({ stackName }) => {
2625
+ var uploadCodeToS3 = async ({
2626
+ stackName,
2627
+ lambdaOutdir
2628
+ }) => {
2624
2629
  log5.info(logPrefix8, `Uploading code to S3...`);
2625
2630
  const zip = new AdmZip();
2626
- const code = fs3__default.readFileSync(path__default.join(process.cwd(), outFolder, outFile));
2627
- zip.addFile(outFile, code);
2628
- if (!fs3__default.existsSync(outFolder)) {
2629
- fs3__default.mkdirSync(outFolder);
2631
+ const zipFile = `${lambdaOutdir}/${zipFileName}`;
2632
+ if (fs3__default.existsSync(zipFile)) {
2633
+ await fs3__default.promises.rm(zipFile);
2630
2634
  }
2631
- zip.writeZip(`${outFolder}/${zipFileName}`);
2635
+ zip.addLocalFolder(lambdaOutdir);
2636
+ zip.writeZip(`${lambdaOutdir}/${zipFileName}`);
2632
2637
  const bucketName = await getBaseStackResource(
2633
2638
  "BASE_STACK_BUCKET_LOGICAL_NAME"
2634
2639
  );
@@ -2642,19 +2647,32 @@ var uploadCodeToS3 = async ({ stackName }) => {
2642
2647
  var logPrefix9 = "lambda";
2643
2648
  var deployLambdaCode = async ({
2644
2649
  lambdaDockerfile,
2645
- lambdaExternals,
2650
+ lambdaExternal = [],
2646
2651
  lambdaImage,
2647
- lambdaInput,
2652
+ lambdaEntryPoints,
2653
+ lambdaEntryPointsBaseDir = "src",
2654
+ lambdaOutdir = "dist",
2648
2655
  stackName
2649
2656
  }) => {
2650
- if (!fs3__default.existsSync(lambdaInput)) {
2651
- return void 0;
2652
- }
2653
2657
  log5.info(logPrefix9, "Deploying Lambda code...");
2654
- await buildLambdaSingleFile({ lambdaExternals, lambdaInput });
2655
- const { bucket, key, versionId } = await uploadCodeToS3({ stackName });
2658
+ for (const entryPoint of lambdaEntryPoints) {
2659
+ const entryPointPath = path__default.resolve(lambdaEntryPointsBaseDir, entryPoint);
2660
+ if (!fs3__default.existsSync(entryPointPath)) {
2661
+ throw new Error(`Entry point ${entryPointPath} does not exist.`);
2662
+ }
2663
+ }
2664
+ await buildLambdaCode({
2665
+ lambdaExternal,
2666
+ lambdaEntryPoints,
2667
+ lambdaEntryPointsBaseDir,
2668
+ lambdaOutdir
2669
+ });
2670
+ const { bucket, key, versionId } = await uploadCodeToS3({
2671
+ stackName,
2672
+ lambdaOutdir
2673
+ });
2656
2674
  if (!lambdaImage) {
2657
- await deployLambdaLayers({ lambdaExternals });
2675
+ await deployLambdaLayers({ lambdaExternal });
2658
2676
  return { bucket, key, versionId };
2659
2677
  }
2660
2678
  const { imageUri } = await uploadCodeToECR({
@@ -2662,7 +2680,7 @@ var deployLambdaCode = async ({
2662
2680
  key,
2663
2681
  versionId,
2664
2682
  lambdaDockerfile,
2665
- lambdaExternals
2683
+ lambdaExternal
2666
2684
  });
2667
2685
  return { imageUri };
2668
2686
  };
@@ -2685,8 +2703,8 @@ var deployCicdLambdas = async ({ stackName }) => {
2685
2703
  throw new Error("Cannot read CICD lambdas file.");
2686
2704
  })();
2687
2705
  const s32 = await deployLambdaCode({
2688
- lambdaInput,
2689
- lambdaExternals: [],
2706
+ lambdaEntryPoints: [lambdaInput],
2707
+ lambdaExternal: [],
2690
2708
  /**
2691
2709
  * Needs stackName to define the S3 key.
2692
2710
  */
@@ -3010,14 +3028,32 @@ var findAndReadCloudFormationTemplate = async ({
3010
3028
  const configFilePath = path.resolve(process.cwd(), templatePath);
3011
3029
  return readConfigFile({ configFilePath });
3012
3030
  };
3031
+
3032
+ // src/deploy/lambda/getLambdaEntryPointsFromTemplate.ts
3033
+ var getLambdaEntryPointsFromTemplate = (template) => {
3034
+ const lambdaResources = Object.keys(template.Resources).filter((key) => {
3035
+ return ["AWS::Lambda::Function", "AWS::Serverless::Function"].includes(
3036
+ template.Resources[key].Type
3037
+ );
3038
+ });
3039
+ const handlers = lambdaResources.map((key) => {
3040
+ return template.Resources[key].Properties.Handler;
3041
+ });
3042
+ const handlersPaths = handlers.map((handler) => {
3043
+ return handler.split(".")[0] + ".ts";
3044
+ });
3045
+ return handlersPaths;
3046
+ };
3013
3047
  var logPrefix12 = "cloudformation";
3014
3048
  log5.addLevel("event", 1e4, { fg: "yellow" });
3015
3049
  log5.addLevel("output", 1e4, { fg: "blue" });
3016
3050
  var deployCloudFormation = async ({
3017
3051
  lambdaDockerfile,
3018
- lambdaInput,
3052
+ lambdaEntryPoints,
3053
+ lambdaEntryPointsBaseDir,
3019
3054
  lambdaImage,
3020
- lambdaExternals = [],
3055
+ lambdaExternal,
3056
+ lambdaOutdir,
3021
3057
  parameters,
3022
3058
  template,
3023
3059
  templatePath
@@ -3065,11 +3101,19 @@ var deployCloudFormation = async ({
3065
3101
  }) || []
3066
3102
  };
3067
3103
  const deployCloudFormationDeployLambdaCode = async () => {
3104
+ const finalLambdaEntryPoints = (() => {
3105
+ if (lambdaEntryPoints && lambdaEntryPoints.length > 0) {
3106
+ return lambdaEntryPoints;
3107
+ }
3108
+ return getLambdaEntryPointsFromTemplate(cloudFormationTemplate);
3109
+ })();
3068
3110
  const response = await deployLambdaCode({
3069
3111
  lambdaDockerfile,
3070
- lambdaExternals,
3071
- lambdaInput,
3112
+ lambdaExternal,
3113
+ lambdaEntryPoints: finalLambdaEntryPoints,
3114
+ lambdaEntryPointsBaseDir,
3072
3115
  lambdaImage,
3116
+ lambdaOutdir,
3073
3117
  stackName
3074
3118
  });
3075
3119
  if (response) {
@@ -3964,7 +4008,7 @@ var options5 = {
3964
4008
  },
3965
4009
  destroy: {
3966
4010
  default: false,
3967
- describe: 'Destroy the deployment. You cannot destroy a deploy with "environment" is defined.',
4011
+ describe: 'Destroy the deployment. You cannot destroy a deploy when "environment" is defined.',
3968
4012
  type: "boolean"
3969
4013
  },
3970
4014
  "lambda-dockerfile": {
@@ -3980,14 +4024,24 @@ var options5 = {
3980
4024
  describe: "A Lambda image will be created instead using S3.",
3981
4025
  type: "boolean"
3982
4026
  },
3983
- "lambda-externals": {
4027
+ "lambda-external": {
3984
4028
  default: [],
3985
- describe: "Lambda external packages.",
4029
+ describe: "External modules that will not be bundled in the Lambda code.",
3986
4030
  type: "array"
3987
4031
  },
3988
- "lambda-input": {
3989
- default: "src/lambda.ts",
3990
- describe: "Lambda input file. This file export all handlers used by the Lambda Functions.",
4032
+ "lambda-entry-points-base-dir": {
4033
+ default: "src",
4034
+ describe: "Base directory for Lambda entry points.",
4035
+ type: "string"
4036
+ },
4037
+ "lambda-entry-points": {
4038
+ default: [],
4039
+ describe: "This is an array of files that each serve as an input to the bundling algorithm for Lambda functions.",
4040
+ type: "string"
4041
+ },
4042
+ "lambda-outdir": {
4043
+ default: "dist",
4044
+ describe: "Output directory for built Lambda code.",
3991
4045
  type: "string"
3992
4046
  },
3993
4047
  /**
@@ -4010,15 +4064,16 @@ var options5 = {
4010
4064
  "skip-deploy": {
4011
4065
  alias: "skip",
4012
4066
  default: false,
4013
- describe: "Skip deploy.",
4067
+ describe: "Skip the deploy command.",
4014
4068
  type: "boolean"
4015
4069
  },
4016
4070
  "stack-name": {
4017
- describe: "CloudFormation Stack name.",
4071
+ describe: "Set the stack name.",
4018
4072
  type: "string"
4019
4073
  },
4020
4074
  "template-path": {
4021
4075
  alias: "t",
4076
+ describe: "Path to the CloudFormation template.",
4022
4077
  type: "string"
4023
4078
  }
4024
4079
  };
@@ -4029,7 +4084,7 @@ var examples = [
4029
4084
  ],
4030
4085
  ["carlin deploy -e Production", "Set environment."],
4031
4086
  [
4032
- "carlin deploy --lambda-input src/lambda/index.ts --lambda-externals momentjs",
4087
+ "carlin deploy --lambda-externals momentjs",
4033
4088
  "Lambda exists. Don't bundle momentjs."
4034
4089
  ],
4035
4090
  [
@@ -4075,6 +4130,17 @@ var deployCommand = {
4075
4130
  );
4076
4131
  process.exit(0);
4077
4132
  }
4133
+ }).middleware(({ lambdaExternals, lambdaInput }) => {
4134
+ if (lambdaInput) {
4135
+ throw new Error(
4136
+ 'Option "lambdaInput" was removed. Please use "lambdaEntryPoints" instead.'
4137
+ );
4138
+ }
4139
+ if (lambdaExternals) {
4140
+ throw new Error(
4141
+ 'Option "lambdaExternals" was removed. Please use "lambdaExternal" instead.'
4142
+ );
4143
+ }
4078
4144
  });
4079
4145
  const commands = [
4080
4146
  deployLambdaLayerCommand,
@@ -4088,7 +4154,7 @@ var deployCommand = {
4088
4154
  choices: commands.map(({ command }) => {
4089
4155
  return command;
4090
4156
  }),
4091
- describe: "Type of deployment.",
4157
+ describe: "Deploy command.",
4092
4158
  type: "string"
4093
4159
  });
4094
4160
  commands.forEach((command) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carlin",
3
- "version": "1.31.21",
3
+ "version": "1.32.0",
4
4
  "description": "",
5
5
  "license": "GPL-3.0",
6
6
  "author": "Pedro Arantes <arantespp@gmail.com> (https://twitter.com/arantespp)",
@@ -46,9 +46,9 @@
46
46
  "uglify-js": "^3.17.4",
47
47
  "vercel": "^34.1.3",
48
48
  "yargs": "^17.7.2",
49
- "@ttoss/config": "^1.32.3",
50
49
  "@ttoss/cloudformation": "^0.9.7",
51
- "@ttoss/read-config-file": "^1.0.2"
50
+ "@ttoss/read-config-file": "^1.0.2",
51
+ "@ttoss/config": "^1.32.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/adm-zip": "^0.5.5",