From 1697aee9f61c772ae3940e50407a6c63ea3a724d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 1 Aug 2014 23:42:01 +0100 Subject: [PATCH] Add loadNode api to registry.js --- red/nodes/registry.js | 65 +++++++++++++------ test/red/nodes/registry_spec.js | 46 +++++++++++++ .../NestedNode/lib/ShouldNotLoad.html | 4 ++ .../NestedNode/lib/ShouldNotLoad.js | 5 ++ .../node_modules/ShouldNotLoad.html | 4 ++ .../NestedNode/node_modules/ShouldNotLoad.js | 5 ++ .../NestedNode/test/ShouldNotLoad.html | 4 ++ .../NestedNode/test/ShouldNotLoad.js | 5 ++ .../nodes/resources/TestNode1/TestNode1.html | 1 + 9 files changed, 118 insertions(+), 21 deletions(-) create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.html create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.js create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.html create mode 100644 test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.js diff --git a/red/nodes/registry.js b/red/nodes/registry.js index 021dd11f3..25ab1e638 100644 --- a/red/nodes/registry.js +++ b/red/nodes/registry.js @@ -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'; + var result = config.config; + result += ''; 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 = ""; - 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 } diff --git a/test/red/nodes/registry_spec.js b/test/red/nodes/registry_spec.js index 492401525..00052b828 100644 --- a/test/red/nodes/registry_spec.js +++ b/test/red/nodes/registry_spec.js @@ -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); + }); + }); + }); diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.html b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.html new file mode 100644 index 000000000..ac9235d26 --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.html @@ -0,0 +1,4 @@ + + + + diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.js b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.js new file mode 100644 index 000000000..8af249b14 --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/lib/ShouldNotLoad.js @@ -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); +} diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html new file mode 100644 index 000000000..eb7c8a3f9 --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.html @@ -0,0 +1,4 @@ + + + + diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js new file mode 100644 index 000000000..623e299b2 --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/node_modules/ShouldNotLoad.js @@ -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); +} diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.html b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.html new file mode 100644 index 000000000..4212fd589 --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.html @@ -0,0 +1,4 @@ + + + + diff --git a/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.js b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.js new file mode 100644 index 000000000..5856adada --- /dev/null +++ b/test/red/nodes/resources/NestedDirectoryNode/NestedNode/test/ShouldNotLoad.js @@ -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); +} diff --git a/test/red/nodes/resources/TestNode1/TestNode1.html b/test/red/nodes/resources/TestNode1/TestNode1.html index c50d0c3d1..97dbf1710 100644 --- a/test/red/nodes/resources/TestNode1/TestNode1.html +++ b/test/red/nodes/resources/TestNode1/TestNode1.html @@ -2,3 +2,4 @@ +

this should be filtered out