Merge branch 'master' into 0.16

This commit is contained in:
Nick O'Leary
2017-01-06 14:30:13 +00:00
committed by GitHub
27 changed files with 354 additions and 160 deletions

View File

@@ -236,7 +236,9 @@ Node.prototype.warn = function(msg) {
};
Node.prototype.error = function(logMessage,msg) {
logMessage = logMessage || "";
if (typeof logMessage != 'boolean') {
logMessage = logMessage || "";
}
log_helper(this, Log.ERROR, logMessage);
/* istanbul ignore else */
if (msg) {

View File

@@ -259,32 +259,6 @@ function Flow(global,flow) {
}
}
}
}
var EnvVarPropertyRE = /^\$\((\S+)\)$/;
function mapEnvVarProperties(obj,prop) {
if (Buffer.isBuffer(obj[prop])) {
return;
} else if (Array.isArray(obj[prop])) {
for (var i=0;i<obj[prop].length;i++) {
mapEnvVarProperties(obj[prop],i);
}
} else if (typeof obj[prop] === 'string') {
var m;
if ( (m = EnvVarPropertyRE.exec(obj[prop])) !== null) {
if (process.env.hasOwnProperty(m[1])) {
obj[prop] = process.env[m[1]];
}
}
} else {
for (var p in obj[prop]) {
if (obj[prop].hasOwnProperty(p)) {
mapEnvVarProperties(obj[prop],p);
}
}
}
}
function createNode(type,config) {
@@ -295,7 +269,7 @@ function createNode(type,config) {
delete conf.credentials;
for (var p in conf) {
if (conf.hasOwnProperty(p)) {
mapEnvVarProperties(conf,p);
flowUtil.mapEnvVarProperties(conf,p);
}
}
try {

View File

@@ -37,9 +37,35 @@ function diffNodes(oldNode,newNode) {
return false;
}
var EnvVarPropertyRE = /^\$\((\S+)\)$/;
function mapEnvVarProperties(obj,prop) {
if (Buffer.isBuffer(obj[prop])) {
return;
} else if (Array.isArray(obj[prop])) {
for (var i=0;i<obj[prop].length;i++) {
mapEnvVarProperties(obj[prop],i);
}
} else if (typeof obj[prop] === 'string') {
var m;
if ( (m = EnvVarPropertyRE.exec(obj[prop])) !== null) {
if (process.env.hasOwnProperty(m[1])) {
obj[prop] = process.env[m[1]];
}
}
} else {
for (var p in obj[prop]) {
if (obj[prop].hasOwnProperty(p)) {
mapEnvVarProperties(obj[prop],p);
}
}
}
}
module.exports = {
diffNodes: diffNodes,
mapEnvVarProperties: mapEnvVarProperties,
parseConfig: function(config) {
var flow = {};
@@ -301,7 +327,7 @@ module.exports = {
}
}
}
} while(madeChange===true)
} while (madeChange===true)
// Find any nodes that exist on a subflow template and remove from changed
// list as the parent subflow will now be marked as containing a change
@@ -316,7 +342,7 @@ module.exports = {
// Recursively mark all instances of changed subflows as changed
var changedSubflowStack = Object.keys(changedSubflows);
while(changedSubflowStack.length > 0) {
while (changedSubflowStack.length > 0) {
var subflowId = changedSubflowStack.pop();
for (id in newConfig.allNodes) {
if (newConfig.allNodes.hasOwnProperty(id)) {
@@ -350,7 +376,7 @@ module.exports = {
// Traverse the links of all modified nodes to mark the connected nodes
var modifiedNodes = diff.added.concat(diff.changed).concat(diff.removed).concat(diff.rewired);
var visited = {};
while(modifiedNodes.length > 0) {
while (modifiedNodes.length > 0) {
node = modifiedNodes.pop();
if (!visited[node]) {
visited[node] = true;

View File

@@ -21,6 +21,7 @@ var fs = require("fs");
var registry = require("./registry");
var credentials = require("./credentials");
var flows = require("./flows");
var flowUtil = require("./flows/util")
var context = require("./context");
var Node = require("./Node");
var log = require("../log");
@@ -69,6 +70,12 @@ function createNode(node,def) {
var creds = credentials.get(id);
if (creds) {
//console.log("Attaching credentials to ",node.id);
// allow $(foo) syntax to substitute env variables for credentials also...
for (var p in creds) {
if (creds.hasOwnProperty(p)) {
flowUtil.mapEnvVarProperties(creds,p);
}
}
node.credentials = creds;
} else if (credentials.getDefinition(node.type)) {
node.credentials = {};
@@ -146,7 +153,6 @@ module.exports = {
// disableFlow: flows.disableFlow,
// enableFlow: flows.enableFlow,
// Credentials
addCredentials: credentials.add,
getCredentials: credentials.get,

View File

@@ -87,10 +87,10 @@ function createNodeApi(node) {
red.server = runtime.adminApi.server;
} else {
red.comms = {
publish: function(){}
publish: function() {}
};
red.library = {
register: function(){}
register: function() {}
};
red.auth = {
needsPermission: function() {}
@@ -203,7 +203,7 @@ function loadNodeConfig(fileInfo) {
if (!node.types) {
node.types = [];
}
node.err = "Error: "+file+" does not exist";
node.err = "Error: "+node.template+" does not exist";
} else {
node.types = [];
node.err = err.toString();
@@ -215,7 +215,7 @@ function loadNodeConfig(fileInfo) {
var regExp = /<script ([^>]*)data-template-name=['"]([^'"]*)['"]/gi;
var match = null;
while((match = regExp.exec(content)) !== null) {
while ((match = regExp.exec(content)) !== null) {
types.push(match[2]);
}
node.types = types;
@@ -226,7 +226,7 @@ function loadNodeConfig(fileInfo) {
var mainContent = "";
var helpContent = {};
var index = 0;
while((match = regExp.exec(content)) !== null) {
while ((match = regExp.exec(content)) !== null) {
mainContent += content.substring(index,regExp.lastIndex-match[1].length);
index = regExp.lastIndex;
var help = content.substring(regExp.lastIndex-match[1].length,regExp.lastIndex);
@@ -382,7 +382,6 @@ function getNodeHelp(node,lang) {
} else {
node.help[lang] = node.help[runtime.i18n.defaultLang];
}
}
return node.help[lang];
}

View File

@@ -281,6 +281,7 @@ function getModuleFiles(module) {
}
nodeModuleFiles.forEach(function(node) {
nodeList[moduleFile.package.name].nodes[node.name] = node;
nodeList[moduleFile.package.name].nodes[node.name].local = moduleFile.local || false;
});
});
return nodeList;

View File

@@ -165,7 +165,7 @@ function normalisePropertyExpression(str) {
throw new Error("Invalid property expression: unterminated expression");
}
// Next char is a-z
if (!/[a-z0-9]/i.test(str[i+1])) {
if (!/[a-z0-9\$\_]/i.test(str[i+1])) {
throw new Error("Invalid property expression: unexpected "+str[i+1]+" at position "+(i+1));
}
start = i+1;