From 6286b34d003975944f69527e6fc4a689c06788ab Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 16 Jan 2019 22:38:04 +0000 Subject: [PATCH] Add Flow.getSetting for resolving env-var properties This lays the groundwork for subflow-specific settings --- .../@node-red/runtime/lib/nodes/flows/Flow.js | 4 +++ .../runtime/lib/nodes/flows/index.js | 3 +- .../@node-red/runtime/lib/nodes/flows/util.js | 30 +++++++++++-------- .../@node-red/runtime/lib/nodes/index.js | 2 +- .../runtime/lib/nodes/flows/Flow_spec.js | 2 +- .../runtime/lib/nodes/flows/util_spec.js | 12 ++++++++ 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js index c46067f66..62752dc30 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Flow.js @@ -283,6 +283,10 @@ class Flow { return this.activeNodes; } + getSetting(key) { + return this.parent.getSetting(key); + } + handleStatus(node,statusMessage) { events.emit("node-status",{ id: node.id, diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js index 9b34b110c..eeff37b8c 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/index.js @@ -677,7 +677,8 @@ function removeFlow(id) { const flowAPI = { getNode: getNode, handleError: () => false, - handleStatus: () => false + handleStatus: () => false, + getSetting: k => process.env[k] } diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/util.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/util.js index 30531c49a..220fd010e 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/util.js @@ -41,22 +41,28 @@ function diffNodes(oldNode,newNode) { var EnvVarPropertyRE_old = /^\$\((\S+)\)$/; var EnvVarPropertyRE = /^\${(\S+)}$/; -function mapEnvVarProperties(obj,prop) { - if (Buffer.isBuffer(obj[prop])) { +function mapEnvVarProperties(obj,prop,flow) { + var v = obj[prop]; + if (Buffer.isBuffer(v)) { return; - } else if (Array.isArray(obj[prop])) { - for (var i=0;iprocess.env[v]},config,config.flows["t1"]); flow.start(); var activeNodes = flow.getActiveNodes(); diff --git a/test/unit/@node-red/runtime/lib/nodes/flows/util_spec.js b/test/unit/@node-red/runtime/lib/nodes/flows/util_spec.js index a06c99200..3c6598ffe 100644 --- a/test/unit/@node-red/runtime/lib/nodes/flows/util_spec.js +++ b/test/unit/@node-red/runtime/lib/nodes/flows/util_spec.js @@ -64,6 +64,18 @@ describe('flows/util', function() { } foo.should.eql({ a: 'bar1', b: 'bar2', c: { d: 'bar3' } } ); }); + + it('gets ENV from parent flow', function() { + var foo = {a:"$(unknown)",b:"$(foo2)",c:{d:"$(foo3)"}}; + for (var p in foo) { + if (foo.hasOwnProperty(p)) { + flowUtil.mapEnvVarProperties(foo,p,{ + getSetting: name => name[0]==='f'?name.toUpperCase():undefined + }); + } + } + foo.should.eql({ a: '$(unknown)', b: 'FOO2', c: { d: 'FOO3' } } ); + }); }); describe('#diffNodes',function() {