mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Merge pull request #4679 from node-red/use-rfdc
Use rfdc for cloning pure JSON values
This commit is contained in:
		| @@ -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", | ||||
|   | ||||
| @@ -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<self.subflowDef.out.length;i++) { | ||||
|                     wires = self.subflowDef.out[i].wires; | ||||
|                     for (j=0;j<wires.length;j++) { | ||||
|                         if (wires[j].id != self.subflowDef.id) { | ||||
|                             node = self.node_map[wires[j].id]; | ||||
|                             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]; | ||||
|                         if (node) { | ||||
|                             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]); | ||||
|                         } else { | ||||
| @@ -323,7 +324,7 @@ class Subflow extends Flow { | ||||
|                     var node = self.node_map[wires[j].id]; | ||||
|                     if (node) { | ||||
|                         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].push(subflowStatusId); | ||||
| @@ -463,7 +464,7 @@ class Subflow extends Flow { | ||||
|  * @return {[type]}                   [description] | ||||
|  */ | ||||
| function createNodeInSubflow(subflowInstanceId, def) { | ||||
|     let node = clone(def); | ||||
|     let node = jsonClone(def); | ||||
|     let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId(); | ||||
|     // console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")") | ||||
|     // node_map[node.id] = node; | ||||
|   | ||||
| @@ -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; | ||||
|     }); | ||||
|   | ||||
| @@ -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 = {}; | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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" | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user