carlin 1.31.21 → 1.32.1

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 +117 -48
  2. package/package.json +2 -2
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,35 @@ 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;
2657
+ if (!lambdaEntryPoints.length) {
2658
+ return {};
2652
2659
  }
2653
2660
  log5.info(logPrefix9, "Deploying Lambda code...");
2654
- await buildLambdaSingleFile({ lambdaExternals, lambdaInput });
2655
- const { bucket, key, versionId } = await uploadCodeToS3({ stackName });
2661
+ for (const entryPoint of lambdaEntryPoints) {
2662
+ const entryPointPath = path__default.resolve(lambdaEntryPointsBaseDir, entryPoint);
2663
+ if (!fs3__default.existsSync(entryPointPath)) {
2664
+ throw new Error(`Entry point ${entryPointPath} does not exist.`);
2665
+ }
2666
+ }
2667
+ await buildLambdaCode({
2668
+ lambdaExternal,
2669
+ lambdaEntryPoints,
2670
+ lambdaEntryPointsBaseDir,
2671
+ lambdaOutdir
2672
+ });
2673
+ const { bucket, key, versionId } = await uploadCodeToS3({
2674
+ stackName,
2675
+ lambdaOutdir
2676
+ });
2656
2677
  if (!lambdaImage) {
2657
- await deployLambdaLayers({ lambdaExternals });
2678
+ await deployLambdaLayers({ lambdaExternal });
2658
2679
  return { bucket, key, versionId };
2659
2680
  }
2660
2681
  const { imageUri } = await uploadCodeToECR({
@@ -2662,7 +2683,7 @@ var deployLambdaCode = async ({
2662
2683
  key,
2663
2684
  versionId,
2664
2685
  lambdaDockerfile,
2665
- lambdaExternals
2686
+ lambdaExternal
2666
2687
  });
2667
2688
  return { imageUri };
2668
2689
  };
@@ -2685,8 +2706,8 @@ var deployCicdLambdas = async ({ stackName }) => {
2685
2706
  throw new Error("Cannot read CICD lambdas file.");
2686
2707
  })();
2687
2708
  const s32 = await deployLambdaCode({
2688
- lambdaInput,
2689
- lambdaExternals: [],
2709
+ lambdaEntryPoints: [lambdaInput],
2710
+ lambdaExternal: [],
2690
2711
  /**
2691
2712
  * Needs stackName to define the S3 key.
2692
2713
  */
@@ -3010,14 +3031,32 @@ var findAndReadCloudFormationTemplate = async ({
3010
3031
  const configFilePath = path.resolve(process.cwd(), templatePath);
3011
3032
  return readConfigFile({ configFilePath });
3012
3033
  };
3034
+
3035
+ // src/deploy/lambda/getLambdaEntryPointsFromTemplate.ts
3036
+ var getLambdaEntryPointsFromTemplate = (template) => {
3037
+ const lambdaResources = Object.keys(template.Resources).filter((key) => {
3038
+ return ["AWS::Lambda::Function", "AWS::Serverless::Function"].includes(
3039
+ template.Resources[key].Type
3040
+ );
3041
+ });
3042
+ const handlers = lambdaResources.map((key) => {
3043
+ return template.Resources[key].Properties.Handler;
3044
+ });
3045
+ const handlersPaths = handlers.map((handler) => {
3046
+ return handler.split(".")[0] + ".ts";
3047
+ });
3048
+ return handlersPaths;
3049
+ };
3013
3050
  var logPrefix12 = "cloudformation";
3014
3051
  log5.addLevel("event", 1e4, { fg: "yellow" });
3015
3052
  log5.addLevel("output", 1e4, { fg: "blue" });
3016
3053
  var deployCloudFormation = async ({
3017
3054
  lambdaDockerfile,
3018
- lambdaInput,
3055
+ lambdaEntryPoints,
3056
+ lambdaEntryPointsBaseDir,
3019
3057
  lambdaImage,
3020
- lambdaExternals = [],
3058
+ lambdaExternal,
3059
+ lambdaOutdir,
3021
3060
  parameters,
3022
3061
  template,
3023
3062
  templatePath
@@ -3065,11 +3104,19 @@ var deployCloudFormation = async ({
3065
3104
  }) || []
3066
3105
  };
3067
3106
  const deployCloudFormationDeployLambdaCode = async () => {
3107
+ const finalLambdaEntryPoints = (() => {
3108
+ if (lambdaEntryPoints && lambdaEntryPoints.length > 0) {
3109
+ return lambdaEntryPoints;
3110
+ }
3111
+ return getLambdaEntryPointsFromTemplate(cloudFormationTemplate);
3112
+ })();
3068
3113
  const response = await deployLambdaCode({
3069
3114
  lambdaDockerfile,
3070
- lambdaExternals,
3071
- lambdaInput,
3115
+ lambdaExternal,
3116
+ lambdaEntryPoints: finalLambdaEntryPoints,
3117
+ lambdaEntryPointsBaseDir,
3072
3118
  lambdaImage,
3119
+ lambdaOutdir,
3073
3120
  stackName
3074
3121
  });
3075
3122
  if (response) {
@@ -3964,7 +4011,7 @@ var options5 = {
3964
4011
  },
3965
4012
  destroy: {
3966
4013
  default: false,
3967
- describe: 'Destroy the deployment. You cannot destroy a deploy with "environment" is defined.',
4014
+ describe: 'Destroy the deployment. You cannot destroy a deploy when "environment" is defined.',
3968
4015
  type: "boolean"
3969
4016
  },
3970
4017
  "lambda-dockerfile": {
@@ -3980,14 +4027,24 @@ var options5 = {
3980
4027
  describe: "A Lambda image will be created instead using S3.",
3981
4028
  type: "boolean"
3982
4029
  },
3983
- "lambda-externals": {
4030
+ "lambda-external": {
3984
4031
  default: [],
3985
- describe: "Lambda external packages.",
4032
+ describe: "External modules that will not be bundled in the Lambda code.",
3986
4033
  type: "array"
3987
4034
  },
3988
- "lambda-input": {
3989
- default: "src/lambda.ts",
3990
- describe: "Lambda input file. This file export all handlers used by the Lambda Functions.",
4035
+ "lambda-entry-points-base-dir": {
4036
+ default: "src",
4037
+ describe: "Base directory for Lambda entry points.",
4038
+ type: "string"
4039
+ },
4040
+ "lambda-entry-points": {
4041
+ default: [],
4042
+ describe: "This is an array of files that each serve as an input to the bundling algorithm for Lambda functions.",
4043
+ type: "string"
4044
+ },
4045
+ "lambda-outdir": {
4046
+ default: "dist",
4047
+ describe: "Output directory for built Lambda code.",
3991
4048
  type: "string"
3992
4049
  },
3993
4050
  /**
@@ -4010,15 +4067,16 @@ var options5 = {
4010
4067
  "skip-deploy": {
4011
4068
  alias: "skip",
4012
4069
  default: false,
4013
- describe: "Skip deploy.",
4070
+ describe: "Skip the deploy command.",
4014
4071
  type: "boolean"
4015
4072
  },
4016
4073
  "stack-name": {
4017
- describe: "CloudFormation Stack name.",
4074
+ describe: "Set the stack name.",
4018
4075
  type: "string"
4019
4076
  },
4020
4077
  "template-path": {
4021
4078
  alias: "t",
4079
+ describe: "Path to the CloudFormation template.",
4022
4080
  type: "string"
4023
4081
  }
4024
4082
  };
@@ -4029,7 +4087,7 @@ var examples = [
4029
4087
  ],
4030
4088
  ["carlin deploy -e Production", "Set environment."],
4031
4089
  [
4032
- "carlin deploy --lambda-input src/lambda/index.ts --lambda-externals momentjs",
4090
+ "carlin deploy --lambda-externals momentjs",
4033
4091
  "Lambda exists. Don't bundle momentjs."
4034
4092
  ],
4035
4093
  [
@@ -4075,6 +4133,17 @@ var deployCommand = {
4075
4133
  );
4076
4134
  process.exit(0);
4077
4135
  }
4136
+ }).middleware(({ lambdaExternals, lambdaInput }) => {
4137
+ if (lambdaInput) {
4138
+ throw new Error(
4139
+ 'Option "lambdaInput" was removed. Please use "lambdaEntryPoints" instead.'
4140
+ );
4141
+ }
4142
+ if (lambdaExternals) {
4143
+ throw new Error(
4144
+ 'Option "lambdaExternals" was removed. Please use "lambdaExternal" instead.'
4145
+ );
4146
+ }
4078
4147
  });
4079
4148
  const commands = [
4080
4149
  deployLambdaLayerCommand,
@@ -4088,7 +4157,7 @@ var deployCommand = {
4088
4157
  choices: commands.map(({ command }) => {
4089
4158
  return command;
4090
4159
  }),
4091
- describe: "Type of deployment.",
4160
+ describe: "Deploy command.",
4092
4161
  type: "string"
4093
4162
  });
4094
4163
  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.1",
4
4
  "description": "",
5
5
  "license": "GPL-3.0",
6
6
  "author": "Pedro Arantes <arantespp@gmail.com> (https://twitter.com/arantespp)",
@@ -46,8 +46,8 @@
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",
50
+ "@ttoss/config": "^1.32.3",
51
51
  "@ttoss/read-config-file": "^1.0.2"
52
52
  },
53
53
  "devDependencies": {