mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Merge branch 'dev' into 4651-in-out-prop
This commit is contained in:
		@@ -50,6 +50,13 @@ Nodes
 | 
			
		||||
 - 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
 | 
			
		||||
 | 
			
		||||
#### 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
 | 
			
		||||
 | 
			
		||||
 - Add validation and error handling on subflow instance properties (#4632) @knolleary
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@
 | 
			
		||||
        "passport-oauth2-client-password": "0.1.2",
 | 
			
		||||
        "raw-body": "2.5.2",
 | 
			
		||||
        "semver": "7.5.4",
 | 
			
		||||
        "tar": "6.1.13",
 | 
			
		||||
        "tar": "6.2.1",
 | 
			
		||||
        "tough-cookie": "4.1.3",
 | 
			
		||||
        "uglify-js": "3.17.4",
 | 
			
		||||
        "uuid": "9.0.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -643,6 +643,7 @@
 | 
			
		||||
            "errors": {
 | 
			
		||||
                "catalogLoadFailed": "<p>Failed to load node catalogue.</p><p>Check the browser console for more information</p>",
 | 
			
		||||
                "installFailed": "<p>Failed to install: __module__</p><p>__message__</p><p>Check the log for more information</p>",
 | 
			
		||||
                "installTimeout": "<p>Install continuing the background.</p><p>Nodes will appear in palette when complete. Check the log for more information.</p>",
 | 
			
		||||
                "removeFailed": "<p>Failed to remove: __module__</p><p>__message__</p><p>Check the log for more information</p>",
 | 
			
		||||
                "updateFailed": "<p>Failed to update: __module__</p><p>__message__</p><p>Check the log for more information</p>",
 | 
			
		||||
                "enableFailed": "<p>Failed to enable: __module__</p><p>__message__</p><p>Check the log for more information</p>",
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ RED.palette.editor = (function() {
 | 
			
		||||
        }).done(function(data,textStatus,xhr) {
 | 
			
		||||
            callback();
 | 
			
		||||
        }).fail(function(xhr,textStatus,err) {
 | 
			
		||||
            callback(xhr);
 | 
			
		||||
            callback(xhr,textStatus,err);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    function removeNodeModule(id,callback) {
 | 
			
		||||
@@ -1405,9 +1405,28 @@ RED.palette.editor = (function() {
 | 
			
		||||
                    RED.actions.invoke("core:show-event-log");
 | 
			
		||||
                });
 | 
			
		||||
                RED.eventLog.startEvent(RED._("palette.editor.confirm.button.install")+" : "+entry.id+" "+entry.version);
 | 
			
		||||
                installNodeModule(entry.id,entry.version,entry.pkg_url,function(xhr) {
 | 
			
		||||
                installNodeModule(entry.id,entry.version,entry.pkg_url,function(xhr, textStatus,err) {
 | 
			
		||||
                    spinner.remove();
 | 
			
		||||
                     if (xhr) {
 | 
			
		||||
                     if (err && xhr.status === 504) {
 | 
			
		||||
                        var notification = RED.notify(RED._("palette.editor.errors.installTimeout"), {
 | 
			
		||||
                            modal: true,
 | 
			
		||||
                            fixed: true,
 | 
			
		||||
                            buttons: [
 | 
			
		||||
                                {
 | 
			
		||||
                                    text: RED._("common.label.close"),
 | 
			
		||||
                                    click: function() {
 | 
			
		||||
                                        notification.close();
 | 
			
		||||
                                    }
 | 
			
		||||
                                },{
 | 
			
		||||
                                    text: RED._("eventLog.view"),
 | 
			
		||||
                                    click: function() {
 | 
			
		||||
                                        notification.close();
 | 
			
		||||
                                        RED.actions.invoke("core:show-event-log");
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            ]
 | 
			
		||||
                        })
 | 
			
		||||
                     } else if (xhr) {
 | 
			
		||||
                         if (xhr.responseJSON) {
 | 
			
		||||
                             var notification = RED.notify(RED._('palette.editor.errors.installFailed',{module: entry.id,message:xhr.responseJSON.message}),{
 | 
			
		||||
                                 type: 'error',
 | 
			
		||||
 
 | 
			
		||||
@@ -1363,7 +1363,7 @@ RED.subflow = (function() {
 | 
			
		||||
                        break;
 | 
			
		||||
                    case "conf-types":
 | 
			
		||||
                        item.value = input.val()
 | 
			
		||||
                        item.type = data.parent.value;
 | 
			
		||||
                        item.type = "conf-type"
 | 
			
		||||
                }
 | 
			
		||||
                if (ui.type === "cred" || item.type !== data.parent.type || item.value !== data.parent.value) {
 | 
			
		||||
                    env.push(item);
 | 
			
		||||
 
 | 
			
		||||
@@ -646,120 +646,128 @@ RED.view = (function() {
 | 
			
		||||
                }
 | 
			
		||||
                d3.event = event;
 | 
			
		||||
                var selected_tool = $(ui.draggable[0]).attr("data-palette-type");
 | 
			
		||||
                var result = createNode(selected_tool);
 | 
			
		||||
                if (!result) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                var historyEvent = result.historyEvent;
 | 
			
		||||
                var nn = RED.nodes.add(result.node);
 | 
			
		||||
 | 
			
		||||
                var showLabel = RED.utils.getMessageProperty(RED.settings.get('editor'),"view.view-node-show-label");
 | 
			
		||||
                if (showLabel !== undefined &&  (nn._def.hasOwnProperty("showLabel")?nn._def.showLabel:true) && !nn._def.defaults.hasOwnProperty("l")) {
 | 
			
		||||
                    nn.l = showLabel;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var helperOffset = d3.touches(ui.helper.get(0))[0]||d3.mouse(ui.helper.get(0));
 | 
			
		||||
                var helperWidth = ui.helper.width();
 | 
			
		||||
                var helperHeight = ui.helper.height();
 | 
			
		||||
                var mousePos = d3.touches(this)[0]||d3.mouse(this);
 | 
			
		||||
 | 
			
		||||
                try {
 | 
			
		||||
                    var isLink = (nn.type === "link in" || nn.type === "link out")
 | 
			
		||||
                    var hideLabel = nn.hasOwnProperty('l')?!nn.l : isLink;
 | 
			
		||||
 | 
			
		||||
                    var label = RED.utils.getNodeLabel(nn, nn.type);
 | 
			
		||||
                    var labelParts = getLabelParts(label, "red-ui-flow-node-label");
 | 
			
		||||
                    if (hideLabel) {
 | 
			
		||||
                        nn.w = node_height;
 | 
			
		||||
                        nn.h = Math.max(node_height,(nn.outputs || 0) * 15);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        nn.w = Math.max(node_width,20*(Math.ceil((labelParts.width+50+(nn._def.inputs>0?7:0))/20)) );
 | 
			
		||||
                        nn.h = Math.max(6+24*labelParts.lines.length,(nn.outputs || 0) * 15, 30);
 | 
			
		||||
                    var result = createNode(selected_tool);
 | 
			
		||||
                    if (!result) {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                } catch(err) {
 | 
			
		||||
                }
 | 
			
		||||
                    var historyEvent = result.historyEvent;
 | 
			
		||||
                    var nn = RED.nodes.add(result.node);
 | 
			
		||||
 | 
			
		||||
                mousePos[1] += this.scrollTop + ((helperHeight/2)-helperOffset[1]);
 | 
			
		||||
                mousePos[0] += this.scrollLeft + ((helperWidth/2)-helperOffset[0]);
 | 
			
		||||
                mousePos[1] /= scaleFactor;
 | 
			
		||||
                mousePos[0] /= scaleFactor;
 | 
			
		||||
                    var showLabel = RED.utils.getMessageProperty(RED.settings.get('editor'),"view.view-node-show-label");
 | 
			
		||||
                    if (showLabel !== undefined &&  (nn._def.hasOwnProperty("showLabel")?nn._def.showLabel:true) && !nn._def.defaults.hasOwnProperty("l")) {
 | 
			
		||||
                        nn.l = showLabel;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                nn.x = mousePos[0];
 | 
			
		||||
                nn.y = mousePos[1];
 | 
			
		||||
                    var helperOffset = d3.touches(ui.helper.get(0))[0]||d3.mouse(ui.helper.get(0));
 | 
			
		||||
                    var helperWidth = ui.helper.width();
 | 
			
		||||
                    var helperHeight = ui.helper.height();
 | 
			
		||||
                    var mousePos = d3.touches(this)[0]||d3.mouse(this);
 | 
			
		||||
 | 
			
		||||
                var minX = nn.w/2 -5;
 | 
			
		||||
                if (nn.x < minX) {
 | 
			
		||||
                    nn.x = minX;
 | 
			
		||||
                }
 | 
			
		||||
                var minY = nn.h/2 -5;
 | 
			
		||||
                if (nn.y < minY) {
 | 
			
		||||
                    nn.y = minY;
 | 
			
		||||
                }
 | 
			
		||||
                var maxX = space_width -nn.w/2 +5;
 | 
			
		||||
                if (nn.x > maxX) {
 | 
			
		||||
                    nn.x = maxX;
 | 
			
		||||
                }
 | 
			
		||||
                var maxY = space_height -nn.h +5;
 | 
			
		||||
                if (nn.y > maxY) {
 | 
			
		||||
                    nn.y = maxY;
 | 
			
		||||
                }
 | 
			
		||||
                    try {
 | 
			
		||||
                        var isLink = (nn.type === "link in" || nn.type === "link out")
 | 
			
		||||
                        var hideLabel = nn.hasOwnProperty('l')?!nn.l : isLink;
 | 
			
		||||
 | 
			
		||||
                if (snapGrid) {
 | 
			
		||||
                    var gridOffset = RED.view.tools.calculateGridSnapOffsets(nn);
 | 
			
		||||
                    nn.x -= gridOffset.x;
 | 
			
		||||
                    nn.y -= gridOffset.y;
 | 
			
		||||
                }
 | 
			
		||||
                        var label = RED.utils.getNodeLabel(nn, nn.type);
 | 
			
		||||
                        var labelParts = getLabelParts(label, "red-ui-flow-node-label");
 | 
			
		||||
                        if (hideLabel) {
 | 
			
		||||
                            nn.w = node_height;
 | 
			
		||||
                            nn.h = Math.max(node_height,(nn.outputs || 0) * 15);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            nn.w = Math.max(node_width,20*(Math.ceil((labelParts.width+50+(nn._def.inputs>0?7:0))/20)) );
 | 
			
		||||
                            nn.h = Math.max(6+24*labelParts.lines.length,(nn.outputs || 0) * 15, 30);
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch(err) {
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                var linkToSplice = $(ui.helper).data("splice");
 | 
			
		||||
                if (linkToSplice) {
 | 
			
		||||
                    spliceLink(linkToSplice, nn, historyEvent)
 | 
			
		||||
                }
 | 
			
		||||
                    mousePos[1] += this.scrollTop + ((helperHeight/2)-helperOffset[1]);
 | 
			
		||||
                    mousePos[0] += this.scrollLeft + ((helperWidth/2)-helperOffset[0]);
 | 
			
		||||
                    mousePos[1] /= scaleFactor;
 | 
			
		||||
                    mousePos[0] /= scaleFactor;
 | 
			
		||||
 | 
			
		||||
                    nn.x = mousePos[0];
 | 
			
		||||
                    nn.y = mousePos[1];
 | 
			
		||||
 | 
			
		||||
                    var minX = nn.w/2 -5;
 | 
			
		||||
                    if (nn.x < minX) {
 | 
			
		||||
                        nn.x = minX;
 | 
			
		||||
                    }
 | 
			
		||||
                    var minY = nn.h/2 -5;
 | 
			
		||||
                    if (nn.y < minY) {
 | 
			
		||||
                        nn.y = minY;
 | 
			
		||||
                    }
 | 
			
		||||
                    var maxX = space_width -nn.w/2 +5;
 | 
			
		||||
                    if (nn.x > maxX) {
 | 
			
		||||
                        nn.x = maxX;
 | 
			
		||||
                    }
 | 
			
		||||
                    var maxY = space_height -nn.h +5;
 | 
			
		||||
                    if (nn.y > maxY) {
 | 
			
		||||
                        nn.y = maxY;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (snapGrid) {
 | 
			
		||||
                        var gridOffset = RED.view.tools.calculateGridSnapOffsets(nn);
 | 
			
		||||
                        nn.x -= gridOffset.x;
 | 
			
		||||
                        nn.y -= gridOffset.y;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    var linkToSplice = $(ui.helper).data("splice");
 | 
			
		||||
                    if (linkToSplice) {
 | 
			
		||||
                        spliceLink(linkToSplice, nn, historyEvent)
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    var group = $(ui.helper).data("group");
 | 
			
		||||
                    if (group) {
 | 
			
		||||
                        var oldX = group.x; 
 | 
			
		||||
                        var oldY = group.y; 
 | 
			
		||||
                        RED.group.addToGroup(group, nn);
 | 
			
		||||
                        var moveEvent = null;
 | 
			
		||||
                        if ((group.x !== oldX) ||
 | 
			
		||||
                            (group.y !== oldY)) {
 | 
			
		||||
                            moveEvent = {
 | 
			
		||||
                                t: "move",
 | 
			
		||||
                                nodes: [{n: group,
 | 
			
		||||
                                        ox: oldX, oy: oldY,
 | 
			
		||||
                                        dx: group.x -oldX,
 | 
			
		||||
                                        dy: group.y -oldY}],
 | 
			
		||||
                                dirty: true
 | 
			
		||||
                            };
 | 
			
		||||
                        }
 | 
			
		||||
                        historyEvent = {
 | 
			
		||||
                            t: 'multi',
 | 
			
		||||
                            events: [historyEvent],
 | 
			
		||||
 | 
			
		||||
                var group = $(ui.helper).data("group");
 | 
			
		||||
                if (group) {
 | 
			
		||||
                    var oldX = group.x; 
 | 
			
		||||
                    var oldY = group.y; 
 | 
			
		||||
                    RED.group.addToGroup(group, nn);
 | 
			
		||||
                    var moveEvent = null;
 | 
			
		||||
                    if ((group.x !== oldX) ||
 | 
			
		||||
                        (group.y !== oldY)) {
 | 
			
		||||
                        moveEvent = {
 | 
			
		||||
                            t: "move",
 | 
			
		||||
                            nodes: [{n: group,
 | 
			
		||||
                                     ox: oldX, oy: oldY,
 | 
			
		||||
                                     dx: group.x -oldX,
 | 
			
		||||
                                     dy: group.y -oldY}],
 | 
			
		||||
                            dirty: true
 | 
			
		||||
                        };
 | 
			
		||||
                        if (moveEvent) {
 | 
			
		||||
                            historyEvent.events.push(moveEvent)
 | 
			
		||||
                        }
 | 
			
		||||
                        historyEvent.events.push({
 | 
			
		||||
                            t: "addToGroup",
 | 
			
		||||
                            group: group,
 | 
			
		||||
                            nodes: nn
 | 
			
		||||
                        })
 | 
			
		||||
                    }
 | 
			
		||||
                    historyEvent = {
 | 
			
		||||
                        t: 'multi',
 | 
			
		||||
                        events: [historyEvent],
 | 
			
		||||
 | 
			
		||||
                    };
 | 
			
		||||
                    if (moveEvent) {
 | 
			
		||||
                        historyEvent.events.push(moveEvent)
 | 
			
		||||
                    RED.history.push(historyEvent);
 | 
			
		||||
                    RED.editor.validateNode(nn);
 | 
			
		||||
                    RED.nodes.dirty(true);
 | 
			
		||||
                    // auto select dropped node - so info shows (if visible)
 | 
			
		||||
                    clearSelection();
 | 
			
		||||
                    nn.selected = true;
 | 
			
		||||
                    movingSet.add(nn);
 | 
			
		||||
                    updateActiveNodes();
 | 
			
		||||
                    updateSelection();
 | 
			
		||||
                    redraw();
 | 
			
		||||
 | 
			
		||||
                    if (nn._def.autoedit) {
 | 
			
		||||
                        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");
 | 
			
		||||
                    }
 | 
			
		||||
                    historyEvent.events.push({
 | 
			
		||||
                        t: "addToGroup",
 | 
			
		||||
                        group: group,
 | 
			
		||||
                        nodes: nn
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                RED.history.push(historyEvent);
 | 
			
		||||
                RED.editor.validateNode(nn);
 | 
			
		||||
                RED.nodes.dirty(true);
 | 
			
		||||
                // auto select dropped node - so info shows (if visible)
 | 
			
		||||
                clearSelection();
 | 
			
		||||
                nn.selected = true;
 | 
			
		||||
                movingSet.add(nn);
 | 
			
		||||
                updateActiveNodes();
 | 
			
		||||
                updateSelection();
 | 
			
		||||
                redraw();
 | 
			
		||||
 | 
			
		||||
                if (nn._def.autoedit) {
 | 
			
		||||
                    RED.editor.edit(nn);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@@ -6063,14 +6071,19 @@ RED.view = (function() {
 | 
			
		||||
     function createNode(type, x, y, z) {
 | 
			
		||||
        const wasDirty = RED.nodes.dirty()
 | 
			
		||||
        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) {
 | 
			
		||||
            var subflowId = m[1];
 | 
			
		||||
            let err
 | 
			
		||||
            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)) {
 | 
			
		||||
                throw new Error(RED._("notification.error", { message: RED._("notification.errors.cannotAddCircularReference") }))
 | 
			
		||||
            if (err) {
 | 
			
		||||
                err.code = 'NODE_RED'
 | 
			
		||||
                throw err
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ module.exports = function(RED) {
 | 
			
		||||
    var exec = require('child_process').exec;
 | 
			
		||||
    var fs = require('fs');
 | 
			
		||||
    var isUtf8 = require('is-utf8');
 | 
			
		||||
    const isWindows = process.platform === 'win32'
 | 
			
		||||
 | 
			
		||||
    function ExecNode(n) {
 | 
			
		||||
        RED.nodes.createNode(this,n);
 | 
			
		||||
@@ -85,9 +86,12 @@ module.exports = function(RED) {
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    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  */
 | 
			
		||||
                    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});
 | 
			
		||||
                    var unknownCommand = (child.pid === undefined);
 | 
			
		||||
                    if (node.timer !== 0) {
 | 
			
		||||
 
 | 
			
		||||
@@ -273,7 +273,7 @@ async function installModule(moduleDetails) {
 | 
			
		||||
                let extraArgs = triggerPayload.args || [];
 | 
			
		||||
                let args = ['install', ...extraArgs, installSpec]
 | 
			
		||||
                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 {
 | 
			
		||||
                log.trace("skipping npm install");
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -25,14 +25,17 @@ const registryUtil = require("./util");
 | 
			
		||||
const library = require("./library");
 | 
			
		||||
const {exec,log,events,hooks} = require("@node-red/util");
 | 
			
		||||
const child_process = require('child_process');
 | 
			
		||||
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
 | 
			
		||||
let installerEnabled = false;
 | 
			
		||||
 | 
			
		||||
const plugins = require("./plugins");
 | 
			
		||||
 | 
			
		||||
const isWindows = process.platform === 'win32'
 | 
			
		||||
const npmCommand =  isWindows ? 'npm.cmd' : 'npm';
 | 
			
		||||
 | 
			
		||||
let installerEnabled = false;
 | 
			
		||||
let settings;
 | 
			
		||||
 | 
			
		||||
const moduleRe = /^(@[^/@]+?[/])?[^/@]+?$/;
 | 
			
		||||
const slashRe = process.platform === "win32" ? /\\|[/]/ : /[/]/;
 | 
			
		||||
const slashRe = isWindows ? /\\|[/]/ : /[/]/;
 | 
			
		||||
const pkgurlRe = /^(https?|git(|\+https?|\+ssh|\+file)):\/\//;
 | 
			
		||||
const localtgzRe = /^([a-zA-Z]:|\/).+tgz$/;
 | 
			
		||||
 | 
			
		||||
@@ -227,7 +230,7 @@ async function installModule(module,version,url) {
 | 
			
		||||
                let extraArgs = triggerPayload.args || [];
 | 
			
		||||
                let args = ['install', ...extraArgs, installName]
 | 
			
		||||
                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 {
 | 
			
		||||
                log.trace("skipping npm install");
 | 
			
		||||
            }
 | 
			
		||||
@@ -262,7 +265,7 @@ async function installModule(module,version,url) {
 | 
			
		||||
                log.warn("------------------------------------------");
 | 
			
		||||
                e = new Error(log._("server.install.install-failed")+": "+err.toString());
 | 
			
		||||
                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;
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
@@ -366,7 +369,7 @@ async function getModuleVersionFromNPM(module, version) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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 {
 | 
			
		||||
                if (!stdout) {
 | 
			
		||||
                    log.warn(log._("server.install.install-failed-not-found",{name:module}));
 | 
			
		||||
@@ -525,7 +528,7 @@ function uninstallModule(module) {
 | 
			
		||||
                    let extraArgs = triggerPayload.args || [];
 | 
			
		||||
                    let args = ['remove', ...extraArgs, module]
 | 
			
		||||
                    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 {
 | 
			
		||||
                    log.trace("skipping npm uninstall");
 | 
			
		||||
                }
 | 
			
		||||
@@ -592,7 +595,7 @@ async function checkPrereq() {
 | 
			
		||||
        installerEnabled = false;
 | 
			
		||||
    } else {
 | 
			
		||||
        return new Promise(resolve => {
 | 
			
		||||
            child_process.execFile(npmCommand,['-v'],function(err,stdout) {
 | 
			
		||||
            child_process.execFile(npmCommand,['-v'],{ shell: true },function(err,stdout) {
 | 
			
		||||
                if (err) {
 | 
			
		||||
                    log.info(log._("server.palette-editor.npm-not-found"));
 | 
			
		||||
                    installerEnabled = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -88,7 +88,7 @@ function generateSubflowConfig(subflow) {
 | 
			
		||||
                    this.credentials['has_' + prop.name] = (this.credentials[prop.name] !== "");
 | 
			
		||||
                } else {
 | 
			
		||||
                    switch(prop.type) {
 | 
			
		||||
                        case "str": this[prop.name] = prop.value||""; break;
 | 
			
		||||
                        case "str": case "conf-type": this[prop.name] = prop.value||""; break;
 | 
			
		||||
                        case "bool": this[prop.name] = (typeof prop.value === 'boolean')?prop.value:prop.value === "true" ; break;
 | 
			
		||||
                        case "num": this[prop.name] = (typeof prop.value === 'number')?prop.value:Number(prop.value); break;
 | 
			
		||||
                        default:
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
        "clone": "2.1.2",
 | 
			
		||||
        "fs-extra": "11.1.1",
 | 
			
		||||
        "semver": "7.5.4",
 | 
			
		||||
        "tar": "6.1.13",
 | 
			
		||||
        "tar": "6.2.1",
 | 
			
		||||
        "uglify-js": "3.17.4"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ function mapEnvVarProperties(obj,prop,flow,config) {
 | 
			
		||||
        if (obj[prop][0] === "$" && (EnvVarPropertyRE_old.test(v) || EnvVarPropertyRE.test(v)) ) {
 | 
			
		||||
            const envVar = v.substring(2,v.length-1);
 | 
			
		||||
            const r = redUtil.getSetting(config, envVar, flow);
 | 
			
		||||
            if (r !== undefined && r !== '') {
 | 
			
		||||
            if (r !== undefined) {
 | 
			
		||||
                obj[prop] = r
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user