@kumologica/builder
Version:
Kumologica build and deploy module
175 lines (142 loc) • 5.65 kB
JavaScript
const codegen = require('../build/codegen');
const gh = require('./github');
const path = require('path');
const semver = require('semver')
function jsonMap(j) {
return j? JSON.parse(j): undefined;
}
function exp(lang, provider, argv, log) {
if (lang === "github") {
return gh.expGithub(provider, argv, log);
}
if (!["cloudformation", "serverless", "terraform", "github"].includes(lang)) {
throw new Error(`Unsupported value for language: <${lang}>, valid values are: cloudformation, serverless, terraform, github`);
}
if (["serverless", "terraform"].includes(lang) && !["aws", "google", "azure"].includes(provider)) {
throw new Error(`Unsupported value for provider: <${provider}> when serverless and terraform language present, valid values are: aws, azure, google`);
}
if (["github"].includes(lang) && !["aws",].includes(provider)) {
throw new Error(`Unsupported value for provider: <${provider}> when github present, valid values are: aws`);
}
if (log) {
log(`Exporting ${lang} script for ${provider}`);
} else {
console.log(`Exporting ${lang} script for ${provider}`);
}
//console.log(`reading flow file: ${settings.projectDir}/${settings.flowFileName}`);
let projectDir;
let buildDir;
if (argv["project-directory"]) {
projectDir = argv["project-directory"];
buildDir = codegen.getBuildDir(projectDir);
} else {
projectDir = process.cwd();
buildDir = process.cwd();
}
let projectFlowName = argv["flow-file-name"] || codegen.findFlowFile(projectDir);
if (!projectFlowName && lang !== 'github') {
throw new Error(`Unable to find flow file in project directory: ${projectDir}`);
}
if (provider === 'azure' && lang === 'terraform') {
const defaultName = projectFlowName.replace('.json', '');
argv["azure-application-name"] = argv["azure-application-name"] || defaultName + "-app";
argv["azure-function-name"] = argv["azure-function-name"] || defaultName;
argv.buildDir = buildDir;
const TerraformAzureTemplate = require('./terraformAzure');
t = new TerraformAzureTemplate();
let template = t.createTemplate(argv);
let fileName = 'template.tf.json';
codegen.createFile(buildDir, fileName, JSON.stringify(template, null, 2));
if (log) {
log('Terraform script has been created:');
log(` script file: ${path.join(buildDir, fileName)}`);
} else {
console.log('Terraform script has been created:');
console.log(` script file: ${path.join(buildDir, fileName)}`);
}
return fileName;
}
let nodes;
let pck;
let lambdaName;
if (lang !== 'github') {
lambdaName = codegen.sanitizeLambdaName(projectFlowName.replace(".json", ""));
argv["lambda-name"] = argv["lambda-name"] || lambdaName;
argv["role-name"] = argv["role-name"] || `${argv["lambda-name"]}-role`;
nodes = codegen.loadJsonFile(path.join(projectDir, projectFlowName));
pck = codegen.loadJsonFile(path.join(projectDir, "package.json"));
}
let template;
let fileName = 'template.json';
const isv2 = pck? pck.devDependencies["aws-sdk"]: false;
const is34 = pck? semver.lt(pck.dependencies["@kumologica/runtime"], "3.5.0"): false;
if (isv2) {
console.warn("");
console.warn("aws-sdk v2 detected in devDependencies");
console.warn("It is recommended to migrate project into aws-sdk v3 version.");
}
if (is34) {
console.warn("");
console.warn(`Kumologica runtime version: ${pck.dependencies["@kumologica/runtime"]} that uses aws-sdk v2 detected in dependencies`);
console.warn("It is recommended to migrate project into aws-sdk v3 version.");
}
const rtv = is34? "nodejs16.x": "nodejs18.x";
if (!argv.runtime) {
console.log("NodeJS runtime version not provided, setting to: " + rtv);
}
const params = {
functionName: argv["lambda-name"],
zipFileName: argv["zip-file-name"],
roleName: argv["role-name"],
deploymentBucketName: argv["bucket-name"],
description: argv.description,
runtime: argv.runtime || rtv,
timeout: argv.timeout,
memory: argv["memory-size"],
reservedConcurrency: argv["reserved-concurrency"],
tracingConfig: jsonMap(argv["tracing-config"]),
roleArn: argv["role-arn"],
environment: jsonMap(argv.environment),
tags: jsonMap(argv.tags),
kmsKeyArn: argv["kms-key-arn"],
vpcConfig: jsonMap(argv["vpc-config"]),
deadLetterConfig: jsonMap(argv["dead-letter-config"]),
fileSystemConfigs: jsonMap(argv["file-system-configs"]),
logRetentionDays: argv["log-retention-days"],
policy: jsonMap(argv.policy),
architectures: argv.architectures,
layers: jsonMap(argv.layers),
strictMode: argv["strict-mode"],
triggers: jsonMap(argv.triggers),
region: argv.region,
skipPrepare: argv.skipPrepare
};
if (lang === 'cloudformation') {
if (argv.target === "ecs-fargate") {
const AWSCFECSFargateTemplate = require('./cfEcsFargate');
const cf = new AWSCFECSFargateTemplate();
template = cf.createCfTemplate(params, nodes);
} else {
const AWSCFTemplate = require('./cf');
const cf = new AWSCFTemplate();
template = cf.createCfTemplate(params, nodes);
}
} else if (lang === 'terraform') {
const TerraformTemplate = require('./terraform');
const tf = new TerraformTemplate();
template = tf.createTemplate(provider, params, nodes);
fileName = 'template.tf.json';
} else {
throw new Error(`lang: ${lang} not supported yet`);
}
if (log) {
log(`Saving AWS Cloud Formation script to: ${buildDir}/${fileName}`);
} else {
console.log(`Saving AWS Cloud Formation script to: ${buildDir}/${fileName}`);
}
codegen.createFile(buildDir, fileName, JSON.stringify(template, null, 2));
return path.join(buildDir, fileName);
}
module.exports = {
exp
}