diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 13cd1c69f..59a0c6cd5 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -902,7 +902,7 @@ "properties": "Properties", "description": "Description", "appearance": "Appearance", - "env": "Env Var", + "env": "Environment Variables", "name": "name" } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 8b2e0616a..1dc61258d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -611,40 +611,7 @@ RED.editor = (function() { } function isSameEnv(env0, env1) { - function isSameInfo(info0, info1) { - if (info0 && info1 && - (info0.name === info1.name) && - (info0.label === info1.label) && - (info0.value === info1.value) && - (info0.type === info1.type) && - (info0.target_type === info1.target_type) && - (info0.target === info1.target)) { - return true; - } - return false; - } - function inEnv(env, item) { - for(var i = 0; i < env.length; i++) { - var item1 = env[i]; - if ((item1.name !== item.name) || - (item1.type !== item.type) || - (item1.value !== item.value) || - !isSameInfo(item1.info, item.info)) { - return false; - } - } - return true; - } - if (env0 && env1 && (env0.length === env1.length)) { - for (var i = 0; i < env0.length; i++) { - var item0 = env0[i]; - if (!inEnv(env1, item0)) { - return false; - } - } - return true; - } - return false; + return (JSON.stringify(env0) === JSON.stringify(env1)); } function buildEditForm(container,formId,type,ns,node) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index 3cfd51a5d..4d8b9c438 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -19,13 +19,13 @@ RED.subflow = (function() { var _subflowEditTemplate = ''; var _subflowTemplateEditTemplate = ''; diff --git a/packages/node_modules/@node-red/nodes/core/core/80-function.js b/packages/node_modules/@node-red/nodes/core/core/80-function.js index e8454d79e..305dc2560 100644 --- a/packages/node_modules/@node-red/nodes/core/core/80-function.js +++ b/packages/node_modules/@node-red/nodes/core/core/80-function.js @@ -158,7 +158,13 @@ module.exports = function(RED) { }, env: { get: function(envVar) { - return node.getenv(envVar); + if (node && node._flow) { + var flow = node._flow; + if (flow) { + return flow.getSetting(envVar); + } + } + return process.env[envVar]; } }, setTimeout: function () { diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js index 02562ca99..520015af5 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js @@ -239,22 +239,6 @@ Node.prototype.receive = function(msg) { } }; -Node.prototype.getenv = function(name) { - var flow = this._flow; - if (flow) { - var val = flow.getSetting(name); - return val; - } - return undefined; -}; - -Node.prototype.setenv = function(name, val) { - var flow = this._flow; - if (flow) { - flow.setSetting(name, val); - } -}; - function log_helper(self, level, msg) { var o = { level: level, 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 8af2185ff..82ed5e09b 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 @@ -462,9 +462,6 @@ class Flow { console.log("==================") } - getenv(name) { - return process.env[name]; - } } /** diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js index 883a47af0..c17494ddf 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/flows/Subflow.js @@ -23,34 +23,6 @@ const flowUtil = require("./util"); var Log; -/** - * Convert env var definition of subflow template and instance to env var dic - * @param {Hash} env1 env var definition of template - * @param {Hash} env2 env var definition of instance - * @return {Hash} env var dic - */ -function env2Dic(env0, env1) { - var dic = {}; - function add(env) { - for(var i = 0; i < env.length; i++) { - var item = env[i]; - var name = item.name; - var info = Object.assign({}, item.info); - info.name = name; - dic[name] = item; - dic[name+"_type"] = { value: item.type }; - dic[name+"_info"] = { value: info }; - } - } - if (env0) { - add(env0); - } - if (env1) { - add(env1); - } - return dic; -} - /** * This class represents a subflow - which is handled as a special type of Flow */ @@ -133,14 +105,12 @@ class Subflow extends Flow { var self = this; // Create a subflow node to accept inbound messages and route appropriately var Node = require("../Node"); - var env = env2Dic(this.subflowDef.env, this.subflowInstance.env); var subflowInstanceConfig = { id: this.subflowInstance.id, type: this.subflowInstance.type, z: this.subflowInstance.z, name: this.subflowInstance.name, wires: [], - env: env, _flow: this } if (this.subflowDef.in) { @@ -229,11 +199,63 @@ class Subflow extends Flow { * @return {Object} val value of env var */ getSetting(name) { + function lookup(env, name) { + for(var i = 0; i < env.length; i++) { + var item = env[i]; + if (item.name === name) { + return item; + } + } + return null; + } + function lookupFlow0(env, name) { + if (flow.subflowInstance) { + var vi = lookup(flow.subflowInstance.env, name); + if (vi) { + return vi; + } + } + if (flow.subflowDef) { + var vt = lookup(flow.subflowDef.env, name); + if (vt) { + return vt; + } + } + return null; + } + + function lookupFlow(env, name) { + if (name.endsWith("_type")) { + var vname = name.substring(0, 5); // len("_type")==5 + var val = lookupFlow0(env, vname); + if (val) { + return val.type; + } + } + else if (name.endsWith("_info")) { + var vname = name.substring(0, 5); // len("_info")==5 + var val = lookupFlow0(env, vname); + if (val) { + return val.info; + } + } + else { + var val = lookupFlow0(env, name); + if (val) { + return val.value; + } + } + return null; + } + var node = this.node; if (node) { - var env = node.env; - if (env && env.hasOwnProperty(name)) { - return env[name].value; + var flow = node._flow; + if (flow) { + var v = lookupFlow(flow, name); + if (v) { + return v; + } } } var parent = this.parent; diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index 0f7d9f495..a959e617c 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -419,9 +419,12 @@ function setObjectProperty(msg,prop,value,createMissing) { * @param {String} name - name of variable * @return {String} value of env var */ -function getenv(node, name) { - if (node && node.getenv) { - return node.getenv(name); +function getSetting(node, name) { + if (node && node._flow) { + var flow = node._flow; + if (flow) { + return flow.getSetting(name); + } } return process.env[name]; } @@ -442,16 +445,16 @@ function evaluateEnvProperty(value, node) { if (/^\${[^}]+}$/.test(value)) { // ${ENV_VAR} var name = value.substring(2,value.length-1); - var val = getenv(node, name); + var val = getSetting(node, name); return val ? val : ""; } else if (!/\${\S+}/.test(value)) { // ENV_VAR - var val = getenv(node, value); + var val = getSetting(node, value); return val ? val : ""; } else { // FOO${ENV_VAR}BAR return value.replace(/\${([^}]+)}/g, function(match, name) { - var val = getenv(node, name); + var val = getSetting(node, name); return (val ? val : ""); }); } @@ -558,7 +561,7 @@ function prepareJSONataExpression(value,node) { return node.context().global.get(val); }); expr.assign('env', function(name) { - var val = getenv(node, name); + var val = getSetting(node, name); return (val ? val : ""); }) expr.registerFunction('clone', cloneMessage, '<(oa)-:o>');