mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Add loadNode api to registry.js
This commit is contained in:
		| @@ -28,6 +28,19 @@ var events = require("../events"); | ||||
| var Node; | ||||
| var settings; | ||||
|  | ||||
| function filterNodeInfo(n) { | ||||
|     var r = { | ||||
|         id: n.id, | ||||
|         types: n.types, | ||||
|         name: n.name, | ||||
|         enabled: n.enabled | ||||
|     } | ||||
|     if (n.err) { | ||||
|         r.err = n.err.toString(); | ||||
|     } | ||||
|     return r; | ||||
| } | ||||
|  | ||||
| var registry = (function() { | ||||
|     var nodeConfigCache = null; | ||||
|     var nodeConfigs = {}; | ||||
| @@ -39,19 +52,13 @@ var registry = (function() { | ||||
|             nodeConfigs[id] = set; | ||||
|             nodeList.push(id); | ||||
|         }, | ||||
|         getNodeSet: function(id) { | ||||
|             return nodeConfigs[id]; | ||||
|         }, | ||||
|         getNodeList: function() { | ||||
|             return nodeList.map(function(id) { | ||||
|                 var n = nodeConfigs[id]; | ||||
|                 var r = { | ||||
|                     id: n.id, | ||||
|                     types: n.types, | ||||
|                     name: n.name, | ||||
|                     enabled: n.enabled | ||||
|                 } | ||||
|                 if (n.err) { | ||||
|                     r.err = n.err.toString(); | ||||
|                 } | ||||
|                 return r; | ||||
|                 return filterNodeInfo(n); | ||||
|             }); | ||||
|         }, | ||||
|         registerNodeConstructor: function(type,constructor) { | ||||
| @@ -76,8 +83,8 @@ var registry = (function() { | ||||
|                 for (var i=0;i<nodeList.length;i++) { | ||||
|                     var config = nodeConfigs[nodeList[i]]; | ||||
|                     if (config.enabled) { | ||||
|                         result += config.config||""; | ||||
|                         script += config.script||""; | ||||
|                         result += config.config; | ||||
|                         script += config.script; | ||||
|                     } | ||||
|                 } | ||||
|                 result += '<script type="text/javascript">'; | ||||
| @@ -91,8 +98,8 @@ var registry = (function() { | ||||
|         getNodeConfig: function(id) { | ||||
|             var config = nodeConfigs[id]; | ||||
|             if (config) { | ||||
|                 var result = config.config||""; | ||||
|                 result += '<script type="text/javascript">'+(config.script||"")+'</script>'; | ||||
|                 var result = config.config; | ||||
|                 result += '<script type="text/javascript">'+config.script+'</script>'; | ||||
|                 return result; | ||||
|             } else { | ||||
|                 return null; | ||||
| @@ -244,6 +251,10 @@ function loadNodesFromModule(moduleDir,pkg) { | ||||
| function loadNodeConfig(file,name) { | ||||
|     var id = crypto.createHash('sha1').update(file).digest("hex"); | ||||
|  | ||||
|     if (registry.getNodeSet(id)) { | ||||
|         throw new Error(file+" already loaded"); | ||||
|     } | ||||
|      | ||||
|     var node = { | ||||
|         id: id, | ||||
|         file: file, | ||||
| @@ -268,11 +279,9 @@ function loadNodeConfig(file,name) { | ||||
|             } | ||||
|             var openTag = "<"+el.name; | ||||
|             var closeTag = "</"+el.name+">"; | ||||
|             if (el.attribs) { | ||||
|                 for (var j in el.attribs) { | ||||
|                     if (el.attribs.hasOwnProperty(j)) { | ||||
|                         openTag += " "+j+'="'+el.attribs[j]+'"'; | ||||
|                     } | ||||
|             for (var j in el.attribs) { | ||||
|                 if (el.attribs.hasOwnProperty(j)) { | ||||
|                     openTag += " "+j+'="'+el.attribs[j]+'"'; | ||||
|                 } | ||||
|             } | ||||
|             openTag += ">"; | ||||
| @@ -330,7 +339,7 @@ function load(defaultNodesDir) { | ||||
|         } | ||||
|         var promises = []; | ||||
|         nodes.forEach(function(node) { | ||||
|             promises.push(loadNode(node)); | ||||
|             promises.push(loadNodeModule(node)); | ||||
|         }); | ||||
|          | ||||
|         //resolve([]); | ||||
| @@ -351,7 +360,7 @@ function load(defaultNodesDir) { | ||||
|  *            err: any error encountered whilst loading the node | ||||
|  *             | ||||
|  */ | ||||
| function loadNode(node) { | ||||
| function loadNodeModule(node) { | ||||
|     var nodeDir = path.dirname(node.file); | ||||
|     var nodeFn = path.basename(node.file); | ||||
|     try { | ||||
| @@ -383,6 +392,19 @@ function loadNode(node) { | ||||
| } | ||||
|  | ||||
|  | ||||
| function loadNode(file) { | ||||
|     var info = null; | ||||
|     try { | ||||
|         info = loadNodeConfig(file); | ||||
|     } catch(err) { | ||||
|         return when.reject(err); | ||||
|     } | ||||
|     return loadNodeModule(info).then(function(info) { | ||||
|         return filterNodeInfo(info); | ||||
|     }); | ||||
| } | ||||
|  | ||||
|  | ||||
| module.exports = { | ||||
|     init:init, | ||||
|     load:load, | ||||
| @@ -392,4 +414,5 @@ module.exports = { | ||||
|     getNodeList: registry.getNodeList, | ||||
|     getNodeConfigs: registry.getAllNodeConfigs, | ||||
|     getNodeConfig: registry.getNodeConfig, | ||||
|     loadNode: loadNode | ||||
| } | ||||
|   | ||||
| @@ -277,4 +277,50 @@ describe('NodeRegistry', function() { | ||||
|             done(e); | ||||
|         }); | ||||
|     }); | ||||
|      | ||||
|     it('allows nodes to be added', function(done) { | ||||
|         typeRegistry.init({}); | ||||
|         typeRegistry.load("wontexist").then(function(){ | ||||
|             var list = typeRegistry.getNodeList(); | ||||
|             list.should.be.an.Array.and.be.empty; | ||||
|              | ||||
|             typeRegistry.loadNode(__dirname+"/resources/TestNode1/TestNode1.js").then(function(node) { | ||||
|                 list = typeRegistry.getNodeList(); | ||||
|                 list[0].should.have.property("id"); | ||||
|                 list[0].should.have.property("name","TestNode1.js"); | ||||
|                 list[0].should.have.property("types",["test-node-1"]); | ||||
|                 list[0].should.have.property("enabled",true); | ||||
|                 list[0].should.not.have.property("err"); | ||||
|                  | ||||
|                 node.should.eql(list[0]); | ||||
|                  | ||||
|                 done(); | ||||
|             }).catch(function(e) { | ||||
|                 done(e); | ||||
|             }); | ||||
|              | ||||
|         }).catch(function(e) { | ||||
|             done(e); | ||||
|         }); | ||||
|     }); | ||||
|      | ||||
|     it('rejects adding duplicate nodes', function(done) { | ||||
|         typeRegistry.init({}); | ||||
|         typeRegistry.load(__dirname+"/resources/TestNode1").then(function(){ | ||||
|             var list = typeRegistry.getNodeList(); | ||||
|             list.should.be.an.Array.and.have.lengthOf(1); | ||||
|              | ||||
|             typeRegistry.loadNode(__dirname+"/resources/TestNode1/TestNode1.js").then(function(node) { | ||||
|                 done(new Error("duplicate node loaded")); | ||||
|             }).otherwise(function(e) { | ||||
|                 var list = typeRegistry.getNodeList(); | ||||
|                 list.should.be.an.Array.and.have.lengthOf(1); | ||||
|                 done(); | ||||
|             }); | ||||
|              | ||||
|         }).catch(function(e) { | ||||
|             done(e); | ||||
|         }); | ||||
|     }); | ||||
|      | ||||
| }); | ||||
|   | ||||
| @@ -0,0 +1,4 @@ | ||||
| <script type="text/x-red" data-template-name="should-not-load-1"></script> | ||||
| <script type="text/x-red" data-help-name="should-not-load-1"></script> | ||||
| <script type="text/javascript">RED.nodes.registerType('should-not-load-1',{});</script> | ||||
| <style></style> | ||||
| @@ -0,0 +1,5 @@ | ||||
| // A test node that exports a function | ||||
| module.exports = function(RED) { | ||||
|     function TestNode(n) {} | ||||
|     RED.nodes.registerType("should-not-load-1",TestNode); | ||||
| } | ||||
							
								
								
									
										4
									
								
								test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| <script type="text/x-red" data-template-name="should-not-load-2"></script> | ||||
| <script type="text/x-red" data-help-name="should-not-load-2"></script> | ||||
| <script type="text/javascript">RED.nodes.registerType('should-not-load-2',{});</script> | ||||
| <style></style> | ||||
							
								
								
									
										5
									
								
								test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| // A test node that exports a function | ||||
| module.exports = function(RED) { | ||||
|     function TestNode(n) {} | ||||
|     RED.nodes.registerType("should-not-load-2",TestNode); | ||||
| } | ||||
| @@ -0,0 +1,4 @@ | ||||
| <script type="text/x-red" data-template-name="should-not-load-3"></script> | ||||
| <script type="text/x-red" data-help-name="should-not-load-3"></script> | ||||
| <script type="text/javascript">RED.nodes.registerType('should-not-load-3',{});</script> | ||||
| <style></style> | ||||
| @@ -0,0 +1,5 @@ | ||||
| // A test node that exports a function | ||||
| module.exports = function(RED) { | ||||
|     function TestNode(n) {} | ||||
|     RED.nodes.registerType("should-not-load-3",TestNode); | ||||
| } | ||||
| @@ -2,3 +2,4 @@ | ||||
| <script type="text/x-red" data-help-name="test-node-1"></script> | ||||
| <script type="text/javascript">RED.nodes.registerType('test-node-1',{});</script> | ||||
| <style></style> | ||||
| <p>this should be filtered out</p> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user