mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Use rfdc module for cloning when we know its pure JSON
This commit is contained in:
parent
a712a9363b
commit
1a3cc06935
@ -73,6 +73,7 @@
|
|||||||
"passport-http-bearer": "1.0.1",
|
"passport-http-bearer": "1.0.1",
|
||||||
"passport-oauth2-client-password": "0.1.2",
|
"passport-oauth2-client-password": "0.1.2",
|
||||||
"raw-body": "2.5.2",
|
"raw-body": "2.5.2",
|
||||||
|
"rfdc": "^1.3.1",
|
||||||
"semver": "7.5.4",
|
"semver": "7.5.4",
|
||||||
"tar": "6.2.1",
|
"tar": "6.2.1",
|
||||||
"tough-cookie": "4.1.3",
|
"tough-cookie": "4.1.3",
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
const clone = require("clone");
|
const clone = require("clone");
|
||||||
|
const jsonClone = require("rfdc")();
|
||||||
const Flow = require('./Flow').Flow;
|
const Flow = require('./Flow').Flow;
|
||||||
const context = require('../nodes/context');
|
const context = require('../nodes/context');
|
||||||
const util = require("util");
|
const util = require("util");
|
||||||
@ -108,7 +109,7 @@ class Subflow extends Flow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
subflowInternalFlowConfig.subflows = clone(subflowDef.subflows || {});
|
subflowInternalFlowConfig.subflows = jsonClone(subflowDef.subflows || {});
|
||||||
|
|
||||||
remapSubflowNodes(subflowInternalFlowConfig.configs,node_map);
|
remapSubflowNodes(subflowInternalFlowConfig.configs,node_map);
|
||||||
remapSubflowNodes(subflowInternalFlowConfig.nodes,node_map);
|
remapSubflowNodes(subflowInternalFlowConfig.nodes,node_map);
|
||||||
@ -220,7 +221,7 @@ class Subflow extends Flow {
|
|||||||
}
|
}
|
||||||
if (this.subflowDef.in) {
|
if (this.subflowDef.in) {
|
||||||
subflowInstanceConfig.wires = this.subflowDef.in.map(function(n) { return n.wires.map(function(w) { return self.node_map[w.id].id;})})
|
subflowInstanceConfig.wires = this.subflowDef.in.map(function(n) { return n.wires.map(function(w) { return self.node_map[w.id].id;})})
|
||||||
subflowInstanceConfig._originalWires = clone(subflowInstanceConfig.wires);
|
subflowInstanceConfig._originalWires = jsonClone(subflowInstanceConfig.wires);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.node = new Node(subflowInstanceConfig);
|
this.node = new Node(subflowInstanceConfig);
|
||||||
@ -244,14 +245,14 @@ class Subflow extends Flow {
|
|||||||
if (self.subflowDef.out) {
|
if (self.subflowDef.out) {
|
||||||
var node,wires,i,j;
|
var node,wires,i,j;
|
||||||
// Restore the original wiring to the internal nodes
|
// Restore the original wiring to the internal nodes
|
||||||
subflowInstanceConfig.wires = clone(subflowInstanceConfig._originalWires);
|
subflowInstanceConfig.wires = jsonClone(subflowInstanceConfig._originalWires);
|
||||||
for (i=0;i<self.subflowDef.out.length;i++) {
|
for (i=0;i<self.subflowDef.out.length;i++) {
|
||||||
wires = self.subflowDef.out[i].wires;
|
wires = self.subflowDef.out[i].wires;
|
||||||
for (j=0;j<wires.length;j++) {
|
for (j=0;j<wires.length;j++) {
|
||||||
if (wires[j].id != self.subflowDef.id) {
|
if (wires[j].id != self.subflowDef.id) {
|
||||||
node = self.node_map[wires[j].id];
|
node = self.node_map[wires[j].id];
|
||||||
if (node && node._originalWires) {
|
if (node && node._originalWires) {
|
||||||
node.wires = clone(node._originalWires);
|
node.wires = jsonClone(node._originalWires);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,7 +301,7 @@ class Subflow extends Flow {
|
|||||||
var node = self.node_map[wires[j].id];
|
var node = self.node_map[wires[j].id];
|
||||||
if (node) {
|
if (node) {
|
||||||
if (!node._originalWires) {
|
if (!node._originalWires) {
|
||||||
node._originalWires = clone(node.wires);
|
node._originalWires = jsonClone(node.wires);
|
||||||
}
|
}
|
||||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
|
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]).concat(this.subflowInstance.wires[i]);
|
||||||
} else {
|
} else {
|
||||||
@ -323,7 +324,7 @@ class Subflow extends Flow {
|
|||||||
var node = self.node_map[wires[j].id];
|
var node = self.node_map[wires[j].id];
|
||||||
if (node) {
|
if (node) {
|
||||||
if (!node._originalWires) {
|
if (!node._originalWires) {
|
||||||
node._originalWires = clone(node.wires);
|
node._originalWires = jsonClone(node.wires);
|
||||||
}
|
}
|
||||||
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
|
node.wires[wires[j].port] = (node.wires[wires[j].port]||[]);
|
||||||
node.wires[wires[j].port].push(subflowStatusId);
|
node.wires[wires[j].port].push(subflowStatusId);
|
||||||
@ -463,7 +464,7 @@ class Subflow extends Flow {
|
|||||||
* @return {[type]} [description]
|
* @return {[type]} [description]
|
||||||
*/
|
*/
|
||||||
function createNodeInSubflow(subflowInstanceId, def) {
|
function createNodeInSubflow(subflowInstanceId, def) {
|
||||||
let node = clone(def);
|
let node = jsonClone(def);
|
||||||
let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId();
|
let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId();
|
||||||
// console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")")
|
// console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")")
|
||||||
// node_map[node.id] = node;
|
// node_map[node.id] = node;
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var clone = require("clone");
|
const jsonClone = require("rfdc")();
|
||||||
|
|
||||||
var Flow = require('./Flow');
|
var Flow = require('./Flow');
|
||||||
|
|
||||||
@ -140,16 +140,16 @@ function setFlows(_config,_credentials,type,muteLog,forceStart,user) {
|
|||||||
if (type === "load") {
|
if (type === "load") {
|
||||||
isLoad = true;
|
isLoad = true;
|
||||||
configSavePromise = loadFlows().then(function(_config) {
|
configSavePromise = loadFlows().then(function(_config) {
|
||||||
config = clone(_config.flows);
|
config = jsonClone(_config.flows);
|
||||||
newFlowConfig = flowUtil.parseConfig(clone(config));
|
newFlowConfig = flowUtil.parseConfig(jsonClone(config));
|
||||||
type = "full";
|
type = "full";
|
||||||
return _config.rev;
|
return _config.rev;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Clone the provided config so it can be manipulated
|
// Clone the provided config so it can be manipulated
|
||||||
config = clone(_config);
|
config = jsonClone(_config);
|
||||||
// Parse the configuration
|
// Parse the configuration
|
||||||
newFlowConfig = flowUtil.parseConfig(clone(config));
|
newFlowConfig = flowUtil.parseConfig(jsonClone(config));
|
||||||
// Generate a diff to identify what has changed
|
// Generate a diff to identify what has changed
|
||||||
diff = flowUtil.diffConfigs(activeFlowConfig,newFlowConfig);
|
diff = flowUtil.diffConfigs(activeFlowConfig,newFlowConfig);
|
||||||
|
|
||||||
@ -609,7 +609,7 @@ async function addFlow(flow, user) {
|
|||||||
nodes.push(node);
|
nodes.push(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var newConfig = clone(activeConfig.flows);
|
var newConfig = jsonClone(activeConfig.flows);
|
||||||
newConfig = newConfig.concat(nodes);
|
newConfig = newConfig.concat(nodes);
|
||||||
|
|
||||||
return setFlows(newConfig, null, 'flows', true, null, user).then(function() {
|
return setFlows(newConfig, null, 'flows', true, null, user).then(function() {
|
||||||
@ -650,7 +650,7 @@ function getFlow(id) {
|
|||||||
var nodeIds = Object.keys(flow.nodes);
|
var nodeIds = Object.keys(flow.nodes);
|
||||||
if (nodeIds.length > 0) {
|
if (nodeIds.length > 0) {
|
||||||
result.nodes = nodeIds.map(function(nodeId) {
|
result.nodes = nodeIds.map(function(nodeId) {
|
||||||
var node = clone(flow.nodes[nodeId]);
|
var node = jsonClone(flow.nodes[nodeId]);
|
||||||
if (node.type === 'link out') {
|
if (node.type === 'link out') {
|
||||||
delete node.wires;
|
delete node.wires;
|
||||||
}
|
}
|
||||||
@ -662,7 +662,7 @@ function getFlow(id) {
|
|||||||
if (flow.configs) {
|
if (flow.configs) {
|
||||||
var configIds = Object.keys(flow.configs);
|
var configIds = Object.keys(flow.configs);
|
||||||
result.configs = configIds.map(function(configId) {
|
result.configs = configIds.map(function(configId) {
|
||||||
const node = clone(flow.configs[configId]);
|
const node = jsonClone(flow.configs[configId]);
|
||||||
delete node.credentials;
|
delete node.credentials;
|
||||||
return node
|
return node
|
||||||
|
|
||||||
@ -674,17 +674,17 @@ function getFlow(id) {
|
|||||||
if (flow.subflows) {
|
if (flow.subflows) {
|
||||||
var subflowIds = Object.keys(flow.subflows);
|
var subflowIds = Object.keys(flow.subflows);
|
||||||
result.subflows = subflowIds.map(function(subflowId) {
|
result.subflows = subflowIds.map(function(subflowId) {
|
||||||
var subflow = clone(flow.subflows[subflowId]);
|
var subflow = jsonClone(flow.subflows[subflowId]);
|
||||||
var nodeIds = Object.keys(subflow.nodes);
|
var nodeIds = Object.keys(subflow.nodes);
|
||||||
subflow.nodes = nodeIds.map(function(id) {
|
subflow.nodes = nodeIds.map(function(id) {
|
||||||
const node = clone(subflow.nodes[id])
|
const node = jsonClone(subflow.nodes[id])
|
||||||
delete node.credentials
|
delete node.credentials
|
||||||
return node
|
return node
|
||||||
});
|
});
|
||||||
if (subflow.configs) {
|
if (subflow.configs) {
|
||||||
var configIds = Object.keys(subflow.configs);
|
var configIds = Object.keys(subflow.configs);
|
||||||
subflow.configs = configIds.map(function(id) {
|
subflow.configs = configIds.map(function(id) {
|
||||||
const node = clone(subflow.configs[id])
|
const node = jsonClone(subflow.configs[id])
|
||||||
delete node.credentials
|
delete node.credentials
|
||||||
return node
|
return node
|
||||||
})
|
})
|
||||||
@ -709,7 +709,7 @@ async function updateFlow(id,newFlow, user) {
|
|||||||
}
|
}
|
||||||
label = activeFlowConfig.flows[id].label;
|
label = activeFlowConfig.flows[id].label;
|
||||||
}
|
}
|
||||||
var newConfig = clone(activeConfig.flows);
|
var newConfig = jsonClone(activeConfig.flows);
|
||||||
var nodes;
|
var nodes;
|
||||||
|
|
||||||
if (id === 'global') {
|
if (id === 'global') {
|
||||||
@ -779,7 +779,7 @@ async function removeFlow(id, user) {
|
|||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
var newConfig = clone(activeConfig.flows);
|
var newConfig = jsonClone(activeConfig.flows);
|
||||||
newConfig = newConfig.filter(function(node) {
|
newConfig = newConfig.filter(function(node) {
|
||||||
return node.z !== id && node.id !== id;
|
return node.z !== id && node.id !== id;
|
||||||
});
|
});
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
const clone = require("clone");
|
const jsonClone = require("rfdc")();
|
||||||
const redUtil = require("@node-red/util").util;
|
const redUtil = require("@node-red/util").util;
|
||||||
const Log = require("@node-red/util").log;
|
const Log = require("@node-red/util").log;
|
||||||
const typeRegistry = require("@node-red/registry");
|
const typeRegistry = require("@node-red/registry");
|
||||||
@ -175,7 +175,7 @@ async function createNode(flow,config) {
|
|||||||
try {
|
try {
|
||||||
var nodeTypeConstructor = typeRegistry.get(type);
|
var nodeTypeConstructor = typeRegistry.get(type);
|
||||||
if (typeof nodeTypeConstructor === "function") {
|
if (typeof nodeTypeConstructor === "function") {
|
||||||
var conf = clone(config);
|
var conf = jsonClone(config);
|
||||||
delete conf.credentials;
|
delete conf.credentials;
|
||||||
try {
|
try {
|
||||||
Object.defineProperty(conf,'_module', {value: typeRegistry.getNodeInfo(type), enumerable: false, writable: true })
|
Object.defineProperty(conf,'_module', {value: typeRegistry.getNodeInfo(type), enumerable: false, writable: true })
|
||||||
@ -202,8 +202,8 @@ async function createNode(flow,config) {
|
|||||||
var subflowInstanceConfig = subflowConfig.subflows[nodeTypeConstructor.subflow.id];
|
var subflowInstanceConfig = subflowConfig.subflows[nodeTypeConstructor.subflow.id];
|
||||||
delete subflowConfig.subflows[nodeTypeConstructor.subflow.id];
|
delete subflowConfig.subflows[nodeTypeConstructor.subflow.id];
|
||||||
subflowInstanceConfig.subflows = subflowConfig.subflows;
|
subflowInstanceConfig.subflows = subflowConfig.subflows;
|
||||||
var instanceConfig = clone(config);
|
var instanceConfig = jsonClone(config);
|
||||||
instanceConfig.env = clone(nodeTypeConstructor.subflow.env);
|
instanceConfig.env = jsonClone(nodeTypeConstructor.subflow.env);
|
||||||
|
|
||||||
instanceConfig.env = nodeTypeConstructor.subflow.env.map(nodeProp => {
|
instanceConfig.env = nodeTypeConstructor.subflow.env.map(nodeProp => {
|
||||||
var nodePropType;
|
var nodePropType;
|
||||||
@ -256,7 +256,7 @@ function parseConfig(config) {
|
|||||||
flow.missingTypes = [];
|
flow.missingTypes = [];
|
||||||
|
|
||||||
config.forEach(function (n) {
|
config.forEach(function (n) {
|
||||||
flow.allNodes[n.id] = clone(n);
|
flow.allNodes[n.id] = jsonClone(n);
|
||||||
if (n.type === 'tab') {
|
if (n.type === 'tab') {
|
||||||
flow.flows[n.id] = n;
|
flow.flows[n.id] = n;
|
||||||
flow.flows[n.id].subflows = {};
|
flow.flows[n.id].subflows = {};
|
||||||
|
@ -14,9 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var path = require("path");
|
|
||||||
var fs = require("fs");
|
const jsonClone = require("rfdc")();
|
||||||
var clone = require("clone");
|
|
||||||
var util = require("util");
|
var util = require("util");
|
||||||
|
|
||||||
var registry = require("@node-red/registry");
|
var registry = require("@node-red/registry");
|
||||||
@ -98,7 +97,7 @@ function createNode(node,def) {
|
|||||||
}
|
}
|
||||||
var creds = credentials.get(id);
|
var creds = credentials.get(id);
|
||||||
if (creds) {
|
if (creds) {
|
||||||
creds = clone(creds);
|
creds = jsonClone(creds);
|
||||||
//console.log("Attaching credentials to ",node.id);
|
//console.log("Attaching credentials to ",node.id);
|
||||||
// allow $(foo) syntax to substitute env variables for credentials also...
|
// allow $(foo) syntax to substitute env variables for credentials also...
|
||||||
for (var p in creds) {
|
for (var p in creds) {
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
"clone": "2.1.2",
|
"clone": "2.1.2",
|
||||||
"express": "4.19.2",
|
"express": "4.19.2",
|
||||||
"fs-extra": "11.1.1",
|
"fs-extra": "11.1.1",
|
||||||
"json-stringify-safe": "5.0.1"
|
"json-stringify-safe": "5.0.1",
|
||||||
|
"rfdc": "^1.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user