From 29694dd2cba5f0e8b3d5c6b6dba177890ef39105 Mon Sep 17 00:00:00 2001 From: JJ Cantillon Date: Mon, 8 Jan 2018 01:26:57 +1000 Subject: [PATCH 001/456] make exif node add exif data even if gps missing (#393) --- utility/exif/94-exif.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/utility/exif/94-exif.js b/utility/exif/94-exif.js index e4cbb887..316e04f9 100644 --- a/utility/exif/94-exif.js +++ b/utility/exif/94-exif.js @@ -73,13 +73,17 @@ module.exports = function(RED) { node.log(error.toString()); } else { - //msg.payload remains the same buffer - if ((exifData) && (exifData.hasOwnProperty("gps")) && (Object.keys(exifData.gps).length !== 0)) { + if (exifData) { msg.exif = exifData; - addMsgLocationDataFromExifGPSData(msg); + if((exifData.hasOwnProperty("gps")) && (Object.keys(exifData.gps).length !== 0)) { + addMsgLocationDataFromExifGPSData(msg); + } + else { + node.log("The incoming image did not contain Exif GPS data."); + } } else { - node.warn("The incoming image did not contain Exif GPS data, nothing to do. "); + node.warn("The incoming image did not contain any Exif data, nothing to do. "); } } node.send(msg); From dbea8a484acbadde88359b104176c1c5a320a373 Mon Sep 17 00:00:00 2001 From: borpin Date: Sun, 7 Jan 2018 15:37:28 +0000 Subject: [PATCH 002/456] Updates to match API changes (#392) * Updates to match API changes Update to the node to match the server API changes. An attempt has been made to leave a legacy path for existing installations that may have not updated the server side. * Updated following comments. Update following comments. Output removed and node.warn or error used. oneeditprepare added. Name moved to last item. In addition, a check added to ensure nodegroup has valid value. Question: I have added a 'return' as I do not want data posted if there is not a valid nodegroup. Is this the best way to exit the function? Always taught that multiple exits was a bad idea. I wondered about raising an error / exception and then catching it but not sure how to do that. * Update documentation for revised node --- io/emoncms/88-emoncms.html | 40 ++++++++++++----- io/emoncms/88-emoncms.js | 91 +++++++++++++++++++++++++++++++------- io/emoncms/README.md | 36 +++++++++------ 3 files changed, 126 insertions(+), 41 deletions(-) diff --git a/io/emoncms/88-emoncms.html b/io/emoncms/88-emoncms.html index 21fe4a9a..65789671 100644 --- a/io/emoncms/88-emoncms.html +++ b/io/emoncms/88-emoncms.html @@ -6,22 +6,36 @@
- + +
+
+ +
+ - - - - \ No newline at end of file + diff --git a/io/snmp/snmp.js b/io/snmp/snmp.js index 008d5995..9207217d 100644 --- a/io/snmp/snmp.js +++ b/io/snmp/snmp.js @@ -5,10 +5,10 @@ module.exports = function (RED) { var sessions = {}; - function getSession(host, community, version) { + function getSession(host, community, version, timeout) { var sessionKey = host + ":" + community + ":" + version; if (!(sessionKey in sessions)) { - sessions[sessionKey] = snmp.createSession(host, community, { version: version }); + sessions[sessionKey] = snmp.createSession(host, community, { version:version, timeout:(timeout || 5000) }); } return sessions[sessionKey]; } @@ -19,6 +19,7 @@ module.exports = function (RED) { this.host = n.host; this.version = (n.version === "2c") ? snmp.Version2c : snmp.Version1; this.oids = n.oids.replace(/\s/g, ""); + this.timeout = Number(n.timeout || 5) * 1000; var node = this; this.on("input", function (msg) { @@ -26,7 +27,7 @@ module.exports = function (RED) { var community = node.community || msg.community; var oids = node.oids || msg.oid; if (oids) { - getSession(host, community, node.version).get(oids.split(","), function (error, varbinds) { + getSession(host, community, node.version, node.timeout).get(oids.split(","), function (error, varbinds) { if (error) { node.error(error.toString(), msg); } @@ -54,13 +55,13 @@ module.exports = function (RED) { } RED.nodes.registerType("snmp", SnmpNode); - function SnmpSNode(n) { RED.nodes.createNode(this, n); this.community = n.community; this.host = n.host; this.version = (n.version === "2c") ? snmp.Version2c : snmp.Version1; this.varbinds = n.varbinds; + this.timeout = Number(n.timeout || 5) * 1000; var node = this; this.on("input", function (msg) { var host = node.host || msg.host; @@ -70,7 +71,7 @@ module.exports = function (RED) { for (var i = 0; i < varbinds.length; i++) { varbinds[i].type = snmp.ObjectType[varbinds[i].type]; } - getSession(host, community, node.version).set(varbinds, function (error, varbinds) { + getSession(host, community, node.version, node.timeout).set(varbinds, function (error, varbinds) { if (error) { node.error(error.toString(), msg); } @@ -93,14 +94,13 @@ module.exports = function (RED) { RED.nodes.registerType("snmp set", SnmpSNode); - - function SnmpTNode(n) { RED.nodes.createNode(this, n); this.community = n.community; this.host = n.host; this.version = (n.version === "2c") ? snmp.Version2c : snmp.Version1; this.oids = n.oids.replace(/\s/g, ""); + this.timeout = Number(n.timeout || 5) * 1000; var node = this; var maxRepetitions = 20; @@ -116,7 +116,7 @@ module.exports = function (RED) { var oids = node.oids || msg.oid; if (oids) { msg.oid = oids; - getSession(host, community, node.version).table(oids, maxRepetitions, function (error, table) { + getSession(host, community, node.version, node.timeout).table(oids, maxRepetitions, function (error, table) { if (error) { node.error(error.toString(), msg); } @@ -153,12 +153,14 @@ module.exports = function (RED) { } RED.nodes.registerType("snmp table", SnmpTNode); + function SnmpSubtreeNode(n) { RED.nodes.createNode(this, n); this.community = n.community; this.host = n.host; this.version = (n.version === "2c") ? snmp.Version2c : snmp.Version1; this.oids = n.oids.replace(/\s/g, ""); + this.timeout = Number(n.timeout || 5) * 1000; var node = this; var maxRepetitions = 20; var response = []; @@ -181,7 +183,7 @@ module.exports = function (RED) { var oids = node.oids || msg.oid; if (oids) { msg.oid = oids; - getSession(host, community, node.version).subtree(msg.oid, maxRepetitions, feedCb, function (error) { + getSession(host, community, node.version, node.timeout).subtree(msg.oid, maxRepetitions, feedCb, function (error) { if (error) { node.error(error.toString(), msg); } @@ -200,12 +202,14 @@ module.exports = function (RED) { } RED.nodes.registerType("snmp subtree", SnmpSubtreeNode); + function SnmpWalkerNode(n) { RED.nodes.createNode(this, n); this.community = n.community; this.host = n.host; this.version = (n.version === "2c") ? snmp.Version2c : snmp.Version1; this.oids = n.oids.replace(/\s/g, ""); + this.timeout = Number(n.timeout || 5) * 1000; var node = this; var maxRepetitions = 20; var response = []; @@ -229,7 +233,7 @@ module.exports = function (RED) { var community = node.community || msg.community; if (oids) { msg.oid = oids; - getSession(host, community, node.version).walk(msg.oid, maxRepetitions, feedCb, function (error) { + getSession(host, community, node.version, node.timeout).walk(msg.oid, maxRepetitions, feedCb, function (error) { if (error) { node.error(error.toString(), msg); } From 4ed7ab590d048881e3642384e0aefa2a85c84f92 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 29 Jan 2018 09:16:35 +0000 Subject: [PATCH 010/456] reinstate feed parser useragent --- social/feedparser/32-feedparse.js | 6 +++--- social/feedparser/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/social/feedparser/32-feedparse.js b/social/feedparser/32-feedparse.js index bf898ef8..7a6bf88c 100644 --- a/social/feedparser/32-feedparse.js +++ b/social/feedparser/32-feedparse.js @@ -18,10 +18,10 @@ module.exports = function(RED) { } else { var getFeed = function() { - var req = request(node.url, {timeout: 10000, pool: false}); + var req = request(node.url, {timeout:10000, pool:false}); //req.setMaxListeners(50); - //req.setHeader('user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36'); - //req.setHeader('accept', 'text/html,application/xhtml+xml'); + req.setHeader('user-agent', 'Mozilla/5.0 (Node-RED)'); + req.setHeader('accept', 'text/html,application/xhtml+xml'); var feedparser = new FeedParser(); diff --git a/social/feedparser/package.json b/social/feedparser/package.json index a5c0328f..e3be396f 100644 --- a/social/feedparser/package.json +++ b/social/feedparser/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-feedparser", - "version": "0.1.8", + "version": "0.1.9", "description": "A Node-RED node to get RSS Atom feeds.", "dependencies": { "feedparser": "1.1.3", From be79b6a1c603fb331f28a806c51d99bdcd33cd40 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 30 Jan 2018 21:42:14 +0000 Subject: [PATCH 011/456] add msg.property option to rbe, randon, smooth and base64 nodes --- function/random/package.json | 2 +- function/random/random.html | 23 +- function/random/random.js | 7 +- function/rbe/package.json | 2 +- function/rbe/rbe.html | 19 +- function/rbe/rbe.js | 16 +- function/smooth/17-smooth.html | 11 +- function/smooth/17-smooth.js | 25 +- function/smooth/package.json | 2 +- package-lock.json | 817 +++++++++---------------- parsers/base64/70-base64.html | 15 +- parsers/base64/70-base64.js | 22 +- parsers/base64/package.json | 2 +- test/function/random/random_spec.js | 19 + test/function/rbe/rbe_spec.js | 35 ++ test/function/smooth/17-smooth_spec.js | 46 ++ test/parsers/base64/70-base64_spec.js | 29 + 17 files changed, 527 insertions(+), 565 deletions(-) diff --git a/function/random/package.json b/function/random/package.json index f6e48cac..4898c021 100644 --- a/function/random/package.json +++ b/function/random/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-random", - "version" : "0.0.8", + "version" : "0.1.0", "description" : "A Node-RED node that when triggered generates a random number between two values.", "dependencies" : { }, diff --git a/function/random/random.html b/function/random/random.html index 1a9cb7c7..0f2c3824 100644 --- a/function/random/random.html +++ b/function/random/random.html @@ -1,27 +1,31 @@ - +70% diff --git a/function/random/random.js b/function/random/random.js index 69da1d65..a6fb1a47 100644 --- a/function/random/random.js +++ b/function/random/random.js @@ -6,14 +6,17 @@ module.exports = function(RED) { this.low = Number(n.low || 1); this.high = Number(n.high || 10); this.inte = n.inte || false; + this.property = n.property||"payload"; var node = this; this.on("input", function(msg) { + var value; if (node.inte == "true" || node.inte === true) { - msg.payload = Math.round(Number(Math.random()) * (node.high - node.low + 1) + node.low - 0.5); + value = Math.round(Number(Math.random()) * (node.high - node.low + 1) + node.low - 0.5); } else { - msg.payload = Number(Math.random()) * (node.high - node.low) + node.low; + value = Number(Math.random()) * (node.high - node.low) + node.low; } + RED.util.setMessageProperty(msg,node.property,value); node.send(msg); }); } diff --git a/function/rbe/package.json b/function/rbe/package.json index 6b1af48d..a48b84fc 100644 --- a/function/rbe/package.json +++ b/function/rbe/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-rbe", - "version" : "0.1.14", + "version" : "0.2.0", "description" : "A Node-RED node that provides report-by-exception (RBE) and deadband capability.", "dependencies" : { }, diff --git a/function/rbe/rbe.html b/function/rbe/rbe.html index ecf951c2..759c7c06 100644 --- a/function/rbe/rbe.html +++ b/function/rbe/rbe.html @@ -2,7 +2,7 @@ @@ -43,7 +47,7 @@
if specified the function will work on a per topic basis.
resetany
if set clears the stored value for the specified msg.topic, or - all topics if msg.topic is not specified.
+ all topics if msg.topic is not specified.

Outputs

@@ -76,7 +80,8 @@ func: {value:"rbe"}, gap: {value:"",validate:RED.validators.regex(/^(\d*[.]*\d*|)(%|)$/)}, start: {value:""}, - inout: {value:"out"} + inout: {value:"out"}, + property: {value:"payload",required:true} }, inputs:1, outputs:1, @@ -89,6 +94,10 @@ return this.name?"node_label_italic":""; }, oneditprepare: function() { + if (this.property === undefined) { + $("#node-input-property").val("payload"); + } + $("#node-input-property").typedInput({default:'msg',types:['msg']}); //$( "#node-input-gap" ).spinner({min:0}); if ($("#node-input-inout").val() === null) { $("#node-input-inout").val("out"); diff --git a/function/rbe/rbe.js b/function/rbe/rbe.js index 50bfa1e8..49e2a208 100644 --- a/function/rbe/rbe.js +++ b/function/rbe/rbe.js @@ -13,6 +13,7 @@ module.exports = function(RED) { this.gap = parseFloat(this.gap); } this.g = this.gap; + this.property = n.property||"payload"; var node = this; @@ -24,26 +25,27 @@ module.exports = function(RED) { } else { node.previous = {}; } } - if (msg.hasOwnProperty("payload")) { + var value = RED.util.getMessageProperty(msg,node.property); + if (value !== undefined) { var t = msg.topic || "_no_topic"; if ((this.func === "rbe") || (this.func === "rbei")) { var doSend = (this.func !== "rbei") || (node.previous.hasOwnProperty(t)) || false; - if (typeof(msg.payload) === "object") { + if (typeof(value) === "object") { if (typeof(node.previous[t]) !== "object") { node.previous[t] = {}; } - if (!RED.util.compareObjects(msg.payload, node.previous[t])) { - node.previous[t] = RED.util.cloneMessage(msg.payload); + if (!RED.util.compareObjects(value, node.previous[t])) { + node.previous[t] = RED.util.cloneMessage(value); if (doSend) { node.send(msg); } } } else { - if (msg.payload !== node.previous[t]) { - node.previous[t] = RED.util.cloneMessage(msg.payload); + if (value !== node.previous[t]) { + node.previous[t] = RED.util.cloneMessage(value); if (doSend) { node.send(msg); } } } } else { - var n = parseFloat(msg.payload); + var n = parseFloat(value); if (!isNaN(n)) { if ((typeof node.previous[t] === 'undefined') && (this.func === "narrowband")) { if (node.start === '') { node.previous[t] = n; } diff --git a/function/smooth/17-smooth.html b/function/smooth/17-smooth.html index 5de5af16..d7340849 100644 --- a/function/smooth/17-smooth.html +++ b/function/smooth/17-smooth.html @@ -1,7 +1,11 @@ @@ -17,7 +21,8 @@ category: 'function', color:"#DEBD5C", defaults: { - name: {value:""} + name: {value:""}, + property: {value:"payload",required:true} }, inputs:1, outputs:1, @@ -27,6 +32,12 @@ }, labelStyle: function() { return this.name?"node_label_italic":""; + }, + oneditprepare: function() { + if (this.property === undefined) { + $("#node-input-property").val("payload"); + } + $("#node-input-property").typedInput({default:'msg',types:['msg']}); } }); diff --git a/parsers/base64/70-base64.js b/parsers/base64/70-base64.js index 741fa5dc..764895df 100644 --- a/parsers/base64/70-base64.js +++ b/parsers/base64/70-base64.js @@ -1,28 +1,32 @@ module.exports = function(RED) { "use strict"; - function Base64Node(n) { RED.nodes.createNode(this,n); + this.property = n.property||"payload"; var node = this; this.on("input", function(msg) { - if (msg.hasOwnProperty("payload")) { - if (Buffer.isBuffer(msg.payload)) { + var value = RED.util.getMessageProperty(msg,node.property); + if (value !== undefined) { + if (Buffer.isBuffer(value)) { // Take binary buffer and make into a base64 string - msg.payload = msg.payload.toString('base64'); + value = value.toString('base64'); + RED.util.setMessageProperty(msg,node.property,value); node.send(msg); } - else if (typeof msg.payload === "string") { + else if (typeof value === "string") { // Take base64 string and make into binary buffer - var load = msg.payload.replace(/\s+/g,''); // remove any whitespace + var load = value.replace(/\s+/g,''); // remove any whitespace var regexp = new RegExp('^[A-Za-z0-9+\/=]*$'); // check it only contains valid characters if ( regexp.test(load) && (load.length % 4 === 0) ) { - msg.payload = new Buffer(load,'base64'); + value = new Buffer(load,'base64'); + RED.util.setMessageProperty(msg,node.property,value); node.send(msg); } else { //node.log("Not a Base64 string - maybe we should encode it..."); - msg.payload = (new Buffer(msg.payload,"binary")).toString('base64'); + value = (new Buffer(value,"binary")).toString('base64'); + RED.util.setMessageProperty(msg,node.property,value); node.send(msg); } } @@ -30,7 +34,7 @@ module.exports = function(RED) { node.warn("This node only handles strings or buffers."); } } - else { node.warn("No payload found to process"); } + else { node.warn("No property found to process"); } }); } RED.nodes.registerType("base64",Base64Node); diff --git a/parsers/base64/package.json b/parsers/base64/package.json index 99197caf..1805f7ef 100644 --- a/parsers/base64/package.json +++ b/parsers/base64/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-base64", - "version" : "0.0.8", + "version" : "0.1.0", "description" : "A Node-RED node to pack and unpack objects to base64 format", "dependencies" : { }, diff --git a/test/function/random/random_spec.js b/test/function/random/random_spec.js index e1a7d963..e1b9939f 100644 --- a/test/function/random/random_spec.js +++ b/test/function/random/random_spec.js @@ -66,4 +66,23 @@ describe('random node', function() { }); }); + it('should output an integer between -3 and 3 on chosen property - foo', function(done) { + var flow = [{"id":"n1", "type":"random", property:"foo", low:-3, high:3, inte:true, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + if (c === 0) { + msg.should.have.a.property("foo"); + msg.foo.should.be.approximately(0,3); + msg.foo.toString().indexOf(".").should.equal(-1); + done(); + } + }); + n1.emit("input", {payload:"a"}); + }); + }); + }); diff --git a/test/function/rbe/rbe_spec.js b/test/function/rbe/rbe_spec.js index e19249ab..f41517d7 100644 --- a/test/function/rbe/rbe_spec.js +++ b/test/function/rbe/rbe_spec.js @@ -62,6 +62,41 @@ describe('rbe node', function() { }); }); + it('should only send output if another chosen property changes - foo (rbe)', function(done) { + var flow = [{"id":"n1", "type":"rbe", func:"rbe", gap:"0", property:"foo", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + if (c === 0) { + msg.should.have.a.property("foo", "a"); + c+=1; + } + else if (c === 1) { + msg.should.have.a.property("foo", "b"); + c+=1; + } + else { + msg.should.have.a.property("foo"); + msg.foo.should.have.a.property("b",1); + msg.foo.should.have.a.property("c",2); + done(); + } + }); + n1.emit("input", {foo:"a"}); + n1.emit("input", {payload:"a"}); + n1.emit("input", {foo:"a"}); + n1.emit("input", {payload:"a"}); + n1.emit("input", {foo:"a"}); + n1.emit("input", {foo:"b"}); + n1.emit("input", {foo:{b:1,c:2}}); + n1.emit("input", {foo:{c:2,b:1}}); + n1.emit("input", {payload:{c:2,b:1}}); + }); + }); + it('should only send output if payload changes - ignoring first value (rbei)', function(done) { var flow = [{"id":"n1", "type":"rbe", func:"rbei", gap:"0", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; diff --git a/test/function/smooth/17-smooth_spec.js b/test/function/smooth/17-smooth_spec.js index 6145a94e..4a9d2b83 100644 --- a/test/function/smooth/17-smooth_spec.js +++ b/test/function/smooth/17-smooth_spec.js @@ -48,6 +48,29 @@ describe('smooth node', function() { }); }); + it('should average over a number of inputs - another property - foo', function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"mean", count:"5", round:"true", property:"foo", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 4) { msg.should.have.a.property("foo", 1.8); } + if (c === 6) { msg.should.have.a.property("foo", 3); done(); } + }); + n1.emit("input", {foo:1}); + n1.emit("input", {foo:1}); + n1.emit("input", {foo:2}); + n1.emit("input", {payload:2}); + n1.emit("input", {payload:2}); + n1.emit("input", {foo:3}); + n1.emit("input", {foo:4}); + n1.emit("input", {foo:4.786}); + }); + }); + it('should be able to be reset', function(done) { var flow = [{"id":"n1", "type":"smooth", action:"mean", count:"5", round:"true", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; @@ -69,6 +92,29 @@ describe('smooth node', function() { }); }); + it('should be able to be reset - while using another property - foo', function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"mean", count:"5", round:"true", property:"foo", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 3) { msg.should.have.a.property("foo", 2); } + if (c === 6) { msg.should.have.a.property("foo", 5); done(); } + }); + n1.emit("input", {foo:1}); + n1.emit("input", {foo:2}); + n1.emit("input", {payload:2}); + n1.emit("input", {foo:3}); + n1.emit("input", {reset:true, foo:4}); + n1.emit("input", {foo:5}); + n1.emit("input", {payload:2}); + n1.emit("input", {foo:6}); + }); + }); + it('should output max over a number of inputs', function(done) { var flow = [{"id":"n1", "type":"smooth", action:"max", count:"5", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; diff --git a/test/parsers/base64/70-base64_spec.js b/test/parsers/base64/70-base64_spec.js index 1fe5ddda..b7324248 100644 --- a/test/parsers/base64/70-base64_spec.js +++ b/test/parsers/base64/70-base64_spec.js @@ -39,6 +39,20 @@ describe('base64 node', function() { }); }); + it('should convert a Buffer to base64 using another property - foo', function(done) { + var flow = [{id:"n1", type:"base64", property:"foo", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + msg.should.have.a.property("foo","QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo="); + done(); + }); + n1.emit("input", {foo: Buffer.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ")}); + }); + }); + it('should convert base64 to a Buffer', function(done) { var flow = [{"id":"n1", "type":"base64", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; @@ -54,6 +68,21 @@ describe('base64 node', function() { }); }); + it('should convert base64 to a Buffer using another property - foo', function(done) { + var flow = [{id:"n1", type:"base64", property:"foo", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + msg.should.have.a.property("foo"); + msg.foo.toString().should.equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + done(); + }); + n1.emit("input", {foo:"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo="}); + }); + }); + it('should try to encode a non base64 string', function(done) { var flow = [{"id":"n1", "type":"base64", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; From 6da469e49bf943f094ddd932b4f67d8ccc14eb1d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 30 Jan 2018 21:57:44 +0000 Subject: [PATCH 012/456] fix missing timeout variable from SNMP node --- io/snmp/package.json | 2 +- io/snmp/snmp.html | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/io/snmp/package.json b/io/snmp/package.json index d561c581..05994444 100644 --- a/io/snmp/package.json +++ b/io/snmp/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-snmp", - "version" : "0.0.16", + "version" : "0.0.17", "description" : "A Node-RED node that looks for SNMP oids.", "dependencies" : { "net-snmp" : "^1.1.19" diff --git a/io/snmp/snmp.html b/io/snmp/snmp.html index 2ada8dd4..f16cf1e5 100644 --- a/io/snmp/snmp.html +++ b/io/snmp/snmp.html @@ -57,7 +57,6 @@ return this.name ? "node_label_italic" : ""; } }); - - From f664fa0e317742b45c7e72060c9ead99edf5c3ef Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 31 Jan 2018 10:33:27 +0000 Subject: [PATCH 013/456] pin back net-snap version --- io/snmp/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/snmp/package.json b/io/snmp/package.json index 05994444..6021262f 100644 --- a/io/snmp/package.json +++ b/io/snmp/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-snmp", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node that looks for SNMP oids.", "dependencies" : { - "net-snmp" : "^1.1.19" + "net-snmp" : "1.1.19" }, "repository" : { "type":"git", From b2de9288606450ca3e3cb141b1645fd0e1341a0c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 31 Jan 2018 11:18:30 +0000 Subject: [PATCH 014/456] update rest of parsers to allow property to be selected --- parsers/geohash/70-geohash.html | 8 +- parsers/geohash/70-geohash.js | 126 +++++++++++------------- parsers/geohash/package.json | 2 +- parsers/msgpack/70-msgpack.html | 7 +- parsers/msgpack/70-msgpack.js | 20 ++-- parsers/msgpack/package.json | 2 +- parsers/what3words/package.json | 2 +- parsers/what3words/what3words.html | 9 +- parsers/what3words/what3words.js | 98 +++++++++--------- test/parsers/geohash/70-geohash_spec.js | 23 ++++- 10 files changed, 158 insertions(+), 139 deletions(-) diff --git a/parsers/geohash/70-geohash.html b/parsers/geohash/70-geohash.html index 1f2ac238..e4cbd579 100644 --- a/parsers/geohash/70-geohash.html +++ b/parsers/geohash/70-geohash.html @@ -1,5 +1,9 @@ diff --git a/parsers/geohash/package.json b/parsers/geohash/package.json index 08e0d7c8..68339339 100644 --- a/parsers/geohash/package.json +++ b/parsers/geohash/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-geohash", - "version" : "0.1.7", + "version" : "0.1.8", "description" : "A Node-RED node to encode and decode lat,lon pairs to a geohash.", "dependencies" : { "ngeohash" : "0.6.0" diff --git a/parsers/msgpack/70-msgpack.html b/parsers/msgpack/70-msgpack.html index ceed92d5..12552ff0 100644 --- a/parsers/msgpack/70-msgpack.html +++ b/parsers/msgpack/70-msgpack.html @@ -35,6 +35,9 @@ }, labelStyle: function() { return this.name?"node_label_italic":""; + }, + oneditprepare: function() { + $("#node-input-property").typedInput({default:'msg',types:['msg']}); } }); diff --git a/parsers/msgpack/package.json b/parsers/msgpack/package.json index d5c163e9..ec71f920 100644 --- a/parsers/msgpack/package.json +++ b/parsers/msgpack/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-msgpack", - "version" : "1.1.1", + "version" : "1.1.2", "description" : "A Node-RED node to pack and unpack objects to msgpack format", "dependencies" : { "msgpack-lite" : "^0.1.26" diff --git a/parsers/what3words/package.json b/parsers/what3words/package.json index 5d011dbb..4f8ccd9a 100644 --- a/parsers/what3words/package.json +++ b/parsers/what3words/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-what3words", - "version" : "0.1.7", + "version" : "0.1.8", "description" : "A Node-RED node to convert locations to/from what3words", "dependencies" : { "geo.what3words" : "^2.0.0" diff --git a/parsers/what3words/what3words.html b/parsers/what3words/what3words.html index 6e8d5a23..a90212e4 100644 --- a/parsers/what3words/what3words.html +++ b/parsers/what3words/what3words.html @@ -62,6 +62,9 @@ }, labelStyle: function() { return this.name?"node_label_italic":""; + }, + oneditprepare: function() { + $("#node-input-property").typedInput({default:'msg',types:['msg']}); } }); From f9ac210a41b6bbdfce4779409f1d6f366d9ea14b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 3 Feb 2018 15:08:05 +0000 Subject: [PATCH 016/456] Add fixed conversion modes to base64 node to close #401 --- parsers/base64/70-base64.html | 12 ++++++- parsers/base64/70-base64.js | 60 ++++++++++++++++++++++------------- parsers/base64/package.json | 2 +- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/parsers/base64/70-base64.html b/parsers/base64/70-base64.html index 5ab31404..2edae4cc 100644 --- a/parsers/base64/70-base64.html +++ b/parsers/base64/70-base64.html @@ -1,5 +1,13 @@ diff --git a/parsers/msgpack/icons/parser-msgpack.png b/parsers/msgpack/icons/parser-msgpack.png new file mode 100644 index 0000000000000000000000000000000000000000..02b5ddc0827853bf3ab620a1f75530fdeb164a43 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz1!3HFCgzU0`6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#KbJX#O@!t;~P+DzNd?0h{y4#lh1NB8wj+dd+{B0 ze);%Ei(P~M)87@@j>oziJ7Rlxc_|j3(&(hXT31tjqj=@ z%fGFh{N)qNI%j^S+!ve=n0^&-Y-77{%=tzQo62Orlqq{{WzTKl>{%Cf=ca?-sb7L_ zYpYKys`tn~jCnpGOu{|*+EU{)zQ3kP{KG*bNPSd+y^`=_8P&;onpeP7|t$O Q0(2^ar>mdKI;Vst0Qie#$N&HU literal 0 HcmV?d00001 diff --git a/parsers/msgpack/package.json b/parsers/msgpack/package.json index ec71f920..9a8b2070 100644 --- a/parsers/msgpack/package.json +++ b/parsers/msgpack/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-msgpack", - "version" : "1.1.2", + "version" : "1.1.3", "description" : "A Node-RED node to pack and unpack objects to msgpack format", "dependencies" : { "msgpack-lite" : "^0.1.26" diff --git a/parsers/what3words/icons/what3words.png b/parsers/what3words/icons/what3words.png new file mode 100644 index 0000000000000000000000000000000000000000..9fe1b593abc0c476088fa42c93f340c288e19a13 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoS!3HF6zS(*kNU2IendogF8_ z+4+krS)%0MB9q9SQzXLw$M3z@bLEOh*o8mo2?=cAdnX^ zk^J{uwDAA_^7|rs<*(PVpRDAY|6P;!*TZ0kO#-X9+ZOmsNX}fD^K$=1wObEZ8E#q> U++scFy%`iJp00i_>zopr09W#cO8@`> literal 0 HcmV?d00001 diff --git a/parsers/what3words/package.json b/parsers/what3words/package.json index 4f8ccd9a..173f6cc2 100644 --- a/parsers/what3words/package.json +++ b/parsers/what3words/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-what3words", - "version" : "0.1.8", + "version" : "0.1.9", "description" : "A Node-RED node to convert locations to/from what3words", "dependencies" : { "geo.what3words" : "^2.0.0" diff --git a/parsers/what3words/what3words.html b/parsers/what3words/what3words.html index a90212e4..871159a7 100644 --- a/parsers/what3words/what3words.html +++ b/parsers/what3words/what3words.html @@ -56,7 +56,7 @@ color:"#DEBD5C", inputs:1, outputs:1, - icon: "arrow-in.png", + icon: "what3words.png", label: function() { return this.name||"what3words"; }, From bb3d302bcbea690c0c92d8db0c4a96e050c2f351 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 9 Feb 2018 12:51:42 +0000 Subject: [PATCH 020/456] Add try/catch to daemon --- utility/daemon/daemon.js | 93 ++++++++++++++++++++----------------- utility/daemon/package.json | 2 +- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/utility/daemon/daemon.js b/utility/daemon/daemon.js index ee2d045a..59dd6f6f 100644 --- a/utility/daemon/daemon.js +++ b/utility/daemon/daemon.js @@ -36,58 +36,67 @@ module.exports = function(RED) { } function runit() { + var line = ""; if (!node.cmd || (typeof node.cmd !== "string") || (node.cmd.length < 1)) { node.status({fill:"grey",shape:"ring",text:"no command"}); return; } - node.child = spawn(node.cmd, node.args); - if (RED.settings.verbose) { node.log(node.cmd+" "+JSON.stringify(node.args)); } - node.status({fill:"green",shape:"dot",text:"running"}); - node.running = true; - var line = ""; + try { + node.child = spawn(node.cmd, node.args); + if (RED.settings.verbose) { node.log(node.cmd+" "+JSON.stringify(node.args)); } + node.status({fill:"green",shape:"dot",text:"running"}); + node.running = true; - node.child.stdout.on('data', function (data) { - if (node.op === "string") { data = data.toString(); } - if (node.op === "number") { data = Number(data); } - if (RED.settings.verbose) { node.log("out: "+data); } - if (node.op === "lines") { - line += data.toString(); - var bits = line.split("\n"); - while (bits.length > 1) { - node.send([{payload:bits.shift()},null,null]); + node.child.stdout.on('data', function (data) { + if (node.op === "string") { data = data.toString(); } + if (node.op === "number") { data = Number(data); } + if (RED.settings.verbose) { node.log("out: "+data); } + if (node.op === "lines") { + line += data.toString(); + var bits = line.split("\n"); + while (bits.length > 1) { + node.send([{payload:bits.shift()},null,null]); + } + line = bits[0]; } - line = bits[0]; - } - else { - if (data && (data.length !== 0)) { - node.send([{payload:data},null,null]); + else { + if (data && (data.length !== 0)) { + node.send([{payload:data},null,null]); + } } - } - }); + }); - node.child.stderr.on('data', function (data) { - if (node.op === "string") { data = data.toString(); } - if (node.op === "number") { data = Number(data); } - if (RED.settings.verbose) { node.log("err: "+data); } - node.send([null,{payload:data},null]); - }); + node.child.stderr.on('data', function (data) { + if (node.op === "string") { data = data.toString(); } + if (node.op === "number") { data = Number(data); } + if (RED.settings.verbose) { node.log("err: "+data); } + node.send([null,{payload:data},null]); + }); - node.child.on('close', function (code,signal) { - if (RED.settings.verbose) { node.log("ret: "+code+":"+signal); } + node.child.on('close', function (code,signal) { + if (RED.settings.verbose) { node.log("ret: "+code+":"+signal); } + node.running = false; + node.child = null; + var rc = code; + if (code === null) { rc = signal; } + node.send([null,null,{payload:rc}]); + node.status({fill:"red",shape:"ring",text:"stopped"}); + }); + + node.child.on('error', function (err) { + if (err.errno === "ENOENT") { node.warn('Command not found'); } + else if (err.errno === "EACCES") { node.warn('Command not executable'); } + else { node.log('error: ' + err); } + node.status({fill:"red",shape:"ring",text:"error"}); + }); + } + catch(e) { + if (e.errno === "ENOENT") { node.warn('Command not found'); } + else if (e.errno === "EACCES") { node.warn('Command not executable'); } + else { node.error(e); } + node.status({fill:"red",shape:"ring",text:"error"}); node.running = false; - node.child = null; - var rc = code; - if (code === null) { rc = signal; } - node.send([null,null,{payload:rc}]); - node.status({fill:"red",shape:"ring",text:"stopped"}); - }); - - node.child.on('error', function (err) { - if (err.errno === "ENOENT") { node.warn('Command not found'); } - else if (err.errno === "EACCES") { node.warn('Command not executable'); } - else { node.log('error: ' + err); } - node.status({fill:"grey",shape:"dot",text:"error"}); - }); + } } if (node.redo === true) { diff --git a/utility/daemon/package.json b/utility/daemon/package.json index 018f0db9..089a8c26 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From 17614843da48d3db96e0a7d5050f207ec4c2f06b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 15 Feb 2018 14:04:03 +0000 Subject: [PATCH 021/456] add note re docker to pigpiod node --- hardware/pigpiod/package.json | 2 +- hardware/pigpiod/pi-gpiod.html | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hardware/pigpiod/package.json b/hardware/pigpiod/package.json index c188c5c4..e54c5e4d 100644 --- a/hardware/pigpiod/package.json +++ b/hardware/pigpiod/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpiod", - "version": "0.0.7", + "version": "0.0.8", "description": "A node-red node for PiGPIOd", "dependencies" : { "js-pigpio": "*" diff --git a/hardware/pigpiod/pi-gpiod.html b/hardware/pigpiod/pi-gpiod.html index 507e63f6..82998623 100644 --- a/hardware/pigpiod/pi-gpiod.html +++ b/hardware/pigpiod/pi-gpiod.html @@ -180,6 +180,7 @@

Details

You may also enable the input pullup resistor ↑ or the pulldown resistor ↓.

+

If using with Docker on Pi then the default Host IP should be `172.17.0.1`. You will also need to run `sudo pigpiod` on the host.

Note: the pin numbers refer the physical pin numbers on connector P1 as they are easier to locate.

@@ -426,6 +427,7 @@ and will set the selected physical pin high or low depending on the value passed in.

The initial value of the pin at deploy time can also be set to 0 or 1.

When using PWM and Servo modes, the input value should be a number 0 - 100, and can be floating point.

+

If using with Docker on Pi then the default Host IP should be `172.17.0.1`. You will also need to run `sudo pigpiod` on the host.

Note: the pin numbers refer the physical pin numbers on connector P1 as they are easier to locate.

From c1d835c1cadef6c89c7ca4e2e098ed6ac6adb486 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 15 Feb 2018 14:43:29 +0000 Subject: [PATCH 022/456] Tidy up gpiod node tips --- hardware/pigpiod/locales/en-US/pi-gpiod.json | 8 ++++---- hardware/pigpiod/package.json | 2 +- hardware/pigpiod/pi-gpiod.html | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/hardware/pigpiod/locales/en-US/pi-gpiod.json b/hardware/pigpiod/locales/en-US/pi-gpiod.json index 69199beb..5eaa33e6 100644 --- a/hardware/pigpiod/locales/en-US/pi-gpiod.json +++ b/hardware/pigpiod/locales/en-US/pi-gpiod.json @@ -30,10 +30,10 @@ "pinname": "Pin", "tip": { "pin": "Pins in Use: ", - "in": "Tip: Only Digital Input is supported - input must be 0 or 1.", - "dig": "Tip: For digital output - input must be 0 or 1.", - "pwm": "Tip: For PWM output - input must be between 0 to 100.", - "ser": "Tip: For Servo output - input must be between 0 to 100. 50 is centre.
Min must be 500uS or more, Max must be 2500uS or less." + "in": "Only Digital Input is supported - input must be 0 or 1.", + "dig": "Digital output - input must be 0 or 1.", + "pwm": "PWM output - input must be between 0 to 100.", + "ser": "Servo output - input must be between 0 to 100. 50 is centre.
Min must be 500uS or more, Max must be 2500uS or less." }, "types": { "digout": "digital output", diff --git a/hardware/pigpiod/package.json b/hardware/pigpiod/package.json index e54c5e4d..8ea76b8b 100644 --- a/hardware/pigpiod/package.json +++ b/hardware/pigpiod/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpiod", - "version": "0.0.8", + "version": "0.0.9", "description": "A node-red node for PiGPIOd", "dependencies" : { "js-pigpio": "*" diff --git a/hardware/pigpiod/pi-gpiod.html b/hardware/pigpiod/pi-gpiod.html index 82998623..d83641b2 100644 --- a/hardware/pigpiod/pi-gpiod.html +++ b/hardware/pigpiod/pi-gpiod.html @@ -163,9 +163,9 @@ +
Pins marked in blue are dual use. Make sure they are not enabled for their other use before using as GPIO.
-
@@ -408,11 +408,11 @@ -
Pins marked in blue are dual use. Make sure they are not enabled for - their other use before using as GPIO.
+
Pins marked in blue are dual use. Make sure they are not enabled for + their other use before using as GPIO.
@@ -485,7 +485,7 @@ $("#pwm-tip").show(); $("#ser-tip").hide(); } - if ($("#node-input-out").val() === "ser") { + else if ($("#node-input-out").val() === "ser") { $('#node-set-tick').hide(); $('#node-set-state').hide(); $('#node-set-minimax').show(); From 127fb6ac0c69af8d9b22cedca9d99e1eea71e2d8 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Feb 2018 19:21:52 +0000 Subject: [PATCH 023/456] clarify serial port timeout doc info --- io/serialport/25-serial.html | 2 +- io/serialport/README.md | 2 +- io/serialport/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/io/serialport/25-serial.html b/io/serialport/25-serial.html index 287515bb..ea7d7842 100644 --- a/io/serialport/25-serial.html +++ b/io/serialport/25-serial.html @@ -13,7 +13,7 @@ diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 07b3fd8d..e6fcf10d 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -117,8 +117,8 @@ module.exports = function(RED) { this.port.on('data', function(msg) { // single char buffer if ((node.serialConfig.newline === 0)||(node.serialConfig.newline === "")) { - if (node.serialConfig.bin !== "bin") { node.send({"payload": String.fromCharCode(msg)}); } - else { node.send({"payload": new Buffer([msg])}); } + if (node.serialConfig.bin !== "bin") { node.send({"payload": String.fromCharCode(msg), port:node.serialConfig.serialport}); } + else { node.send({"payload": new Buffer([msg]), port:node.serialConfig.serialport}); } } else { // do the timer thing @@ -133,7 +133,7 @@ module.exports = function(RED) { var m = new Buffer(i+1); buf.copy(m,0,0,i+1); if (node.serialConfig.bin !== "bin") { m = m.toString(); } - node.send({"payload": m}); + node.send({"payload": m, port:node.serialConfig.serialport}); m = null; }, node.serialConfig.newline); i = 0; @@ -148,7 +148,7 @@ module.exports = function(RED) { var m = new Buffer(i); buf.copy(m,0,0,i); if (node.serialConfig.bin !== "bin") { m = m.toString(); } - node.send({"payload":m}); + node.send({"payload":m, port:node.serialConfig.serialport}); m = null; i = 0; } @@ -161,7 +161,7 @@ module.exports = function(RED) { var n = new Buffer(i); buf.copy(n,0,0,i); if (node.serialConfig.bin !== "bin") { n = n.toString(); } - node.send({"payload":n}); + node.send({"payload":n, port:node.serialConfig.serialport}); n = null; i = 0; } diff --git a/io/serialport/package.json b/io/serialport/package.json index ccf56099..ee68d2af 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-serialport", - "version" : "0.6.4", + "version" : "0.6.5", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { - "serialport" : "^6.0.5" + "serialport" : "^6.1.1" }, "repository" : { "type":"git", From f92f16fd08c40ff56e6e31f0878859f40757e0c5 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 11 Mar 2018 21:10:37 +0000 Subject: [PATCH 027/456] Add warning of too large interval for feedparser To close #408 --- social/feedparser/32-feedparse.html | 7 ++++--- social/feedparser/32-feedparse.js | 1 + social/feedparser/locales/en-US/32-feedparse.json | 5 +++-- social/feedparser/package.json | 6 +++--- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/social/feedparser/32-feedparse.html b/social/feedparser/32-feedparse.html index 5d732881..3581c75e 100644 --- a/social/feedparser/32-feedparse.html +++ b/social/feedparser/32-feedparse.html @@ -6,7 +6,7 @@
- +
@@ -19,6 +19,7 @@

The msg.topic contains the original article link. The msg.payload contains the description, and msg.article contains the complete article object, which has properties such as .title, .summary, .date and so on.

+

The Refresh interval cannot be greater than 35790 minutes (approx 24.8 days). diff --git a/storage/sqlite/sqlite.js b/storage/sqlite/sqlite.js index 41936fd5..e210bbcb 100644 --- a/storage/sqlite/sqlite.js +++ b/storage/sqlite/sqlite.js @@ -1,4 +1,3 @@ - module.exports = function(RED) { "use strict"; var reconnect = RED.settings.sqliteReconnectTime || 20000; @@ -33,26 +32,75 @@ module.exports = function(RED) { function SqliteNodeIn(n) { RED.nodes.createNode(this,n); this.mydb = n.mydb; + this.sqlquery = n.sqlquery||"msg.topic"; + this.sql = n.sql; this.mydbConfig = RED.nodes.getNode(this.mydb); + var node = this; + node.status({}); if (this.mydbConfig) { this.mydbConfig.doConnect(); - var node = this; + var bind = []; node.on("input", function(msg) { - if (typeof msg.topic === 'string') { - //console.log("query:",msg.topic); - var bind = Array.isArray(msg.payload) ? msg.payload : []; - node.mydbConfig.db.all(msg.topic, bind, function(err, row) { - if (err) { node.error(err,msg); } - else { - msg.payload = row; - node.send(msg); + if (this.sqlquery == "msg.topic"){ + if (typeof msg.topic === 'string') { + bind = Array.isArray(msg.payload) ? msg.payload : []; + node.mydbConfig.db.all(msg.topic, bind, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } + else { + if (typeof msg.topic !== 'string') { + node.error("msg.topic : the query is not defined as a string",msg); + node.status({fill:"red",shape:"dot",text:"msg.topic error"}); } - }); + } } - else { - if (typeof msg.topic !== 'string') { - node.error("msg.topic : the query is not defined as a string",msg); + if (this.sqlquery == "fixed"){ + if (typeof this.sql === 'string'){ + bind = Array.isArray(msg.payload) ? msg.payload : []; + node.mydbConfig.db.all(this.sql, bind, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } + else{ + if (this.sql === null || this.sql == ""){ + node.error("SQL statement config not set up",msg); + node.status({fill:"red",shape:"dot",text:"SQL config not set up"}); + } + } + } + if (this.sqlquery == "prepared"){ + if (typeof this.sql === 'string' && typeof msg.params !== "undefined" && typeof msg.params === "object"){ + node.mydbConfig.db.all(this.sql, msg.params, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } + else{ + if (this.sql === null || this.sql == ""){ + node.error("Prepared statement config not set up",msg); + node.status({fill:"red",shape:"dot",text:"Prepared statement not set up"}); + } + if (typeof msg.params == "undefined"){ + node.error("msg.params not passed"); + node.status({fill:"red",shape:"dot",text:"msg.params not passed",msg}); + } + else if (typeof msg.params != "object"){ + node.error("msg.params not an object"); + node.status({fill:"red",shape:"dot",text:"msg.params not an object",msg}); + } } } }); From 34199142ddd5a8760fd72dd7417abdfdcfa67a57 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 20 Mar 2018 17:17:14 +0000 Subject: [PATCH 030/456] Fix piLCD line 3 and 4 addressing ti address #416 --- hardware/PiLcd/nrlcd.py | 4 ++-- hardware/PiLcd/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hardware/PiLcd/nrlcd.py b/hardware/PiLcd/nrlcd.py index de4cc012..ec6dfc65 100755 --- a/hardware/PiLcd/nrlcd.py +++ b/hardware/PiLcd/nrlcd.py @@ -31,8 +31,8 @@ LCD_CMD = False LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line -LCD_LINE_3 = 0xA0 # LCD RAM address for the 3rd line -LCD_LINE_4 = 0xE0 # LCD RAM address for the 4th line +LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line +LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line # Timing constants E_PULSE = 0.0005 diff --git a/hardware/PiLcd/package.json b/hardware/PiLcd/package.json index 7d158fe7..22668892 100644 --- a/hardware/PiLcd/package.json +++ b/hardware/PiLcd/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pilcd", - "version" : "0.0.7", + "version" : "0.0.8", "description" : "A Node-RED node for Raspberry Pi to write to HD44780 style LCD panels.", "dependencies" : { }, From 74d51f5a79990240d3be44443c239d7c644d6393 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 20 Mar 2018 17:18:20 +0000 Subject: [PATCH 031/456] Tiny tidy of email node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit really needs a proper re-write… --- social/email/61-email.html | 4 ++-- social/email/61-email.js | 5 +++-- social/email/package.json | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/social/email/61-email.html b/social/email/61-email.html index c7ddcc8d..aff990e7 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -97,7 +97,7 @@ return this.dname||this.name||"email"; }, labelStyle: function() { - return (this.dname||!this.topic)?"node_label_italic":""; + return (this.dname)?"node_label_italic":""; }, oneditprepare: function() { if (this.credentials.global) { @@ -249,7 +249,7 @@ return this.name||"email"; }, labelStyle: function() { - return (this.name||!this.topic)?"node_label_italic":""; + return (this.name)?"node_label_italic":""; }, oneditprepare: function() { if (this.credentials.global) { diff --git a/social/email/61-email.js b/social/email/61-email.js index d22ced3a..1ab79102 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -203,6 +203,7 @@ module.exports = function(RED) { function checkPOP3(msg) { var currentMessage; var maxMessage; + //node.log("Checking POP3 for new messages"); // Form a new connection to our email server using POP3. var pop3Client = new POP3Client( @@ -237,7 +238,7 @@ module.exports = function(RED) { }); pop3Client.on("error", function(err) { - node.log("We caught an error: " + JSON.stringify(err)); + node.log("error: " + JSON.stringify(err)); }); pop3Client.on("connect", function() { @@ -297,7 +298,7 @@ module.exports = function(RED) { // // Check the email sever using the IMAP protocol for new messages. function checkIMAP(msg) { - node.log("Checking IMAP for new messages"); + //node.log("Checking IMAP for new messages"); // We get back a 'ready' event once we have connected to imap imap.once("ready", function() { node.status({fill:"blue", shape:"dot", text:"email.status.fetching"}); diff --git a/social/email/package.json b/social/email/package.json index 2f90f14f..de19cd58 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,11 +1,11 @@ { "name": "node-red-node-email", - "version": "0.1.24", + "version": "0.1.25", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "nodemailer": "^1.11.0", "poplib": "^0.1.7", - "mailparser": "^0.6.1", + "mailparser": "^0.6.2", "imap": "^0.8.19" }, "repository": { From 3decff0b1ae8b5bb33de20d09803d423ad96f84f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 20 Mar 2018 19:08:38 +0000 Subject: [PATCH 032/456] Bump sqlite node (now allows prepared statements) --- storage/sqlite/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index d63dfa62..b85d3eec 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-sqlite", - "version" : "0.1.2", + "version" : "0.2.0", "description" : "A sqlite node for Node-RED", "dependencies" : { - "sqlite3" : "3.1.*" + "sqlite3" : "3.*" }, "repository" : { "type":"git", From 8ea3969714b610fe9290d2af24f670b698e23c55 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Thu, 29 Mar 2018 16:49:30 +0900 Subject: [PATCH 033/456] Japanese translation of info text for twitter/feedparse/email/rbe nodes (#421) * add Japanese info text of twitter node * add Japanese info text of feedparse node * add Japanese info text of email node * add Japanese info text of rbe node * minor fix of Japanese info text of email node * minor fix of Japanese info text of email node --- function/rbe/locales/ja/rbe.html | 29 ++++++++++++ social/email/locales/ja/61-email.html | 46 +++++++++++++++++++ .../feedparser/locales/ja/32-feedparse.html | 8 ++++ social/twitter/locales/ja/27-twitter.html | 43 +++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 function/rbe/locales/ja/rbe.html create mode 100755 social/email/locales/ja/61-email.html create mode 100644 social/feedparser/locales/ja/32-feedparse.html create mode 100644 social/twitter/locales/ja/27-twitter.html diff --git a/function/rbe/locales/ja/rbe.html b/function/rbe/locales/ja/rbe.html new file mode 100644 index 00000000..a5225051 --- /dev/null +++ b/function/rbe/locales/ja/rbe.html @@ -0,0 +1,29 @@ + diff --git a/social/email/locales/ja/61-email.html b/social/email/locales/ja/61-email.html new file mode 100755 index 00000000..8bbb2110 --- /dev/null +++ b/social/email/locales/ja/61-email.html @@ -0,0 +1,46 @@ + + + diff --git a/social/feedparser/locales/ja/32-feedparse.html b/social/feedparser/locales/ja/32-feedparse.html new file mode 100644 index 00000000..a58b1482 --- /dev/null +++ b/social/feedparser/locales/ja/32-feedparse.html @@ -0,0 +1,8 @@ + diff --git a/social/twitter/locales/ja/27-twitter.html b/social/twitter/locales/ja/27-twitter.html new file mode 100644 index 00000000..2ccd8eb5 --- /dev/null +++ b/social/twitter/locales/ja/27-twitter.html @@ -0,0 +1,43 @@ + + + + From da96f9e869bf8cfb74beaf2f2669eb6f0c864b55 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 29 Mar 2018 16:49:42 +0900 Subject: [PATCH 034/456] Improve Japanese translation in rbe node (#422) * Improve Japanese translation * Empty commit to run travis again --- function/rbe/locales/ja/rbe.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/function/rbe/locales/ja/rbe.json b/function/rbe/locales/ja/rbe.json index fd913794..b4d76df0 100644 --- a/function/rbe/locales/ja/rbe.json +++ b/function/rbe/locales/ja/rbe.json @@ -13,12 +13,12 @@ "opts": { "rbe": "値が変化した時のみメッセージを中継", "rbei": "値が変化した時のみメッセージを中継(初期値を無視)", - "deadband": "値が比較値を超える時のみメッセージを中継", - "deadbandEq": "値が比較値以上の時のみメッセージを中継", - "narrowband": "初期値、値が比較値を超える時のみメッセージを中継", - "narrowbandEq": "初期値、値が比較値以上の時のみメッセージを中継", - "in": "を最後の入力値と比較", - "out": "を最後の出力値と比較" + "deadband": "値が指定した変化量を超える時のみメッセージを中継", + "deadbandEq": "値が指定した変化量以上の時のみメッセージを中継", + "narrowband": "値が指定した変化量を超えない時のみメッセージを中継", + "narrowbandEq": "値が指定した変化量以上でない時のみメッセージを中継", + "in": "最後の入力値と比較", + "out": "最後の出力値と比較" }, "warn": { "nonumber": "ペイロードに数値が含まれていません" From 9ea27f94ef0bafec6c9a9646414633e4ef568b0c Mon Sep 17 00:00:00 2001 From: Marc Buils Date: Thu, 29 Mar 2018 09:50:51 +0200 Subject: [PATCH 035/456] Upgrade to Twilio sdk v3 (#411) --- social/twilio/56-twilio.js | 14 ++++---------- social/twilio/package.json | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/social/twilio/56-twilio.js b/social/twilio/56-twilio.js index 75d47823..48403ba5 100644 --- a/social/twilio/56-twilio.js +++ b/social/twilio/56-twilio.js @@ -58,20 +58,14 @@ module.exports = function(RED) { if ( this.twilioType == "call" ) { // Make a call var twimlurl = node.url || msg.payload; - node.twilioClient.makeCall( {to: tonum, from: node.fromNumber, url: twimlurl}, function(err, response) { - if (err) { - node.error(err.message,msg); - } - //console.log(response); + node.twilioClient.calls.create({to: tonum, from: node.fromNumber, url: twimlurl}).catch(function(err) { + node.error(err.message,msg); }); } else { // Send SMS - node.twilioClient.sendMessage( {to: tonum, from: node.fromNumber, body: msg.payload}, function(err, response) { - if (err) { - node.error(err.message,msg); - } - //console.log(response); + node.twilioClient.messages.create({to: tonum, from: node.fromNumber, body: msg.payload}).catch( function(err) { + node.error(err.message,msg); }); } } diff --git a/social/twilio/package.json b/social/twilio/package.json index 43b86383..4c0c4e12 100644 --- a/social/twilio/package.json +++ b/social/twilio/package.json @@ -3,7 +3,7 @@ "version" : "0.0.15", "description" : "A Node-RED node to send SMS messages via the Twilio service.", "dependencies" : { - "twilio" : "^2.11.1" + "twilio" : "^3.11.3" }, "repository" : { "type":"git", From cf48039427bc8aaca99d6f35c42e8c552bf99e8e Mon Sep 17 00:00:00 2001 From: borpin Date: Thu, 29 Mar 2018 08:53:12 +0100 Subject: [PATCH 036/456] Improve HTTP response handling and error reporting (#419) Improve HTTP response handling and error reporting of emoncms node --- io/emoncms/88-emoncms.js | 57 ++++++++++++++++++++++++++-------------- io/emoncms/package.json | 8 ++++-- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/io/emoncms/88-emoncms.js b/io/emoncms/88-emoncms.js index 40e532ce..481ce1cd 100644 --- a/io/emoncms/88-emoncms.js +++ b/io/emoncms/88-emoncms.js @@ -58,6 +58,7 @@ module.exports = function(RED) { } else { node.error("ERROR : No valid data type set - " + this.datatype); + node.status({fill:"red",shape:"ring",text:"No valid data type set"}); return; } @@ -76,7 +77,7 @@ module.exports = function(RED) { // check for a time object and setup URI if valid if (typeof msg.time === "undefined") { - node.warn("WARN: Time object undefined, no time set"); + // node.warn("WARN: Time object undefined, no time set"); } else { if (!isNaN(msg.time)) { @@ -84,7 +85,7 @@ module.exports = function(RED) { } else { if (isNaN(Date.parse(msg.time))) { - // error condition + // error condition as msg.tme has some value that is not understood node.warn("WARN: Time object not valid, no time set - " + msg.time); } else { this.url += '&time=' + Date.parse(msg.time)/1000; //seconds @@ -94,34 +95,52 @@ module.exports = function(RED) { } var URIsent = this.url; - http.get(this.url, function(res) { + msg.payload = ""; + msg.urlsent = decodeURIComponent(URIsent); + + var request = http.get(this.url, function(res) { msg.topic = "http response"; msg.rc = res.statusCode; - msg.payload = ""; res.setEncoding('utf8'); + var body = ""; + res.on('data', function(chunk) { - msg.payload += chunk; + body += chunk; }); - res.on('end', function() { //A 200 StatusCode does not mean data input sucess + + res.on('end', function() { + // need to test for JSON as some responses are not valid JSON try { - msg.payload = JSON.parse(msg.payload); - if (msg.payload.success) { - node.status({fill:"green",shape:"dot",text:"Success"}); - } else { - msg.warning = "ERROR: API Call Failed"; - msg.payload.urlsent = decodeURIComponent(URIsent); - node.error(msg); - node.status({fill:"red",shape:"ring",text:"Failed"}); - } + msg.payload = JSON.parse(body); } - catch(err) { - msg.warning = "ERROR: Http response" - node.warn(msg); - node.status({fill:"red",shape:"ring",text:"http issue"}); + catch (e) { + msg.payload = body; + } + + if (msg.payload.success) { + node.status({fill:"green",shape:"dot",text:"Success RC="+ msg.rc}); + } + else if (msg.payload === 'ok') { + node.status({fill:"green",shape:"dot",text:"ok RC="+ msg.rc}); + } + else if (msg.payload === 'Invalid API key') { + node.error(msg); + node.status({fill:"red",shape:"ring",text:"Invalid API key RC="+ msg.rc}); + } else { + msg.warning = "ERROR: API Call Failed"; + node.error(msg); + node.status({fill:"red",shape:"ring",text:"API Failed RC="+ msg.rc}); } }); }).on('error', function(e) { + msg.warning = e + node.error(msg); node.error(e,msg); + node.status({fill:"red",shape:"dot",text:"HTTP Error"}); + }); + request.setTimeout(1000, function() { + node.error("timeout: " + msg); + node.status({fill:"red",shape:"ring",text:"HTTP Timeout"}); }); }); } diff --git a/io/emoncms/package.json b/io/emoncms/package.json index b16bf8b8..926908fe 100644 --- a/io/emoncms/package.json +++ b/io/emoncms/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-emoncms", - "version" : "0.1.0", + "version" : "0.2.0", "description" : "A Node-RED node to fetch/post data to/from emoncms", "dependencies" : { }, @@ -32,6 +32,10 @@ { "name": "Glyn Hudson", "email": "glyn.hudson@openenergymonitor.org" - } + }, + { + "name": "borpin", + "email": "brian.orpin@gmail.com" + } ] } From 4a8f071c917c485fb6596573e597d32ea2440427 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 29 Mar 2018 09:34:31 +0100 Subject: [PATCH 037/456] bump email, feed parser, twilio, sqlite, rbe packages --- function/rbe/package.json | 2 +- social/email/package.json | 2 +- social/feedparser/package.json | 2 +- social/twilio/package.json | 2 +- storage/sqlite/package.json | 25 ++++++++++++++----------- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/function/rbe/package.json b/function/rbe/package.json index 4db5f001..61e07f8e 100644 --- a/function/rbe/package.json +++ b/function/rbe/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-rbe", - "version" : "0.2.1", + "version" : "0.2.2", "description" : "A Node-RED node that provides report-by-exception (RBE) and deadband capability.", "dependencies" : { }, diff --git a/social/email/package.json b/social/email/package.json index de19cd58..9d107473 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "0.1.25", + "version": "0.1.26", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "nodemailer": "^1.11.0", diff --git a/social/feedparser/package.json b/social/feedparser/package.json index 7dcb87b7..1b990d8e 100644 --- a/social/feedparser/package.json +++ b/social/feedparser/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-feedparser", - "version": "0.1.10", + "version": "0.1.11", "description": "A Node-RED node to get RSS Atom feeds.", "dependencies": { "feedparser": "^2.2.9", diff --git a/social/twilio/package.json b/social/twilio/package.json index 4c0c4e12..22b79dd7 100644 --- a/social/twilio/package.json +++ b/social/twilio/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-twilio", - "version" : "0.0.15", + "version" : "0.1.0", "description" : "A Node-RED node to send SMS messages via the Twilio service.", "dependencies" : { "twilio" : "^3.11.3" diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index b85d3eec..6a77754f 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,18 +1,21 @@ { - "name" : "node-red-node-sqlite", - "version" : "0.2.0", - "description" : "A sqlite node for Node-RED", - "dependencies" : { - "sqlite3" : "3.*" + "name": "node-red-node-sqlite", + "version": "0.2.1", + "description": "A sqlite node for Node-RED", + "dependencies": { + "sqlite3": "^4.0.0" }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/storage/sqlite/" + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/storage/sqlite/" }, "license": "Apache-2.0", - "keywords": [ "node-red", "sqlite" ], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "sqlite" + ], + "node-red": { + "nodes": { "sqlite": "sqlite.js" } }, From 17744a51c0bc5afaa7a250c701b9dbe75d4b3c1d Mon Sep 17 00:00:00 2001 From: eRudy Date: Thu, 29 Mar 2018 10:42:22 +0200 Subject: [PATCH 038/456] temporary solution for direct messages (#415) * DMs are coming back :) --- social/twitter/27-twitter.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/social/twitter/27-twitter.js b/social/twitter/27-twitter.js index 033d482a..01f20a06 100644 --- a/social/twitter/27-twitter.js +++ b/social/twitter/27-twitter.js @@ -386,6 +386,7 @@ module.exports = function(RED) { this.twitterConfig = RED.nodes.getNode(this.twitter); var credentials = RED.nodes.getCredentials(this.twitter); var node = this; + var dm_user; if (credentials && credentials.screen_name == this.twitterConfig.screen_name) { var twit = new Ntwitter({ @@ -398,6 +399,10 @@ module.exports = function(RED) { if (msg.hasOwnProperty("payload")) { node.status({fill:"blue",shape:"dot",text:"twitter.status.tweeting"}); + if (msg.payload.slice(0,2) == "D ") { + // direct message syntax: "D user message" + [dm_user,msg.payload]=msg.payload.match(/D\s+(\S+)\s+(.*)/).slice(1); + } if (msg.payload.length > 280) { msg.payload = msg.payload.slice(0,279); node.warn(RED._("twitter.errors.truncated")); @@ -434,13 +439,23 @@ module.exports = function(RED) { } else { if (typeof msg.params === 'undefined') { msg.params = {}; } - twit.updateStatus(msg.payload, msg.params, function (err, data) { - if (err) { - node.status({fill:"red",shape:"ring",text:"twitter.status.failed"}); - node.error(err,msg); - } - node.status({}); - }); + if (dm_user) { + twit.newDirectMessage(dm_user,msg.payload, msg.params, function (err, data) { + if (err) { + node.status({fill:"red",shape:"ring",text:"twitter.status.failed"}); + node.error(err,msg); + } + node.status({}); + }); + } else { + twit.updateStatus(msg.payload, msg.params, function (err, data) { + if (err) { + node.status({fill:"red",shape:"ring",text:"twitter.status.failed"}); + node.error(err,msg); + } + node.status({}); + }); + } } } else { node.warn(RED._("twitter.errors.nopayload")); } From 84a445d9d868ff6ecbfdc008fd650127df7ec35c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 29 Mar 2018 09:44:37 +0100 Subject: [PATCH 039/456] bump twitter node --- social/twitter/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/social/twitter/package.json b/social/twitter/package.json index aa74574e..7a4f2b88 100644 --- a/social/twitter/package.json +++ b/social/twitter/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-twitter", - "version" : "0.1.12", + "version" : "0.1.13", "description" : "A Node-RED node to talk to Twitter", "dependencies" : { "twitter-ng": "0.6.2", From b8b5a92ad1e124efe9913fe2252193f15e3e6417 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 29 Mar 2018 17:39:46 +0100 Subject: [PATCH 040/456] update xmpp to keep working with open fire --- social/xmpp/92-xmpp.js | 6 ++++-- social/xmpp/package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/social/xmpp/92-xmpp.js b/social/xmpp/92-xmpp.js index 262b5d4c..fbadad31 100644 --- a/social/xmpp/92-xmpp.js +++ b/social/xmpp/92-xmpp.js @@ -102,7 +102,8 @@ module.exports = function(RED) { host : node.host, port : node.port, skipPresence : true, - reconnect : false + reconnect : false, + preferred : "PLAIN" }); } catch(e) { @@ -179,7 +180,8 @@ module.exports = function(RED) { host : node.host, port : node.port, skipPresence : true, - reconnect : false + reconnect : false, + preferred : "PLAIN" }); } catch(e) { diff --git a/social/xmpp/package.json b/social/xmpp/package.json index 9b72311e..d3dca717 100644 --- a/social/xmpp/package.json +++ b/social/xmpp/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-xmpp", - "version" : "0.1.6", + "version" : "0.1.7", "description" : "A Node-RED node to talk to an XMPP server", "dependencies" : { "simple-xmpp" : "1.3.*" From 467907776088422882076f46d85e25601449564d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 30 Mar 2018 14:50:51 +0100 Subject: [PATCH 041/456] Make extra node names more consistent i18n wise --- function/rbe/locales/en-US/rbe.json | 1 + function/rbe/package.json | 2 +- function/rbe/rbe.html | 4 ++-- social/email/61-email.html | 5 ++++- social/email/locales/en-US/61-email.json | 1 + social/email/package.json | 2 +- social/feedparser/32-feedparse.html | 2 +- social/feedparser/locales/en-US/32-feedparse.json | 1 + social/feedparser/package.json | 2 +- utility/daemon/daemon.html | 2 +- utility/daemon/package.json | 2 +- 11 files changed, 15 insertions(+), 9 deletions(-) diff --git a/function/rbe/locales/en-US/rbe.json b/function/rbe/locales/en-US/rbe.json index d0d967bb..8adbb62a 100644 --- a/function/rbe/locales/en-US/rbe.json +++ b/function/rbe/locales/en-US/rbe.json @@ -1,5 +1,6 @@ { "rbe": { + "rbe": "rbe", "label": { "func": "Mode", "init": "Send initial value", diff --git a/function/rbe/package.json b/function/rbe/package.json index 61e07f8e..1d818f94 100644 --- a/function/rbe/package.json +++ b/function/rbe/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-rbe", - "version" : "0.2.2", + "version" : "0.2.3", "description" : "A Node-RED node that provides report-by-exception (RBE) and deadband capability.", "dependencies" : { }, diff --git a/function/rbe/rbe.html b/function/rbe/rbe.html index 759c7c06..48f0c103 100644 --- a/function/rbe/rbe.html +++ b/function/rbe/rbe.html @@ -87,8 +87,8 @@ outputs:1, icon: "rbe.png", label: function() { - var ll = (this.func||"").replace("Eq","").replace("rbei","rbe")||"rbe"; - return this.name||ll||"rbe"; + var ll = (this.func||"").replace("Eq","").replace("rbei","rbe")||this._("rbe.rbe"); + return this.name||ll||this._("rbe.rbe"); }, labelStyle: function() { return this.name?"node_label_italic":""; diff --git a/social/email/61-email.html b/social/email/61-email.html index aff990e7..7f5b1c00 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -245,8 +245,11 @@ inputs:0, outputs:1, icon: "envelope.png", + paletteLabel: function() { + return this.name||this._("email.email"); + }, label: function() { - return this.name||"email"; + return this.name||this._("email.email"); }, labelStyle: function() { return (this.name)?"node_label_italic":""; diff --git a/social/email/locales/en-US/61-email.json b/social/email/locales/en-US/61-email.json index a3d1c318..b7045623 100644 --- a/social/email/locales/en-US/61-email.json +++ b/social/email/locales/en-US/61-email.json @@ -1,5 +1,6 @@ { "email": { + "email": "email", "label": { "to": "To", "server": "Server", diff --git a/social/email/package.json b/social/email/package.json index 9d107473..fffb41bd 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "0.1.26", + "version": "0.1.27", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "nodemailer": "^1.11.0", diff --git a/social/feedparser/32-feedparse.html b/social/feedparser/32-feedparse.html index 3581c75e..2175ad4a 100644 --- a/social/feedparser/32-feedparse.html +++ b/social/feedparser/32-feedparse.html @@ -35,7 +35,7 @@ outputs:1, icon: "feed.png", label: function() { - return this.name||this.url||"feedparser"; + return this.name||this.url||this._("feedparse.feedparse"); }, labelStyle: function() { return this.name?"node_label_italic":""; diff --git a/social/feedparser/locales/en-US/32-feedparse.json b/social/feedparser/locales/en-US/32-feedparse.json index af751a4f..2a5fd943 100644 --- a/social/feedparser/locales/en-US/32-feedparse.json +++ b/social/feedparser/locales/en-US/32-feedparse.json @@ -1,5 +1,6 @@ { "feedparse": { + "feedparse": "feedparser", "label": { "feedurl": "Feed url", "refresh": "Refresh", diff --git a/social/feedparser/package.json b/social/feedparser/package.json index 1b990d8e..cc47eba5 100644 --- a/social/feedparser/package.json +++ b/social/feedparser/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-feedparser", - "version": "0.1.11", + "version": "0.1.12", "description": "A Node-RED node to get RSS Atom feeds.", "dependencies": { "feedparser": "^2.2.9", diff --git a/utility/daemon/daemon.html b/utility/daemon/daemon.html index 6e7a5d8d..1b2f6963 100644 --- a/utility/daemon/daemon.html +++ b/utility/daemon/daemon.html @@ -64,7 +64,7 @@ icon: "arrow-in.png", align: "right", label: function() { - return this.name||this.command; + return this.name||this.command||"daemon"; }, labelStyle: function() { return this.name?"node_label_italic":""; diff --git a/utility/daemon/package.json b/utility/daemon/package.json index 089a8c26..b1ec9adc 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.18", + "version" : "0.0.19", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From d28c5291c0a1b22eb381498e0c87e39a173a3c34 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 30 Mar 2018 14:53:25 +0100 Subject: [PATCH 042/456] bump daemon node package --- utility/daemon/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/daemon/package.json b/utility/daemon/package.json index b1ec9adc..67544484 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.19", + "version" : "0.0.20", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From 99b83ea4bd88c0fd12b18ecc9be5a477fd9eb75b Mon Sep 17 00:00:00 2001 From: borpin Date: Tue, 10 Apr 2018 12:19:41 +0100 Subject: [PATCH 043/456] io/emoncms - Modify HTTP Timeout (#430) * Modify HTTP timeout Increase the HTTP Timeout values from 1000 to 6000. Modify error message. --- io/emoncms/88-emoncms.js | 4 ++-- io/emoncms/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/io/emoncms/88-emoncms.js b/io/emoncms/88-emoncms.js index 481ce1cd..b947e344 100644 --- a/io/emoncms/88-emoncms.js +++ b/io/emoncms/88-emoncms.js @@ -138,8 +138,8 @@ module.exports = function(RED) { node.error(e,msg); node.status({fill:"red",shape:"dot",text:"HTTP Error"}); }); - request.setTimeout(1000, function() { - node.error("timeout: " + msg); + request.setTimeout(6000, function() { + node.error("HTTP Timeout",msg); node.status({fill:"red",shape:"ring",text:"HTTP Timeout"}); }); }); diff --git a/io/emoncms/package.json b/io/emoncms/package.json index 926908fe..0a52b7ac 100644 --- a/io/emoncms/package.json +++ b/io/emoncms/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-emoncms", - "version" : "0.2.0", + "version" : "0.2.1", "description" : "A Node-RED node to fetch/post data to/from emoncms", "dependencies" : { }, From 025f97206f71d8136f692a45c232a348dfd45b4b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 14 Apr 2018 22:43:14 +0100 Subject: [PATCH 044/456] tidy some labels --- function/datagenerator/datagenerator.html | 4 +++- function/datagenerator/locales/en-US/datagenerator.json | 1 + io/ping/88-ping.html | 3 +++ io/ping/locales/en-US/88-ping.json | 1 + io/ping/locales/ja/88-ping.json | 1 + social/email/61-email.html | 5 ++++- social/email/package.json | 2 +- social/feedparser/32-feedparse.html | 3 +++ social/feedparser/package.json | 2 +- 9 files changed, 18 insertions(+), 4 deletions(-) diff --git a/function/datagenerator/datagenerator.html b/function/datagenerator/datagenerator.html index edfabacc..d983d36d 100644 --- a/function/datagenerator/datagenerator.html +++ b/function/datagenerator/datagenerator.html @@ -40,7 +40,6 @@ RED.nodes.registerType('data-generator',{ color:"rgb(243, 181, 103)", category: 'function', - paletteLabel:"data generator", defaults: { name: {value:""}, field: {value:"payload"}, @@ -51,6 +50,9 @@ inputs:1, outputs:1, icon: "template.png", + paletteLabel: function() { + return this._("datagen.datagen"); + }, label: function() { return this.name || "data generator"; }, diff --git a/function/datagenerator/locales/en-US/datagenerator.json b/function/datagenerator/locales/en-US/datagenerator.json index dffd35b3..2c038a2c 100644 --- a/function/datagenerator/locales/en-US/datagenerator.json +++ b/function/datagenerator/locales/en-US/datagenerator.json @@ -1,5 +1,6 @@ { "datagen": { + "datagen": "datagenerator", "label": { "syntax": "Return", "text": "a text string", diff --git a/io/ping/88-ping.html b/io/ping/88-ping.html index 32959eeb..ad1e2d26 100644 --- a/io/ping/88-ping.html +++ b/io/ping/88-ping.html @@ -33,6 +33,9 @@ inputs:0, outputs:1, icon: "alert.png", + paletteLabel: function() { + return this._("ping.ping"); + }, label: function() { return this.name||this.host; }, diff --git a/io/ping/locales/en-US/88-ping.json b/io/ping/locales/en-US/88-ping.json index 209e9da4..bcff8820 100644 --- a/io/ping/locales/en-US/88-ping.json +++ b/io/ping/locales/en-US/88-ping.json @@ -1,5 +1,6 @@ { "ping": { + "ping": "ping", "label": { "target": "Target", "ping": "Ping (S)" diff --git a/io/ping/locales/ja/88-ping.json b/io/ping/locales/ja/88-ping.json index 46478887..7b39cf3d 100644 --- a/io/ping/locales/ja/88-ping.json +++ b/io/ping/locales/ja/88-ping.json @@ -1,5 +1,6 @@ { "ping": { + "ping": "ping", "label": { "target": "対象", "ping": "Ping (秒)" diff --git a/social/email/61-email.html b/social/email/61-email.html index 7f5b1c00..d4598639 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -93,6 +93,9 @@ outputs:0, icon: "envelope.png", align: "right", + paletteLabel: function() { + return this._("email.email"); + }, label: function() { return this.dname||this.name||"email"; }, @@ -246,7 +249,7 @@ outputs:1, icon: "envelope.png", paletteLabel: function() { - return this.name||this._("email.email"); + return this._("email.email"); }, label: function() { return this.name||this._("email.email"); diff --git a/social/email/package.json b/social/email/package.json index fffb41bd..e224efc9 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "0.1.27", + "version": "0.1.28", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "nodemailer": "^1.11.0", diff --git a/social/feedparser/32-feedparse.html b/social/feedparser/32-feedparse.html index 2175ad4a..0b815d5b 100644 --- a/social/feedparser/32-feedparse.html +++ b/social/feedparser/32-feedparse.html @@ -34,6 +34,9 @@ inputs:0, outputs:1, icon: "feed.png", + paletteLabel: function() { + return this._("feedparse.feedparse"); + }, label: function() { return this.name||this.url||this._("feedparse.feedparse"); }, diff --git a/social/feedparser/package.json b/social/feedparser/package.json index cc47eba5..747710fb 100644 --- a/social/feedparser/package.json +++ b/social/feedparser/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-feedparser", - "version": "0.1.12", + "version": "0.1.13", "description": "A Node-RED node to get RSS Atom feeds.", "dependencies": { "feedparser": "^2.2.9", From 0f55fc160e828013aa668e9d30374fae0b807b9d Mon Sep 17 00:00:00 2001 From: cymplecy Date: Sat, 14 Apr 2018 23:17:12 +0100 Subject: [PATCH 045/456] Add Gamma flag and Brightness control to node-red-node-pi-neopixel (#431) --- hardware/neopixel/neopix.py | 16 ++++++++++++++-- hardware/neopixel/neopixel.html | 24 +++++++++++++++++++++++- hardware/neopixel/neopixel.js | 12 ++++++++++-- hardware/neopixel/package.json | 29 ++++++++++++++++------------- 4 files changed, 63 insertions(+), 18 deletions(-) mode change 100644 => 100755 hardware/neopixel/neopixel.html mode change 100644 => 100755 hardware/neopixel/neopixel.js mode change 100644 => 100755 hardware/neopixel/package.json diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index 7f92fefb..ed1b51fb 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -36,9 +36,12 @@ LED_GAMMA = [ 222,224,227,229,231,233,235,237,239,241,244,246,248,250,252,255] -LED_COUNT = int(sys.argv[1]) -WAIT_MS = int(sys.argv[2]) +LED_COUNT = max(0,int(sys.argv[1])) +WAIT_MS = max(0,int(sys.argv[2])) MODE = sys.argv[3] +LED_BRIGHTNESS = min(255,int(max(0,float(sys.argv[4])) * 255 / 100)) +if (sys.argv[5].lower() != "true"): + LED_GAMMA = range(256) def getRGBfromI(RGBint): blue = RGBint & 255 @@ -59,6 +62,12 @@ def setPixels(strip, s, e, color, wait_ms=30): strip.show() time.sleep(wait_ms/1000.0) +def setBrightness(strip, brightness, wait_ms=30): + """Set overall brighness""" + strip.setBrightness(brightness) + strip.show() + time.sleep(wait_ms/1000.0) + def colorWipe(strip, color, wait_ms=30): """Wipe color across display a pixel at a time.""" for i in range(strip.numPixels()): @@ -145,6 +154,9 @@ if __name__ == '__main__': try: data = raw_input() bits = data.split(',') + if len(bits) == 2: + if bits[0] == "brightness": + setBrightness(strip, min(255,max(0,int(bits[1]))), WAIT_MS) if len(bits) == 3: if MODE == "shiftu": shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) diff --git a/hardware/neopixel/neopixel.html b/hardware/neopixel/neopixel.html old mode 100644 new mode 100755 index 43492c85..794599df --- a/hardware/neopixel/neopixel.html +++ b/hardware/neopixel/neopixel.html @@ -31,6 +31,16 @@

+
+ +  (0-100) +
+
+ + +

@@ -53,6 +63,8 @@

A range of pixels from x to y can be set by msg.payload with a CSV string x,y,r,g,b +

By default, gamma correction is enabled but it can disabled which can be useful for working with low brightness levels

+

msg.brightness can be used to dynamically set brightness level

The pixels data line should be connected to Pi physical pin 12 - GPIO 18. Note: this may conflict with audio playback.

More info  

@@ -69,7 +81,9 @@ fgnd: { value:"" }, wipe: { value:"40", required:true, validate:RED.validators.number() }, mode: { value:"pcent" }, - rgb: { value:"rgb" } + rgb: { value:"rgb" }, + brightness: { value:"100", required:true, validate:RED.validators.number() }, + gamma: { value: true } }, inputs:1, outputs:0, @@ -82,6 +96,14 @@ return this.name?"node_label_italic":""; }, oneditprepare: function() { + if (this.gamma === undefined) { + this.gamma = true; + $("#node-input-gamma").prop('checked', true); + } + if (this.brightness === undefined) { + this.brighness = "100"; + $("#node-input-brightness").val("100"); + } var setstate = function () { if ($('#node-input-mode').val().indexOf("shift") !== -1) { $("#bgcol").hide(); diff --git a/hardware/neopixel/neopixel.js b/hardware/neopixel/neopixel.js old mode 100644 new mode 100755 index 85980bb2..7ed79365 --- a/hardware/neopixel/neopixel.js +++ b/hardware/neopixel/neopixel.js @@ -35,8 +35,13 @@ module.exports = function(RED) { this.fgnd = n.fgnd || "128,128,128"; this.mode = n.mode || "pcent"; this.rgb = n.rgb || "rgb"; + this.gamma = n.gamma; + if (this.gamma === undefined) { this.gamma = true; } + this.brightness = Number(n.brightness || 100); this.wipe = Number(n.wipe || 40); if (this.wipe < 0) { this.wipe = 0; } + if (this.brightness < 0) { this.brightness = 0; } + if (this.brightness > 100) { this.brightness = 100; } var node = this; var needle = "255,255,255"; //var p1 = /^\#[A-Fa-f0-9]{6}$/ @@ -45,6 +50,9 @@ module.exports = function(RED) { var p4 = /^[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+$/ function inputlistener(msg) { + if (msg.hasOwnProperty("brightness")) { + node.child.stdin.write("brightness,"+msg.brightness.toString()+"\n"); + } if (msg.hasOwnProperty("payload")) { var pay = msg.payload.toString().toUpperCase(); var parts = pay.split(","); @@ -101,8 +109,8 @@ module.exports = function(RED) { else { node.warn("Invalid payload : "+pay); } } } - - node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]); + node.warn("GAMMA: "+node.gamma); + node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode, node.brightness, node.gamma]); node.status({fill:"green",shape:"dot",text:"ok"}); node.on("input", inputlistener); diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json old mode 100644 new mode 100755 index 2f8e5e20..ae9a8475 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,22 +1,25 @@ { - "name" : "node-red-node-pi-neopixel", - "version" : "0.0.16", - "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", - "dependencies" : { - }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/tree/master/hardware/neopixel" + "name": "node-red-node-pi-neopixel", + "version": "0.0.17", + "description": "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/hardware/neopixel" }, "license": "Apache-2.0", - "keywords": [ "node-red", "ws2812", "neopixel" ], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "ws2812", + "neopixel" + ], + "node-red": { + "nodes": { "rpi-neopixels": "neopixel.js" } }, - "scripts" : { - "postinstall" : "scripts/checklib.js" + "scripts": { + "postinstall": "scripts/checklib.js" }, "author": { "name": "Dave Conway-Jones", From ace67b015439d05e7520839bbe9ae877116157fb Mon Sep 17 00:00:00 2001 From: cymplecy Date: Sun, 15 Apr 2018 11:09:32 +0100 Subject: [PATCH 046/456] Neopixel node:Remove node.warn message and update README.md (#433) --- hardware/neopixel/README.md | 12 ++++++++++++ hardware/neopixel/neopixel.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) mode change 100644 => 100755 hardware/neopixel/README.md diff --git a/hardware/neopixel/README.md b/hardware/neopixel/README.md old mode 100644 new mode 100755 index e14ed032..e4a71cf9 --- a/hardware/neopixel/README.md +++ b/hardware/neopixel/README.md @@ -66,3 +66,15 @@ where r, g and b are 0-255. A range of pixels from position `x` to `y` can be set by `msg.payload` with a CSV string `x,y,r,g,b` + +#### Brightness + +The overall brightness of the pixels can be set to a level in the 0-100 range (0 being off, 100 being full brightness). +It can also be set via `msg.brightness` +The default level is 100 (full brightness) + +#### Gamma correction + +The node uses gamma correction to display colours as naturally as possible. +This can be disabled if required. (e.g when working with low brightness levels) + diff --git a/hardware/neopixel/neopixel.js b/hardware/neopixel/neopixel.js index 7ed79365..25207c29 100755 --- a/hardware/neopixel/neopixel.js +++ b/hardware/neopixel/neopixel.js @@ -109,7 +109,7 @@ module.exports = function(RED) { else { node.warn("Invalid payload : "+pay); } } } - node.warn("GAMMA: "+node.gamma); + node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode, node.brightness, node.gamma]); node.status({fill:"green",shape:"dot",text:"ok"}); From acc2dc1a1445ee6730a781f83f596d5d4f4a6e3a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 15 Apr 2018 11:24:56 +0100 Subject: [PATCH 047/456] Allow a bunch of Pi nodes to be visible but not active when used not on a Pi --- hardware/LEDborg/78-ledborg.js | 97 ++++++++++-------- hardware/LEDborg/package.json | 2 +- hardware/PiLcd/package.json | 2 +- hardware/PiLcd/pilcd.js | 123 ++++++++++++---------- hardware/PiLiter/39-rpi-piliter.js | 159 +++++++++++++++-------------- hardware/PiLiter/package.json | 2 +- hardware/PiSrf/nrsrf.py | 4 +- hardware/PiSrf/package.json | 2 +- hardware/PiSrf/pisrf.js | 120 ++++++++++++---------- hardware/neopixel/neopixel.js | 118 ++++++++++++--------- hardware/neopixel/package.json | 15 +-- hardware/pigpiod/package.json | 2 +- hardware/pigpiod/pi-gpiod.js | 22 ++-- hardware/unicorn/package.json | 2 +- hardware/unicorn/unicorn.js | 113 +++++++++++--------- 15 files changed, 428 insertions(+), 355 deletions(-) diff --git a/hardware/LEDborg/78-ledborg.js b/hardware/LEDborg/78-ledborg.js index dea2ebe9..2ff233a8 100644 --- a/hardware/LEDborg/78-ledborg.js +++ b/hardware/LEDborg/78-ledborg.js @@ -8,23 +8,26 @@ module.exports = function(RED) { var LedBorgInUse = false; var gpioCommand = __dirname+'/nrgpio'; + var allOK = true; try { var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); - if (cpuinfo.indexOf(": BCM") === -1) { throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); } + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("ledborg : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { + RED.log.warn("ledborg : "+RED._("node-red:rpi-gpio.errors.libnotfound")); + allOK = false; + } + else if ( !(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { + RED.log.warn("ledborg : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:gpioCommand})); + allOK = false; + } } catch(err) { - throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); - } - - if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { - util.log("[rpi-ledborg] Info : Can't find RPi.GPIO python library."); - throw "Warning : Can't find RPi.GPIO python library."; - } - - if ( !(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { - util.log("[rpi-ledborg] Error : "+gpioCommand+" needs to be executable."); - throw "Error : nrgpio must to be executable."; + RED.log.warn("ledborg : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } // GPIO pins 11 (R), 13 (G), 15 (B). @@ -95,46 +98,50 @@ module.exports = function(RED) { } } - node.child = spawn(gpioCommand, ["borg","11"]); - node.running = true; - node.status({fill:"green",shape:"dot",text:"OK"}); + if (allOK === true) { + node.child = spawn(gpioCommand, ["borg","11"]); + node.running = true; + node.status({fill:"green",shape:"dot",text:"OK"}); - node.on("input", inputlistener); + node.on("input", inputlistener); - node.child.stdout.on('data', function (data) { - if (RED.settings.verbose) { node.log("out: "+data+" :"); } - }); + node.child.stdout.on('data', function (data) { + if (RED.settings.verbose) { node.log("out: "+data+" :"); } + }); - node.child.stderr.on('data', function (data) { - if (RED.settings.verbose) { node.log("err: "+data+" :"); } - }); + node.child.stderr.on('data', function (data) { + if (RED.settings.verbose) { node.log("err: "+data+" :"); } + }); - node.child.on('close', function () { - node.child = null; - node.running = false; - node.status({fill:"red",shape:"circle",text:""}); - if (RED.settings.verbose) { node.log("closed"); } - if (node.done) { node.done(); } - }); + node.child.on('close', function () { + node.child = null; + node.running = false; + node.status({fill:"red",shape:"circle",text:""}); + if (RED.settings.verbose) { node.log("closed"); } + if (node.done) { node.done(); } + }); - node.child.on('error', function (err) { - if (err.errno === "ENOENT") { node.warn('Command not found'); } - else if (err.errno === "EACCES") { node.warn('Command not executable'); } - else { node.log('error: ' + err); } - }); + node.child.on('error', function (err) { + if (err.errno === "ENOENT") { node.warn('Command not found'); } + else if (err.errno === "EACCES") { node.warn('Command not executable'); } + else { node.log('error: ' + err); } + }); - node.on("close", function(done) { + node.on("close", function(done) { + LedBorgInUse = false; + node.status({fill:"red",shape:"circle",text:""}); + if (node.child != null) { + node.done = done; + node.child.stdin.write(" close 11"); + node.child.kill('SIGKILL'); + } + else { done(); } + }); + } + else { LedBorgInUse = false; - node.status({fill:"red",shape:"circle",text:""}); - if (node.child != null) { - node.done = done; - node.child.stdin.write(" close 11"); - node.child.kill('SIGKILL'); - } - else { done(); } - - }); - + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + } } RED.nodes.registerType("ledborg",LedBorgNode); } diff --git a/hardware/LEDborg/package.json b/hardware/LEDborg/package.json index 787b388a..f291c0fe 100644 --- a/hardware/LEDborg/package.json +++ b/hardware/LEDborg/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ledborg", - "version" : "0.0.18", + "version" : "0.0.19", "description" : "A Node-RED node to control a PiBorg LedBorg board for a Raspberry Pi.", "dependencies" : { }, diff --git a/hardware/PiLcd/package.json b/hardware/PiLcd/package.json index 22668892..2df7e705 100644 --- a/hardware/PiLcd/package.json +++ b/hardware/PiLcd/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pilcd", - "version" : "0.0.8", + "version" : "0.0.9", "description" : "A Node-RED node for Raspberry Pi to write to HD44780 style LCD panels.", "dependencies" : { }, diff --git a/hardware/PiLcd/pilcd.js b/hardware/PiLcd/pilcd.js index 0ecde55d..2dcfd72b 100644 --- a/hardware/PiLcd/pilcd.js +++ b/hardware/PiLcd/pilcd.js @@ -6,20 +6,26 @@ module.exports = function(RED) { var fs = require('fs'); var gpioCommand = __dirname + '/nrlcd'; + var allOK = true; - if (!fs.existsSync("/dev/ttyAMA0")) { // unlikely if not on a Pi - //util.log("Info : Ignoring Raspberry Pi specific node."); - throw "Info : Ignoring Raspberry Pi specific node."; + try { + var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("rpi-lcd : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { + RED.log.warn("rpi-lcd : "+RED._("node-red:rpi-gpio.errors.libnotfound")); + allOK = false; + } + else if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + RED.log.warn("rpi-lcd : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:gpioCommand})); + allOK = false; + } } - - if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { - util.log("[rpi-lcd] Info : Can't find Pi RPi.GPIO python library."); - throw "Warning : Can't find Pi RPi.GPIO python library."; - } - - if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { - util.log("[rpi-lcd] Error : " + gpioCommand + " needs to be executable."); - throw "Error : " + gpioCommand + " must to be executable."; + catch(err) { + RED.log.warn("rpi-lcd : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } function PiLcdNode(n) { @@ -33,54 +39,61 @@ module.exports = function(RED) { else { node.warn("Command not running"); } } - if (node.pins !== undefined) { - node.child = spawn(gpioCommand, [node.pins]); - node.running = true; - if (RED.settings.verbose) { node.log("pin: " + node.pins + " :"); } - node.on("input", inputlistener); + if (allOK === true) { + if (node.pins !== undefined) { + node.child = spawn(gpioCommand, [node.pins]); + node.running = true; + if (RED.settings.verbose) { node.log("pin: " + node.pins + " :"); } + node.on("input", inputlistener); - node.child.stdout.on('data', function(data) { - if (RED.settings.verbose) { node.log("out: " + data + " :"); } + node.child.stdout.on('data', function(data) { + if (RED.settings.verbose) { node.log("out: " + data + " :"); } + }); + + node.child.stderr.on('data', function(data) { + if (RED.settings.verbose) { node.log("err: " + data + " :"); } + }); + + node.child.on('close', function(code) { + if (RED.settings.verbose) { node.log("ret: " + code + " :"); } + node.child = null; + node.running = false; + }); + + node.child.on('error', function(err) { + if (err.errno === "ENOENT") { node.warn('Command not found'); } + else if (err.errno === "EACCES") { node.warn('Command not executable'); } + else { node.log('error: ' + err); } + }); + + } + else { + node.error("Invalid GPIO pins: " + node.pin); + } + + var wfi = function(done) { + if (!node.running) { + if (RED.settings.verbose) { node.log("end"); } + done(); + return; + } + setTimeout(function() { wfi(done); }, 333); + } + + node.on("close", function(done) { + if (node.child != null) { + node.child.stdin.write("c:lose" + node.pin); + node.child.kill('SIGKILL'); + } + wfi(done); }); - - node.child.stderr.on('data', function(data) { - if (RED.settings.verbose) { node.log("err: " + data + " :"); } - }); - - node.child.on('close', function(code) { - if (RED.settings.verbose) { node.log("ret: " + code + " :"); } - node.child = null; - node.running = false; - }); - - node.child.on('error', function(err) { - if (err.errno === "ENOENT") { node.warn('Command not found'); } - else if (err.errno === "EACCES") { node.warn('Command not executable'); } - else { node.log('error: ' + err); } - }); - } else { - node.error("Invalid GPIO pins: " + node.pin); + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + node.on("input", function(msg){ + node.status({fill:"grey",shape:"dot",text:RED._("node-red:rpi-gpio.status.na",{value:msg.payload.toString()})}); + }); } - - var wfi = function(done) { - if (!node.running) { - if (RED.settings.verbose) { node.log("end"); } - done(); - return; - } - setTimeout(function() { wfi(done); }, 333); - } - - node.on("close", function(done) { - if (node.child != null) { - node.child.stdin.write("c:lose" + node.pin); - node.child.kill('SIGKILL'); - } - wfi(done); - }); - } RED.nodes.registerType("rpi-lcd", PiLcdNode); } diff --git a/hardware/PiLiter/39-rpi-piliter.js b/hardware/PiLiter/39-rpi-piliter.js index ac6b1ec9..5c069824 100644 --- a/hardware/PiLiter/39-rpi-piliter.js +++ b/hardware/PiLiter/39-rpi-piliter.js @@ -6,20 +6,26 @@ module.exports = function(RED) { var fs = require('fs'); var gpioCommand = __dirname+'/nrgpio.py'; + var allOK = true; - if (!fs.existsSync("/dev/ttyAMA0")) { // unlikely if not on a Pi - //util.log("Info : Ignoring Raspberry Pi specific node."); - throw "Info : Ignoring Raspberry Pi specific node."; + try { + var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("rpi-liter : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { + RED.log.warn("rpi-liter : "+RED._("node-red:rpi-gpio.errors.libnotfound")); + allOK = false; + } + else if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + RED.log.warn("rpi-liter : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:gpioCommand})); + allOK = false; + } } - - if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { - util.log("[rpi-gpio] Info : Can't find Pi RPi.GPIO python library."); - throw "Warning : Can't find Pi RPi.GPIO python library."; - } - - if ( !(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { - util.log("[rpi-gpio] Error : "+gpioCommand+" needs to be executable."); - throw "Error : " + gpioCommand + " must to be executable."; + catch(err) { + RED.log.warn("rpi-liter : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } function PiLiter(n) { @@ -28,75 +34,80 @@ module.exports = function(RED) { this.dir = (n.dir ? 1 : 0) || 0; var node = this; - if (this.pinv === "bar") { - node.child = spawn(gpioCommand, ["byte",node.dir]); - node.on("input", function(msg) { - var out = Number(msg.payload); - if ((out >= 1) && (out <= 8)) { out = Math.pow(2, out) - 1; } - else { out = 0; } - if (node.child !== null) { node.child.stdin.write(out+"\n"); } - else { node.warn("Command not running"); } - }); - } - else if (this.pinv === "meter") { - node.child = spawn(gpioCommand, ["byte",node.dir]); - node.on("input", function(msg) { - var out = Number(msg.payload); - if ((out >= 1) && (out <= 8)) { out = Math.pow(2, (out-1)); } - else { out = 0; } - if (node.child !== null) { node.child.stdin.write(out+"\n"); } - else { node.warn("Command not running"); } - }); - } - else if (this.pinv === "all") { - node.child = spawn(gpioCommand, ["byte",node.dir]); - node.on("input", function(msg) { - var out = msg.payload; - if ((out === 1)|(out === true)|(out === "1")|(out === "on")) { - out = 255; - } - else { out = 0; } - if (node.child !== null) { node.child.stdin.write(out+"\n"); } - else { node.warn("Command not running"); } - }); - } - else if (this.pinv === "pin") { - node.child = spawn(gpioCommand, ["byte",node.dir]); - var byte = 0; - node.on("input", function(msg) { - if (typeof msg.payload === "object") { - var out = Number(msg.payload.led); - var l = Number(msg.payload.state); - if ((out >= 1) && (out <= 8)) { - out = (Math.pow(2, (out-1))); - if (l === 0) { byte = (byte & (~out) & 255); } - else { byte = (byte | out) & 255; } - if (node.child !== null) { node.child.stdin.write(byte+"\n"); } - else { node.warn("Command not running"); } + if (allOK === true) { + if (this.pinv === "bar") { + node.child = spawn(gpioCommand, ["byte",node.dir]); + node.on("input", function(msg) { + var out = Number(msg.payload); + if ((out >= 1) && (out <= 8)) { out = Math.pow(2, out) - 1; } + else { out = 0; } + if (node.child !== null) { node.child.stdin.write(out+"\n"); } + else { node.warn("Command not running"); } + }); + } + else if (this.pinv === "meter") { + node.child = spawn(gpioCommand, ["byte",node.dir]); + node.on("input", function(msg) { + var out = Number(msg.payload); + if ((out >= 1) && (out <= 8)) { out = Math.pow(2, (out-1)); } + else { out = 0; } + if (node.child !== null) { node.child.stdin.write(out+"\n"); } + else { node.warn("Command not running"); } + }); + } + else if (this.pinv === "all") { + node.child = spawn(gpioCommand, ["byte",node.dir]); + node.on("input", function(msg) { + var out = msg.payload; + if ((out === 1)|(out === true)|(out === "1")|(out === "on")) { + out = 255; + } + else { out = 0; } + if (node.child !== null) { node.child.stdin.write(out+"\n"); } + else { node.warn("Command not running"); } + }); + } + else if (this.pinv === "pin") { + node.child = spawn(gpioCommand, ["byte",node.dir]); + var byte = 0; + node.on("input", function(msg) { + if (typeof msg.payload === "object") { + var out = Number(msg.payload.led); + var l = Number(msg.payload.state); + if ((out >= 1) && (out <= 8)) { + out = (Math.pow(2, (out-1))); + if (l === 0) { byte = (byte & (~out) & 255); } + else { byte = (byte | out) & 255; } + if (node.child !== null) { node.child.stdin.write(byte+"\n"); } + else { node.warn("Command not running"); } + } + else { node.warn("Not a valid object - see Info panel."); } } else { node.warn("Not a valid object - see Info panel."); } + }); + } + else { + node.child = spawn(gpioCommand, ["byte",node.dir]); + node.on("input", function(msg) { + var out = Number(msg.payload); + if ((out >= 0) && (out <= 255)) { + if (node.child !== null) { node.child.stdin.write(out+"\n"); } + else { node.warn("Command not running"); } + } + else { node.warn("Invalid input - not between 0 and 255"); } + }); + } + + node.on("close", function() { + if (node.child != null) { + node.child.kill('SIGKILL'); } - else { node.warn("Not a valid object - see Info panel."); } + if (RED.settings.verbose) { node.log("end"); } }); } else { - node.child = spawn(gpioCommand, ["byte",node.dir]); - node.on("input", function(msg) { - var out = Number(msg.payload); - if ((out >= 0) && (out <= 255)) { - if (node.child !== null) { node.child.stdin.write(out+"\n"); } - else { node.warn("Command not running"); } - } - else { node.warn("Invalid input - not between 0 and 255"); } - }); + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); } - - node.on("close", function() { - if (node.child != null) { - node.child.kill('SIGKILL'); - } - if (RED.settings.verbose) { node.log("end"); } - }); } RED.nodes.registerType("rpi-liter",PiLiter); } diff --git a/hardware/PiLiter/package.json b/hardware/PiLiter/package.json index ea7a7143..2b9f059e 100644 --- a/hardware/PiLiter/package.json +++ b/hardware/PiLiter/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-piliter", - "version" : "0.0.11", + "version" : "0.0.12", "description" : "A Node-RED node to drive a Raspberry Pi Pi-LITEr 8 LED board.", "dependencies" : { }, diff --git a/hardware/PiSrf/nrsrf.py b/hardware/PiSrf/nrsrf.py index d21e9f56..efb5a1f2 100755 --- a/hardware/PiSrf/nrsrf.py +++ b/hardware/PiSrf/nrsrf.py @@ -31,7 +31,7 @@ def Measure(): # else: # print("Echo start detected") start = time.time() - + GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=400) if channel is None: print("Ultrasonic sensor timed out (post-echo).") @@ -40,7 +40,7 @@ def Measure(): # else: # print("Echo finish detected") stop = time.time() - + elapsed = stop-start distance = (elapsed * 34300)/2 # Using speed of sound at 20C (68F) diff --git a/hardware/PiSrf/package.json b/hardware/PiSrf/package.json index 0efbd041..5b865604 100644 --- a/hardware/PiSrf/package.json +++ b/hardware/PiSrf/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pisrf", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node for a Raspberry Pi to use a SRF04 or SRF05 range finder", "dependencies" : { }, diff --git a/hardware/PiSrf/pisrf.js b/hardware/PiSrf/pisrf.js index 10a8a9d9..6fa23377 100644 --- a/hardware/PiSrf/pisrf.js +++ b/hardware/PiSrf/pisrf.js @@ -6,20 +6,26 @@ module.exports = function(RED) { var fs = require('fs'); var gpioCommand = __dirname + '/nrsrf.py'; + var allOK = true; - if (!fs.existsSync("/dev/ttyAMA0")) { // unlikely if not on a Pi - //util.log("Info : Ignoring Raspberry Pi specific node."); - throw "Info : Ignoring Raspberry Pi specific node."; + try { + var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("rpi-srf : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { + RED.log.warn("rpi-srf : "+RED._("node-red:rpi-gpio.errors.libnotfound")); + allOK = false; + } + else if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + RED.log.warn("rpi-srf : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:gpioCommand})); + allOK = false; + } } - - if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { - util.log("[rpi-srf] Info : Can't find Pi RPi.GPIO python library."); - throw "Warning : Can't find Pi RPi.GPIO python library."; - } - - if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { - util.log("[rpi-srf] Error : " + gpioCommand + " needs to be executable."); - throw "Error : " + gpioCommand + " must to be executable."; + catch(err) { + RED.log.warn("rpi-srf : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } function PiSrfNode(n) { @@ -29,56 +35,60 @@ module.exports = function(RED) { this.pins += ","+(n.pulse || 0.5); var node = this; - if (node.pins !== undefined) { - node.child = spawn(gpioCommand, [node.pins]); - node.running = true; - if (RED.settings.verbose) { node.log("parameters: " + node.pins + " :"); } + if (allOK === true) { + if (node.pins !== undefined) { + node.child = spawn(gpioCommand, [node.pins]); + node.running = true; + if (RED.settings.verbose) { node.log("parameters: " + node.pins + " :"); } - node.child.stdout.on('data', function(data) { - if (RED.settings.verbose) { node.log("out: " + data + " :"); } - data = data.toString().trim(); - if (data.length > 0) { - node.send({topic:node.topic, payload:data}); + node.child.stdout.on('data', function(data) { + if (RED.settings.verbose) { node.log("out: " + data + " :"); } + data = data.toString().trim(); + if (data.length > 0) { + node.send({topic:node.topic, payload:data}); + } + }); + + node.child.stderr.on('data', function(data) { + if (RED.settings.verbose) { node.log("err: " + data + " :"); } + }); + + node.child.on('close', function(code) { + if (RED.settings.verbose) { node.log("ret: " + code + " :"); } + node.child = null; + node.running = false; + }); + + node.child.on('error', function(err) { + if (err.errno === "ENOENT") { node.warn('Command not found'); } + else if (err.errno === "EACCES") { node.warn('Command not executable'); } + else { node.log('error: ' + err); } + }); + + } + else { + node.error("Invalid Parameters: " + node.pins); + } + + var wfi = function(done) { + if (!node.running) { + if (RED.settings.verbose) { node.log("end"); } + done(); + return; } - }); + setTimeout(function() { wfi(done); }, 333); + } - node.child.stderr.on('data', function(data) { - if (RED.settings.verbose) { node.log("err: " + data + " :"); } + node.on("close", function(done) { + if (node.child != null) { + node.child.kill('SIGKILL'); + } + wfi(done); }); - - node.child.on('close', function(code) { - if (RED.settings.verbose) { node.log("ret: " + code + " :"); } - node.child = null; - node.running = false; - }); - - node.child.on('error', function(err) { - if (err.errno === "ENOENT") { node.warn('Command not found'); } - else if (err.errno === "EACCES") { node.warn('Command not executable'); } - else { node.log('error: ' + err); } - }); - } else { - node.error("Invalid Parameters: " + node.pins); + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); } - - var wfi = function(done) { - if (!node.running) { - if (RED.settings.verbose) { node.log("end"); } - done(); - return; - } - setTimeout(function() { wfi(done); }, 333); - } - - node.on("close", function(done) { - if (node.child != null) { - node.child.kill('SIGKILL'); - } - wfi(done); - }); - } RED.nodes.registerType("rpi-srf", PiSrfNode); } diff --git a/hardware/neopixel/neopixel.js b/hardware/neopixel/neopixel.js index 25207c29..bb973b85 100755 --- a/hardware/neopixel/neopixel.js +++ b/hardware/neopixel/neopixel.js @@ -6,23 +6,26 @@ module.exports = function(RED) { var fs = require('fs'); var colors = require('./colours.js'); var piCommand = __dirname+'/neopix'; + var allOK = true; try { var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); - if (cpuinfo.indexOf(": BCM") === -1) { throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); } + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("rpi-neopixels : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (execSync('python -c "import neopixel"').toString() !== "") { + RED.log.warn("rpi-neopixels : Can't find neopixel python library"); + allOK = false; + } + else if (!(1 & parseInt ((fs.statSync(piCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + RED.log.warn("rpi-neopixels : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:piCommand})); + allOK = false; + } } catch(err) { - throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); - } - - if (execSync('python -c "import neopixel"').toString() !== "") { - RED.log.warn("Can't find neopixel python library"); - throw "Warning : Can't find neopixel python library"; - } - - if ( !(1 & parseInt ((fs.statSync(piCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { - RED.log.error(piCommand + " command is not executable"); - throw "Error : "+RED._("rpi-gpio.errors.mustbeexecutable"); + RED.log.warn("rpi-neopixels : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } // the magic to make python print stuff immediately @@ -110,57 +113,70 @@ module.exports = function(RED) { } } +<<<<<<< Updated upstream node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode, node.brightness, node.gamma]); node.status({fill:"green",shape:"dot",text:"ok"}); +||||||| merged common ancestors + node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]); + node.status({fill:"green",shape:"dot",text:"ok"}); +======= + if (allOK === true) { + node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]); + node.status({fill:"green",shape:"dot",text:"ok"}); +>>>>>>> Stashed changes - node.on("input", inputlistener); + node.on("input", inputlistener); - node.child.stdout.on('data', function (data) { - if (RED.settings.verbose) { node.log("out: "+data+" :"); } - }); + node.child.stdout.on('data', function (data) { + if (RED.settings.verbose) { node.log("out: "+data+" :"); } + }); - node.child.stderr.on('data', function (data) { - if (RED.settings.verbose) { node.log("err: "+data+" :"); } - }); + node.child.stderr.on('data', function (data) { + if (RED.settings.verbose) { node.log("err: "+data+" :"); } + }); - node.child.on('close', function () { - node.child = null; - if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } - if (node.done) { + node.child.on('close', function () { + node.child = null; + if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } + if (node.done) { + node.status({fill:"grey",shape:"ring",text:"closed"}); + node.done(); + } + else { node.status({fill:"red",shape:"ring",text:"stopped"}); } + }); + + node.child.on('error', function (err) { + if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } + else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } + else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); } + }); + + node.on("close", function(done) { node.status({fill:"grey",shape:"ring",text:"closed"}); - node.done(); - } - else { node.status({fill:"red",shape:"ring",text:"stopped"}); } - }); + if (node.child != null) { + node.done = done; + node.child.kill('SIGKILL'); + } + else { done(); } + }); - node.child.on('error', function (err) { - if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } - else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } - else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); } - }); - - node.on("close", function(done) { - node.status({fill:"grey",shape:"ring",text:"closed"}); - if (node.child != null) { - node.done = done; - node.child.kill('SIGKILL'); + if (node.bgnd) { + if (node.bgnd.split(',').length === 1) { + node.bgnd = colors.getRGB(node.bgnd,node.rgb); + } + if (node.mode.indexOf("shift") === -1) { + node.child.stdin.write(node.bgnd+"\n"); + } } - else { done(); } - }); - if (node.bgnd) { - if (node.bgnd.split(',').length === 1) { - node.bgnd = colors.getRGB(node.bgnd,node.rgb); - } - if (node.mode.indexOf("shift") === -1) { - node.child.stdin.write(node.bgnd+"\n"); + if (node.fgnd) { + if (node.fgnd.split(',').length === 1) { + node.fgnd = colors.getRGB(node.fgnd,node.rgb); + } } } - - if (node.fgnd) { - if (node.fgnd.split(',').length === 1) { - node.fgnd = colors.getRGB(node.fgnd,node.rgb); - } + else { + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); } } RED.nodes.registerType("rpi-neopixels",PiNeopixelNode); diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index ae9a8475..c61d4d92 100755 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,11 +1,12 @@ { - "name": "node-red-node-pi-neopixel", - "version": "0.0.17", - "description": "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", - "dependencies": {}, - "repository": { - "type": "git", - "url": "https://github.com/node-red/node-red-nodes/tree/master/hardware/neopixel" + "name" : "node-red-node-pi-neopixel", + "version" : "0.0.17", + "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", + "dependencies" : { + }, + "repository" : { + "type":"git", + "url":"https://github.com/node-red/node-red-nodes/tree/master/hardware/neopixel" }, "license": "Apache-2.0", "keywords": [ diff --git a/hardware/pigpiod/package.json b/hardware/pigpiod/package.json index 8ea76b8b..cb797337 100644 --- a/hardware/pigpiod/package.json +++ b/hardware/pigpiod/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpiod", - "version": "0.0.9", + "version": "0.0.10", "description": "A node-red node for PiGPIOd", "dependencies" : { "js-pigpio": "*" diff --git a/hardware/pigpiod/pi-gpiod.js b/hardware/pigpiod/pi-gpiod.js index ca16dd1f..143629da 100644 --- a/hardware/pigpiod/pi-gpiod.js +++ b/hardware/pigpiod/pi-gpiod.js @@ -99,14 +99,15 @@ module.exports = function(RED) { var PiGPIO; function inputlistener(msg) { - if (!inerror) { - if (msg.payload === "true") { msg.payload = true; } - if (msg.payload === "false") { msg.payload = false; } - var out = Number(msg.payload); - var limit = 1; - if (node.out !== "out") { limit = 100; } - if ((out >= 0) && (out <= limit)) { - if (RED.settings.verbose) { node.log("out: "+msg.payload); } + if (msg.payload === "true") { msg.payload = true; } + if (msg.payload === "false") { msg.payload = false; } + var out = Number(msg.payload); + var limit = 1; + if (node.out !== "out") { limit = 100; } + var pre = ""; + if ((out >= 0) && (out <= limit)) { + if (RED.settings.verbose) { node.log("out: "+msg.payload); } + if (!inerror) { if (node.out === "out") { PiGPIO.write(node.pin, msg.payload); } @@ -119,8 +120,11 @@ module.exports = function(RED) { } node.status({fill:"green",shape:"dot",text:msg.payload.toString()}); } - else { node.warn(RED._("pi-gpiod:errors.invalidinput")+": "+out); } + else { + node.status({fill:"grey",shape:"ring",text:"N/C: " + msg.payload.toString()}); + } } + else { node.warn(RED._("pi-gpiod:errors.invalidinput")+": "+out); } } if (node.pin !== undefined) { diff --git a/hardware/unicorn/package.json b/hardware/unicorn/package.json index 31b8bffb..25503178 100644 --- a/hardware/unicorn/package.json +++ b/hardware/unicorn/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-unicorn-hat", - "version" : "0.0.16", + "version" : "0.0.17", "description" : "A Node-RED node to output to a Raspberry Pi Unicorn HAT from Pimorini.", "dependencies" : { "pngjs": "2.2.*" diff --git a/hardware/unicorn/unicorn.js b/hardware/unicorn/unicorn.js index c1f11ac8..629d2275 100644 --- a/hardware/unicorn/unicorn.js +++ b/hardware/unicorn/unicorn.js @@ -7,20 +7,26 @@ module.exports = function(RED) { var execSync = require('child_process').execSync; var hatCommand = __dirname+'/unihat'; + var allOK = true; - if (!fs.existsSync("/dev/ttyAMA0")) { // unlikely if not on a Pi - //RED.log.info(RED._("rpi-gpio.errors.ignorenode")); - throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); + try { + var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); + if (cpuinfo.indexOf(": BCM") === -1) { + RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; + } + else if (!fs.existsSync("/usr/share/doc/python-rpi.gpio")) { + RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.libnotfound")); + allOK = false; + } + else if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:hatCommand})); + allOK = false; + } } - - if (execSync('python -c "import neopixel"').toString() !== "") { - RED.log.warn("Can't find neopixel python library"); - throw "Warning : Can't find neopixel python library"; - } - - if ( !(1 & parseInt ((fs.statSync(hatCommand).mode & parseInt ("777", 8)).toString (8)[0]) )) { - RED.log.error(hatCommand + " command is not executable"); - throw "Error : "+RED._("rpi-gpio.errors.mustbeexecutable"); + catch(err) { + RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.ignorenode")); + allOK = false; } // the magic to make python print stuff immediately @@ -208,52 +214,57 @@ module.exports = function(RED) { else { node.warn("Input not a string"); } } - node.child = spawn(hatCommand, [node.bright]); - node.status({fill:"green",shape:"dot",text:"ok"}); + if (allOK === true) { + node.child = spawn(hatCommand, [node.bright]); + node.status({fill:"green",shape:"dot",text:"ok"}); - node.on("input", inputlistener); + node.on("input", inputlistener); - node.child.stdout.on('data', function (data) { - if (RED.settings.verbose) { node.log("out: "+data+" :"); } - }); + node.child.stdout.on('data', function (data) { + if (RED.settings.verbose) { node.log("out: "+data+" :"); } + }); - node.child.stderr.on('data', function (data) { - if (RED.settings.verbose) { node.log("err: "+data+" :"); } - }); + node.child.stderr.on('data', function (data) { + if (RED.settings.verbose) { node.log("err: "+data+" :"); } + }); - node.child.on('close', function () { - node.child = null; - if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } - if (node.done) { + node.child.on('close', function () { + node.child = null; + if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); } + if (node.done) { + node.status({fill:"grey",shape:"ring",text:"closed"}); + node.done(); + } + else { node.status({fill:"red",shape:"ring",text:"stopped"}); } + }); + + node.child.on('error', function (err) { + if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } + else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } + else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); } + }); + + node.on("close", function(done) { node.status({fill:"grey",shape:"ring",text:"closed"}); - node.done(); + if (node.tout) { clearTimeout(node.tout); } + if (node.child != null) { + node.done = done; + node.child.kill('SIGKILL'); + } + else { done(); } + }); + + var nowready = function() { + node.tout = setTimeout( function() { + if (ready) { inputlistener({payload:"0"}); } + else { nowready(); } + }, 100); } - else { node.status({fill:"red",shape:"ring",text:"stopped"}); } - }); - - node.child.on('error', function (err) { - if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); } - else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); } - else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); } - }); - - node.on("close", function(done) { - node.status({fill:"grey",shape:"ring",text:"closed"}); - if (node.tout) { clearTimeout(node.tout); } - if (node.child != null) { - node.done = done; - node.child.kill('SIGKILL'); - } - else { done(); } - }); - - var nowready = function() { - node.tout = setTimeout( function() { - if (ready) { inputlistener({payload:"0"}); } - else { nowready(); } - }, 100); + nowready(); + } + else { + node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); } - nowready(); } RED.nodes.registerType("rpi-unicorn",UnicornHatNode); } From 5358b29255ed84f957452496b17381e28363ebca Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 15 Apr 2018 17:59:30 +0100 Subject: [PATCH 048/456] fix broken neopixel merge --- hardware/neopixel/neopixel.js | 12 ++---------- hardware/neopixel/package.json | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/hardware/neopixel/neopixel.js b/hardware/neopixel/neopixel.js index bb973b85..c8781367 100755 --- a/hardware/neopixel/neopixel.js +++ b/hardware/neopixel/neopixel.js @@ -54,7 +54,7 @@ module.exports = function(RED) { function inputlistener(msg) { if (msg.hasOwnProperty("brightness")) { - node.child.stdin.write("brightness,"+msg.brightness.toString()+"\n"); + node.child.stdin.write("brightness,"+msg.brightness.toString()+"\n"); } if (msg.hasOwnProperty("payload")) { var pay = msg.payload.toString().toUpperCase(); @@ -113,17 +113,9 @@ module.exports = function(RED) { } } -<<<<<<< Updated upstream - node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode, node.brightness, node.gamma]); - node.status({fill:"green",shape:"dot",text:"ok"}); -||||||| merged common ancestors - node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]); - node.status({fill:"green",shape:"dot",text:"ok"}); -======= if (allOK === true) { - node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]); + node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode, node.brightness, node.gamma]); node.status({fill:"green",shape:"dot",text:"ok"}); ->>>>>>> Stashed changes node.on("input", inputlistener); diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index c61d4d92..9077022d 100755 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From f033a383b99ebfcf0577812dcd4bc219dc29de5d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 16 Apr 2018 13:35:05 +0100 Subject: [PATCH 049/456] Ensure email refresh interval doesn't exceed setInterval limit --- social/email/61-email.html | 1 + social/email/61-email.js | 5 +++++ social/email/locales/en-US/61-email.json | 3 ++- social/email/package.json | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/social/email/61-email.html b/social/email/61-email.html index d4598639..0d684a43 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -222,6 +222,7 @@ }

For POP3, the default port numbers are 110 for plain TCP and 995 for SSL. For IMAP the port numbers are 143 for plain TCP and 993 for SSL.

+

The maximum refresh interval is 2147483 seconds (24.8 days).

diff --git a/social/email/61-email.js b/social/email/61-email.js index 1ab79102..92a7cdea 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -138,6 +138,11 @@ module.exports = function(RED) { RED.nodes.createNode(this,n); this.name = n.name; this.repeat = n.repeat * 1000 || 300000; + if (this.repeat > 2147483647) { + // setTimeout/Interval has a limit of 2**31-1 Milliseconds + this.repeat = 2147483647; + this.error(RED._("email.errors.refreshtoolarge")); + } this.inserver = n.server || (globalkeys && globalkeys.server) || "imap.gmail.com"; this.inport = n.port || (globalkeys && globalkeys.port) || "993"; this.box = n.box || "INBOX"; diff --git a/social/email/locales/en-US/61-email.json b/social/email/locales/en-US/61-email.json index b7045623..fbe47766 100644 --- a/social/email/locales/en-US/61-email.json +++ b/social/email/locales/en-US/61-email.json @@ -43,7 +43,8 @@ "nosmtptransport": "No SMTP transport. See info panel.", "nopayload": "No payload to send", "fetchfail": "Failed to fetch folder: __folder__", - "messageerror": "Fetch message error: __error__" + "messageerror": "Fetch message error: __error__", + "refreshtoolarge": "Refresh interval too large. Limiting to 2147483 seconds" } } } diff --git a/social/email/package.json b/social/email/package.json index e224efc9..af607cef 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "0.1.28", + "version": "0.1.29", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "nodemailer": "^1.11.0", From 8f1707217664446298ef849636380ae6eed95d8f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 18 Apr 2018 17:44:47 +0100 Subject: [PATCH 050/456] fix unicorn hat command check --- hardware/unicorn/package.json | 2 +- hardware/unicorn/unicorn.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hardware/unicorn/package.json b/hardware/unicorn/package.json index 25503178..eb0da694 100644 --- a/hardware/unicorn/package.json +++ b/hardware/unicorn/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-unicorn-hat", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node to output to a Raspberry Pi Unicorn HAT from Pimorini.", "dependencies" : { "pngjs": "2.2.*" diff --git a/hardware/unicorn/unicorn.js b/hardware/unicorn/unicorn.js index 629d2275..82980809 100644 --- a/hardware/unicorn/unicorn.js +++ b/hardware/unicorn/unicorn.js @@ -7,7 +7,7 @@ module.exports = function(RED) { var execSync = require('child_process').execSync; var hatCommand = __dirname+'/unihat'; - var allOK = true; + var allOK = true; try { var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString(); @@ -19,7 +19,7 @@ module.exports = function(RED) { RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.libnotfound")); allOK = false; } - else if (!(1 & parseInt ((fs.statSync(gpioCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { + else if (!(1 & parseInt ((fs.statSync(hatCommand).mode & parseInt ("777", 8)).toString (8)[0]))) { RED.log.warn("rpi-unicorn : "+RED._("node-red:rpi-gpio.errors.needtobeexecutable",{command:hatCommand})); allOK = false; } From e57e2545d65fe78ddea2739a377bc31e428fe669 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 19 Apr 2018 13:19:52 +0100 Subject: [PATCH 051/456] Add github templates --- .github/ISSUE_TEMPLATE.md | 34 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..57056671 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,34 @@ + + +### Which node are you reporting an issue on? + +### What are the steps to reproduce? + +### What happens? + +### What do you expect to happen? + +### Please tell us about your environment: + +- [ ] Node-RED version: +- [ ] node.js version: +- [ ] npm version: +- [ ] Platform/OS: +- [ ] Browser: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..4aef0d6b --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,34 @@ + + +- [ ] Bugfix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) + + + +## Proposed changes + + + +## Checklist + + +- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red-nodes/blob/master/CONTRIBUTING.md) +- [ ] For non-bugfix PRs, I have discussed this change on the mailing list/slack team. +- [ ] I have run `grunt` to verify the unit tests pass +- [ ] I have added suitable unit tests to cover the new/changed functionality From 5019f68c9ce5a11422b7f6a9f02c9ab1e6628650 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 29 Apr 2018 13:41:38 +0100 Subject: [PATCH 052/456] let Arduino node only send changes of values as stated in docs. --- hardware/Arduino/35-arduino.js | 16 +++++++++++++--- hardware/Arduino/package.json | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/hardware/Arduino/35-arduino.js b/hardware/Arduino/35-arduino.js index ca0a1d5c..3fd88f34 100644 --- a/hardware/Arduino/35-arduino.js +++ b/hardware/Arduino/35-arduino.js @@ -56,24 +56,34 @@ module.exports = function(RED) { if (typeof this.serverConfig === "object") { this.board = this.serverConfig.board; var node = this; + node.oldval = ""; node.status({fill:"red",shape:"ring",text:"node-red:common.status.connecting"}); var doit = function() { node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); if (node.state === "ANALOG") { node.board.pinMode(node.pin, 0x02); node.board.analogRead(node.pin, function(v) { - node.send({payload:v, topic:"A"+node.pin}); + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:"A"+node.pin}); + } }); } if (node.state === "INPUT") { node.board.pinMode(node.pin, 0x00); node.board.digitalRead(node.pin, function(v) { - node.send({payload:v, topic:node.pin}); + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:node.pin}); + } }); } if (node.state == "STRING") { node.board.on('string', function(v) { - node.send({payload:v, topic:"string"}); + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:"string"}); + } }); } // node.board.on('close', function() { diff --git a/hardware/Arduino/package.json b/hardware/Arduino/package.json index 53aa3d7d..e6a9eb46 100644 --- a/hardware/Arduino/package.json +++ b/hardware/Arduino/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-arduino", - "version" : "0.0.14", + "version" : "0.0.15", "description" : "A Node-RED node to talk to an Arduino running firmata", "dependencies" : { "firmata" : "~0.17.0" From 6a28ecfbc2037a7b07e7c2a4c240af869b1ad733 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 29 Apr 2018 17:35:30 +0100 Subject: [PATCH 053/456] Fixup Base64 node and add better tests Revert correct <-> behaviour, make encoding info clearer, added type checking - to close #401 and close #437 --- parsers/base64/70-base64.html | 5 +- parsers/base64/70-base64.js | 35 +++++--- parsers/base64/package.json | 2 +- test/parsers/base64/70-base64_spec.js | 123 ++++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 17 deletions(-) diff --git a/parsers/base64/70-base64.html b/parsers/base64/70-base64.html index e8ac133f..780df599 100644 --- a/parsers/base64/70-base64.html +++ b/parsers/base64/70-base64.html @@ -4,7 +4,7 @@
@@ -22,7 +22,8 @@

A function that converts the chosen property (default msg.payload) to and from base64 format.

If the input is a buffer it converts it to a Base64 encoded string.

If the input is a Base64 string it converts it back to a binary buffer.

-

You can also fix conversion string to base64,and base64 to string if required.

+

You can also fix coding into base64, and base64 to buffer if required.

+

Note: Using "Encode to Base64" will encode an already encoded string.

diff --git a/social/feedparser/locales/ja/32-feedparse.html b/social/feedparser/locales/ja/32-feedparse.html index a58b1482..b1f22454 100644 --- a/social/feedparser/locales/ja/32-feedparse.html +++ b/social/feedparser/locales/ja/32-feedparse.html @@ -1,8 +1,5 @@ diff --git a/social/twitter/locales/ja/27-twitter.html b/social/twitter/locales/ja/27-twitter.html index 2ccd8eb5..0aa0b25c 100644 --- a/social/twitter/locales/ja/27-twitter.html +++ b/social/twitter/locales/ja/27-twitter.html @@ -6,38 +6,21 @@
  • 認証したユーザが受け取ったダイレクトメッセージ
  • 認証したユーザに対するtwitterイベント
  • -

    複数の検索語を指定する場合、スペース文字でand、コンマ「,」 - でorを表します。検索語をmsg.payloadで渡す場合、 - forフィールドは空としてください。

    -

    ツイートmsg.topicにセットし、送信者のスク - リーンネームを付加します。

    -

    ツイートの送信者の位置情報が既知の場合、 - msg.locationに設定します。

    +

    複数の検索語を指定する場合、スペース文字でand、コンマ「,」でorを表します。検索語をmsg.payloadで渡す場合、forフィールドは空としてください。

    +

    ツイートmsg.topicにセットし、送信者のスクリーンネームを付加します。

    +

    ツイートの送信者の位置情報が既知の場合、msg.locationに設定します。

    -

    返却値がイベントの場合、msg.payloadにtwitterイベントを設定します。 -詳細については、 - Twitterのドキュメントを参照してください。

    -

    tweetオブジェクトをmsg.tweetに設定します。詳細 - はTwitterのドキュメントを参照してください。

    +

    返却値がイベントの場合、msg.payloadにtwitterイベントを設定します。詳細については、Twitterのドキュメントを参照してください。

    +

    tweetオブジェクトをmsg.tweetに設定します。詳細はTwitterのドキュメントを参照してください。

    -

    : このノードはFireHouseに接続はしないため、@idや#ハッ - シュタグに対する全ツイートを100%返すことは保証しません。

    -

    注: 特定のユーザ、もしくは、自身に対するダイレクトメッセー - ジをフォローする場合、Twitter APIのレート制限の対象となります。 - そのため、フローのデプロイを15分のうちに複数回行うと、制限に引っ - かかってノード実行がエラーとなるかもしれません。このエラーは15分 - 経過すれば自動的に解消します。

    +

    : このノードはFireHouseに接続はしないため、@idや#ハッシュタグに対する全ツイートを100%返すことは保証しません。

    +

    注: 特定のユーザ、もしくは、自身に対するダイレクトメッセージをフォローする場合、Twitter APIのレート制限の対象となります。そのため、フローのデプロイを15分のうちに複数回行うと、制限に引っかかってノード実行がエラーとなるかもしれません。このエラーは15分経過すれば自動的に解消します。

    From 38e469464f19327b8b06d71ba631753de12b4afb Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 25 May 2018 13:16:34 +0100 Subject: [PATCH 075/456] Add deprecation warnings to twitter node --- social/twitter/27-twitter.html | 14 ++++++++++++++ social/twitter/27-twitter.js | 6 +++++- social/twitter/locales/en-US/27-twitter.json | 2 +- social/twitter/locales/ja/27-twitter.json | 2 +- social/twitter/package.json | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/social/twitter/27-twitter.html b/social/twitter/27-twitter.html index 65f7a77b..58550a0a 100644 --- a/social/twitter/27-twitter.html +++ b/social/twitter/27-twitter.html @@ -1,5 +1,8 @@ @@ -79,6 +82,9 @@ + + + - diff --git a/social/twitter/locales/ja/27-twitter.json b/social/twitter/locales/ja/27-twitter.json index 97be09ca..282445f1 100644 --- a/social/twitter/locales/ja/27-twitter.json +++ b/social/twitter/locales/ja/27-twitter.json @@ -20,7 +20,7 @@ "follow": "フォローしているユーザの全てのツイート", "user": "特定ユーザのツイート", "direct": "ダイレクトメッセージ", - "events": "*deprecated* 自身のイベント" + "events": "自身のイベント" }, "tip": "注釈: 複数の検索条件を指定する場合は、空白のないコンマで区切り入力してください。コンマはOR条件、空白はAND条件となります。
    Twitter APIは全てのツイートを取得できないことがあります。
    「フォローしているユーザの全てのツイート」には、リツイートやいいねが含まれます。

    msg.payloadに検索条件を指定する場合は 「検索条件」 を空欄にしてください。", "status": { @@ -39,7 +39,7 @@ "unexpectedend": "ストリームが予期せず終了しました", "invalidtag": "無効なタグプロパティ", "missingcredentials": "Twitterが認証されていません", - "truncated": "140文字を超えるツイートが切り捨てられました", + "truncated": "280文字を超えるツイートが切り捨てられました", "sendfail": "ツイートの投稿が失敗: __error__", "nopayload": "ツイートするペイロードがありません", "oauthbroke": "something in twitter oauth broke.", diff --git a/social/twitter/package.json b/social/twitter/package.json index d673a1aa..a179e78e 100644 --- a/social/twitter/package.json +++ b/social/twitter/package.json @@ -1,20 +1,23 @@ { - "name" : "node-red-node-twitter", - "version" : "0.1.15", - "description" : "A Node-RED node to talk to Twitter", - "dependencies" : { + "name": "node-red-node-twitter", + "version": "1.0.0", + "description": "A Node-RED node to talk to Twitter", + "dependencies": { "twitter-ng": "0.6.2", - "oauth" : "0.9.14", - "request" : "^2.75.0" + "oauth": "0.9.14", + "request": "^2.75.0" }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/tree/master/social/twitter" + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/social/twitter" }, "license": "Apache-2.0", - "keywords": [ "node-red", "twitter" ], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "twitter" + ], + "node-red": { + "nodes": { "twitter": "27-twitter.js" } }, From aaf93ab587c9615d35f36284edcbbb4b018728f0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 7 Jun 2018 12:07:01 +0100 Subject: [PATCH 084/456] Handle upgrade from old to new twitter node better --- social/twitter/27-twitter.js | 39 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/social/twitter/27-twitter.js b/social/twitter/27-twitter.js index edf72140..de89376e 100644 --- a/social/twitter/27-twitter.js +++ b/social/twitter/27-twitter.js @@ -5,6 +5,7 @@ module.exports = function(RED) { var OAuth= require('oauth').OAuth; var request = require('request'); var twitterRateTimeout; + var retry = 60000; // 60 secs backoff for now function TwitterCredentialsNode(n) { RED.nodes.createNode(this,n); @@ -57,7 +58,7 @@ module.exports = function(RED) { this.twitterConfig = RED.nodes.getNode(this.twitter); var credentials = RED.nodes.getCredentials(this.twitter); - if (credentials) { + if (credentials && credentials.consumer_key && credentials.consumer_secret && credentials.access_token && credentials.access_token_secret) { var twit = new Ntwitter({ consumer_key: credentials.consumer_key, consumer_secret: credentials.consumer_secret, @@ -248,7 +249,6 @@ module.exports = function(RED) { twit.stream(thing, st, function(stream) { //console.log("ST",st); node.stream = stream; - var retry = 60000; // 60 secs backoff for now stream.on('data', function(tweet) { if (tweet.user !== undefined) { var where = tweet.user.location; @@ -358,25 +358,24 @@ module.exports = function(RED) { node.error(err); } } - } - else { + this.on('close', function() { + if (this.tout) { clearTimeout(this.tout); } + if (this.tout2) { clearTimeout(this.tout2); } + if (this.stream) { + this.restart = false; + this.stream.removeAllListeners(); + this.stream.destroy(); + } + if (this.poll_ids) { + for (var i=0; i Date: Fri, 8 Jun 2018 12:55:19 +0100 Subject: [PATCH 085/456] Fix tweet with image --- social/twitter/27-twitter.html | 19 +++++++++++++++++-- social/twitter/27-twitter.js | 15 +++++++++++++++ social/twitter/package.json | 2 +- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/social/twitter/27-twitter.html b/social/twitter/27-twitter.html index a3646468..b501f407 100644 --- a/social/twitter/27-twitter.html +++ b/social/twitter/27-twitter.html @@ -59,12 +59,27 @@ }, label: function() { if (this.screen_name) { - return "@"+this.screen_name + return (this.screen_name[0]!=="@"?"@":"")+this.screen_name } else { return "Twitter: "+this.id } }, - exportable: false + exportable: false, + oneditsave: function() { + var trimFields = [ + "consumer_key", + "consumer_secret", + "access_token", + "access_token_secret" + ]; + // Just in case any whitespace has crept in with the copy-paste of the fields + trimFields.forEach(function(field) { + var v = $("#node-config-input-"+field).val(); + v = v.trim(); + $("#node-config-input-"+field).val(v); + + }); + } }); })(); diff --git a/social/twitter/27-twitter.js b/social/twitter/27-twitter.js index de89376e..531011af 100644 --- a/social/twitter/27-twitter.js +++ b/social/twitter/27-twitter.js @@ -10,6 +10,9 @@ module.exports = function(RED) { function TwitterCredentialsNode(n) { RED.nodes.createNode(this,n); this.screen_name = n.screen_name; + if (this.screen_name && this.screen_name[0] !== "@") { + this.screen_name = "@"+this.screen_name; + } } RED.nodes.registerType("twitter-credentials",TwitterCredentialsNode,{ credentials: { @@ -396,6 +399,18 @@ module.exports = function(RED) { access_token_key: credentials.access_token, access_token_secret: credentials.access_token_secret }); + + var oa = new OAuth( + "https://api.twitter.com/oauth/request_token", + "https://api.twitter.com/oauth/access_token", + credentials.consumer_key, + credentials.consumer_secret, + "1.0", + null, + "HMAC-SHA1" + ); + + node.on("input", function(msg) { if (msg.hasOwnProperty("payload")) { node.status({fill:"blue",shape:"dot",text:"twitter.status.tweeting"}); diff --git a/social/twitter/package.json b/social/twitter/package.json index a179e78e..2499af52 100644 --- a/social/twitter/package.json +++ b/social/twitter/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-twitter", - "version": "1.0.0", + "version": "1.0.1", "description": "A Node-RED node to talk to Twitter", "dependencies": { "twitter-ng": "0.6.2", From c511cf6ae7aebd3aec61429f7d32e57b2ac7c45f Mon Sep 17 00:00:00 2001 From: cymplecy Date: Wed, 13 Jun 2018 22:09:55 +0100 Subject: [PATCH 086/456] Change DMA from 5 to 10 (#453) I mentioned this a while ago Following changes to Pi firmware/kernel, the DMA channel 5 is not reliable for use anymore. Other repositories have changed to use channel 10. https://github.com/jgarff/rpi_ws281x/pull/266/commits I've been running 3 of my Pi on DMA 10 (1 new Pi3B+ and 2 older PiZeros running Jessie) for 2 months now without any issues so I'm making this pull request now --- hardware/neopixel/neopix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index ed1b51fb..793a1d28 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -13,7 +13,7 @@ except ImportError: LED_COUNT = 8 # Number of LED pixels. LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!). LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) -LED_DMA = 5 # DMA channel to use for generating signal (try 5) +LED_DMA = 10 # DMA channel to use for generating signal (try 10) LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) LED_CHANNEL = 0 # PWM channel From 044d008e65903d427e6aaf75034fca0c130dd042 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Jun 2018 22:12:33 +0100 Subject: [PATCH 087/456] bump neopixel node version for npm to go with pr #453 --- hardware/neopixel/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index 9077022d..44a67678 100755 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.18", + "version" : "0.0.19", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From 76a221919aff54ce5e28658ce105b49ebf184bed Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Jun 2018 22:13:22 +0100 Subject: [PATCH 088/456] Update Readme to remove NMA node and add 2018 to serialport copyright --- README.md | 2 +- io/serialport/LICENSE | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28dc1b13..95d0120e 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ Copyright JS Foundation and other contributors, http://js.foundation under [the **node-red-node-irc** - *[91-irc](social/irc)* - Connects to an IRC server to send and receive messages. -**node-red-node-nma** - *[57-nma](social/nma)* - Sends alerts to Android devices via the [Notify-My-Android](http://www.notifymyandroid.com/) app. +**node-red-node-nma** - *[57-nma](social/nma)* - DEPRECATED as NMA closed down operations. **node-red-node-notify** - *[57-notify](social/notify)* - Uses [Growl](http://growl.info/) to provide a desktop popup containing the payload. Only useful on the local Apple machine. diff --git a/io/serialport/LICENSE b/io/serialport/LICENSE index f5b60114..2efcba6b 100644 --- a/io/serialport/LICENSE +++ b/io/serialport/LICENSE @@ -1,4 +1,4 @@ -Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2016,2018 JS Foundation and other contributors, https://js.foundation/ Copyright 2013-2016 IBM Corp. Licensed under the Apache License, Version 2.0 (the "License"); From 88f7f52f9959ef0db202d7861ffe1e69de01e5ae Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 27 Jun 2018 21:36:06 +0100 Subject: [PATCH 089/456] Add pullup option to Arduino digital input to Close #455 --- hardware/Arduino/35-arduino.html | 5 +++-- hardware/Arduino/35-arduino.js | 9 +++++++++ hardware/Arduino/README.md | 2 +- hardware/Arduino/locales/en-US/35-arduino.json | 1 + hardware/Arduino/package.json | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hardware/Arduino/35-arduino.html b/hardware/Arduino/35-arduino.html index 713b59dd..4cd1fef1 100644 --- a/hardware/Arduino/35-arduino.html +++ b/hardware/Arduino/35-arduino.html @@ -6,8 +6,9 @@
    - + @@ -66,7 +67,7 @@
    - diff --git a/hardware/Arduino/35-arduino.js b/hardware/Arduino/35-arduino.js index 062f11b2..8d604256 100644 --- a/hardware/Arduino/35-arduino.js +++ b/hardware/Arduino/35-arduino.js @@ -78,6 +78,15 @@ module.exports = function(RED) { } }); } + if (node.state === "PULLUP") { + node.board.pinMode(node.pin, 0x0B); + node.board.digitalRead(node.pin, function(v) { + if (v !== node.oldval) { + node.oldval = v; + node.send({payload:v, topic:node.pin}); + } + }); + } if (node.state == "STRING") { node.board.on('string', function(v) { if (v !== node.oldval) { diff --git a/hardware/Arduino/README.md b/hardware/Arduino/README.md index 176d25a3..5a729834 100644 --- a/hardware/Arduino/README.md +++ b/hardware/Arduino/README.md @@ -23,7 +23,7 @@ details and examples of how to use this node. Connects to local Arduino and monitors the selected pin for changes. -You can select either **Digital**, **Analogue**, or **String** input type. +You can select either **Digital**, **Pullup**, **Analogue**, or **String** input type. Outputs the value read as `msg.payload` and the pin number as `msg.topic`. It only outputs on a change of value - fine for digital inputs, but you can get a lot of data from analogue pins which you must then handle. For example you could use a `delay` node set to rate limit and drop intermediate values, or an `rbe` node to only report when it changes by a certain amount. diff --git a/hardware/Arduino/locales/en-US/35-arduino.json b/hardware/Arduino/locales/en-US/35-arduino.json index 7e731a50..640bfdc1 100644 --- a/hardware/Arduino/locales/en-US/35-arduino.json +++ b/hardware/Arduino/locales/en-US/35-arduino.json @@ -18,6 +18,7 @@ "state": { "in": { "digital": "Digital pin", + "pullup": "Digital pin with pullup", "analogue": "Analogue pin", "string": "String" }, diff --git a/hardware/Arduino/package.json b/hardware/Arduino/package.json index acc770eb..6b3b061a 100644 --- a/hardware/Arduino/package.json +++ b/hardware/Arduino/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-arduino", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node to talk to an Arduino running firmata", "dependencies" : { "firmata" : "~0.19.1" From b4fca36ab6163dd9c2a10f54fc103e64786a226b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 7 Jul 2018 19:24:35 +0100 Subject: [PATCH 090/456] let python sub processes use python3 --- hardware/LEDborg/nrgpio.py | 32 ++++++++++++--------------- hardware/LEDborg/package.json | 2 +- hardware/PiLcd/nrlcd.py | 8 +++---- hardware/PiLcd/package.json | 2 +- hardware/PiLiter/nrgpio.py | 32 ++++++++++++--------------- hardware/PiLiter/package.json | 2 +- hardware/PiSrf/nrsrf.py | 8 +++---- hardware/PiSrf/package.json | 2 +- hardware/Pibrella/nrgpio.py | 40 +++++++++++++++------------------- hardware/Pibrella/package.json | 2 +- hardware/neopixel/neopix.py | 4 ++-- hardware/neopixel/package.json | 2 +- 12 files changed, 62 insertions(+), 74 deletions(-) diff --git a/hardware/LEDborg/nrgpio.py b/hardware/LEDborg/nrgpio.py index da5213af..d9c301cd 100755 --- a/hardware/LEDborg/nrgpio.py +++ b/hardware/LEDborg/nrgpio.py @@ -6,10 +6,6 @@ import sys bounce = 20 # bounce time in mS to apply -if sys.version_info >= (3,0): - print("Sorry - currently only configured to work with python 2.x") - sys.exit(1) - if len(sys.argv) > 1: cmd = sys.argv[1].lower() pin = int(sys.argv[2]) @@ -17,7 +13,7 @@ if len(sys.argv) > 1: GPIO.setwarnings(False) if cmd == "pwm": - #print "Initialised pin "+str(pin)+" to PWM" + #print("Initialised pin "+str(pin)+" to PWM") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.start(0) @@ -32,10 +28,10 @@ if len(sys.argv) > 1: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "buzz": - #print "Initialised pin "+str(pin)+" to Buzz" + #print("Initialised pin "+str(pin)+" to Buzz") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.stop() @@ -54,10 +50,10 @@ if len(sys.argv) > 1: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "out": - #print "Initialised pin "+str(pin)+" to OUT" + #print("Initialised pin "+str(pin)+" to OUT") GPIO.setup(pin,GPIO.OUT) if len(sys.argv) == 4: GPIO.output(pin,int(sys.argv[3])) @@ -78,9 +74,9 @@ if len(sys.argv) > 1: GPIO.output(pin,data) elif cmd == "in": - #print "Initialised pin "+str(pin)+" to IN" + #print("Initialised pin "+str(pin)+" to IN") def handle_callback(chan): - print GPIO.input(chan) + print(GPIO.input(chan)) if len(sys.argv) == 4: if sys.argv[3].lower() == "up": @@ -91,7 +87,7 @@ if len(sys.argv) > 1: GPIO.setup(pin,GPIO.IN) else: GPIO.setup(pin,GPIO.IN) - print GPIO.input(pin) + print(GPIO.input(pin)) GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce) while True: @@ -104,7 +100,7 @@ if len(sys.argv) > 1: sys.exit(0) elif cmd == "byte": - #print "Initialised BYTE mode - "+str(pin)+ + #print("Initialised BYTE mode - "+str(pin)+) list = [7,11,13,12,15,16,18,22] GPIO.setup(list,GPIO.OUT) @@ -127,7 +123,7 @@ if len(sys.argv) > 1: GPIO.output(list[bit], data & mask) elif cmd == "borg": - #print "Initialised BORG mode - "+str(pin)+ + #print("Initialised BORG mode - "+str(pin)+) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) @@ -154,10 +150,10 @@ if len(sys.argv) > 1: data = 0 elif cmd == "rev": - print GPIO.RPI_REVISION + print(GPIO.RPI_REVISION) elif cmd == "ver": - print GPIO.VERSION + print(GPIO.VERSION) elif cmd == "mouse": # catch mice button events file = open( "/dev/input/mice", "rb" ) @@ -171,7 +167,7 @@ if len(sys.argv) > 1: button = ord( buf[0] ) & pin # mask out just the required button(s) if button != oldbutt: # only send if changed oldbutt = button - print button + print(button) while True: try: @@ -181,4 +177,4 @@ if len(sys.argv) > 1: sys.exit(0) else: - print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|ver pin {value|up|down}" + print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|ver pin {value|up|down}") diff --git a/hardware/LEDborg/package.json b/hardware/LEDborg/package.json index f291c0fe..0250c128 100644 --- a/hardware/LEDborg/package.json +++ b/hardware/LEDborg/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ledborg", - "version" : "0.0.19", + "version" : "0.0.20", "description" : "A Node-RED node to control a PiBorg LedBorg board for a Raspberry Pi.", "dependencies" : { }, diff --git a/hardware/PiLcd/nrlcd.py b/hardware/PiLcd/nrlcd.py index ec6dfc65..622a8c3f 100755 --- a/hardware/PiLcd/nrlcd.py +++ b/hardware/PiLcd/nrlcd.py @@ -107,8 +107,8 @@ def lcd_byte(bits, mode): if len(sys.argv) > 1: pins = sys.argv[1].lower().split(',') if len(pins) != 6: - print "Bad number of pins supplied" - print " "+pins + print("Bad number of pins supplied") + print(" "+pins) sys.exit(0) LCD_RS = int(pins[0]) @@ -181,6 +181,6 @@ if len(sys.argv) > 1: sys.exit(0) else: - print "Bad params" - print " sudo nrlcd.py RS,E,D4,D5,D6,D7" + print("Bad params") + print(" sudo nrlcd.py RS,E,D4,D5,D6,D7") sys.exit(0) diff --git a/hardware/PiLcd/package.json b/hardware/PiLcd/package.json index 2df7e705..e5526eac 100644 --- a/hardware/PiLcd/package.json +++ b/hardware/PiLcd/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pilcd", - "version" : "0.0.9", + "version" : "0.0.10", "description" : "A Node-RED node for Raspberry Pi to write to HD44780 style LCD panels.", "dependencies" : { }, diff --git a/hardware/PiLiter/nrgpio.py b/hardware/PiLiter/nrgpio.py index da5213af..d9c301cd 100755 --- a/hardware/PiLiter/nrgpio.py +++ b/hardware/PiLiter/nrgpio.py @@ -6,10 +6,6 @@ import sys bounce = 20 # bounce time in mS to apply -if sys.version_info >= (3,0): - print("Sorry - currently only configured to work with python 2.x") - sys.exit(1) - if len(sys.argv) > 1: cmd = sys.argv[1].lower() pin = int(sys.argv[2]) @@ -17,7 +13,7 @@ if len(sys.argv) > 1: GPIO.setwarnings(False) if cmd == "pwm": - #print "Initialised pin "+str(pin)+" to PWM" + #print("Initialised pin "+str(pin)+" to PWM") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.start(0) @@ -32,10 +28,10 @@ if len(sys.argv) > 1: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "buzz": - #print "Initialised pin "+str(pin)+" to Buzz" + #print("Initialised pin "+str(pin)+" to Buzz") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.stop() @@ -54,10 +50,10 @@ if len(sys.argv) > 1: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "out": - #print "Initialised pin "+str(pin)+" to OUT" + #print("Initialised pin "+str(pin)+" to OUT") GPIO.setup(pin,GPIO.OUT) if len(sys.argv) == 4: GPIO.output(pin,int(sys.argv[3])) @@ -78,9 +74,9 @@ if len(sys.argv) > 1: GPIO.output(pin,data) elif cmd == "in": - #print "Initialised pin "+str(pin)+" to IN" + #print("Initialised pin "+str(pin)+" to IN") def handle_callback(chan): - print GPIO.input(chan) + print(GPIO.input(chan)) if len(sys.argv) == 4: if sys.argv[3].lower() == "up": @@ -91,7 +87,7 @@ if len(sys.argv) > 1: GPIO.setup(pin,GPIO.IN) else: GPIO.setup(pin,GPIO.IN) - print GPIO.input(pin) + print(GPIO.input(pin)) GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce) while True: @@ -104,7 +100,7 @@ if len(sys.argv) > 1: sys.exit(0) elif cmd == "byte": - #print "Initialised BYTE mode - "+str(pin)+ + #print("Initialised BYTE mode - "+str(pin)+) list = [7,11,13,12,15,16,18,22] GPIO.setup(list,GPIO.OUT) @@ -127,7 +123,7 @@ if len(sys.argv) > 1: GPIO.output(list[bit], data & mask) elif cmd == "borg": - #print "Initialised BORG mode - "+str(pin)+ + #print("Initialised BORG mode - "+str(pin)+) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) @@ -154,10 +150,10 @@ if len(sys.argv) > 1: data = 0 elif cmd == "rev": - print GPIO.RPI_REVISION + print(GPIO.RPI_REVISION) elif cmd == "ver": - print GPIO.VERSION + print(GPIO.VERSION) elif cmd == "mouse": # catch mice button events file = open( "/dev/input/mice", "rb" ) @@ -171,7 +167,7 @@ if len(sys.argv) > 1: button = ord( buf[0] ) & pin # mask out just the required button(s) if button != oldbutt: # only send if changed oldbutt = button - print button + print(button) while True: try: @@ -181,4 +177,4 @@ if len(sys.argv) > 1: sys.exit(0) else: - print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|ver pin {value|up|down}" + print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|ver pin {value|up|down}") diff --git a/hardware/PiLiter/package.json b/hardware/PiLiter/package.json index 2b9f059e..cc75478b 100644 --- a/hardware/PiLiter/package.json +++ b/hardware/PiLiter/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-piliter", - "version" : "0.0.12", + "version" : "0.0.13", "description" : "A Node-RED node to drive a Raspberry Pi Pi-LITEr 8 LED board.", "dependencies" : { }, diff --git a/hardware/PiSrf/nrsrf.py b/hardware/PiSrf/nrsrf.py index efb5a1f2..ab0d16d8 100755 --- a/hardware/PiSrf/nrsrf.py +++ b/hardware/PiSrf/nrsrf.py @@ -62,8 +62,8 @@ def restart(): if len(sys.argv) > 1: pins = sys.argv[1].lower().split(',') if len(pins) != 3: - print "Bad parameters supplied" - print pins + print("Bad parameters supplied") + print(pins) sys.exit(0) TRIGGER = int(pins[0]) @@ -91,6 +91,6 @@ if len(sys.argv) > 1: sys.exit(0) else: - print "Bad params" - print " sudo nrsrf.py trigger_pin,echo_pin,rate_in_seconds" + print("Bad params") + print(" sudo nrsrf.py trigger_pin,echo_pin,rate_in_seconds") sys.exit(0) diff --git a/hardware/PiSrf/package.json b/hardware/PiSrf/package.json index 5b865604..7c26ba7f 100644 --- a/hardware/PiSrf/package.json +++ b/hardware/PiSrf/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pisrf", - "version" : "0.1.1", + "version" : "0.1.2", "description" : "A Node-RED node for a Raspberry Pi to use a SRF04 or SRF05 range finder", "dependencies" : { }, diff --git a/hardware/Pibrella/nrgpio.py b/hardware/Pibrella/nrgpio.py index c69a5425..42a8d9b8 100755 --- a/hardware/Pibrella/nrgpio.py +++ b/hardware/Pibrella/nrgpio.py @@ -10,10 +10,6 @@ from time import sleep bounce = 25; -if sys.version_info >= (3,0): - print("Sorry - currently only configured to work with python 2.x") - sys.exit(1) - if len(sys.argv) > 2: cmd = sys.argv[1].lower() pin = int(sys.argv[2]) @@ -21,7 +17,7 @@ if len(sys.argv) > 2: GPIO.setwarnings(False) if cmd == "pwm": - #print "Initialised pin "+str(pin)+" to PWM" + #print("Initialised pin "+str(pin)+" to PWM") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.start(0) @@ -36,10 +32,10 @@ if len(sys.argv) > 2: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "buzz": - #print "Initialised pin "+str(pin)+" to Buzz" + #print("Initialised pin "+str(pin)+" to Buzz") GPIO.setup(pin,GPIO.OUT) p = GPIO.PWM(pin, 100) p.stop() @@ -58,10 +54,10 @@ if len(sys.argv) > 2: GPIO.cleanup(pin) sys.exit(0) except Exception as ex: - print "bad data: "+data + print("bad data: "+data) elif cmd == "out": - #print "Initialised pin "+str(pin)+" to OUT" + #print("Initialised pin "+str(pin)+" to OUT") GPIO.setup(pin,GPIO.OUT) if len(sys.argv) == 4: GPIO.output(pin,int(sys.argv[3])) @@ -82,11 +78,11 @@ if len(sys.argv) > 2: GPIO.output(pin,data) elif cmd == "in": - #print "Initialised pin "+str(pin)+" to IN" + #print("Initialised pin "+str(pin)+" to IN") bounce = int(sys.argv[4]) def handle_callback(chan): sleep(bounce/1000) - print GPIO.input(chan) + print(GPIO.input(chan)) if sys.argv[3].lower() == "up": GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP) @@ -95,7 +91,7 @@ if len(sys.argv) > 2: else: GPIO.setup(pin,GPIO.IN) - print GPIO.input(pin) + print(GPIO.input(pin)) GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce) while True: @@ -108,7 +104,7 @@ if len(sys.argv) > 2: sys.exit(0) elif cmd == "byte": - #print "Initialised BYTE mode - "+str(pin)+ + #print("Initialised BYTE mode - "+str(pin)+) list = [7,11,13,12,15,16,18,22] GPIO.setup(list,GPIO.OUT) @@ -131,7 +127,7 @@ if len(sys.argv) > 2: GPIO.output(list[bit], data & mask) elif cmd == "borg": - #print "Initialised BORG mode - "+str(pin)+ + #print("Initialised BORG mode - "+str(pin)+) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) @@ -169,7 +165,7 @@ if len(sys.argv) > 2: button = ord( buf[0] ) & pin # mask out just the required button(s) if button != oldbutt: # only send if changed oldbutt = button - print button + print(button) while True: try: @@ -194,7 +190,7 @@ if len(sys.argv) > 2: # type,code,value print("%u,%u" % (code, value)) event = file.read(EVENT_SIZE) - print "0,0" + print("0,0") file.close() sys.exit(0) except: @@ -204,14 +200,14 @@ if len(sys.argv) > 2: elif len(sys.argv) > 1: cmd = sys.argv[1].lower() if cmd == "rev": - print GPIO.RPI_REVISION + print(GPIO.RPI_REVISION) elif cmd == "ver": - print GPIO.VERSION + print(GPIO.VERSION) elif cmd == "info": - print GPIO.RPI_INFO + print(GPIO.RPI_INFO) else: - print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}" - print " only ver (gpio version) and info (board information) accept no pin parameter." + print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}") + print(" only ver (gpio version) and info (board information) accept no pin parameter.") else: - print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}" + print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}") diff --git a/hardware/Pibrella/package.json b/hardware/Pibrella/package.json index b7a6cd4e..ebb6bb76 100644 --- a/hardware/Pibrella/package.json +++ b/hardware/Pibrella/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pibrella", - "version" : "0.0.12", + "version" : "0.0.13", "description" : "A Node-RED node to read from and write to a Pibrella Raspberry Pi add-on board", "dependencies" : { }, diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index 793a1d28..36ea2ae3 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -171,5 +171,5 @@ if __name__ == '__main__': except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program sys.exit(0) except Exception as ex: - print "bad data: "+data - print ex + print("bad data: "+data) + print(ex) diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index 44a67678..85b1b882 100755 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.19", + "version" : "0.0.20", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From 27a103899305689791dc104b683558c81f689fef Mon Sep 17 00:00:00 2001 From: iurly Date: Mon, 9 Jul 2018 12:14:08 +0200 Subject: [PATCH 091/456] Serial request (#426) * serial: simplify serialPool.get serialPool.get() has a lot of arguments. Just pass the whole serialConfig object instead. Also introduce early termination to remove one level of indentation. (Just set your diff tool to ignore all whitespace changes to see how very little this patch changes) * serial: move splitting logic onto serialPool All SerialIn and SerialOut nodes for a given port share the same splitting logic as it is indeed set by the common configuration node. Move the code from SerialIn into serialPool so that it can be reused by the serial request node. Notice how the 'data' event will no longer carry single bytes, but the whole payload instead. Also move the output encoding logic into serialPool. * serial: add serial request node Add a "serial request" node to handle simple request/response protocols. This node allows for multiple instances, all sharing the same underlying device. Responses coming from the serial line will only be propagated to the output of the node where the request was originally received (contrary to the "serial in" nodes which all emit the data received from the serial line). Every request received as an input to the node, is transmitted to the serial line, and a matching response must be received before the next one can be transmitted. Any input message received in the meantime is internally enqueued. The node is essentially a merge of serial in and serial out. It shares the same configuration with serial in and serial out for any given port and will not affect the behavior of the existing nodes. This means you can use, alongside with the request node: - as many serial in nodes as you want -- e.g. to "sniff" - serial out to inject mailicious/tampering data onto the serial line, skipping the queueing mechanism * serial request: provide some visual feedback on the node add status indication: - yellow "waiting" when a message is enqueued for sending - green "OK" after an answer is received - red "timeout" after a timeout occurs More sofisticated output would include an indication of the number of messages enqueued and the actual timeout remaining after sending. * serial request: make default response timeout configurable Notice it's a global setting (i.e. stored in the configuration node) as opposed to per-node, but it can be overridden by setting msg.timeout. * serial request: cosmetic changes - added documentation about msg.port - timeout field made wider so to accommodate default value of 10000ms - replaced harcoded text with localizable strings for "waiting" and "timeout" messages * serial: cleanup: remove node.tout this was probably some leftover code from previous implementations. Now all timeouts are handled within the connection objects. * serial: cleanup: set obj.tout to null after clearing it clearing a Timeout without setting it back to null *might* have adverse effects on later code which would check its null-ity. Let's just do it. * serial: cosmetic: add some comments * serial request: fix "split on timeout" case In the case of "split on timeout" case, we're reusing the same .tout for two different purposes: 1) to send a timeout message, in case no answer is received at all [request] 2) to split messages, after receiving the first character [in+request] So in the case of serial request, checking whether .tout is already set is no longer a valid condition for 2). Let's just check whether i === 1, and clear the timeout set up by 1) if it's already there. * serial: add "split on silence" behavior add a fourth logic to split incoming data into messages. The existing "split on timeout" logic starts the timeout upon reception of the first character. This might lead to unwanted behavior if for instance Node-RED is restarted, as data might accumulate into OS buffers (see #410). A different logic might be to only emit a message when enough time has passed, without any new data being received (line silent), a.k.a. interbyte timeout. --- io/serialport/25-serial.html | 96 ++++- io/serialport/25-serial.js | 465 +++++++++++++-------- io/serialport/locales/en-US/25-serial.json | 10 + 3 files changed, 398 insertions(+), 173 deletions(-) diff --git a/io/serialport/25-serial.html b/io/serialport/25-serial.html index 4fd2f063..835ad5a9 100644 --- a/io/serialport/25-serial.html +++ b/io/serialport/25-serial.html @@ -82,6 +82,63 @@ }); + + + + + + + + + diff --git a/analysis/sentiment/72-sentiment.js b/analysis/sentiment/72-sentiment.js new file mode 100644 index 00000000..915d5530 --- /dev/null +++ b/analysis/sentiment/72-sentiment.js @@ -0,0 +1,28 @@ + +module.exports = function(RED) { + "use strict"; + var sentiment = require('multilang-sentiment'); + + function SentimentNode(n) { + RED.nodes.createNode(this,n); + this.lang = n.lang; + this.property = n.property||"payload"; + var node = this; + + this.on("input", function(msg) { + var value = RED.util.getMessageProperty(msg,node.property); + if (value !== undefined) { + if (msg.hasOwnProperty("overrides")) { + msg.extras = msg.overrides; + delete msg.overrides; + } + sentiment(value, node.lang || msg.lang || 'en', {words: msg.extras || null}, function (err, result) { + msg.sentiment = result; + node.send(msg); + }); + } + else { node.send(msg); } // If no matching property - just pass it on. + }); + } + RED.nodes.registerType("sentiment",SentimentNode); +} diff --git a/analysis/sentiment/LICENSE b/analysis/sentiment/LICENSE new file mode 100644 index 00000000..7fe18b61 --- /dev/null +++ b/analysis/sentiment/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016, 2018 JS Foundation and other contributors, https://js.foundation/ +Copyright 2013-2016 IBM Corp. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/analysis/sentiment/README.md b/analysis/sentiment/README.md new file mode 100644 index 00000000..0266b9f2 --- /dev/null +++ b/analysis/sentiment/README.md @@ -0,0 +1,31 @@ +node-red-node-sentiment +======================== + +A Node-RED node that scores incoming words +using the AFINN-165 wordlist and attaches a sentiment.score property to the msg. + +Install +------- + +This is a node that should be installed by default by Node-RED so you should not have to install it manually. If you do then run the following command in your Node-RED user directory - typically `~/.node-red` + + npm install node-red-node-sentiment + + +Usage +----- + +Uses the AFINN-165 wordlist to attempt to assign scores to words in text. + +Attaches `msg.sentiment` to the msg and within that `msg.sentiment.score` holds the score. + +Supports multiple languages. These can be preselected in the node configuration. You can also set it so that `msg.lang` can be used to set the language dynamically if required. The cldr language codes supported are: + + af, am, ar, az, be, bg, bn, bs, ca, ceb, co, cs, cy, da, de, el, en, eo, es, et, eu, fa, fi, + fr, fy, ga, gd, gl, gu, ha, haw, hi, hmn, hr, ht, hu, hy, id, ig, is, it, iw, ja, jw, ka, kk, km, kn, ko, ku, ky, la, lb, lo, lt, + lv, mg, mi, mk, ml, mn, mr, ms, mt, my, ne, nl, no, ny, pa, pl, ps, pt, ro, ru, sd, si, sk, sl, sm, sn, so, sq, sr, st, su, sv, + sw, ta, te, tg, th, tl, tr, uk, ur, uz, vi, xh, yi, yo, zh, zh-tw, zu + +A score greater than zero is positive and less than zero is negative. The score typically ranges from -5 to +5, but can go higher and lower. + +See the Multilang Sentiment docs here.

    diff --git a/analysis/sentiment/locales/en-US/72-sentiment.json b/analysis/sentiment/locales/en-US/72-sentiment.json new file mode 100644 index 00000000..b65aad90 --- /dev/null +++ b/analysis/sentiment/locales/en-US/72-sentiment.json @@ -0,0 +1,8 @@ +{ + "sentiment": { + "sentiment": "sentiment", + "label": { + "language": "Language" + } + } +} diff --git a/analysis/sentiment/package.json b/analysis/sentiment/package.json new file mode 100644 index 00000000..0a18be7d --- /dev/null +++ b/analysis/sentiment/package.json @@ -0,0 +1,24 @@ +{ + "name" : "node-red-node-sentiment", + "version" : "0.1.0", + "description" : "A Node-RED node that uses the AFINN-165 wordlists for sentiment analysis of words translated into multiple languages including emojis.", + "dependencies" : { + "multilang-sentiment" : "^1.1.6" + }, + "repository" : { + "type":"git", + "url":"https://github.com/node-red/node-red-nodes/tree/master/analysis/sentiment" + }, + "license": "Apache-2.0", + "keywords": [ "node-red", "sentiment", "anaylsis", "AFINN" ], + "node-red" : { + "nodes" : { + "sentiment": "72-sentiment.js" + } + }, + "author": { + "name": "Dave Conway-Jones", + "email": "ceejay@vnet.ibm.com", + "url": "http://nodered.org" + } +} diff --git a/test/analysis/sentiment/72-sentiment_spec.js b/test/analysis/sentiment/72-sentiment_spec.js new file mode 100644 index 00000000..dc61c536 --- /dev/null +++ b/test/analysis/sentiment/72-sentiment_spec.js @@ -0,0 +1,200 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +var should = require("should"); +var sentimentNode = require("../../../analysis/sentiment/72-sentiment.js"); +var helper = require("node-red-node-test-helper"); + +describe('sentiment Node', function() { + + before(function(done) { + helper.startServer(done); + }); + + after(function(done) { + helper.stopServer(done); + }); + + afterEach(function() { + helper.unload(); + }); + + it('should be loaded', function(done) { + var flow = [{id:"sentimentNode1", type:"sentiment", name: "sentimentNode" }]; + helper.load(sentimentNode, flow, function() { + var sentimentNode1 = helper.getNode("sentimentNode1"); + sentimentNode1.should.have.property('name', 'sentimentNode'); + done(); + }); + }); + + it('should pass on msg if no payload', function(done) { + var flow = [{id:"jn1",type:"sentiment",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + msg.should.not.have.property('sentiment'); + msg.topic.should.equal("pass on"); + done(); + }); + var testString = 'good, great, best, brilliant'; + jn1.receive({topic:"pass on"}); + }); + }); + + it('should add a positive score for good words', function(done) { + var flow = [{id:"jn1",type:"sentiment",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + try { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.be.above(10); + done(); + } catch(err) { + done(err); + } + }); + var testString = 'good, great, best, brilliant'; + jn1.receive({payload:testString}); + }); + }); + + it('should add a positive score for good words (in French)', function(done) { + var flow = [{id:"jn1",type:"sentiment",wires:[["jn2"]],lang:"fr"}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + try { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.be.above(5); + done(); + } catch(err) { + done(err); + } + }); + var testString = 'bon, belle, don du ciel, brillant'; + jn1.receive({payload:testString}); + }); + }); + + it('should add a positive score for good words - alternative property', function(done) { + var flow = [{id:"jn1",type:"sentiment",property:"foo",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + try { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.be.above(10); + done(); + } catch(err) { + done(err); + } + }); + var testString = 'good, great, best, brilliant'; + jn1.receive({foo:testString}); + }); + }); + + it('should add a negative score for bad words', function(done) { + var flow = [{id:"jn1",type:"sentiment",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.be.below(-10); + done(); + }); + var testString = 'bad, horrible, negative, awful'; + jn1.receive({payload:testString}); + }); + }); + + it('should add a negative score for bad words - alternative property', function(done) { + var flow = [{id:"jn1",type:"sentiment",property:"foo",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.be.below(-10); + done(); + }); + var testString = 'bad, horrible, negative, awful'; + jn1.receive({foo:testString}); + }); + }); + + it('should allow you to override word scoring', function(done) { + var flow = [{id:"jn1",type:"sentiment",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.equal(20); + done(); + }); + var testString = 'sick, wicked'; + var overrides = {'sick': 10, 'wicked': 10 }; + jn1.receive({payload:testString,overrides:overrides}); + }); + }); + + it('should allow you to override word scoring - alternative property', function(done) { + var flow = [{id:"jn1",type:"sentiment",property:"foo",wires:[["jn2"]]}, + {id:"jn2", type:"helper"}]; + helper.load(sentimentNode, flow, function() { + var jn1 = helper.getNode("jn1"); + var jn2 = helper.getNode("jn2"); + jn2.on("input", function(msg) { + msg.should.have.property('sentiment'); + msg.sentiment.should.have.property('score'); + msg.sentiment.score.should.be.a.Number(); + msg.sentiment.score.should.equal(20); + done(); + }); + var testString = 'sick, wicked'; + var overrides = {'sick': 10, 'wicked': 10 }; + jn1.receive({foo:testString,overrides:overrides}); + }); + }); + +}); From f3b0e2277d20ecf5dba00849bd95f54a8c313f9a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 11 Aug 2018 14:00:26 +0100 Subject: [PATCH 097/456] update blinkstick links to colors To close #427 --- hardware/blinkstick/76-blinkstick.html | 2 +- hardware/blinkstick/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hardware/blinkstick/76-blinkstick.html b/hardware/blinkstick/76-blinkstick.html index 135fe2ba..0f9ce707 100644 --- a/hardware/blinkstick/76-blinkstick.html +++ b/hardware/blinkstick/76-blinkstick.html @@ -61,7 +61,7 @@
  • A hex string "#rrggbb" triple
  • "red,green,blue" three 0-255 values as a string
  • "random" will generate a random color
  • -
  • Standard HTML color name
  • +
  • Standard HTML color name
  • An object can override any of the parameters
  • array of colours for a neopixel rgb strip - either name,name,... or r,g,b,r,g,b,... where r,g,b are 0 to 255.
  • diff --git a/hardware/blinkstick/package.json b/hardware/blinkstick/package.json index 7c1b923c..a7c2c344 100644 --- a/hardware/blinkstick/package.json +++ b/hardware/blinkstick/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-blinkstick", - "version" : "0.1.15", + "version" : "0.1.16", "description" : "A Node-RED node to control a Blinkstick", "dependencies" : { "blinkstick" : "1.1.3" From 211988017fbc75faf8871b0a893da0dee20c12d6 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 11 Aug 2018 14:03:16 +0100 Subject: [PATCH 098/456] Let sqlite open RO as well as RW Also better reuse of connection object --- storage/sqlite/package.json | 2 +- storage/sqlite/sqlite.html | 15 +++++++++++++-- storage/sqlite/sqlite.js | 7 ++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index fac13671..7bf56945 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-sqlite", - "version": "0.3.0", + "version": "0.3.2", "description": "A sqlite node for Node-RED", "dependencies": { "sqlite3": "^4.0.2" diff --git a/storage/sqlite/sqlite.html b/storage/sqlite/sqlite.html index 78a0d322..923f817c 100644 --- a/storage/sqlite/sqlite.html +++ b/storage/sqlite/sqlite.html @@ -4,13 +4,24 @@
    +
    + + +
    +
    Note: Setting the database name to :memory: + will create a non-persistant in memory database.
    @@ -96,12 +96,8 @@ - -
    - Twitter are withdrawing the API used to access a user's activity stream in August 2018 so this feature will be removed from the node in the near future. See here for details. -
    @@ -116,23 +112,28 @@ @@ -81,6 +86,7 @@ server: {value:"smtp.gmail.com",required:true}, port: {value:"465",required:true}, secure: {value: true}, + tls: {value: true}, name: {value:""}, dname: {value:""} }, diff --git a/social/email/61-email.js b/social/email/61-email.js index 92a7cdea..e3e6a0fa 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -30,6 +30,7 @@ module.exports = function(RED) { this.outserver = n.server; this.outport = n.port; this.secure = n.secure; + this.tls = true; var flag = false; if (this.credentials && this.credentials.hasOwnProperty("userid")) { this.userid = this.credentials.userid; @@ -50,12 +51,16 @@ module.exports = function(RED) { if (flag) { RED.nodes.addCredentials(n.id,{userid:this.userid, password:this.password, global:true}); } + if (n.tls === false){ + this.tls = false; + } var node = this; var smtpOptions = { host: node.outserver, port: node.outport, - secure: node.secure + secure: node.secure, + tls: {rejectUnauthorized: node.tls} } if (this.userid && this.password) { diff --git a/social/email/locales/en-US/61-email.json b/social/email/locales/en-US/61-email.json index fbe47766..d3f05375 100644 --- a/social/email/locales/en-US/61-email.json +++ b/social/email/locales/en-US/61-email.json @@ -13,6 +13,7 @@ "folder": "Folder", "protocol": "Protocol", "useSSL": "Use SSL?", + "useTLS": "Use TLS?", "disposition": "Disposition", "none": "None", "read": "Mark Read", From 1b0f573f4e1f9e71b91c402e2c4061478a81315f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 22 Aug 2018 13:58:55 +0100 Subject: [PATCH 125/456] let sqlite add extensions --- storage/sqlite/README.md | 2 ++ storage/sqlite/package.json | 2 +- storage/sqlite/sqlite.html | 2 ++ storage/sqlite/sqlite.js | 39 ++++++++++++++++++++++++------------- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/storage/sqlite/README.md b/storage/sqlite/README.md index 9d2b8d3c..ae94aee3 100644 --- a/storage/sqlite/README.md +++ b/storage/sqlite/README.md @@ -25,6 +25,8 @@ By it's very nature it is SQL injection... so *be careful* out there... Typically the returned payload will be an array of the result rows, (or an error). +You can load sqlite extensions by inputting a msg.extension property containing the full path and filename. + The reconnect timeout in milliseconds can be changed by adding a line to **settings.js** sqliteReconnectTime: 20000, diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index 7bf56945..c671502c 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-sqlite", - "version": "0.3.2", + "version": "0.3.3", "description": "A sqlite node for Node-RED", "dependencies": { "sqlite3": "^4.0.2" diff --git a/storage/sqlite/sqlite.html b/storage/sqlite/sqlite.html index 923f817c..28d5d966 100644 --- a/storage/sqlite/sqlite.html +++ b/storage/sqlite/sqlite.html @@ -77,6 +77,8 @@ be sure to include $ on the parameter object key.

    Using any SQL Query, the result is returned in msg.payload

    Typically the returned payload will be an array of the result rows, (or an error).

    +

    You can load sqlite extensions by inputting a msg.extension property containing the full + path and filename.

    The reconnect timeout in milliseconds can be changed by adding a line to settings.js

    sqliteReconnectTime: 20000,

    diff --git a/storage/sqlite/sqlite.js b/storage/sqlite/sqlite.js index c5ec8e0b..39c0bc68 100644 --- a/storage/sqlite/sqlite.js +++ b/storage/sqlite/sqlite.js @@ -43,12 +43,13 @@ module.exports = function(RED) { var node = this; node.status({}); - if (this.mydbConfig) { - this.mydbConfig.doConnect(); + if (node.mydbConfig) { + node.mydbConfig.doConnect(); node.status({fill:"green",shape:"dot",text:this.mydbConfig.mod}); var bind = []; - node.on("input", function(msg) { - if (this.sqlquery == "msg.topic"){ + + var doQuery = function(msg) { + if (node.sqlquery == "msg.topic"){ if (typeof msg.topic === 'string') { bind = Array.isArray(msg.payload) ? msg.payload : []; node.mydbConfig.db.all(msg.topic, bind, function(err, row) { @@ -64,7 +65,7 @@ module.exports = function(RED) { node.status({fill:"red",shape:"dot",text:"msg.topic error"}); } } - if (this.sqlquery == "batch") { + if (node.sqlquery == "batch") { if (typeof msg.topic === 'string') { node.mydbConfig.db.exec(msg.topic, function(err) { if (err) { node.error(err,msg);} @@ -79,10 +80,10 @@ module.exports = function(RED) { node.status({fill:"red", shape:"dot",text:"msg.topic error"}); } } - if (this.sqlquery == "fixed"){ - if (typeof this.sql === 'string'){ + if (node.sqlquery == "fixed"){ + if (typeof node.sql === 'string'){ bind = Array.isArray(msg.payload) ? msg.payload : []; - node.mydbConfig.db.all(this.sql, bind, function(err, row) { + node.mydbConfig.db.all(node.sql, bind, function(err, row) { if (err) { node.error(err,msg); } else { msg.payload = row; @@ -91,15 +92,15 @@ module.exports = function(RED) { }); } else{ - if (this.sql === null || this.sql == ""){ + if (node.sql === null || node.sql == ""){ node.error("SQL statement config not set up",msg); node.status({fill:"red",shape:"dot",text:"SQL config not set up"}); } } } - if (this.sqlquery == "prepared"){ - if (typeof this.sql === 'string' && typeof msg.params !== "undefined" && typeof msg.params === "object"){ - node.mydbConfig.db.all(this.sql, msg.params, function(err, row) { + if (node.sqlquery == "prepared"){ + if (typeof node.sql === 'string' && typeof msg.params !== "undefined" && typeof msg.params === "object"){ + node.mydbConfig.db.all(node.sql, msg.params, function(err, row) { if (err) { node.error(err,msg); } else { msg.payload = row; @@ -108,7 +109,7 @@ module.exports = function(RED) { }); } else{ - if (this.sql === null || this.sql == ""){ + if (node.sql === null || node.sql == ""){ node.error("Prepared statement config not set up",msg); node.status({fill:"red",shape:"dot",text:"Prepared statement not set up"}); } @@ -122,10 +123,20 @@ module.exports = function(RED) { } } } + } + + node.on("input", function(msg) { + if (msg.hasOwnProperty("extension")) { + node.mydbConfig.db.loadExtension(msg.extension, function(err) { + if (err) { node.error(err,msg); } + else { doQuery(msg); } + }); + } + else { doQuery(msg); } }); } else { - this.error("Sqlite database not configured"); + node.error("Sqlite database not configured"); } } RED.nodes.registerType("sqlite",SqliteNodeIn); From 0b65cd86528993d7bcce7c20007241016744c189 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 22 Aug 2018 23:47:03 +0100 Subject: [PATCH 126/456] sqlite - better handle extensions timing --- storage/sqlite/package.json | 2 +- storage/sqlite/sqlite.js | 82 ++++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index c671502c..cc31580a 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-sqlite", - "version": "0.3.3", + "version": "0.3.4", "description": "A sqlite node for Node-RED", "dependencies": { "sqlite3": "^4.0.2" diff --git a/storage/sqlite/sqlite.js b/storage/sqlite/sqlite.js index 39c0bc68..540e21e4 100644 --- a/storage/sqlite/sqlite.js +++ b/storage/sqlite/sqlite.js @@ -51,14 +51,16 @@ module.exports = function(RED) { var doQuery = function(msg) { if (node.sqlquery == "msg.topic"){ if (typeof msg.topic === 'string') { - bind = Array.isArray(msg.payload) ? msg.payload : []; - node.mydbConfig.db.all(msg.topic, bind, function(err, row) { - if (err) { node.error(err,msg); } - else { - msg.payload = row; - node.send(msg); - } - }); + if (msg.topic.length > 0) { + bind = Array.isArray(msg.payload) ? msg.payload : []; + node.mydbConfig.db.all(msg.topic, bind, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } } else { node.error("msg.topic : the query is not defined as a string",msg); @@ -67,13 +69,15 @@ module.exports = function(RED) { } if (node.sqlquery == "batch") { if (typeof msg.topic === 'string') { - node.mydbConfig.db.exec(msg.topic, function(err) { - if (err) { node.error(err,msg);} - else { - msg.payload = []; - node.send(msg); - } - }); + if (msg.topic.length > 0) { + node.mydbConfig.db.exec(msg.topic, function(err) { + if (err) { node.error(err,msg);} + else { + msg.payload = []; + node.send(msg); + } + }); + } } else { node.error("msg.topic : the query is not defined as string", msg); @@ -81,43 +85,47 @@ module.exports = function(RED) { } } if (node.sqlquery == "fixed"){ - if (typeof node.sql === 'string'){ - bind = Array.isArray(msg.payload) ? msg.payload : []; - node.mydbConfig.db.all(node.sql, bind, function(err, row) { - if (err) { node.error(err,msg); } - else { - msg.payload = row; - node.send(msg); - } - }); + if (typeof node.sql === 'string') { + if (msg.payload && msg.payload.length > 0) { + bind = Array.isArray(msg.payload) ? msg.payload : []; + node.mydbConfig.db.all(node.sql, bind, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } } else{ - if (node.sql === null || node.sql == ""){ + if (node.sql === null || node.sql == "") { node.error("SQL statement config not set up",msg); node.status({fill:"red",shape:"dot",text:"SQL config not set up"}); } } } if (node.sqlquery == "prepared"){ - if (typeof node.sql === 'string' && typeof msg.params !== "undefined" && typeof msg.params === "object"){ - node.mydbConfig.db.all(node.sql, msg.params, function(err, row) { - if (err) { node.error(err,msg); } - else { - msg.payload = row; - node.send(msg); - } - }); + if (typeof node.sql === 'string' && typeof msg.params !== "undefined" && typeof msg.params === "object") { + if (node.sql.length > 0) { + node.mydbConfig.db.all(node.sql, msg.params, function(err, row) { + if (err) { node.error(err,msg); } + else { + msg.payload = row; + node.send(msg); + } + }); + } } - else{ - if (node.sql === null || node.sql == ""){ + else { + if (node.sql === null || node.sql == "") { node.error("Prepared statement config not set up",msg); node.status({fill:"red",shape:"dot",text:"Prepared statement not set up"}); } - if (typeof msg.params == "undefined"){ + if (typeof msg.params == "undefined") { node.error("msg.params not passed"); node.status({fill:"red",shape:"dot",text:"msg.params not defined"}); } - else if (typeof msg.params != "object"){ + else if (typeof msg.params != "object") { node.error("msg.params not an object"); node.status({fill:"red",shape:"dot",text:"msg.params not an object"}); } From 6d36f5db8a20fee08870254bbc5d0b0f29d48ef1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 23 Aug 2018 08:55:51 +0100 Subject: [PATCH 127/456] sqlite - add test extension - half.c --- storage/sqlite/ext/half.c | 30 ++++++++++++++++++++++++++++++ storage/sqlite/ext/half.dylib | Bin 0 -> 4616 bytes 2 files changed, 30 insertions(+) create mode 100644 storage/sqlite/ext/half.c create mode 100755 storage/sqlite/ext/half.dylib diff --git a/storage/sqlite/ext/half.c b/storage/sqlite/ext/half.c new file mode 100644 index 00000000..5c746314 --- /dev/null +++ b/storage/sqlite/ext/half.c @@ -0,0 +1,30 @@ +/* Add your header comment here */ + +#include +SQLITE_EXTENSION_INIT1 + +/* +** The half() SQL function returns half of its input value. +*/ +static void halfFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_result_double(context, 0.5*sqlite3_value_double(argv[0])); +} + +/* SQLite invokes this routine once when it loads the extension. +** Create new functions, collating sequences, and virtual table +** modules here. This is usually the only exported symbol in +** the shared library. +*/ +int sqlite3_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + sqlite3_create_function(db, "half", 1, SQLITE_ANY, 0, halfFunc, 0, 0); + return 0; +} diff --git a/storage/sqlite/ext/half.dylib b/storage/sqlite/ext/half.dylib new file mode 100755 index 0000000000000000000000000000000000000000..50bf666d04b3878bf6bb9755ca67e970bf774dc0 GIT binary patch literal 4616 zcmeHLO=uHA6rR}D|C%Zk6cvL6|G;c&E4CMHrI8VT5Ntsa8QLbPE6t|uCRz`LLKR%1 zP{e}=&+4(@rQQ_9suz0@@!%n#f(HdHBI3dNeVdtf4Jw{xAG~?<&HJ18W)FFJ{{7>R zB|=1Mgb<6t_24OhOQHcgA=ZH}M}$zSD|MpFKl*j4m@S-XjF_ShT&p!o6*41*1+(gS zldCGauiAvz`1(h+Voa-ip;TYqaTfws$Ga1)STEI1#H{g8gm`XY*mnB0L3O-I9gj7U z46Yy{7MYEfN)?^+wv$%2lg;C-I^L9yC$&9sb&Oz0zQYYaPG?6~M?hoxZ)8BlE#HB4 z;|YCY-*UOUqap6~`*@~rvpQk@6QHxknp=3ZJZ)kX4N!C3t6 zwt?4HouBC$$R^Sk2JBuaK%0daOIEgjUy+Y?Ovjk5z^fr8miv$^z{kKOetKlu!t9rO z0sa%MhZXb0UR-H;Io&os;q8^nM-QEfn%R}h_H(8 zu!XA0$1k{rOfIoM*oQ5!W!xkdzSVY(S!YOL2f_}79SA!Rb|CCP*nzMEVF&(~4s=WJ zogDwrF0a;oMosrPLv&1WDoZszO?l4_U#+(Rq&NCadc{xD>wYgwV6SlvOl7HYg)gq1 z@db?@!=~&#>+~KR@n+<7Eq}2KIo%oeM<7{BmFH%fo_eX*-V-_gsQvWAEGQA(bdh#K z-zUk0UhzvMU*j!?C|w)DFM3%*l2YAu|71*JmXf6-xYIItl%@9^9VI81JwU}}G6NpquVFJus> zfU`9bapleEDVoqJfyK=E>|Q*8sgHwop}zf590oD{+jTuRwZFl}-)|0d#Pm0qFA@VA zqCU+<(_P3_z$PC180BZB=P9O*LT~QB6&P?nLQKr}kv*FSRSm@?n^tb2*sFT+=Rjsy zScTl6CHyJ3Pgv)AhOKOV01DSiDywazZK!Xk`RpENPk%0XcBpk%&due{w Date: Thu, 23 Aug 2018 08:57:15 +0100 Subject: [PATCH 128/456] Daemon - allow manual start rather than always auto to close #479 --- utility/daemon/daemon.html | 13 +++++++++++-- utility/daemon/daemon.js | 2 ++ utility/daemon/package.json | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/utility/daemon/daemon.html b/utility/daemon/daemon.html index 58bf99f6..bdd5f28d 100644 --- a/utility/daemon/daemon.html +++ b/utility/daemon/daemon.html @@ -11,12 +11,17 @@
    - + + +
    +
    + +
    - +
    @@ -62,6 +67,7 @@ name: {value:""}, command: {value:"",required:true}, args: {value:""}, + autorun: {value:true}, cr: {value:false}, redo: {value:true}, op: {value:"string"}, @@ -77,6 +83,9 @@ }, labelStyle: function() { return this.name?"node_label_italic":""; + }, + oneditprepare: function() { + if (this.autorun === undefined) { $("#node-input-autorun").prop('checked', true); } } }); diff --git a/utility/daemon/daemon.js b/utility/daemon/daemon.js index 07e49709..97568c7d 100644 --- a/utility/daemon/daemon.js +++ b/utility/daemon/daemon.js @@ -12,6 +12,8 @@ module.exports = function(RED) { this.redo = n.redo; this.running = false; this.closer = n.closer || "SIGKILL"; + this.autorun = true; + if (n.autorun === false) { this.autorun = false; } var node = this; function inputlistener(msg) { diff --git a/utility/daemon/package.json b/utility/daemon/package.json index faeb72bd..a45c56c0 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.21", + "version" : "0.0.22", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From a94157efe60f83d938d75e6e8a19bb909d03c11c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 24 Aug 2018 15:23:37 +0100 Subject: [PATCH 129/456] sqlite - fix fixed statement check --- storage/sqlite/package.json | 2 +- storage/sqlite/sqlite.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index cc31580a..9dd66ecb 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-sqlite", - "version": "0.3.4", + "version": "0.3.5", "description": "A sqlite node for Node-RED", "dependencies": { "sqlite3": "^4.0.2" diff --git a/storage/sqlite/sqlite.js b/storage/sqlite/sqlite.js index 540e21e4..27a92cad 100644 --- a/storage/sqlite/sqlite.js +++ b/storage/sqlite/sqlite.js @@ -86,8 +86,7 @@ module.exports = function(RED) { } if (node.sqlquery == "fixed"){ if (typeof node.sql === 'string') { - if (msg.payload && msg.payload.length > 0) { - bind = Array.isArray(msg.payload) ? msg.payload : []; + if (node.sql.length > 0) { node.mydbConfig.db.all(node.sql, bind, function(err, row) { if (err) { node.error(err,msg); } else { From 52df7cb30f96ce6392ff9e2b11d78c93d19aff5c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 30 Aug 2018 13:05:39 +0100 Subject: [PATCH 130/456] Fix email msg cloning to close #442 to close #461 --- social/email/61-email.js | 8 ++++---- social/email/package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index e3e6a0fa..7294af9e 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -190,7 +190,7 @@ module.exports = function(RED) { // will be used to populate the email. // DCJ NOTE: - heirachical multipart mime parsers seem to not exist - this one is barely functional. function processNewMessage(msg, mailMessage) { - msg = JSON.parse(JSON.stringify(msg)); // Clone the message + msg = RED.util.cloneMessage(msg); // Clone the message // Populate the msg fields from the content of the email message // that we have just parsed. msg.payload = mailMessage.text; @@ -198,9 +198,9 @@ module.exports = function(RED) { msg.date = mailMessage.date; msg.header = mailMessage.headers; if (mailMessage.html) { msg.html = mailMessage.html; } - if (mailMessage.to && mailMessage.from.to > 0) { msg.to = mailMessage.to; } - if (mailMessage.cc && mailMessage.from.cc > 0) { msg.cc = mailMessage.cc; } - if (mailMessage.bcc && mailMessage.from.bcc > 0) { msg.bcc = mailMessage.bcc; } + if (mailMessage.to && mailMessage.to.length > 0) { msg.to = mailMessage.to; } + if (mailMessage.cc && mailMessage.cc.length > 0) { msg.cc = mailMessage.cc; } + if (mailMessage.bcc && mailMessage.bcc.length > 0) { msg.bcc = mailMessage.bcc; } if (mailMessage.from && mailMessage.from.length > 0) { msg.from = mailMessage.from[0].address; } if (mailMessage.attachments) { msg.attachments = mailMessage.attachments; } else { msg.attachments = []; } diff --git a/social/email/package.json b/social/email/package.json index 985817e0..07a9289a 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,11 +1,11 @@ { "name": "node-red-node-email", - "version": "1.0.0", + "version": "1.0.1", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", "mailparser": "^0.6.2", - "nodemailer": "^4.6.4", + "nodemailer": "^4.6.8", "poplib": "^0.1.7" }, "repository": { From 337588e7ab3271ea2af6148e5299dce3f53e9944 Mon Sep 17 00:00:00 2001 From: Tom Brusehaver <41647049+tbrusehaver@users.noreply.github.com> Date: Mon, 3 Sep 2018 13:56:36 -0500 Subject: [PATCH 131/456] Fix for Email In Node Crashed Node-RED (#471) When attachments aren't correct. --- social/email/61-email.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index 7294af9e..a50ae6d8 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -226,6 +226,7 @@ module.exports = function(RED) { function nextMessage() { if (currentMessage > maxMessage) { pop3Client.quit(); + setInputRepeatTimeout(); return; } pop3Client.retr(currentMessage); @@ -248,6 +249,7 @@ module.exports = function(RED) { }); pop3Client.on("error", function(err) { + setInputRepeatTimeout(); node.log("error: " + JSON.stringify(err)); }); @@ -263,6 +265,7 @@ module.exports = function(RED) { } else { node.log(util.format("login error: %s %j", status, rawData)); pop3Client.quit(); + setInputRepeatTimeout(); } }); @@ -284,6 +287,7 @@ module.exports = function(RED) { else { node.log(util.format("retr error: %s %j", status, rawData)); pop3Client.quit(); + setInputRepeatTimeout(); } }); @@ -323,6 +327,7 @@ module.exports = function(RED) { node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); imap.end(); + setInputRepeatTimeout(); return; } //console.log("> search - err=%j, results=%j", err, results); @@ -330,6 +335,7 @@ module.exports = function(RED) { //console.log(" [X] - Nothing to fetch"); node.status({}); imap.end(); + setInputRepeatTimeout(); return; } @@ -377,10 +383,12 @@ module.exports = function(RED) { } else { cleanup(); } + setInputRepeatTimeout(); }); fetch.once('error', function(err) { console.log('Fetch error: ' + err); + setInputRepeatTimeout(); }); }); // End of imap->search }); // End of imap->openInbox @@ -424,16 +432,19 @@ module.exports = function(RED) { this.on("close", function() { if (this.interval_id != null) { - clearInterval(this.interval_id); + clearTimeout(this.interval_id); } if (imap) { imap.destroy(); } }); - // Set the repetition timer as needed - if (!isNaN(this.repeat) && this.repeat > 0) { - this.interval_id = setInterval( function() { - node.emit("input",{}); - }, this.repeat ); + function setInputRepeatTimeout() + { + // Set the repetition timer as needed + if (!isNaN(node.repeat) && node.repeat > 0) { + node.interval_id = setTimeout( function() { + node.emit("input",{}); + }, node.repeat ); + } } node.emit("input",{}); From 649f9f2fbf3f4f6ebee2854cf4b68b7e41b7f1b3 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 3 Sep 2018 20:06:36 +0100 Subject: [PATCH 132/456] Bump email node for pr attachment errors fix --- social/email/README.md | 6 ++++-- social/email/package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/social/email/README.md b/social/email/README.md index aaf84e6e..d1c4b474 100644 --- a/social/email/README.md +++ b/social/email/README.md @@ -9,7 +9,7 @@ Pre-requisite You will need valid email credentials for your email server. -**Note :** Version 1.x of this node requires Node.js v6 or newer. +**Note :** Version 1.x of this node requires **Node.js v6** or newer. Install @@ -18,10 +18,12 @@ Install Version 0.x of this node is usually installed by default by Node-RED. To install version 1.x you need to uninstall the existing version. - sudo npm uninstall -g node-red-node-email + cd /usr/lib/node_modules/node-red + sudo npm uninstall --unsafe-perm node-red-node-email Then run the following command in your Node-RED user directory - typically `~/.node-red` + cd ~/.node-red npm i node-red-node-email **Note :** this installs the new version locally rather than globally. This can then be managed by the palette manager. diff --git a/social/email/package.json b/social/email/package.json index 07a9289a..da414702 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.0.1", + "version": "1.0.2", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", From a2b90976137cd5e4edb0278205af0a2e7983eff6 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 4 Sep 2018 18:51:20 +0100 Subject: [PATCH 133/456] Email node - report when on old node.js --- social/email/61-email.js | 4 ++++ social/email/README.md | 4 ++-- social/email/package.json | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index a50ae6d8..c33d3b6e 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -17,6 +17,10 @@ module.exports = function(RED) { var MailParser = require("mailparser").MailParser; var util = require("util"); + if (parseInt(process.version.split("v")[1].split(".")[0]) < 8) { + throw "Error : Requires nodejs version >= 8."; + } + try { var globalkeys = RED.settings.email || require(process.env.NODE_RED_HOME+"/../emailkeys.js"); } diff --git a/social/email/README.md b/social/email/README.md index d1c4b474..0cffc6e2 100644 --- a/social/email/README.md +++ b/social/email/README.md @@ -1,7 +1,7 @@ node-red-node-email =================== -Node-RED nodes to send and receive simple emails. +Node-RED nodes to send and receive simple emails. Pre-requisite @@ -9,7 +9,7 @@ Pre-requisite You will need valid email credentials for your email server. -**Note :** Version 1.x of this node requires **Node.js v6** or newer. +**Note :** Version 1.x of this node requires **Node.js v8** or newer. Install diff --git a/social/email/package.json b/social/email/package.json index da414702..02e447aa 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.0.2", + "version": "1.0.3", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", @@ -30,6 +30,6 @@ "url": "http://nodered.org" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" } } From 949bbe95cde586049f0b4616912bf1e2d4cd4bb1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 6 Sep 2018 21:33:14 +0100 Subject: [PATCH 134/456] couple of file permissions and rm node6 --- .travis.yml | 1 - hardware/neopixel/neopixel.html | 0 hardware/neopixel/package.json | 0 3 files changed, 1 deletion(-) mode change 100755 => 100644 hardware/neopixel/neopixel.html mode change 100755 => 100644 hardware/neopixel/package.json diff --git a/.travis.yml b/.travis.yml index 7c414c5f..9bfec6ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ matrix: include: - node_js: 8 - node_js: 10 - - node_js: 6 - python: 2.7 language: python before_script: pip install flake8 diff --git a/hardware/neopixel/neopixel.html b/hardware/neopixel/neopixel.html old mode 100755 new mode 100644 diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json old mode 100755 new mode 100644 From 8acc5064d0503441c0b45330af1da1d319a50ff6 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 10 Sep 2018 11:37:20 -0400 Subject: [PATCH 135/456] update notify package to use a more cross platform library --- social/notify/57-notify.html | 15 ++++++++------- social/notify/57-notify.js | 25 +++++++++++++++++-------- social/notify/node-red.png | Bin 0 -> 1019 bytes social/notify/package.json | 8 ++++---- 4 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 social/notify/node-red.png diff --git a/social/notify/57-notify.html b/social/notify/57-notify.html index d0fc85d4..fe3244a2 100644 --- a/social/notify/57-notify.html +++ b/social/notify/57-notify.html @@ -1,5 +1,5 @@ - - diff --git a/social/pushover/README.md b/social/pushover/README.md index 86c592f9..158ccae7 100644 --- a/social/pushover/README.md +++ b/social/pushover/README.md @@ -16,12 +16,14 @@ Usage Uses Pushover to push the `msg.payload` to a device that has the Pushover app installed. -Optionally uses `msg.topic` to set the title, `msg.device` to set the device -and `msg.priority` to set the priority, if not already set in the properties. -Optionally uses `msg.topic` to set the title, `msg.device` to set the device, -`msg.priority` to set the priority, `msg.url` to add a web address and `msg.url_title` -to add a url title - if not already set in the properties. +Optionally uses `msg.topic` to set the configuration, if not already set in the properties: + - `msg.device`: to set the device + - `msg.priority`: to set the priority + - `msg.topic`: to set the title + - `msg.url`: to add a web address + - `msg.url_title`: to add a url title + - `msg.sound`: to set the alert sound, see the [available options](https://pushover.net/api#sounds) The User-key and API-token are stored in a separate credentials file. From eae67c7a6c37f8887e57b2c7c0ffd598fb0788ec Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 17 Sep 2018 20:00:45 +0100 Subject: [PATCH 142/456] bump pushover packe for docs pr --- social/pushover/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/social/pushover/package.json b/social/pushover/package.json index 2a52ec45..ccc56b22 100644 --- a/social/pushover/package.json +++ b/social/pushover/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pushover", - "version" : "0.0.12", + "version" : "0.0.13", "description" : "A Node-RED node to send alerts via Pushover", "dependencies" : { "pushover-notifications" : "~0.2.4" From 23ba609653ea4c080aa41f7acda154dcf78db65b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 21 Sep 2018 13:53:08 +0100 Subject: [PATCH 143/456] Add SPIdev choice to mcpxxxx node --- hardware/mcp3008/README.md | 2 ++ hardware/mcp3008/package.json | 4 ++-- hardware/mcp3008/pimcp3008.html | 10 +++++++++- hardware/mcp3008/pimcp3008.js | 5 +++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/hardware/mcp3008/README.md b/hardware/mcp3008/README.md index 0914d49c..5ab83009 100644 --- a/hardware/mcp3008/README.md +++ b/hardware/mcp3008/README.md @@ -37,6 +37,8 @@ select the channel dynamically. If so then the payload must be a value from 0 to You can also select device id 0 or 1 (CE0 or CE1) depending on how you have wired up your device. Defaults to CE0. +And you can also select the SPI bus number 0 or 1 depending on how you have wired up your device. Defaults to 0 for spidev0. + Outputs a numeric `msg.payload` with a range of 0 to 1023, where 0 = 0V and 1023 = 3.3V (assuming you use the default 3.3V voltage reference). **Hint**: use a `range` node to adjust the values to the range you want. diff --git a/hardware/mcp3008/package.json b/hardware/mcp3008/package.json index bf89c672..f9a6a028 100644 --- a/hardware/mcp3008/package.json +++ b/hardware/mcp3008/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-pi-mcp3008", - "version" : "0.1.1", + "version" : "0.2.0", "description" : "A Node-RED node to read from the MCP3008 Analogue to Digital Converter", "dependencies" : { - "mcp-spi-adc": "^1.0.0" + "mcp-spi-adc": "^2.0.3" }, "repository" : { "type":"git", diff --git a/hardware/mcp3008/pimcp3008.html b/hardware/mcp3008/pimcp3008.html index 59c2dbcc..3fafb671 100644 --- a/hardware/mcp3008/pimcp3008.html +++ b/hardware/mcp3008/pimcp3008.html @@ -33,6 +33,13 @@
    +
    + + +
    @@ -61,7 +68,8 @@ name: {value:""}, dev: {value:"3008"}, pin: {value:0, required:true}, - dnum: {value:0} + dnum: {value:0}, + bus: {value:0} }, inputs: 1, outputs: 1, diff --git a/hardware/mcp3008/pimcp3008.js b/hardware/mcp3008/pimcp3008.js index ee5e835f..492f8d6b 100644 --- a/hardware/mcp3008/pimcp3008.js +++ b/hardware/mcp3008/pimcp3008.js @@ -19,14 +19,15 @@ module.exports = function(RED) { this.pin = n.pin || 0; this.interval = n.interval || 1000; this.dnum = parseInt(n.dnum || 0); + this.bus = parseInt(n.bus || 0); this.dev = n.dev || "3008"; var node = this; var cb = function (err) { if (err) { node.error("Error: "+err); } }; - var opt = { speedHz:20000, deviceNumber:node.dnum }; + var opt = { speedHz:20000, deviceNumber:node.dnum, busNumber:node.bus }; var chans = parseInt(this.dev.substr(3)); try { - fs.statSync("/dev/spidev0."+node.dnum); + fs.statSync("/dev/spidev"+node.bus+"."+node.dnum); if (mcp3xxx.length === 0) { for (var i=0; i Date: Sun, 23 Sep 2018 20:32:11 +0100 Subject: [PATCH 144/456] check for correct version of neopixel library --- hardware/neopixel/neopixel.js | 2 +- hardware/neopixel/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 hardware/neopixel/neopixel.js diff --git a/hardware/neopixel/neopixel.js b/hardware/neopixel/neopixel.js old mode 100755 new mode 100644 index c8781367..815326e3 --- a/hardware/neopixel/neopixel.js +++ b/hardware/neopixel/neopixel.js @@ -14,7 +14,7 @@ module.exports = function(RED) { RED.log.warn("rpi-neopixels : "+RED._("node-red:rpi-gpio.errors.ignorenode")); allOK = false; } - else if (execSync('python -c "import neopixel"').toString() !== "") { + else if (execSync('python -c "import rpi_ws281x"').toString() !== "") { RED.log.warn("rpi-neopixels : Can't find neopixel python library"); allOK = false; } diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index eca2cf6b..a9bf250a 100644 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.21", + "version" : "0.0.22", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From d32f11910bc28a77557755c9f9544f3dedd7dd39 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 24 Sep 2018 19:40:33 +0100 Subject: [PATCH 145/456] clarify random node info language --- function/random/package.json | 2 +- function/random/random.html | 6 ++++-- function/random/random.js | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/function/random/package.json b/function/random/package.json index 4898c021..ee980c8d 100644 --- a/function/random/package.json +++ b/function/random/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-random", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node that when triggered generates a random number between two values.", "dependencies" : { }, diff --git a/function/random/random.html b/function/random/random.html index 0f2c3824..3e103aef 100644 --- a/function/random/random.html +++ b/function/random/random.html @@ -28,8 +28,10 @@ 70% @@ -33,7 +33,7 @@ defaults: { name: {value:""}, server: {type:"xmpp-server",required:true}, - to: {value:"",required:true}, + to: {value:""}, join: {value:false} }, inputs:0, @@ -107,20 +107,20 @@ diff --git a/social/xmpp/92-xmpp.js b/social/xmpp/92-xmpp.js index fbadad31..000b04ee 100644 --- a/social/xmpp/92-xmpp.js +++ b/social/xmpp/92-xmpp.js @@ -2,17 +2,53 @@ module.exports = function(RED) { "use strict"; var XMPP = require('simple-xmpp'); + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' function XMPPServerNode(n) { RED.nodes.createNode(this,n); - this.server = n.server; - this.port = n.port; + // this.server = n.server; + // this.port = n.port; this.nickname = n.nickname; + this.username = n.user; var credentials = this.credentials; if (credentials) { - this.username = credentials.user; this.password = credentials.password; } + this.client = new XMPP.SimpleXMPP(); + this.connected = false; + var that = this; + + this.client.con = function() { + if (that.connected === false ) { + that.connected = true; + that.client.connect({ + jid : that.username, + password : that.password, + // host : node.host, + //port : node.port, + //skipPresence : true, + reconnect : true, + preferred : "PLAIN" + }); + } + } + + that.client.on('online', function(data) { + that.connected = true; + that.client.setPresence('online', data.jid.user+' is online'); + that.log('connected as '+data.jid.user+' to '+data.jid._domain+":5222"); + }); + that.client.on('close', function() { + that.connected = false; + that.log('connection closed'); + }); + this.on("close", function(done) { + that.client.setPresence('offline'); + that.client.disconnect(); + if (that.client.conn) { that.client.conn.end(); } + that.client = null; + done(); + }); } RED.nodes.registerType("xmpp-server",XMPPServerNode,{ @@ -27,24 +63,21 @@ module.exports = function(RED) { this.server = n.server; this.serverConfig = RED.nodes.getNode(this.server); - this.host = this.serverConfig.server; - this.port = this.serverConfig.port; - this.nick = this.serverConfig.nickname || "Node-RED"; - this.userid = this.serverConfig.username; - this.password = this.serverConfig.password; + // this.host = this.serverConfig.server; + // this.port = this.serverConfig.port; + var pa = this.serverConfig.username.split("@"); + this.nick = this.serverConfig.nickname || pa[0]; this.join = n.join || false; this.sendAll = n.sendObject; - this.to = n.to || ""; + this.from = n.to || ""; var node = this; - var xmpp = new XMPP.SimpleXMPP(); + var xmpp = this.serverConfig.client; xmpp.on('online', function(data) { - node.log('connected to '+node.host+":"+node.port); node.status({fill:"green",shape:"dot",text:"connected"}); - //xmpp.setPresence('online', node.nick+' online'); - if (node.join) { + if ((node.join) && (node.from !== "")) { xmpp.join(node.to+'/'+node.nick); } }); @@ -76,17 +109,22 @@ module.exports = function(RED) { if (err.hasOwnProperty("stanza")) { if (err.stanza.name === 'stream:error') { node.error("stream:error - bad login id/pwd ?",err); } else { node.error(err.stanza.name,err); } + node.status({fill:"red",shape:"ring",text:"bad login"}); } else { - if (err.errno === "ETIMEDOUT") { node.error("Timeout connecting to server",err); } - else { node.error(err.errno,err); } + if (err.errno === "ETIMEDOUT") { + node.error("Timeout connecting to server",err); + node.status({fill:"red",shape:"ring",text:"timeout"}); + } + else if (err === "XMPP authentication failure") { + node.error(err,err); + node.status({fill:"red",shape:"ring",text:"XMPP authentication failure"}); + } + else { + node.error(err.errno,err); + node.status({fill:"red",shape:"ring",text:"error"}); + } } - node.status({fill:"red",shape:"ring",text:"error"}); - }); - - xmpp.on('close', function() { - node.log('connection closed'); - //node.status({fill:"grey",shape:"ring",text:"not connected"}); }); xmpp.on('subscribe', function(from) { @@ -96,55 +134,42 @@ module.exports = function(RED) { // Now actually make the connection try { node.status({fill:"grey",shape:"dot",text:"connecting"}); - xmpp.connect({ - jid : node.userid, - password : node.password, - host : node.host, - port : node.port, - skipPresence : true, - reconnect : false, - preferred : "PLAIN" - }); + xmpp.con(); } catch(e) { node.error("Bad xmpp configuration"); node.status({fill:"red",shape:"ring",text:"not connected"}); } - node.on("close", function(done) { - xmpp.setPresence('offline'); - xmpp.disconnect(); - if (xmpp.conn) { xmpp.conn.end(); } - xmpp = null; + node.on("close", function() { node.status({}); - done(); }); } RED.nodes.registerType("xmpp in",XmppInNode); + function XmppOutNode(n) { RED.nodes.createNode(this,n); this.server = n.server; this.serverConfig = RED.nodes.getNode(this.server); - this.host = this.serverConfig.server; - this.port = this.serverConfig.port; - this.nick = this.serverConfig.nickname || "Node-RED"; + // this.host = this.serverConfig.server; + // this.port = this.serverConfig.port; + //this.nick = this.serverConfig.nickname || "Node-RED"; this.userid = this.serverConfig.username; - this.password = this.serverConfig.password; + var pa = this.userid.split("@"); + this.nick = this.serverConfig.nickname || pa[0]; this.join = n.join || false; this.sendAll = n.sendObject; this.to = n.to || ""; var node = this; - var xmpp = new XMPP.SimpleXMPP(); + var xmpp = this.serverConfig.client; xmpp.on('online', function(data) { node.status({fill:"green",shape:"dot",text:"connected"}); - node.log('connected to '+node.host+":"+node.port); - xmpp.setPresence('online', node.nick+' online'); - if (node.join) { + if ((node.join) && (node.from !== "")) { xmpp.join(node.to+'/'+node.nick); } }); @@ -154,35 +179,28 @@ module.exports = function(RED) { if (err.hasOwnProperty("stanza")) { if (err.stanza.name === 'stream:error') { node.error("stream:error - bad login id/pwd ?",err); } else { node.error(err.stanza.name,err); } + node.status({fill:"red",shape:"ring",text:"bad login"}); } else { - if (err.errno === "ETIMEDOUT") { node.error("Timeout connecting to server",err); } - else { node.error(err.errno,err); } + if (err.errno === "ETIMEDOUT") { + node.error("Timeout connecting to server",err); + node.status({fill:"red",shape:"ring",text:"timeout"}); + } + else if (err === "XMPP authentication failure") { + node.error(err,err); + node.status({fill:"red",shape:"ring",text:"XMPP authentication failure"}); + } + else { + node.error(err.errno,err); + node.status({fill:"red",shape:"ring",text:"error"}); + } } - node.status({fill:"red",shape:"ring",text:"error"}); - }); - - xmpp.on('close', function() { - node.log('connection closed'); - //node.status({fill:"grey",shape:"ring",text:"not connected"}); - }); - - xmpp.on('subscribe', function(from) { - xmpp.acceptSubscription(from); }); // Now actually make the connection try { node.status({fill:"grey",shape:"dot",text:"connecting"}); - xmpp.connect({ - jid : node.userid, - password : node.password, - host : node.host, - port : node.port, - skipPresence : true, - reconnect : false, - preferred : "PLAIN" - }); + xmpp.con(); } catch(e) { node.error("Bad xmpp configuration"); @@ -191,7 +209,7 @@ module.exports = function(RED) { node.on("input", function(msg) { if (msg.presence) { - if (['away', 'dnd', 'xa','chat'].indexOf(msg.presence) > -1 ) { + if (['away', 'dnd', 'xa', 'chat'].indexOf(msg.presence) > -1 ) { xmpp.setPresence(msg.presence, msg.payload); } else { node.warn("Can't set presence - invalid value"); } @@ -213,13 +231,8 @@ module.exports = function(RED) { } }); - node.on("close", function(done) { - xmpp.setPresence('offline'); - xmpp.disconnect(); - if (xmpp.conn) { xmpp.conn.end(); } - xmpp = null; + node.on("close", function() { node.status({}); - done(); }); } RED.nodes.registerType("xmpp out",XmppOutNode); diff --git a/social/xmpp/package.json b/social/xmpp/package.json index d3dca717..e2176d39 100644 --- a/social/xmpp/package.json +++ b/social/xmpp/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-xmpp", - "version" : "0.1.7", + "version" : "0.2.0", "description" : "A Node-RED node to talk to an XMPP server", "dependencies" : { - "simple-xmpp" : "1.3.*" + "simple-xmpp" : "^1.3.0" }, "repository" : { "type":"git", From 7bd255a34102455480b80bfd5dd4bdcb74d0794e Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 28 Sep 2018 21:42:36 +0100 Subject: [PATCH 150/456] better filtering for XMPP messages, stop history when joining rooms --- social/xmpp/92-xmpp.html | 4 ++-- social/xmpp/92-xmpp.js | 28 ++++++++++++++++++++++++---- social/xmpp/package.json | 2 +- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/social/xmpp/92-xmpp.html b/social/xmpp/92-xmpp.html index 8cd0b64b..5b5c3933 100644 --- a/social/xmpp/92-xmpp.html +++ b/social/xmpp/92-xmpp.html @@ -1,7 +1,7 @@ + + + diff --git a/social/xmpp/92-xmpp.js b/social/xmpp/92-xmpp.js index dc873c99..1dfb35a8 100644 --- a/social/xmpp/92-xmpp.js +++ b/social/xmpp/92-xmpp.js @@ -53,7 +53,6 @@ module.exports = function(RED) { RED.nodes.registerType("xmpp-server",XMPPServerNode,{ credentials: { - user: {type:"text"}, password: {type: "password"} } }); @@ -61,13 +60,8 @@ module.exports = function(RED) { function XmppInNode(n) { RED.nodes.createNode(this,n); this.server = n.server; - this.serverConfig = RED.nodes.getNode(this.server); - // this.host = this.serverConfig.server; - // this.port = this.serverConfig.port; - var pa = this.serverConfig.username.split("@"); - this.nick = this.serverConfig.nickname || pa[0]; - + this.nick = this.serverConfig.nickname || this.serverConfig.username.split("@")[0]; this.join = n.join || false; this.sendAll = n.sendObject; this.from = n.to || ""; @@ -88,17 +82,35 @@ module.exports = function(RED) { } }); - xmpp.on('chat', function(from, message) { - var msg = { topic:from, payload:message }; - if (!node.join && ((node.from === "") || (node.from === from))) { - node.send([msg,null]); + // xmpp.on('chat', function(from, message) { + // var msg = { topic:from, payload:message }; + // if (!node.join && ((node.from === "") || (node.from === from))) { + // node.send([msg,null]); + // } + // }); + + xmpp.on('stanza', function(stanza) { + if (stanza.is('message')) { + if (stanza.attrs.type == 'chat') { + //console.log(stanza); + var body = stanza.getChild('body'); + if (body) { + var msg = { payload:body.getText() }; + var ids = stanza.attrs.from.split('/'); + if (ids[1].length !== 36) { + msg.topic = stanza.attrs.from + } + else { msg.topic = ids[0]; } + if (!node.join && ((node.from === "") || (node.from === from))) { + node.send([msg,null]); + } + } + } } }); xmpp.on('groupchat', function(conference, from, message, stamp) { - if (!stamp) {stamp = Date.now(); } - //else { console.log("STAMP",stamp) } - var msg = { topic:from, payload:message, room:conference, ts:stamp }; + var msg = { topic:from, payload:message, room:conference }; if (from != node.nick) { if ((node.join) && (node.from === conference)) { node.send([msg,null]); @@ -108,7 +120,7 @@ module.exports = function(RED) { //xmpp.on('chatstate', function(from, state) { //console.log('%s is currently %s', from, state); - //var msg = { topic:from, payload:state }; + //var msg = { topic:from, payload: {presence:state} }; //node.send([null,msg]); //}); @@ -118,6 +130,11 @@ module.exports = function(RED) { node.send([null,msg]); }); + // xmpp.on('groupbuddy', function(conference, from, state, statusText) { + // //console.log('%s: %s is in %s state - %s',conference, from, state, statusText); + // var msg = { topic:from, payload: { presence:state, status:statusText}, room:conference }; + // }); + xmpp.on('error', function(err) { if (RED.settings.verbose) { node.log(err); } if (err.hasOwnProperty("stanza")) { @@ -165,15 +182,8 @@ module.exports = function(RED) { function XmppOutNode(n) { RED.nodes.createNode(this,n); this.server = n.server; - this.serverConfig = RED.nodes.getNode(this.server); - // this.host = this.serverConfig.server; - // this.port = this.serverConfig.port; - //this.nick = this.serverConfig.nickname || "Node-RED"; - this.userid = this.serverConfig.username; - var pa = this.userid.split("@"); - this.nick = this.serverConfig.nickname || pa[0]; - + this.nick = this.serverConfig.nickname || this.serverConfig.username.split("@")[0]; this.join = n.join || false; this.sendAll = n.sendObject; this.to = n.to || ""; @@ -232,20 +242,21 @@ module.exports = function(RED) { if (['away', 'dnd', 'xa', 'chat'].indexOf(msg.presence) > -1 ) { xmpp.setPresence(msg.presence, msg.payload); } - else { node.warn("Can't set presence - invalid value"); } + else { node.warn("Can't set presence - invalid value: "+msg.presence); } } else { - var to = msg.topic; - if (node.to !== "") { to = node.to; } - if (node.sendAll) { - xmpp.send(to, JSON.stringify(msg), node.join); - } - else if (msg.payload) { - if (typeof(msg.payload) === "object") { - xmpp.send(to, JSON.stringify(msg.payload), node.join); + var to = node.to || msg.topic || ""; + if (to !== "") { + if (node.sendAll) { + xmpp.send(to, JSON.stringify(msg), node.join); } - else { - xmpp.send(to, msg.payload.toString(), node.join); + else if (msg.payload) { + if (typeof(msg.payload) === "object") { + xmpp.send(to, JSON.stringify(msg.payload), node.join); + } + else { + xmpp.send(to, msg.payload.toString(), node.join); + } } } } diff --git a/social/xmpp/package.json b/social/xmpp/package.json index 8347ff2f..37d24572 100644 --- a/social/xmpp/package.json +++ b/social/xmpp/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-xmpp", - "version" : "0.2.1", + "version" : "0.2.2", "description" : "A Node-RED node to talk to an XMPP server", "dependencies" : { "simple-xmpp" : "^1.3.0" From f74f3402e3b9cbbe494b9c0a2dac48e6fc18ca74 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 1 Oct 2018 17:31:18 +0100 Subject: [PATCH 152/456] let twitter node DM using D or d to close #493 --- social/twitter/27-twitter.js | 2 +- social/twitter/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/social/twitter/27-twitter.js b/social/twitter/27-twitter.js index 58cb4a1f..6db5d1c6 100644 --- a/social/twitter/27-twitter.js +++ b/social/twitter/27-twitter.js @@ -566,7 +566,7 @@ module.exports = function(RED) { node.on("input", function(msg) { if (msg.hasOwnProperty("payload")) { node.status({fill:"blue",shape:"dot",text:"twitter.status.tweeting"}); - if (msg.payload.slice(0,2) == "D ") { + if (msg.payload.slice(0,2).toLowerCase() === "d ") { var dm_user; // direct message syntax: "D user message" var t = msg.payload.match(/D\s+(\S+)\s+(.*)/).slice(1); diff --git a/social/twitter/package.json b/social/twitter/package.json index 2c643ac0..13b1e8ed 100644 --- a/social/twitter/package.json +++ b/social/twitter/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-twitter", - "version": "1.1.2", + "version": "1.1.3", "description": "A Node-RED node to talk to Twitter", "dependencies": { "twitter-ng": "0.6.2", From f97a59b3e37ea4fec68bac42ca1d9574c8509819 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Wed, 24 Oct 2018 20:28:38 +0900 Subject: [PATCH 153/456] Update Japanese messages (#499) * Update Japanese messages * Fix URL --- function/rbe/locales/ja/rbe.html | 4 +++- social/email/locales/ja/61-email.html | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/function/rbe/locales/ja/rbe.html b/function/rbe/locales/ja/rbe.html index a5225051..509e4df7 100644 --- a/function/rbe/locales/ja/rbe.html +++ b/function/rbe/locales/ja/rbe.html @@ -1,3 +1,5 @@ + + diff --git a/social/email/locales/ja/61-email.html b/social/email/locales/ja/61-email.html index 86da0e4f..5a6300b7 100644 --- a/social/email/locales/ja/61-email.html +++ b/social/email/locales/ja/61-email.html @@ -1,3 +1,5 @@ + + diff --git a/social/twitter/locales/en-US/27-twitter.json b/social/twitter/locales/en-US/27-twitter.json index 58e7c029..4282327d 100644 --- a/social/twitter/locales/en-US/27-twitter.json +++ b/social/twitter/locales/en-US/27-twitter.json @@ -1,7 +1,7 @@ { "twitter": { "label": { - "twitter-id":"Twitter ID", + "twitter-id": "Twitter ID", "search": "Search", "for": "for", "user": "User", @@ -10,14 +10,13 @@ "tweetslabel": "tweets", "eventslabel": "events", "create": "Create your own application at", - "copy-consumer": "From the 'Keys and Access Tokens' section, copy the Consumer Key and Secret", - "consumer_key": "Consumer Key", - "consumer_secret": "Consumer Secret", - "copy-accessToken": "Create a new 'Access Token' and copy the Access Token and Secret", - "access_key": "Access Token", - "access_secret": "Access Token Secret", - "enter-id":"Set your Twitter ID" - + "copy-consumer": "From the 'Keys and tokens' section, copy the Consumer API keys", + "consumer_key": "API key", + "consumer_secret": "API secret key", + "copy-accessToken": "Create a new 'Access token & access token secret' and copy them", + "access_key": "Access token", + "access_secret": "Access token secret", + "enter-id": "Set your Twitter ID" }, "placeholder": { "for": "comma-separated words, @ids, #tags", @@ -34,22 +33,22 @@ "status": { "using-geo": "Using geo location: __location__", "tweeting": "tweeting", - "failed":"failed" + "failed": "failed" }, "warn": { - "nousers":"User option selected but no users specified", - "waiting":"Waiting for search term" + "nousers": "User option selected but no users specified", + "waiting": "Waiting for search term" }, "errors": { - "ratelimit":"rate limit hit", - "limitrate":"limiting rate", - "streamerror":"stream error: __error__ (__rc__)", - "unexpectedend":"stream ended unexpectedly", - "invalidtag":"invalid tag property", - "missingcredentials":"missing twitter credentials", - "truncated":"truncated tweet greater than 280 characters", - "sendfail":"send tweet failed: __error__", - "nopayload":"no payload to tweet" + "ratelimit": "rate limit hit", + "limitrate": "limiting rate", + "streamerror": "stream error: __error__ (__rc__)", + "unexpectedend": "stream ended unexpectedly", + "invalidtag": "invalid tag property", + "missingcredentials": "missing twitter credentials", + "truncated": "truncated tweet greater than 280 characters", + "sendfail": "send tweet failed: __error__", + "nopayload": "no payload to tweet" } } } From 5b34702ac498e7a29bcf4f7c4e83723b473a81d3 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 24 Oct 2018 15:08:42 +0100 Subject: [PATCH 155/456] Add Tail node as separate node package - adds windows support --- storage/tail/28-tail.html | 63 +++++++++++++++++++++++++ storage/tail/28-tail.js | 60 +++++++++++++++++++++++ storage/tail/LICENSE | 14 ++++++ storage/tail/README.md | 17 +++++++ storage/tail/locales/en-US/28-tail.json | 20 ++++++++ storage/tail/package.json | 27 +++++++++++ 6 files changed, 201 insertions(+) create mode 100644 storage/tail/28-tail.html create mode 100644 storage/tail/28-tail.js create mode 100644 storage/tail/LICENSE create mode 100644 storage/tail/README.md create mode 100644 storage/tail/locales/en-US/28-tail.json create mode 100644 storage/tail/package.json diff --git a/storage/tail/28-tail.html b/storage/tail/28-tail.html new file mode 100644 index 00000000..9910de31 --- /dev/null +++ b/storage/tail/28-tail.html @@ -0,0 +1,63 @@ + + + + + + diff --git a/storage/tail/28-tail.js b/storage/tail/28-tail.js new file mode 100644 index 00000000..4fde885d --- /dev/null +++ b/storage/tail/28-tail.js @@ -0,0 +1,60 @@ + +module.exports = function(RED) { + "use strict"; + var fs = require('fs'); + var Tail = require('tail').Tail; + + function TailNode(n) { + RED.nodes.createNode(this,n); + + this.filename = n.filename; + this.filetype = n.filetype || "text"; + this.split = new RegExp(n.split || "[\r]{0,1}\n"); + var node = this; + + var fileTail = function() { + if (fs.existsSync(node.filename)) { + if (node.filetype === "text") { + node.tail = new Tail(node.filename,{separator:node.split, flushAtEOF:true}); + } + else { + node.tail = new Tail(node.filename,{separator:null, flushAtEOF:true, encoding:"binary"}); + } + + node.tail.on("line", function(data) { + if (data.length > 0) { + var msg = { topic:node.filename }; + if (node.filetype === "text") { + msg.payload = data.toString(); + node.send(msg); + } + else { + msg.payload = Buffer.from(data,"binary"); + //msg.payload = data; + node.send(msg); + } + } + }); + + node.tail.on("error", function(err) { + node.error(err.toString()); + }); + } + else { + node.tout = setTimeout(function() { fileTail(); },10000); + node.warn(RED._("tail.errors.filenotfound") + node.filename); + } + } + + fileTail(); + + node.on("close", function() { + /* istanbul ignore else */ + if (node.tail) { node.tail.unwatch(); } + delete node.tail; + if (node.tout) { clearTimeout(node.tout); } + }); + } + + RED.nodes.registerType("tail",TailNode); +} diff --git a/storage/tail/LICENSE b/storage/tail/LICENSE new file mode 100644 index 00000000..f5b60114 --- /dev/null +++ b/storage/tail/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2013-2016 IBM Corp. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/storage/tail/README.md b/storage/tail/README.md new file mode 100644 index 00000000..e6c9a935 --- /dev/null +++ b/storage/tail/README.md @@ -0,0 +1,17 @@ +node-red-node-tail +================== + +A Node-Red node to tail a file and inject the contents into the flow. + +Install +------- + +Either use the Menu - Manage palette option, or run the following command in your Node-RED user directory - typically `~/.node-red` + + npm install node-red-node-tail + + +Usage +----- + +Allows diff --git a/storage/tail/locales/en-US/28-tail.json b/storage/tail/locales/en-US/28-tail.json new file mode 100644 index 00000000..dd2da852 --- /dev/null +++ b/storage/tail/locales/en-US/28-tail.json @@ -0,0 +1,20 @@ +{ + "tail": { + "tail": "tail", + "label": { + "filename": "Filename", + "type": "File type", + "splitlines": "Split on", + "name": "Name", + "regex": "split character or regex" + }, + "action": { + "text": "Text - returns String", + "binary": "Binary - returns Buffer" + }, + "errors": { + "windowsnotsupport": "Not currently supported on Windows.", + "filenotfound": "File not found" + } + } +} diff --git a/storage/tail/package.json b/storage/tail/package.json new file mode 100644 index 00000000..c3f7ddba --- /dev/null +++ b/storage/tail/package.json @@ -0,0 +1,27 @@ +{ + "name": "node-red-node-tail", + "version": "0.0.1", + "description": "A node to tail files for Node-RED", + "dependencies": { + "tail": "^2.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/storage/tail/" + }, + "license": "Apache-2.0", + "keywords": [ + "node-red", + "tail" + ], + "node-red": { + "nodes": { + "tail": "28-tail.js" + } + }, + "author": { + "name": "Dave Conway-Jones", + "email": "ceejay@vnet.ibm.com", + "url": "http://nodered.org" + } +} From 8eaab69d046a639b19c0998ccc7b493e25d0b7b7 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Wed, 24 Oct 2018 23:27:39 +0900 Subject: [PATCH 156/456] Update Japanese translation for twitter node (#500) --- social/twitter/locales/ja/27-twitter.html | 73 +++++++++++++---------- social/twitter/locales/ja/27-twitter.json | 14 +++-- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/social/twitter/locales/ja/27-twitter.html b/social/twitter/locales/ja/27-twitter.html index f506cd62..db9f111c 100644 --- a/social/twitter/locales/ja/27-twitter.html +++ b/social/twitter/locales/ja/27-twitter.html @@ -1,41 +1,48 @@ + + + + diff --git a/social/twitter/locales/ja/27-twitter.json b/social/twitter/locales/ja/27-twitter.json index 282445f1..3edc7f46 100644 --- a/social/twitter/locales/ja/27-twitter.json +++ b/social/twitter/locales/ja/27-twitter.json @@ -9,7 +9,14 @@ "followers": "followed by", "tweetslabel": "tweets", "eventslabel": "events", - "clickhere": "Twitterの認証を行うため、ここをクリックしてください" + "create": "次のURLから自身のアプリケーションを作成", + "copy-consumer": "'Keys and tokens'セクションからConsumer APIキーをコピー", + "consumer_key": "API key", + "consumer_secret": "API secret key", + "copy-accessToken": "新たに'Access token & access token secret'を作成し、コピー", + "access_key": "Access token", + "access_secret": "Access token secret", + "enter-id": "Twitter IDを設定" }, "placeholder": { "for": "@ids, #tagsはコンマ区切りで入力", @@ -41,10 +48,7 @@ "missingcredentials": "Twitterが認証されていません", "truncated": "280文字を超えるツイートが切り捨てられました", "sendfail": "ツイートの投稿が失敗: __error__", - "nopayload": "ツイートするペイロードがありません", - "oauthbroke": "something in twitter oauth broke.", - "oautherror": "

    認証処理で問題が生じました。以下のエラーが返されました:

    __statusCode__: __errorData__

    Node-REDが動いているシステムの時刻が正しく設定されていないことが、このエラーの原因の1つです。

    ", - "authorized": "

    認証されました - このウィンドウを閉じて、Node-REDへ戻ることができます。

    " + "nopayload": "ツイートするペイロードがありません" } } } From a9a4ef9bf95eaeb94343c9eed967b2fb55544340 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 24 Oct 2018 15:31:11 +0100 Subject: [PATCH 157/456] bump rbe, email, twitter nodes --- function/rbe/package.json | 2 +- social/email/package.json | 2 +- social/twitter/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/function/rbe/package.json b/function/rbe/package.json index 1d818f94..bb0c4a8b 100644 --- a/function/rbe/package.json +++ b/function/rbe/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-rbe", - "version" : "0.2.3", + "version" : "0.2.4", "description" : "A Node-RED node that provides report-by-exception (RBE) and deadband capability.", "dependencies" : { }, diff --git a/social/email/package.json b/social/email/package.json index 33476201..49993ccd 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.0.4", + "version": "1.0.5", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", diff --git a/social/twitter/package.json b/social/twitter/package.json index 13b1e8ed..4d994fa6 100644 --- a/social/twitter/package.json +++ b/social/twitter/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-twitter", - "version": "1.1.3", + "version": "1.1.4", "description": "A Node-RED node to talk to Twitter", "dependencies": { "twitter-ng": "0.6.2", From c835fe7cadf9ca491f4cbc5974e523d3c8d8ec09 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 24 Oct 2018 21:54:13 +0100 Subject: [PATCH 158/456] fix daemon node autorun to close #494 --- utility/daemon/daemon.js | 2 +- utility/daemon/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utility/daemon/daemon.js b/utility/daemon/daemon.js index 97568c7d..f1b51183 100644 --- a/utility/daemon/daemon.js +++ b/utility/daemon/daemon.js @@ -130,7 +130,7 @@ module.exports = function(RED) { node.status({}); }); - runit(); + if (this.autorun) { runit(); } node.on("input", inputlistener); } diff --git a/utility/daemon/package.json b/utility/daemon/package.json index a45c56c0..5cf833b4 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.22", + "version" : "0.0.23", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From 5f22603bebdf13832fd91d9a046bedb7281d7b4d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 26 Oct 2018 17:00:27 +0100 Subject: [PATCH 159/456] Email node - Catch bad IMAP folder error to close #495 --- social/email/61-email.js | 147 ++++++++++++++++++++------------------ social/email/package.json | 2 +- 2 files changed, 80 insertions(+), 69 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index 89dae648..eb0fdc3b 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -325,76 +325,88 @@ module.exports = function(RED) { imap.openBox(node.box, // Mailbox name false, // Open readonly? function(err, box) { + //console.log("> Inbox err : %j", err); //console.log("> Inbox open: %j", box); - imap.search([ 'UNSEEN' ], function(err, results) { - if (err) { - node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); - node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); - imap.end(); - setInputRepeatTimeout(); - return; - } - //console.log("> search - err=%j, results=%j", err, results); - if (results.length === 0) { - //console.log(" [X] - Nothing to fetch"); - node.status({}); - imap.end(); - setInputRepeatTimeout(); - return; - } - - var marks = false; - if (node.disposition === "Read") { marks = true; } - // We have the search results that contain the list of unseen messages and can now fetch those messages. - var fetch = imap.fetch(results, { - bodies: '', - struct: true, - markSeen: marks - }); - - // For each fetched message returned ... - fetch.on('message', function(imapMessage, seqno) { - //node.log(RED._("email.status.message",{number:seqno})); - var messageText = ""; - //console.log("> Fetch message - msg=%j, seqno=%d", imapMessage, seqno); - imapMessage.on('body', function(stream, info) { - //console.log("> message - body - stream=?, info=%j", info); - stream.on('data', function(chunk) { - //console.log("> stream - data - chunk=??"); - messageText += chunk.toString('utf8'); - }); - stream.once('end', function() { - var mailParser = new MailParser(); - mailParser.on('end', function(mailMessage) { - processNewMessage(msg, mailMessage); - }); - mailParser.write(messageText); - mailParser.end(); - }); // End of msg->end - }); // End of msg->body - }); // End of fetch->message - - // When we have fetched all the messages, we don't need the imap connection any more. - fetch.on('end', function() { - node.status({}); - var cleanup = function() { + if (err) { + node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); + node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); + imap.end(); + setInputRepeatTimeout(); + return; + } + else { + imap.search([ 'UNSEEN' ], function(err, results) { + if (err) { + node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); + node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); imap.end(); - }; - if (this.disposition === "Delete") { - imap.addFlags(results, "\Deleted", cleanup); - } else if (this.disposition === "Read") { - imap.addFlags(results, "\Seen", cleanup); - } else { - cleanup(); + setInputRepeatTimeout(); + return; } - setInputRepeatTimeout(); - }); + else { + //console.log("> search - err=%j, results=%j", err, results); + if (results.length === 0) { + //console.log(" [X] - Nothing to fetch"); + node.status({}); + imap.end(); + setInputRepeatTimeout(); + return; + } - fetch.once('error', function(err) { - console.log('Fetch error: ' + err); - setInputRepeatTimeout(); - }); - }); // End of imap->search + var marks = false; + if (node.disposition === "Read") { marks = true; } + // We have the search results that contain the list of unseen messages and can now fetch those messages. + var fetch = imap.fetch(results, { + bodies: '', + struct: true, + markSeen: marks + }); + + // For each fetched message returned ... + fetch.on('message', function(imapMessage, seqno) { + //node.log(RED._("email.status.message",{number:seqno})); + var messageText = ""; + //console.log("> Fetch message - msg=%j, seqno=%d", imapMessage, seqno); + imapMessage.on('body', function(stream, info) { + //console.log("> message - body - stream=?, info=%j", info); + stream.on('data', function(chunk) { + //console.log("> stream - data - chunk=??"); + messageText += chunk.toString('utf8'); + }); + stream.once('end', function() { + var mailParser = new MailParser(); + mailParser.on('end', function(mailMessage) { + processNewMessage(msg, mailMessage); + }); + mailParser.write(messageText); + mailParser.end(); + }); // End of msg->end + }); // End of msg->body + }); // End of fetch->message + + // When we have fetched all the messages, we don't need the imap connection any more. + fetch.on('end', function() { + node.status({}); + var cleanup = function() { + imap.end(); + }; + if (this.disposition === "Delete") { + imap.addFlags(results, "\Deleted", cleanup); + } else if (this.disposition === "Read") { + imap.addFlags(results, "\Seen", cleanup); + } else { + cleanup(); + } + setInputRepeatTimeout(); + }); + + fetch.once('error', function(err) { + console.log('Fetch error: ' + err); + setInputRepeatTimeout(); + }); + } + }); // End of imap->search + } }); // End of imap->openInbox }); // End of imap->ready node.status({fill:"grey",shape:"dot",text:"node-red:common.status.connecting"}); @@ -441,8 +453,7 @@ module.exports = function(RED) { if (imap) { imap.destroy(); } }); - function setInputRepeatTimeout() - { + function setInputRepeatTimeout() { // Set the repetition timer as needed if (!isNaN(node.repeat) && node.repeat > 0) { node.interval_id = setTimeout( function() { diff --git a/social/email/package.json b/social/email/package.json index 49993ccd..7cd3b409 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.0.5", + "version": "1.0.6", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", From e1e5432ac654476e9a893cf8ef58ffd4a1adb1c1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 11 Nov 2018 22:36:42 +0000 Subject: [PATCH 160/456] revert srf node to not use edges seems more reliable to me... :-) --- hardware/PiSrf/nrsrf.py | 69 +++++++++++++++---------------------- hardware/PiSrf/package.json | 2 +- 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/hardware/PiSrf/nrsrf.py b/hardware/PiSrf/nrsrf.py index ab0d16d8..e17a5a71 100755 --- a/hardware/PiSrf/nrsrf.py +++ b/hardware/PiSrf/nrsrf.py @@ -16,48 +16,32 @@ ECHO = 0 TRIGGER = 0 OLD = 0 SLEEP = 0.5 +MAX_DIST = 400 def Measure(): - start = 0 + realstart = time.time() GPIO.output(TRIGGER, True) time.sleep(0.00001) GPIO.output(TRIGGER, False) + while GPIO.input(ECHO)==0: + start = time.time() + Dif = time.time() - realstart + if Dif > 0.2: + print("Ultrasonic Sensor Timed out, Restart.") + time.sleep(0.4) + return 400 + while GPIO.input(ECHO)==1: + stop = time.time() + Dif = time.time() - realstart + if Dif > 0.4: + print("Ultrasonic Sensor Timed out, Restarting.") + time.sleep(0.2) + return 400 - channel = GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=200) - if channel is None: - print("Ultrasonic sensor timed out (pre-echo).") - GPIO.remove_event_detect(ECHO) - restart() - # else: - # print("Echo start detected") - start = time.time() - - GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=400) - if channel is None: - print("Ultrasonic sensor timed out (post-echo).") - GPIO.remove_event_detect(ECHO) - restart() - # else: - # print("Echo finish detected") - stop = time.time() - - elapsed = stop-start - distance = (elapsed * 34300)/2 # Using speed of sound at 20C (68F) - + elapsed = stop - start + distance = (elapsed * 36000)/2 return distance -def restart(): - # print("Restarting...") - GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers - GPIO.setup(TRIGGER, GPIO.OUT) # Trigger - GPIO.output(TRIGGER, False) # Set low - GPIO.setup(ECHO, GPIO.OUT) # Echo - GPIO.output(ECHO, False) - time.sleep(0.1) - GPIO.setup(ECHO,GPIO.IN) - GPIO.add_event_detect(ECHO, GPIO.BOTH) - time.sleep(2.0) - # Main program loop if len(sys.argv) > 1: pins = sys.argv[1].lower().split(',') @@ -70,7 +54,12 @@ if len(sys.argv) > 1: ECHO = int(pins[1]) SLEEP = float(pins[2]) - restart() + GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers + GPIO.setup(TRIGGER, GPIO.OUT) # Trigger + GPIO.output(TRIGGER, False) + GPIO.setup(ECHO, GPIO.OUT) # Echo + GPIO.output(ECHO, False) + GPIO.setup(ECHO,GPIO.IN) # Flush stdin so we start clean while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0: @@ -83,14 +72,12 @@ if len(sys.argv) > 1: print(distance) OLD = distance time.sleep(SLEEP) - except Exception as e: # try to clean up on exit - print(e) # Print error message on exception - GPIO.remove_event_detect(ECHO) - GPIO.cleanup(TRIGGER) - GPIO.cleanup(ECHO) + except: # try to clean up on exit + print("0.0") + GPIO.cleanup() sys.exit(0) else: print("Bad params") - print(" sudo nrsrf.py trigger_pin,echo_pin,rate_in_seconds") + print(" nrsrf.py trigger_pin, echo_pin, rate_in_seconds") sys.exit(0) diff --git a/hardware/PiSrf/package.json b/hardware/PiSrf/package.json index 7c26ba7f..166283b8 100644 --- a/hardware/PiSrf/package.json +++ b/hardware/PiSrf/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pisrf", - "version" : "0.1.2", + "version" : "0.1.3", "description" : "A Node-RED node for a Raspberry Pi to use a SRF04 or SRF05 range finder", "dependencies" : { }, From f1066285ae46d54b4790cef80abb5d02b7f45769 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 11 Nov 2018 22:36:55 +0000 Subject: [PATCH 161/456] add some more tests to rbe --- test/function/rbe/rbe_spec.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/test/function/rbe/rbe_spec.js b/test/function/rbe/rbe_spec.js index 9d9a9425..510e1205 100644 --- a/test/function/rbe/rbe_spec.js +++ b/test/function/rbe/rbe_spec.js @@ -40,25 +40,40 @@ describe('rbe node', function() { c+=1; } else if (c === 1) { - msg.should.have.a.property("payload", "b"); + msg.should.have.a.property("payload", 2); c+=1; } - else { + else if (c == 2) { msg.should.have.a.property("payload"); msg.payload.should.have.a.property("b",1); msg.payload.should.have.a.property("c",2); + c+=1; + } + else if (c == 3) { + msg.should.have.a.property("payload",true); + c+=1; + } + else if (c == 4) { + msg.should.have.a.property("payload",false); + c+=1; + } + else { + msg.should.have.a.property("payload",true); done(); } }); n1.emit("input", {payload:"a"}); n1.emit("input", {payload:"a"}); n1.emit("input", {payload:"a"}); - n1.emit("input", {payload:"a"}); - n1.emit("input", {payload:"a"}); - n1.emit("input", {payload:"b"}); + n1.emit("input", {payload:2}); + n1.emit("input", {payload:2}); n1.emit("input", {payload:{b:1,c:2}}); n1.emit("input", {payload:{c:2,b:1}}); n1.emit("input", {payload:{c:2,b:1}}); + n1.emit("input", {payload:true}); + n1.emit("input", {payload:false}); + n1.emit("input", {payload:false}); + n1.emit("input", {payload:true}); }); }); From 7f44a2af3db6114dae336654b8d38c22ebc75921 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 25 Nov 2018 18:44:01 +0000 Subject: [PATCH 162/456] Neopixel Add 0mS timeout option for instant updates Thanks @cymplecy --- hardware/neopixel/neopix.py | 126 ++++++++++++++++++++------------- hardware/neopixel/package.json | 2 +- 2 files changed, 76 insertions(+), 52 deletions(-) diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index 288002b2..f5f66484 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -62,10 +62,15 @@ def setPixel(strip, i, color): def setPixels(strip, s, e, color, wait_ms=30): """Set pixels from s(tart) to e(nd)""" - for i in range(s, e+1): - strip.setPixelColor(i, color) + if (wait_ms > 0): + for i in range(s, e+1): + strip.setPixelColor(i, color) + strip.show() + time.sleep(wait_ms/1000.0) + else: + for i in range(s, e+1): + strip.setPixelColor(i, color) strip.show() - time.sleep(wait_ms/1000.0) def setBrightness(strip, brightness, wait_ms=30): """Set overall brighness""" @@ -75,36 +80,55 @@ def setBrightness(strip, brightness, wait_ms=30): def colorWipe(strip, color, wait_ms=30): """Wipe color across display a pixel at a time.""" - for i in range(strip.numPixels()): - strip.setPixelColor(i, color) + if (wait_ms > 0): + for i in range(strip.numPixels()): + strip.setPixelColor(i, color) + strip.show() + time.sleep(wait_ms/1000.0) + else: + for i in range(strip.numPixels()): + strip.setPixelColor(i, color) strip.show() - time.sleep(wait_ms/1000.0) def shiftUp(strip, color, wait_ms=30): """Shift all pixels one way.""" oldcolour = strip.getPixelColor(0) strip.setPixelColor(0, color) strip.show() - time.sleep(wait_ms/1000.0) - for i in range(1,LED_COUNT): - newcolour = oldcolour - oldcolour = strip.getPixelColor(i) - strip.setPixelColor(i, newcolour) - strip.show() + if (wait_ms > 0): time.sleep(wait_ms/1000.0) + for i in range(1,LED_COUNT): + newcolour = oldcolour + oldcolour = strip.getPixelColor(i) + strip.setPixelColor(i, newcolour) + strip.show() + time.sleep(wait_ms/1000.0) + else: + for i in range(1,LED_COUNT): + newcolour = oldcolour + oldcolour = strip.getPixelColor(i) + strip.setPixelColor(i, newcolour) + strip.show() def shiftDown(strip, color, wait_ms=30): """Shift all pixels the other way.""" oldcolour = strip.getPixelColor(LED_COUNT-1) strip.setPixelColor(LED_COUNT-1, color) strip.show() - time.sleep(wait_ms/1000.0) - for i in range(LED_COUNT-2,-1,-1): - newcolour = oldcolour - oldcolour = strip.getPixelColor(i) - strip.setPixelColor(i, newcolour) - strip.show() + if (wait_ms > 0): time.sleep(wait_ms/1000.0) + for i in range(LED_COUNT-2,-1,-1): + newcolour = oldcolour + oldcolour = strip.getPixelColor(i) + strip.setPixelColor(i, newcolour) + strip.show() + time.sleep(wait_ms/1000.0) + else: + for i in range(LED_COUNT-2,-1,-1): + newcolour = oldcolour + oldcolour = strip.getPixelColor(i) + strip.setPixelColor(i, newcolour) + strip.show() def wheel(pos): """Generate rainbow colors across 0-255 positions.""" @@ -142,39 +166,39 @@ if __name__ == '__main__': else: strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_GAMMA)# Intialize the library (must be called once before other functions). - strip.begin() + strip.begin() - ## Color wipe animations. - colorWipe(strip, Color(127, 0, 0), WAIT_MS) # Red wipe - colorWipe(strip, Color(0, 127, 0), WAIT_MS) # Green wipe - colorWipe(strip, Color(0, 0, 127), WAIT_MS) # Blue wipe - colorWipe(strip, Color(0, 0, 0), WAIT_MS) # Off wipe + ## Color wipe animations. + colorWipe(strip, Color(127, 0, 0), WAIT_MS) # Red wipe + colorWipe(strip, Color(0, 127, 0), WAIT_MS) # Green wipe + colorWipe(strip, Color(0, 0, 127), WAIT_MS) # Blue wipe + colorWipe(strip, Color(0, 0, 0), WAIT_MS) # Off wipe - ## Rainbow animations. - #rainbow(strip) - #rainbowCycle(strip) - #colorWipe(strip, Color(0, 0, 0)) # Off wipe + ## Rainbow animations. + #rainbow(strip) + #rainbowCycle(strip) + #colorWipe(strip, Color(0, 0, 0)) # Off wipe - while True: - try: - data = raw_input() - bits = data.split(',') - if len(bits) == 2: - if bits[0] == "brightness": - setBrightness(strip, min(255,max(0,int(bits[1]))), WAIT_MS) - if len(bits) == 3: - if MODE == "shiftu": - shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - elif MODE == "shiftd": - shiftDown(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - else: - colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - if (MODE[0] == 'p' and len(bits) == 4): - setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) )) - if (MODE[0] == 'p' and len(bits) == 5): - setPixels(strip, int(bits[0]), int(bits[1]), Color(int(bits[2]), int(bits[3]), int(bits[4]) ), WAIT_MS) - except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program - sys.exit(0) - except Exception as ex: - print("bad data: "+data) - print(ex) + while True: + try: + data = raw_input() + bits = data.split(',') + if len(bits) == 2: + if bits[0] == "brightness": + setBrightness(strip, min(255,max(0,int(bits[1]))), WAIT_MS) + if len(bits) == 3: + if MODE == "shiftu": + shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + elif MODE == "shiftd": + shiftDown(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + else: + colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + if (MODE[0] == 'p' and len(bits) == 4): + setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) )) + if (MODE[0] == 'p' and len(bits) == 5): + setPixels(strip, int(bits[0]), int(bits[1]), Color(int(bits[2]), int(bits[3]), int(bits[4]) ), WAIT_MS) + except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program + sys.exit(0) + except Exception as ex: + print("bad data: "+data) + print(ex) diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index a9bf250a..bd4530ed 100644 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.22", + "version" : "0.0.23", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From 174c18a289d2fec317033d744c7d64450a2f2cb9 Mon Sep 17 00:00:00 2001 From: cymplecy Date: Mon, 26 Nov 2018 08:27:58 +0000 Subject: [PATCH 163/456] Update neopix.py (#505) Remove waits inside loops if wait time == 0 From b34338357f0a3ac839d5c5cd13f0a92db2a48d0d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 26 Nov 2018 08:30:22 +0000 Subject: [PATCH 164/456] neopixel - reallign tabs... --- hardware/neopixel/neopix.py | 66 +++++++++++++++++----------------- hardware/neopixel/package.json | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index f5f66484..83756f0f 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -166,39 +166,39 @@ if __name__ == '__main__': else: strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_GAMMA)# Intialize the library (must be called once before other functions). - strip.begin() + strip.begin() - ## Color wipe animations. - colorWipe(strip, Color(127, 0, 0), WAIT_MS) # Red wipe - colorWipe(strip, Color(0, 127, 0), WAIT_MS) # Green wipe - colorWipe(strip, Color(0, 0, 127), WAIT_MS) # Blue wipe - colorWipe(strip, Color(0, 0, 0), WAIT_MS) # Off wipe + ## Color wipe animations. + colorWipe(strip, Color(127, 0, 0), WAIT_MS) # Red wipe + colorWipe(strip, Color(0, 127, 0), WAIT_MS) # Green wipe + colorWipe(strip, Color(0, 0, 127), WAIT_MS) # Blue wipe + colorWipe(strip, Color(0, 0, 0), WAIT_MS) # Off wipe - ## Rainbow animations. - #rainbow(strip) - #rainbowCycle(strip) - #colorWipe(strip, Color(0, 0, 0)) # Off wipe + ## Rainbow animations. + #rainbow(strip) + #rainbowCycle(strip) + #colorWipe(strip, Color(0, 0, 0)) # Off wipe - while True: - try: - data = raw_input() - bits = data.split(',') - if len(bits) == 2: - if bits[0] == "brightness": - setBrightness(strip, min(255,max(0,int(bits[1]))), WAIT_MS) - if len(bits) == 3: - if MODE == "shiftu": - shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - elif MODE == "shiftd": - shiftDown(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - else: - colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) - if (MODE[0] == 'p' and len(bits) == 4): - setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) )) - if (MODE[0] == 'p' and len(bits) == 5): - setPixels(strip, int(bits[0]), int(bits[1]), Color(int(bits[2]), int(bits[3]), int(bits[4]) ), WAIT_MS) - except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program - sys.exit(0) - except Exception as ex: - print("bad data: "+data) - print(ex) + while True: + try: + data = raw_input() + bits = data.split(',') + if len(bits) == 2: + if bits[0] == "brightness": + setBrightness(strip, min(255,max(0,int(bits[1]))), WAIT_MS) + if len(bits) == 3: + if MODE == "shiftu": + shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + elif MODE == "shiftd": + shiftDown(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + else: + colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS) + if (MODE[0] == 'p' and len(bits) == 4): + setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) )) + if (MODE[0] == 'p' and len(bits) == 5): + setPixels(strip, int(bits[0]), int(bits[1]), Color(int(bits[2]), int(bits[3]), int(bits[4]) ), WAIT_MS) + except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program + sys.exit(0) + except Exception as ex: + print("bad data: "+data) + print(ex) diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index bd4530ed..795bfec3 100644 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.0.23", + "version" : "0.0.24", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From b75f12acedeb4aa0cf2720ce4ec4553a4b117501 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 28 Nov 2018 09:18:18 +0000 Subject: [PATCH 165/456] piSRF - better handle timeouts, closing --- hardware/PiSrf/nrsrf.py | 11 ++++++++--- hardware/PiSrf/package.json | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hardware/PiSrf/nrsrf.py b/hardware/PiSrf/nrsrf.py index e17a5a71..fbe7138c 100755 --- a/hardware/PiSrf/nrsrf.py +++ b/hardware/PiSrf/nrsrf.py @@ -8,6 +8,11 @@ import RPi.GPIO as GPIO import time import sys import os, select +import signal + +def signal_handler(sig, frame): + sys.exit(0) +signal.signal(signal.SIGINT, signal_handler) # Turn off warnings if you run it a second time... GPIO.setwarnings(False) @@ -23,11 +28,13 @@ def Measure(): GPIO.output(TRIGGER, True) time.sleep(0.00001) GPIO.output(TRIGGER, False) + start = time.time() + stop = time.time() while GPIO.input(ECHO)==0: start = time.time() Dif = time.time() - realstart if Dif > 0.2: - print("Ultrasonic Sensor Timed out, Restart.") + # print("Ultrasonic Sensor Timed out, Restart.") time.sleep(0.4) return 400 while GPIO.input(ECHO)==1: @@ -74,8 +81,6 @@ if len(sys.argv) > 1: time.sleep(SLEEP) except: # try to clean up on exit print("0.0") - GPIO.cleanup() - sys.exit(0) else: print("Bad params") diff --git a/hardware/PiSrf/package.json b/hardware/PiSrf/package.json index 166283b8..5f8b96af 100644 --- a/hardware/PiSrf/package.json +++ b/hardware/PiSrf/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pisrf", - "version" : "0.1.3", + "version" : "0.1.4", "description" : "A Node-RED node for a Raspberry Pi to use a SRF04 or SRF05 range finder", "dependencies" : { }, From d73d5f1af3416496851f363fd7f1bdba818c6512 Mon Sep 17 00:00:00 2001 From: Arnaud Marchand Date: Wed, 28 Nov 2018 19:39:52 +0100 Subject: [PATCH 166/456] Save point (#506) --- io/stomp/18-stomp.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/io/stomp/18-stomp.js b/io/stomp/18-stomp.js index 80652903..311f9e35 100644 --- a/io/stomp/18-stomp.js +++ b/io/stomp/18-stomp.js @@ -66,15 +66,15 @@ module.exports = function(RED) { node.client.connect(function(sessionId) { node.log('subscribing to: '+node.topic); node.client.subscribe(node.topic, function(body, headers) { + var newmsg={"headers":headers,"topic":node.topic} + try { - msg.payload = JSON.parse(body); + newmsg.payload = JSON.parse(body); } catch(e) { - msg.payload = body; + newmsg.payload = body; } - msg.headers = headers; - msg.topic = node.topic; - node.send(msg); + node.send(newmsg); }); }, function(error) { node.status({fill:"grey",shape:"dot",text:"error"}); From 739e8cd9b6b6d3bbbbe6aa9ce5d307ceea0fb744 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 28 Nov 2018 18:42:44 +0000 Subject: [PATCH 167/456] bump stomp package to pick up PR fix for bad msg reuse --- io/stomp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io/stomp/package.json b/io/stomp/package.json index 68923293..a6537ec3 100644 --- a/io/stomp/package.json +++ b/io/stomp/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-stomp", - "version" : "0.0.11", + "version" : "0.0.12", "description" : "A Node-RED node to publish and subscribe to/from a Stomp server", "dependencies" : { "stomp-client" : "^0.9.0" From 89d78538910adf91cb6b43381a08bcb5cee13db7 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 5 Dec 2018 13:46:08 +0000 Subject: [PATCH 168/456] Better error catching in ping node for spawn errors... --- io/ping/88-ping.js | 14 ++++++++++++++ io/ping/README.md | 6 ++++-- io/ping/package.json | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/io/ping/88-ping.js b/io/ping/88-ping.js index 71b250dd..1db1f59e 100644 --- a/io/ping/88-ping.js +++ b/io/ping/88-ping.js @@ -18,6 +18,7 @@ module.exports = function(RED) { else { node.error("Sorry - your platform - "+plat+" - is not recognised."); } var res = false; var line = ""; + var fail = false; //var regex = /from.*time.(.*)ms/; var regex = /=.*[<|=]([0-9]*).*TTL|ttl..*=([0-9\.]*)/; ex.stdout.on('data', function (data) { @@ -26,7 +27,20 @@ module.exports = function(RED) { //ex.stderr.on('data', function (data) { //console.log('[ping] stderr: ' + data); //}); + ex.on('error', function (err) { + fail = true; + if (err.code === "ENOENT") { + node.error(err.code + " ping command not found"); + } + else if (err.code === "EACCES") { + node.error(err.code + " can't run ping command"); + } + else { + node.error(err.code); + } + }); ex.on('close', function (code) { + if (fail) { fail = false; return; } var m = regex.exec(line)||""; if (m !== '') { if (m[1]) { res = Number(m[1]); } diff --git a/io/ping/README.md b/io/ping/README.md index 6c1ebbcb..692be563 100644 --- a/io/ping/README.md +++ b/io/ping/README.md @@ -11,9 +11,11 @@ Run the following command in your Node-RED user directory - typically `~/.node-r npm install node-red-node-ping -**Gotcha** +**Gotchas** -On some versions on Raspbian (Raspberry Pi) `ping` seems to be a root only command. + 1 This won't run on Ubunti Snap as the strict container does not allow spawning of external commands (like ping). + + 2 On some versions on Raspbian (Raspberry Pi) `ping` seems to be a root only command. The fix is to allow it as follows sudo setcap cap_net_raw=ep /bin/ping diff --git a/io/ping/package.json b/io/ping/package.json index 4ea4be27..eeac8944 100644 --- a/io/ping/package.json +++ b/io/ping/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ping", - "version" : "0.0.15", + "version" : "0.0.16", "description" : "A Node-RED node to ping a remote server, for use as a keep-alive check.", "dependencies" : { }, From d0f36dcda101aa7c420d2bb531109753ffa11090 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 7 Dec 2018 16:55:16 +0000 Subject: [PATCH 169/456] update ping node readme (how to run in snap) --- io/ping/88-ping.html | 4 +++- io/ping/README.md | 5 ++++- io/ping/package.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/io/ping/88-ping.html b/io/ping/88-ping.html index ad1e2d26..97bd035f 100644 --- a/io/ping/88-ping.html +++ b/io/ping/88-ping.html @@ -18,7 +18,9 @@

    Pings a machine and returns the trip time in mS as msg.payload.

    Returns false if no response received within 5 seconds, or if the host is unresolveable.

    Default ping is every 20 seconds but can be configured.

    -

    msg.topic contains the target host ip. +

    msg.topic contains the target host ip.

    +

    Note: if running inside Ubuntu Snap you will need to manually start the network-observe interface. + `snap connect node-red:network-observe`

    diff --git a/analysis/sentiment/locales/ja/72-sentiment.json b/analysis/sentiment/locales/ja/72-sentiment.json new file mode 100644 index 00000000..6072d928 --- /dev/null +++ b/analysis/sentiment/locales/ja/72-sentiment.json @@ -0,0 +1,8 @@ +{ + "sentiment": { + "sentiment": "sentiment", + "label": { + "language": "言語" + } + } +} diff --git a/analysis/sentiment/package.json b/analysis/sentiment/package.json index 4c3f2bc1..0716e8d2 100644 --- a/analysis/sentiment/package.json +++ b/analysis/sentiment/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-sentiment", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node that uses the AFINN-165 wordlists for sentiment analysis of words translated into multiple languages including emojis.", "dependencies" : { "multilang-sentiment" : "^1.1.6" diff --git a/storage/tail/locales/ja/28-tail.html b/storage/tail/locales/ja/28-tail.html new file mode 100644 index 00000000..51303859 --- /dev/null +++ b/storage/tail/locales/ja/28-tail.html @@ -0,0 +1,25 @@ + + + diff --git a/storage/tail/locales/ja/28-tail.json b/storage/tail/locales/ja/28-tail.json new file mode 100644 index 00000000..740c56e1 --- /dev/null +++ b/storage/tail/locales/ja/28-tail.json @@ -0,0 +1,19 @@ +{ + "tail": { + "tail": "tail", + "label": { + "filename": "ファイル名", + "type": "ファイル形式", + "splitlines": "改行でメッセージを分割", + "name": "名前", + "regex": "正規表現を使用" + }, + "action": { + "text": "文字列", + "binary": "バイナリバッファ" + }, + "errors": { + "windowsnotsupport": "現在Windows上での動作は対応していません" + } + } +} diff --git a/storage/tail/locales/zh-CN/28-tail.json b/storage/tail/locales/zh-CN/28-tail.json new file mode 100644 index 00000000..5a22c610 --- /dev/null +++ b/storage/tail/locales/zh-CN/28-tail.json @@ -0,0 +1,17 @@ +{ + "tail": { + "tail": "tail", + "label": { + "filename": "文件名", + "type": "文件类型", + "splitlines": "以\\n来拆分行?" + }, + "action": { + "text": "文本 - 返回字符串", + "binary": "二进制 - 返回Buffer" + }, + "errors": { + "windowsnotsupport": "Windows目前不支持." + } + } +} diff --git a/storage/tail/package.json b/storage/tail/package.json index c3f7ddba..38fba264 100644 --- a/storage/tail/package.json +++ b/storage/tail/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-tail", - "version": "0.0.1", + "version": "0.0.2", "description": "A node to tail files for Node-RED", "dependencies": { "tail": "^2.0.0" From 71135980989bc814c3bb77e1c3ee66076f9d253b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 7 Dec 2018 23:30:57 +0000 Subject: [PATCH 171/456] Bump email deps --- social/email/package-lock.json | 158 ++++++++++++++++++++++++++++++++- social/email/package.json | 4 +- 2 files changed, 156 insertions(+), 6 deletions(-) diff --git a/social/email/package-lock.json b/social/email/package-lock.json index 7f35f07b..b4be1c30 100644 --- a/social/email/package-lock.json +++ b/social/email/package-lock.json @@ -1,13 +1,163 @@ { "name": "node-red-node-email", - "version": "0.1.29", + "version": "1.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "imap": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/imap/-/imap-0.8.19.tgz", + "integrity": "sha1-NniHOTSrCc6mukh0HyhNoq9Z2NU=", + "requires": { + "readable-stream": "1.1.x", + "utf7": ">=1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "mailparser-mit": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/mailparser-mit/-/mailparser-mit-0.6.2.tgz", + "integrity": "sha1-XcRAcbMyJ1bwSyzw+BebQTmeoO4=", + "requires": { + "encoding": "^0.1.12", + "mime": "^1.3.4", + "mimelib": "^0.3.0", + "uue": "^3.1.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mimelib": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.3.1.tgz", + "integrity": "sha1-eHrdJBXYJ6yzr27EvKHqlZZBiFM=", + "requires": { + "addressparser": "~1.0.1", + "encoding": "~0.1.12" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, "nodemailer": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.4.tgz", - "integrity": "sha512-SD4uuX7NMzZ5f5m1XHDd13J4UC3SmdJk8DsmU1g6Nrs5h3x9LcXr6EBPZIqXRJ3LrF7RdklzGhZRF/TuylTcLg==" + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.7.0.tgz", + "integrity": "sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw==" + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "poplib": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/poplib/-/poplib-0.1.7.tgz", + "integrity": "sha1-L0tYtVkpcjUM2X9IKrpo+OBVdLw=", + "requires": { + "optimist": "*" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.3.0", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "utf7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", + "integrity": "sha1-lV9JCq5lO6IguUVqCod2wZk2CZE=", + "requires": { + "semver": "~5.3.0" + } + }, + "uue": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/uue/-/uue-3.1.2.tgz", + "integrity": "sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg==", + "requires": { + "escape-string-regexp": "~1.0.5", + "extend": "~3.0.0" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } } diff --git a/social/email/package.json b/social/email/package.json index 7cd3b409..41586377 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,11 +1,11 @@ { "name": "node-red-node-email", - "version": "1.0.6", + "version": "1.0.7", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", "mailparser-mit": "^0.6.2", - "nodemailer": "^4.6.8", + "nodemailer": "^4.7.0", "poplib": "^0.1.7" }, "repository": { From 73e4ae574c488685f7a24d86853e5ca8edbf636d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 9 Dec 2018 11:01:18 +0000 Subject: [PATCH 172/456] Set WOL node to use more generic broadcast address byt default --- io/wol/39-wol.html | 8 +++++--- io/wol/39-wol.js | 6 +++++- io/wol/package.json | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/io/wol/39-wol.html b/io/wol/39-wol.html index feb46d13..b53283b9 100644 --- a/io/wol/39-wol.html +++ b/io/wol/39-wol.html @@ -5,8 +5,8 @@
    - - + +
    @@ -18,7 +18,9 @@ + + @@ -171,6 +172,27 @@
    +
    + + +

    @@ -199,9 +221,11 @@ if (protocol === "IMAP") { $(".node-input-box").show(); $(".node-input-disposition").show(); + $(".node-input-criteria").show(); } else { $(".node-input-box").hide(); $(".node-input-disposition").hide(); + $(".node-input-criteria").hide(); } checkPorts(); }); @@ -252,6 +276,7 @@ port: {value:"993",required:true}, box: {value:"INBOX"}, // For IMAP, The mailbox to process disposition: { value: "Read" }, // For IMAP, the disposition of the read email + criteria: {value: "UNSEEN"}, repeat: {value:"300",required:true}, fetch: {value:"auto"}, inputs: {value:0} diff --git a/social/email/61-email.js b/social/email/61-email.js index 8e466901..2ae4206e 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -160,6 +160,7 @@ module.exports = function(RED) { this.useSSL= n.useSSL; this.protocol = n.protocol || "IMAP"; this.disposition = n.disposition || "None"; // "None", "Delete", "Read" + this.criteria = n.criteria || "UNSEEN"; // "ALL", "ANSWERED", "FLAGGED", "SEEN", "UNANSWERED", "UNFLAGGED", "UNSEEN" var flag = false; @@ -343,7 +344,7 @@ module.exports = function(RED) { return; } else { - imap.search([ 'UNSEEN' ], function(err, results) { + imap.search([ this.criteria ], function(err, results) { if (err) { node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); diff --git a/social/email/locales/en-US/61-email.json b/social/email/locales/en-US/61-email.json index 702e6492..4f8b4bdb 100644 --- a/social/email/locales/en-US/61-email.json +++ b/social/email/locales/en-US/61-email.json @@ -20,7 +20,15 @@ "disposition": "Disposition", "none": "None", "read": "Mark Read", - "delete": "Delete" + "delete": "Delete", + "criteria": "Criteria", + "all": "All", + "answered": "Answered", + "flagged": "Flagged", + "seen": "Seen", + "unanswered": "Unanswered", + "unflagged": "Unflagged", + "unseen": "Unseen" }, "default-message": "__description__\n\nFile from Node-RED is attached: __filename__", "tip": { From b08b12865bf168f4138f6e4a5941d8a7567bc1b6 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 11 Feb 2019 20:10:31 +0000 Subject: [PATCH 183/456] Fixup email PR and push to npm --- social/email/61-email.html | 18 ++-- social/email/61-email.js | 2 +- social/email/package-lock.json | 163 --------------------------------- social/email/package.json | 2 +- 4 files changed, 13 insertions(+), 172 deletions(-) delete mode 100644 social/email/package-lock.json diff --git a/social/email/61-email.html b/social/email/61-email.html index b678a0eb..b34baf13 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -173,18 +173,18 @@
    - +
    +
    + + + only emit one message per most recent N values +

    @@ -44,9 +49,8 @@

    A simple node to provide various functions across several previous values, including max, min, mean, high and low pass filters.

    Messages arriving with different msg.topic can be treated as separate streams if so configured.

    Max, Min and Mean work over a specified number of previous values.

    -

    The High and Low pass filters use a smoothing factor. The higher the number the more the smoothing. E.g. a value of 10 is - similar to an α of 0.1. It is analagous to an RC time constant - but there is no time component to this as the - time is based on events arriving.

    +

    The High and Low pass filters use a smoothing factor. The higher the number the more the smoothing. E.g. a value of 10 is similar to an α of 0.1. It is analagous to an RC time constant - but there is no time component to this as the time is based on events arriving.

    +

    Enabling the Reduce option causes the node to only emit one message per N values (available for the Max, Min and Mean functions). E.g. if set to Mean over 10 values, there will only be one outgoing message per 10 incoming ones.

    If msg.reset is received (with any value), all the counters and intermediate values are reset to an initial state.

    Note: This only operates on numbers. Anything else will try to be made into a number and rejected if that fails.

    @@ -61,7 +65,8 @@ action: {value:"mean"}, count: {value:"10",required:true,validate:RED.validators.number()}, round: {value:""}, - mult: {value:"single"} + mult: {value:"single"}, + reduce: {value:false} }, inputs: 1, outputs: 1, @@ -87,10 +92,12 @@ if ((a === "high") || ( a === "low" )) { $("#node-over").html("with a smoothing factor of "); $("#node-over2").html(""); + $("#row-input-reduce").hide(); } else { $("#node-over").html("over the most recent "); $("#node-over2").html(" values"); + $("#row-input-reduce").show(); } }); $("#node-input-action").change(); diff --git a/function/smooth/17-smooth.js b/function/smooth/17-smooth.js index 87b76c9c..c34c04aa 100644 --- a/function/smooth/17-smooth.js +++ b/function/smooth/17-smooth.js @@ -9,6 +9,7 @@ module.exports = function(RED) { if (this.round == "true") { this.round = 0; } this.count = Number(n.count); this.mult = n.mult || "single"; + this.reduce = n.reduce || false; this.property = n.property || "payload"; var node = this; var v = {}; @@ -16,6 +17,7 @@ module.exports = function(RED) { this.on('input', function (msg) { var value = RED.util.getMessageProperty(msg,node.property); var top = msg.topic || "_my_default_topic"; + var reduce = node.reduce; if (this.mult === "single") { top = "a"; } if ((v.hasOwnProperty(top) !== true) || msg.hasOwnProperty("reset")) { @@ -26,15 +28,18 @@ module.exports = function(RED) { v[top].pop = 0; v[top].old = null; v[top].count = this.count; + v[top].iter = 0; } if (value !== undefined) { var n = Number(value); if (!isNaN(n)) { + v[top].iter++; if ((node.action === "low") || (node.action === "high")) { if (v[top].old == null) { v[top].old = n; } v[top].old = v[top].old + (n - v[top].old) / v[top].count; if (node.action === "low") { value = v[top].old; } else { value = n - v[top].old; } + reduce = false; } else { v[top].a.push(n); @@ -61,10 +66,13 @@ module.exports = function(RED) { if (node.round !== false) { value = Math.round(value * Math.pow(10, node.round)) / Math.pow(10, node.round); } - RED.util.setMessageProperty(msg,node.property,value); - node.send(msg); + if (reduce == false || v[top].iter == v[top].count) { + v[top].iter = 0; + RED.util.setMessageProperty(msg,node.property,value); + node.send(msg); + } } - else { node.log("Not a number: "+value); } + else { node.log("Not a number: " + value); } } // ignore msg with no payload property. }); } diff --git a/test/function/smooth/17-smooth_spec.js b/test/function/smooth/17-smooth_spec.js index 33188765..ac7c7fc7 100644 --- a/test/function/smooth/17-smooth_spec.js +++ b/test/function/smooth/17-smooth_spec.js @@ -316,5 +316,79 @@ describe('smooth node', function() { n1.emit("input", {payload:9, topic:"B"}); }); }); - + it("should reduce the number of messages by averaging if asked", function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"mean", count:"5", reduce:"true", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 1) { msg.should.have.a.property("payload", 3); } + else if (c === 2) { msg.should.have.a.property("payload", 6); done(); } + else if (c > 2) { done(new Error("should not emit more than two messages.")); } + }); + n1.emit("input", {payload:1}); + n1.emit("input", {payload:2}); + n1.emit("input", {payload:3}); + n1.emit("input", {payload:4}); + n1.emit("input", {payload:5}); + n1.emit("input", {payload:6}); + n1.emit("input", {payload:7}); + n1.emit("input", {payload:8}); + n1.emit("input", {payload:9}) +; n1.emit("input", {payload:0}); + }); + }); + it("should reduce the number of messages by max value, if asked", function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"max", count:"5", reduce:"true", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 1) { msg.should.have.a.property("payload", 5); } + else if (c === 2) { msg.should.have.a.property("payload", 9); done(); } + else if (c > 2) { done(new Error("should not emit more than two messages.")); } + }); + n1.emit("input", {payload:1}); + n1.emit("input", {payload:2}); + n1.emit("input", {payload:3}); + n1.emit("input", {payload:4}); + n1.emit("input", {payload:5}); + n1.emit("input", {payload:6}); + n1.emit("input", {payload:7}); + n1.emit("input", {payload:8}); + n1.emit("input", {payload:9}); + n1.emit("input", {payload:0}); + }); + }); + it("should reduce the number of messages by min value, if asked", function(done) { + var flow = [{"id":"n1", "type":"smooth", action:"min", count:"5", reduce:"true", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var c = 0; + n2.on("input", function(msg) { + c += 1; + if (c === 1) { msg.should.have.a.property("payload", 1); } + else if (c === 2) { msg.should.have.a.property("payload", 0); done(); } + else if (c > 2) { done(new Error("should not emit more than two messages.")); } + }); + n1.emit("input", {payload:1}); + n1.emit("input", {payload:2}); + n1.emit("input", {payload:3}); + n1.emit("input", {payload:4}); + n1.emit("input", {payload:5}); + n1.emit("input", {payload:6}); + n1.emit("input", {payload:7}); + n1.emit("input", {payload:8}); + n1.emit("input", {payload:9}); + n1.emit("input", {payload:0}); + }); + }); }); From cabf2889e54ab365911ec45ecd44b59964869666 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 19 Sep 2019 09:25:44 +0100 Subject: [PATCH 264/456] Bump Smooth node for PR and add output labels --- function/smooth/17-smooth.html | 1 + function/smooth/package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/function/smooth/17-smooth.html b/function/smooth/17-smooth.html index 1b22a635..9658a7ce 100644 --- a/function/smooth/17-smooth.html +++ b/function/smooth/17-smooth.html @@ -77,6 +77,7 @@ labelStyle: function() { return this.name ? "node_label_italic" : ""; }, + outputLabels: function() { return this.reduce === true ? (this.action+" of "+this.count) : (this.action); }, oneditprepare: function() { if (this.property === undefined) { $("#node-input-property").val("payload"); diff --git a/function/smooth/package.json b/function/smooth/package.json index 198a625d..2be74523 100644 --- a/function/smooth/package.json +++ b/function/smooth/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-smooth", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node that provides several simple smoothing algorithms for incoming data values.", "dependencies" : { }, From 003655f1b3c8fa72ffc018831ec58554df8a2f16 Mon Sep 17 00:00:00 2001 From: Takeshi Ueno Date: Thu, 19 Sep 2019 17:27:07 +0900 Subject: [PATCH 265/456] update support languages (#578) https://docs.what3words.com/api/v3/#available-languages --- parsers/what3words/what3words.html | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/parsers/what3words/what3words.html b/parsers/what3words/what3words.html index 871159a7..ab3775a7 100644 --- a/parsers/what3words/what3words.html +++ b/parsers/what3words/what3words.html @@ -11,13 +11,32 @@
    From 477b101b91d269c09d78bfead47a3afb108be08a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 19 Sep 2019 09:29:20 +0100 Subject: [PATCH 266/456] Update package.json Bump What3 Words for PR with extra languages --- parsers/what3words/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsers/what3words/package.json b/parsers/what3words/package.json index 5fc45964..b48c8c5d 100644 --- a/parsers/what3words/package.json +++ b/parsers/what3words/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-what3words", - "version" : "0.1.10", + "version" : "0.1.11", "description" : "A Node-RED node to convert locations to/from what3words", "dependencies" : { "geo.what3words" : "^2.0.0" From 5b975d912bcf6af8e73c070127cc946251e00c89 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 19 Sep 2019 09:29:48 +0100 Subject: [PATCH 267/456] Move Daemon to standard function category --- utility/daemon/daemon.html | 4 ++-- utility/daemon/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/utility/daemon/daemon.html b/utility/daemon/daemon.html index bdd5f28d..73e77450 100644 --- a/utility/daemon/daemon.html +++ b/utility/daemon/daemon.html @@ -61,7 +61,7 @@ @@ -56,6 +56,7 @@ label: function() { return this.name || "data generator"; }, + outputLabels: function() { return this.syntax === "json" ? "object" : "string"; }, oneditprepare: function() { var that = this; if (!this.fieldType) { diff --git a/function/datagenerator/package.json b/function/datagenerator/package.json index fcf1e382..58498ae7 100644 --- a/function/datagenerator/package.json +++ b/function/datagenerator/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-data-generator", - "version" : "0.0.5", + "version" : "0.1.0", "description" : "A Node-RED node to create a string of dummy data values from a template. Useful for test-cases.", "dependencies" : { - "dummy-json": "1.*" + "dummy-json": "^2.0.0" }, "repository" : { "type":"git", diff --git a/function/random/README.md b/function/random/README.md index 95ed1b0e..cb22f2b5 100644 --- a/function/random/README.md +++ b/function/random/README.md @@ -6,20 +6,20 @@ A Node-RED node that when trigger Install ------- -Run the following command in your Node-RED user directory - typically `~/.node-red` +Either use the Manage Palette option in the Node-RED Editor menu, or run the following command in your Node-RED user directory - typically `~/.node-red` + + npm i node-red-node-random - npm install node-red-node-random - Usage ----- A simple node to generate a random number when triggered. -If you return an integer it can include both the low and high values. +If set to return an integer it can include both the low and high values. `min <= n <= max` - so selecting 1 to 6 will return values 1,2,3,4,5 or 6. -If you return a floating point value it will be from the low value, up to, but +If set to return a floating point value it will be from the low value, up to, but not including the high value. `min <= n < max` - so selecting 1 to 6 will return values 1 <= n < 6 . -**Note:** This generates **numbers**. +**Note:** This returns numbers - objects of type **number**. diff --git a/function/random/package.json b/function/random/package.json index a4504f13..6e33498c 100644 --- a/function/random/package.json +++ b/function/random/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-random", - "version" : "0.1.3", + "version" : "0.1.4", "description" : "A Node-RED node that when triggered generates a random number between two values.", "dependencies" : { }, diff --git a/function/random/random.html b/function/random/random.html index 5ae7592c..17ef9d87 100644 --- a/function/random/random.html +++ b/function/random/random.html @@ -27,9 +27,9 @@ diff --git a/parsers/smaz/70-smaz.html b/parsers/smaz/70-smaz.html index f2e46887..87ebd840 100644 --- a/parsers/smaz/70-smaz.html +++ b/parsers/smaz/70-smaz.html @@ -7,9 +7,11 @@ diff --git a/parsers/smaz/README.md b/parsers/smaz/README.md index 8c037e13..cb5fee29 100644 --- a/parsers/smaz/README.md +++ b/parsers/smaz/README.md @@ -6,7 +6,7 @@ A Node-RED node to pack and unpac Install ------- -Run the following command in your Node-RED user directory - typically `~/.node-red` +Either use the Manage Palette option in the Node-RED Editor menu, or run the following command in your Node-RED user directory - typically `~/.node-red` npm install node-red-node-smaz diff --git a/parsers/smaz/package.json b/parsers/smaz/package.json index d9dfb65e..5e83ddb2 100644 --- a/parsers/smaz/package.json +++ b/parsers/smaz/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-smaz", - "version" : "0.0.1", + "version" : "0.0.2", "description" : "A Node-RED node to pack and unpack strings to smaz format", "dependencies" : { }, From 1f0ab0937d7c796fd096782a65b3b30c04072cbc Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 24 Sep 2019 21:44:56 +0100 Subject: [PATCH 270/456] Add done/complete to email node and fix .from field --- social/email/61-email.js | 7 ++++--- social/email/package.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index fcae9f23..4aa19614 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -75,8 +75,9 @@ module.exports = function(RED) { } var smtpTransport = nodemailer.createTransport(smtpOptions); - this.on("input", function(msg) { + this.on("input", function(msg, send, done) { if (msg.hasOwnProperty("payload")) { + send = send || node.send; if (smtpTransport) { node.status({fill:"blue",shape:"dot",text:"email.status.sending"}); if (msg.to && node.name && (msg.to !== node.name)) { @@ -123,6 +124,7 @@ module.exports = function(RED) { } else { node.log(RED._("email.status.messagesent",{response:info.response})); node.status({text:"",response:info.response,msg:{to:msg.to,topic:msg.topic,id:msg._msgid}}); + if (done) { done(); } } }); } @@ -208,12 +210,11 @@ module.exports = function(RED) { msg.date = mailMessage.date; msg.header = {}; mailMessage.headers.forEach((v, k) => {msg.header[k] = v;}); - if (mailMessage.html) { msg.html = mailMessage.html; } if (mailMessage.to && mailMessage.to.length > 0) { msg.to = mailMessage.to; } if (mailMessage.cc && mailMessage.cc.length > 0) { msg.cc = mailMessage.cc; } if (mailMessage.bcc && mailMessage.bcc.length > 0) { msg.bcc = mailMessage.bcc; } - if (mailMessage.from && mailMessage.from.length > 0) { msg.from = mailMessage.from[0].address; } + if (mailMessage.from && mailMessage.from.value && mailMessage.from.value.length > 0) { msg.from = mailMessage.from.value[0].address; } if (mailMessage.attachments) { msg.attachments = mailMessage.attachments; } else { msg.attachments = []; } node.send(msg); // Propagate the message down the flow diff --git a/social/email/package.json b/social/email/package.json index 5a4a69a8..dae57898 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.6.3", + "version": "1.7.0", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", From a318dc56ffb5f992eda27237c4d9be6bc7e688d0 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 26 Sep 2019 13:39:25 +0100 Subject: [PATCH 271/456] better escape for node-red without done. --- social/email/61-email.js | 2 +- social/email/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index 4aa19614..f6df3387 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -77,7 +77,7 @@ module.exports = function(RED) { this.on("input", function(msg, send, done) { if (msg.hasOwnProperty("payload")) { - send = send || node.send; + send = send || function() { node.send.apply(node,arguments) }; if (smtpTransport) { node.status({fill:"blue",shape:"dot",text:"email.status.sending"}); if (msg.to && node.name && (msg.to !== node.name)) { diff --git a/social/email/package.json b/social/email/package.json index dae57898..6067444c 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.7.0", + "version": "1.7.1", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", From 8c767709a5fc415bd978039e853ed3297aa5f721 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 26 Sep 2019 22:27:53 +0100 Subject: [PATCH 272/456] fix serialport error message --- hardware/PiGpio/locales/de/36-rpi-gpio.json | 2 +- hardware/PiGpio/locales/en-US/36-rpi-gpio.json | 2 +- hardware/PiGpio/locales/ja/36-rpi-gpio.json | 2 +- hardware/PiGpio/locales/ko/36-rpi-gpio.json | 2 +- hardware/PiGpio/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hardware/PiGpio/locales/de/36-rpi-gpio.json b/hardware/PiGpio/locales/de/36-rpi-gpio.json index 958a82b6..e0aeeb03 100644 --- a/hardware/PiGpio/locales/de/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/de/36-rpi-gpio.json @@ -67,6 +67,6 @@ "commandnotfound" : "Befehl 'nrgpio' nicht gefunden", "commandnotexecutable" : "nrgpio-Befehl nicht ausführbar", "error" : "Fehler: __error__", - "pythoncommandnotfound" : "Befehl 'nrpgio python' nicht aktiv" + "pythoncommandnotfound" : "Befehl 'nrgpio python' nicht aktiv" } } diff --git a/hardware/PiGpio/locales/en-US/36-rpi-gpio.json b/hardware/PiGpio/locales/en-US/36-rpi-gpio.json index 4ce96bc2..89daa184 100644 --- a/hardware/PiGpio/locales/en-US/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/en-US/36-rpi-gpio.json @@ -68,7 +68,7 @@ "commandnotfound": "nrgpio command not found", "commandnotexecutable": "nrgpio command not executable", "error": "error: __error__", - "pythoncommandnotfound": "nrpgio python command not running" + "pythoncommandnotfound": "nrgpio python command not running" } } } diff --git a/hardware/PiGpio/locales/ja/36-rpi-gpio.json b/hardware/PiGpio/locales/ja/36-rpi-gpio.json index a0f87664..dc28a8d4 100644 --- a/hardware/PiGpio/locales/ja/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ja/36-rpi-gpio.json @@ -67,6 +67,6 @@ "commandnotfound": "nrgpio コマンドが見つかりません", "commandnotexecutable": "nrgpio コマンドが実行可能ではありません", "error": "エラー: __error__", - "pythoncommandnotfound": "nrpgio python コマンドが実行されていません" + "pythoncommandnotfound": "nrgpio python コマンドが実行されていません" } } diff --git a/hardware/PiGpio/locales/ko/36-rpi-gpio.json b/hardware/PiGpio/locales/ko/36-rpi-gpio.json index e5b4fc71..d414f17f 100644 --- a/hardware/PiGpio/locales/ko/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ko/36-rpi-gpio.json @@ -67,6 +67,6 @@ "commandnotfound": "nrgpio 커맨드를 찾을수 없습니다", "commandnotexecutable": "nrgpio 커맨드가 실행가능상태가 아닙니다", "error": "에러: __error__", - "pythoncommandnotfound": "nrpgio python 커맨드가 실행되지 않았습니다" + "pythoncommandnotfound": "nrgpio python 커맨드가 실행되지 않았습니다" } } diff --git a/hardware/PiGpio/package.json b/hardware/PiGpio/package.json index f326ed11..73dc6d2b 100644 --- a/hardware/PiGpio/package.json +++ b/hardware/PiGpio/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpio", - "version": "1.0.3", + "version": "1.0.4", "description": "The basic Node-RED node for Pi GPIO", "dependencies" : { }, From 4168d48486674328699425460f60b53050f4abd1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 29 Sep 2019 12:56:29 +0100 Subject: [PATCH 273/456] datagenerator - add space to label --- function/datagenerator/locales/en-US/datagenerator.json | 2 +- function/datagenerator/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/function/datagenerator/locales/en-US/datagenerator.json b/function/datagenerator/locales/en-US/datagenerator.json index 2c038a2c..a1f0ddcc 100644 --- a/function/datagenerator/locales/en-US/datagenerator.json +++ b/function/datagenerator/locales/en-US/datagenerator.json @@ -1,6 +1,6 @@ { "datagen": { - "datagen": "datagenerator", + "datagen": "data generator", "label": { "syntax": "Return", "text": "a text string", diff --git a/function/datagenerator/package.json b/function/datagenerator/package.json index 58498ae7..3dc05d16 100644 --- a/function/datagenerator/package.json +++ b/function/datagenerator/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-data-generator", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node to create a string of dummy data values from a template. Useful for test-cases.", "dependencies" : { "dummy-json": "^2.0.0" From aa2965f000b0d0bbb60d7690c64a46bf8bb5a1db Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 30 Sep 2019 09:46:48 +0100 Subject: [PATCH 274/456] move serialport to new netwrok category (for 1.0) --- io/serialport/25-serial.html | 12 +++++++----- io/serialport/package.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/io/serialport/25-serial.html b/io/serialport/25-serial.html index b78905f5..f0e461ff 100644 --- a/io/serialport/25-serial.html +++ b/io/serialport/25-serial.html @@ -23,7 +23,7 @@ @@ -62,7 +63,7 @@ diff --git a/io/serialport/package.json b/io/serialport/package.json index 4fc7d98a..08b32df3 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-serialport", - "version" : "0.8.7", + "version" : "0.8.8", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { "serialport" : "^7.1.5" From 18f42be57494c185f5dc0d2fba9a39a615e7893b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 5 Oct 2019 19:36:20 +0100 Subject: [PATCH 275/456] Fix snmp node to clone response before sending --- io/snmp/package.json | 4 ++-- io/snmp/snmp.js | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/io/snmp/package.json b/io/snmp/package.json index 8cb60e6a..f80f09ce 100644 --- a/io/snmp/package.json +++ b/io/snmp/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-snmp", - "version" : "0.0.21", + "version" : "0.0.22", "description" : "A Node-RED node that looks for SNMP oids.", "dependencies" : { - "net-snmp" : "1.1.8" + "net-snmp" : "1.2.4" }, "repository" : { "type":"git", diff --git a/io/snmp/snmp.js b/io/snmp/snmp.js index 4c20933e..b9a9f2a8 100644 --- a/io/snmp/snmp.js +++ b/io/snmp/snmp.js @@ -193,7 +193,8 @@ module.exports = function (RED) { node.error(error.toString(), msg); } else { - msg.payload = response; + // Clone the array + msg.payload = response.slice(0); node.send(msg); //Clears response response.length = 0; @@ -243,7 +244,8 @@ module.exports = function (RED) { node.error(error.toString(), msg); } else { - msg.payload = response; + // Clone the array + msg.payload = response.slice(0); node.send(msg); //Clears response response.length = 0; From b35de37ec1e1a000c8d60bf475cec47db8e8707c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 5 Oct 2019 21:13:58 +0100 Subject: [PATCH 276/456] bump markdown node library, and overal libs for test --- package-lock.json | 1614 +++++++-------------------------- package.json | 12 +- parsers/markdown/package.json | 4 +- 3 files changed, 323 insertions(+), 1307 deletions(-) diff --git a/package-lock.json b/package-lock.json index b876152d..80813e0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,30 +5,30 @@ "requires": true, "dependencies": { "@babel/runtime": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.1.tgz", - "integrity": "sha512-g+hmPKs16iewFSmW57NkH9xpPkuYD1RV3UE2BCkXx9j+nhhRb9hsiSxPmEa67j35IecTQdn4iyMtHMbt5VoREg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", + "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true } } }, "@node-red/editor-api": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-0.20.7.tgz", - "integrity": "sha512-wGuJJ9eyFwHT1PHFOzp+VvXm3MhwKUfxB2uoc6668aKSHILcoOTnOc+i+JUlXxPe2zVu9zulgRiSkrWhDAO2Qw==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-0.20.8.tgz", + "integrity": "sha512-VaetYYU/gu4CgUs80ymiBg9BVw4Ge4kYF4NPgs4S8t/c1BRz2ZZd5idCDw7MaN602eDiYnspx3QMH8X3sqYsTQ==", "dev": true, "requires": { - "@node-red/editor-client": "0.20.7", - "@node-red/util": "0.20.7", + "@node-red/editor-client": "0.20.8", + "@node-red/util": "0.20.8", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", "body-parser": "1.19.0", @@ -47,269 +47,24 @@ "ws": "6.2.1" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } } } }, "@node-red/editor-client": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-0.20.7.tgz", - "integrity": "sha512-svF01v6Mn1MYv5bSg/zL86ToCG2yZW3/7SqWTe4cJ1MRCRvllAb1IVCFnWm8sQcgfOGmaLT9q4Jsgb5HAF8M/w==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-0.20.8.tgz", + "integrity": "sha512-TyZ+ma0jRU/T0BChpl17hHa0cMOnPX9DYFbpyT8p5ghRHIHYYL/3rFFflwB+5bAwbK1Y8Z2LKB7dngzL7jzpTQ==", "dev": true }, "@node-red/nodes": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-0.20.7.tgz", - "integrity": "sha512-ZDokAULh6Y+d+8WbjQoYXikinXrV/KVv/q2UGculSgDuDWNIju0A8hQyGBQ3fSBe7PIahl/G4B7Znc4ds1HtEg==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-0.20.8.tgz", + "integrity": "sha512-yR+kNSkUQowQLHpk7buY36Pz5utA3q3n/49LvgvyxxRwgOPUBv4KNaFLDipUjqgD2spaznh+VTAMT8UUO0xeig==", "dev": true, "requires": { "ajv": "6.10.0", @@ -351,53 +106,6 @@ "uri-js": "^4.2.2" } }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -417,13 +125,13 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", + "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" @@ -438,6 +146,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -460,12 +174,6 @@ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, "raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", @@ -478,19 +186,6 @@ "unpipe": "1.0.0" }, "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -499,48 +194,18 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3" } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true } } } } }, "@node-red/registry": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-0.20.7.tgz", - "integrity": "sha512-TdZVO7DSe21FcF/97zJWVVVaZ7M/z1bbai2vNDIyJA4BFKRadUsCVCkRjgOfJTrmcrvwTqhLKI2yZ53Ovty4HQ==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-0.20.8.tgz", + "integrity": "sha512-3B5wYJOAWNLa3qhzdFZYqHa8X2+U4mdno6f0GQ2vzaNMdcxM9VvkpXLvmnThcQJsYqbxAiwuaUZUL1mX0KePsA==", "dev": true, "requires": { - "@node-red/util": "0.20.7", + "@node-red/util": "0.20.8", "semver": "6.2.0", "uglify-js": "3.6.0", "when": "3.7.8" @@ -555,269 +220,24 @@ } }, "@node-red/runtime": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-0.20.7.tgz", - "integrity": "sha512-q5VNbwPJfSlBMvY4M31Q0EFvCbM85r28lFBQVqY6Qqqh7QgxFKzJWGfkvqg9GBjUo+Wx1QfdMYJxBZlTmYMARg==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-0.20.8.tgz", + "integrity": "sha512-R7X3E8VXGlzXbYd0hTqhgU8rzyc2uNXDb3u37C3rduCViotcKWrQho4n/UdQS4H+T1Bu0H6Zoo+1EGAsQ92nGA==", "dev": true, "requires": { - "@node-red/registry": "0.20.7", - "@node-red/util": "0.20.7", + "@node-red/registry": "0.20.8", + "@node-red/util": "0.20.8", "clone": "2.1.2", "express": "4.17.1", "fs-extra": "8.1.0", "json-stringify-safe": "5.0.1", "when": "3.7.8" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - } } }, "@node-red/util": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@node-red/util/-/util-0.20.7.tgz", - "integrity": "sha512-LWFC7wFgm0mZJhv+oSELnmRnFawgAByJA6GCdAOnMSLEHJfqcprSHEIYj+S4/rUnS0xjRgL8FO9D+kOWsgVK0A==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/@node-red/util/-/util-0.20.8.tgz", + "integrity": "sha512-tid1o8fy94b6XU6/8cVDm5Kn9tNWm1AoaLPrhfDxJaObtrcHC6KtEhJJxPq61nhzZxJOuT/DHqBUGwTXTKg7Zg==", "dev": true, "requires": { "clone": "2.1.2", @@ -1543,13 +963,19 @@ "util-deprecate": "^1.0.1" } }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } @@ -1620,29 +1046,40 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" } } } @@ -1663,7 +1100,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "coffeescript": { "version": "1.10.0", @@ -1937,19 +1375,6 @@ "moment-timezone": "^0.5.x" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -2301,9 +1726,9 @@ "dev": true }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz", + "integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", "dev": true, "requires": { "once": "^1.4.0" @@ -2325,17 +1750,21 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.0", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" } }, "es-to-primitive": { @@ -2350,9 +1779,9 @@ } }, "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { "es6-iterator": "~2.0.3", @@ -2411,16 +1840,28 @@ "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } } }, "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "^1.0.1", + "es5-ext": "^0.10.51" } }, "escape-html": { @@ -2475,21 +1916,6 @@ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "exif": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/exif/-/exif-0.6.0.tgz", @@ -2639,12 +2065,6 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2998,21 +2418,21 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true } } }, "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.notify": { @@ -3104,15 +2524,6 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3898,9 +3309,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz", + "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", "dev": true, "optional": true, "requires": { @@ -3966,12 +3377,6 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", @@ -4175,12 +3580,6 @@ "is-unc-path": "^1.0.0" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -4437,15 +3836,6 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -4623,9 +4013,9 @@ "dev": true }, "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.pick": { @@ -4785,15 +4175,6 @@ "kind-of": "^6.0.2" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -4816,9 +4197,9 @@ } }, "markdown-it": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-9.0.0.tgz", - "integrity": "sha512-bUVTYGt/K/mYr3HlE+PBe6TOTyWghcpSZqOD9t+NFRlwJMhp9Kp6WQ8fJ26I6v1Xo71UmPYt1S4Hc9Lq8GZx2Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-9.1.0.tgz", + "integrity": "sha512-xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4848,17 +4229,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memorystore": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.1.tgz", @@ -4952,12 +4322,6 @@ "mime-db": "1.40.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4974,9 +4338,9 @@ "dev": true }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.8.5.tgz", + "integrity": "sha512-D5+szmZBoOAfbLjOXY4Ve5bWylyTdrUOmbJPgYmgTF5ovCnCFFTY+I16Ccm/UjSNNAekXtIEDvoCDioFzRz18Q==", "dev": true, "optional": true, "requires": { @@ -4994,9 +4358,9 @@ } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", + "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", "dev": true, "optional": true, "requires": { @@ -5042,9 +4406,9 @@ } }, "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz", + "integrity": "sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -5067,9 +4431,9 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" }, "dependencies": { "debug": { @@ -5137,9 +4501,9 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -5440,12 +4804,6 @@ "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "nise": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", @@ -5487,9 +4845,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -5546,9 +4904,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, "requires": { @@ -5558,15 +4916,15 @@ } }, "node-red": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/node-red/-/node-red-0.20.7.tgz", - "integrity": "sha512-klwQup/74kYGLBujQj4txrmpMYUdR88A68xjdycedD9dwMDwWCu8NL5t+O8XMWYxJ332hOIgLS62tm8ChxrkuQ==", + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/node-red/-/node-red-0.20.8.tgz", + "integrity": "sha512-+i2SHPo8AQED0lyf7xoGcWAs142Nc5zvCTzmuncslgxVt/fl6XADEEY4yT/eDVNOwRrf9TZMjhSxBM9ScJJu7Q==", "dev": true, "requires": { - "@node-red/editor-api": "0.20.7", - "@node-red/nodes": "0.20.7", - "@node-red/runtime": "0.20.7", - "@node-red/util": "0.20.7", + "@node-red/editor-api": "0.20.8", + "@node-red/nodes": "0.20.8", + "@node-red/runtime": "0.20.8", + "@node-red/util": "0.20.8", "basic-auth": "2.0.1", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", @@ -5582,154 +4940,6 @@ "semver": "6.2.0" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", @@ -5740,113 +4950,18 @@ "osenv": "^0.1.4" } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "semver": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } } } }, "node-red-node-email": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-red-node-email/-/node-red-node-email-1.6.2.tgz", - "integrity": "sha512-px5xvIE649aEAh08hAqnFV/IyqN1EQ9nHsTp8OWvVdNZqfAEcT0O6jjMONN/ur5Az1Uyrc7cA3c+iYmc2yzGMg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-red-node-email/-/node-red-node-email-1.6.3.tgz", + "integrity": "sha512-78O7CASdGAP2wmMJvqsMYdNrCHI54lSE97hWpbNQPG2QC2d15TEUQU+E8KgNzquPtJn0Pjh/cvzt+kQwKjkaUg==", "dev": true, "requires": { "imap": "^0.8.19", @@ -5866,15 +4981,15 @@ } }, "node-red-node-rbe": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/node-red-node-rbe/-/node-red-node-rbe-0.2.4.tgz", - "integrity": "sha512-ft/8/dTRGzGQ9vCnAzuBxzR+aDv4Yun/vuSKi/eI5Qj2/ZBal28L9HpWziSTWlLrMhZns8CRz7s2p84P2ee/vA==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/node-red-node-rbe/-/node-red-node-rbe-0.2.5.tgz", + "integrity": "sha512-WPwIOZIdDprgfqOe8bEun47wkFFc+5Uw/1w3O/kZn/kS2IpI1q+wijUDK+Hw8q4d8KgA58B30wh+10UvXzsPDA==", "dev": true }, "node-red-node-sentiment": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/node-red-node-sentiment/-/node-red-node-sentiment-0.1.3.tgz", - "integrity": "sha512-X3F7VdfFJ4iioWCiMgIv1Pyp6YxUuA8Mod/zcHN3FHBM8aue2vL4bvAT/1zQgxqxehUVkKCbXr+cdRnJx5e7nw==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/node-red-node-sentiment/-/node-red-node-sentiment-0.1.4.tgz", + "integrity": "sha512-lZxov4OdGKoqvXcUK7oyVeW5a2qJsBr5+T8cq9kP5N0bnI9AQoywiIiVQ2HcFCHXy70U4ZIAhetGroNfAb68Zg==", "dev": true, "requires": { "sentiment": "2.1.0" @@ -6040,9 +5155,9 @@ } }, "nodemailer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.2.1.tgz", - "integrity": "sha512-TagB7iuIi9uyNgHExo8lUDq3VK5/B0BpbkcjIgNvxbtVrjNqq0DwAOTuzALPVkK76kMhTSzIgHqg8X1uklVs6g==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.0.tgz", + "integrity": "sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==", "dev": true }, "nomnom": { @@ -6119,15 +5234,6 @@ "npm-bundled": "^1.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -6216,6 +5322,12 @@ } } }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -6379,17 +5491,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -6406,24 +5507,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -6547,12 +5630,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -6681,23 +5758,23 @@ } }, "proxyquire": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.0.tgz", - "integrity": "sha512-kptdFArCfGRtQFv3Qwjr10lwbEV0TBJYvfqzhwucyfEXqVgmnAkyEw/S3FYzR5HI9i5QOq4rcqQjZ6AlknlCDQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", "dev": true, "requires": { "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.0", - "resolve": "~1.8.1" + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" }, "dependencies": { "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } } } @@ -7276,21 +6353,6 @@ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "shelljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", @@ -7374,26 +6436,65 @@ "dev": true }, "sinon": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", - "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, "requires": { "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.1", + "@sinonjs/samsam": "^3.3.3", "diff": "^3.5.0", - "lolex": "^4.0.1", - "nise": "^1.4.10", + "lolex": "^4.2.0", + "nise": "^1.5.2", "supports-color": "^5.5.0" }, "dependencies": { - "lolex": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.0.1.tgz", - "integrity": "sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw==", + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "nise": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz", + "integrity": "sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^4.1.0", + "path-to-regexp": "^1.7.0" + } + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7702,6 +6803,26 @@ } } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -7726,12 +6847,6 @@ "is-utf8": "^0.2.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -7835,21 +6950,21 @@ "dev": true }, "tail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tail/-/tail-2.0.2.tgz", - "integrity": "sha512-raFipiKWdGKEzxbvZwnhUGqjvsv0gpa/1A479rL//NOxnNwYZDN4MPk6xJJdUFs8P2Xrff3nbH5fcyYRLU4UHQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tail/-/tail-2.0.3.tgz", + "integrity": "sha512-s9NOGkLqqiDEtBttQZI7acLS8ycYK5sTlDwNjGnpXG9c8AWj0cfAtwEIzo/hVRMMiC5EYz+bXaJWC1u1u0GPpQ==", "dev": true }, "tar": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", - "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.11.tgz", + "integrity": "sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==", "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.5", + "minipass": "^2.6.4", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", @@ -8050,9 +7165,9 @@ } }, "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-detect": { @@ -8062,30 +7177,13 @@ "dev": true }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" - }, - "dependencies": { - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } - } + "mime-types": "~2.1.24" } }, "typedarray": { @@ -8586,33 +7684,49 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "color-convert": "^1.9.0" } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" } } } @@ -8668,9 +7782,9 @@ } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { @@ -8687,22 +7801,21 @@ "optional": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.1" }, "dependencies": { "ansi-regex": { @@ -8731,9 +7844,9 @@ } }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -8783,9 +7896,9 @@ } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8801,118 +7914,21 @@ } }, "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" + "lodash": "^4.17.15", + "yargs": "^13.3.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } } diff --git a/package.json b/package.json index ab9169f3..f7621371 100644 --- a/package.json +++ b/package.json @@ -40,20 +40,20 @@ "grunt-simple-mocha": "^0.4.1", "imap": "^0.8.19", "mailparser": "^2.7.1", - "markdown-it": "^9.0.0", - "mocha": "^6.1.4", + "markdown-it": "^10.0.0", + "mocha": "~6.2.1", "msgpack-lite": "^0.1.26", "multilang-sentiment": "^1.2.0", "ngeohash": "^0.6.3", - "node-red": "~0.20.7", + "node-red": "~1.0.0", "node-red-node-test-helper": "~0.2.3", - "nodemailer": "^6.2.1", + "nodemailer": "~6.3.0", "poplib": "^0.1.7", - "proxyquire": "^2.1.0", + "proxyquire": "~2.1.3", "pushbullet": "^2.4.0", "sentiment": "^2.1.0", "should": "^13.2.3", - "sinon": "^7.2.7", + "sinon": "~7.5.0", "supertest": "^4.0.2", "when": "^3.7.8" }, diff --git a/parsers/markdown/package.json b/parsers/markdown/package.json index 0cb052fc..04ff9ec1 100644 --- a/parsers/markdown/package.json +++ b/parsers/markdown/package.json @@ -1,9 +1,9 @@ { "name": "node-red-node-markdown", - "version": "0.1.2", + "version": "0.1.3", "description": "A Node-RED node to convert a markdown string to html.", "dependencies": { - "markdown-it": "^9.0.0" + "markdown-it": "^10.0.0" }, "repository": { "type": "git", From 4979ad8966035f782574f593c8c9c1890af667d1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 6 Oct 2019 09:51:26 +0100 Subject: [PATCH 277/456] fix gpio node ok status label --- hardware/PiGpio/36-rpi-gpio.js | 8 ++++---- hardware/PiGpio/locales/de/36-rpi-gpio.json | 3 ++- hardware/PiGpio/locales/en-US/36-rpi-gpio.json | 3 ++- hardware/PiGpio/locales/ja/36-rpi-gpio.json | 3 ++- hardware/PiGpio/locales/ko/36-rpi-gpio.json | 3 ++- hardware/PiGpio/package.json | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/hardware/PiGpio/36-rpi-gpio.js b/hardware/PiGpio/36-rpi-gpio.js index 089ab7dd..fc3d43bf 100644 --- a/hardware/PiGpio/36-rpi-gpio.js +++ b/hardware/PiGpio/36-rpi-gpio.js @@ -45,7 +45,7 @@ module.exports = function(RED) { if (node.pin !== undefined) { node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]); node.running = true; - node.status({fill:"yellow",shape:"dot",text:"common.status.ok"}); + node.status({fill:"yellow",shape:"dot",text:"rpi-gpio.status.ok"}); node.child.stdout.on('data', function (data) { var d = data.toString().trim().split("\n"); @@ -156,7 +156,7 @@ module.exports = function(RED) { node.status({fill:"green",shape:"dot",text:node.level}); } else { node.child = spawn(gpioCommand, [node.out,node.pin,node.freq]); - node.status({fill:"yellow",shape:"dot",text:"common.status.ok"}); + node.status({fill:"yellow",shape:"dot",text:"rpi-gpio.status.ok"}); } node.running = true; @@ -220,7 +220,7 @@ module.exports = function(RED) { if (allOK === true) { node.child = spawn(gpioCommand+".py", ["mouse",node.butt]); - node.status({fill:"green",shape:"dot",text:"common.status.ok"}); + node.status({fill:"green",shape:"dot",text:"rpi-gpio.status.ok"}); node.child.stdout.on('data', function (data) { data = Number(data); @@ -271,7 +271,7 @@ module.exports = function(RED) { if (allOK === true) { node.child = spawn(gpioCommand+".py", ["kbd","0"]); - node.status({fill:"green",shape:"dot",text:"common.status.ok"}); + node.status({fill:"green",shape:"dot",text:"rpi-gpio.status.ok"}); node.child.stdout.on('data', function (data) { var b = data.toString().trim().split(","); diff --git a/hardware/PiGpio/locales/de/36-rpi-gpio.json b/hardware/PiGpio/locales/de/36-rpi-gpio.json index e0aeeb03..e1d44a8b 100644 --- a/hardware/PiGpio/locales/de/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/de/36-rpi-gpio.json @@ -52,7 +52,8 @@ "closed" : "geschlossen", "not-running" : "nicht aktiv", "not-available" : "nicht verfügbar", - "na" : "N/A: __Wert__" + "na" : "N/A: __Wert__", + "ok": "OK" }, "errors" : { "ignorenode" : "Raspberry Pi-spezifische Nodes inaktiv", diff --git a/hardware/PiGpio/locales/en-US/36-rpi-gpio.json b/hardware/PiGpio/locales/en-US/36-rpi-gpio.json index 89daa184..8931f170 100644 --- a/hardware/PiGpio/locales/en-US/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/en-US/36-rpi-gpio.json @@ -53,7 +53,8 @@ "closed": "closed", "not-running": "not running", "not-available": "not available", - "na": "N/A : __value__" + "na": "N/A : __value__", + "ok": "OK" }, "errors": { "ignorenode": "Raspberry Pi specific node set inactive", diff --git a/hardware/PiGpio/locales/ja/36-rpi-gpio.json b/hardware/PiGpio/locales/ja/36-rpi-gpio.json index dc28a8d4..a76daba6 100644 --- a/hardware/PiGpio/locales/ja/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ja/36-rpi-gpio.json @@ -52,7 +52,8 @@ "closed": "切断", "not-running": "停止中", "not-available": "利用不可", - "na": "N/A : __value__" + "na": "N/A : __value__", + "ok": "OK" }, "errors": { "ignorenode": "Raspberry Pi固有のノードを無視しました", diff --git a/hardware/PiGpio/locales/ko/36-rpi-gpio.json b/hardware/PiGpio/locales/ko/36-rpi-gpio.json index d414f17f..323ae882 100644 --- a/hardware/PiGpio/locales/ko/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ko/36-rpi-gpio.json @@ -52,7 +52,8 @@ "closed": "절단", "not-running": "정지중", "not-available": "이용불가", - "na": "N/A : __value__" + "na": "N/A : __value__", + "ok": "OK" }, "errors": { "ignorenode": "Raspberry Pi고유의 노드를 무시했습니다", diff --git a/hardware/PiGpio/package.json b/hardware/PiGpio/package.json index 73dc6d2b..6c12bd59 100644 --- a/hardware/PiGpio/package.json +++ b/hardware/PiGpio/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpio", - "version": "1.0.4", + "version": "1.0.5", "description": "The basic Node-RED node for Pi GPIO", "dependencies" : { }, From 3dfae60b2fba2d488a886aa697bee130b04b2b69 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 6 Oct 2019 11:59:13 +0100 Subject: [PATCH 278/456] Fix pi-gpio pintable css --- hardware/PiGpio/36-rpi-gpio.html | 17 +++++++++++++---- hardware/PiGpio/package.json | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/hardware/PiGpio/36-rpi-gpio.html b/hardware/PiGpio/36-rpi-gpio.html index e6cd8701..afd5b6fa 100644 --- a/hardware/PiGpio/36-rpi-gpio.html +++ b/hardware/PiGpio/36-rpi-gpio.html @@ -9,7 +9,8 @@ } .rpi-gpio-pinTable input[type="radio"] { width: auto; - margin: 2px 2px; + margin: 3px 2px; + vertical-align: top; } .rpi-gpio-pinTable label { width: auto; @@ -24,24 +25,32 @@ .rpi-gpio-pinTable .pinTableRow { width: 340px; display: table-row; - height: 14px; + height: 20px; } .rpi-gpio-pinTable .pinTableCellL { width: 170px; + height: 20px; display: table-cell; text-align: right; padding-right: 4px; - vertical-align: top; + vertical-align: middle; border: 1px solid #444; } + .rpi-gpio-pinTable .pinTableCellL label { + width: 170px; + } .rpi-gpio-pinTable .pinTableCellR { width: 170px; + height: 22px; display: table-cell; text-align: left; padding-left: 4px; - vertical-align: top; + vertical-align: middle; border: 1px solid #000; } + .rpi-gpio-pinTable .pinTableCellR label { + width: 170px; + } .rpi-gpio-pinTable .pinColorPower { background-color:#FECBCE; } diff --git a/hardware/PiGpio/package.json b/hardware/PiGpio/package.json index 6c12bd59..8a72493c 100644 --- a/hardware/PiGpio/package.json +++ b/hardware/PiGpio/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpio", - "version": "1.0.5", + "version": "1.0.6", "description": "The basic Node-RED node for Pi GPIO", "dependencies" : { }, From 6583c43b01bbf29e8fe44490c6a61b1bb96cc258 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2019 21:43:48 +0100 Subject: [PATCH 279/456] bump package for tests --- package-lock.json | 367 ++++++++++++++-------------------------------- package.json | 4 +- 2 files changed, 110 insertions(+), 261 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80813e0f..175eccb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" @@ -22,13 +22,13 @@ } }, "@node-red/editor-api": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-0.20.8.tgz", - "integrity": "sha512-VaetYYU/gu4CgUs80ymiBg9BVw4Ge4kYF4NPgs4S8t/c1BRz2ZZd5idCDw7MaN602eDiYnspx3QMH8X3sqYsTQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-1.0.1.tgz", + "integrity": "sha512-DN8HW6ZmBwfbfAlvO8qRvyuyDW70rkrxEq/Pf82i/tm4xIpyhXirCX9Ab9T6ueD1e03o6826GEhcAZZyTq+U3A==", "dev": true, "requires": { - "@node-red/editor-client": "0.20.8", - "@node-red/util": "0.20.8", + "@node-red/editor-client": "1.0.1", + "@node-red/util": "1.0.1", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", "body-parser": "1.19.0", @@ -38,7 +38,7 @@ "express-session": "1.16.2", "memorystore": "1.6.1", "mime": "2.4.4", - "mustache": "3.0.1", + "mustache": "3.0.2", "oauth2orize": "1.11.0", "passport": "0.4.0", "passport-http-bearer": "1.0.1", @@ -56,18 +56,18 @@ } }, "@node-red/editor-client": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-0.20.8.tgz", - "integrity": "sha512-TyZ+ma0jRU/T0BChpl17hHa0cMOnPX9DYFbpyT8p5ghRHIHYYL/3rFFflwB+5bAwbK1Y8Z2LKB7dngzL7jzpTQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-1.0.1.tgz", + "integrity": "sha512-63UG5cWgSr7hyakTagKNJ3ZJfROAPgKbufjxTNAwLw/C9rQ+xosJGBsMclftGwF/Cy16KQu1a3uoPD2Mjbk8BA==", "dev": true }, "@node-red/nodes": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-0.20.8.tgz", - "integrity": "sha512-yR+kNSkUQowQLHpk7buY36Pz5utA3q3n/49LvgvyxxRwgOPUBv4KNaFLDipUjqgD2spaznh+VTAMT8UUO0xeig==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-1.0.1.tgz", + "integrity": "sha512-n3Ol9OzoD+kOU1gFJCyITqGWJqKX6eCN5YmGkRyWEKbxXjVvMy43Wkp0HTI3jVNrq8Sm9fHrBZsKTTZfE2M1mA==", "dev": true, "requires": { - "ajv": "6.10.0", + "ajv": "6.10.2", "body-parser": "1.19.0", "cheerio": "0.22.0", "content-type": "1.0.4", @@ -79,14 +79,14 @@ "fs-extra": "8.1.0", "fs.notify": "0.0.4", "hash-sum": "2.0.0", - "https-proxy-agent": "2.2.1", + "https-proxy-agent": "2.2.2", "iconv-lite": "0.5.0", "is-utf8": "0.2.1", "js-yaml": "3.13.1", "media-typer": "1.1.0", "mqtt": "2.18.8", - "multer": "1.4.1", - "mustache": "3.0.1", + "multer": "1.4.2", + "mustache": "3.0.2", "on-headers": "1.0.2", "raw-body": "2.4.1", "request": "2.88.0", @@ -95,9 +95,9 @@ }, "dependencies": { "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -200,33 +200,33 @@ } }, "@node-red/registry": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-0.20.8.tgz", - "integrity": "sha512-3B5wYJOAWNLa3qhzdFZYqHa8X2+U4mdno6f0GQ2vzaNMdcxM9VvkpXLvmnThcQJsYqbxAiwuaUZUL1mX0KePsA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-1.0.1.tgz", + "integrity": "sha512-vkVhfnfRdsvUoXSifp+s8FH/OuhTBJonm/sOGzSAX9DV+IAxB3iueGVs+obPLi+qaFmTlhg9TCzeU0eJTmVAzg==", "dev": true, "requires": { - "@node-red/util": "0.20.8", - "semver": "6.2.0", + "@node-red/util": "1.0.1", + "semver": "6.3.0", "uglify-js": "3.6.0", "when": "3.7.8" }, "dependencies": { "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@node-red/runtime": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-0.20.8.tgz", - "integrity": "sha512-R7X3E8VXGlzXbYd0hTqhgU8rzyc2uNXDb3u37C3rduCViotcKWrQho4n/UdQS4H+T1Bu0H6Zoo+1EGAsQ92nGA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-1.0.1.tgz", + "integrity": "sha512-u1iXjzakaFq1TgkWIjDJaq6dXZ9ys5jwm5HzsNvaI/qfPCIJ3eXD6RF5cMTfAB5JNpwsCJ8NLAujWKTw6dnsBA==", "dev": true, "requires": { - "@node-red/registry": "0.20.8", - "@node-red/util": "0.20.8", + "@node-red/registry": "1.0.1", + "@node-red/util": "1.0.1", "clone": "2.1.2", "express": "4.17.1", "fs-extra": "8.1.0", @@ -235,13 +235,13 @@ } }, "@node-red/util": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/@node-red/util/-/util-0.20.8.tgz", - "integrity": "sha512-tid1o8fy94b6XU6/8cVDm5Kn9tNWm1AoaLPrhfDxJaObtrcHC6KtEhJJxPq61nhzZxJOuT/DHqBUGwTXTKg7Zg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@node-red/util/-/util-1.0.1.tgz", + "integrity": "sha512-Vfzns+gIPsq43+vdtZLXeGDP+THKYROGditpyO0FeUAdU6ALaNdRL1h8BQ+dNUnANyLo1OqK9HT8B9lFKwcW/w==", "dev": true, "requires": { "clone": "2.1.2", - "i18next": "15.1.0", + "i18next": "15.1.2", "json-stringify-safe": "5.0.1", "jsonata": "1.6.5", "when": "3.7.8" @@ -313,12 +313,6 @@ "negotiator": "0.6.2" } }, - "addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -475,12 +469,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "array-indexofobject": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-indexofobject/-/array-indexofobject-0.0.1.tgz", - "integrity": "sha1-qqEo5iybPDWAlFaMIZ/2T+SJ1Co=", - "dev": true - }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -981,9 +969,9 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true, "optional": true }, @@ -1726,9 +1714,9 @@ "dev": true }, "end-of-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz", - "integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -2189,61 +2177,6 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "feedparser": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/feedparser/-/feedparser-2.2.9.tgz", - "integrity": "sha1-kTgZfa/a4F/K3eADa+6vYGbCxek=", - "dev": true, - "requires": { - "addressparser": "^1.0.1", - "array-indexofobject": "~0.0.1", - "lodash.assign": "^4.2.0", - "lodash.get": "^4.4.2", - "lodash.has": "^4.5.2", - "lodash.uniq": "^4.5.0", - "mri": "^1.1.0", - "readable-stream": "^2.2.2", - "sax": "^1.2.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -3255,12 +3188,12 @@ } }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" }, "dependencies": { @@ -3288,9 +3221,9 @@ "dev": true }, "i18next": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-15.1.0.tgz", - "integrity": "sha512-7cCrVn/BcoSOGJwTilAjGgWWzUDg4scTLX1sIBMWq6QjYYBrT+ChSAvmgVyQxkHinaIcswC04XK6l15RxM4Dkg==", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-15.1.2.tgz", + "integrity": "sha512-98ELn/dqep00DQ/v1E1gpM21HNN6nqU3mS85mYKd9P7lXrhfUcuysPaa3HviKSFb3WPdjf7avuAST3P0dhNp/A==", "dev": true, "requires": { "@babel/runtime": "^7.3.1" @@ -3309,9 +3242,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz", - "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, "requires": { @@ -3952,12 +3885,6 @@ "integrity": "sha1-3wDBFkrSNrGDz8OIel6NOMxjy7w=", "dev": true }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", @@ -4000,12 +3927,6 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", - "dev": true - }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -4042,12 +3963,6 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4197,22 +4112,22 @@ } }, "markdown-it": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-9.1.0.tgz", - "integrity": "sha512-xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, "requires": { "argparse": "^1.0.7", - "entities": "~1.1.1", + "entities": "~2.0.0", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } @@ -4338,9 +4253,9 @@ "dev": true }, "minipass": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.8.5.tgz", - "integrity": "sha512-D5+szmZBoOAfbLjOXY4Ve5bWylyTdrUOmbJPgYmgTF5ovCnCFFTY+I16Ccm/UjSNNAekXtIEDvoCDioFzRz18Q==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -4358,13 +4273,13 @@ } }, "minizlib": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", - "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mixin-deep": { @@ -4648,12 +4563,6 @@ } } }, - "mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4681,9 +4590,9 @@ } }, "multer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.1.tgz", - "integrity": "sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", "dev": true, "requires": { "append-field": "^1.0.0", @@ -4706,9 +4615,9 @@ } }, "mustache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", - "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.2.tgz", + "integrity": "sha512-64neoEgmozb8e/ecGBOSE+RfnevLSFzCI0UKPcrWmjv953/8fXhYO9+EQFtfbi6hwoFxcTA+Fp5mRiOiI9eTuA==", "dev": true }, "mute-stream": { @@ -4916,28 +4825,24 @@ } }, "node-red": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/node-red/-/node-red-0.20.8.tgz", - "integrity": "sha512-+i2SHPo8AQED0lyf7xoGcWAs142Nc5zvCTzmuncslgxVt/fl6XADEEY4yT/eDVNOwRrf9TZMjhSxBM9ScJJu7Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-red/-/node-red-1.0.1.tgz", + "integrity": "sha512-7VJi2FlIWcnR1HhX4LL4UERYbb4fzUSyE0nFnDRibbmqfBsujdPJR1PTTW9nMIlvF7EIQ8tBEOEZ4L/NdiyS8A==", "dev": true, "requires": { - "@node-red/editor-api": "0.20.8", - "@node-red/nodes": "0.20.8", - "@node-red/runtime": "0.20.8", - "@node-red/util": "0.20.8", + "@node-red/editor-api": "1.0.1", + "@node-red/nodes": "1.0.1", + "@node-red/runtime": "1.0.1", + "@node-red/util": "1.0.1", "basic-auth": "2.0.1", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", "express": "4.17.1", "fs-extra": "8.1.0", - "node-red-node-email": "^1.6.2", - "node-red-node-feedparser": "^0.1.14", - "node-red-node-rbe": "^0.2.4", - "node-red-node-sentiment": "^0.1.3", - "node-red-node-tail": "^0.0.2", - "node-red-node-twitter": "^1.1.5", + "node-red-node-rbe": "^0.2.5", + "node-red-node-tail": "^0.0.3", "nopt": "4.0.1", - "semver": "6.2.0" + "semver": "6.3.0" }, "dependencies": { "nopt": { @@ -4951,57 +4856,26 @@ } }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "node-red-node-email": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/node-red-node-email/-/node-red-node-email-1.6.3.tgz", - "integrity": "sha512-78O7CASdGAP2wmMJvqsMYdNrCHI54lSE97hWpbNQPG2QC2d15TEUQU+E8KgNzquPtJn0Pjh/cvzt+kQwKjkaUg==", - "dev": true, - "requires": { - "imap": "^0.8.19", - "mailparser": "^2.7.1", - "nodemailer": "^6.2.1", - "poplib": "^0.1.7" - } - }, - "node-red-node-feedparser": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/node-red-node-feedparser/-/node-red-node-feedparser-0.1.14.tgz", - "integrity": "sha512-Bb9M5bFrOqoFxBVxfstBM/g+VPaV4EPQptXQBMrlsCd3P40CXcGL0mDylXU+3cekWNd5hLHfqTHvXJdkowHGDw==", - "dev": true, - "requires": { - "feedparser": "^2.2.9", - "request": "^2.88.0" - } - }, "node-red-node-rbe": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/node-red-node-rbe/-/node-red-node-rbe-0.2.5.tgz", "integrity": "sha512-WPwIOZIdDprgfqOe8bEun47wkFFc+5Uw/1w3O/kZn/kS2IpI1q+wijUDK+Hw8q4d8KgA58B30wh+10UvXzsPDA==", "dev": true }, - "node-red-node-sentiment": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-red-node-sentiment/-/node-red-node-sentiment-0.1.4.tgz", - "integrity": "sha512-lZxov4OdGKoqvXcUK7oyVeW5a2qJsBr5+T8cq9kP5N0bnI9AQoywiIiVQ2HcFCHXy70U4ZIAhetGroNfAb68Zg==", - "dev": true, - "requires": { - "sentiment": "2.1.0" - } - }, "node-red-node-tail": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/node-red-node-tail/-/node-red-node-tail-0.0.2.tgz", - "integrity": "sha512-+92kgY+SOW6Oq7GfH3x9HC/9YBAg5UmdZBl426nFg0K4x9oegLqCqW2S0/fBAgyDBQQF8eHmn/GjHeO32R0aRg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/node-red-node-tail/-/node-red-node-tail-0.0.3.tgz", + "integrity": "sha512-wEiT7bSeU9oVHPK7S+mHb3cR6cIf9l205wTiHzhnUAuoDJS+IdwQkkpFgKTYmkL4Py2LvqCU90h85YpQul7QFQ==", "dev": true, "requires": { - "tail": "^2.0.0" + "tail": "^2.0.2" } }, "node-red-node-test-helper": { @@ -5144,20 +5018,10 @@ } } }, - "node-red-node-twitter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/node-red-node-twitter/-/node-red-node-twitter-1.1.5.tgz", - "integrity": "sha512-8V4tLL0nM1DOUgEtTOBSTZcLbtZ4Gg4CPFVHiPmLCo2QYTMQ0JdBIYj4pg95LbJbYkV721fqsw1RDsitBfYuCQ==", - "dev": true, - "requires": { - "request": "^2.88.0", - "twitter-ng": "0.6.2" - } - }, "nodemailer": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.0.tgz", - "integrity": "sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.1.tgz", + "integrity": "sha512-j0BsSyaMlyadEDEypK/F+xlne2K5m6wzPYMXS/yxKI0s7jmT1kBx6GEKRVbZmyYfKOsjkeC/TiMVDJBI/w5gMQ==", "dev": true }, "nomnom": { @@ -5224,9 +5088,9 @@ "optional": true }, "npm-packlist": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", - "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", "dev": true, "optional": true, "requires": { @@ -5262,12 +5126,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -6956,15 +6814,15 @@ "dev": true }, "tar": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.11.tgz", - "integrity": "sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.6.4", + "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", @@ -7155,15 +7013,6 @@ "dev": true, "optional": true }, - "twitter-ng": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/twitter-ng/-/twitter-ng-0.6.2.tgz", - "integrity": "sha1-E3BxFd0Eyb0fLGRtqXZYm+TWS8Q=", - "dev": true, - "requires": { - "oauth": ">=0.9.9" - } - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -7209,9 +7058,9 @@ }, "dependencies": { "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", + "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", "dev": true }, "source-map": { @@ -7794,9 +7643,9 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index f7621371..496fb127 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,9 @@ "msgpack-lite": "^0.1.26", "multilang-sentiment": "^1.2.0", "ngeohash": "^0.6.3", - "node-red": "~1.0.0", + "node-red": "~1.0.1", "node-red-node-test-helper": "~0.2.3", - "nodemailer": "~6.3.0", + "nodemailer": "^6.3.1", "poplib": "^0.1.7", "proxyquire": "~2.1.3", "pushbullet": "^2.4.0", From 56e8df069d26629d85f726244f494488fe6db715 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2019 21:46:15 +0100 Subject: [PATCH 280/456] knobble pushbullet test for now --- test/social/pushbullet/57-pushbullet_spec.js | 1236 +++++++++--------- 1 file changed, 620 insertions(+), 616 deletions(-) diff --git a/test/social/pushbullet/57-pushbullet_spec.js b/test/social/pushbullet/57-pushbullet_spec.js index 5aecf552..025001b0 100644 --- a/test/social/pushbullet/57-pushbullet_spec.js +++ b/test/social/pushbullet/57-pushbullet_spec.js @@ -80,692 +80,696 @@ var pushbulletNode = proxyquire("../../../social/pushbullet/57-pushbullet.js", { }); describe('pushbullet node', function() { - - beforeEach(function(done) { - currentPB = new pushbulletStub(); - helper.startServer(done); - }); - - afterEach(function(done) { - helper.unload(); - helper.stopServer(done); - }); - - describe('loading and settings', function() { - it('loads', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}]; - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - done(); - }); - }); - - it('gets user info', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}]; - var func = sinon.stub(currentPB, "me"); - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - func.yield(false, data.me); - helper.getNode("n1").me.then(function(me) { - me.should.have.property("email", "john.doe@noma.il"); - done(); - }); - }); - }); - - it.skip("input tests need updating for newer version of Sinon"); - // it('gets user info, fail', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet", config: "n1"}, - // {id:"n3", type:"pushbullet in", config: "n1"}]; - // var func = sinon.spy(currentPB, "me"); - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // var warn1 = sinon.spy(helper.getNode("n2"), "error"); - // //var warn2 = sinon.spy(helper.getNode("n3"), "error"); - // func.yield(true, null); - // func.callCount.should.be.above(0); - // //helper.getNode("n1").me.should.have.property("email", "john.doe@noma.il"); - // done(); - // }); - // }); - - it('list devices', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}]; - var func = sinon.stub(currentPB, "devices"); - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - helper.request().get("/pushbullet/n1/devices").end(function(err, res) { - var devs = JSON.parse(res.text); - devs.should.have.length(2); - done(); - }); - - var ret = getReply(); - ret.devices = data.devices; - func.yields(false, ret); - }); - }); - - it('gets last modified', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}]; - var func = sinon.stub(currentPB, "history"); - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - func.yield(false, getPushReply('modified')); - helper.getNode("n1").last.then(function(last) { - last.should.equal(1234); - done(); - }); - }); - }); - - it('gets last modified with no history', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}]; - var func = sinon.stub(currentPB, "history"); - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - func.yield(false, getReply()); - helper.getNode("n1").last.then(function(last) { - last.should.equal(0); - done(); - }); - }); - }); - }); - - describe('backward compatiblity', function() { - it('should be valid', function(done) { - var flow = [{"id": "n1", "type": "pushbullet", "chan": "", "title": "topic"}, - {id:"n3", type:"helper", wires: [["n1"]]}]; - helper.load(pushbulletNode, flow, {n1:{pushkey:"key", deviceid: "dev"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - }); - sinon.assert.calledWith(func, "dev", "topic", "my note"); - done(); - }); - }); - }); - - describe('defaults and msg optionals', function() { - it('defaults', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - }); - helper.getNode("n1").me.then(function(){ - sinon.assert.calledWith(func, "john.doe@noma.il", "Node-RED", "my note"); - done(); - }); - }); - }); - - it('no overrides', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - }); - sinon.assert.calledWith(func, "id", "title", "my note"); - done(); - }); - }); - - it('channel', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title", chan: "mychannel"}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - }); - sinon.assert.calledWith(func, {channel_tag: "mychannel"}, "title", "my note"); - done(); - }); - }); - - it('channel from msg', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - channel: "mychannel" - }); - sinon.assert.calledWith(func, {channel_tag: "mychannel"}, "title", "my note"); - done(); - }); - }); - - it('all optionals but defined in node', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "link", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "push"); - helper.getNode("n3").send({ - deviceid: "over1", - topic: "over2", - pushtype: "note", - payload: "payload" - }); - sinon.assert.calledWith(func, "id", {type: "link", body: undefined, title:"title", url: "payload"}); - done(); - }); - }); - - it('all optionals', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "", title: ""}, - {id:"n3", type:"helper", wires: [["n2"]]}]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "_msg_"}}, function() { - var func = sinon.spy(currentPB, "push"); - helper.getNode("n3").send({ - deviceid: "over1", - topic: "over2", - payload: "over3", - pushtype: "link" - }); - sinon.assert.calledWith(func, "over1", {type: "link", body: undefined, title: "over2", url: "over3"}); - done(); - }); - }); - }); - - describe('output', function() { - it('note', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "note"); - helper.getNode("n3").send({ - payload: "my note", - }); - sinon.assert.calledWith(func, "id", "title", "my note"); - done(); - }); - }); - - it('link', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "link", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "push"); - helper.getNode("n3").send({ - payload: "http://link", - message: "message" - }); - sinon.assert.calledWith(func, "id", {type: "link", title: "title", url: "http://link", body: "message"}); - done(); - }); - }); - - it('list', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "list", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "list"); - helper.getNode("n3").send({ - payload: ["a", "b", "c"], - }); - sinon.assert.calledWith(func, "id", "title"); - func.getCall(0).args[2].should.have.length(3); - - done(); - }); - }); - - it('list string', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "list", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "list"); - helper.getNode("n3").send({ - payload: '["a", "b", "c"]', - }); - sinon.assert.calledWith(func, "id", "title"); - func.getCall(0).args[2].should.have.length(3); - - done(); - }); - }); - - it('address', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "address", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "address"); - helper.getNode("n3").send({ - payload: "My Street 4", - }); - sinon.assert.calledWith(func, "id", "title", "My Street 4"); - done(); - }); - }); - - it('file', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "file", title: "title"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "file"); - var fn = path.join(__dirname, "data.js") - helper.getNode("n3").send({ - payload: fn, - }); - sinon.assert.calledWith(func, "id", fn, "title"); - done(); - }); - }); - - it.skip("fail tests need updating for newer version of Sinon"); - // it('should fail if file don\'t exist', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet", config: "n1", pushtype: "file", title: "title"}, - // {id:"n3", type:"helper", wires: [["n2"]]} - // ]; - // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - // var func = sinon.spy(currentPB, "file"); - // var errfn = sinon.spy(helper.getNode("n2"), "error"); - // helper.getNode("n3").send({ - // payload: "hello", - // }); - // func.called.should.fail; - // errfn.callCount.should.be.above(0); - // done(); - // }); - // }); - - it('raw', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "push"); - helper.getNode("n3").send({ - pushtype: '_raw_', - raw: {type: 'note', title: 'title', body: 'this is the note'} - }); - sinon.assert.calledWith(func, "id", {type: 'note', title: 'title', body: 'this is the note'}); - done(); - }); - }); - - it('raw update', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { - var func = sinon.spy(currentPB, "updatePush"); - helper.getNode("n3").send({ - pushtype: '_rawupdate_', - raw: {items: [{checked:false, text: 'a'}]}, - data: {iden: 'id'} - }); - sinon.assert.calledWith(func, "id", {items: [{checked:false, text: 'a'}]}); - done(); - }); - }); - }); - - describe('actions', function() { - it('delete', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "delete"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - var func = sinon.spy(currentPB, "deletePush"); - helper.getNode("n3").send({ - payload: "my note", - data: { iden: "delid"} - }); - sinon.assert.calledWith(func, "delid"); - done(); - }); - }); - - it('dismiss', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "dismissal"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - var func = sinon.spy(currentPB, "updatePush"); - helper.getNode("n3").send({ - payload: "my note", - data: { iden: "delid", dismissed: false } - }); - sinon.assert.calledWith(func, "delid"); - done(); - }); - }); - - it('update list', function(done) { - var flow = [{id:"n1", type:"pushbullet-config"}, - {id:"n2", type:"pushbullet", config: "n1", pushtype: "updatelist"}, - {id:"n3", type:"helper", wires: [["n2"]]} - ]; - - helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - var func = sinon.spy(currentPB, "updatePush"); - helper.getNode("n3").send({ - payload: [{}, {}, {}], - data: { iden: "delid", type: "list" } - }); - sinon.assert.calledWith(func, "delid"); - func.getCall(0).args[1].items.should.have.length(3); - done(); - }); - }); - }); - - describe('input', function() { - it.skip("input tests need updating for newer version of Sinon"); - return; - - // describe('input', function() { - // it('handles stream push', function(done) { + it.skip("input tests need updating for newer version of Sinon"); + return; + // + // beforeEach(function(done) { + // currentPB = new pushbulletStub(); + // helper.startServer(done); + // }); + // + // afterEach(function(done) { + // helper.unload(); + // helper.stopServer(done); + // }); + // + // describe('loading and settings', function() { + // it('loads', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // + // {id:"n2", type:"pushbullet", config: "n1"}]; // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // done(); - // }); - // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "clip", body: "clipboard"}}) - // }); - // }); - // - // it('handles status', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // //var func = sinon.spy(helper.getNode("n2"), 'status'); - // currentPB.streamEmitter.emit("connect"); - // currentPB.streamEmitter.emit("close"); - // //currentPB.streamEmitter.emit("error"); - // //func.callCount.should.equal(3); // done(); // }); // }); // - // it('clipboard', function(done) { + // it('gets user info', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // + // {id:"n2", type:"pushbullet", config: "n1"}]; + // var func = sinon.stub(currentPB, "me"); // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "clip"); - // msg.should.have.property("payload", "hello"); - // msg.should.have.property("data"); + // func.yield(false, data.me); + // helper.getNode("n1").me.then(function(me) { + // me.should.have.property("email", "john.doe@noma.il"); // done(); // }); - // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "clip", body: "hello"}}); // }); // }); // - // it('mirror', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // it.skip("input tests need updating for newer version of Sinon"); + // // it('gets user info, fail', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet", config: "n1"}, + // // {id:"n3", type:"pushbullet in", config: "n1"}]; + // // var func = sinon.spy(currentPB, "me"); + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // var warn1 = sinon.spy(helper.getNode("n2"), "error"); + // // //var warn2 = sinon.spy(helper.getNode("n3"), "error"); + // // func.yield(true, null); + // // func.callCount.should.be.above(0); + // // //helper.getNode("n1").me.should.have.property("email", "john.doe@noma.il"); + // // done(); + // // }); + // // }); // + // it('list devices', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1"}]; + // var func = sinon.stub(currentPB, "devices"); // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "mirror"); - // msg.should.have.property("payload", "If you see this on your computer, mirroring is working!\n"); - // msg.should.have.property("data"); + // helper.request().get("/pushbullet/n1/devices").end(function(err, res) { + // var devs = JSON.parse(res.text); + // devs.should.have.length(2); // done(); // }); - // currentPB.streamEmitter.emit("message", {type: "push", push: data.mirror}); + // + // var ret = getReply(); + // ret.devices = data.devices; + // func.yields(false, ret); // }); // }); // - // it('dismissal', function(done) { + // it('gets last modified', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // + // {id:"n2", type:"pushbullet", config: "n1"}]; + // var func = sinon.stub(currentPB, "history"); // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "dismissal"); - // msg.should.have.property("payload", "pjgzwwocCCy"); - // msg.should.have.property("data"); + // func.yield(false, getPushReply('modified')); + // helper.getNode("n1").last.then(function(last) { + // last.should.equal(1234); // done(); // }); - // currentPB.streamEmitter.emit("message", {type: "push", push: data.dismissal}); // }); // }); // - // it('unknown type', function(done) { + // it('gets last modified with no history', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // + // {id:"n2", type:"pushbullet", config: "n1"}]; + // var func = sinon.stub(currentPB, "history"); // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // var err = sinon.spy(helper.getNode("n1"), "error"); - // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "push", push: {type: "unknown", data: "test"}}}); - // err.called.should.be.ok; + // func.yield(false, getReply()); + // helper.getNode("n1").last.then(function(last) { + // last.should.equal(0); + // done(); + // }); + // }); + // }); + // }); + // + // describe('backward compatiblity', function() { + // it('should be valid', function(done) { + // var flow = [{"id": "n1", "type": "pushbullet", "chan": "", "title": "topic"}, + // {id:"n3", type:"helper", wires: [["n1"]]}]; + // helper.load(pushbulletNode, flow, {n1:{pushkey:"key", deviceid: "dev"}}, function() { + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // }); + // sinon.assert.calledWith(func, "dev", "topic", "my note"); // done(); // }); // }); // }); - - // describe('tickle', function() { - // it('note', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; // + // describe('defaults and msg optionals', function() { + // it('defaults', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1"}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "note"); - // msg.should.have.property("payload", "body"); - // msg.should.have.property("topic", "title"); - // msg.should.have.property("data"); + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // }); + // helper.getNode("n1").me.then(function(){ + // sinon.assert.calledWith(func, "john.doe@noma.il", "Node-RED", "my note"); // done(); // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('note')); + // }); + // }); + // + // it('no overrides', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // }); + // sinon.assert.calledWith(func, "id", "title", "my note"); + // done(); + // }); + // }); + // + // it('channel', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title", chan: "mychannel"}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // }); + // sinon.assert.calledWith(func, {channel_tag: "mychannel"}, "title", "my note"); + // done(); + // }); + // }); + // + // it('channel from msg', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // channel: "mychannel" + // }); + // sinon.assert.calledWith(func, {channel_tag: "mychannel"}, "title", "my note"); + // done(); + // }); + // }); + // + // it('all optionals but defined in node', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "link", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "push"); + // helper.getNode("n3").send({ + // deviceid: "over1", + // topic: "over2", + // pushtype: "note", + // payload: "payload" + // }); + // sinon.assert.calledWith(func, "id", {type: "link", body: undefined, title:"title", url: "payload"}); + // done(); + // }); + // }); + // + // it('all optionals', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "", title: ""}, + // {id:"n3", type:"helper", wires: [["n2"]]}]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "_msg_"}}, function() { + // var func = sinon.spy(currentPB, "push"); + // helper.getNode("n3").send({ + // deviceid: "over1", + // topic: "over2", + // payload: "over3", + // pushtype: "link" + // }); + // sinon.assert.calledWith(func, "over1", {type: "link", body: undefined, title: "over2", url: "over3"}); + // done(); + // }); + // }); + // }); + // + // describe('output', function() { + // it('note', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "note", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "note"); + // helper.getNode("n3").send({ + // payload: "my note", + // }); + // sinon.assert.calledWith(func, "id", "title", "my note"); + // done(); // }); // }); // // it('link', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "link", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "link"); - // msg.should.have.property("payload", "url"); - // msg.should.have.property("topic", "title"); - // msg.should.have.property("data"); - // done(); + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "push"); + // helper.getNode("n3").send({ + // payload: "http://link", + // message: "message" // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('link')); - // }); - // }); - // - // it('address', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "address"); - // msg.should.have.property("payload", "address"); - // msg.should.have.property("topic", "title"); - // msg.should.have.property("data"); - // done(); - // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('address')); - // }); - // }); - // - // it('file', function(done) { - // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; - // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "file"); - // msg.should.have.property("payload", "fileurl"); - // msg.should.have.property("topic", "filename"); - // msg.should.have.property("data"); - // done(); - // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('file')); + // sinon.assert.calledWith(func, "id", {type: "link", title: "title", url: "http://link", body: "message"}); + // done(); // }); // }); // // it('list', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "list", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "list"); - // msg.should.have.property("topic", "title"); - // msg.should.have.property("payload").with.length(3); - // msg.should.have.property("data"); - // done(); + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "list"); + // helper.getNode("n3").send({ + // payload: ["a", "b", "c"], // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('list')); + // sinon.assert.calledWith(func, "id", "title"); + // func.getCall(0).args[2].should.have.length(3); + // + // done(); // }); // }); // - // it('delete', function(done) { + // it('list string', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "list", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "delete"); - // msg.should.have.property("payload", "pjgzwwocCCy"); - // msg.should.have.property("data"); - // done(); + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "list"); + // helper.getNode("n3").send({ + // payload: '["a", "b", "c"]', // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // func.yields(false, getPushReply('delete')); + // sinon.assert.calledWith(func, "id", "title"); + // func.getCall(0).args[2].should.have.length(3); + // + // done(); // }); // }); // - // it('dismissed', function(done) { + // it('address', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "address", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { - // helper.getNode("n3").on("input", function(msg) { - // msg.should.have.property("pushtype", "dismissal"); - // msg.should.have.property("payload", "xXxXxXxXxXxsjArqXRsaZM"); - // msg.should.have.property("data"); - // done(); + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "address"); + // helper.getNode("n3").send({ + // payload: "My Street 4", // }); - // var func = sinon.stub(currentPB, "history"); - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // var rep = getPushReply('note'); - // rep.pushes[0].dismissed = true; - // func.yields(false, rep); + // sinon.assert.calledWith(func, "id", "title", "My Street 4"); + // done(); // }); // }); // - // it('filter', function(done) { + // it('file', function(done) { // var flow = [{id:"n1", type:"pushbullet-config"}, - // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, - // {id:"n3", type:"helper"}]; + // {id:"n2", type:"pushbullet", config: "n1", pushtype: "file", title: "title"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; // - // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2:{filters:['a', 'b']}}, function() { - // var counter = sinon.spy(); - // helper.getNode("n3").on("input", function(msg) { - // counter(); + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "file"); + // var fn = path.join(__dirname, "data.js") + // helper.getNode("n3").send({ + // payload: fn, // }); - // - // var func = sinon.stub(currentPB, "history"); - // - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // var msg0 = getPushReply('link'); msg0.pushes[0].source_device_iden = 'a'; - // func.onCall(0).yields(false, msg0); - // - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // var msg1 = getPushReply('link'); msg1.pushes[0].source_device_iden = 'b'; - // func.onCall(1).yields(false, msg1); - // - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // var msg2 = getPushReply('link'); msg2.pushes[0].source_device_iden = 'c'; - // func.onCall(2).yields(false, msg2); - // - // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); - // var msg3 = getPushReply('link'); - // delete msg3.pushes[0].source_device_iden; - // delete msg3.pushes[0].target_device_iden; - // func.onCall(3).yields(false, msg3); - // - // setTimeout(function() { - // counter.callCount.should.equal(3); - // done(); - // }, 100); + // sinon.assert.calledWith(func, "id", fn, "title"); + // done(); // }); // }); - }); + // + // it.skip("fail tests need updating for newer version of Sinon"); + // // it('should fail if file don\'t exist', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet", config: "n1", pushtype: "file", title: "title"}, + // // {id:"n3", type:"helper", wires: [["n2"]]} + // // ]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // // var func = sinon.spy(currentPB, "file"); + // // var errfn = sinon.spy(helper.getNode("n2"), "error"); + // // helper.getNode("n3").send({ + // // payload: "hello", + // // }); + // // func.called.should.fail; + // // errfn.callCount.should.be.above(0); + // // done(); + // // }); + // // }); + // + // it('raw', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "push"); + // helper.getNode("n3").send({ + // pushtype: '_raw_', + // raw: {type: 'note', title: 'title', body: 'this is the note'} + // }); + // sinon.assert.calledWith(func, "id", {type: 'note', title: 'title', body: 'this is the note'}); + // done(); + // }); + // }); + // + // it('raw update', function(done) { + // var flow = [{id:"n1", type:"pushbullet-config"}, + // {id:"n2", type:"pushbullet", config: "n1"}, + // {id:"n3", type:"helper", wires: [["n2"]]} + // ]; + // + // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2: {deviceid: "id"}}, function() { + // var func = sinon.spy(currentPB, "updatePush"); + // helper.getNode("n3").send({ + // pushtype: '_rawupdate_', + // raw: {items: [{checked:false, text: 'a'}]}, + // data: {iden: 'id'} + // }); + // sinon.assert.calledWith(func, "id", {items: [{checked:false, text: 'a'}]}); + // done(); + // }); + // }); + // }); + // + // describe('actions', function() { + // it.skip("input tests need updating for newer version of Sinon"); + // return; + // // it('delete', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet", config: "n1", pushtype: "delete"}, + // // {id:"n3", type:"helper", wires: [["n2"]]} + // // ]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // var func = sinon.spy(currentPB, "deletePush"); + // // helper.getNode("n3").send({ + // // payload: "my note", + // // data: { iden: "delid"} + // // }); + // // sinon.assert.calledWith(func, "delid"); + // // done(); + // // }); + // // }); + // // + // // it('dismiss', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet", config: "n1", pushtype: "dismissal"}, + // // {id:"n3", type:"helper", wires: [["n2"]]} + // // ]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // var func = sinon.spy(currentPB, "updatePush"); + // // helper.getNode("n3").send({ + // // payload: "my note", + // // data: { iden: "delid", dismissed: false } + // // }); + // // sinon.assert.calledWith(func, "delid"); + // // done(); + // // }); + // // }); + // // + // // it('update list', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet", config: "n1", pushtype: "updatelist"}, + // // {id:"n3", type:"helper", wires: [["n2"]]} + // // ]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // var func = sinon.spy(currentPB, "updatePush"); + // // helper.getNode("n3").send({ + // // payload: [{}, {}, {}], + // // data: { iden: "delid", type: "list" } + // // }); + // // sinon.assert.calledWith(func, "delid"); + // // func.getCall(0).args[1].items.should.have.length(3); + // // done(); + // // }); + // // }); + // }); + // + // describe('input', function() { + // it.skip("input tests need updating for newer version of Sinon"); + // return; + // + // // describe('input', function() { + // // it('handles stream push', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // done(); + // // }); + // // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "clip", body: "clipboard"}}) + // // }); + // // }); + // // + // // it('handles status', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // //var func = sinon.spy(helper.getNode("n2"), 'status'); + // // currentPB.streamEmitter.emit("connect"); + // // currentPB.streamEmitter.emit("close"); + // // //currentPB.streamEmitter.emit("error"); + // // //func.callCount.should.equal(3); + // // done(); + // // }); + // // }); + // // + // // it('clipboard', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "clip"); + // // msg.should.have.property("payload", "hello"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "clip", body: "hello"}}); + // // }); + // // }); + // // + // // it('mirror', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "mirror"); + // // msg.should.have.property("payload", "If you see this on your computer, mirroring is working!\n"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // currentPB.streamEmitter.emit("message", {type: "push", push: data.mirror}); + // // }); + // // }); + // // + // // it('dismissal', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "dismissal"); + // // msg.should.have.property("payload", "pjgzwwocCCy"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // currentPB.streamEmitter.emit("message", {type: "push", push: data.dismissal}); + // // }); + // // }); + // // + // // it('unknown type', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // var err = sinon.spy(helper.getNode("n1"), "error"); + // // currentPB.streamEmitter.emit("message", {type: "push", push: {type: "push", push: {type: "unknown", data: "test"}}}); + // // err.called.should.be.ok; + // // done(); + // // }); + // // }); + // // }); + // + // // describe('tickle', function() { + // // it('note', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "note"); + // // msg.should.have.property("payload", "body"); + // // msg.should.have.property("topic", "title"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('note')); + // // }); + // // }); + // // + // // it('link', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "link"); + // // msg.should.have.property("payload", "url"); + // // msg.should.have.property("topic", "title"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('link')); + // // }); + // // }); + // // + // // it('address', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "address"); + // // msg.should.have.property("payload", "address"); + // // msg.should.have.property("topic", "title"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('address')); + // // }); + // // }); + // // + // // it('file', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "file"); + // // msg.should.have.property("payload", "fileurl"); + // // msg.should.have.property("topic", "filename"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('file')); + // // }); + // // }); + // // + // // it('list', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "list"); + // // msg.should.have.property("topic", "title"); + // // msg.should.have.property("payload").with.length(3); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('list')); + // // }); + // // }); + // // + // // it('delete', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "delete"); + // // msg.should.have.property("payload", "pjgzwwocCCy"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // func.yields(false, getPushReply('delete')); + // // }); + // // }); + // // + // // it('dismissed', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}}, function() { + // // helper.getNode("n3").on("input", function(msg) { + // // msg.should.have.property("pushtype", "dismissal"); + // // msg.should.have.property("payload", "xXxXxXxXxXxsjArqXRsaZM"); + // // msg.should.have.property("data"); + // // done(); + // // }); + // // var func = sinon.stub(currentPB, "history"); + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // var rep = getPushReply('note'); + // // rep.pushes[0].dismissed = true; + // // func.yields(false, rep); + // // }); + // // }); + // // + // // it('filter', function(done) { + // // var flow = [{id:"n1", type:"pushbullet-config"}, + // // {id:"n2", type:"pushbullet in", config: "n1", wires: [["n3"]]}, + // // {id:"n3", type:"helper"}]; + // // + // // helper.load(pushbulletNode, flow, {n1:{apikey:"invalid"}, n2:{filters:['a', 'b']}}, function() { + // // var counter = sinon.spy(); + // // helper.getNode("n3").on("input", function(msg) { + // // counter(); + // // }); + // // + // // var func = sinon.stub(currentPB, "history"); + // // + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // var msg0 = getPushReply('link'); msg0.pushes[0].source_device_iden = 'a'; + // // func.onCall(0).yields(false, msg0); + // // + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // var msg1 = getPushReply('link'); msg1.pushes[0].source_device_iden = 'b'; + // // func.onCall(1).yields(false, msg1); + // // + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // var msg2 = getPushReply('link'); msg2.pushes[0].source_device_iden = 'c'; + // // func.onCall(2).yields(false, msg2); + // // + // // currentPB.streamEmitter.emit("message", {type: "tickle", subtype: "push"}); + // // var msg3 = getPushReply('link'); + // // delete msg3.pushes[0].source_device_iden; + // // delete msg3.pushes[0].target_device_iden; + // // func.onCall(3).yields(false, msg3); + // // + // // setTimeout(function() { + // // counter.callCount.should.equal(3); + // // done(); + // // }, 100); + // // }); + // // }); + // }); }); From 27616df2ddff1d50ee179094a6750389e62e10e1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2019 22:35:21 +0100 Subject: [PATCH 281/456] update feedparser test --- package-lock.json | 91 ++++++++++++++++++++++ package.json | 1 + test/social/feedparse/32-feedparse_spec.js | 1 - 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 175eccb6..deb86e0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -313,6 +313,12 @@ "negotiator": "0.6.2" } }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -469,6 +475,12 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-indexofobject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-indexofobject/-/array-indexofobject-0.0.1.tgz", + "integrity": "sha1-qqEo5iybPDWAlFaMIZ/2T+SJ1Co=", + "dev": true + }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -2177,6 +2189,61 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "feedparser": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/feedparser/-/feedparser-2.2.9.tgz", + "integrity": "sha1-kTgZfa/a4F/K3eADa+6vYGbCxek=", + "dev": true, + "requires": { + "addressparser": "^1.0.1", + "array-indexofobject": "~0.0.1", + "lodash.assign": "^4.2.0", + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.uniq": "^4.5.0", + "mri": "^1.1.0", + "readable-stream": "^2.2.2", + "sax": "^1.2.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -3885,6 +3952,12 @@ "integrity": "sha1-3wDBFkrSNrGDz8OIel6NOMxjy7w=", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", @@ -3927,6 +4000,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", + "dev": true + }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -3963,6 +4042,12 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4563,6 +4648,12 @@ } } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/package.json b/package.json index 496fb127..770b3375 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ ], "devDependencies": { "exif": "^0.6.0", + "feedparser": "^2.2.9", "grunt": "^1.0.4", "grunt-cli": "^1.3.2", "grunt-contrib-jshint": "^2.1.0", diff --git a/test/social/feedparse/32-feedparse_spec.js b/test/social/feedparse/32-feedparse_spec.js index aae2328e..454b82eb 100644 --- a/test/social/feedparse/32-feedparse_spec.js +++ b/test/social/feedparse/32-feedparse_spec.js @@ -1,6 +1,5 @@ const should = require("should"); const helper = require("node-red-node-test-helper"); - const feedParserNode = require("../../../social/feedparser/32-feedparse"); describe("FeedParseNode", () => { From b35daf6bb775bdd370c0f1910caa5b45da656a57 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 12 Oct 2019 11:37:44 +0100 Subject: [PATCH 282/456] bump sqlite node deps for Node12 support --- storage/sqlite/README.md | 7 +++---- storage/sqlite/package.json | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/storage/sqlite/README.md b/storage/sqlite/README.md index 12e5a91e..ab4f8f27 100644 --- a/storage/sqlite/README.md +++ b/storage/sqlite/README.md @@ -16,22 +16,21 @@ devices like a Raspberry Pi - please be prepared to wait a long time. Also if no cd ~/.node-red npm rebuild - Usage ----- Allows basic access to a Sqlite database. -This node uses the db.all operation against the configured database. +This node uses the **db.all** operation against the configured database. This does allow INSERTS, UPDATES and DELETES. By it's very nature it is SQL injection... so *be careful* out there... -`msg.topic` must hold the query for the database, and the result is returned in `msg.payload`. +`msg.topic` must hold the *query* for the database, and the result is returned in `msg.payload`. Typically the returned payload will be an array of the result rows, (or an error). -You can load sqlite extensions by inputting a msg.extension property containing the full path and filename. +You can load sqlite extensions by inputting a `msg.extension` property containing the full path and filename. The reconnect timeout in milliseconds can be changed by adding a line to **settings.js** diff --git a/storage/sqlite/package.json b/storage/sqlite/package.json index fd75b2e2..033e36e9 100644 --- a/storage/sqlite/package.json +++ b/storage/sqlite/package.json @@ -1,9 +1,9 @@ { "name": "node-red-node-sqlite", - "version": "0.3.7", + "version": "0.4.0", "description": "A sqlite node for Node-RED", "dependencies": { - "sqlite3": "^4.0.6" + "sqlite3": "^4.1.0" }, "repository": { "type": "git", From f2e28e715f320b149e463980e89c187e13e7dc21 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 16 Oct 2019 11:24:33 +0100 Subject: [PATCH 283/456] fix mysql node OkPacket handling to close #583 --- storage/mysql/68-mysql.js | 6 ++++-- storage/mysql/package.json | 25 ++++++++++++++----------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/storage/mysql/68-mysql.js b/storage/mysql/68-mysql.js index 153c9389..4b4b8ac0 100644 --- a/storage/mysql/68-mysql.js +++ b/storage/mysql/68-mysql.js @@ -121,7 +121,6 @@ module.exports = function(RED) { node.on("input", function(msg) { if (node.mydbConfig.connected) { if (typeof msg.topic === 'string') { - //console.log("query:",msg.topic); var bind = Array.isArray(msg.payload) ? msg.payload : []; node.mydbConfig.connection.query(msg.topic, bind, function(err, rows) { if (err) { @@ -129,7 +128,10 @@ module.exports = function(RED) { status = {fill:"red",shape:"ring",text:"Error"}; } else { - msg.payload = rows; + if (rows.constructor.name === "OkPacket") { + msg.payload = JSON.parse(JSON.stringify(rows)); + } + else { msg.payload = rows; } node.send(msg); status = {fill:"green",shape:"dot",text:"OK"}; } diff --git a/storage/mysql/package.json b/storage/mysql/package.json index 5bb89701..b9621a33 100644 --- a/storage/mysql/package.json +++ b/storage/mysql/package.json @@ -1,18 +1,21 @@ { - "name" : "node-red-node-mysql", - "version" : "0.0.18", - "description" : "A Node-RED node to read and write to a MySQL database", - "dependencies" : { - "mysql" : "^2.16.0" + "name": "node-red-node-mysql", + "version": "0.0.19", + "description": "A Node-RED node to read and write to a MySQL database", + "dependencies": { + "mysql": "^2.17.1" }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/tree/master/storage/mysql" + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/storage/mysql" }, "license": "Apache-2.0", - "keywords": [ "node-red", "mysql" ], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "mysql" + ], + "node-red": { + "nodes": { "mysql": "68-mysql.js" } }, From e3ab387814b3d4166f792196e45f661c5c0171a5 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 20 Oct 2019 22:43:32 +0100 Subject: [PATCH 284/456] Move suncalc and timeswitch into time category --- time/suncalc/79-suncalc.html | 2 +- time/suncalc/package.json | 2 +- time/timeswitch/package.json | 2 +- time/timeswitch/timeswitch.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/time/suncalc/79-suncalc.html b/time/suncalc/79-suncalc.html index 883bd5a6..69feede9 100644 --- a/time/suncalc/79-suncalc.html +++ b/time/suncalc/79-suncalc.html @@ -46,7 +46,7 @@ diff --git a/parsers/msgpack/package.json b/parsers/msgpack/package.json index 9a8b2070..2ba812b2 100644 --- a/parsers/msgpack/package.json +++ b/parsers/msgpack/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-msgpack", - "version" : "1.1.3", + "version" : "1.2.0", "description" : "A Node-RED node to pack and unpack objects to msgpack format", "dependencies" : { "msgpack-lite" : "^0.1.26" From ca88faa7ca97ecdb322067d07ce97bcedee26e65 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 22 Oct 2019 22:05:49 +0100 Subject: [PATCH 286/456] Fix arduino nodes servo/pwm output to reduce jitter to close #584 --- hardware/Arduino/35-arduino.js | 14 +++++++------- hardware/Arduino/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hardware/Arduino/35-arduino.js b/hardware/Arduino/35-arduino.js index 465fe007..fc3ffe1f 100644 --- a/hardware/Arduino/35-arduino.js +++ b/hardware/Arduino/35-arduino.js @@ -76,9 +76,11 @@ module.exports = function(RED) { node.status({fill:"grey",shape:"ring",text:"node-red:common.status.connecting"}); var doit = function() { node.running = true; + if (node.state === "ANALOG") { node.board.pinMode(node.pin, 0x02); } + if (node.state === "INPUT") { node.board.pinMode(node.pin, 0x00); } + if (node.state === "PULLUP") { node.board.pinMode(node.pin, 0x0B); } node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); if (node.state === "ANALOG") { - node.board.pinMode(node.pin, 0x02); node.board.analogRead(node.pin, function(v) { if (v !== node.oldval) { node.oldval = v; @@ -87,7 +89,6 @@ module.exports = function(RED) { }); } if (node.state === "INPUT") { - node.board.pinMode(node.pin, 0x00); node.board.digitalRead(node.pin, function(v) { if (v !== node.oldval) { node.oldval = v; @@ -96,7 +97,6 @@ module.exports = function(RED) { }); } if (node.state === "PULLUP") { - node.board.pinMode(node.pin, 0x0B); node.board.digitalRead(node.pin, function(v) { if (v !== node.oldval) { node.oldval = v; @@ -149,11 +149,13 @@ module.exports = function(RED) { node.status({fill:"grey",shape:"ring",text:"node-red:common.status.connecting"}); var doit = function() { node.running = true; + if (node.state === "OUTPUT") { node.board.pinMode(node.pin, 0x01); } + if (node.state === "PWM") { node.board.pinMode(node.pin, 0x03); } + if (node.state === "SERVO") { node.board.pinMode(node.pin, 0x04); } node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); node.on("input", function(msg) { if (node.board.isReady) { if (node.state === "OUTPUT") { - node.board.pinMode(node.pin, 0x01); if ((msg.payload === true)||(msg.payload.toString() == "1")||(msg.payload.toString().toLowerCase() == "on")) { node.board.digitalWrite(node.pin, node.board.HIGH); } @@ -161,15 +163,13 @@ module.exports = function(RED) { node.board.digitalWrite(node.pin, node.board.LOW); } } - if (node.state === "PWM") { - node.board.pinMode(node.pin, 0x03); + if (node.state === "PWM") { msg.payload = parseInt((msg.payload * 1) + 0.5); if ((msg.payload >= 0) && (msg.payload <= 255)) { node.board.analogWrite(node.pin, msg.payload); } } if (node.state === "SERVO") { - node.board.pinMode(node.pin, 0x04); msg.payload = parseInt((msg.payload * 1) + 0.5); if ((msg.payload >= 0) && (msg.payload <= 180)) { node.board.servoWrite(node.pin, msg.payload); diff --git a/hardware/Arduino/package.json b/hardware/Arduino/package.json index c919cabb..0e325ac9 100644 --- a/hardware/Arduino/package.json +++ b/hardware/Arduino/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-arduino", - "version" : "0.2.3", + "version" : "0.2.4", "description" : "A Node-RED node to talk to an Arduino running firmata", "dependencies" : { "firmata" : "^2.0.0" From 97a1352afc1a08fa53523d52c96cd2c0a4a82639 Mon Sep 17 00:00:00 2001 From: Ryoichi Obara Date: Sat, 26 Oct 2019 20:54:17 +0900 Subject: [PATCH 287/456] [ja] Translate 88-ping help text. (#589) --- io/ping/88-ping.html | 9 --------- io/ping/locales/en-US/88-ping.html | 8 ++++++++ io/ping/locales/ja/88-ping.html | 8 ++++++++ 3 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 io/ping/locales/en-US/88-ping.html create mode 100644 io/ping/locales/ja/88-ping.html diff --git a/io/ping/88-ping.html b/io/ping/88-ping.html index 97bd035f..8c76afa6 100644 --- a/io/ping/88-ping.html +++ b/io/ping/88-ping.html @@ -14,15 +14,6 @@
    - - diff --git a/io/ping/locales/ja/88-ping.html b/io/ping/locales/ja/88-ping.html new file mode 100644 index 00000000..922747bf --- /dev/null +++ b/io/ping/locales/ja/88-ping.html @@ -0,0 +1,8 @@ + From 0f46364a55a5a5f194798a64bb28019364bc5a94 Mon Sep 17 00:00:00 2001 From: tmdoit Date: Sat, 26 Oct 2019 13:54:36 +0200 Subject: [PATCH 288/456] Update level package in package.json (#588) Update from 4.0.0 to 6.0.0 version. It fixes NR restarts (NR 502 errors) when trying to read from leveldb store after some time from writing. --- storage/leveldb/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/leveldb/package.json b/storage/leveldb/package.json index cb54bf2c..6f11e561 100644 --- a/storage/leveldb/package.json +++ b/storage/leveldb/package.json @@ -3,7 +3,7 @@ "version" : "0.1.0", "description" : "A Node-RED node to read and write to a LevelDB database", "dependencies" : { - "level" : "^4.0.0" + "level" : "^6.0.0" }, "repository" : { "type":"git", From b9cf6d88e96703c026ed8c4972bd496ec5fc913b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 26 Oct 2019 13:07:44 +0100 Subject: [PATCH 289/456] bump ping package to 0.1 to include i18n --- io/ping/LICENSE | 2 +- io/ping/README.md | 3 ++- io/ping/package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/io/ping/LICENSE b/io/ping/LICENSE index f5b60114..6085bcc2 100644 --- a/io/ping/LICENSE +++ b/io/ping/LICENSE @@ -1,4 +1,4 @@ -Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2016-2019 JS Foundation and other contributors, https://js.foundation/ Copyright 2013-2016 IBM Corp. Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/io/ping/README.md b/io/ping/README.md index 4bfb9e87..36127c73 100644 --- a/io/ping/README.md +++ b/io/ping/README.md @@ -7,7 +7,7 @@ remote server, for use as a keep-alive check. Install ------- -Run the following command in your Node-RED user directory - typically `~/.node-red` +Either use the Editor - Menu - Manage Palette - Import option or run the following command in your Node-RED user directory - typically `~/.node-red` npm install node-red-node-ping @@ -30,6 +30,7 @@ Usage Pings a machine and returns the trip time in mS as `msg.payload`. Returns boolean `false` if no response received, or if the host is unresolveable. + `msg.error` will contain any error message if necessary. `msg.topic` contains the ip address of the target host. diff --git a/io/ping/package.json b/io/ping/package.json index 9ca40169..6ce6cffe 100644 --- a/io/ping/package.json +++ b/io/ping/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ping", - "version" : "0.0.17", + "version" : "0.1.0", "description" : "A Node-RED node to ping a remote server, for use as a keep-alive check.", "dependencies" : { }, From 2ddabadbf2e04dcc7c0ea981a478a8f6a82a260d Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 26 Oct 2019 13:08:09 +0100 Subject: [PATCH 290/456] bump leveldb package to 0.2 to include level 6.0 lib --- storage/leveldb/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/leveldb/package.json b/storage/leveldb/package.json index 6f11e561..db76429d 100644 --- a/storage/leveldb/package.json +++ b/storage/leveldb/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-leveldb", - "version" : "0.1.0", + "version" : "0.2.0", "description" : "A Node-RED node to read and write to a LevelDB database", "dependencies" : { "level" : "^6.0.0" From 739b3e595c65386aec3792badc942dea369d5e4c Mon Sep 17 00:00:00 2001 From: Ryoichi Obara Date: Tue, 29 Oct 2019 02:40:41 +0900 Subject: [PATCH 291/456] [ja] Support i18n 70-base64 node. (#591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ja] Translate 70-base64 node. * Fix PR review #591 "Buffer" -> "バッファ". We have used Japanese katakana words of "buffer" in http-request and file-out nodes. * Fix PR review #591 "Base64" -> "base64" * Fix PR review #591 "Base64から文字列へデコード" -> "Base64から文字列へ変換" --- parsers/base64/70-base64.html | 16 ++++---------- parsers/base64/70-base64.js | 10 ++++----- parsers/base64/locales/en-US/70-base64.html | 7 ++++++ parsers/base64/locales/en-US/70-base64.json | 24 +++++++++++++++++++++ parsers/base64/locales/ja/70-base64.html | 7 ++++++ parsers/base64/locales/ja/70-base64.json | 24 +++++++++++++++++++++ test/parsers/base64/70-base64_spec.js | 4 ++-- 7 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 parsers/base64/locales/en-US/70-base64.html create mode 100644 parsers/base64/locales/en-US/70-base64.json create mode 100644 parsers/base64/locales/ja/70-base64.html create mode 100644 parsers/base64/locales/ja/70-base64.json diff --git a/parsers/base64/70-base64.html b/parsers/base64/70-base64.html index 780df599..a26952e3 100644 --- a/parsers/base64/70-base64.html +++ b/parsers/base64/70-base64.html @@ -1,11 +1,11 @@ - - diff --git a/parsers/base64/locales/en-US/70-base64.json b/parsers/base64/locales/en-US/70-base64.json new file mode 100644 index 00000000..42c0e300 --- /dev/null +++ b/parsers/base64/locales/en-US/70-base64.json @@ -0,0 +1,24 @@ +{ + "base64": { + "base64": "base64", + "label": { + "action": "Action" + }, + "convert": { + "buffer": "Convert Buffer <-> Base64", + "encode": "Encode as Base64", + "decode": "Convert Base64 to String" + }, + "log": { + "nonbase64encode": "Not a Base64 string - maybe we should encode it..." + }, + "warn": { + "cannothandle": "This node only handles strings or buffers.", + "noproperty": "No property found to process" + }, + "error": { + "invalid": "Invalid Base64 string", + "nonbase64": "Not a Base64 string" + } + } +} diff --git a/parsers/base64/locales/ja/70-base64.html b/parsers/base64/locales/ja/70-base64.html new file mode 100644 index 00000000..636ff3d0 --- /dev/null +++ b/parsers/base64/locales/ja/70-base64.html @@ -0,0 +1,7 @@ + diff --git a/parsers/base64/locales/ja/70-base64.json b/parsers/base64/locales/ja/70-base64.json new file mode 100644 index 00000000..6c27c340 --- /dev/null +++ b/parsers/base64/locales/ja/70-base64.json @@ -0,0 +1,24 @@ +{ + "base64": { + "base64": "base64", + "label": { + "action": "動作" + }, + "convert": { + "buffer": "バッファ <-> Base64の変換", + "encode": "Base64へエンコード", + "decode": "Base64から文字列へ変換" + }, + "log": { + "nonbase64encode": "Base64文字列ではありませんが、変換します。" + }, + "warn": { + "cannothandle": "このノードは文字列かバッファしか変換できません。", + "noproperty": "処理するためのプロパティが見つかりません。" + }, + "error": { + "invalid": "不正なBase64文字列です。", + "nonbase64": "Base64文字列ではありません。" + } + } +} diff --git a/test/parsers/base64/70-base64_spec.js b/test/parsers/base64/70-base64_spec.js index 26c24c9a..12322b68 100644 --- a/test/parsers/base64/70-base64_spec.js +++ b/test/parsers/base64/70-base64_spec.js @@ -250,7 +250,7 @@ describe('base64 node', function() { return evt[0].type == "base64"; }); logEvents[0][0].should.have.a.property('msg'); - logEvents[0][0].msg.toString().should.startWith("Invalid Base64 string"); + logEvents[0][0].msg.toString().should.startWith("base64.error.invalid"); done(); } catch (e) { done(e); @@ -275,7 +275,7 @@ describe('base64 node', function() { return evt[0].type == "base64"; }); logEvents[0][0].should.have.a.property('msg'); - logEvents[0][0].msg.toString().should.startWith("Not a Base64 string"); + logEvents[0][0].msg.toString().should.startWith("base64.error.nonbase64"); done(); } catch (e) { done(e); From 150e7d5cde6db29d9ab8971b56fe9e6836678335 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 28 Oct 2019 17:45:31 +0000 Subject: [PATCH 292/456] bump package to include Ja translations --- parsers/base64/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsers/base64/package.json b/parsers/base64/package.json index 0965e4e0..8fda3459 100644 --- a/parsers/base64/package.json +++ b/parsers/base64/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-base64", - "version" : "0.1.3", + "version" : "0.2.0", "description" : "A Node-RED node to pack and unpack objects to base64 format", "dependencies" : { }, From 70a6b6b0ea6aa7acfae2308995d2108d0cefe706 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 28 Oct 2019 17:50:20 +0000 Subject: [PATCH 293/456] bump overall package.json versions --- package-lock.json | 215 +++++++++++++++++++++++++++------------------- package.json | 6 +- 2 files changed, 129 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index deb86e0a..3d7f3864 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,13 +22,13 @@ } }, "@node-red/editor-api": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-1.0.1.tgz", - "integrity": "sha512-DN8HW6ZmBwfbfAlvO8qRvyuyDW70rkrxEq/Pf82i/tm4xIpyhXirCX9Ab9T6ueD1e03o6826GEhcAZZyTq+U3A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-1.0.2.tgz", + "integrity": "sha512-yUvTU5b7gDL35NIC2qC54NY0uuIAewVzcPWsc+Rbjy9YpY1DUD2Gt5Ub9gR2QPWYtVPG4zSPOBtPhZEcZvBSxQ==", "dev": true, "requires": { - "@node-red/editor-client": "1.0.1", - "@node-red/util": "1.0.1", + "@node-red/editor-client": "1.0.2", + "@node-red/util": "1.0.2", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", "body-parser": "1.19.0", @@ -56,15 +56,15 @@ } }, "@node-red/editor-client": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-1.0.1.tgz", - "integrity": "sha512-63UG5cWgSr7hyakTagKNJ3ZJfROAPgKbufjxTNAwLw/C9rQ+xosJGBsMclftGwF/Cy16KQu1a3uoPD2Mjbk8BA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-1.0.2.tgz", + "integrity": "sha512-BhgzwWjxjrQJnZC/BMIZvco4H5ksZl+qh+3hy40ReDrNpp8xSc3mDIFoB785CZrYBtFMhasE2q0kqdYuNKE/Zw==", "dev": true }, "@node-red/nodes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-1.0.1.tgz", - "integrity": "sha512-n3Ol9OzoD+kOU1gFJCyITqGWJqKX6eCN5YmGkRyWEKbxXjVvMy43Wkp0HTI3jVNrq8Sm9fHrBZsKTTZfE2M1mA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-1.0.2.tgz", + "integrity": "sha512-o5N0FZnLAEd1lF2ArLGoETosukFVI+nPTHWKUOoSd069eLuaS262BOTbbnk/oY4H2DEWQzjGZ2KKBItWlhbpXQ==", "dev": true, "requires": { "ajv": "6.10.2", @@ -200,12 +200,12 @@ } }, "@node-red/registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-1.0.1.tgz", - "integrity": "sha512-vkVhfnfRdsvUoXSifp+s8FH/OuhTBJonm/sOGzSAX9DV+IAxB3iueGVs+obPLi+qaFmTlhg9TCzeU0eJTmVAzg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-1.0.2.tgz", + "integrity": "sha512-i6TZvVriini0732IN2DVMofkG8RmiaLKpkHaP1aRceHvweDQB4yorcQsPDxqU+uiJo3lQlc1oB5j13X3mdq8DQ==", "dev": true, "requires": { - "@node-red/util": "1.0.1", + "@node-red/util": "1.0.2", "semver": "6.3.0", "uglify-js": "3.6.0", "when": "3.7.8" @@ -220,13 +220,13 @@ } }, "@node-red/runtime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-1.0.1.tgz", - "integrity": "sha512-u1iXjzakaFq1TgkWIjDJaq6dXZ9ys5jwm5HzsNvaI/qfPCIJ3eXD6RF5cMTfAB5JNpwsCJ8NLAujWKTw6dnsBA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-1.0.2.tgz", + "integrity": "sha512-YMKu5HA4WWYdf2PinysONiEFkmoz+PHD4u9ormREBXPr4iCWmZ2+XqL4QRGAc/RA8FJQ8liCr2rLDUvAuSSVOQ==", "dev": true, "requires": { - "@node-red/registry": "1.0.1", - "@node-red/util": "1.0.1", + "@node-red/registry": "1.0.2", + "@node-red/util": "1.0.2", "clone": "2.1.2", "express": "4.17.1", "fs-extra": "8.1.0", @@ -235,9 +235,9 @@ } }, "@node-red/util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@node-red/util/-/util-1.0.1.tgz", - "integrity": "sha512-Vfzns+gIPsq43+vdtZLXeGDP+THKYROGditpyO0FeUAdU6ALaNdRL1h8BQ+dNUnANyLo1OqK9HT8B9lFKwcW/w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@node-red/util/-/util-1.0.2.tgz", + "integrity": "sha512-DwaS8ZDcIFcMUQCWpMEVt38Pr6H2JBCeghZEs5v6nH+pnemUi1x6Mi+CSvwywVc4WN4uzGhVr8dWxFh1Q6/iEQ==", "dev": true, "requires": { "clone": "2.1.2", @@ -1750,9 +1750,9 @@ } }, "es-abstract": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", - "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", @@ -1763,8 +1763,8 @@ "is-regex": "^1.0.4", "object-inspect": "^1.6.0", "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.0.0", - "string.prototype.trimright": "^2.0.0" + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { @@ -2340,9 +2340,9 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true } } @@ -2418,9 +2418,9 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true } } @@ -2587,9 +2587,9 @@ }, "dependencies": { "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3190,9 +3190,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "readable-stream": { @@ -3206,13 +3206,19 @@ "util-deprecate": "^1.0.1" } }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } @@ -3843,26 +3849,26 @@ "dev": true }, "libbase64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.0.3.tgz", - "integrity": "sha512-ULQZAATVGTAgVNwP61R+MbbSGNBy1tVzWupB9kbE6p+VccWd+J+ICXgOwQic5Yqagzpu+oPZ8sI7yXdWJnPPkA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==", "dev": true }, "libmime": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.1.tgz", - "integrity": "sha512-HkOfBSj+l7pBOOucEgiI6PdbgHa8ljv+1rARzW743HQ51UP8gabMlcA2wAF3Dg1aeuMjHZ+LzAPYxM52IZsyGA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.4.tgz", + "integrity": "sha512-t/K89GTNSToxAjzM4LjchkahTJUXvpmxPTnyNZJdNeEv+JNzx5FYmakJvAfBfrF3u2Fz2OnMc/WROMO0MhZanA==", "dev": true, "requires": { - "iconv-lite": "0.4.24", - "libbase64": "1.0.3", + "iconv-lite": "0.5.0", + "libbase64": "1.2.1", "libqp": "1.1.0" }, "dependencies": { "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -4123,35 +4129,38 @@ } }, "mailparser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.7.1.tgz", - "integrity": "sha512-qAyDPuyd0ygTM3V9yzxVilYyRt0mpjLmp6OSzBPjwMZYX1PVDOoGEyUgDtyCDoEgC5fqslpXpWCI6t7RN3i3fw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.7.3.tgz", + "integrity": "sha512-HaWtD4vfbxorRucJCcM4SGqYZoO5QDNrGV18wHHl8tviIvXxBhksDYYFml4zFAS/tECWbx8gMolmv/K01oi1NA==", "dev": true, "requires": { "he": "1.2.0", "html-to-text": "5.1.1", - "iconv-lite": "0.4.24", - "libmime": "4.1.1", - "linkify-it": "2.1.0", + "iconv-lite": "0.5.0", + "libmime": "4.1.4", + "linkify-it": "2.2.0", "mailsplit": "4.4.1", - "nodemailer": "6.1.1", + "nodemailer": "6.3.1", "tlds": "1.203.1" }, "dependencies": { "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, - "nodemailer": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.1.1.tgz", - "integrity": "sha512-/x5MRIh56VyuuhLfcz+DL2SlBARpZpgQIf2A4Ao4hMb69MHSgDIMPwYmFwesGT1lkRDZ0eBSoym5+JoIZ3N+cQ==", - "dev": true + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } } } }, @@ -4164,6 +4173,34 @@ "libbase64": "1.0.3", "libmime": "4.1.1", "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "libbase64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.0.3.tgz", + "integrity": "sha512-ULQZAATVGTAgVNwP61R+MbbSGNBy1tVzWupB9kbE6p+VccWd+J+ICXgOwQic5Yqagzpu+oPZ8sI7yXdWJnPPkA==", + "dev": true + }, + "libmime": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.1.tgz", + "integrity": "sha512-HkOfBSj+l7pBOOucEgiI6PdbgHa8ljv+1rARzW743HQ51UP8gabMlcA2wAF3Dg1aeuMjHZ+LzAPYxM52IZsyGA==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24", + "libbase64": "1.0.3", + "libqp": "1.1.0" + } + } } }, "make-iterator": { @@ -4406,9 +4443,9 @@ } }, "mocha": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz", - "integrity": "sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", + "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -4560,9 +4597,9 @@ "dev": true }, "moment-timezone": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", - "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", "dev": true, "requires": { "moment": ">= 2.9.0" @@ -4878,9 +4915,9 @@ }, "dependencies": { "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dev": true, "optional": true, "requires": { @@ -4916,15 +4953,15 @@ } }, "node-red": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-red/-/node-red-1.0.1.tgz", - "integrity": "sha512-7VJi2FlIWcnR1HhX4LL4UERYbb4fzUSyE0nFnDRibbmqfBsujdPJR1PTTW9nMIlvF7EIQ8tBEOEZ4L/NdiyS8A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-red/-/node-red-1.0.2.tgz", + "integrity": "sha512-QSyPpAGGVFgVlKyumWFd8j2hd420+sh8DSxlvAtatDVaIG3+MaAD3eDLg49HIwRyAhiROVS1XNWkqyq/H1/cBA==", "dev": true, "requires": { - "@node-red/editor-api": "1.0.1", - "@node-red/nodes": "1.0.1", - "@node-red/runtime": "1.0.1", - "@node-red/util": "1.0.1", + "@node-red/editor-api": "1.0.2", + "@node-red/nodes": "1.0.2", + "@node-red/runtime": "1.0.2", + "@node-red/util": "1.0.2", "basic-auth": "2.0.1", "bcrypt": "3.0.6", "bcryptjs": "2.4.3", @@ -7149,9 +7186,9 @@ }, "dependencies": { "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "source-map": { diff --git a/package.json b/package.json index 770b3375..63cd52ed 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,13 @@ "grunt-lint-inline": "^1.0.0", "grunt-simple-mocha": "^0.4.1", "imap": "^0.8.19", - "mailparser": "^2.7.1", + "mailparser": "^2.7.3", "markdown-it": "^10.0.0", - "mocha": "~6.2.1", + "mocha": "~6.2.2", "msgpack-lite": "^0.1.26", "multilang-sentiment": "^1.2.0", "ngeohash": "^0.6.3", - "node-red": "~1.0.1", + "node-red": "~1.0.2", "node-red-node-test-helper": "~0.2.3", "nodemailer": "^6.3.1", "poplib": "^0.1.7", From 17853b772ee627fd05305db8b4c1de282656f7da Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 29 Oct 2019 14:55:39 +0000 Subject: [PATCH 294/456] Delete package-lock.json --- package-lock.json | 7913 --------------------------------------------- 1 file changed, 7913 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3d7f3864..00000000 --- a/package-lock.json +++ /dev/null @@ -1,7913 +0,0 @@ -{ - "name": "node-red-nodes", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "@node-red/editor-api": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-1.0.2.tgz", - "integrity": "sha512-yUvTU5b7gDL35NIC2qC54NY0uuIAewVzcPWsc+Rbjy9YpY1DUD2Gt5Ub9gR2QPWYtVPG4zSPOBtPhZEcZvBSxQ==", - "dev": true, - "requires": { - "@node-red/editor-client": "1.0.2", - "@node-red/util": "1.0.2", - "bcrypt": "3.0.6", - "bcryptjs": "2.4.3", - "body-parser": "1.19.0", - "clone": "2.1.2", - "cors": "2.8.5", - "express": "4.17.1", - "express-session": "1.16.2", - "memorystore": "1.6.1", - "mime": "2.4.4", - "mustache": "3.0.2", - "oauth2orize": "1.11.0", - "passport": "0.4.0", - "passport-http-bearer": "1.0.1", - "passport-oauth2-client-password": "0.1.2", - "when": "3.7.8", - "ws": "6.2.1" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "@node-red/editor-client": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-1.0.2.tgz", - "integrity": "sha512-BhgzwWjxjrQJnZC/BMIZvco4H5ksZl+qh+3hy40ReDrNpp8xSc3mDIFoB785CZrYBtFMhasE2q0kqdYuNKE/Zw==", - "dev": true - }, - "@node-red/nodes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-1.0.2.tgz", - "integrity": "sha512-o5N0FZnLAEd1lF2ArLGoETosukFVI+nPTHWKUOoSd069eLuaS262BOTbbnk/oY4H2DEWQzjGZ2KKBItWlhbpXQ==", - "dev": true, - "requires": { - "ajv": "6.10.2", - "body-parser": "1.19.0", - "cheerio": "0.22.0", - "content-type": "1.0.4", - "cookie": "0.4.0", - "cookie-parser": "1.4.4", - "cors": "2.8.5", - "cron": "1.7.1", - "denque": "1.4.1", - "fs-extra": "8.1.0", - "fs.notify": "0.0.4", - "hash-sum": "2.0.0", - "https-proxy-agent": "2.2.2", - "iconv-lite": "0.5.0", - "is-utf8": "0.2.1", - "js-yaml": "3.13.1", - "media-typer": "1.1.0", - "mqtt": "2.18.8", - "multer": "1.4.2", - "mustache": "3.0.2", - "on-headers": "1.0.2", - "raw-body": "2.4.1", - "request": "2.88.0", - "ws": "6.2.1", - "xml2js": "0.4.19" - }, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - } - } - }, - "@node-red/registry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-1.0.2.tgz", - "integrity": "sha512-i6TZvVriini0732IN2DVMofkG8RmiaLKpkHaP1aRceHvweDQB4yorcQsPDxqU+uiJo3lQlc1oB5j13X3mdq8DQ==", - "dev": true, - "requires": { - "@node-red/util": "1.0.2", - "semver": "6.3.0", - "uglify-js": "3.6.0", - "when": "3.7.8" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@node-red/runtime": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-1.0.2.tgz", - "integrity": "sha512-YMKu5HA4WWYdf2PinysONiEFkmoz+PHD4u9ormREBXPr4iCWmZ2+XqL4QRGAc/RA8FJQ8liCr2rLDUvAuSSVOQ==", - "dev": true, - "requires": { - "@node-red/registry": "1.0.2", - "@node-red/util": "1.0.2", - "clone": "2.1.2", - "express": "4.17.1", - "fs-extra": "8.1.0", - "json-stringify-safe": "5.0.1", - "when": "3.7.8" - } - }, - "@node-red/util": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@node-red/util/-/util-1.0.2.tgz", - "integrity": "sha512-DwaS8ZDcIFcMUQCWpMEVt38Pr6H2JBCeghZEs5v6nH+pnemUi1x6Mi+CSvwywVc4WN4uzGhVr8dWxFh1Q6/iEQ==", - "dev": true, - "requires": { - "clone": "2.1.2", - "i18next": "15.1.2", - "json-stringify-safe": "5.0.1", - "jsonata": "1.6.5", - "when": "3.7.8" - } - }, - "@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "@sinonjs/samsam": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", - "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "JSV": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-indexofobject": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-indexofobject/-/array-indexofobject-0.0.1.tgz", - "integrity": "sha1-qqEo5iybPDWAlFaMIZ/2T+SJ1Co=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "bcrypt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.6.tgz", - "integrity": "sha512-taA5bCTfXe7FUjKroKky9EXpdhkVvhE5owfxfLYodbrAR1Ul3juLmIQmIQBK4L9a5BuUcE6cqmwT+Da20lF9tg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.13.2", - "node-pre-gyp": "0.12.0" - } - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", - "dev": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "dev": true, - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callback-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", - "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "> 1.0.0 < 3.0.0" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "comment-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.2.tgz", - "integrity": "sha1-PAPwd2uGo239mgosl8YwfzMggv4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "commist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", - "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", - "dev": true, - "requires": { - "leven": "^2.1.0", - "minimist": "^1.1.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-parser": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", - "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", - "dev": true, - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cron": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.1.tgz", - "integrity": "sha512-gmMB/pJcqUVs/NklR1sCGlNYM7TizEw+1gebz20BMc/8bTm/r7QUp3ZPSPlG8Z5XRlvb7qhjEjq/+bdIfUCL2A==", - "dev": true, - "requires": { - "moment-timezone": "^0.5.x" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cst": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/cst/-/cst-0.4.10.tgz", - "integrity": "sha512-U5ETe1IOjq2h56ZcBE3oe9rT7XryCH6IKgPMv0L7sSk6w29yR3p5egCK0T3BDNHHV95OoUBgXsqiVG+3a900Ag==", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "babylon": "^6.8.1", - "source-map-support": "^0.4.0" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", - "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.51", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", - "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", - "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", - "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.51" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-lite": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.1.tgz", - "integrity": "sha1-R88IqNN9C2lM23s7F7UfqsZXYIY=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exif": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/exif/-/exif-0.6.0.tgz", - "integrity": "sha1-YKYmaAdlQst+T1cZnUrG830sX0o=", - "dev": true, - "requires": { - "debug": "^2.2" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - } - } - }, - "express-session": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.2.tgz", - "integrity": "sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw==", - "dev": true, - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.1.2", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "feedparser": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/feedparser/-/feedparser-2.2.9.tgz", - "integrity": "sha1-kTgZfa/a4F/K3eADa+6vYGbCxek=", - "dev": true, - "requires": { - "addressparser": "^1.0.1", - "array-indexofobject": "~0.0.1", - "lodash.assign": "^4.2.0", - "lodash.get": "^4.4.2", - "lodash.has": "^4.5.2", - "lodash.uniq": "^4.5.0", - "mri": "^1.1.0", - "readable-stream": "^2.2.2", - "sax": "^1.2.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "requires": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - } - }, - "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.notify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fs.notify/-/fs.notify-0.0.4.tgz", - "integrity": "sha1-YyhNRaNLUs5gCIpt2+xbd208AT0=", - "dev": true, - "requires": { - "async": "~0.1.22", - "retry": "~0.6.0" - }, - "dependencies": { - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "fuse.js": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.4.tgz", - "integrity": "sha512-pyLQo/1oR5Ywf+a/tY8z4JygnIglmRxVUOiyFAbd11o9keUDpUJSMGRWJngcnkURj30kDHPmhoKY8ChJiz3EpQ==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", - "dev": true, - "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - } - } - }, - "grunt-cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", - "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", - "dev": true, - "requires": { - "grunt-known-options": "~1.1.0", - "interpret": "~1.1.0", - "liftoff": "~2.5.0", - "nopt": "~4.0.1", - "v8flags": "~3.1.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "grunt-contrib-jshint": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz", - "integrity": "sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "hooker": "^0.2.3", - "jshint": "~2.10.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "grunt-jscs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-3.0.1.tgz", - "integrity": "sha1-H65Q4+lV3546nZQlrsIqzK4AgJI=", - "dev": true, - "requires": { - "hooker": "~0.2.3", - "jscs": "~3.0.5", - "lodash": "~4.6.1", - "vow": "~0.4.1" - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true - }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", - "dev": true, - "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "grunt-lint-inline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-lint-inline/-/grunt-lint-inline-1.0.0.tgz", - "integrity": "sha1-8ZXnEuNJSij2lqSE0SFrZ2sQ4bA=", - "dev": true, - "requires": { - "grunt-contrib-jshint": "~1.0.0", - "temporary": "0.0.8" - }, - "dependencies": { - "grunt-contrib-jshint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.0.0.tgz", - "integrity": "sha1-MPQFpR3mVr+m6wKbmkZLn+AqQCo=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "hooker": "^0.2.3", - "jshint": "~2.9.1" - } - } - } - }, - "grunt-simple-mocha": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", - "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", - "dev": true, - "requires": { - "mocha": "*" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "help-me": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", - "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", - "dev": true, - "requires": { - "callback-stream": "^1.0.2", - "glob-stream": "^6.1.0", - "through2": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "html-to-text": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", - "dev": true, - "requires": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "i": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=", - "dev": true - }, - "i18next": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-15.1.2.tgz", - "integrity": "sha512-98ELn/dqep00DQ/v1E1gpM21HNN6nqU3mS85mYKd9P7lXrhfUcuysPaa3HviKSFb3WPdjf7avuAST3P0dhNp/A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.1" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "imap": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/imap/-/imap-0.8.19.tgz", - "integrity": "sha1-NniHOTSrCc6mukh0HyhNoq9Z2NU=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "utf7": ">=1.0.2" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherit": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.6.tgz", - "integrity": "sha1-8WFLBshUToEo5CKchjR9tzrZeI0=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "int64-buffer": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.9.tgz", - "integrity": "sha1-ngOdoEOyT3ixlrKD4EZT716ZD2E=", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-yaml": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", - "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=", - "dev": true, - "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0", - "inherit": "^2.2.2" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jscs": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-3.0.7.tgz", - "integrity": "sha1-cUG03/W4bjLQ6Z12S4NnZ8MNIBo=", - "dev": true, - "requires": { - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.9.0", - "cst": "^0.4.3", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", - "htmlparser2": "3.8.3", - "js-yaml": "~3.4.0", - "jscs-jsdoc": "^2.0.0", - "jscs-preset-wikimedia": "~1.0.0", - "jsonlint": "~1.6.2", - "lodash": "~3.10.0", - "minimatch": "~3.0.0", - "natural-compare": "~1.2.2", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "resolve": "^1.1.6", - "strip-bom": "^2.0.0", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^2.0.0", - "to-single-quotes": "^2.0.0", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^3.1.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "jscs-jsdoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-2.0.0.tgz", - "integrity": "sha1-9T684CmqMSW9iCkLpQ1k1FEKSHE=", - "dev": true, - "requires": { - "comment-parser": "^0.3.1", - "jsdoctypeparser": "~1.2.0" - } - }, - "jscs-preset-wikimedia": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz", - "integrity": "sha1-//VjNCA4/C6IJre7cwnDrjQG/H4=", - "dev": true - }, - "jsdoctypeparser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", - "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=", - "dev": true, - "requires": { - "lodash": "^3.7.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "jshint": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", - "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "3.7.x", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonata": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.6.5.tgz", - "integrity": "sha512-iRx9U6AkvsjrRdFf9MMbQmGVAL3bXVANR12vbVxjgXouMPU9VJQEcFnLWUCaW8IDmOzdxsaxK4Xe7SGlBYr5Bg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonlint": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", - "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=", - "dev": true, - "requires": { - "JSV": ">= 4.0.x", - "nomnom": ">= 1.5.x" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "libbase64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", - "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==", - "dev": true - }, - "libmime": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.4.tgz", - "integrity": "sha512-t/K89GTNSToxAjzM4LjchkahTJUXvpmxPTnyNZJdNeEv+JNzx5FYmakJvAfBfrF3u2Fz2OnMc/WROMO0MhZanA==", - "dev": true, - "requires": { - "iconv-lite": "0.5.0", - "libbase64": "1.2.1", - "libqp": "1.1.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz", - "integrity": "sha1-3wDBFkrSNrGDz8OIel6NOMxjy7w=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", - "dev": true - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", - "dev": true - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", - "dev": true - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - }, - "dependencies": { - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "mailparser": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.7.3.tgz", - "integrity": "sha512-HaWtD4vfbxorRucJCcM4SGqYZoO5QDNrGV18wHHl8tviIvXxBhksDYYFml4zFAS/tECWbx8gMolmv/K01oi1NA==", - "dev": true, - "requires": { - "he": "1.2.0", - "html-to-text": "5.1.1", - "iconv-lite": "0.5.0", - "libmime": "4.1.4", - "linkify-it": "2.2.0", - "mailsplit": "4.4.1", - "nodemailer": "6.3.1", - "tlds": "1.203.1" - }, - "dependencies": { - "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - } - } - }, - "mailsplit": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-4.4.1.tgz", - "integrity": "sha512-AmWLEHQAg/zbNb1MdrPQS9VOzysHaU9IuoQV9kGU5fgjM5RCbgqVkZzp0+DhPep8sj8iHfbWkl16Nb1PbNlTYg==", - "dev": true, - "requires": { - "libbase64": "1.0.3", - "libmime": "4.1.1", - "libqp": "1.1.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "libbase64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.0.3.tgz", - "integrity": "sha512-ULQZAATVGTAgVNwP61R+MbbSGNBy1tVzWupB9kbE6p+VccWd+J+ICXgOwQic5Yqagzpu+oPZ8sI7yXdWJnPPkA==", - "dev": true - }, - "libmime": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.1.tgz", - "integrity": "sha512-HkOfBSj+l7pBOOucEgiI6PdbgHa8ljv+1rARzW743HQ51UP8gabMlcA2wAF3Dg1aeuMjHZ+LzAPYxM52IZsyGA==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24", - "libbase64": "1.0.3", - "libqp": "1.1.0" - } - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", - "dev": true - } - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memorystore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.1.tgz", - "integrity": "sha512-rYRjVukgBR9sptGI3IfpAjZc4SkupddhAenUhPTGprnqM8Qh863PxfXxXWlfvHpMIAkJCok28Bm7ZlOKB4U+MA==", - "dev": true, - "requires": { - "debug": "3.1.0", - "lru-cache": "^4.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true, - "optional": true - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "mocha": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", - "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "dev": true - }, - "moment-timezone": { - "version": "0.5.27", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", - "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", - "dev": true, - "requires": { - "moment": ">= 2.9.0" - } - }, - "mqtt": { - "version": "2.18.8", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.18.8.tgz", - "integrity": "sha512-3h6oHlPY/yWwtC2J3geraYRtVVoRM6wdI+uchF4nvSSafXPZnaKqF8xnX+S22SU/FcgEAgockVIlOaAX3fkMpA==", - "dev": true, - "requires": { - "commist": "^1.0.0", - "concat-stream": "^1.6.2", - "end-of-stream": "^1.4.1", - "es6-map": "^0.1.5", - "help-me": "^1.0.1", - "inherits": "^2.0.3", - "minimist": "^1.2.0", - "mqtt-packet": "^5.6.0", - "pump": "^3.0.0", - "readable-stream": "^2.3.6", - "reinterval": "^1.1.0", - "split2": "^2.1.1", - "websocket-stream": "^5.1.2", - "xtend": "^4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "mqtt-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.6.1.tgz", - "integrity": "sha512-eaF9rO2uFrIYEHomJxziuKTDkbWW5psLBaIGCazQSKqYsTaB3n4SpvJ1PexKaDBiPnMLPIFWBIiTYT3IfEJfww==", - "dev": true, - "requires": { - "bl": "^1.2.1", - "inherits": "^2.0.3", - "process-nextick-args": "^2.0.0", - "safe-buffer": "^5.1.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - } - } - }, - "mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "msgpack-lite": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", - "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=", - "dev": true, - "requires": { - "event-lite": "^0.1.1", - "ieee754": "^1.1.8", - "int64-buffer": "^0.1.9", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "multer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", - "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", - "dev": true, - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "multilang-sentiment": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/multilang-sentiment/-/multilang-sentiment-1.2.0.tgz", - "integrity": "sha512-OOVVfqQJ0EfLPGi0kIy3R7kLXH4awe8C7/ML6z4ggK0Ju4PoirWE69eSTMQ7PzQbsL381Z0bq/Xeg73919FpRA==", - "dev": true, - "requires": { - "fuse.js": "^3.4.4" - } - }, - "mustache": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.2.tgz", - "integrity": "sha512-64neoEgmozb8e/ecGBOSE+RfnevLSFzCI0UKPcrWmjv953/8fXhYO9+EQFtfbi6hwoFxcTA+Fp5mRiOiI9eTuA==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", - "integrity": "sha1-H5bWDjFBysG20FZTzg2urHY69qo=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "ngeohash": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", - "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==", - "dev": true - }, - "nise": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", - "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-forge": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", - "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==", - "dev": true - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "node-red": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-red/-/node-red-1.0.2.tgz", - "integrity": "sha512-QSyPpAGGVFgVlKyumWFd8j2hd420+sh8DSxlvAtatDVaIG3+MaAD3eDLg49HIwRyAhiROVS1XNWkqyq/H1/cBA==", - "dev": true, - "requires": { - "@node-red/editor-api": "1.0.2", - "@node-red/nodes": "1.0.2", - "@node-red/runtime": "1.0.2", - "@node-red/util": "1.0.2", - "basic-auth": "2.0.1", - "bcrypt": "3.0.6", - "bcryptjs": "2.4.3", - "express": "4.17.1", - "fs-extra": "8.1.0", - "node-red-node-rbe": "^0.2.5", - "node-red-node-tail": "^0.0.3", - "nopt": "4.0.1", - "semver": "6.3.0" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "node-red-node-rbe": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/node-red-node-rbe/-/node-red-node-rbe-0.2.5.tgz", - "integrity": "sha512-WPwIOZIdDprgfqOe8bEun47wkFFc+5Uw/1w3O/kZn/kS2IpI1q+wijUDK+Hw8q4d8KgA58B30wh+10UvXzsPDA==", - "dev": true - }, - "node-red-node-tail": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/node-red-node-tail/-/node-red-node-tail-0.0.3.tgz", - "integrity": "sha512-wEiT7bSeU9oVHPK7S+mHb3cR6cIf9l205wTiHzhnUAuoDJS+IdwQkkpFgKTYmkL4Py2LvqCU90h85YpQul7QFQ==", - "dev": true, - "requires": { - "tail": "^2.0.2" - } - }, - "node-red-node-test-helper": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/node-red-node-test-helper/-/node-red-node-test-helper-0.2.3.tgz", - "integrity": "sha512-N9/Fcrmbco3TSJNyLriM3L7tRd14nSjMQAseo2sgMaJi1rS+2+wXc8ka2RFYYH8EqI2MEeYbS2GPa+kfXEdrUg==", - "dev": true, - "requires": { - "express": "4.17.1", - "read-pkg-up": "3.0.0", - "semver": "6.2.0", - "should": "^13.2.3", - "should-sinon": "0.0.6", - "sinon": "5.0.3", - "stoppable": "1.1.0", - "supertest": "3.0.0" - }, - "dependencies": { - "@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - }, - "sinon": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.3.tgz", - "integrity": "sha512-kzBkET1Hf0r0J4uVnlicuAEiq9nnhPrEHZWS0mds+5EaB9rA0XoliIkLaqkBNU9lwPuJACo/velUQQOmTRJtUw==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supertest": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", - "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", - "dev": true, - "requires": { - "methods": "~1.1.2", - "superagent": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "nodemailer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.1.tgz", - "integrity": "sha512-j0BsSyaMlyadEDEypK/F+xlne2K5m6wzPYMXS/yxKI0s7jmT1kBx6GEKRVbZmyYfKOsjkeC/TiMVDJBI/w5gMQ==", - "dev": true - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", - "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "oauth2orize": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.11.0.tgz", - "integrity": "sha1-eTzvJR1F696sMq5AqLaBT6qx1IM=", - "dev": true, - "requires": { - "debug": "2.x.x", - "uid2": "0.0.x", - "utils-merge": "1.x.x" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz", - "integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "passport": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", - "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", - "dev": true, - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - } - }, - "passport-http-bearer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/passport-http-bearer/-/passport-http-bearer-1.0.1.tgz", - "integrity": "sha1-FHRp6jZp4qhMYWfvmdu3fh8AmKg=", - "dev": true, - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-oauth2-client-password": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/passport-oauth2-client-password/-/passport-oauth2-client-password-0.1.2.tgz", - "integrity": "sha1-TzeLZ4uS0W270jOmxwZSAJPlYbo=", - "dev": true, - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", - "dev": true - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", - "dev": true - }, - "poplib": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/poplib/-/poplib-0.1.7.tgz", - "integrity": "sha1-L0tYtVkpcjUM2X9IKrpo+OBVdLw=", - "dev": true, - "requires": { - "optimist": "*" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", - "dev": true, - "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, - "requires": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - }, - "dependencies": { - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "pushbullet": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/pushbullet/-/pushbullet-2.4.0.tgz", - "integrity": "sha512-9CkgzAmBOv/ekxI4oqlFXdFIdKEMQgv1NBUbQYYxo/OsGYdnM2D9xEtWLQLkMAkpZUwbNr9lHq7a27082+eQMw==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "mime": "^2.4.0", - "node-forge": "^0.7.6", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "ws": "^6.1.2" - }, - "dependencies": { - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", - "dev": true - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "reinterval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", - "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - } - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", - "integrity": "sha1-/ckO7ZQ/3hG4k1VLjMY9DombqRg=", - "dev": true - }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "sentiment": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sentiment/-/sentiment-2.1.0.tgz", - "integrity": "sha1-MyeRAMNcOFGcpeQ1JFGGxRL+D9w=", - "dev": true - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - }, - "dependencies": { - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - } - } - }, - "should-sinon": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/should-sinon/-/should-sinon-0.0.6.tgz", - "integrity": "sha512-ScBOH5uW5QVFaONmUnIXANSR6z5B8IKzEmBP3HE5sPOCDuZ88oTMdUdnKoCVQdLcCIrRrhRLPS5YT+7H40a04g==", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - }, - "dependencies": { - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - } - } - }, - "should-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" - }, - "dependencies": { - "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, - "nise": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz", - "integrity": "sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^4.1.0", - "path-to-regexp": "^1.7.0" - } - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dev": true, - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^3.8.3" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tail": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tail/-/tail-2.0.3.tgz", - "integrity": "sha512-s9NOGkLqqiDEtBttQZI7acLS8ycYK5sTlDwNjGnpXG9c8AWj0cfAtwEIzo/hVRMMiC5EYz+bXaJWC1u1u0GPpQ==", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true, - "optional": true - } - } - }, - "temporary": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz", - "integrity": "sha1-oYqYHSi6jKNgJ/s8MFOMPst0CsA=", - "dev": true, - "requires": { - "package": ">= 1.0.0 < 1.2.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "tlds": { - "version": "1.203.1", - "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.203.1.tgz", - "integrity": "sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw==", - "dev": true - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-double-quotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", - "integrity": "sha1-qvIx1vqUiUn4GTAburRITYWI5Kc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-single-quotes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz", - "integrity": "sha1-fMKRUfD18sQZRvEZ9ZMv5VQXASU=", - "dev": true - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dev": true, - "requires": { - "random-bytes": "~1.0.0" - } - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utf7": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", - "integrity": "sha1-lV9JCq5lO6IguUVqCod2wZk2CZE=", - "dev": true, - "requires": { - "semver": "~5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "dev": true, - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vow": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.17.tgz", - "integrity": "sha512-A3/9bWFqf6gT0jLR4/+bT+IPTe1mQf+tdsW6+WI5geP9smAp8Kbbu4R6QQCDKZN/8TSCqTlXVQm12QliB4rHfg==", - "dev": true - }, - "vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", - "dev": true, - "requires": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", - "dev": true, - "requires": { - "vow": "^0.4.17" - } - }, - "websocket-stream": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.0.tgz", - "integrity": "sha512-EXy/zXb9kNHI07TIMz1oIUIrPZxQRA8aeJ5XYg5ihV8K4kD1DuA+FY6R96HfdIHzlSzS8HiISAfrm+vVQkZBug==", - "dev": true, - "requires": { - "duplexify": "^3.5.1", - "inherits": "^2.0.1", - "readable-stream": "^2.3.3", - "safe-buffer": "^5.1.2", - "ws": "^3.2.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - } - } - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", - "dev": true, - "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true - } - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", - "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", - "dev": true, - "requires": { - "lodash": "^3.5.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } - } - } - } -} From a146c8e28c5707a518a8488938456eba7b3ed0d4 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 6 Nov 2019 09:30:46 +0000 Subject: [PATCH 295/456] snmp set Add check if varbinds field may be empty --- io/snmp/package.json | 2 +- io/snmp/snmp.html | 4 ++-- io/snmp/snmp.js | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/io/snmp/package.json b/io/snmp/package.json index f80f09ce..b12577a3 100644 --- a/io/snmp/package.json +++ b/io/snmp/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-snmp", - "version" : "0.0.22", + "version" : "0.0.23", "description" : "A Node-RED node that looks for SNMP oids.", "dependencies" : { "net-snmp" : "1.2.4" diff --git a/io/snmp/snmp.html b/io/snmp/snmp.html index c08e9792..7b3b53df 100644 --- a/io/snmp/snmp.html +++ b/io/snmp/snmp.html @@ -1,4 +1,4 @@ - - - - - From 3ed1e72481734c5953ae6f553a30ef5053a8fce7 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Nov 2019 13:31:41 +0000 Subject: [PATCH 299/456] Bump serialport node to latest serialport lib --- io/serialport/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/serialport/package.json b/io/serialport/package.json index 08b32df3..0d21c890 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-serialport", - "version" : "0.8.8", + "version" : "0.9.0", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { - "serialport" : "^7.1.5" + "serialport" : "^8.0.5" }, "repository" : { "type":"git", From 0bef6680280e4489bb9608f89f844e8b31ec13f9 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Nov 2019 18:43:43 +0000 Subject: [PATCH 300/456] fix button class and serial.list promise --- io/serialport/25-serial.html | 7 ++----- io/serialport/25-serial.js | 12 +++++++++--- io/serialport/package.json | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/io/serialport/25-serial.html b/io/serialport/25-serial.html index f0e461ff..1ecc910c 100644 --- a/io/serialport/25-serial.html +++ b/io/serialport/25-serial.html @@ -147,7 +147,7 @@
    - +
    @@ -354,10 +354,7 @@ $("#node-config-lookup-serial").addClass('disabled'); $.getJSON('serialports',function(data) { $("#node-config-lookup-serial").removeClass('disabled'); - var ports = []; - $.each(data, function(i, port) { - ports.push(port.comName); - }); + var ports = data || []; $("#node-config-input-serialport").autocomplete({ source:ports, minLength:0, diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 7218e8b7..6fdd34a8 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -444,8 +444,14 @@ module.exports = function(RED) { }()); RED.httpAdmin.get("/serialports", RED.auth.needsPermission('serial.read'), function(req,res) { - serialp.list(function (err, ports) { - res.json(ports); - }); + serialp.list().then( + ports => { + const a = ports.map(p => p.path); + res.json(a); + }, + err => { + node.log('Error listing serial ports', err) + } + ) }); } diff --git a/io/serialport/package.json b/io/serialport/package.json index 0d21c890..c365d785 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-serialport", - "version" : "0.9.0", + "version" : "0.9.1", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { "serialport" : "^8.0.5" From 61c0826261cf52ea82136aa95b22d29d99bd3098 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Nov 2019 21:52:01 +0000 Subject: [PATCH 301/456] update arduino node for node12 --- hardware/Arduino/35-arduino.html | 17 +++++++---------- hardware/Arduino/35-arduino.js | 12 +++++++++--- hardware/Arduino/package.json | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/hardware/Arduino/35-arduino.html b/hardware/Arduino/35-arduino.html index 90df533b..b492fa28 100644 --- a/hardware/Arduino/35-arduino.html +++ b/hardware/Arduino/35-arduino.html @@ -1,5 +1,5 @@ - - - - - @@ -152,10 +152,7 @@ $("#node-config-lookup-serial-icon").addClass('fa-search'); $("#node-config-lookup-serial-icon").removeClass('spinner'); $("#node-config-lookup-serial").removeClass('disabled'); - var ports = []; - $.each(data, function(i, port) { - ports.push(port.comName); - }); + var ports = data || []; $("#node-config-input-device").autocomplete({ source:ports, minLength:0, diff --git a/hardware/Arduino/35-arduino.js b/hardware/Arduino/35-arduino.js index fc3ffe1f..5e6302bd 100644 --- a/hardware/Arduino/35-arduino.js +++ b/hardware/Arduino/35-arduino.js @@ -204,8 +204,14 @@ module.exports = function(RED) { RED.nodes.registerType("arduino out",DuinoNodeOut); RED.httpAdmin.get("/arduinoports", RED.auth.needsPermission("arduino.read"), function(req,res) { - SP.list(function(error, ports) { - res.json(ports); - }); + SP.list().then( + ports => { + const a = ports.map(p => p.comName); + res.json(a); + }, + err => { + this.log('Error listing serial ports', err) + } + ) }); } diff --git a/hardware/Arduino/package.json b/hardware/Arduino/package.json index 0e325ac9..45ab3bb0 100644 --- a/hardware/Arduino/package.json +++ b/hardware/Arduino/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-arduino", - "version" : "0.2.4", + "version" : "0.3.0", "description" : "A Node-RED node to talk to an Arduino running firmata", "dependencies" : { "firmata" : "^2.0.0" From e814c676d233e87b85451f7c70ec8b0542947162 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 13 Nov 2019 21:53:58 +0000 Subject: [PATCH 302/456] bump pushover lib to pick up fix to close #590 --- social/pushover/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/social/pushover/package.json b/social/pushover/package.json index 8387c96a..b7cb0b96 100644 --- a/social/pushover/package.json +++ b/social/pushover/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-pushover", - "version" : "0.0.16", + "version" : "0.0.17", "description" : "A Node-RED node to send alerts via Pushover", "dependencies" : { - "pushover-notifications" : "^1.2.0" + "pushover-notifications" : "^1.2.1" }, "repository" : { "type":"git", From dfddf0645af1bc7935255f8d6d82114a2654878b Mon Sep 17 00:00:00 2001 From: SillaRizzoli Date: Mon, 25 Nov 2019 15:17:36 +0100 Subject: [PATCH 303/456] Added UDP port option to node-red-node-wol (#606) * Added udp port option * Added UDP port validation and msg.udpport support --- io/wol/39-wol.html | 9 ++++++++- io/wol/39-wol.js | 8 +++++++- io/wol/package.json | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/io/wol/39-wol.html b/io/wol/39-wol.html index b53283b9..96b6235f 100644 --- a/io/wol/39-wol.html +++ b/io/wol/39-wol.html @@ -8,19 +8,25 @@ +
    + + +
    -
    Tip: leave blank if you want to use msg.mac or msg.host to dynamically set target mac address.
    +
    Tip: leave blank if you want to use msg.mac, msg.host or msg.udpport to dynamically set target information.
    - - - - - - - - - - diff --git a/function/rbe/locales/en-US/rbe.html b/function/rbe/locales/en-US/rbe.html new file mode 100644 index 00000000..ce85d5a5 --- /dev/null +++ b/function/rbe/locales/en-US/rbe.html @@ -0,0 +1,37 @@ + diff --git a/function/rbe/rbe.html b/function/rbe/rbe.html index 48f0c103..a1505fe1 100644 --- a/function/rbe/rbe.html +++ b/function/rbe/rbe.html @@ -33,44 +33,6 @@ - - - - - - + + + diff --git a/social/feedparser/32-feedparse.html b/social/feedparser/32-feedparse.html index 0b815d5b..0e62d3ac 100644 --- a/social/feedparser/32-feedparse.html +++ b/social/feedparser/32-feedparse.html @@ -1,4 +1,3 @@ - - - diff --git a/social/twitter/27-twitter.html b/social/twitter/27-twitter.html index 3f14c7de..3d72a66c 100644 --- a/social/twitter/27-twitter.html +++ b/social/twitter/27-twitter.html @@ -1,4 +1,3 @@ - - - - - - - - - + + + + diff --git a/storage/tail/28-tail.html b/storage/tail/28-tail.html index b0542d03..4f7c2063 100644 --- a/storage/tail/28-tail.html +++ b/storage/tail/28-tail.html @@ -1,4 +1,3 @@ - - - From 3d60aa4c0029ee58421d3ccdff7b36b5e9e8bc36 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 5 Dec 2019 21:36:59 +0000 Subject: [PATCH 310/456] bump sentiment, rbe, email, feedparser, twitter, tail nodes Locale files moved out --- analysis/sentiment/locales/en-US/72-sentiment.html | 2 +- analysis/sentiment/locales/ja/72-sentiment.html | 2 +- analysis/sentiment/package.json | 4 ++-- function/rbe/locales/en-US/rbe.html | 2 +- function/rbe/locales/ja/rbe.html | 2 +- function/rbe/package.json | 2 +- package.json | 8 ++++---- social/email/locales/en-US/61-email.html | 4 ++-- social/email/locales/ja/61-email.html | 4 ++-- social/email/package.json | 4 ++-- social/feedparser/locales/en-US/32-feedparse.html | 2 +- social/feedparser/locales/ja/32-feedparse.html | 2 +- social/feedparser/package.json | 2 +- social/twitter/locales/en-US/27-twitter.html | 6 +++--- social/twitter/locales/ja/27-twitter.html | 6 +++--- social/twitter/package.json | 2 +- storage/tail/locales/en-US/28-tail.html | 2 +- storage/tail/locales/ja/28-tail.html | 2 +- storage/tail/package.json | 2 +- 19 files changed, 30 insertions(+), 30 deletions(-) diff --git a/analysis/sentiment/locales/en-US/72-sentiment.html b/analysis/sentiment/locales/en-US/72-sentiment.html index da1bc83c..583d48bf 100644 --- a/analysis/sentiment/locales/en-US/72-sentiment.html +++ b/analysis/sentiment/locales/en-US/72-sentiment.html @@ -1,4 +1,4 @@ - - - - - - - - - @@ -130,7 +132,7 @@ }); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86,7 +91,7 @@ var levelNode = RED.nodes.node(this.mydb); return this.name||(levelNode?levelNode.label():"mysql"); }, - labelStyle: function() { + labelStyle: function() { return this.name?"node_label_italic":""; } }); diff --git a/storage/mysql/README.md b/storage/mysql/README.md index 4371cfaa..0af76eba 100644 --- a/storage/mysql/README.md +++ b/storage/mysql/README.md @@ -7,7 +7,7 @@ Install Either use the `Node-RED Menu - Manage Palette - Install`, or run the following command in your Node-RED user directory - typically `~/.node-red` - npm install node-red-node-mysql + npm i node-red-node-mysql Usage @@ -17,7 +17,7 @@ Allows basic access to a MySQL database. This node uses the query operation against the configured database. This does allow both INSERTS and DELETES. -By it's very nature it allows SQL injection... so be careful out there... +By its very nature it allows SQL injection... so be careful out there... The `msg.topic` must hold the query for the database, and the result is returned in `msg.payload`. diff --git a/storage/mysql/package.json b/storage/mysql/package.json index 2e053b75..c328ef50 100644 --- a/storage/mysql/package.json +++ b/storage/mysql/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-mysql", - "version": "0.0.2-", + "version": "0.0.20", "description": "A Node-RED node to read and write to a MySQL database", "dependencies": { "mysql": "^2.18.1" From a57de3d8f21a6bed175a839107a54d432e9ba854 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 27 Mar 2020 11:36:18 +0000 Subject: [PATCH 339/456] Fix serialport to not try to log error and tell user instead to close #637 --- io/serialport/25-serial.js | 2 +- io/serialport/locales/en-US/25-serial.json | 3 ++- io/serialport/locales/ja/25-serial.json | 3 ++- io/serialport/package.json | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 17035d14..5f32a35b 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -465,7 +465,7 @@ module.exports = function(RED) { res.json(a); }, err => { - node.log('Error listing serial ports', err) + res.json([RED._("serial.errors.list")]); } ) }); diff --git a/io/serialport/locales/en-US/25-serial.json b/io/serialport/locales/en-US/25-serial.json index 503cb0b8..fd52c996 100644 --- a/io/serialport/locales/en-US/25-serial.json +++ b/io/serialport/locales/en-US/25-serial.json @@ -65,7 +65,8 @@ "error": "serial port __port__ error: __error__", "unexpected-close": "serial port __port__ closed unexpectedly", "disconnected": "serial port __port__ disconnected", - "closed": "serial port __port__ closed" + "closed": "serial port __port__ closed", + "list": "Failed to list ports. Please enter manually." } } } diff --git a/io/serialport/locales/ja/25-serial.json b/io/serialport/locales/ja/25-serial.json index 42e4dfc0..f2189c85 100644 --- a/io/serialport/locales/ja/25-serial.json +++ b/io/serialport/locales/ja/25-serial.json @@ -50,7 +50,8 @@ "error": "serial port __port__ error: __error__", "unexpected-close": "serial port __port__ closed unexpectedly", "disconnected": "serial port __port__ disconnected", - "closed": "serial port __port__ closed" + "closed": "serial port __port__ closed", + "list": "ポートのリスト化に失敗しました。手動で入力してください。" } } } diff --git a/io/serialport/package.json b/io/serialport/package.json index 851c5123..35a87f6e 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-serialport", - "version" : "0.10.0", + "version" : "0.10.1", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { - "serialport" : "^8.0.5" + "serialport" : "^8.0.7" }, "repository" : { "type":"git", From 3087e8e2a1ea189f394bca0a2af159ad859d7722 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 31 Mar 2020 17:07:22 +0100 Subject: [PATCH 340/456] ensure clone msg for multi line output to close #642 --- utility/daemon/daemon.js | 6 ++++-- utility/daemon/package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/utility/daemon/daemon.js b/utility/daemon/daemon.js index 633d8154..6d6546a6 100644 --- a/utility/daemon/daemon.js +++ b/utility/daemon/daemon.js @@ -60,8 +60,10 @@ module.exports = function(RED) { line += data.toString(); var bits = line.split("\n"); while (bits.length > 1) { - lastmsg.payload = bits.shift(); - node.send([lastmsg,null,null]); + var m = RED.util.cloneMessage(lastmsg); + m.payload = bits.shift(); + console.log(m); + node.send([m,null,null]); } line = bits[0]; } diff --git a/utility/daemon/package.json b/utility/daemon/package.json index 7650fe9b..be7932aa 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.0.25", + "version" : "0.0.26", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From 34c3beb4305b11d2c59c58de543914cdc1f2e3bd Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 1 Apr 2020 17:51:51 +0100 Subject: [PATCH 341/456] bump daemon so npm update has a chance to update it in future --- utility/daemon/README.md | 3 ++- utility/daemon/daemon.html | 4 ++-- utility/daemon/package.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/utility/daemon/README.md b/utility/daemon/README.md index 2c46037b..57577643 100644 --- a/utility/daemon/README.md +++ b/utility/daemon/README.md @@ -13,7 +13,8 @@ Useful for monitoring command line based processes. Install ------- -Run the following command in your Node-RED user directory - typically `~/.node-red` +Either use the Editor - Menu - Manage Palette - Install option or +run the following command in your Node-RED user directory - typically `~/.node-red` npm i node-red-node-daemon diff --git a/utility/daemon/daemon.html b/utility/daemon/daemon.html index 73e77450..2d0afb48 100644 --- a/utility/daemon/daemon.html +++ b/utility/daemon/daemon.html @@ -1,6 +1,6 @@ - - diff --git a/io/ping/88-ping.js b/io/ping/88-ping.js index 1db1f59e..2b3ed337 100644 --- a/io/ping/88-ping.js +++ b/io/ping/88-ping.js @@ -1,61 +1,134 @@ module.exports = function(RED) { "use strict"; - var spawn = require('child_process').spawn; - var plat = require('os').platform(); + var spawn = require("child_process").spawn; + var plat = require("os").platform(); + + function doPing(node, host, arrayMode){ + const defTimeout = 5000; + var ex, hostOptions, commandLineOptions; + if(typeof host === "string"){ + hostOptions = { + host: host, + timeout: defTimeout + } + } else { + hostOptions = host; + hostOptions.timeout = isNaN(parseInt(hostOptions.timeout)) ? defTimeout : parseInt(hostOptions.timeout); + } + //clamp timeout between 1 and 30 sec + hostOptions.timeout = hostOptions.timeout < 1000 ? 1000 : hostOptions.timeout; + hostOptions.timeout = hostOptions.timeout > 30000 ? 30000 : hostOptions.timeout; + var timeoutS = Math.round(hostOptions.timeout / 1000); //whole numbers only + var msg = { payload:false, topic:hostOptions.host }; + //only include the extra msg object if operating in advance/array mode. + if(arrayMode){ + msg.ping = hostOptions + } + if (plat == "linux" || plat == "android") { + commandLineOptions = ["-n", "-w", timeoutS, "-c", "1"] + } else if (plat.match(/^win/)) { + commandLineOptions = ["-n", "1", "-w", hostOptions.timeout] + } else if (plat == "darwin" || plat == "freebsd") { + commandLineOptions = ["-n", "-t", timeoutS, "-c", "1"] + } else { + node.error("Sorry - your platform - "+plat+" - is not recognised.", msg); + return; //dont pass go - just return! + } + + //spawn with timeout in case of os issue + ex = spawn("ping", [...commandLineOptions, hostOptions.host]); + + //monitor every spawned process & SIGINT if too long + var spawnTout = setTimeout(() => { + node.log(`ping - Host '${hostOptions.host}' process timeout - sending SIGINT`) + try{if(ex && ex.pid){ ex.kill("SIGINT"); }} catch(e){console.warn(e)} + }, hostOptions.timeout+1000); //add 1s for grace + + var res = false; + var line = ""; + var fail = false; + //var regex = /from.*time.(.*)ms/; + var regex = /=.*[<|=]([0-9]*).*TTL|ttl..*=([0-9\.]*)/; + ex.stdout.on("data", function (data) { + line += data.toString(); + }); + ex.on("exit", function (err) { + clearTimeout(spawnTout); + }); + ex.on("error", function (err) { + fail = true; + if (err.code === "ENOENT") { + node.error(err.code + " ping command not found", msg); + } + else if (err.code === "EACCES") { + node.error(err.code + " can't run ping command", msg); + } + else { + node.error(err.code, msg); + } + }); + ex.on("close", function (code) { + if (fail) { fail = false; return; } + var m = regex.exec(line)||""; + if (m !== "") { + if (m[1]) { res = Number(m[1]); } + if (m[2]) { res = Number(m[2]); } + } + if (code === 0) { msg.payload = res } + try { node.send(msg); } + catch(e) {console.warn(e)} + }); + } function PingNode(n) { RED.nodes.createNode(this,n); + this.mode = n.mode; this.host = n.host; this.timer = n.timer * 1000; var node = this; - node.tout = setInterval(function() { - var ex; - if (plat == "linux" || plat == "android") { ex = spawn('ping', ['-n', '-w', '5', '-c', '1', node.host]); } - else if (plat.match(/^win/)) { ex = spawn('ping', ['-n', '1', '-w', '5000', node.host]); } - else if (plat == "darwin" || plat == "freebsd") { ex = spawn('ping', ['-n', '-t', '5', '-c', '1', node.host]); } - else { node.error("Sorry - your platform - "+plat+" - is not recognised."); } - var res = false; - var line = ""; - var fail = false; - //var regex = /from.*time.(.*)ms/; - var regex = /=.*[<|=]([0-9]*).*TTL|ttl..*=([0-9\.]*)/; - ex.stdout.on('data', function (data) { - line += data.toString(); - }); - //ex.stderr.on('data', function (data) { - //console.log('[ping] stderr: ' + data); - //}); - ex.on('error', function (err) { - fail = true; - if (err.code === "ENOENT") { - node.error(err.code + " ping command not found"); + function generatePingList(str) { + return (str + "").split(",").map((e) => (e + "").trim()).filter((e) => e != ""); + } + function clearPingInterval(){ + if (node.tout) { clearInterval(node.tout); } + } + + if(node.mode === "triggered"){ + clearPingInterval(); + } else if(node.timer){ + node.tout = setInterval(function() { + let pingables = generatePingList(node.host); + for (let index = 0; index < pingables.length; index++) { + const element = pingables[index]; + if(element){ doPing(node, element, false); } } - else if (err.code === "EACCES") { - node.error(err.code + " can't run ping command"); + }, node.timer); + } + + this.on("input", function (msg) { + let node = this; + let payload = node.host || msg.payload; + if(typeof payload == "string"){ + let pingables = generatePingList(payload) + for (let index = 0; index < pingables.length; index++) { + const element = pingables[index]; + if(element){ doPing(node, element, false); } } - else { - node.error(err.code); + } else if (Array.isArray(payload) ) { + for (let index = 0; index < payload.length; index++) { + const element = payload[index]; + if(element){ doPing(node, element, true); } } - }); - ex.on('close', function (code) { - if (fail) { fail = false; return; } - var m = regex.exec(line)||""; - if (m !== '') { - if (m[1]) { res = Number(m[1]); } - if (m[2]) { res = Number(m[2]); } - } - var msg = { payload:false, topic:node.host }; - if (code === 0) { msg = { payload:res, topic:node.host }; } - try { node.send(msg); } - catch(e) {} - }); - }, node.timer); + } + }); this.on("close", function() { - if (this.tout) { clearInterval(this.tout); } + clearPingInterval(); }); + + } RED.nodes.registerType("ping",PingNode); -} +} \ No newline at end of file diff --git a/io/ping/README.md b/io/ping/README.md index 36127c73..44cb27d0 100644 --- a/io/ping/README.md +++ b/io/ping/README.md @@ -27,7 +27,7 @@ The fix is to allow it as follows Usage ----- -Pings a machine and returns the trip time in mS as `msg.payload`. +Pings 1 or more devices and returns the trip time in mS as `msg.payload`. Returns boolean `false` if no response received, or if the host is unresolveable. @@ -35,4 +35,9 @@ Returns boolean `false` if no response received, or if the host is unresolveable `msg.topic` contains the ip address of the target host. -Default ping is every 20 seconds but can be configured. +There are 2 modes - `Timed` and `Triggered`. + +* Timed mode - this is the default mode that pings your devices on a timed basis. Default ping is every 20 seconds but can be configured. +* Triggered mode - this mode permits you to trigger the ping by an input message. If the `Target` is left blank and `msg.payload` is a string or array, you can ping 1 or more devices on demand. + +Refer to the built in help on the side-bar info panel for more details. diff --git a/io/ping/locales/en-US/88-ping.html b/io/ping/locales/en-US/88-ping.html index 4ba4dde9..cd81ec09 100644 --- a/io/ping/locales/en-US/88-ping.html +++ b/io/ping/locales/en-US/88-ping.html @@ -1,8 +1,53 @@ - diff --git a/io/ping/locales/en-US/88-ping.json b/io/ping/locales/en-US/88-ping.json index bcff8820..f1a9093e 100644 --- a/io/ping/locales/en-US/88-ping.json +++ b/io/ping/locales/en-US/88-ping.json @@ -3,7 +3,12 @@ "ping": "ping", "label": { "target": "Target", - "ping": "Ping (S)" + "ping": "Ping (S)", + "mode": "Mode", + "mode_option": { + "timed": "Timed", + "triggered": "Triggered" + } } } } diff --git a/io/ping/locales/ja/88-ping.html b/io/ping/locales/ja/88-ping.html index 922747bf..ead433ad 100644 --- a/io/ping/locales/ja/88-ping.html +++ b/io/ping/locales/ja/88-ping.html @@ -1,8 +1,82 @@ - diff --git a/io/ping/locales/ja/88-ping.json b/io/ping/locales/ja/88-ping.json index 7b39cf3d..5eefe0e2 100644 --- a/io/ping/locales/ja/88-ping.json +++ b/io/ping/locales/ja/88-ping.json @@ -3,7 +3,12 @@ "ping": "ping", "label": { "target": "対象", - "ping": "Ping (秒)" + "ping": "Ping (秒)", + "mode": "モード", + "mode_option": { + "timed": "時限", + "triggered": "引き金になった" + } } } } From 7667de5ced55bec815ccb730a28eccb074deded8 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 3 Apr 2020 16:50:09 +0100 Subject: [PATCH 343/456] Tidy up ping notes for pub --- io/ping/88-ping.html | 12 +++++--- io/ping/locales/en-US/88-ping.html | 47 ++++++++++++++++-------------- io/ping/locales/en-US/88-ping.json | 3 +- io/ping/package.json | 7 +++-- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/io/ping/88-ping.html b/io/ping/88-ping.html index 7826c500..b82abfda 100644 --- a/io/ping/88-ping.html +++ b/io/ping/88-ping.html @@ -19,6 +19,7 @@ +
    diff --git a/io/ping/locales/en-US/88-ping.json b/io/ping/locales/en-US/88-ping.json index f1a9093e..0bfc7373 100644 --- a/io/ping/locales/en-US/88-ping.json +++ b/io/ping/locales/en-US/88-ping.json @@ -8,7 +8,8 @@ "mode_option": { "timed": "Timed", "triggered": "Triggered" - } + }, + "tip": "Note: Leave Target field blank to allow msg.payload to set hosts dynamically." } } } diff --git a/io/ping/package.json b/io/ping/package.json index 6ce6cffe..31edb417 100644 --- a/io/ping/package.json +++ b/io/ping/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ping", - "version" : "0.1.0", + "version" : "0.2.0", "description" : "A Node-RED node to ping a remote server, for use as a keep-alive check.", "dependencies" : { }, @@ -19,5 +19,8 @@ "name": "Dave Conway-Jones", "email": "ceejay@vnet.ibm.com", "url": "http://nodered.org" - } + }, + "contributors": [ + { "name": "@Steve-Mcl" } + ] } From 9b1eeb2756f836d75da49c592e458361561799aa Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 3 Apr 2020 17:55:30 +0100 Subject: [PATCH 344/456] shorten ping label if more than one target --- io/ping/88-ping.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/ping/88-ping.html b/io/ping/88-ping.html index b82abfda..db087d8e 100644 --- a/io/ping/88-ping.html +++ b/io/ping/88-ping.html @@ -74,8 +74,8 @@ var timerParameterValidator = function(node,v){ }, label: function() { let lbl = this.name||this.host||this._("ping.ping"); - if(lbl.length > 20){ - lbl = lbl.substring(0,17) + "..." + if (lbl.split(',').length > 1){ + lbl = this._("ping.ping"); } return lbl; }, From 7c759e10dd304911a04f756925e6a015bc30ac59 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 4 Apr 2020 06:12:22 +0900 Subject: [PATCH 345/456] Add and remove namespaces for i18n (#627) * Add necessary name spaces for i18n * Remove unnecessary name spaces for i18n --- hardware/PiGpio/36-rpi-gpio.html | 16 ++++++++-------- hardware/PiGpio/36-rpi-gpio.js | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/hardware/PiGpio/36-rpi-gpio.html b/hardware/PiGpio/36-rpi-gpio.html index 0c3d28e4..47f8e4c7 100644 --- a/hardware/PiGpio/36-rpi-gpio.html +++ b/hardware/PiGpio/36-rpi-gpio.html @@ -173,8 +173,8 @@
    - - + +
    @@ -366,8 +366,8 @@ Hz
    - - + +
    @@ -497,8 +497,8 @@
    - - + +
    @@ -528,8 +528,8 @@ diff --git a/hardware/PiGpio/36-rpi-gpio.js b/hardware/PiGpio/36-rpi-gpio.js index fc3d43bf..a922e5fd 100644 --- a/hardware/PiGpio/36-rpi-gpio.js +++ b/hardware/PiGpio/36-rpi-gpio.js @@ -87,7 +87,7 @@ module.exports = function(RED) { } } else { - node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + node.status({fill:"grey",shape:"dot",text:"rpi-gpio.status.not-available"}); if (node.read === true) { var val; if (node.intype == "up") { val = 1; } @@ -193,7 +193,7 @@ module.exports = function(RED) { } } else { - node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + node.status({fill:"grey",shape:"dot",text:"rpi-gpio.status.not-available"}); node.on("input", function(msg) { node.status({fill:"grey",shape:"dot",text:RED._("rpi-gpio.status.na",{value:msg.payload.toString()})}); }); @@ -260,7 +260,7 @@ module.exports = function(RED) { }); } else { - node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + node.status({fill:"grey",shape:"dot",text:"rpi-gpio.status.not-available"}); } } RED.nodes.registerType("rpi-mouse",PiMouseNode); @@ -313,7 +313,7 @@ module.exports = function(RED) { }); } else { - node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"}); + node.status({fill:"grey",shape:"dot",text:"rpi-gpio.status.not-available"}); } } RED.nodes.registerType("rpi-keyboard",PiKeyboardNode); From 3c4337f2383c60ae398da5f866d6fad3f1d72a39 Mon Sep 17 00:00:00 2001 From: arneman <7462507+arneman@users.noreply.github.com> Date: Fri, 3 Apr 2020 23:13:10 +0200 Subject: [PATCH 346/456] add an example for a prepared sql query (#621) An example sql query for the given parameter example would help users to understand how they could use prepared statements. --- storage/sqlite/sqlite.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/sqlite/sqlite.html b/storage/sqlite/sqlite.html index 65f30774..ceeca265 100644 --- a/storage/sqlite/sqlite.html +++ b/storage/sqlite/sqlite.html @@ -74,7 +74,8 @@     $name:"John Doe"
    }
    Parameter object names must match parameters set up in the Prepared Statement. If you get the error SQLITE_RANGE: bind or column index out of range - be sure to include $ on the parameter object key.

    + be sure to include $ on the parameter object key.
    + The sql query for the example above could be: insert into user_table (user_id, user) VALUES ($id, $name);

    Using any SQL Query, the result is returned in msg.payload

    Typically the returned payload will be an array of the result rows, (or an error).

    You can load sqlite extensions by inputting a msg.extension property containing the full From 3d9b3823cc999138f0318369d2e59aa427d5e6e5 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 3 Apr 2020 22:25:35 +0100 Subject: [PATCH 347/456] suncalc rearrange sorti of times into time order to close #633 --- time/suncalc/79-suncalc.html | 14 +++++++------- time/suncalc/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/time/suncalc/79-suncalc.html b/time/suncalc/79-suncalc.html index 69feede9..2776a656 100644 --- a/time/suncalc/79-suncalc.html +++ b/time/suncalc/79-suncalc.html @@ -1,5 +1,5 @@ - - diff --git a/io/ping/locales/ja/88-ping.json b/io/ping/locales/ja/88-ping.json index 5eefe0e2..9828b1d9 100644 --- a/io/ping/locales/ja/88-ping.json +++ b/io/ping/locales/ja/88-ping.json @@ -2,13 +2,14 @@ "ping": { "ping": "ping", "label": { - "target": "対象", + "target": "ターゲット", "ping": "Ping (秒)", "mode": "モード", "mode_option": { - "timed": "時限", - "triggered": "引き金になった" - } + "timed": "時間", + "triggered": "トリガー" + }, + "tip": "注: msg.payloadでホスト名を動的に指定する場合は、ターゲットフィールドを空にします。" } } } From 705dd1ffc11ab1101007df08474b50a4541db261 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 5 Apr 2020 11:44:27 +0100 Subject: [PATCH 350/456] mysql - ensure connection released back to pool more often and try to ensure status is shown more correctly on error. --- storage/mysql/68-mysql.js | 7 +++++-- storage/mysql/package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/storage/mysql/68-mysql.js b/storage/mysql/68-mysql.js index 4b4b8ac0..7d8e3aee 100644 --- a/storage/mysql/68-mysql.js +++ b/storage/mysql/68-mysql.js @@ -19,8 +19,8 @@ module.exports = function(RED) { function checkVer() { node.connection.query("SELECT version();", [], function(err, rows) { + node.connection.release(); if (err) { - node.connection.release(); node.error(err); node.status({fill:"red",shape:"ring",text:"Bad Ping"}); doConnect(); @@ -86,6 +86,7 @@ module.exports = function(RED) { if (this.tick) { clearTimeout(this.tick); } if (this.check) { clearInterval(this.check); } node.connected = false; + node.connection.release(); node.emit("state"," "); node.pool.end(function (err) { done(); }); }); @@ -124,8 +125,9 @@ module.exports = function(RED) { var bind = Array.isArray(msg.payload) ? msg.payload : []; node.mydbConfig.connection.query(msg.topic, bind, function(err, rows) { if (err) { + status = {fill:"red",shape:"ring",text:"Error: "+err.code}; + node.status(status); node.error(err,msg); - status = {fill:"red",shape:"ring",text:"Error"}; } else { if (rows.constructor.name === "OkPacket") { @@ -134,6 +136,7 @@ module.exports = function(RED) { else { msg.payload = rows; } node.send(msg); status = {fill:"green",shape:"dot",text:"OK"}; + node.status(status); } }); } diff --git a/storage/mysql/package.json b/storage/mysql/package.json index c328ef50..8140d1c4 100644 --- a/storage/mysql/package.json +++ b/storage/mysql/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-mysql", - "version": "0.0.20", + "version": "0.0.21", "description": "A Node-RED node to read and write to a MySQL database", "dependencies": { "mysql": "^2.18.1" From fa8e174d0b12419d02b6382dabaee158ab5c2665 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 5 Apr 2020 12:35:15 +0100 Subject: [PATCH 351/456] mysql - slightly overzealous closing of connections - causes crash. backed off slightly --- storage/mysql/68-mysql.js | 3 ++- storage/mysql/package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/storage/mysql/68-mysql.js b/storage/mysql/68-mysql.js index 7d8e3aee..95444e7f 100644 --- a/storage/mysql/68-mysql.js +++ b/storage/mysql/68-mysql.js @@ -19,8 +19,8 @@ module.exports = function(RED) { function checkVer() { node.connection.query("SELECT version();", [], function(err, rows) { - node.connection.release(); if (err) { + node.connection.release(); node.error(err); node.status({fill:"red",shape:"ring",text:"Bad Ping"}); doConnect(); @@ -103,6 +103,7 @@ module.exports = function(RED) { RED.nodes.createNode(this,n); this.mydb = n.mydb; this.mydbConfig = RED.nodes.getNode(this.mydb); + this.status({}); if (this.mydbConfig) { this.mydbConfig.connect(); diff --git a/storage/mysql/package.json b/storage/mysql/package.json index 8140d1c4..1bad178a 100644 --- a/storage/mysql/package.json +++ b/storage/mysql/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-mysql", - "version": "0.0.21", + "version": "0.0.22", "description": "A Node-RED node to read and write to a MySQL database", "dependencies": { "mysql": "^2.18.1" From a37fa35a8aed6b533f3fb0796fa18d5d57f2549d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 6 Apr 2020 21:42:44 +0100 Subject: [PATCH 352/456] [groups] Add node-red-node-group node --- utility/group/LICENSE | 14 ++++++++++++++ utility/group/README.md | 25 ++++++++++++++++++++++++ utility/group/group.html | 39 ++++++++++++++++++++++++++++++++++++++ utility/group/group.js | 16 ++++++++++++++++ utility/group/package.json | 20 +++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 utility/group/LICENSE create mode 100644 utility/group/README.md create mode 100644 utility/group/group.html create mode 100644 utility/group/group.js create mode 100644 utility/group/package.json diff --git a/utility/group/LICENSE b/utility/group/LICENSE new file mode 100644 index 00000000..f5b60114 --- /dev/null +++ b/utility/group/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2013-2016 IBM Corp. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/utility/group/README.md b/utility/group/README.md new file mode 100644 index 00000000..4c6f56e2 --- /dev/null +++ b/utility/group/README.md @@ -0,0 +1,25 @@ +node-red-node-group +=================== + +A Node-RED node to allow flows containing groups to be imported into older versions +of Node-RED. + +The ability to create groups was introduced in Node-RED 1.1.0, adding a new core +node type called `group`. + +This module provides its own `group` node type that can be installed into older +versions of Node-RED to allow them to run flows containing that type. + +It does *not* provide any group-like functionality - it *only* registers a +placeholder `group` node type. + +The module will only register the type if it detects it is being loaded into +Node-RED 1.0.x or older, otherwise it does nothing. + + +Install +------- + +Run the following command in your Node-RED user directory - typically `~/.node-red` + + npm i node-red-node-group diff --git a/utility/group/group.html b/utility/group/group.html new file mode 100644 index 00000000..d002ba40 --- /dev/null +++ b/utility/group/group.html @@ -0,0 +1,39 @@ + + + + + diff --git a/utility/group/group.js b/utility/group/group.js new file mode 100644 index 00000000..f976d2f4 --- /dev/null +++ b/utility/group/group.js @@ -0,0 +1,16 @@ + +module.exports = function(RED) { + var version = RED.version(); + var parts = /^(\d)+\.(\d)+\.(\d)+/.exec(version); + if (parts) { + var major = parseInt(parts[1]); + var minor = parseInt(parts[2]); + if (major > 1 || (major === 1 && minor > 0)) { + throw new Error("This module is not required for Node-RED 1.1.0 or later") + } + } + function GroupPolyfillNode(n) { + RED.nodes.createNode(this,n); + } + RED.nodes.registerType("group",GroupPolyfillNode); +} diff --git a/utility/group/package.json b/utility/group/package.json new file mode 100644 index 00000000..fb88571e --- /dev/null +++ b/utility/group/package.json @@ -0,0 +1,20 @@ +{ + "name": "node-red-node-group", + "version": "1.0.0", + "description": "A Node-RED node to allow flows containing groups to be imported into Node-RED 1.0.x or earlier.", + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/group" + }, + "license": "Apache-2.0", + "keywords": [ + "node-red" + ], + "node-red": { + "nodes": { + "group": "group.js" + } + }, + "author": "Nick O'Leary " +} From 7ccbb6fc9fa627a94ec2f1268201f3a9a8d8b0d5 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sat, 11 Apr 2020 06:40:57 +0900 Subject: [PATCH 353/456] Update Japanese message catalogue of RPI-GPIO (#645) --- hardware/PiGpio/locales/ja/36-rpi-gpio.json | 140 ++++++++++---------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/hardware/PiGpio/locales/ja/36-rpi-gpio.json b/hardware/PiGpio/locales/ja/36-rpi-gpio.json index a76daba6..619eb3ef 100644 --- a/hardware/PiGpio/locales/ja/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ja/36-rpi-gpio.json @@ -1,73 +1,75 @@ -"rpi-gpio": { - "label": { - "gpiopin": "GPIO", - "selectpin": "端子の選択", - "resistor": "抵抗", - "readinitial": "デプロイや再起動時に端子の初期状態を読み込む", - "type": "出力形式", - "initpin": "端子の状態を初期化", - "debounce": "デバウンス", - "freq": "頻度", - "button": "ボタン", - "pimouse": "Pi Mouse", - "pikeyboard": "Pi Keyboard", - "left": "Left", - "right": "Right", - "middle": "Middle" - }, - "resistor": { - "none": "なし", - "pullup": "プルアップ", - "pulldown": "プルダウン" - }, - "digout": "デジタル出力", - "pwmout": "PWM出力", - "servo": "サーボ出力", - "initpin0": "端子の初期レベル - Low (0)", - "initpin1": "端子の初期レベル - High (1)", - "left": "左", - "right": "右", - "middle": "中間", - "any": "全て", - "pinname": "端子", - "alreadyuse": "使用中", - "alreadyset": "設定済", - "tip": { - "pin": "使用中の端子: ", - "in": "注釈: 入力値は、0または1の数値のみ対応しています。", - "dig": "注釈: 「出力形式」として「デジタル出力」を用いる場合、入力値は0または1の数値である必要があります。", - "pwm": "注釈: 「出力形式」として「PWM出力」を用いる場合、入力値は0~100の数値である必要があります。", - "ser": "注釈: サーボ出力向け - 入力値は0~100の間である必要があります。50が中心値です。" - }, - "types": { +{ + "rpi-gpio": { + "label": { + "gpiopin": "GPIO", + "selectpin": "端子の選択", + "resistor": "抵抗", + "readinitial": "デプロイや再起動時に端子の初期状態を読み込む", + "type": "出力形式", + "initpin": "端子の状態を初期化", + "debounce": "デバウンス", + "freq": "頻度", + "button": "ボタン", + "pimouse": "Pi Mouse", + "pikeyboard": "Pi Keyboard", + "left": "Left", + "right": "Right", + "middle": "Middle" + }, + "resistor": { + "none": "なし", + "pullup": "プルアップ", + "pulldown": "プルダウン" + }, "digout": "デジタル出力", - "input": "入力", - "pullup": "プルアップの入力", - "pulldown": "プルダウンの入力", "pwmout": "PWM出力", - "servo": "サーボ出力" - }, - "status": { - "stopped": "停止", - "closed": "切断", - "not-running": "停止中", - "not-available": "利用不可", - "na": "N/A : __value__", - "ok": "OK" - }, - "errors": { - "ignorenode": "Raspberry Pi固有のノードを無視しました", - "version": "バージョンコマンドが失敗しました", - "sawpitype": "Saw Pi Type", - "libnotfound": "RPi.GPIO pythonライブラリを見つけられませんでした", - "alreadyset": "GPIO端子 __pin__ は既に出力形式が設定されています: __type__", - "invalidpin": "GPIO端子が不正です", - "invalidinput": "入力が不正です", - "needtobeexecutable": "__command__ は実行可能である必要があります", - "mustbeexecutable": "nrgpio は実行可能である必要があります", - "commandnotfound": "nrgpio コマンドが見つかりません", - "commandnotexecutable": "nrgpio コマンドが実行可能ではありません", - "error": "エラー: __error__", - "pythoncommandnotfound": "nrgpio python コマンドが実行されていません" + "servo": "サーボ出力", + "initpin0": "端子の初期レベル - Low (0)", + "initpin1": "端子の初期レベル - High (1)", + "left": "左", + "right": "右", + "middle": "中間", + "any": "全て", + "pinname": "端子", + "alreadyuse": "使用中", + "alreadyset": "設定済", + "tip": { + "pin": "使用中の端子: ", + "in": "注釈: 入力値は、0または1の数値のみ対応しています。", + "dig": "注釈: 「出力形式」として「デジタル出力」を用いる場合、入力値は0または1の数値である必要があります。", + "pwm": "注釈: 「出力形式」として「PWM出力」を用いる場合、入力値は0~100の数値である必要があります。", + "ser": "注釈: サーボ出力向け - 入力値は0~100の間である必要があります。50が中心値です。" + }, + "types": { + "digout": "デジタル出力", + "input": "入力", + "pullup": "プルアップの入力", + "pulldown": "プルダウンの入力", + "pwmout": "PWM出力", + "servo": "サーボ出力" + }, + "status": { + "stopped": "停止", + "closed": "切断", + "not-running": "停止中", + "not-available": "利用不可", + "na": "N/A : __value__", + "ok": "OK" + }, + "errors": { + "ignorenode": "Raspberry Pi固有のノードを無視しました", + "version": "バージョンコマンドが失敗しました", + "sawpitype": "Saw Pi Type", + "libnotfound": "RPi.GPIO pythonライブラリを見つけられませんでした", + "alreadyset": "GPIO端子 __pin__ は既に出力形式が設定されています: __type__", + "invalidpin": "GPIO端子が不正です", + "invalidinput": "入力が不正です", + "needtobeexecutable": "__command__ は実行可能である必要があります", + "mustbeexecutable": "nrgpio は実行可能である必要があります", + "commandnotfound": "nrgpio コマンドが見つかりません", + "commandnotexecutable": "nrgpio コマンドが実行可能ではありません", + "error": "エラー: __error__", + "pythoncommandnotfound": "nrgpio python コマンドが実行されていません" + } } } From bf1c5abd7d6aa4aee4927bae651904445ec77d54 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 10 Apr 2020 22:44:55 +0100 Subject: [PATCH 354/456] Merge branch 'master' of https://github.com/node-red/node-red-nodes --- hardware/PiGpio/locales/ja/36-rpi-gpio.json | 140 ++++++++++---------- hardware/PiGpio/package.json | 2 +- utility/group/LICENSE | 14 ++ utility/group/README.md | 25 ++++ utility/group/group.html | 39 ++++++ utility/group/group.js | 16 +++ utility/group/package.json | 20 +++ 7 files changed, 186 insertions(+), 70 deletions(-) create mode 100644 utility/group/LICENSE create mode 100644 utility/group/README.md create mode 100644 utility/group/group.html create mode 100644 utility/group/group.js create mode 100644 utility/group/package.json diff --git a/hardware/PiGpio/locales/ja/36-rpi-gpio.json b/hardware/PiGpio/locales/ja/36-rpi-gpio.json index a76daba6..619eb3ef 100644 --- a/hardware/PiGpio/locales/ja/36-rpi-gpio.json +++ b/hardware/PiGpio/locales/ja/36-rpi-gpio.json @@ -1,73 +1,75 @@ -"rpi-gpio": { - "label": { - "gpiopin": "GPIO", - "selectpin": "端子の選択", - "resistor": "抵抗", - "readinitial": "デプロイや再起動時に端子の初期状態を読み込む", - "type": "出力形式", - "initpin": "端子の状態を初期化", - "debounce": "デバウンス", - "freq": "頻度", - "button": "ボタン", - "pimouse": "Pi Mouse", - "pikeyboard": "Pi Keyboard", - "left": "Left", - "right": "Right", - "middle": "Middle" - }, - "resistor": { - "none": "なし", - "pullup": "プルアップ", - "pulldown": "プルダウン" - }, - "digout": "デジタル出力", - "pwmout": "PWM出力", - "servo": "サーボ出力", - "initpin0": "端子の初期レベル - Low (0)", - "initpin1": "端子の初期レベル - High (1)", - "left": "左", - "right": "右", - "middle": "中間", - "any": "全て", - "pinname": "端子", - "alreadyuse": "使用中", - "alreadyset": "設定済", - "tip": { - "pin": "使用中の端子: ", - "in": "注釈: 入力値は、0または1の数値のみ対応しています。", - "dig": "注釈: 「出力形式」として「デジタル出力」を用いる場合、入力値は0または1の数値である必要があります。", - "pwm": "注釈: 「出力形式」として「PWM出力」を用いる場合、入力値は0~100の数値である必要があります。", - "ser": "注釈: サーボ出力向け - 入力値は0~100の間である必要があります。50が中心値です。" - }, - "types": { +{ + "rpi-gpio": { + "label": { + "gpiopin": "GPIO", + "selectpin": "端子の選択", + "resistor": "抵抗", + "readinitial": "デプロイや再起動時に端子の初期状態を読み込む", + "type": "出力形式", + "initpin": "端子の状態を初期化", + "debounce": "デバウンス", + "freq": "頻度", + "button": "ボタン", + "pimouse": "Pi Mouse", + "pikeyboard": "Pi Keyboard", + "left": "Left", + "right": "Right", + "middle": "Middle" + }, + "resistor": { + "none": "なし", + "pullup": "プルアップ", + "pulldown": "プルダウン" + }, "digout": "デジタル出力", - "input": "入力", - "pullup": "プルアップの入力", - "pulldown": "プルダウンの入力", "pwmout": "PWM出力", - "servo": "サーボ出力" - }, - "status": { - "stopped": "停止", - "closed": "切断", - "not-running": "停止中", - "not-available": "利用不可", - "na": "N/A : __value__", - "ok": "OK" - }, - "errors": { - "ignorenode": "Raspberry Pi固有のノードを無視しました", - "version": "バージョンコマンドが失敗しました", - "sawpitype": "Saw Pi Type", - "libnotfound": "RPi.GPIO pythonライブラリを見つけられませんでした", - "alreadyset": "GPIO端子 __pin__ は既に出力形式が設定されています: __type__", - "invalidpin": "GPIO端子が不正です", - "invalidinput": "入力が不正です", - "needtobeexecutable": "__command__ は実行可能である必要があります", - "mustbeexecutable": "nrgpio は実行可能である必要があります", - "commandnotfound": "nrgpio コマンドが見つかりません", - "commandnotexecutable": "nrgpio コマンドが実行可能ではありません", - "error": "エラー: __error__", - "pythoncommandnotfound": "nrgpio python コマンドが実行されていません" + "servo": "サーボ出力", + "initpin0": "端子の初期レベル - Low (0)", + "initpin1": "端子の初期レベル - High (1)", + "left": "左", + "right": "右", + "middle": "中間", + "any": "全て", + "pinname": "端子", + "alreadyuse": "使用中", + "alreadyset": "設定済", + "tip": { + "pin": "使用中の端子: ", + "in": "注釈: 入力値は、0または1の数値のみ対応しています。", + "dig": "注釈: 「出力形式」として「デジタル出力」を用いる場合、入力値は0または1の数値である必要があります。", + "pwm": "注釈: 「出力形式」として「PWM出力」を用いる場合、入力値は0~100の数値である必要があります。", + "ser": "注釈: サーボ出力向け - 入力値は0~100の間である必要があります。50が中心値です。" + }, + "types": { + "digout": "デジタル出力", + "input": "入力", + "pullup": "プルアップの入力", + "pulldown": "プルダウンの入力", + "pwmout": "PWM出力", + "servo": "サーボ出力" + }, + "status": { + "stopped": "停止", + "closed": "切断", + "not-running": "停止中", + "not-available": "利用不可", + "na": "N/A : __value__", + "ok": "OK" + }, + "errors": { + "ignorenode": "Raspberry Pi固有のノードを無視しました", + "version": "バージョンコマンドが失敗しました", + "sawpitype": "Saw Pi Type", + "libnotfound": "RPi.GPIO pythonライブラリを見つけられませんでした", + "alreadyset": "GPIO端子 __pin__ は既に出力形式が設定されています: __type__", + "invalidpin": "GPIO端子が不正です", + "invalidinput": "入力が不正です", + "needtobeexecutable": "__command__ は実行可能である必要があります", + "mustbeexecutable": "nrgpio は実行可能である必要があります", + "commandnotfound": "nrgpio コマンドが見つかりません", + "commandnotexecutable": "nrgpio コマンドが実行可能ではありません", + "error": "エラー: __error__", + "pythoncommandnotfound": "nrgpio python コマンドが実行されていません" + } } } diff --git a/hardware/PiGpio/package.json b/hardware/PiGpio/package.json index 9e74c11f..708ef257 100644 --- a/hardware/PiGpio/package.json +++ b/hardware/PiGpio/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-pi-gpio", - "version": "1.0.8", + "version": "1.0.9", "description": "The basic Node-RED node for Pi GPIO", "dependencies" : { }, diff --git a/utility/group/LICENSE b/utility/group/LICENSE new file mode 100644 index 00000000..f5b60114 --- /dev/null +++ b/utility/group/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2013-2016 IBM Corp. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/utility/group/README.md b/utility/group/README.md new file mode 100644 index 00000000..4c6f56e2 --- /dev/null +++ b/utility/group/README.md @@ -0,0 +1,25 @@ +node-red-node-group +=================== + +A Node-RED node to allow flows containing groups to be imported into older versions +of Node-RED. + +The ability to create groups was introduced in Node-RED 1.1.0, adding a new core +node type called `group`. + +This module provides its own `group` node type that can be installed into older +versions of Node-RED to allow them to run flows containing that type. + +It does *not* provide any group-like functionality - it *only* registers a +placeholder `group` node type. + +The module will only register the type if it detects it is being loaded into +Node-RED 1.0.x or older, otherwise it does nothing. + + +Install +------- + +Run the following command in your Node-RED user directory - typically `~/.node-red` + + npm i node-red-node-group diff --git a/utility/group/group.html b/utility/group/group.html new file mode 100644 index 00000000..d002ba40 --- /dev/null +++ b/utility/group/group.html @@ -0,0 +1,39 @@ + + + + + diff --git a/utility/group/group.js b/utility/group/group.js new file mode 100644 index 00000000..f976d2f4 --- /dev/null +++ b/utility/group/group.js @@ -0,0 +1,16 @@ + +module.exports = function(RED) { + var version = RED.version(); + var parts = /^(\d)+\.(\d)+\.(\d)+/.exec(version); + if (parts) { + var major = parseInt(parts[1]); + var minor = parseInt(parts[2]); + if (major > 1 || (major === 1 && minor > 0)) { + throw new Error("This module is not required for Node-RED 1.1.0 or later") + } + } + function GroupPolyfillNode(n) { + RED.nodes.createNode(this,n); + } + RED.nodes.registerType("group",GroupPolyfillNode); +} diff --git a/utility/group/package.json b/utility/group/package.json new file mode 100644 index 00000000..fb88571e --- /dev/null +++ b/utility/group/package.json @@ -0,0 +1,20 @@ +{ + "name": "node-red-node-group", + "version": "1.0.0", + "description": "A Node-RED node to allow flows containing groups to be imported into Node-RED 1.0.x or earlier.", + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/group" + }, + "license": "Apache-2.0", + "keywords": [ + "node-red" + ], + "node-red": { + "nodes": { + "group": "group.js" + } + }, + "author": "Nick O'Leary " +} From 03514410755ef26b06c6331d592a6d27609bfea7 Mon Sep 17 00:00:00 2001 From: Marco <53404825+gre000@users.noreply.github.com> Date: Fri, 10 Apr 2020 23:53:17 +0200 Subject: [PATCH 355/456] MySQL allows to pass named parameters as object (#565) * add check isobj * added example to readme.md * edit if Syntax * add Documentation link to readme.md * fixed Syntax and edit readme.md --- storage/mysql/68-mysql.js | 18 +++++++++++++++++- storage/mysql/README.md | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/storage/mysql/68-mysql.js b/storage/mysql/68-mysql.js index 95444e7f..c14ecccc 100644 --- a/storage/mysql/68-mysql.js +++ b/storage/mysql/68-mysql.js @@ -123,7 +123,23 @@ module.exports = function(RED) { node.on("input", function(msg) { if (node.mydbConfig.connected) { if (typeof msg.topic === 'string') { - var bind = Array.isArray(msg.payload) ? msg.payload : []; + //console.log("query:",msg.topic); + var bind = []; + if (Array.isArray(msg.payload)) { bind = msg.payload; } + else if (typeof msg.payload === 'object' && msg.payload !== null) { + bind=msg.payload; + node.mydbConfig.connection.config.queryFormat = function (query, values) { + if (!values){ + return query; + } + return query.replace(/\:(\w+)/g, function (txt, key) { + if (values.hasOwnProperty(key)) { + return this.escape(values[key]); + } + return txt; + }.bind(this)); + }; + } node.mydbConfig.connection.query(msg.topic, bind, function(err, rows) { if (err) { status = {fill:"red",shape:"ring",text:"Error: "+err.code}; diff --git a/storage/mysql/README.md b/storage/mysql/README.md index 0af76eba..015adf0c 100644 --- a/storage/mysql/README.md +++ b/storage/mysql/README.md @@ -27,3 +27,26 @@ If nothing is found for the key then null is returned. The reconnect retry timeout in milliseconds can be changed by adding a line to settings.js

    mysqlReconnectTime: 30000,

    + + +Preparing Queries +----- +```javascript +msg.payload=[24, 'example-user']; +msg.topic="INSERT INTO users (`userid`, `username`) VALUES (?, ?);" +return msg; +``` + +with named parameters: + +```javascript +msg.payload={} +msg.payload.userToChange=42; +msg.payload.newUsername="example-user"; +msg.topic="INSERT INTO users (`userid`, `username`) VALUES (:userToChange, :newUsername) ON DUPLICATE KEY UPDATE `username`=:newUsername;" +return msg; +``` +Documentation +----- + +Documentation of the used Node.js package From 397b7cdaec7cafb3ef420f1ad33c9bde979c85ab Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 10 Apr 2020 22:56:28 +0100 Subject: [PATCH 356/456] bump mysql thanks to PR --- storage/mysql/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/mysql/package.json b/storage/mysql/package.json index 1bad178a..496fdd60 100644 --- a/storage/mysql/package.json +++ b/storage/mysql/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-mysql", - "version": "0.0.22", + "version": "0.1.0", "description": "A Node-RED node to read and write to a MySQL database", "dependencies": { "mysql": "^2.18.1" From 436f169fd436433d848ea7ddaf1c4538ed10b9b3 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sat, 11 Apr 2020 10:47:47 +0100 Subject: [PATCH 357/456] More Wemo update (#631) * Reduce resubscription time Halve the resubscrciption timeout to make sure event subscriptions get renewed * Big Update Includes: - New lookup node to check state of a device - Fix dimming control for lights - Fix light group control - Set the node label to match the device name - The event now includes the text description of the light capability * Fix groups properly * Fix travis error with comparitor * Bump node-ssdp version * Add extra check for empty results in discovery * Bump twitter to 280 chars fixes #371 * Bump twitter node version * Remove extra whitespace * Add catch for HTTP timeout If the device drops off line then with no catch for the timeout Node-RED will crash Should fix #616 * More timeout catch blocks * Version bump * Bump Wemo version --- hardware/wemo/lib/wemo.js | 29 ++++++++++++++++++++--------- hardware/wemo/package.json | 2 +- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/hardware/wemo/lib/wemo.js b/hardware/wemo/lib/wemo.js index 2e8d6f9b..acb6fc5c 100644 --- a/hardware/wemo/lib/wemo.js +++ b/hardware/wemo/lib/wemo.js @@ -215,6 +215,10 @@ WeMoNG.prototype.start = function start() { }); }); + post_request.on('timeout', function(){ + post_request.abort(); + }); + post_request.write(util.format(getenddevs.body, udn)); post_request.end(); @@ -291,9 +295,9 @@ WeMoNG.prototype.toggleSocket = function toggleSocket(socket, on) { console.log("%j", postoptions); }); - post_request.on('timeout', function (e) { - console.log(e); - console.log("%j"); + post_request.on('timeout', function () { + console.log("Timeout"); + post_request.abort(); }); var body = [ @@ -347,6 +351,11 @@ WeMoNG.prototype.getSocketStatus = function getSocketStatus(socket) { def.reject(); }); + post_request.on('timeout', function(){ + post_request.abort(); + def.reject(); + }); + post_request.write(getSocketState.body); post_request.end(); @@ -409,9 +418,9 @@ WeMoNG.prototype.getLightStatus = function getLightStatus(light) { def.reject(); }); - post_request.on('timeout', function (e) { - console.log(e); - console.log("%j"); + post_request.on('timeout', function () { + console.log("Timeout"); + post_request.abort(); def.reject(); }); @@ -451,9 +460,9 @@ WeMoNG.prototype.setStatus = function setStatus(light, capability, value) { console.log("%j", postoptions); }); - post_request.on('timeout', function (e) { - console.log(e); - console.log("%j"); + post_request.on('timeout', function () { + console.log("Timeout"); + post_request.abort(); }); //console.log(util.format(setdevstatus.body, light.id, capability, value)); @@ -493,9 +502,11 @@ WeMoNG.prototype.parseEvent = function parseEvent(evt) { def.resolve(msg); } else { console.log("unhandled wemo event type \n%s", util.inspect(prop, {depth:null})); + } } else { //error + def.reject(); } }); diff --git a/hardware/wemo/package.json b/hardware/wemo/package.json index fd668081..b116b9a6 100644 --- a/hardware/wemo/package.json +++ b/hardware/wemo/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-wemo", - "version": "0.1.16", + "version": "0.1.17", "description": "Input and Output nodes for Belkin WeMo devices", "repository": "https://github.com/node-red/node-red-nodes/tree/master/hardware", "main": "WeMoNG.js", From 92adb10fb347849e9c14f241081158378445423f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 17 Apr 2020 09:43:45 +0100 Subject: [PATCH 358/456] pushover: ensure handles missing payload. --- social/pushover/57-pushover.js | 1 + social/pushover/package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/social/pushover/57-pushover.js b/social/pushover/57-pushover.js index cbfbe3e0..dd020f9e 100644 --- a/social/pushover/57-pushover.js +++ b/social/pushover/57-pushover.js @@ -42,6 +42,7 @@ module.exports = function(RED) { if (isNaN(pri)) {pri=0;} if (pri > 2) {pri = 2;} if (pri < -2) {pri = -2;} + if (!msg.payload) { msg.payload = ""; } if (typeof(msg.payload) === 'object') { msg.payload = JSON.stringify(msg.payload); } diff --git a/social/pushover/package.json b/social/pushover/package.json index b7cb0b96..6fa315e0 100644 --- a/social/pushover/package.json +++ b/social/pushover/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pushover", - "version" : "0.0.17", + "version" : "0.0.18", "description" : "A Node-RED node to send alerts via Pushover", "dependencies" : { "pushover-notifications" : "^1.2.1" From 667c7588f95400acf7a1f7c89ae34914fd00e3f4 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 18 Apr 2020 13:55:57 +0100 Subject: [PATCH 359/456] Add offsets to suncalc node. --- time/suncalc/79-suncalc.html | 17 +++++++++++++++-- time/suncalc/79-suncalc.js | 10 +++++++--- time/suncalc/README.md | 9 ++++++--- time/suncalc/package.json | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/time/suncalc/79-suncalc.html b/time/suncalc/79-suncalc.html index 2776a656..47cd4d77 100644 --- a/time/suncalc/79-suncalc.html +++ b/time/suncalc/79-suncalc.html @@ -30,6 +30,11 @@ +
    + + start mins + end mins +
    @@ -39,9 +44,11 @@ diff --git a/time/suncalc/79-suncalc.js b/time/suncalc/79-suncalc.js index 6ce278b6..905ff846 100644 --- a/time/suncalc/79-suncalc.js +++ b/time/suncalc/79-suncalc.js @@ -9,6 +9,8 @@ module.exports = function(RED) { this.lon = n.lon; this.start = n.start; this.end = n.end; + this.soff = (n.soff || 0) * 60000; // minutes + this.eoff = (n.eoff || 0) * 60000; // minutes var node = this; var oldval = null; @@ -19,12 +21,14 @@ module.exports = function(RED) { var nowMillis = Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate(),now.getUTCHours(),now.getUTCMinutes()); var startMillis = Date.UTC(times[node.start].getUTCFullYear(),times[node.start].getUTCMonth(),times[node.start].getUTCDate(),times[node.start].getUTCHours(),times[node.start].getUTCMinutes()); var endMillis = Date.UTC(times[node.end].getUTCFullYear(),times[node.end].getUTCMonth(),times[node.end].getUTCDate(),times[node.end].getUTCHours(),times[node.end].getUTCMinutes()); - var e1 = nowMillis - startMillis; - var e2 = nowMillis - endMillis; + var e1 = nowMillis - startMillis - node.soff; + var e2 = nowMillis - endMillis - node.eoff; + var s1 = new Date(startMillis + node.soff); + var s2 = new Date(endMillis + node.eoff); if (isNaN(e1)) { e1 = 1; } if (isNaN(e2)) { e2 = -1; } var moon = parseInt(SunCalc.getMoonIllumination(now).fraction * 100 + 0.5) / 100; - var msg = {payload:0, topic:"sun", moon:moon}; + var msg = {payload:0, topic:"sun", moon:moon, start:s1, end:s2, now:now}; if ((e1 > 0) & (e2 < 0)) { msg.payload = 1; } if (oldval == null) { oldval = msg.payload; } if (msg.payload == 1) { node.status({fill:"yellow",shape:"dot",text:"day"}); } diff --git a/time/suncalc/README.md b/time/suncalc/README.md index 51de9d25..dac87938 100644 --- a/time/suncalc/README.md +++ b/time/suncalc/README.md @@ -6,11 +6,10 @@ A Node-RED node to provide a sign Install ------- -Run the following command in your Node-RED user directory - typically `~/.node-red` +Either use the `Node-RED Menu - Manage Palette - Install`, or run the following command in your Node-RED user directory - typically `~/.node-red` npm install node-red-node-suncalc - Usage ----- @@ -19,10 +18,14 @@ Uses the suncalc npm to generate an output at sunrise and sunset based on a spec Several choices of definition of sunrise and sunset are available, see the suncalc module for details. +The start and end times can be offset by a number of minutes before (minus) or after (plus) the chosen event time. + The node provide two outputs. The first output emits a `msg.payload` of 1 or 0 every minute depending if day-time (1) or night-time (0). The second output emits only on the transition between night to day (-> 1) or day to night (-> 0). -It also sets the `msg.topic` to sun and `msg.moon` to the fraction of the moon currently visible +It also outputs msg.start, msg.end and msg.now which are todays start and end times, with offsets applied, in ISO format, and the current ISO time. + +The `msg.topic` is set to sun, and `msg.moon` to the fraction of the moon currently visible (a value between 0 for no moon and 1 for full moon).

    diff --git a/time/suncalc/package.json b/time/suncalc/package.json index ecb27bcf..cf675cac 100644 --- a/time/suncalc/package.json +++ b/time/suncalc/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-suncalc", - "version" : "0.1.0", + "version" : "0.2.0", "description" : "A Node-RED node to provide a signal at sunrise and sunset", "dependencies" : { "suncalc" : "^1.8.0" From 4641d10beb6d98c34a7a11436d27bf3ebfd14860 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 18 Apr 2020 18:03:59 +0100 Subject: [PATCH 360/456] mysql: add charset option (defaults as-is to old UTF8) --- storage/mysql/68-mysql.html | 15 ++++++++++++--- storage/mysql/68-mysql.js | 6 ++++-- storage/mysql/README.md | 21 ++++++++++++++------- storage/mysql/package.json | 2 +- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/storage/mysql/68-mysql.html b/storage/mysql/68-mysql.html index 075fb6f7..37dca22d 100644 --- a/storage/mysql/68-mysql.html +++ b/storage/mysql/68-mysql.html @@ -24,6 +24,10 @@
    +
    + + +
    @@ -37,10 +41,9 @@ name: {value:""}, host: {value:"127.0.0.1",required:true}, port: {value:"3306",required:true}, - //user: {value:"",required:true}, - //pass: {value:"",required:true}, db: {value:"",required:true}, - tz: {value:""} + tz: {value:""}, + charset: {value:"UTF8"} }, credentials: { user: {type: "text"}, @@ -52,6 +55,12 @@ }); + + - diff --git a/function/rbe/rbe.js b/function/rbe/rbe.js index 1f5876c4..dc98496a 100644 --- a/function/rbe/rbe.js +++ b/function/rbe/rbe.js @@ -54,7 +54,7 @@ module.exports = function(RED) { if (node.pc) { node.gap = Math.abs(node.previous[t] * node.g / 100) || 0; } else { node.gap = Number(node.gap); } if ((node.previous[t] === undefined) && (node.func === "narrowbandEq")) { node.previous[t] = n; } - if (node.previous[t] === undefined) { node.previous[t] = n - node.gap; } + if (node.previous[t] === undefined) { node.previous[t] = n - node.gap - 1; } if (Math.abs(n - node.previous[t]) === node.gap) { if ((this.func === "deadbandEq")||(this.func === "narrowband")) { if (node.inout === "out") { node.previous[t] = n; } diff --git a/test/function/rbe/rbe_spec.js b/test/function/rbe/rbe_spec.js index cb89022b..8d220c15 100644 --- a/test/function/rbe/rbe_spec.js +++ b/test/function/rbe/rbe_spec.js @@ -286,9 +286,12 @@ describe('rbe node', function() { n2.on("input", function(msg) { c = c + 1; if (c === 1) { - msg.should.have.a.property("payload", 120); + msg.should.have.a.property("payload", 100); } else if (c === 2) { + msg.should.have.a.property("payload", 111); + } + else if (c === 3) { msg.should.have.a.property("payload", 135); done(); } @@ -296,8 +299,8 @@ describe('rbe node', function() { n1.emit("input", {payload:100}); n1.emit("input", {payload:95}); n1.emit("input", {payload:105}); + n1.emit("input", {payload:111}); n1.emit("input", {payload:120}); - n1.emit("input", {payload:130}); n1.emit("input", {payload:135}); }); }); From 24bd20ab21d9575c25d00afb02a3320b178aa841 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 13 Jun 2020 20:35:14 +0100 Subject: [PATCH 375/456] Fix not triggering on waitfor character --- io/serialport/25-serial.js | 2 +- io/serialport/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 5f32a35b..2cd1cc59 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -381,7 +381,7 @@ module.exports = function(RED) { var c = d[z]; if (c === waitfor) { active = true; } // handle the trivial case first -- single char buffer - if (!active) { return; } + if (!active) { continue; } if ((newline === 0)||(newline === "")) { emitData(new Buffer.from([c])); continue; diff --git a/io/serialport/package.json b/io/serialport/package.json index 3a69cc95..d553ad75 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-serialport", - "version" : "0.10.2", + "version" : "0.10.3", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { "serialport" : "^8.0.8" From a84658661dd24754eb1a9c8ee28faac2fe4d7b47 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 15 Jun 2020 15:31:44 +0100 Subject: [PATCH 376/456] fix comment --- io/serialport/25-serial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 2cd1cc59..172ffbd7 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -380,8 +380,8 @@ module.exports = function(RED) { for (var z=0; z Date: Tue, 16 Jun 2020 07:11:53 +0900 Subject: [PATCH 377/456] Add Japanese translations for pilcd node (#657) --- hardware/PiLcd/locales/en-US/pilcd.html | 9 +++++++++ hardware/PiLcd/locales/en-US/pilcd.json | 19 +++++++++++++++++++ hardware/PiLcd/locales/ja/pilcd.html | 9 +++++++++ hardware/PiLcd/locales/ja/pilcd.json | 19 +++++++++++++++++++ hardware/PiLcd/pilcd.html | 20 ++++---------------- hardware/PiLcd/pilcd.js | 14 +++++++------- 6 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 hardware/PiLcd/locales/en-US/pilcd.html create mode 100644 hardware/PiLcd/locales/en-US/pilcd.json create mode 100644 hardware/PiLcd/locales/ja/pilcd.html create mode 100644 hardware/PiLcd/locales/ja/pilcd.json diff --git a/hardware/PiLcd/locales/en-US/pilcd.html b/hardware/PiLcd/locales/en-US/pilcd.html new file mode 100644 index 00000000..4a667794 --- /dev/null +++ b/hardware/PiLcd/locales/en-US/pilcd.html @@ -0,0 +1,9 @@ + diff --git a/hardware/PiLcd/locales/en-US/pilcd.json b/hardware/PiLcd/locales/en-US/pilcd.json new file mode 100644 index 00000000..bf55ec30 --- /dev/null +++ b/hardware/PiLcd/locales/en-US/pilcd.json @@ -0,0 +1,19 @@ +{ + "pilcd": { + "label": { + "pins": "Pins" + }, + "tip": { + "tip": "Tip: Pins MUST be a comma separated list of the 6 GPIO connector pin numbers that are connected to the RS, E, D4, D5, D6 and D7 pins of the LCD." + }, + "status": { + "not-available": "not available", + "na": "N/A : __value__" + }, + "errors": { + "ignorenode": "Raspberry Pi specific node set inactive", + "libnotfound": "Cannot find Pi RPi.GPIO python library", + "needtobeexecutable": "__command__ needs to be executable" + } + } +} diff --git a/hardware/PiLcd/locales/ja/pilcd.html b/hardware/PiLcd/locales/ja/pilcd.html new file mode 100644 index 00000000..0dd86ab8 --- /dev/null +++ b/hardware/PiLcd/locales/ja/pilcd.html @@ -0,0 +1,9 @@ + diff --git a/hardware/PiLcd/locales/ja/pilcd.json b/hardware/PiLcd/locales/ja/pilcd.json new file mode 100644 index 00000000..ba861599 --- /dev/null +++ b/hardware/PiLcd/locales/ja/pilcd.json @@ -0,0 +1,19 @@ +{ + "pilcd": { + "label": { + "pins": "ピン" + }, + "tip": { + "tip": "注釈: LCDのRS、E、D4、D5、D6、およびD7ピンに接続されている6つのGPIOコネクタのピン番号を、コンマで区切りでピンに入力する必要があります。" + }, + "status": { + "not-available": "利用不可", + "na": "N/A : __value__" + }, + "errors": { + "ignorenode": "Raspberry Pi固有のノードを無視しました", + "libnotfound": "RPi.GPIO pythonライブラリを見つけられませんでした", + "needtobeexecutable": "__command__ は実行可能である必要があります" + } + } +} diff --git a/hardware/PiLcd/pilcd.html b/hardware/PiLcd/pilcd.html index faa4b475..c0ce3a11 100644 --- a/hardware/PiLcd/pilcd.html +++ b/hardware/PiLcd/pilcd.html @@ -1,26 +1,14 @@ - - - diff --git a/function/random/locales/en-US/random.json b/function/random/locales/en-US/random.json new file mode 100644 index 00000000..e53fe58c --- /dev/null +++ b/function/random/locales/en-US/random.json @@ -0,0 +1,13 @@ +{ + "random": { + "label": { + "generate": "Generate", + "wholeNumber": "a whole number - integer", + "realNumber": "a real number - floating point", + "from": "From", + "lowestNumber": "lowest number", + "to": "To", + "highestNumber": "highest number" + } + } +} diff --git a/function/random/locales/ja/random.html b/function/random/locales/ja/random.html new file mode 100644 index 00000000..ffb9b2c0 --- /dev/null +++ b/function/random/locales/ja/random.html @@ -0,0 +1,7 @@ + diff --git a/function/random/locales/ja/random.json b/function/random/locales/ja/random.json new file mode 100644 index 00000000..fa3da7cb --- /dev/null +++ b/function/random/locales/ja/random.json @@ -0,0 +1,13 @@ +{ + "random": { + "label": { + "generate": "生成", + "wholeNumber": "整数 - 整数値", + "realNumber": "実数 - 浮動小数点", + "from": "最小", + "lowestNumber": "最小値", + "to": "最大", + "highestNumber": "最大値" + } + } +} diff --git a/function/random/random.html b/function/random/random.html index 17ef9d87..bf1ae44a 100644 --- a/function/random/random.html +++ b/function/random/random.html @@ -1,37 +1,29 @@ - - - diff --git a/hardware/sensehatsim/sensehatsim.html b/hardware/sensehatsim/sensehatsim.html index 0edfeade..67168cb5 100644 --- a/hardware/sensehatsim/sensehatsim.html +++ b/hardware/sensehatsim/sensehatsim.html @@ -32,7 +32,8 @@

    Raspberry Pi Sense HAT Simulator input node.

    This node simulates readings from the various sensors on the Sense HAT, grouped into three sets; motion events, environment events and joystick events.

    -

    Once deployed, the simulator can be accessed here.

    +

    Once deployed, click this button to open the simulator:

    +

    Open Simulator

    Motion events - not currently supported by the simulator

    Motion events include readings from the accelerometer, gyroscope and magnetometer, as well as the current compass heading. They are sent at a rate of approximately 10 @@ -73,7 +74,8 @@ is an object with the following values:

    diff --git a/hardware/sensehatsim/sensehatsim.js b/hardware/sensehatsim/sensehatsim.js index bcdb8cd6..42439fa9 100644 --- a/hardware/sensehatsim/sensehatsim.js +++ b/hardware/sensehatsim/sensehatsim.js @@ -3,6 +3,7 @@ module.exports = function(RED) { "use strict"; var path = require("path"); var ws = require("ws"); + var url = require("url"); var colours = require('./colours'); // Xaccel.x,y,z,gyro.x,y,z,orientation.roll,pitch,yaw,compass @@ -25,7 +26,7 @@ module.exports = function(RED) { var currentDisplay = []; var HAT = (function() { var hatWS = null; - var wsServerListeners = {}; + var wsServerListener; var wsConnections = {}; var currentEnvironment = {temperature: 20, humidity: 80, pressure: 1000}; var hat = null; @@ -56,19 +57,15 @@ module.exports = function(RED) { wsServerListeners[event] = listener; } } - RED.server.addListener('newListener',storeListener); // Create a WebSocket Server - hatWS = new ws.Server({ - server:RED.server, - path:wsPath, - // Disable the deflate option due to this issue - // https://github.com/websockets/ws/pull/632 - // that is fixed in the 1.x release of the ws module - // that we cannot currently pickup as it drops node 0.10 support - perMessageDeflate: false - }); - RED.server.removeListener('newListener',storeListener); + hatWS = new ws.Server({noServer: true}); + hatWS.on('error', function(err) { + + }) hatWS.on('connection', function(socket) { + socket.on('error', function(err) { + delete wsConnections[id]; + }); var id = (1+Math.random()*4294967295).toString(16); wsConnections[id] = socket; socket.send("Y"+currentEnvironment.temperature+","+currentEnvironment.humidity+","+currentEnvironment.pressure); @@ -119,25 +116,27 @@ module.exports = function(RED) { } }); - socket.on('error', function(err) { - delete wsConnections[id]; - }); + }); + + wsServerListener = function upgrade(request, socket, head) { + const pathname = url.parse(request.url).pathname; + if (pathname === wsPath) { + hatWS.handleUpgrade(request, socket, head, function done(ws) { + hatWS.emit('connection', ws, request); + }); + } + // Don't destroy the socket as other listeners may want to handle the + // event. + }; + RED.server.on('upgrade', wsServerListener) + } } var disconnect = function(done) { if (hatWS !== null) { - var listener = null; - for (var event in wsServerListeners) { - if (wsServerListeners.hasOwnProperty(event)) { - listener = wsServerListeners[event]; - if (typeof listener === "function") { - RED.server.removeListener(event,listener); - } - } - } - wsServerListeners = {}; + RED.server.removeListener('upgrade', wsServerListener) wsConnections = {}; hatWS.close(); hatWS = null; From 41d9f18608559cae8e27d22f9acf9e6216ef0ef9 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 22 Jun 2020 22:45:34 +0100 Subject: [PATCH 382/456] Daemon node - catch tiny possible escape with "\n " in command as label --- utility/daemon/daemon.html | 2 +- utility/daemon/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utility/daemon/daemon.html b/utility/daemon/daemon.html index 2d0afb48..8b89688c 100644 --- a/utility/daemon/daemon.html +++ b/utility/daemon/daemon.html @@ -79,7 +79,7 @@ outputLabels: ["stdout","stderr","exit code"], icon: "arrow-in.png", label: function() { - return this.name||this.command||"daemon"; + return this.name||this.command.replace(/\\n /g,"\\\\n ")||"daemon"; }, labelStyle: function() { return this.name?"node_label_italic":""; diff --git a/utility/daemon/package.json b/utility/daemon/package.json index 3934a37b..308023c4 100644 --- a/utility/daemon/package.json +++ b/utility/daemon/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-daemon", - "version" : "0.1.0", + "version" : "0.1.2", "description" : "A Node-RED node that runs and monitors a long running system command.", "dependencies" : { }, From 5ba989f09dd09edcf4fc5fa09ce70e99ac702312 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 1 Jul 2020 11:16:20 +0100 Subject: [PATCH 383/456] tidy up ping node listeners --- io/ping/88-ping.js | 34 ++++++++++++++++++++-------------- io/ping/package.json | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/io/ping/88-ping.js b/io/ping/88-ping.js index 2b3ed337..36dd6b70 100644 --- a/io/ping/88-ping.js +++ b/io/ping/88-ping.js @@ -7,7 +7,7 @@ module.exports = function(RED) { function doPing(node, host, arrayMode){ const defTimeout = 5000; var ex, hostOptions, commandLineOptions; - if(typeof host === "string"){ + if (typeof host === "string") { hostOptions = { host: host, timeout: defTimeout @@ -22,7 +22,7 @@ module.exports = function(RED) { var timeoutS = Math.round(hostOptions.timeout / 1000); //whole numbers only var msg = { payload:false, topic:hostOptions.host }; //only include the extra msg object if operating in advance/array mode. - if(arrayMode){ + if (arrayMode) { msg.ping = hostOptions } if (plat == "linux" || plat == "android") { @@ -42,7 +42,13 @@ module.exports = function(RED) { //monitor every spawned process & SIGINT if too long var spawnTout = setTimeout(() => { node.log(`ping - Host '${hostOptions.host}' process timeout - sending SIGINT`) - try{if(ex && ex.pid){ ex.kill("SIGINT"); }} catch(e){console.warn(e)} + try { + if (ex && ex.pid) { + ex.removeAllListeners(); + ex.kill("SIGINT"); + } + } + catch(e) { console.warn(e) } }, hostOptions.timeout+1000); //add 1s for grace var res = false; @@ -50,9 +56,11 @@ module.exports = function(RED) { var fail = false; //var regex = /from.*time.(.*)ms/; var regex = /=.*[<|=]([0-9]*).*TTL|ttl..*=([0-9\.]*)/; - ex.stdout.on("data", function (data) { - line += data.toString(); - }); + if (ex && ex.hasOwnProperty("stdout")) { + ex.stdout.on("data", function (data) { + line += data.toString(); + }); + } ex.on("exit", function (err) { clearTimeout(spawnTout); }); @@ -95,14 +103,14 @@ module.exports = function(RED) { if (node.tout) { clearInterval(node.tout); } } - if(node.mode === "triggered"){ + if (node.mode === "triggered") { clearPingInterval(); - } else if(node.timer){ + } else if (node.timer) { node.tout = setInterval(function() { let pingables = generatePingList(node.host); for (let index = 0; index < pingables.length; index++) { const element = pingables[index]; - if(element){ doPing(node, element, false); } + if (element) { doPing(node, element, false); } } }, node.timer); } @@ -110,16 +118,16 @@ module.exports = function(RED) { this.on("input", function (msg) { let node = this; let payload = node.host || msg.payload; - if(typeof payload == "string"){ + if (typeof payload == "string") { let pingables = generatePingList(payload) for (let index = 0; index < pingables.length; index++) { const element = pingables[index]; - if(element){ doPing(node, element, false); } + if (element) { doPing(node, element, false); } } } else if (Array.isArray(payload) ) { for (let index = 0; index < payload.length; index++) { const element = payload[index]; - if(element){ doPing(node, element, true); } + if (element) { doPing(node, element, true); } } } }); @@ -127,8 +135,6 @@ module.exports = function(RED) { this.on("close", function() { clearPingInterval(); }); - - } RED.nodes.registerType("ping",PingNode); } \ No newline at end of file diff --git a/io/ping/package.json b/io/ping/package.json index 31edb417..64c399ec 100644 --- a/io/ping/package.json +++ b/io/ping/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-ping", - "version" : "0.2.0", + "version" : "0.2.1", "description" : "A Node-RED node to ping a remote server, for use as a keep-alive check.", "dependencies" : { }, From 8e45b96ec1c2bb5114e86361debbe376a60d48e4 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 1 Jul 2020 11:17:00 +0100 Subject: [PATCH 384/456] do the x-red thing to smooth node --- function/smooth/17-smooth.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/function/smooth/17-smooth.html b/function/smooth/17-smooth.html index 9658a7ce..75103f05 100644 --- a/function/smooth/17-smooth.html +++ b/function/smooth/17-smooth.html @@ -1,5 +1,5 @@ - - @@ -111,6 +112,7 @@
  • msg.count if set this will override the configured number of characters as long as it is less than the number configured.
  • msg.waitfor single character, escape code, or hex code. If set, the node will wait until it matches that character in the stream and then start the output.
  • +
  • Optionally the baudrate can be changed using msg.baudrate
  • Outputs

      diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 172ffbd7..81f4fc0a 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -41,6 +41,19 @@ module.exports = function(RED) { node.port = serialPool.get(this.serialConfig); node.on("input",function(msg) { + if (msg.hasOwnProperty("baudrate")) { + var baud = parseInt(msg.baudrate); + if (isNaN(baud)) { + node.error(RED._("serial.errors.badbaudrate"),msg); + } else { + node.port.update({baudRate: baud},function(err,res) { + if (err) { + var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); + node.error(errmsg,msg); + } + }); + } + } if (!msg.hasOwnProperty("payload")) { return; } // do nothing unless we have a payload var payload = node.port.encodePayload(msg.payload); node.port.write(payload,function(err,res) { @@ -121,6 +134,19 @@ module.exports = function(RED) { node.port = serialPool.get(this.serialConfig); // Serial Out node.on("input",function(msg) { + if (msg.hasOwnProperty("baudrate")) { + var baud = parseInt(msg.baudrate); + if (isNaN(baud)) { + node.error(RED._("serial.errors.badbaudrate"),msg); + } else { + node.port.update({baudRate: baud},function(err,res) { + if (err) { + var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); + node.error(errmsg,msg); + } + }); + } + } if (!msg.hasOwnProperty("payload")) { return; } // do nothing unless we have a payload if (msg.hasOwnProperty("count") && (typeof msg.count === "number") && (node.serialConfig.out === "count")) { node.serialConfig.newline = msg.count; @@ -249,6 +275,7 @@ module.exports = function(RED) { return payload; }, write: function(m,cb) { this.serial.write(m,cb); }, + update: function(m,cb) { this.serial.update(m,cb); }, enqueue: function(msg,sender,cb) { var payload = this.encodePayload(msg.payload); var qobj = { diff --git a/io/serialport/locales/en-US/25-serial.json b/io/serialport/locales/en-US/25-serial.json index fd52c996..f816b611 100644 --- a/io/serialport/locales/en-US/25-serial.json +++ b/io/serialport/locales/en-US/25-serial.json @@ -66,7 +66,8 @@ "unexpected-close": "serial port __port__ closed unexpectedly", "disconnected": "serial port __port__ disconnected", "closed": "serial port __port__ closed", - "list": "Failed to list ports. Please enter manually." + "list": "Failed to list ports. Please enter manually.", + "badbaudrate": "Baudrate is not valid" } } } diff --git a/io/serialport/locales/ja/25-serial.json b/io/serialport/locales/ja/25-serial.json index f2189c85..36bf27d1 100644 --- a/io/serialport/locales/ja/25-serial.json +++ b/io/serialport/locales/ja/25-serial.json @@ -51,7 +51,8 @@ "unexpected-close": "serial port __port__ closed unexpectedly", "disconnected": "serial port __port__ disconnected", "closed": "serial port __port__ closed", - "list": "ポートのリスト化に失敗しました。手動で入力してください。" + "list": "ポートのリスト化に失敗しました。手動で入力してください。", + "badbaudrate": "Baudrate is not valid" } } } From 53ad00f1653970f223efa8b4634f95a1063cad90 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 27 Aug 2020 13:00:10 +0100 Subject: [PATCH 395/456] bump serialport dependency, add ja translation for baudrate message, fix linting, bump package --- io/serialport/25-serial.js | 50 +++++++++++----------- io/serialport/locales/en-US/25-serial.json | 2 +- io/serialport/locales/ja/25-serial.json | 2 +- io/serialport/package.json | 4 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/io/serialport/25-serial.js b/io/serialport/25-serial.js index 81f4fc0a..2d9b4f2c 100644 --- a/io/serialport/25-serial.js +++ b/io/serialport/25-serial.js @@ -41,19 +41,19 @@ module.exports = function(RED) { node.port = serialPool.get(this.serialConfig); node.on("input",function(msg) { - if (msg.hasOwnProperty("baudrate")) { - var baud = parseInt(msg.baudrate); - if (isNaN(baud)) { + if (msg.hasOwnProperty("baudrate")) { + var baud = parseInt(msg.baudrate); + if (isNaN(baud)) { node.error(RED._("serial.errors.badbaudrate"),msg); - } else { - node.port.update({baudRate: baud},function(err,res) { - if (err) { - var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); - node.error(errmsg,msg); - } - }); - } - } + } else { + node.port.update({baudRate: baud},function(err,res) { + if (err) { + var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); + node.error(errmsg,msg); + } + }); + } + } if (!msg.hasOwnProperty("payload")) { return; } // do nothing unless we have a payload var payload = node.port.encodePayload(msg.payload); node.port.write(payload,function(err,res) { @@ -135,18 +135,18 @@ module.exports = function(RED) { // Serial Out node.on("input",function(msg) { if (msg.hasOwnProperty("baudrate")) { - var baud = parseInt(msg.baudrate); - if (isNaN(baud)) { - node.error(RED._("serial.errors.badbaudrate"),msg); - } else { - node.port.update({baudRate: baud},function(err,res) { - if (err) { - var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); - node.error(errmsg,msg); - } - }); - } - } + var baud = parseInt(msg.baudrate); + if (isNaN(baud)) { + node.error(RED._("serial.errors.badbaudrate"),msg); + } else { + node.port.update({baudRate: baud},function(err,res) { + if (err) { + var errmsg = err.toString().replace("Serialport","Serialport "+node.port.serial.path); + node.error(errmsg,msg); + } + }); + } + } if (!msg.hasOwnProperty("payload")) { return; } // do nothing unless we have a payload if (msg.hasOwnProperty("count") && (typeof msg.count === "number") && (node.serialConfig.out === "count")) { node.serialConfig.newline = msg.count; @@ -275,7 +275,7 @@ module.exports = function(RED) { return payload; }, write: function(m,cb) { this.serial.write(m,cb); }, - update: function(m,cb) { this.serial.update(m,cb); }, + update: function(m,cb) { this.serial.update(m,cb); }, enqueue: function(msg,sender,cb) { var payload = this.encodePayload(msg.payload); var qobj = { diff --git a/io/serialport/locales/en-US/25-serial.json b/io/serialport/locales/en-US/25-serial.json index f816b611..03ef70e6 100644 --- a/io/serialport/locales/en-US/25-serial.json +++ b/io/serialport/locales/en-US/25-serial.json @@ -67,7 +67,7 @@ "disconnected": "serial port __port__ disconnected", "closed": "serial port __port__ closed", "list": "Failed to list ports. Please enter manually.", - "badbaudrate": "Baudrate is not valid" + "badbaudrate": "Baudrate is invalid" } } } diff --git a/io/serialport/locales/ja/25-serial.json b/io/serialport/locales/ja/25-serial.json index 36bf27d1..647ed53c 100644 --- a/io/serialport/locales/ja/25-serial.json +++ b/io/serialport/locales/ja/25-serial.json @@ -52,7 +52,7 @@ "disconnected": "serial port __port__ disconnected", "closed": "serial port __port__ closed", "list": "ポートのリスト化に失敗しました。手動で入力してください。", - "badbaudrate": "Baudrate is not valid" + "badbaudrate": "ボーレートが不正です" } } } diff --git a/io/serialport/package.json b/io/serialport/package.json index d553ad75..d8f237ed 100644 --- a/io/serialport/package.json +++ b/io/serialport/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-serialport", - "version" : "0.10.3", + "version" : "0.11.0", "description" : "Node-RED nodes to talk to serial ports", "dependencies" : { - "serialport" : "^8.0.8" + "serialport" : "^9.0.1" }, "repository" : { "type":"git", From 46f3dfc3827f2a4e01df7a9617f6464f41b88d39 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 28 Aug 2020 09:36:06 +0100 Subject: [PATCH 396/456] email don't retry connection while still busy. --- social/email/61-email.js | 8 +++++--- social/email/package.json | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index 2dbfad24..c171d2ba 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -348,10 +348,10 @@ module.exports = function(RED) { //console.log("> Inbox err : %j", err); //console.log("> Inbox open: %j", box); if (err) { - s = false; node.status({fill:"red", shape:"ring", text:"email.status.foldererror"}); node.error(RED._("email.errors.fetchfail", {folder:node.box}),err); imap.end(); + s = false; setInputRepeatTimeout(); return; } @@ -412,6 +412,7 @@ module.exports = function(RED) { var cleanup = function() { imap.end(); s = false; + setInputRepeatTimeout(); }; if (this.disposition === "Delete") { imap.addFlags(results, "\Deleted", cleanup); @@ -420,11 +421,12 @@ module.exports = function(RED) { } else { cleanup(); } - setInputRepeatTimeout(); }); fetch.once('error', function(err) { console.log('Fetch error: ' + err); + imap.end(); + s = false; setInputRepeatTimeout(); }); } @@ -442,7 +444,7 @@ module.exports = function(RED) { if (node.protocol === "POP3") { checkPOP3(msg); } else if (node.protocol === "IMAP") { - if (s === false) { checkIMAP(msg); } + if (s === false && ss == false) { checkIMAP(msg); } } } // End of checkEmail diff --git a/social/email/package.json b/social/email/package.json index 56375b20..90da80a8 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,11 +1,11 @@ { "name": "node-red-node-email", - "version": "1.7.8", + "version": "1.7.9", "description": "Node-RED nodes to send and receive simple emails", "dependencies": { "imap": "^0.8.19", - "mailparser": "^2.7.7", - "nodemailer": "^6.4.6", + "mailparser": "^2.8.1", + "nodemailer": "^6.4.11", "poplib": "^0.1.7" }, "repository": { From 0b4c1ff977c021e0c3293e2dcb34de34cd0d395f Mon Sep 17 00:00:00 2001 From: Pablo Acosta-Serafini <63065092+pmacostapdi@users.noreply.github.com> Date: Mon, 31 Aug 2020 05:45:41 -0400 Subject: [PATCH 397/456] Enable the use of environment variables to define GPIO pin number (#676) * Enable the use of environment variables to define GPIO pin number * Pin field moved below table. Field width made the same as table. Restored fa-icon and "Pin" label. Closed validation escapes. --- hardware/PiGpio/36-rpi-gpio.html | 79 +++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 11 deletions(-) diff --git a/hardware/PiGpio/36-rpi-gpio.html b/hardware/PiGpio/36-rpi-gpio.html index 47f8e4c7..a4a66deb 100644 --- a/hardware/PiGpio/36-rpi-gpio.html +++ b/hardware/PiGpio/36-rpi-gpio.html @@ -70,8 +70,7 @@ @@ -90,20 +115,20 @@

      Save will update an existing object or insert a new object if one does not already exist.

      Insert will insert a new object.

      Save and insert either store msg or msg.payload.

      -

      Update will modify an existing object or objects. The query to select objects to update uses msg.query, +

      Update will modify an existing object or objects. The query to select objects to update uses msg.query and the update to the element uses msg.payload. If msg.query._id is a valid mongo ObjectId string it will be converted to an ObjectId type.

      -

      Update can add an object if it does not exist or update multiple objects.

      +

      Update can add a object if it does not exist or update multiple objects.

      Remove will remove objects that match the query passed in on msg.payload. A blank query will delete all of the objects in the collection.

      You can either set the collection method in the node config or on msg.collection. Setting it in the node will override msg.collection.

      -

      By default, MongoDB creates an _id property as the primary key, so repeated injections of the +

      By default MongoDB creates an _id property as the primary key - so repeated injections of the same msg will result in many database entries.

      -

      If this is NOT the desired behaviour, i.e., you want repeated entries to overwrite, then you must set +

      If this is NOT the desired behaviour - ie. you want repeated entries to overwrite, then you must set the msg._id property to be a constant by the use of a previous function node.

      This could be a unique constant or you could create one based on some other msg property.

      -

      Currently we do not limit or cap the collection size, however this may well change.

      +

      Currently we do not limit or cap the collection size at all... this may well change.

      + - - - - - + + + + + diff --git a/social/email/61-email.js b/social/email/61-email.js index 4efaf2a3..f046a635 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -1,3 +1,4 @@ +/* eslint-disable indent */ /** * POP3 protocol - RFC1939 - https://www.ietf.org/rfc/rfc1939.txt @@ -11,11 +12,13 @@ module.exports = function(RED) { "use strict"; - var nodemailer = require("nodemailer"); + var util = require("util"); var Imap = require('imap'); var POP3Client = require("poplib"); - var SimpleParser = require("mailparser").simpleParser; - var util = require("util"); + var nodemailer = require("nodemailer"); + var simpleParser = require("mailparser").simpleParser; + var SMTPServer = require("smtp-server").SMTPServer; + //var microMTA = require("micromta").microMTA; if (parseInt(process.version.split("v")[1].split(".")[0]) < 8) { throw "Error : Requires nodejs version >= 8."; @@ -291,8 +294,8 @@ module.exports = function(RED) { // We have now received a new email message. Create an instance of a mail parser // and pass in the email message. The parser will signal when it has parsed the message. - SimpleParser(data, {}, function(err, parsed) { - //node.log(util.format("SimpleParser: on(end): %j", mailObject)); + simpleParser(data, {}, function(err, parsed) { + //node.log(util.format("simpleParser: on(end): %j", mailObject)); if (err) { node.status({fill:"red", shape:"ring", text:"email.status.parseerror"}); node.error(RED._("email.errors.parsefail", {folder:node.box}), err); @@ -406,7 +409,7 @@ module.exports = function(RED) { //console.log("> Fetch message - msg=%j, seqno=%d", imapMessage, seqno); imapMessage.on('body', function(stream, info) { //console.log("> message - body - stream=?, info=%j", info); - SimpleParser(stream, {}, function(err, parsed) { + simpleParser(stream, {}, function(err, parsed) { if (err) { node.status({fill:"red", shape:"ring", text:"email.status.parseerror"}); node.error(RED._("email.errors.parsefail", {folder:node.box}),err); @@ -513,4 +516,63 @@ module.exports = function(RED) { global: { type:"boolean" } } }); + + + function emailMtaNode(n) { + RED.nodes.createNode(this,n); + this.port = n.port; + var node = this; + + node.mta = new SMTPServer({ + secure: false, + logger: false, + disabledCommands: ['AUTH', 'STARTTLS'], + + onData: function (stream, session, callback) { + simpleParser(stream, { + skipTextToHtml: true, + skipTextLinks: true + }) + .then(parsed => { + node.status({fill:"green", shape:"dot", text:""}); + var msg = {} + msg.payload = parsed.text; + msg.topic = parsed.subject; + msg.date = parsed.date; + msg.header = {}; + parsed.headers.forEach((v, k) => {msg.header[k] = v;}); + if (parsed.html) { msg.html = parsed.html; } + if (parsed.to) { + if (typeof(parsed.to) === "string" && parsed.to.length > 0) { msg.to = parsed.to; } + else if (parsed.to.hasOwnProperty("text") && parsed.to.text.length > 0) { msg.to = parsed.to.text; } + } + if (parsed.cc) { + if (typeof(parsed.cc) === "string" && parsed.cc.length > 0) { msg.cc = parsed.cc; } + else if (parsed.cc.hasOwnProperty("text") && parsed.cc.text.length > 0) { msg.cc = parsed.cc.text; } + } + if (parsed.cc && parsed.cc.length > 0) { msg.cc = parsed.cc; } + if (parsed.bcc && parsed.bcc.length > 0) { msg.bcc = parsed.bcc; } + if (parsed.from && parsed.from.value && parsed.from.value.length > 0) { msg.from = parsed.from.value[0].address; } + if (parsed.attachments) { msg.attachments = parsed.attachments; } + else { msg.attachments = []; } + node.send(msg); // Propagate the message down the flow + setTimeout(function() { node.status({})}, 500); + }) + .catch(err => { node.error(RED._("email.errors.parsefail"),err); }) + .finally(callback); + } + }); + + node.mta.listen(node.port); + + node.mta.on("error", err => { + node.error("Error: " + err.message, err); + }); + + node.on("close", function() { + node.mta.close(); + }); + } + RED.nodes.registerType("e-mail mta",emailMtaNode); + }; diff --git a/social/email/locales/en-US/61-email.html b/social/email/locales/en-US/61-email.html index 3f54dba8..282ff3b2 100644 --- a/social/email/locales/en-US/61-email.html +++ b/social/email/locales/en-US/61-email.html @@ -26,7 +26,7 @@

      Additionally msg.header contains the complete header object including to, cc and other potentially useful properties.

      It can optionally mark the message as Read (default), Delete it, or leave unmarked (None).

      -

      Uses the node-imap module - see that page for +

      Uses the node-imap module - see that page for information on the msg.criteria format if needed.

      Note: uses IMAP with SSL to port 993.

      Any attachments supplied in the incoming email can be found in the msg.attachments property. This will be an array of objects where @@ -51,3 +51,13 @@ + \ No newline at end of file diff --git a/social/email/locales/en-US/61-email.json b/social/email/locales/en-US/61-email.json index 9bc3a8fc..cca6fa1d 100644 --- a/social/email/locales/en-US/61-email.json +++ b/social/email/locales/en-US/61-email.json @@ -34,7 +34,8 @@ "default-message": "__description__\n\nFile from Node-RED is attached: __filename__", "tip": { "cred": "Note: Copied credentials from global emailkeys.js file.", - "recent": "Tip: Only retrieves the single most recent email." + "recent": "Tip: Only retrieves the single most recent email.", + "mta": "Note: To use ports below 1024 you may need elevated (root) privileges. See help sidebar." }, "status": { "messagesent": "Message sent: __response__", @@ -47,6 +48,7 @@ "inboxzero": "you have achieved Inbox Zero", "sending": "sending", "sendfail": "send failed", + "parseerror": "Failed to parse message", "connecterror": "connect error" }, "errors": { @@ -56,6 +58,7 @@ "nosmtptransport": "No SMTP transport. See info panel.", "nopayload": "No payload to send", "fetchfail": "Failed to fetch folder: __folder__", + "parsefail": "Failed to parse message", "messageerror": "Fetch message error: __error__", "refreshtoolarge": "Refresh interval too large. Limiting to 2147483 seconds" } diff --git a/social/email/locales/ja/61-email.html b/social/email/locales/ja/61-email.html index 560dcb8b..d8dbfac9 100644 --- a/social/email/locales/ja/61-email.html +++ b/social/email/locales/ja/61-email.html @@ -38,3 +38,13 @@

      POP3プロトコルでのデフォルトポート番号は、素のTCPでは110番、SSLでは995番です。IMAPプロトコルでは、素のTCPでは143番、SSLでは993番です。

      + + \ No newline at end of file diff --git a/social/email/locales/ja/61-email.json b/social/email/locales/ja/61-email.json index 08d04197..0938a236 100644 --- a/social/email/locales/ja/61-email.json +++ b/social/email/locales/ja/61-email.json @@ -21,7 +21,8 @@ "default-message": "__description__\n\nNode-REDからファイルが添付されました: __filename__", "tip": { "cred": "注釈: emailkeys.jsファイルから認証情報をコピーしました。", - "recent": "注釈: 最新のメールを1件のみ取得します。" + "recent": "注釈: 最新のメールを1件のみ取得します。", + "mta": "注釈: 1024未満のポートを使用するには、昇格された(root)特権が必要です。ヘルプサイドバーを参照してください。" }, "status": { "messagesent": "メッセージを送信しました: __response__", @@ -34,6 +35,7 @@ "inboxzero": "受信トレイにメールがありません", "sending": "送信中", "sendfail": "送信が失敗しました", + "parseerror": "メッセージのパースに失敗", "connecterror": "接続エラー" }, "errors": { @@ -43,6 +45,7 @@ "nosmtptransport": "SMTP転送が設定されていません。「情報」タブを参照してください", "nopayload": "送信するペイロードがありません", "fetchfail": "フォルダの受信に失敗しました: __folder__", + "parsefail": "メッセージのパースに失敗", "messageerror": "メッセージ受信エラー: __error__" } } diff --git a/social/email/package.json b/social/email/package.json index 45d3bcbd..ccfc19d5 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,12 +1,13 @@ { "name": "node-red-node-email", - "version": "1.7.11", - "description": "Node-RED nodes to send and receive simple emails", + "version": "1.8.0", + "description": "Node-RED nodes to send and receive simple emails.", "dependencies": { "imap": "^0.8.19", - "mailparser": "^2.8.1", - "nodemailer": "^6.4.11", - "poplib": "^0.1.7" + "poplib": "^0.1.7", + "mailparser": "^3.0.0", + "nodemailer": "~6.4.10", + "smtp-server": "^3.7.0" }, "repository": { "type": "git", @@ -18,7 +19,8 @@ "email", "gmail", "imap", - "pop" + "pop", + "mta" ], "node-red": { "nodes": { From ef1ebe7b449388ee4dd004fd1acde0ac2c3a7c31 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 14:32:09 +0100 Subject: [PATCH 417/456] Fix email tests and add one for MTA node --- social/email/61-email.js | 4 +-- test/social/email/61-email_spec.js | 56 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index f046a635..15371c12 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -518,7 +518,7 @@ module.exports = function(RED) { }); - function emailMtaNode(n) { + function EmailMtaNode(n) { RED.nodes.createNode(this,n); this.port = n.port; var node = this; @@ -573,6 +573,6 @@ module.exports = function(RED) { node.mta.close(); }); } - RED.nodes.registerType("e-mail mta",emailMtaNode); + RED.nodes.registerType("e-mail mta",EmailMtaNode); }; diff --git a/test/social/email/61-email_spec.js b/test/social/email/61-email_spec.js index 03caa0a6..5d4f9a56 100644 --- a/test/social/email/61-email_spec.js +++ b/test/social/email/61-email_spec.js @@ -43,6 +43,7 @@ describe('email Node', function () { id: "n1", type: "e-mail", name: "emailout", + port: 1025, wires: [ [] ] @@ -188,4 +189,59 @@ describe('email Node', function () { }) }); + + describe('email mta', function () { + + it('should catch an email send to localhost 1025', function (done) { + var flow = [{ + id: "n1", + type: "e-mail mta", + name: "emailmta", + port: 1025, + wires: [ + ["n2"] + ] + }, + { + id:"n2", + type:"helper" + }, + { + id: "n3", + type: "e-mail", + dname: "testout", + server: "localhost", + secure: false, + port: 1025, + wires: [ + [] + ] + }]; + helper.load(emailNode, flow, function () { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + var n3 = helper.getNode("n3"); + n1.should.have.property('port', 1025); + + n2.on("input", function(msg) { + //console.log("GOT",msg); + msg.should.have.a.property("payload",'Hello World\n'); + msg.should.have.a.property("topic","Test"); + msg.should.have.a.property("from",'foo@example.com'); + msg.should.have.a.property("to",'bar@example.com'); + msg.should.have.a.property("attachments"); + msg.should.have.a.property("header"); + done(); + }); + + n3.emit("input", { + payload: "Hello World", + topic: "Test", + from: "foo@example.com", + to: "bar@example.com" + }); + //done(); + }); + }); + }); }); From ffa5761756518b2787069216bca4f52730011f4a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 14:44:09 +0100 Subject: [PATCH 418/456] add smtp-package for tests --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d4ae2196..08c1e6af 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "grunt-lint-inline": "^1.0.0", "grunt-simple-mocha": "^0.4.1", "imap": "^0.8.19", - "mailparser": "^2.8.1", + "mailparser": "^3.0.0", "markdown-it": "^11.0.0", "mocha": "~6.2.3", "msgpack-lite": "^0.1.26", @@ -48,13 +48,14 @@ "ngeohash": "^0.6.3", "node-red": "^1.1.3", "node-red-node-test-helper": "~0.2.5", - "nodemailer": "^6.4.11", + "nodemailer": "^6.4.10", "poplib": "^0.1.7", "proxyquire": "^2.1.3", "pushbullet": "^2.4.0", "sentiment": "^2.1.0", "should": "^13.2.3", "sinon": "~7.5.0", + "smtp-server": "^3.7.0", "supertest": "^4.0.2", "when": "^3.7.8" }, From 6f351943cbd442a80add12f3892cd17f516eb614 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 21:33:32 +0100 Subject: [PATCH 419/456] email node - remove promises for node8 and fixup tests --- social/email/61-email.js | 58 +++++++++++++++--------------- social/email/package.json | 2 +- test/social/email/61-email_spec.js | 19 ++++++---- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/social/email/61-email.js b/social/email/61-email.js index 15371c12..272c7390 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -529,37 +529,35 @@ module.exports = function(RED) { disabledCommands: ['AUTH', 'STARTTLS'], onData: function (stream, session, callback) { - simpleParser(stream, { - skipTextToHtml: true, - skipTextLinks: true - }) - .then(parsed => { - node.status({fill:"green", shape:"dot", text:""}); - var msg = {} - msg.payload = parsed.text; - msg.topic = parsed.subject; - msg.date = parsed.date; - msg.header = {}; - parsed.headers.forEach((v, k) => {msg.header[k] = v;}); - if (parsed.html) { msg.html = parsed.html; } - if (parsed.to) { - if (typeof(parsed.to) === "string" && parsed.to.length > 0) { msg.to = parsed.to; } - else if (parsed.to.hasOwnProperty("text") && parsed.to.text.length > 0) { msg.to = parsed.to.text; } + simpleParser(stream, { skipTextToHtml:true, skipTextLinks:true }, (err, parsed) => { + if (err) { node.error(RED._("email.errors.parsefail"),err); } + else { + node.status({fill:"green", shape:"dot", text:""}); + var msg = {} + msg.payload = parsed.text; + msg.topic = parsed.subject; + msg.date = parsed.date; + msg.header = {}; + parsed.headers.forEach((v, k) => {msg.header[k] = v;}); + if (parsed.html) { msg.html = parsed.html; } + if (parsed.to) { + if (typeof(parsed.to) === "string" && parsed.to.length > 0) { msg.to = parsed.to; } + else if (parsed.to.hasOwnProperty("text") && parsed.to.text.length > 0) { msg.to = parsed.to.text; } + } + if (parsed.cc) { + if (typeof(parsed.cc) === "string" && parsed.cc.length > 0) { msg.cc = parsed.cc; } + else if (parsed.cc.hasOwnProperty("text") && parsed.cc.text.length > 0) { msg.cc = parsed.cc.text; } + } + if (parsed.cc && parsed.cc.length > 0) { msg.cc = parsed.cc; } + if (parsed.bcc && parsed.bcc.length > 0) { msg.bcc = parsed.bcc; } + if (parsed.from && parsed.from.value && parsed.from.value.length > 0) { msg.from = parsed.from.value[0].address; } + if (parsed.attachments) { msg.attachments = parsed.attachments; } + else { msg.attachments = []; } + node.send(msg); // Propagate the message down the flow + setTimeout(function() { node.status({})}, 500); } - if (parsed.cc) { - if (typeof(parsed.cc) === "string" && parsed.cc.length > 0) { msg.cc = parsed.cc; } - else if (parsed.cc.hasOwnProperty("text") && parsed.cc.text.length > 0) { msg.cc = parsed.cc.text; } - } - if (parsed.cc && parsed.cc.length > 0) { msg.cc = parsed.cc; } - if (parsed.bcc && parsed.bcc.length > 0) { msg.bcc = parsed.bcc; } - if (parsed.from && parsed.from.value && parsed.from.value.length > 0) { msg.from = parsed.from.value[0].address; } - if (parsed.attachments) { msg.attachments = parsed.attachments; } - else { msg.attachments = []; } - node.send(msg); // Propagate the message down the flow - setTimeout(function() { node.status({})}, 500); - }) - .catch(err => { node.error(RED._("email.errors.parsefail"),err); }) - .finally(callback); + callback(); + }); } }); diff --git a/social/email/package.json b/social/email/package.json index ccfc19d5..d9f4f93c 100644 --- a/social/email/package.json +++ b/social/email/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-email", - "version": "1.8.0", + "version": "1.8.1", "description": "Node-RED nodes to send and receive simple emails.", "dependencies": { "imap": "^0.8.19", diff --git a/test/social/email/61-email_spec.js b/test/social/email/61-email_spec.js index 5d4f9a56..dd2316d9 100644 --- a/test/social/email/61-email_spec.js +++ b/test/social/email/61-email_spec.js @@ -225,13 +225,18 @@ describe('email Node', function () { n2.on("input", function(msg) { //console.log("GOT",msg); - msg.should.have.a.property("payload",'Hello World\n'); - msg.should.have.a.property("topic","Test"); - msg.should.have.a.property("from",'foo@example.com'); - msg.should.have.a.property("to",'bar@example.com'); - msg.should.have.a.property("attachments"); - msg.should.have.a.property("header"); - done(); + try { + msg.should.have.a.property("payload",'Hello World\n'); + msg.should.have.a.property("topic","Test"); + msg.should.have.a.property("from",'foo@example.com'); + msg.should.have.a.property("to",'bar@example.com'); + msg.should.have.a.property("attachments"); + msg.should.have.a.property("header"); + done(); + } + catch(e) { + done(e) + } }); n3.emit("input", { From 43f7326c12fcd57b3e557a93e466343045e5fc32 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 21:33:50 +0100 Subject: [PATCH 420/456] try nyc instead of instanbul --- .travis.yml | 6 ++++-- coverall | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9e9ae945..2350eb13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,9 @@ before_install: before_script: # Remove the './node_modules/.bin:' entry, see https://github.com/travis-ci/travis-ci/issues/8813 - export PATH=`echo ${PATH} | sed -re 's,(^|:)(./)?node_modules/.bin($|:),\1,'` - - npm install -g istanbul grunt-cli coveralls + - npm install -g nyc grunt-cli coveralls - npm install node-red script: - - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage + # - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage + # - nyc --check-coverage --reporter=text --reporter=lcovonly --reporter=text grunt && rm -rf coverage + - nyc grunt && rm -rf coverage .nyc_output \ No newline at end of file diff --git a/coverall b/coverall index c4a004f8..2d3f6e21 100755 --- a/coverall +++ b/coverall @@ -1,3 +1,3 @@ # check coverage of tests... and browse report -istanbul cover ./node_modules/.bin/grunt --report lcovonly && istanbul report html +nyc --check-coverage --reporter=html grunt /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome coverage/index.html From 789abedd96bd005351c7e80a675da47b22404958 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 22:30:36 +0100 Subject: [PATCH 421/456] Update .travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2350eb13..627f909f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,5 +27,6 @@ before_script: - npm install node-red script: # - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage - # - nyc --check-coverage --reporter=text --reporter=lcovonly --reporter=text grunt && rm -rf coverage - - nyc grunt && rm -rf coverage .nyc_output \ No newline at end of file + # - nyc --check-coverage --reporter=text --reporter=lcovonly --reporter=html grunt + # - nyc grunt && rm -rf coverage .nyc_output + - nyc grunt && nyc report --reporter=text-lcov | coveralls && rm -rf coverage .nyc_output \ No newline at end of file From ae75e7f7a8b4a3a2d39222df6178a2d83ccf612f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 22:38:31 +0100 Subject: [PATCH 422/456] Update .travis.yml --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 627f909f..10bd5ea7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,10 +8,10 @@ matrix: - node_js: 12 - node_js: 10 - node_js: 8 - - python: 2.7 - language: python - before_script: pip install flake8 - script: flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics + # - python: 2.7 + # language: python + # before_script: pip install flake8 + # script: flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics - python: 3.7 language: python dist: xenial # required for Python 3.7 (travis-ci/travis-ci#9069) @@ -29,4 +29,4 @@ script: # - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage # - nyc --check-coverage --reporter=text --reporter=lcovonly --reporter=html grunt # - nyc grunt && rm -rf coverage .nyc_output - - nyc grunt && nyc report --reporter=text-lcov | coveralls && rm -rf coverage .nyc_output \ No newline at end of file + - nyc grunt && nyc report --reporter=text-lcov | coverallss From eddeef9630fee3dcc1d3eddd02b654b43696d3ce Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Oct 2020 22:42:25 +0100 Subject: [PATCH 423/456] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10bd5ea7..e7d7f89c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,4 +29,4 @@ script: # - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage # - nyc --check-coverage --reporter=text --reporter=lcovonly --reporter=html grunt # - nyc grunt && rm -rf coverage .nyc_output - - nyc grunt && nyc report --reporter=text-lcov | coverallss + - nyc grunt && nyc report --reporter=text-lcov | coveralls From 770ad94e95c8464b92d82a34c43f1daf19f35649 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Fri, 23 Oct 2020 16:12:49 +0100 Subject: [PATCH 424/456] Add Japanese translations for Sense HAT node (#704) --- hardware/sensehat/locales/en-US/sensehat.json | 12 +++++++++++ hardware/sensehat/locales/ja/sensehat.json | 12 +++++++++++ hardware/sensehat/sensehat.html | 20 +++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 hardware/sensehat/locales/en-US/sensehat.json create mode 100644 hardware/sensehat/locales/ja/sensehat.json diff --git a/hardware/sensehat/locales/en-US/sensehat.json b/hardware/sensehat/locales/en-US/sensehat.json new file mode 100644 index 00000000..40656db3 --- /dev/null +++ b/hardware/sensehat/locales/en-US/sensehat.json @@ -0,0 +1,12 @@ +{ + "sensehat": { + "label": { + "outputs": "Outputs", + "motionEvents": "Motion events", + "motionEventsExamples": "accelerometer, gyroscope, magnetometer, compass", + "environmentEvents": "Environment events", + "environmentEventsExamples": "temperature, humidity, pressure", + "joystickEvents": "Joystick events" + } + } +} \ No newline at end of file diff --git a/hardware/sensehat/locales/ja/sensehat.json b/hardware/sensehat/locales/ja/sensehat.json new file mode 100644 index 00000000..8083b49e --- /dev/null +++ b/hardware/sensehat/locales/ja/sensehat.json @@ -0,0 +1,12 @@ +{ + "sensehat": { + "label": { + "outputs": "出力", + "motionEvents": "モーションイベント", + "motionEventsExamples": "加速度計、ジャイロスコープ、磁力計、方位計", + "environmentEvents": "環境イベント", + "environmentEventsExamples": "温度、湿度、気圧", + "joystickEvents": "ジョイスティックイベント" + } + } +} \ No newline at end of file diff --git a/hardware/sensehat/sensehat.html b/hardware/sensehat/sensehat.html index 25091b7a..41c42dd6 100644 --- a/hardware/sensehat/sensehat.html +++ b/hardware/sensehat/sensehat.html @@ -1,30 +1,30 @@ From 3b7fb0aa954afeaf551ab11047147d632dce6317 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 24 Oct 2020 15:02:45 +0100 Subject: [PATCH 425/456] tidy up xmpp node --- .gitignore | 2 + social/xmpp/92-xmpp.html | 2 +- social/xmpp/92-xmpp.js | 197 +++++++++++++++++++++++++++------------ social/xmpp/package.json | 2 +- 4 files changed, 139 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index e6623f64..729dabf3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ puball.sh setenv.sh /.project package-lock.json +social/xmpp/92-xmpp.old +*.tgz diff --git a/social/xmpp/92-xmpp.html b/social/xmpp/92-xmpp.html index 3de2bb25..83d653e4 100644 --- a/social/xmpp/92-xmpp.html +++ b/social/xmpp/92-xmpp.html @@ -109,7 +109,7 @@ + + + + diff --git a/utility/annotate-image/annotate.js b/utility/annotate-image/annotate.js new file mode 100644 index 00000000..ea5edb75 --- /dev/null +++ b/utility/annotate-image/annotate.js @@ -0,0 +1,155 @@ +module.exports = function(RED) { + "use strict"; + const pureimage = require("pureimage"); + const Readable = require("stream").Readable; + const Writable = require("stream").Writable; + const path = require("path"); + + let fontLoaded = false; + function loadFont() { + if (!fontLoaded) { + const fnt = pureimage.registerFont(path.join(__dirname,'./SourceSansPro-Regular.ttf'),'Source Sans Pro'); + fnt.load(); + fontLoaded = true; + } + } + + function AnnotateNode(n) { + RED.nodes.createNode(this,n); + var node = this; + const defaultFill = n.fill || ""; + const defaultStroke = n.stroke || "#ffC000"; + const defaultLineWidth = parseInt(n.lineWidth) || 5; + const defaultFontSize = n.fontSize || 24; + const defaultFontColor = n.fontColor || "#ffC000" + loadFont(); + + this.on("input", function(msg) { + if (Buffer.isBuffer(msg.payload)) { + if (msg.payload[0] !== 0xFF || msg.payload[1] !== 0xD8) { + node.error("Not a JPEG image",msg); + } else if (Array.isArray(msg.annotations) && msg.annotations.length > 0) { + const stream = new Readable(); + stream.push(msg.payload); + stream.push(null); + pureimage.decodeJPEGFromStream(stream).then(img => { + const c = pureimage.make(img.width, img.height); + const ctx = c.getContext('2d'); + ctx.drawImage(img,0,0,img.width,img.height); + + ctx.lineJoin = 'bevel'; + + msg.annotations.forEach(function(annotation) { + ctx.fillStyle = annotation.fill || defaultFill; + ctx.strokeStyle = annotation.stroke || defaultStroke; + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.lineJoin = 'bevel'; + let x,y,r,w,h; + switch(annotation.type) { + case 'rect': + if (annotation.bbox) { + x = annotation.bbox[0] + y = annotation.bbox[1] + w = annotation.bbox[2] + h = annotation.bbox[3] + } else { + x = annotation.x + y = annotation.y + w = annotation.w + h = annotation.h + } + + if (x < 0) { + w += x; + x = 0; + } + if (y < 0) { + h += y; + y = 0; + } + ctx.beginPath(); + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.rect(x,y,w,h); + ctx.closePath(); + ctx.stroke(); + + if (annotation.label) { + ctx.font = `${annotation.fontSize || defaultFontSize}pt 'Source Sans Pro'`; + ctx.fillStyle = annotation.fontColor || defaultFontColor; + ctx.textBaseline = "top"; + ctx.textAlign = "left"; + ctx.fillText(annotation.label, x+2,y) + } + break; + case 'circle': + if (annotation.bbox) { + x = annotation.bbox[0] + annotation.bbox[2]/2 + y = annotation.bbox[1] + annotation.bbox[3]/2 + r = Math.min(annotation.bbox[2],annotation.bbox[3])/2; + } else { + x = annotation.x + y = annotation.y + r = annotation.r; + } + ctx.beginPath(); + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.arc(x,y,r,0,Math.PI*2); + ctx.closePath(); + ctx.stroke(); + if (annotation.label) { + ctx.font = `${annotation.fontSize || defaultFontSize}pt 'Source Sans Pro'`; + ctx.fillStyle = annotation.fontColor || defaultFontColor; + ctx.textBaseline = "middle"; + ctx.textAlign = "center"; + ctx.fillText(annotation.label, x+2,y) + } + break; + } + }); + const bufferOutput = getWritableBuffer(); + pureimage.encodeJPEGToStream(c,bufferOutput.stream,90).then(() => { + msg.payload = bufferOutput.getBuffer(); + node.send(msg); + }) + }).catch(err => { + node.error(err,msg); + }) + } else { + // No annotations to make - send the message on + node.send(msg); + } + } else { + node.error("Payload not a Buffer",msg) + } + return msg; + }); + } + RED.nodes.registerType("annotate-image",AnnotateNode); + + + + function getWritableBuffer() { + var currentSize = 0; + var buffer = null; + const stream = new Writable({ + write(chunk, encoding, callback) { + if (!buffer) { + buffer = Buffer.from(chunk); + } else { + var newBuffer = Buffer.allocUnsafe(currentSize + chunk.length); + buffer.copy(newBuffer); + chunk.copy(newBuffer,currentSize); + buffer = newBuffer; + } + currentSize += chunk.length + callback(); + } + }); + return { + stream: stream, + getBuffer: function() { + return buffer; + } + } + } +} diff --git a/utility/annotate-image/package.json b/utility/annotate-image/package.json new file mode 100644 index 00000000..48b164f3 --- /dev/null +++ b/utility/annotate-image/package.json @@ -0,0 +1,26 @@ +{ + "name": "node-red-node-annotate-image", + "version": "0.1.0", + "description": "A Node-RED node that can annotate an image", + "dependencies": { + "pureimage": "^0.2.5" + }, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/iamge-annotate" + }, + "license": "Apache-2.0", + "keywords": [ + "node-red" + ], + "node-red": { + "nodes": { + "annotate": "annotate.js" + } + }, + "contributors": [ + { + "name": "Nick O'Leary" + } + ] +} \ No newline at end of file From 3d3841e65189f3b5f0077ce89f041636c6194206 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 29 Oct 2020 22:47:30 +0000 Subject: [PATCH 431/456] Fix license --- utility/annotate-image/LICENSE | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utility/annotate-image/LICENSE b/utility/annotate-image/LICENSE index f5b60114..335c35ff 100644 --- a/utility/annotate-image/LICENSE +++ b/utility/annotate-image/LICENSE @@ -1,5 +1,4 @@ -Copyright 2016 JS Foundation and other contributors, https://js.foundation/ -Copyright 2013-2016 IBM Corp. +Copyright 2020 OpenJS Foundation and other contributors, https://openjsf.org/ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 056836d1e5421335e4723ad53fddf04e892edd6e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 30 Oct 2020 09:51:03 +0000 Subject: [PATCH 432/456] Tidy up edit dialog --- utility/annotate-image/README.md | 4 ++-- utility/annotate-image/annotate.html | 35 ++++++++++++++-------------- utility/annotate-image/annotate.js | 5 ++++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/utility/annotate-image/README.md b/utility/annotate-image/README.md index d541563a..de17bc47 100644 --- a/utility/annotate-image/README.md +++ b/utility/annotate-image/README.md @@ -31,9 +31,9 @@ Each annotation is an object with the following properties: - `r` (*number*) : the radius of a `circle` annotation - `bbox` (*array*) : this can be used instead of `x`, `y`, `w`, `h` and `r`. It should be an array of four values giving the bounding box of the annotation: - `[x, y, w, h]`. + `[x, y, w, h]`. If this property is set and `type` is not set, it will default to `rect`. - `label` (*string*) : an optional piece of text to label the annotation with - - `stroke` (*string*) : the color of the annotation. Default: `#ffC000` + - `stroke` (*string*) : the line color of the annotation. Default: `#ffC000` - `lineWidth` (*number*) : the stroke width used to draw the annotation. Default: `5` - `fontSize` (*number*) : the font size to use for the label. Default: `24` - `fontColor` (*string*) : the color of the font to use for the label. Default: `#ffC000` diff --git a/utility/annotate-image/annotate.html b/utility/annotate-image/annotate.html index efc18e25..f87a76b6 100644 --- a/utility/annotate-image/annotate.html +++ b/utility/annotate-image/annotate.html @@ -1,23 +1,23 @@ - - - - diff --git a/utility/exif/94-exif.js b/utility/exif/94-exif.js index 93ba0b3b..dbddba9f 100644 --- a/utility/exif/94-exif.js +++ b/utility/exif/94-exif.js @@ -11,6 +11,7 @@ module.exports = function(RED) { function ExifNode(n) { RED.nodes.createNode(this,n); + this.property = n.property || "payload"; var node = this; /*** @@ -20,7 +21,7 @@ module.exports = function(RED) { * Assumes that the msg object will always have exifData available as msg.exif. * Assume that the GPS data saved into Exif provides a valid value */ - function addMsgLocationDataFromExifGPSData(msg) { + function addMsgLocationDataFromExifGPSData(msg,val) { var gpsData = msg.exif.gps; // declaring variable purely to make checks more readable if (gpsData.GPSAltitude) { /* istanbul ignore else */ @@ -31,14 +32,12 @@ module.exports = function(RED) { // The data provided in Exif is in degrees, minutes, seconds, this is to be converted into a single floating point degree if (gpsData.GPSLatitude.length === 3) { // OK to convert latitude if (gpsData.GPSLongitude.length === 3) { // OK to convert longitude - var latitude = convertDegreesMinutesSecondsToDecimals(gpsData.GPSLatitude[0], gpsData.GPSLatitude[1], gpsData.GPSLatitude[2]); latitude = Math.round(latitude * 100000)/100000; // 5dp is approx 1m resolution... // (N)orth means positive latitude, (S)outh means negative latitude if (gpsData.GPSLatitudeRef.toString() === 'S' || gpsData.GPSLatitudeRef.toString() === 's') { latitude = latitude * -1; } - var longitude = convertDegreesMinutesSecondsToDecimals(gpsData.GPSLongitude[0], gpsData.GPSLongitude[1], gpsData.GPSLongitude[2]); longitude = Math.round(longitude * 100000)/100000; // 5dp is approx 1m resolution... // (E)ast means positive longitude, (W)est means negative longitude @@ -49,7 +48,6 @@ module.exports = function(RED) { if (!msg.location) { msg.location = {}; } msg.location.lat = latitude; msg.location.lon = longitude; - return; } else { node.log("Invalid longitude data, no location information has been added to the message."); @@ -62,13 +60,32 @@ module.exports = function(RED) { else { node.log("The location of this image cannot be determined safely so no location information has been added to the message."); } + msg.location.arc = { + ranges: [500,1000,2000], + pan: gpsData.GPSImgDirection, + fov: (2 * Math.atan(36 / (2 * msg.exif.exif.FocalLengthIn35mmFormat)) * 180 / Math.PI), + color: '#910000' + } + msg.location.icon = "fa-camera"; + var na; + if (val.hasOwnProperty("name")) { na = val.name; } + else if (msg.hasOwnProperty("filename")) { na = msg.filename.split('/').pop(); } + else { na = msg.exif.image.Make+"_"+msg.exif.image.ModifyDate; } + msg.location.name = na; + msg.location.popup = '' } this.on("input", function(msg) { try { - if (msg.payload) { - if (Buffer.isBuffer(msg.payload)) { - new ExifImage({ image : msg.payload }, function (error, exifData) { + var value = RED.util.getMessageProperty(msg,node.property); + if (value !== undefined) { + if (typeof value === "string") { // it must be a base64 encoded inline image type + if (value.indexOf('data:image') !== -1) { + value = new Buffer.from(value.replace(/^data:image\/[a-z]+;base64,/, ""), 'base64'); + } + } + if (Buffer.isBuffer(value)) { // or a proper jpg buffer + new ExifImage({ image:value }, function (error, exifData) { if (error) { node.log(error.toString()); } @@ -76,7 +93,7 @@ module.exports = function(RED) { if (exifData) { msg.exif = exifData; if ((exifData.hasOwnProperty("gps")) && (Object.keys(exifData.gps).length !== 0)) { - addMsgLocationDataFromExifGPSData(msg); + addMsgLocationDataFromExifGPSData(msg,value); } //else { node.log("The incoming image did not contain Exif GPS data."); } } @@ -93,7 +110,7 @@ module.exports = function(RED) { } } else { - node.error("No payload received, the Exif node cannot proceed, no messages sent.",msg); + node.warn("No input received, the Exif node cannot proceed, no messages sent.",msg); return; } } diff --git a/utility/exif/package.json b/utility/exif/package.json index fec3db6c..5eb5e30b 100644 --- a/utility/exif/package.json +++ b/utility/exif/package.json @@ -1,23 +1,30 @@ { - "name" : "node-red-node-exif", - "version" : "0.0.7", - "description" : "A Node-RED node that extracts Exif information from JPEG image buffers.", - "dependencies" : { - "exif": "0.4.0" + "name": "node-red-node-exif", + "version": "0.1.0", + "description": "A Node-RED node that extracts Exif information from JPEG image buffers.", + "dependencies": { + "exif": "^0.6.0" }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/tree/master/utility/exif" + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/exif" }, "license": "Apache-2.0", - "keywords": [ "node-red", "exif"], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "exif" + ], + "node-red": { + "nodes": { "exif": "94-exif.js" } }, "contributors": [ - {"name": "Dave Conway-Jones"}, - {"name": "Zoltan Balogh"} + { + "name": "Dave Conway-Jones" + }, + { + "name": "Zoltan Balogh" + } ] } From c61e8b60b78c1159e1de209fea9bf0a1f1252984 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 7 Dec 2020 17:34:44 +0000 Subject: [PATCH 446/456] Add dedicated Worldmap mode better handling of other types --- utility/exif/94-exif.html | 17 +++++++++++++++++ utility/exif/94-exif.js | 18 ++++++++++++++++-- utility/exif/package.json | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/utility/exif/94-exif.html b/utility/exif/94-exif.html index 47c79101..3f7d99ac 100644 --- a/utility/exif/94-exif.html +++ b/utility/exif/94-exif.html @@ -1,6 +1,13 @@ diff --git a/utility/exif/94-exif.js b/utility/exif/94-exif.js index dbddba9f..0b1da20f 100644 --- a/utility/exif/94-exif.js +++ b/utility/exif/94-exif.js @@ -11,7 +11,9 @@ module.exports = function(RED) { function ExifNode(n) { RED.nodes.createNode(this,n); - this.property = n.property || "payload"; + this.mode = n.mode || "normal"; + if (this.mode === "worldmap") { this.property = "payload.content"; } + else { this.property = n.property || "payload"; } var node = this; /*** @@ -72,10 +74,12 @@ module.exports = function(RED) { else if (msg.hasOwnProperty("filename")) { na = msg.filename.split('/').pop(); } else { na = msg.exif.image.Make+"_"+msg.exif.image.ModifyDate; } msg.location.name = na; + msg.location.layer = "Images"; msg.location.popup = '' } this.on("input", function(msg) { + if (node.mode === "worldmap" && (msg.payload.action !== "file" || msg.payload.type.indexOf("image") === -1)) { return; } // in case worldmap-in not filtered. try { var value = RED.util.getMessageProperty(msg,node.property); if (value !== undefined) { @@ -87,7 +91,13 @@ module.exports = function(RED) { if (Buffer.isBuffer(value)) { // or a proper jpg buffer new ExifImage({ image:value }, function (error, exifData) { if (error) { - node.log(error.toString()); + if (node.mode !== "worldmap") { + node.log(error.toString()); + } + else { + msg.location = {name:msg.payload.name, lat:msg.payload.lat, lon:msg.payload.lon, layer:"Images", icon:"fa-camera", draggable:true}; + msg.location.popup = '
      '; + } } else { if (exifData) { @@ -101,6 +111,10 @@ module.exports = function(RED) { node.warn("The incoming image did not contain any Exif data, nothing to do."); } } + if (node.mode === "worldmap") { + msg.payload = msg.location; + delete msg.location; + } node.send(msg); }); } diff --git a/utility/exif/package.json b/utility/exif/package.json index 5eb5e30b..639bbcef 100644 --- a/utility/exif/package.json +++ b/utility/exif/package.json @@ -1,6 +1,6 @@ { "name": "node-red-node-exif", - "version": "0.1.0", + "version": "0.2.0", "description": "A Node-RED node that extracts Exif information from JPEG image buffers.", "dependencies": { "exif": "^0.6.0" From 8130f8c007a59216dc680416fed108c59b2bb9fb Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 12 Dec 2020 14:26:31 +0000 Subject: [PATCH 447/456] add extra gpoio support to neopixel node --- hardware/neopixel/neopix.py | 2 ++ hardware/neopixel/neopixel.html | 12 ++++++++++-- hardware/neopixel/neopixel.js | 5 ++++- hardware/neopixel/package.json | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/hardware/neopixel/neopix.py b/hardware/neopixel/neopix.py index 83756f0f..2cd53f19 100755 --- a/hardware/neopixel/neopix.py +++ b/hardware/neopixel/neopix.py @@ -47,6 +47,8 @@ MODE = sys.argv[3] LED_BRIGHTNESS = min(255,int(max(0,float(sys.argv[4])) * 255 / 100)) if (sys.argv[5].lower() != "true"): LED_GAMMA = range(256) +LED_CHANNEL = int(sys.argv[6]) +LED_PIN = int(sys.argv[7]) def getRGBfromI(RGBint): blue = RGBint & 255 diff --git a/hardware/neopixel/neopixel.html b/hardware/neopixel/neopixel.html index 794599df..ca28a4bd 100644 --- a/hardware/neopixel/neopixel.html +++ b/hardware/neopixel/neopixel.html @@ -1,8 +1,15 @@ - - diff --git a/hardware/neopixel/package.json b/hardware/neopixel/package.json index 05d0fbf8..6a1e65eb 100644 --- a/hardware/neopixel/package.json +++ b/hardware/neopixel/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-pi-neopixel", - "version" : "0.1.0", + "version" : "0.1.1", "description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.", "dependencies" : { }, From 9eb031e912bad745b5d52d9802f0d53eff61a592 Mon Sep 17 00:00:00 2001 From: juggledad Date: Sun, 13 Dec 2020 07:58:13 -0500 Subject: [PATCH 449/456] Update node-red-random to add option to dynamically pass in 'To' and 'From' (#707) * Add option to dynamically pass in 'From' and 'To' - fixed bug when 'From' was greater than 'To' by flipping the two * Set initial values of 'From' and 'To to "" to allow dynamic overriding them --- function/random/README.md | 2 + function/random/locales/en-US/random.html | 9 +- function/random/random.html | 4 +- function/random/random.js | 74 +++++- test/function/random/random_spec.js | 273 ++++++++++++++++++---- 5 files changed, 303 insertions(+), 59 deletions(-) diff --git a/function/random/README.md b/function/random/README.md index 0713d08a..91710a84 100644 --- a/function/random/README.md +++ b/function/random/README.md @@ -19,4 +19,6 @@ If set to return an integer it can include both the low and high values. If set to return a floating point value it will be from the low value, up to, but **not** including the high value. `min <= n < max` - so selecting 1 to 6 will return values 1 <= n < 6 . +You can dynamically pass in the 'From' and 'To' values to the node using msg.to and/or msg.from. **NOTE:** hard coded values in the node **always take precedence**. + **Note:** This returns numbers - objects of type **number**. diff --git a/function/random/locales/en-US/random.html b/function/random/locales/en-US/random.html index dbf239b4..0bc93b13 100644 --- a/function/random/locales/en-US/random.html +++ b/function/random/locales/en-US/random.html @@ -1,7 +1,14 @@ diff --git a/function/random/random.html b/function/random/random.html index bf1ae44a..7443615f 100644 --- a/function/random/random.html +++ b/function/random/random.html @@ -31,8 +31,8 @@ color:"#E2D96E", defaults: { name: {value:""}, - low: {value:"1"}, - high: {value:"10"}, + low: {value: 1,validate:function(v) { return !isNaN(v) || v.length === 0;} }, + high: {value: 10,validate:function(v) { return !isNaN(v) || v.length === 0;} }, inte: {value:"true"}, property: {value:"payload",required:true} }, diff --git a/function/random/random.js b/function/random/random.js index dac7b0b9..2140717d 100644 --- a/function/random/random.js +++ b/function/random/random.js @@ -3,21 +3,73 @@ module.exports = function(RED) { "use strict"; function RandomNode(n) { RED.nodes.createNode(this,n); - this.low = Number(n.low || 1); - this.high = Number(n.high || 10); + + this.low = n.low + this.high = n.high this.inte = n.inte || false; this.property = n.property||"payload"; var node = this; + var tmp = {}; + this.on("input", function(msg) { - var value; - if (node.inte == "true" || node.inte === true) { - value = Math.round(Math.random() * (node.high - node.low + 1) + node.low - 0.5); - } - else { - value = Math.random() * (node.high - node.low) + node.low; - } - RED.util.setMessageProperty(msg,node.property,value); - node.send(msg); + + tmp.low = 1 // set this as the default low value + tmp.low_e = "" + if (node.low) { // if the the node has a value use it + tmp.low = node.low + } else if ('from' in msg) { // else see if a 'from' is in the msg + if (Number(msg.from)) { // if it is, and is a number, use it + tmp.low = Number(msg.from); + } else { // otherwise setup NaN error + tmp.low = NaN; + tmp.low_e = " From: " + msg.from; // setup to show bad incoming msg.from + } + } + + tmp.high = 10 // set this as the default high value + tmp.high_e = ""; + if (node.high) { // if the the node has a value use it + tmp.high = node.high + } else if ('to' in msg) { // else see if a 'to' is in the msg + if (Number(msg.to)) { // if it is, and is a number, use it + tmp.high = Number(msg.to); + } else { // otherwise setup NaN error + tmp.high = NaN + tmp.high_e = " To: " + msg.to // setup to show bad incoming msg.to + } + } + + // if tmp.low or high are not numbers, send an error msg with bad values + if ( (isNaN(tmp.low)) || (isNaN(tmp.high)) ) { + this.error("Random: one of the input values is not a number. " + tmp.low_e + tmp.high_e); + } else { + // at this point we have valid values so now to generate the random number! + + // flip the values if low > high so random will work + var value = 0; + if (tmp.low > tmp.high) { + value = tmp.low + tmp.low = tmp.high + tmp.high = value + } + + // if returning an integer, do a math.ceil() on the low value and a + // Math.floor()high value before generate the random number. This must be + // done to insure the rounding doesn't round up if using something like 4.7 + // which would end up with 5 + if ( (node.inte == "true") || (node.inte === true) ) { + tmp.low = Math.ceil(tmp.low); + tmp.high = Math.floor(tmp.high); + // use this to round integers + value = Math.round(Math.random() * (tmp.high - tmp.low + 1) + tmp.low - 0.5); + } else { + // use this to round floats + value = (Math.random() * (tmp.high - tmp.low)) + tmp.low; + } + + RED.util.setMessageProperty(msg,node.property,value); + node.send(msg); + } }); } RED.nodes.registerType("random",RandomNode); diff --git a/test/function/random/random_spec.js b/test/function/random/random_spec.js index ffd119f2..d352c12a 100644 --- a/test/function/random/random_spec.js +++ b/test/function/random/random_spec.js @@ -15,74 +15,257 @@ describe('random node', function() { helper.stopServer(done); }); }); + +// ============================================================ - it("should be loaded with correct defaults", function(done) { - var flow = [{"id":"n1", "type":"random", "name":"random1", "wires":[[]]}]; - helper.load(testNode, flow, function() { - var n1 = helper.getNode("n1"); - //console.log(n1); - n1.should.have.property("low", 1); - n1.should.have.property("high", 10); - n1.should.have.property("inte", false); - done(); - }); - }); - - it('should output an integer between -3 and 3', function(done) { - var flow = [{"id":"n1", "type":"random", low:-3, high:3, inte:true, wires:[["n2"]] }, + it ("Test i1 (integer) - DEFAULT no overrides defaults to 1 and 10", function(done) { + var flow = [{id:"n1", type:"random", low: "" , high:"" , inte:true, wires:[["n2"]] }, {id:"n2", type:"helper"} ]; - helper.load(testNode, flow, function() { + helper.load(testNode, flow, function() { var n1 = helper.getNode("n1"); var n2 = helper.getNode("n2"); - var c = 0; - n2.on("input", function(msg) { - if (c === 0) { - msg.should.have.a.property("payload"); - msg.payload.should.be.approximately(0,3); - msg.payload.toString().indexOf(".").should.equal(-1); - done(); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(1,10); + msg.payload.toString().indexOf(".").should.equal(-1); // see if it's really an integer and not a float... + done(); } + catch(err) { done(err); } }); - n1.emit("input", {payload:"a"}); + n1.emit("input", {"test":"Test i1"}); }); }); - it('should output an float between 20 and 30', function(done) { - var flow = [{"id":"n1", "type":"random", low:20, high:30, inte:false, wires:[["n2"]] }, + it ("Test f1 (float) - DEFAULT no overrides defaults to 1 and 10", function(done) { + var flow = [{id:"n1", type:"random", low:"" , high:"" , inte:false, wires:[["n2"]] }, {id:"n2", type:"helper"} ]; - helper.load(testNode, flow, function() { + helper.load(testNode, flow, function() { var n1 = helper.getNode("n1"); var n2 = helper.getNode("n2"); - var c = 0; - n2.on("input", function(msg) { - if (c === 0) { - msg.should.have.a.property("payload"); - msg.payload.should.be.approximately(25,5); - msg.payload.toString().indexOf(".").should.not.equal(-1); - done(); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(1.0,9.999); + //msg.payload.toString().indexOf(".").should.not.equal(-1); + done(); } + catch(err) { done(err); } }); - n1.emit("input", {payload:"a"}); + n1.emit("input", {"test":"Test f-1"}); }); }); - it('should output an integer between -3 and 3 on chosen property - foo', function(done) { - var flow = [{"id":"n1", "type":"random", property:"foo", low:-3, high:3, inte:true, wires:[["n2"]] }, +// ============================================================ + + it ("Test i2 (integer) - FLIP node From = 3 To = -3", function(done) { + var flow = [{id:"n1", type:"random", low: 3, high: -3, inte:true, wires:[["n2"]] }, {id:"n2", type:"helper"} ]; - helper.load(testNode, flow, function() { + helper.load(testNode, flow, function() { var n1 = helper.getNode("n1"); var n2 = helper.getNode("n2"); - var c = 0; - n2.on("input", function(msg) { - if (c === 0) { - msg.should.have.a.property("foo"); - msg.foo.should.be.approximately(0,3); - msg.foo.toString().indexOf(".").should.equal(-1); - done(); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(-3,3); + msg.payload.toString().indexOf(".").should.equal(-1); // slightly dumb test to see if it really is an integer and not a float... + done(); } + catch(err) { done(err); } }); - n1.emit("input", {payload:"a"}); + n1.emit("input", {"test":"Test i2"}); }); }); + it ("Test f2 (float) - FLIP node From = 3 To = -3", function(done) { + var flow = [{id:"n1", type:"random", low: 3, high: -3, inte:false, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(-3.0,3.0); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test f2"}); + }); + }); + +// ============================================================ + + it ("Test i3 (integer) - values in msg From = 2 To = '5', node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:true, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(2,5); + msg.payload.toString().indexOf(".").should.equal(-1); // slightly dumb test to see if it really is an integer and not a float... + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test i3", "from":2, "to":'5'}); + }); + }); + + it ("Test f3 (float) - values in msg From = 2 To = '5', node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:false, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(2.0,5.0); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test f3", "from":2, "to":'5'}); + }); + }); + + + // ============================================================ + + it ("Test i4 (integer) - value in msg From = 2, node From = 5 To = '' - node overides From = 5 To defaults to 10", function(done) { + var flow = [{id:"n1", type:"random", low: 5, high:"", inte:true, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(5,10); + msg.payload.toString().indexOf(".").should.equal(-1); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test i4", "from": 2}); + }); + }); + + it ("Test f4 (float) - value in msg From = 2, node From = 5 To = '' - node wins 'To' defaults to 10", function(done) { + var flow = [{id:"n1", type:"random", low: 5, high:"", inte:false, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(5.0,10.0); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test f4", "from": 2}); + }); + }); + +// ============================================================ + + it ("Test i5 (integer) - msg From = '6' To = '9' node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:true, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(6,9); + msg.payload.toString().indexOf(".").should.equal(-1); // slightly dumb test to see if it really is an integer and not a float... + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test i5", "from": '6', "to": '9'}); + }); + }); + + it ("Test f5 (float) - msg From = '6' To = '9' node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:false, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(6.0,9.0); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test f5", "from": '6', "to": '9'}); + }); + }); + +// ============================================================ + + it ("Test i6 (integer) - msg From = 2.4 To = '7.3' node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:true, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(2,7); + msg.payload.toString().indexOf(".").should.equal(-1); // slightly dumb test to see if it really is an integer and not a float... + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test i6", "from": 2.4, "to": '7.3'}); + }); + }); + + it ("Test f6 (float) - msg From = 2.4 To = '7.3' node no entries", function(done) { + var flow = [{id:"n1", type:"random", low: "", high: "", inte:false, wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(testNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + //console.log(msg); + msg.should.have.a.property("payload"); + msg.payload.should.be.within(2.4,7.3); + done(); + } + catch(err) { done(err); } + }); + n1.emit("input", {"test":"Test f6", "from": 2.4, "to": '7.3'}); + }); + }); + +// ============================================================ + + + }); From 354370e6e0f8f3b05b3af52dcbf7418ceaad057f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 13 Dec 2020 17:38:17 +0000 Subject: [PATCH 450/456] Tidy up random node info. --- function/random/locales/en-US/random.html | 20 +++++++++++--------- function/random/package.json | 7 +++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/function/random/locales/en-US/random.html b/function/random/locales/en-US/random.html index 0bc93b13..9c18b0da 100644 --- a/function/random/locales/en-US/random.html +++ b/function/random/locales/en-US/random.html @@ -1,14 +1,16 @@ diff --git a/function/random/package.json b/function/random/package.json index 43965ece..03075efb 100644 --- a/function/random/package.json +++ b/function/random/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-random", - "version" : "0.2.0", + "version" : "0.3.0", "description" : "A Node-RED node that when triggered generates a random number between two values.", "dependencies" : { }, @@ -19,5 +19,8 @@ "name": "Dave Conway-Jones", "email": "ceejay@vnet.ibm.com", "url": "http://nodered.org" - } + }, + "contributors": [ + {"name": "@zenofmud"} + ] } From cbcb3036be7988bab75a3371fd78c891352aecb3 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 14 Dec 2020 22:35:39 +0900 Subject: [PATCH 451/456] Add Japanese translations for random node (#724) --- function/random/locales/ja/random.html | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/function/random/locales/ja/random.html b/function/random/locales/ja/random.html index ffb9b2c0..5b09fea8 100644 --- a/function/random/locales/ja/random.html +++ b/function/random/locales/ja/random.html @@ -1,7 +1,16 @@ From fa2ea96e6767b5d364e6c3e974a08e6d4e5f5127 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 17 Dec 2020 17:26:32 +0900 Subject: [PATCH 452/456] Add Japanese translations for sqlite node (#725) * Add Japanese translations for sqlite node * Improve Japanese translations for sqlite node * Restructure message catalog --- storage/sqlite/locales/en-US/sqlite.html | 28 +++++++++++ storage/sqlite/locales/en-US/sqlite.json | 20 ++++++++ storage/sqlite/locales/ja/sqlite.html | 26 ++++++++++ storage/sqlite/locales/ja/sqlite.json | 20 ++++++++ storage/sqlite/sqlite.html | 62 ++++++------------------ 5 files changed, 109 insertions(+), 47 deletions(-) create mode 100644 storage/sqlite/locales/en-US/sqlite.html create mode 100644 storage/sqlite/locales/en-US/sqlite.json create mode 100644 storage/sqlite/locales/ja/sqlite.html create mode 100644 storage/sqlite/locales/ja/sqlite.json diff --git a/storage/sqlite/locales/en-US/sqlite.html b/storage/sqlite/locales/en-US/sqlite.html new file mode 100644 index 00000000..7aedae62 --- /dev/null +++ b/storage/sqlite/locales/en-US/sqlite.html @@ -0,0 +1,28 @@ + + + diff --git a/storage/sqlite/locales/en-US/sqlite.json b/storage/sqlite/locales/en-US/sqlite.json new file mode 100644 index 00000000..059f1194 --- /dev/null +++ b/storage/sqlite/locales/en-US/sqlite.json @@ -0,0 +1,20 @@ +{ + "sqlite": { + "label": { + "database": "Database", + "sqlQuery": "SQL Query", + "viaMsgTopic": "Via msg.topic", + "fixedStatement": "Fixed Statement", + "preparedStatement": "Prepared Statement", + "batchWithoutResponse": "Batch without response", + "sqlStatement": "SQL Statement", + "mode": "Mode", + "readWriteCreate": "Read-Write-Create", + "readWrite": "Read-Write", + "readOnly": "Read-Only" + }, + "tips": { + "memoryDb": "Note: Setting the database name to :memory: will create a non-persistant in memory database." + } + } +} diff --git a/storage/sqlite/locales/ja/sqlite.html b/storage/sqlite/locales/ja/sqlite.html new file mode 100644 index 00000000..5c6e8da1 --- /dev/null +++ b/storage/sqlite/locales/ja/sqlite.html @@ -0,0 +1,26 @@ + + + diff --git a/storage/sqlite/locales/ja/sqlite.json b/storage/sqlite/locales/ja/sqlite.json new file mode 100644 index 00000000..dda91077 --- /dev/null +++ b/storage/sqlite/locales/ja/sqlite.json @@ -0,0 +1,20 @@ +{ + "sqlite": { + "label": { + "database": "データベース", + "sqlQuery": "SQLクエリ", + "viaMsgTopic": "msg.topic経由", + "fixedStatement": "固定文", + "preparedStatement": "事前定義文", + "batchWithoutResponse": "一括(応答なし)", + "sqlStatement": "SQL文", + "mode": "モード", + "readWriteCreate": "読み取り-書き込み-作成", + "readWrite": "読み取り-書き込み", + "readOnly": "読み取りのみ" + }, + "tips": { + "memoryDb": "注釈: データベース名に :memory: を設定すると、非永続的なメモリデータベースを作成します。" + } + } +} diff --git a/storage/sqlite/sqlite.html b/storage/sqlite/sqlite.html index ceeca265..faca8ab7 100644 --- a/storage/sqlite/sqlite.html +++ b/storage/sqlite/sqlite.html @@ -1,19 +1,17 @@ - - - - - - - - -