diff --git a/package.json b/package.json index 14906bed8..7f2b28500 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "raw-body": "2.5.2", + "rfdc": "^1.3.1", "semver": "7.5.4", "tar": "6.2.1", "tough-cookie": "4.1.3", diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js b/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js index c3a47e1f7..fea07fd2b 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js @@ -15,6 +15,7 @@ **/ const clone = require("clone"); +const jsonClone = require("rfdc")(); const Flow = require('./Flow').Flow; const context = require('../nodes/context'); 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.nodes,node_map); @@ -220,7 +221,7 @@ class Subflow extends Flow { } 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._originalWires = clone(subflowInstanceConfig.wires); + subflowInstanceConfig._originalWires = jsonClone(subflowInstanceConfig.wires); } this.node = new Node(subflowInstanceConfig); @@ -244,14 +245,14 @@ class Subflow extends Flow { if (self.subflowDef.out) { var node,wires,i,j; // Restore the original wiring to the internal nodes - subflowInstanceConfig.wires = clone(subflowInstanceConfig._originalWires); + subflowInstanceConfig.wires = jsonClone(subflowInstanceConfig._originalWires); for (i=0;i",nid, "(",node.type,")") // node_map[node.id] = node; diff --git a/packages/node_modules/@node-red/runtime/lib/flows/index.js b/packages/node_modules/@node-red/runtime/lib/flows/index.js index c955dfe1c..4354c92ae 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/index.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/index.js @@ -14,7 +14,7 @@ * limitations under the License. **/ -var clone = require("clone"); +const jsonClone = require("rfdc")(); var Flow = require('./Flow'); @@ -140,16 +140,16 @@ function setFlows(_config,_credentials,type,muteLog,forceStart,user) { if (type === "load") { isLoad = true; configSavePromise = loadFlows().then(function(_config) { - config = clone(_config.flows); - newFlowConfig = flowUtil.parseConfig(clone(config)); + config = jsonClone(_config.flows); + newFlowConfig = flowUtil.parseConfig(jsonClone(config)); type = "full"; return _config.rev; }); } else { // Clone the provided config so it can be manipulated - config = clone(_config); + config = jsonClone(_config); // Parse the configuration - newFlowConfig = flowUtil.parseConfig(clone(config)); + newFlowConfig = flowUtil.parseConfig(jsonClone(config)); // Generate a diff to identify what has changed diff = flowUtil.diffConfigs(activeFlowConfig,newFlowConfig); @@ -609,7 +609,7 @@ async function addFlow(flow, user) { nodes.push(node); } } - var newConfig = clone(activeConfig.flows); + var newConfig = jsonClone(activeConfig.flows); newConfig = newConfig.concat(nodes); return setFlows(newConfig, null, 'flows', true, null, user).then(function() { @@ -650,7 +650,7 @@ function getFlow(id) { var nodeIds = Object.keys(flow.nodes); if (nodeIds.length > 0) { result.nodes = nodeIds.map(function(nodeId) { - var node = clone(flow.nodes[nodeId]); + var node = jsonClone(flow.nodes[nodeId]); if (node.type === 'link out') { delete node.wires; } @@ -662,7 +662,7 @@ function getFlow(id) { if (flow.configs) { var configIds = Object.keys(flow.configs); result.configs = configIds.map(function(configId) { - const node = clone(flow.configs[configId]); + const node = jsonClone(flow.configs[configId]); delete node.credentials; return node @@ -674,17 +674,17 @@ function getFlow(id) { if (flow.subflows) { var subflowIds = Object.keys(flow.subflows); result.subflows = subflowIds.map(function(subflowId) { - var subflow = clone(flow.subflows[subflowId]); + var subflow = jsonClone(flow.subflows[subflowId]); var nodeIds = Object.keys(subflow.nodes); subflow.nodes = nodeIds.map(function(id) { - const node = clone(subflow.nodes[id]) + const node = jsonClone(subflow.nodes[id]) delete node.credentials return node }); if (subflow.configs) { var configIds = Object.keys(subflow.configs); subflow.configs = configIds.map(function(id) { - const node = clone(subflow.configs[id]) + const node = jsonClone(subflow.configs[id]) delete node.credentials return node }) @@ -709,7 +709,7 @@ async function updateFlow(id,newFlow, user) { } label = activeFlowConfig.flows[id].label; } - var newConfig = clone(activeConfig.flows); + var newConfig = jsonClone(activeConfig.flows); var nodes; if (id === 'global') { @@ -779,7 +779,7 @@ async function removeFlow(id, user) { throw e; } - var newConfig = clone(activeConfig.flows); + var newConfig = jsonClone(activeConfig.flows); newConfig = newConfig.filter(function(node) { return node.z !== id && node.id !== id; }); diff --git a/packages/node_modules/@node-red/runtime/lib/flows/util.js b/packages/node_modules/@node-red/runtime/lib/flows/util.js index 6ec1ef982..fa25a26d0 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/util.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ -const clone = require("clone"); +const jsonClone = require("rfdc")(); const redUtil = require("@node-red/util").util; const Log = require("@node-red/util").log; const typeRegistry = require("@node-red/registry"); @@ -175,7 +175,7 @@ async function createNode(flow,config) { try { var nodeTypeConstructor = typeRegistry.get(type); if (typeof nodeTypeConstructor === "function") { - var conf = clone(config); + var conf = jsonClone(config); delete conf.credentials; try { 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]; delete subflowConfig.subflows[nodeTypeConstructor.subflow.id]; subflowInstanceConfig.subflows = subflowConfig.subflows; - var instanceConfig = clone(config); - instanceConfig.env = clone(nodeTypeConstructor.subflow.env); + var instanceConfig = jsonClone(config); + instanceConfig.env = jsonClone(nodeTypeConstructor.subflow.env); instanceConfig.env = nodeTypeConstructor.subflow.env.map(nodeProp => { var nodePropType; @@ -256,7 +256,7 @@ function parseConfig(config) { flow.missingTypes = []; config.forEach(function (n) { - flow.allNodes[n.id] = clone(n); + flow.allNodes[n.id] = jsonClone(n); if (n.type === 'tab') { flow.flows[n.id] = n; flow.flows[n.id].subflows = {}; diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/index.js b/packages/node_modules/@node-red/runtime/lib/nodes/index.js index a852a86ea..8e7d45d05 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/index.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/index.js @@ -14,9 +14,8 @@ * limitations under the License. **/ -var path = require("path"); -var fs = require("fs"); -var clone = require("clone"); + +const jsonClone = require("rfdc")(); var util = require("util"); var registry = require("@node-red/registry"); @@ -98,7 +97,7 @@ function createNode(node,def) { } var creds = credentials.get(id); if (creds) { - creds = clone(creds); + creds = jsonClone(creds); //console.log("Attaching credentials to ",node.id); // allow $(foo) syntax to substitute env variables for credentials also... for (var p in creds) { diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 5a3ee8c47..0fd6964f0 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -22,6 +22,7 @@ "clone": "2.1.2", "express": "4.19.2", "fs-extra": "11.1.1", - "json-stringify-safe": "5.0.1" + "json-stringify-safe": "5.0.1", + "rfdc": "^1.3.1" } }