mirror of
https://github.com/node-red/node-red
synced 2024-11-21 23:48:30 +00:00
Merge branch 'master' into dev
This commit is contained in:
commit
d218af8619
@ -50,6 +50,13 @@ Nodes
|
|||||||
- Let debug node status msg length be settable via settings (#4402) @dceejay
|
- Let debug node status msg length be settable via settings (#4402) @dceejay
|
||||||
- Feat: Add ability to set headers for WebSocket client (#4436) @marcus-j-davies
|
- Feat: Add ability to set headers for WebSocket client (#4436) @marcus-j-davies
|
||||||
|
|
||||||
|
#### 3.1.9: Maintenance Release
|
||||||
|
|
||||||
|
- Prevent subflow being added to itself (#4654) @knolleary
|
||||||
|
- Fix use of spawn on windows with cmd files (#4652) @knolleary
|
||||||
|
- Guard refresh of unknown subflow (#4640) @knolleary
|
||||||
|
- Fix subflow module sending messages to debug sidebar (#4642) @knolleary
|
||||||
|
|
||||||
#### 3.1.8: Maintenance Release
|
#### 3.1.8: Maintenance Release
|
||||||
|
|
||||||
- Add validation and error handling on subflow instance properties (#4632) @knolleary
|
- Add validation and error handling on subflow instance properties (#4632) @knolleary
|
||||||
|
@ -74,7 +74,7 @@
|
|||||||
"passport-oauth2-client-password": "0.1.2",
|
"passport-oauth2-client-password": "0.1.2",
|
||||||
"raw-body": "2.5.2",
|
"raw-body": "2.5.2",
|
||||||
"semver": "7.5.4",
|
"semver": "7.5.4",
|
||||||
"tar": "6.1.13",
|
"tar": "6.2.1",
|
||||||
"tough-cookie": "4.1.3",
|
"tough-cookie": "4.1.3",
|
||||||
"uglify-js": "3.17.4",
|
"uglify-js": "3.17.4",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
|
@ -646,6 +646,7 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
d3.event = event;
|
d3.event = event;
|
||||||
var selected_tool = $(ui.draggable[0]).attr("data-palette-type");
|
var selected_tool = $(ui.draggable[0]).attr("data-palette-type");
|
||||||
|
try {
|
||||||
var result = createNode(selected_tool);
|
var result = createNode(selected_tool);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return;
|
return;
|
||||||
@ -761,6 +762,13 @@ RED.view = (function() {
|
|||||||
if (nn._def.autoedit) {
|
if (nn._def.autoedit) {
|
||||||
RED.editor.edit(nn);
|
RED.editor.edit(nn);
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error.code != "NODE_RED") {
|
||||||
|
RED.notify(RED._("notification.error",{message:error.toString()}),"error");
|
||||||
|
} else {
|
||||||
|
RED.notify(RED._("notification.error",{message:error.message}),"error");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
chart.on("focus", function() {
|
chart.on("focus", function() {
|
||||||
@ -6063,14 +6071,19 @@ RED.view = (function() {
|
|||||||
function createNode(type, x, y, z) {
|
function createNode(type, x, y, z) {
|
||||||
const wasDirty = RED.nodes.dirty()
|
const wasDirty = RED.nodes.dirty()
|
||||||
var m = /^subflow:(.+)$/.exec(type);
|
var m = /^subflow:(.+)$/.exec(type);
|
||||||
var activeSubflow = z ? RED.nodes.subflow(z) : null;
|
var activeSubflow = (z || RED.workspaces.active()) ? RED.nodes.subflow(z || RED.workspaces.active()) : null;
|
||||||
|
|
||||||
if (activeSubflow && m) {
|
if (activeSubflow && m) {
|
||||||
var subflowId = m[1];
|
var subflowId = m[1];
|
||||||
|
let err
|
||||||
if (subflowId === activeSubflow.id) {
|
if (subflowId === activeSubflow.id) {
|
||||||
throw new Error(RED._("notification.error", { message: RED._("notification.errors.cannotAddSubflowToItself") }))
|
err = new Error(RED._("notification.errors.cannotAddSubflowToItself"))
|
||||||
|
} else if (RED.nodes.subflowContains(m[1], activeSubflow.id)) {
|
||||||
|
err = new Error(RED._("notification.errors.cannotAddCircularReference"))
|
||||||
}
|
}
|
||||||
if (RED.nodes.subflowContains(m[1], activeSubflow.id)) {
|
if (err) {
|
||||||
throw new Error(RED._("notification.error", { message: RED._("notification.errors.cannotAddCircularReference") }))
|
err.code = 'NODE_RED'
|
||||||
|
throw err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ module.exports = function(RED) {
|
|||||||
var exec = require('child_process').exec;
|
var exec = require('child_process').exec;
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var isUtf8 = require('is-utf8');
|
var isUtf8 = require('is-utf8');
|
||||||
|
const isWindows = process.platform === 'win32'
|
||||||
|
|
||||||
function ExecNode(n) {
|
function ExecNode(n) {
|
||||||
RED.nodes.createNode(this,n);
|
RED.nodes.createNode(this,n);
|
||||||
@ -85,9 +86,12 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
var cmd = arg.shift();
|
var cmd = arg.shift();
|
||||||
|
// Since 18.20.2/20.12.2, it is invalid to call spawn on Windows with a .bat/.cmd file
|
||||||
|
// without using shell: true.
|
||||||
|
const opts = isWindows ? { ...node.spawnOpt, shell: true } : node.spawnOpt
|
||||||
/* istanbul ignore else */
|
/* istanbul ignore else */
|
||||||
node.debug(cmd+" ["+arg+"]");
|
node.debug(cmd+" ["+arg+"]");
|
||||||
child = spawn(cmd,arg,node.spawnOpt);
|
child = spawn(cmd,arg,opts);
|
||||||
node.status({fill:"blue",shape:"dot",text:"pid:"+child.pid});
|
node.status({fill:"blue",shape:"dot",text:"pid:"+child.pid});
|
||||||
var unknownCommand = (child.pid === undefined);
|
var unknownCommand = (child.pid === undefined);
|
||||||
if (node.timer !== 0) {
|
if (node.timer !== 0) {
|
||||||
|
@ -273,7 +273,7 @@ async function installModule(moduleDetails) {
|
|||||||
let extraArgs = triggerPayload.args || [];
|
let extraArgs = triggerPayload.args || [];
|
||||||
let args = ['install', ...extraArgs, installSpec]
|
let args = ['install', ...extraArgs, installSpec]
|
||||||
log.trace(NPM_COMMAND + JSON.stringify(args));
|
log.trace(NPM_COMMAND + JSON.stringify(args));
|
||||||
return exec.run(NPM_COMMAND, args, { cwd: installDir },true)
|
return exec.run(NPM_COMMAND, args, { cwd: installDir, shell: true },true)
|
||||||
} else {
|
} else {
|
||||||
log.trace("skipping npm install");
|
log.trace("skipping npm install");
|
||||||
}
|
}
|
||||||
|
@ -25,14 +25,17 @@ const registryUtil = require("./util");
|
|||||||
const library = require("./library");
|
const library = require("./library");
|
||||||
const {exec,log,events,hooks} = require("@node-red/util");
|
const {exec,log,events,hooks} = require("@node-red/util");
|
||||||
const child_process = require('child_process');
|
const child_process = require('child_process');
|
||||||
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
||||||
let installerEnabled = false;
|
|
||||||
|
|
||||||
const plugins = require("./plugins");
|
const plugins = require("./plugins");
|
||||||
|
|
||||||
|
const isWindows = process.platform === 'win32'
|
||||||
|
const npmCommand = isWindows ? 'npm.cmd' : 'npm';
|
||||||
|
|
||||||
|
let installerEnabled = false;
|
||||||
let settings;
|
let settings;
|
||||||
|
|
||||||
const moduleRe = /^(@[^/@]+?[/])?[^/@]+?$/;
|
const moduleRe = /^(@[^/@]+?[/])?[^/@]+?$/;
|
||||||
const slashRe = process.platform === "win32" ? /\\|[/]/ : /[/]/;
|
const slashRe = isWindows ? /\\|[/]/ : /[/]/;
|
||||||
const pkgurlRe = /^(https?|git(|\+https?|\+ssh|\+file)):\/\//;
|
const pkgurlRe = /^(https?|git(|\+https?|\+ssh|\+file)):\/\//;
|
||||||
const localtgzRe = /^([a-zA-Z]:|\/).+tgz$/;
|
const localtgzRe = /^([a-zA-Z]:|\/).+tgz$/;
|
||||||
|
|
||||||
@ -227,7 +230,7 @@ async function installModule(module,version,url) {
|
|||||||
let extraArgs = triggerPayload.args || [];
|
let extraArgs = triggerPayload.args || [];
|
||||||
let args = ['install', ...extraArgs, installName]
|
let args = ['install', ...extraArgs, installName]
|
||||||
log.trace(npmCommand + JSON.stringify(args));
|
log.trace(npmCommand + JSON.stringify(args));
|
||||||
return exec.run(npmCommand,args,{ cwd: installDir}, true)
|
return exec.run(npmCommand,args,{ cwd: installDir, shell: true }, true)
|
||||||
} else {
|
} else {
|
||||||
log.trace("skipping npm install");
|
log.trace("skipping npm install");
|
||||||
}
|
}
|
||||||
@ -262,7 +265,7 @@ async function installModule(module,version,url) {
|
|||||||
log.warn("------------------------------------------");
|
log.warn("------------------------------------------");
|
||||||
e = new Error(log._("server.install.install-failed")+": "+err.toString());
|
e = new Error(log._("server.install.install-failed")+": "+err.toString());
|
||||||
if (err.hook === "postInstall") {
|
if (err.hook === "postInstall") {
|
||||||
return exec.run(npmCommand,["remove",module],{ cwd: installDir}, false).finally(() => {
|
return exec.run(npmCommand,["remove",module],{ cwd: installDir, shell: true }, false).finally(() => {
|
||||||
throw e;
|
throw e;
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -366,7 +369,7 @@ async function getModuleVersionFromNPM(module, version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
child_process.execFile(npmCommand,['info','--json',installName],function(err,stdout,stderr) {
|
child_process.execFile(npmCommand,['info','--json',installName],{ shell: true },function(err,stdout,stderr) {
|
||||||
try {
|
try {
|
||||||
if (!stdout) {
|
if (!stdout) {
|
||||||
log.warn(log._("server.install.install-failed-not-found",{name:module}));
|
log.warn(log._("server.install.install-failed-not-found",{name:module}));
|
||||||
@ -525,7 +528,7 @@ function uninstallModule(module) {
|
|||||||
let extraArgs = triggerPayload.args || [];
|
let extraArgs = triggerPayload.args || [];
|
||||||
let args = ['remove', ...extraArgs, module]
|
let args = ['remove', ...extraArgs, module]
|
||||||
log.trace(npmCommand + JSON.stringify(args));
|
log.trace(npmCommand + JSON.stringify(args));
|
||||||
return exec.run(npmCommand,args,{ cwd: installDir}, true)
|
return exec.run(npmCommand,args,{ cwd: installDir, shell: true }, true)
|
||||||
} else {
|
} else {
|
||||||
log.trace("skipping npm uninstall");
|
log.trace("skipping npm uninstall");
|
||||||
}
|
}
|
||||||
@ -592,7 +595,7 @@ async function checkPrereq() {
|
|||||||
installerEnabled = false;
|
installerEnabled = false;
|
||||||
} else {
|
} else {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
child_process.execFile(npmCommand,['-v'],function(err,stdout) {
|
child_process.execFile(npmCommand,['-v'],{ shell: true },function(err,stdout) {
|
||||||
if (err) {
|
if (err) {
|
||||||
log.info(log._("server.palette-editor.npm-not-found"));
|
log.info(log._("server.palette-editor.npm-not-found"));
|
||||||
installerEnabled = false;
|
installerEnabled = false;
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"fs-extra": "11.1.1",
|
"fs-extra": "11.1.1",
|
||||||
"semver": "7.5.4",
|
"semver": "7.5.4",
|
||||||
"tar": "6.1.13",
|
"tar": "6.2.1",
|
||||||
"uglify-js": "3.17.4"
|
"uglify-js": "3.17.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user