cfn-resolver-lib
Advanced tools
Comparing version 1.0.8 to 1.1.0
{ | ||
"name": "cfn-resolver-lib", | ||
"version": "1.0.8", | ||
"version": "1.1.0", | ||
"description": "Library that resolves AWS Cloudformation templates with exact values", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
@@ -5,3 +5,3 @@ # cfn-resolver-lib | ||
JavaScript library that resolves and evaulates values in [CloudFormation](https://aws.amazon.com/cloudformation/) templates based on the provided stack parameters and produces the JS object representation of the resolved CFN template. | ||
JavaScript library that resolves and evaluates values in [CloudFormation](https://aws.amazon.com/cloudformation/) templates based on the provided stack parameters and produces the JS object representation of the resolved CFN template. | ||
@@ -29,6 +29,6 @@ Did you ever had to debug what's wrong with your CloudFormation template and why your stack deployment fails? Your YAML/JSON could contain some logic with all kinds of nested [intrinsic functions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html) and CFN [pseudo parameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html) and sometimes this can get even more complex when you use a tool (e.g. [AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/home.html)) that generates the file for you. | ||
```js | ||
const NodeEvaulator = require('cfn-resolver-lib'); | ||
const NodeEvaluator = require('cfn-resolver-lib'); | ||
const stackParameters = { | ||
RefResolveres: | ||
RefResolvers: | ||
{ | ||
@@ -39,3 +39,3 @@ "AWS::Region": "us-west-2", | ||
"Stage": "prod", | ||
"AWS::StackId": "MyEvaulatedFakeStackUsWest2" | ||
"AWS::StackId": "MyEvaluatedFakeStackUsWest2" | ||
}, | ||
@@ -49,3 +49,3 @@ "Fn::GetAttResolvers": { | ||
const resolvedObj = new NodeEvaulator(cloufFormationTemplateDeseralizedObj, stackParameters).evaulate(); | ||
const resolvedObj = new NodeEvaluator(cloufFormationTemplateDeseralizedObj, stackParameters).evaluateNodes(); | ||
``` | ||
@@ -52,0 +52,0 @@ |
@@ -24,2 +24,4 @@ const { | ||
const convertNode = (node, nodeAccessor, srcObj, params, convRoot, enableVerboseLogging) => { | ||
// keeping backward compatibility because of typo in previos versions | ||
const refResolvers = params.RefResolvers || params.RefResolevers; | ||
@@ -48,3 +50,3 @@ switch (nodeAccessor.key) { | ||
case "Fn::GetAZs": | ||
return new FnGetAZsNode(node, nodeAccessor, enableVerboseLogging, azMapping, params.RefResolveres["AWS::Region"]); | ||
return new FnGetAZsNode(node, nodeAccessor, enableVerboseLogging, azMapping, refResolvers["AWS::Region"]); | ||
case "Condition": | ||
@@ -56,3 +58,3 @@ if (nodeAccessor.path.length >= 3 && nodeAccessor.path[2] == "Properties") { | ||
case "Ref": | ||
return new RefNode(node, nodeAccessor, enableVerboseLogging, params.RefResolveres); | ||
return new RefNode(node, nodeAccessor, enableVerboseLogging, refResolvers); | ||
case "Fn::GetAtt": | ||
@@ -59,0 +61,0 @@ return new FnGetAttNode(node, nodeAccessor, enableVerboseLogging, params["Fn::GetAttResolvers"]); |
@@ -1,3 +0,3 @@ | ||
const NodeEvaulator = require("./nodeEvaulator"); | ||
const NodeEvaluator = require("./nodeEvaluator"); | ||
module.exports = NodeEvaulator; | ||
module.exports = NodeEvaluator; |
@@ -21,3 +21,3 @@ const Node = require('./Node'); | ||
evaulateResultedArray(array) { | ||
evaluateResultedArray(array) { | ||
// simple array | ||
@@ -27,8 +27,8 @@ return array; | ||
evaulate() { | ||
evaluate() { | ||
super.log("Eval: ", this.nodeAccessor.path.join('/')); | ||
if(this.isLeaf){ | ||
super.log("Leaf: ", this.node, this.nodeAccessor.path.join('/')); | ||
console.warn("Invalid Array: has no items, how to evaulate??"); | ||
throw "Invalid Array: has no items, how to evaulate??"; | ||
console.warn("Invalid Array: has no items, how to evaluate??"); | ||
throw "Invalid Array: has no items, how to evaluate??"; | ||
return ""; // Simple value (number, string) | ||
@@ -38,10 +38,10 @@ } else { | ||
this.directDependencies.forEach( (dep) => { | ||
const depRes = dep.evaulate(); | ||
const depRes = dep.evaluate(); | ||
result[dep.nodeAccessor.key] = depRes; | ||
}); | ||
super.log("Array evaulated: "); | ||
super.log("Array evaluated: "); | ||
super.log(result); | ||
return this.evaulateResultedArray(result); | ||
return this.evaluateResultedArray(result); | ||
} | ||
@@ -48,0 +48,0 @@ } |
@@ -13,10 +13,10 @@ const ObjectNode = require('./ObjectNode'); | ||
evaulate(){ | ||
evaluate(){ | ||
let result = this.node; | ||
if(this.convConditions.wrappedObject.hasOwnProperty(this.node)){ | ||
result = this.convConditions.wrappedObject[this.node].evaulate(); | ||
result = this.convConditions.wrappedObject[this.node].evaluate(); | ||
} | ||
// might not needed | ||
else if(this.hasSingleDependency){ | ||
result = this.directDependencies[0].evaulate(); | ||
result = this.directDependencies[0].evaluate(); | ||
} | ||
@@ -23,0 +23,0 @@ |
@@ -9,3 +9,3 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulateResultedArray(array) { | ||
evaluateResultedArray(array) { | ||
let result = true; | ||
@@ -12,0 +12,0 @@ array.forEach((boolVal) => { |
@@ -9,3 +9,3 @@ | ||
evaulateResultedArray(array) { | ||
evaluateResultedArray(array) { | ||
const val1 = array[0]; | ||
@@ -12,0 +12,0 @@ const val2 = array[1]; |
@@ -8,7 +8,7 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
const mappingName = this.directDependencies[0].evaulate(); | ||
const level1Key = this.directDependencies[1].evaulate(); | ||
const level2Key = this.directDependencies[2].evaulate(); | ||
const mappingName = this.directDependencies[0].evaluate(); | ||
const level1Key = this.directDependencies[1].evaluate(); | ||
const level2Key = this.directDependencies[2].evaluate(); | ||
if (!this.mappings.hasOwnProperty(mappingName)) { | ||
@@ -27,3 +27,3 @@ console.warn("Not found mapping: " + mappingName); | ||
super.log("FnFindInMapNode evaulated: "); | ||
super.log("FnFindInMapNode evaluated: "); | ||
super.log(result); | ||
@@ -30,0 +30,0 @@ return result; |
@@ -8,6 +8,6 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
const resourceLogicalId = this.directDependencies[0].evaulate(); | ||
const attrName = this.directDependencies[1].evaulate(); | ||
const resourceLogicalId = this.directDependencies[0].evaluate(); | ||
const attrName = this.directDependencies[1].evaluate(); | ||
@@ -23,3 +23,3 @@ if (!this.getAttrResolvers[resourceLogicalId]) { | ||
super.log("FnGetAttNode evaulated: "); | ||
super.log("FnGetAttNode evaluated: "); | ||
super.log(result); | ||
@@ -26,0 +26,0 @@ return result; |
@@ -14,10 +14,10 @@ const ObjectNode = require('./ObjectNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
let regionName = this.currentRegion; | ||
if (!this.isLeaf) { | ||
regionName = this.directDependencies[0].evaulate(); | ||
regionName = this.directDependencies[0].evaluate(); | ||
} | ||
result = this.azMapping[regionName]; | ||
super.log("FnGetAZsNode evaulated: "); | ||
super.log("FnGetAZsNode evaluated: "); | ||
super.log(result); | ||
@@ -24,0 +24,0 @@ return result; |
@@ -9,13 +9,13 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
if (this.directDependencies.length >= 3) { | ||
const conditionName = this.directDependencies[0].evaulate(); | ||
const evaulatedCondition = this.convConditions.wrappedObject[conditionName].evaulate(); | ||
const valueIfTrue = this.directDependencies[1].evaulate(); | ||
const valueIfFalse = this.directDependencies[2].evaulate(); | ||
result = evaulatedCondition ? valueIfTrue : valueIfFalse; | ||
const conditionName = this.directDependencies[0].evaluate(); | ||
const evaluatedCondition = this.convConditions.wrappedObject[conditionName].evaluate(); | ||
const valueIfTrue = this.directDependencies[1].evaluate(); | ||
const valueIfFalse = this.directDependencies[2].evaluate(); | ||
result = evaluatedCondition ? valueIfTrue : valueIfFalse; | ||
} | ||
super.log("FnIf evaulated: "); | ||
super.log("FnIf evaluated: "); | ||
super.log(result); | ||
@@ -22,0 +22,0 @@ return result; |
@@ -8,7 +8,7 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
if (this.directDependencies.length >= 2) { | ||
const separator = this.directDependencies[0].evaulate(); | ||
const items = this.directDependencies[1].evaulate(); | ||
const separator = this.directDependencies[0].evaluate(); | ||
const items = this.directDependencies[1].evaluate(); | ||
result = items.join(separator); | ||
@@ -15,0 +15,0 @@ } |
@@ -9,8 +9,8 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate(){ | ||
evaluate(){ | ||
let result = this.node; // by default | ||
if(this.hasSingleDependency){ | ||
result = !this.directDependencies[0].evaulate(); | ||
result = !this.directDependencies[0].evaluate(); | ||
} | ||
super.log("Evaulate FnNot: "); | ||
super.log("Evaluate FnNot: "); | ||
super.log(result); | ||
@@ -17,0 +17,0 @@ return result; |
@@ -9,3 +9,3 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulateResultedArray(array) { | ||
evaluateResultedArray(array) { | ||
let result = false; | ||
@@ -12,0 +12,0 @@ array.forEach((boolVal) => { |
@@ -9,7 +9,7 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
if(this.directDependencies.length == 2){ | ||
let index = this.directDependencies[0].evaulate(); | ||
const listOfObjects = this.directDependencies[1].evaulate(); | ||
let index = this.directDependencies[0].evaluate(); | ||
const listOfObjects = this.directDependencies[1].evaluate(); | ||
if(_.isArray(listOfObjects) && index < listOfObjects.length){ | ||
@@ -24,3 +24,3 @@ result = listOfObjects[index]; | ||
super.log("FnSelect evaulated: "); | ||
super.log("FnSelect evaluated: "); | ||
super.log(result); | ||
@@ -27,0 +27,0 @@ return result; |
@@ -13,7 +13,7 @@ const ArrayNode = require('./ArrayNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; | ||
if(this.directDependencies.length == 2){ | ||
let templateStr = this.directDependencies[0].evaulate(); | ||
const dictionary = this.directDependencies[1].evaulate(); | ||
let templateStr = this.directDependencies[0].evaluate(); | ||
const dictionary = this.directDependencies[1].evaluate(); | ||
for (const key in dictionary) { | ||
@@ -30,3 +30,3 @@ if (dictionary.hasOwnProperty(key)) { | ||
super.log("FnSub evaulated: "); | ||
super.log("FnSub evaluated: "); | ||
super.log(result); | ||
@@ -33,0 +33,0 @@ return result; |
@@ -31,3 +31,3 @@ class Node { | ||
evaulate(){ | ||
evaluate(){ | ||
throw "Should not happen, child class implementations should handle this case"; | ||
@@ -34,0 +34,0 @@ } |
@@ -24,3 +24,3 @@ const Node = require('./Node'); | ||
evaulate(){ | ||
evaluate(){ | ||
super.log("Eval: ", this.nodeAccessor.path.join('/')); | ||
@@ -33,3 +33,3 @@ let result = this.node; // by default or simple value (number, string) | ||
else if(this.hasSingleDependency && this.directDependencies[0].shouldReplaceParent()){ | ||
result = this.directDependencies[0].evaulate(); | ||
result = this.directDependencies[0].evaluate(); | ||
} | ||
@@ -39,7 +39,7 @@ else { | ||
this.directDependencies.forEach( (dep) => { | ||
result[dep.nodeAccessor.key] = dep.evaulate(); | ||
result[dep.nodeAccessor.key] = dep.evaluate(); | ||
}); | ||
} | ||
super.log("ObjectNode evaulated: "); | ||
super.log("ObjectNode evaluated: "); | ||
super.log(result); | ||
@@ -46,0 +46,0 @@ return result; |
@@ -12,7 +12,7 @@ const ObjectNode = require('./ObjectNode'); | ||
evaulate(){ | ||
evaluate(){ | ||
let result = this.node; | ||
if(this.hasSingleDependency) { | ||
result = {}; | ||
result[this.directDependencies[0].nodeAccessor.key] = this.directDependencies[0].evaulate(); | ||
result[this.directDependencies[0].nodeAccessor.key] = this.directDependencies[0].evaluate(); | ||
} | ||
@@ -19,0 +19,0 @@ |
@@ -24,3 +24,3 @@ const ObjectNode = require('./ObjectNode'); | ||
evaulate() { | ||
evaluate() { | ||
let result = this.node; // by default | ||
@@ -31,3 +31,3 @@ if (this.canResolve(this.node)) { | ||
super.log("Ref evaulated: "); | ||
super.log("Ref evaluated: "); | ||
super.log(result); | ||
@@ -34,0 +34,0 @@ return result; |
29140
622