UNPKG

@kumologica/builder

Version:

Kumologica build and deploy module

175 lines (142 loc) 5.65 kB
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": "nodejs20.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 }