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.
- package/dist/index.js +117 -48
- 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
|
|
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,35 @@ 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 (!
|
|
2651
|
-
return
|
|
2657
|
+
if (!lambdaEntryPoints.length) {
|
|
2658
|
+
return {};
|
|
2652
2659
|
}
|
|
2653
2660
|
log5.info(logPrefix9, "Deploying Lambda code...");
|
|
2654
|
-
|
|
2655
|
-
|
|
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({
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3055
|
+
lambdaEntryPoints,
|
|
3056
|
+
lambdaEntryPointsBaseDir,
|
|
3019
3057
|
lambdaImage,
|
|
3020
|
-
|
|
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
|
-
|
|
3071
|
-
|
|
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
|
|
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-
|
|
4030
|
+
"lambda-external": {
|
|
3984
4031
|
default: [],
|
|
3985
|
-
describe: "Lambda
|
|
4032
|
+
describe: "External modules that will not be bundled in the Lambda code.",
|
|
3986
4033
|
type: "array"
|
|
3987
4034
|
},
|
|
3988
|
-
"lambda-
|
|
3989
|
-
default: "src
|
|
3990
|
-
describe: "
|
|
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: "
|
|
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-
|
|
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: "
|
|
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.
|
|
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": {
|