@node-red/runtime
Advanced tools
Comparing version 1.0.6 to 1.1.0-beta.1
@@ -243,14 +243,22 @@ /** | ||
} | ||
var definition = runtime.nodes.getCredentialDefinition(opts.type) || {}; | ||
var sendCredentials = {}; | ||
for (var cred in definition) { | ||
if (definition.hasOwnProperty(cred)) { | ||
if (definition[cred].type == "password") { | ||
var key = 'has_' + cred; | ||
sendCredentials[key] = credentials[cred] != null && credentials[cred] !== ''; | ||
continue; | ||
var cred; | ||
if (/^subflow(:|$)/.test(opts.type)) { | ||
for (cred in credentials) { | ||
if (credentials.hasOwnProperty(cred)) { | ||
sendCredentials['has_'+cred] = credentials[cred] != null && credentials[cred] !== ''; | ||
} | ||
sendCredentials[cred] = credentials[cred] || ''; | ||
} | ||
} else { | ||
var definition = runtime.nodes.getCredentialDefinition(opts.type) || {}; | ||
for (cred in definition) { | ||
if (definition.hasOwnProperty(cred)) { | ||
if (definition[cred].type == "password") { | ||
var key = 'has_' + cred; | ||
sendCredentials[key] = credentials[cred] != null && credentials[cred] !== ''; | ||
continue; | ||
} | ||
sendCredentials[cred] = credentials[cred] || ''; | ||
} | ||
} | ||
} | ||
@@ -257,0 +265,0 @@ resolve(sendCredentials); |
@@ -65,3 +65,3 @@ /** | ||
runtime.log.audit({event: "nodes.info.get",id:id,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Node not found"); | ||
err.code = "not_found"; | ||
@@ -109,3 +109,3 @@ err.status = 404; | ||
runtime.log.audit({event: "nodes.config.get",id:id,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Node not found"); | ||
err.code = "not_found"; | ||
@@ -150,3 +150,3 @@ err.status = 404; | ||
runtime.log.audit({event: "nodes.module.get",id:opts.module,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Module not found"); | ||
err.code = "not_found"; | ||
@@ -165,2 +165,3 @@ err.status = 404; | ||
* @param {String} opts.version - (optional) the version of the module to install | ||
* @param {String} opts.url - (optional) url to install | ||
* @param {Object} opts.req - the request to log (optional) | ||
@@ -190,8 +191,8 @@ * @return {Promise<ModuleInfo>} - the node module info | ||
} | ||
runtime.nodes.installModule(opts.module,opts.version).then(function(info) { | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version}, opts.req); | ||
runtime.nodes.installModule(opts.module,opts.version,opts.url).then(function(info) { | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url}, opts.req); | ||
return resolve(info); | ||
}).catch(function(err) { | ||
if (err.code === 404) { | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,error:"not_found"}, opts.req); | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:"not_found"}, opts.req); | ||
// TODO: code/status | ||
@@ -201,6 +202,6 @@ err.status = 404; | ||
err.status = 400; | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,error:err.code}, opts.req); | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code}, opts.req); | ||
} else { | ||
err.status = 400; | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||
runtime.log.audit({event: "nodes.install",module:opts.module,version:opts.version,url:opts.url,error:err.code||"unexpected_error",message:err.toString()}, opts.req); | ||
} | ||
@@ -240,3 +241,3 @@ return reject(err); | ||
runtime.log.audit({event: "nodes.remove",module:opts.module,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Module not found"); | ||
err.code = "not_found"; | ||
@@ -287,3 +288,3 @@ err.status = 404; | ||
runtime.log.audit({event: "nodes.module.set",module:mod,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Module not found"); | ||
err.code = "not_found"; | ||
@@ -339,3 +340,3 @@ err.status = 404; | ||
runtime.log.audit({event: "nodes.info.set",id:id,error:"not_found"}, opts.req); | ||
var err = new Error(); | ||
var err = new Error("Node not found"); | ||
err.code = "not_found"; | ||
@@ -342,0 +343,0 @@ err.status = 404; |
@@ -344,2 +344,3 @@ /** | ||
var nodeType = node.type; | ||
var cred; | ||
var newCreds = node.credentials; | ||
@@ -349,26 +350,54 @@ if (newCreds) { | ||
var savedCredentials = credentialCache[nodeID] || {}; | ||
var dashedType = nodeType.replace(/\s+/g, '-'); | ||
var definition = credentialsDef[dashedType]; | ||
if (!definition) { | ||
log.warn(log._("nodes.credentials.not-registered",{type:nodeType})); | ||
return; | ||
} | ||
if (/^subflow(:|$)/.test(nodeType)) { | ||
for (cred in newCreds) { | ||
if (newCreds.hasOwnProperty(cred)) { | ||
if (newCreds[cred] === "__PWRD__") { | ||
continue; | ||
} | ||
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) { | ||
delete savedCredentials[cred]; | ||
dirty = true; | ||
continue; | ||
} | ||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) { | ||
savedCredentials[cred] = newCreds[cred]; | ||
dirty = true; | ||
} | ||
for (var cred in definition) { | ||
if (definition.hasOwnProperty(cred)) { | ||
if (newCreds[cred] === undefined) { | ||
continue; | ||
} | ||
if (definition[cred].type == "password" && newCreds[cred] == '__PWRD__') { | ||
continue; | ||
} | ||
for (cred in savedCredentials) { | ||
if (savedCredentials.hasOwnProperty(cred)) { | ||
if (!newCreds.hasOwnProperty(cred)) { | ||
delete savedCredentials[cred]; | ||
dirty = true; | ||
} | ||
} | ||
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) { | ||
delete savedCredentials[cred]; | ||
dirty = true; | ||
continue; | ||
} | ||
} else { | ||
var dashedType = nodeType.replace(/\s+/g, '-'); | ||
var definition = credentialsDef[dashedType]; | ||
if (!definition) { | ||
log.warn(log._("nodes.credentials.not-registered",{type:nodeType})); | ||
return; | ||
} | ||
for (cred in definition) { | ||
if (definition.hasOwnProperty(cred)) { | ||
if (newCreds[cred] === undefined) { | ||
continue; | ||
} | ||
if (definition[cred].type == "password" && newCreds[cred] == '__PWRD__') { | ||
continue; | ||
} | ||
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) { | ||
delete savedCredentials[cred]; | ||
dirty = true; | ||
continue; | ||
} | ||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) { | ||
savedCredentials[cred] = newCreds[cred]; | ||
dirty = true; | ||
} | ||
} | ||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) { | ||
savedCredentials[cred] = newCreds[cred]; | ||
dirty = true; | ||
} | ||
} | ||
@@ -375,0 +404,0 @@ } |
@@ -25,2 +25,5 @@ /** | ||
const credentials = require("../credentials"); | ||
var Log; | ||
@@ -42,2 +45,5 @@ | ||
} | ||
if (type === "cred") { | ||
return value; | ||
} | ||
return redUtil.evaluateNodeProperty(value, type, node, null, null); | ||
@@ -47,34 +53,2 @@ } | ||
/** | ||
* Compose information object for env var | ||
*/ | ||
function composeInfo(info, val) { | ||
var result = { | ||
name: info.name, | ||
type: info.type, | ||
value: val, | ||
}; | ||
if (info.ui) { | ||
var ui = info.ui; | ||
result.ui = { | ||
hasUI: ui.hasUI, | ||
icon: ui.icon, | ||
labels: ui.labels, | ||
type: ui.type | ||
}; | ||
var retUI = result.ui; | ||
if (ui.type === "input") { | ||
retUI.inputTypes = ui.inputTypes; | ||
} | ||
if (ui.type === "select") { | ||
retUI.menu = ui.menu; | ||
} | ||
if (ui.type === "spinner") { | ||
retUI.spinner = ui.spinner; | ||
} | ||
} | ||
return result; | ||
} | ||
/** | ||
* This class represents a subflow - which is handled as a special type of Flow | ||
@@ -148,2 +122,5 @@ */ | ||
this.templateCredentials = credentials.get(subflowDef.id); | ||
this.instanceCredentials = credentials.get(this.id); | ||
var env = []; | ||
@@ -153,2 +130,5 @@ if (this.subflowDef.env) { | ||
env[e.name] = e; | ||
if (e.type === "cred") { | ||
e.value = this.templateCredentials[e.name]; | ||
} | ||
}); | ||
@@ -164,2 +144,9 @@ } | ||
} | ||
if (e.type === "cred") { | ||
if (!old || this.instanceCredentials.hasOwnProperty(e.name) ) { | ||
e.value = this.instanceCredentials[e.name]; | ||
} else if (old) { | ||
e.value = this.templateCredentials[e.name]; | ||
} | ||
} | ||
}); | ||
@@ -337,15 +324,6 @@ } | ||
getSetting(name) { | ||
this.trace("getSetting:"+name); | ||
if (!/^\$parent\./.test(name)) { | ||
var env = this.env; | ||
var is_info = name.endsWith("_info"); | ||
var is_type = name.endsWith("_type"); | ||
var ename = (is_info || is_type) ? name.substring(0, name.length -5) : name; // 5 = length of "_info"/"_type" | ||
if (env && env.hasOwnProperty(ename)) { | ||
var val = env[ename]; | ||
if (is_type) { | ||
return val ? val.type : undefined; | ||
} | ||
if (env && env.hasOwnProperty(name)) { | ||
var val = env[name]; | ||
// If this is an env type property we need to be careful not | ||
@@ -364,7 +342,3 @@ // to get into lookup loops. | ||
try { | ||
var ret = evaluateInputValue(value, type, this.node); | ||
if (is_info) { | ||
return composeInfo(val, ret); | ||
} | ||
return ret; | ||
return evaluateInputValue(value, type, this.node); | ||
} | ||
@@ -371,0 +345,0 @@ catch (e) { |
@@ -88,2 +88,3 @@ /** | ||
flow.flows = {}; | ||
flow.groups = {}; | ||
flow.missingTypes = []; | ||
@@ -99,4 +100,8 @@ | ||
} | ||
if (n.type === 'group') { | ||
flow.groups[n.id] = n; | ||
} | ||
}); | ||
// TODO: why a separate forEach? this can be merged with above | ||
config.forEach(function(n) { | ||
@@ -113,3 +118,3 @@ if (n.type === 'subflow') { | ||
config.forEach(function(n) { | ||
if (n.type !== 'subflow' && n.type !== 'tab') { | ||
if (n.type !== 'subflow' && n.type !== 'tab' && n.type !== 'group') { | ||
var subflowDetails = subflowInstanceRE.exec(n.type); | ||
@@ -169,3 +174,3 @@ | ||
config.forEach(function(n) { | ||
if (n.type !== 'subflow' && n.type !== 'tab') { | ||
if (n.type !== 'subflow' && n.type !== 'tab' && n.type !== 'group') { | ||
for (var prop in n) { | ||
@@ -172,0 +177,0 @@ if (n.hasOwnProperty(prop) && prop !== 'id' && prop !== 'wires' && prop !== 'type' && prop !== '_users' && flow.configs.hasOwnProperty(n[prop])) { |
@@ -153,6 +153,6 @@ /** | ||
function installModule(module,version) { | ||
function installModule(module,version,url) { | ||
var existingModule = registry.getModuleInfo(module); | ||
var isUpgrade = !!existingModule; | ||
return registry.installModule(module,version).then(function(info) { | ||
return registry.installModule(module,version,url).then(function(info) { | ||
if (isUpgrade) { | ||
@@ -159,0 +159,0 @@ events.emit("runtime-event",{id:"node/upgraded",retain:false,payload:{module:module,version:version}}); |
@@ -90,3 +90,3 @@ /** | ||
var current = globalSettings[prop]; | ||
globalSettings[prop] = value; | ||
globalSettings[prop] = clone(value); | ||
try { | ||
@@ -93,0 +93,0 @@ assert.deepEqual(current,value); |
@@ -28,2 +28,14 @@ /** | ||
function toSingleLine(text) { | ||
var result = text.replace(/\\/g, "\\\\").replace(/\n/g, "\\n"); | ||
return result; | ||
} | ||
function fromSingleLine(text) { | ||
var result = text.replace(/\\[\\n]/g, function(s) { | ||
return ((s === "\\\\") ? "\\" : "\n"); | ||
}); | ||
return result; | ||
} | ||
function getFileMeta(root, path) { | ||
@@ -47,3 +59,3 @@ var fn = fspath.join(root, path); | ||
if (match) { | ||
meta[match[1]] = match[2]; | ||
meta[match[1]] = fromSingleLine(match[2]); | ||
} else { | ||
@@ -158,3 +170,3 @@ read = size; | ||
if (meta.hasOwnProperty(i)) { | ||
headers += "// "+i+": "+meta[i]+"\n"; | ||
headers += "// "+i+": "+toSingleLine(meta[i])+"\n"; | ||
} | ||
@@ -161,0 +173,0 @@ } |
@@ -398,3 +398,3 @@ /** | ||
return loadProject(projectName).then(function(project) { | ||
var globalProjectSettings = settings.get("projects"); | ||
var globalProjectSettings = settings.get("projects")||{}; | ||
globalProjectSettings.activeProject = project.name; | ||
@@ -401,0 +401,0 @@ return settings.set("projects",globalProjectSettings).then(function() { |
@@ -709,3 +709,5 @@ /** | ||
}).catch(function(err) { | ||
err.remote = remote; | ||
if (!err.remote) { | ||
err.remote = remote; | ||
} | ||
throw err; | ||
@@ -712,0 +714,0 @@ }) |
@@ -35,2 +35,4 @@ { | ||
"install-failed-not-found": "$t(server.install.install-failed-long) module not found", | ||
"install-failed-name": "$t(server.install.install-failed-long) invalid module name: __name__", | ||
"install-failed-url": "$t(server.install.install-failed-long) invalid url: __url__", | ||
"upgrading": "Upgrading module: __name__ to version: __version__", | ||
@@ -51,3 +53,10 @@ "upgraded": "Upgraded module: __name__. Restart Node-RED to use the new version", | ||
"headless-mode": "Running in headless mode", | ||
"httpadminauth-deprecated": "use of httpAdminAuth is deprecated. Use adminAuth instead" | ||
"httpadminauth-deprecated": "use of httpAdminAuth is deprecated. Use adminAuth instead", | ||
"https": { | ||
"refresh-interval": "Refreshing https settings every __interval__ hours", | ||
"settings-refreshed": "Server https settings have been refreshed", | ||
"refresh-failed": "Failed to refresh https settings: __message__", | ||
"nodejs-version": "httpsRefreshInterval requires Node.js 11 or later", | ||
"function-required": "httpsRefreshInterval requires https property to be a function" | ||
} | ||
}, | ||
@@ -54,0 +63,0 @@ |
@@ -49,3 +49,10 @@ { | ||
"headless-mode": "ヘッドレスモードで実行中です", | ||
"httpadminauth-deprecated": "httpAdminAuthは非推奨です。代わりに adminAuth を使用してください" | ||
"httpadminauth-deprecated": "httpAdminAuthは非推奨です。代わりに adminAuth を使用してください", | ||
"https": { | ||
"refresh-interval": "__interval__ 時間毎にhttps設定を更新します", | ||
"settings-refreshed": "サーバのhttps設定が更新されました", | ||
"refresh-failed": "https設定の更新で失敗しました: __message__", | ||
"nodejs-version": "httpsRefreshIntervalにはNode.js 11以降が必要です", | ||
"function-required": "httpsRefreshIntervalでは、httpsプロパティはfunctionである必要があります" | ||
} | ||
}, | ||
@@ -52,0 +59,0 @@ "api": { |
{ | ||
"name": "@node-red/runtime", | ||
"version": "1.0.6", | ||
"version": "1.1.0-beta.1", | ||
"license": "Apache-2.0", | ||
@@ -19,4 +19,4 @@ "main": "./lib/index.js", | ||
"dependencies": { | ||
"@node-red/registry": "1.0.6", | ||
"@node-red/util": "1.0.6", | ||
"@node-red/registry": "1.1.0-beta.1", | ||
"@node-red/util": "1.1.0-beta.1", | ||
"clone": "2.1.2", | ||
@@ -23,0 +23,0 @@ "express": "4.17.1", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
487116
11642
2
+ Added@node-red/registry@1.1.0-beta.1(transitive)
+ Added@node-red/util@1.1.0-beta.1(transitive)
+ Addedlodash.clonedeep@4.5.0(transitive)
+ Addedmoment@2.30.1(transitive)
+ Addedmoment-timezone@0.5.45(transitive)
+ Addeduglify-js@3.9.4(transitive)
- Removed@node-red/registry@1.0.6(transitive)
- Removed@node-red/util@1.0.6(transitive)
- Removedsource-map@0.6.1(transitive)
- Removeduglify-js@3.8.1(transitive)
Updated@node-red/util@1.1.0-beta.1