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.
- package/dist/index.js +115 -49
- 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
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
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
|
|
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
|
-
...
|
|
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
|
-
|
|
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
|
-
|
|
2577
|
+
lambdaExternal = []
|
|
2574
2578
|
}) => {
|
|
2575
|
-
if (
|
|
2579
|
+
if (lambdaExternal.length === 0) {
|
|
2576
2580
|
return;
|
|
2577
2581
|
}
|
|
2578
2582
|
log5.info(
|
|
2579
2583
|
logPrefix7,
|
|
2580
|
-
`--lambda-externals [${
|
|
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 =
|
|
2602
|
+
const packages = lambdaExternal.map((external) => {
|
|
2599
2603
|
try {
|
|
2600
|
-
const semver2 = dependencies[
|
|
2601
|
-
return `${
|
|
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
|
-
|
|
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 ({
|
|
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
|
|
2627
|
-
|
|
2628
|
-
|
|
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.
|
|
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
|
-
|
|
2650
|
+
lambdaExternal = [],
|
|
2646
2651
|
lambdaImage,
|
|
2647
|
-
|
|
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
|
-
|
|
2655
|
-
|
|
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({
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3052
|
+
lambdaEntryPoints,
|
|
3053
|
+
lambdaEntryPointsBaseDir,
|
|
3019
3054
|
lambdaImage,
|
|
3020
|
-
|
|
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
|
-
|
|
3071
|
-
|
|
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
|
|
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-
|
|
4027
|
+
"lambda-external": {
|
|
3984
4028
|
default: [],
|
|
3985
|
-
describe: "Lambda
|
|
4029
|
+
describe: "External modules that will not be bundled in the Lambda code.",
|
|
3986
4030
|
type: "array"
|
|
3987
4031
|
},
|
|
3988
|
-
"lambda-
|
|
3989
|
-
default: "src
|
|
3990
|
-
describe: "
|
|
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: "
|
|
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-
|
|
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: "
|
|
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.
|
|
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",
|