@app.json/cloudformation
Version:
Plugin for @app.json/cli that parses CloudFormation templates and extract config information
91 lines (90 loc) • 3.44 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var core_1 = require("@app.json/core");
var lodash_merge_1 = __importDefault(require("lodash.merge"));
var path_1 = require("path");
var load_cloud_formation_template_1 = require("./load-cloud-formation-template");
// todo: extract this to a separate package, which means also extracting the interfaces
function generateFromCf(templatePath) {
var template = load_cloud_formation_template_1.loadCloudFormationTemplate(templatePath);
var baseJson = core_1.getBaseConfig();
var components = getComponents(template);
var outJson = {
env: getEnv(template, components),
output: getOutputs(template),
components: components
};
var appJson = lodash_merge_1.default(baseJson, outJson);
var appJsonPath = path_1.resolve(path_1.parse(templatePath).dir, 'app.json');
core_1.writeAppJson(appJsonPath, appJson);
}
exports.generateFromCf = generateFromCf;
function getEnv(template, components) {
var cfParameters = template.Parameters || {};
var env = {};
Object.keys(cfParameters).forEach(function (key) {
var param = cfParameters[key];
var envKey = core_1.underscore(key).toUpperCase();
env[envKey] = {
description: param.Description || "CloudFormation parameter: " + key,
value: param.Default,
type: ['cf::param']
};
});
if (components) {
components.forEach(function (component) {
component.variables.forEach(function (name) {
var definition = (env[name] = env[name] || {
description: '',
value: '',
type: []
});
if (typeof definition === 'object') {
definition.type = definition.type || [];
if (definition.type.indexOf('cf::function-env-var') === -1) {
definition.type.push('cf::function-env-var');
}
}
else {
throw new Error("Unsupported case, trying to extend string def for env var " + name + ", should not happen when generating from cf template");
}
});
});
}
return env;
}
function getOutputs(template) {
var cfOutputs = template.Outputs || {};
var output = {};
Object.keys(cfOutputs).forEach(function (key) {
var cfOutput = cfOutputs[key];
var envKey = core_1.underscore(key).toUpperCase();
output[key] = {
description: cfOutput.Description ||
"CloudFormation output: " + key,
mapTo: envKey
};
});
return output;
}
function getComponents(template) {
var resources = template.Resources;
var components = [];
if (!resources) {
return;
}
Object.keys(resources).forEach(function (key) {
var resource = resources[key];
var properties = resource.Properties;
if (properties && typeof properties.Environment === 'object') {
components.push({
name: properties.FunctionName || key,
variables: Object.keys(properties.Environment.Variables)
});
}
});
return components;
}