From d9996f0470cef477999e747bc90b645a4c37717c Mon Sep 17 00:00:00 2001 From: Tony Kovanen Date: Sun, 7 Dec 2014 05:56:08 +0200 Subject: [PATCH 001/494] Added tests for volatile --- test/socket.io.js | 206 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 2 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index 8e66564ab2..87293ea6a5 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -447,7 +447,7 @@ describe('socket.io', function(){ var c1 = client(srv, '/'); var c2 = client(srv, '/abc'); }); - + it('should be equivalent for "" and "/" on client', function(done){ var srv = http(); var sio = io(srv); @@ -456,7 +456,7 @@ describe('socket.io', function(){ }); var c1 = client(srv, ''); }); - + it('should work with `of` and many sockets', function(done){ var srv = http(); var sio = io(srv); @@ -800,6 +800,208 @@ describe('socket.io', function(){ }); }); + it('should not emit volatile event after regular event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should not emit volatile event after regular event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit only one consecutive volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit only one consecutive volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit regular events after trying a failed volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + s.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(2); + done(); + }, 200); + }); + + it('should emit regular events after trying a failed volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + s.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(2); + done(); + }, 200); + }); + it('should emit message events through `send`', function(done){ var srv = http(); var sio = io(srv); From 17960ed038c613dccd8f6b99872008021730db12 Mon Sep 17 00:00:00 2001 From: Badarau Petru Date: Mon, 22 Dec 2014 07:17:01 +0200 Subject: [PATCH 002/494] Update Readme.md underylings to underlyings --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 271ac43169..6bf1f09e0d 100644 --- a/Readme.md +++ b/Readme.md @@ -274,7 +274,7 @@ server.listen(3000); ### Socket#conn:Socket - A reference to the underyling `Client` transport connection (engine.io + A reference to the underlying `Client` transport connection (engine.io `Socket` object). ### Socket#request:Request From 8242dd01ef51441df1e342c26ca83f56bf91b0e7 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 26 Dec 2014 14:16:27 +0200 Subject: [PATCH 003/494] package: debug v2.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a258126a51..52b11baf9f 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "socket.io-client": "1.2.1", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", - "debug": "0.7.4" + "debug": "2.1.0" }, "devDependencies": { "mocha": "1.16.2", From ca82c09bf21dee5be3f40f0969f2df0cf3d6a7d3 Mon Sep 17 00:00:00 2001 From: Roman Shtylman Date: Sat, 10 Jan 2015 14:58:50 -0800 Subject: [PATCH 004/494] fix leaving unknown rooms close #1670 --- lib/socket.js | 5 ++++- test/socket.io.js | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 4a3aa3d7a0..38440d1f42 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -242,7 +242,10 @@ Socket.prototype.leave = function(room, fn){ this.adapter.del(this.id, room, function(err){ if (err) return fn && fn(err); debug('left room %s', room); - self.rooms.splice(self.rooms.indexOf(room), 1); + var idx = self.rooms.indexOf(room); + if (idx >= 0) { + self.rooms.splice(idx, 1); + } fn && fn(null); }); return this; diff --git a/test/socket.io.js b/test/socket.io.js index c19172b38d..98f9aa7084 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1400,6 +1400,30 @@ describe('socket.io', function(){ }); }); }); + + it('should properly cleanup left rooms', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + expect(s.rooms).to.eql([s.id, 'a']); + s.join('b', function(){ + expect(s.rooms).to.eql([s.id, 'a', 'b']); + s.leave('unknown', function(){ + expect(s.rooms).to.eql([s.id, 'a', 'b']); + s.leaveAll(); + expect(s.rooms).to.eql([]); + done(); + }); + }); + }); + }); + }); + }); + }); describe('middleware', function(done){ From d9415a38e45636aa29a8af3eb7389d6d25d13792 Mon Sep 17 00:00:00 2001 From: Willson Mock Date: Sun, 11 Jan 2015 00:11:55 -0500 Subject: [PATCH 005/494] update license with up-to-date year range --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 81a927588c..b248ba1bc5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2014 Automattic +Copyright (c) 2014-2015 Automattic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 0523b655da99241dba9beaeb7af34a4d08434f27 Mon Sep 17 00:00:00 2001 From: Tony Kovanen Date: Wed, 14 Jan 2015 17:22:50 +0200 Subject: [PATCH 006/494] Add test for reconnection after server restarts --- test/socket.io.js | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index 98f9aa7084..0363fadfd9 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -462,7 +462,7 @@ describe('socket.io', function(){ var c1 = client(srv, '/'); var c2 = client(srv, '/abc'); }); - + it('should be equivalent for "" and "/" on client', function(done){ var srv = http(); var sio = io(srv); @@ -471,7 +471,7 @@ describe('socket.io', function(){ }); var c1 = client(srv, ''); }); - + it('should work with `of` and many sockets', function(done){ var srv = http(); var sio = io(srv); @@ -1101,6 +1101,32 @@ describe('socket.io', function(){ }); }); }); + + it('should be able to emit after server close and restart', function(done){ + var srv = http(); + var sio = io(srv); + + sio.on('connection', function(socket){ + socket.on('ev', function(data){ + expect(data).to.be('payload'); + done(); + }); + }); + + srv.listen(function(){ + var port = srv.address().port; + var clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); + clientSocket.once('connect', function(){ + srv.close(function(){ + srv.listen(port, function(){ + clientSocket.on('reconnect', function(){ + clientSocket.emit('ev', 'payload'); + }); + }); + }); + }); + }); + }); }); describe('messaging many', function(){ From f5b75151bdb0d039b01a83c77a0800490c524654 Mon Sep 17 00:00:00 2001 From: Alexey Chuvashov Date: Thu, 15 Jan 2015 01:24:19 +0300 Subject: [PATCH 007/494] Add space in error message --- lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index a4c7f3340c..64de3b880a 100644 --- a/lib/index.js +++ b/lib/index.js @@ -194,7 +194,7 @@ Server.prototype.origins = function(v){ Server.prototype.listen = Server.prototype.attach = function(srv, opts){ if ('function' == typeof srv) { - var msg = 'You are trying to attach socket.io to an express' + + var msg = 'You are trying to attach socket.io to an express ' + 'request handler function. Please pass a http.Server instance.'; throw new Error(msg); } From f7f83bc09f7b31e2615af32b084294c7edaf6b14 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 18 Jan 2015 18:51:27 +0000 Subject: [PATCH 008/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97cabd3efe..c0877cae02 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.4.3", + "engine.io": "Automattic/engine.io#b57a5a", "socket.io-parser": "2.2.2", "socket.io-client": "1.2.1", "socket.io-adapter": "0.3.1", From f8f1b132a19727d611acde4503759ea8d62a3a70 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 18 Jan 2015 18:52:06 +0000 Subject: [PATCH 009/494] package: bump `socket.io-client` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c0877cae02..f6a50e06ee 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "Automattic/engine.io#b57a5a", "socket.io-parser": "2.2.2", - "socket.io-client": "1.2.1", + "socket.io-client": "Automattic/socket.io-client#6b97ec", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "0.7.4" From f981d3f0505c87e930055792685bf31d01089d78 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 18 Jan 2015 19:41:45 +0000 Subject: [PATCH 010/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b962597bbf..aab4db45d6 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "Automattic/engine.io#b57a5a", + "engine.io": "1.5.0", "socket.io-parser": "2.2.2", "socket.io-client": "Automattic/socket.io-client#6b97ec", "socket.io-adapter": "0.3.1", From 5e92dd8663afdce698613068ed268e28f5702f26 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 18 Jan 2015 19:42:43 +0000 Subject: [PATCH 011/494] package: bump `socket.io-client` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aab4db45d6..c124c4c65a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.0", "socket.io-parser": "2.2.2", - "socket.io-client": "Automattic/socket.io-client#6b97ec", + "socket.io-client": "Automattic/socket.io-client#ce90a3", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From b46e480f6580fc102b95ad9d54336dc1a8f3249a Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 19 Jan 2015 09:26:12 +0000 Subject: [PATCH 012/494] Update Readme.md --- Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index 6bf1f09e0d..3d2b4d2184 100644 --- a/Readme.md +++ b/Readme.md @@ -2,8 +2,8 @@ # socket.io [![Build Status](https://secure.travis-ci.org/Automattic/socket.io.svg)](http://travis-ci.org/Automattic/socket.io) -[![NPM version](https://badge.fury.io/js/socket.io.svg)](http://badge.fury.io/js/socket.io) -![Downloads](http://img.shields.io/npm/dm/socket.io.svg) +![NPM version](https://badge.fury.io/js/socket.io.svg) +![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) ## How to use From 7e4aa4fa641b04f013c984c926755585d495ed07 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 19 Jan 2015 10:25:49 +0000 Subject: [PATCH 013/494] Release 1.3.0 --- History.md | 13 +++++++++++++ package.json | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index b1bab94a9f..96677e4fd9 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,17 @@ +1.3.0 / 2015-01-19 +================== + + * package: bump `engine.io` + * add test for reconnection after server restarts [rase-] + * update license with up-to-date year range [fay-jai] + * fix leaving unknown rooms [defunctzombie] + * allow null origins when allowed origins is a function [drewblaisdell] + * fix tests on node 0.11 + * package: fix `npm test` to run on windows + * package: bump `debug` v2.1.0 [coderaiser] + * added tests for volatile [rase-] + 1.2.1 / 2014-11-21 ================== diff --git a/package.json b/package.json index c124c4c65a..e9c61adfca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.2.1", + "version": "1.3.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.0", "socket.io-parser": "2.2.2", - "socket.io-client": "Automattic/socket.io-client#ce90a3", + "socket.io-client": "1.3.0", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From 77ca2dcbdada0019f80eac3506ab485584b5fbf6 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 19 Jan 2015 11:11:12 +0000 Subject: [PATCH 014/494] package: bump engine.io (noop) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9c61adfca..802ec2b554 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.5.0", + "engine.io": "1.5.1", "socket.io-parser": "2.2.2", "socket.io-client": "1.3.0", "socket.io-adapter": "0.3.1", From 3d49cafd038ffab9cd75dd7238233738723d40c9 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 19 Jan 2015 11:37:14 +0000 Subject: [PATCH 015/494] Release 1.3.1 --- History.md | 6 ++++++ package.json | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 96677e4fd9..6f6200747c 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +1.3.1 / 2015-01-19 +================== + + * no change on this release + * package: bump `engine.io` + 1.3.0 / 2015-01-19 ================== diff --git a/package.json b/package.json index 802ec2b554..a9d07ab1b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.0", + "version": "1.3.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.1", "socket.io-parser": "2.2.2", - "socket.io-client": "1.3.0", + "socket.io-client": "1.3.1", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From 9ba6d47ec728129e44773f1cdb376a14a132dce4 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 19 Jan 2015 15:14:18 +0000 Subject: [PATCH 016/494] Release 1.3.2 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 6f6200747c..5a7e6b7766 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.3.2 / 2015-01-19 +================== + + * no change on this release + 1.3.1 / 2015-01-19 ================== diff --git a/package.json b/package.json index a9d07ab1b6..91c12b4325 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.1", + "version": "1.3.2", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.1", "socket.io-parser": "2.2.2", - "socket.io-client": "1.3.1", + "socket.io-client": "1.3.2", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From ac8e8598d7dea67fbe5347a2b45e6f92d68df025 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Thu, 22 Jan 2015 05:01:45 +0900 Subject: [PATCH 017/494] support compression --- Readme.md | 12 ++++++++++++ lib/client.js | 7 ++++--- lib/socket.js | 17 ++++++++++++++++- package.json | 2 +- test/socket.io.js | 30 ++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/Readme.md b/Readme.md index 3d2b4d2184..a30e681f66 100644 --- a/Readme.md +++ b/Readme.md @@ -341,6 +341,18 @@ server.listen(3000); }); ``` +### Socket#compress(v:Boolean):Socket + + Sets a modifier for a subsequent event emission that the event data will + only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method. + + ```js + var io = require('socket.io')(); + io.on('connection', function(socket){ + socket.compress(false).emit('an event', { some: 'data' }); + }); + ``` + ### Client The `Client` class represents an incoming transport (engine.io) diff --git a/lib/client.js b/lib/client.js index 440c75edda..9193ef1f6b 100644 --- a/lib/client.js +++ b/lib/client.js @@ -61,7 +61,7 @@ Client.prototype.setup = function(){ Client.prototype.connect = function(name){ debug('connecting to namespace %s', name); if (!this.server.nsps[name]) { - this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); + this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}, false, false, true); return; } var nsp = this.server.of(name); @@ -135,17 +135,18 @@ Client.prototype.close = function(){ * @param {Object} packet object * @param {Boolean} whether packet is already encoded * @param {Boolean} whether packet is volatile + * @param {Boolean} whether packet should be compressed * @api private */ -Client.prototype.packet = function(packet, preEncoded, volatile){ +Client.prototype.packet = function(packet, preEncoded, volatile, compress){ var self = this; // this writes to the actual connection function writeToEngine(encodedPackets) { if (volatile && !self.conn.transport.writable) return; for (var i = 0; i < encodedPackets.length; i++) { - self.conn.write(encodedPackets[i]); + self.conn.write(encodedPackets[i], { compress: compress }); } } diff --git a/lib/socket.js b/lib/socket.js index 38440d1f42..cb8947e490 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -202,7 +202,8 @@ Socket.prototype.write = function(){ Socket.prototype.packet = function(packet, preEncoded){ packet.nsp = this.nsp.name; var volatile = this.flags && this.flags.volatile; - this.client.packet(packet, preEncoded, volatile); + var compress = !this.flags || false !== this.flags.compress; + this.client.packet(packet, preEncoded, volatile, compress); }; /** @@ -442,3 +443,17 @@ Socket.prototype.disconnect = function(close){ } return this; }; + +/** + * Sets the compress flag. + * + * @param {Boolean} if `true`, compresses the sending data + * @return {Socket} self + * @api public + */ + +Socket.prototype.compress = function(compress){ + this.flags = this.flags || {}; + this.flags.compress = compress; + return this; +}; diff --git a/package.json b/package.json index 91c12b4325..0471b131ec 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.5.1", + "engine.io": "Automattic/engine.io", "socket.io-parser": "2.2.2", "socket.io-client": "1.3.2", "socket.io-adapter": "0.3.1", diff --git a/test/socket.io.js b/test/socket.io.js index e6222d8096..9778372b1d 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1329,6 +1329,36 @@ describe('socket.io', function(){ }); }); }); + + it('should enable compression by default', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(true); + done(); + }); + s.emit('woot', 'hi'); + }); + }); + }); + + it('should disable compression', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(false); + done(); + }); + s.compress(false).emit('woot', 'hi'); + }); + }); + }); }); describe('messaging many', function(){ From 429eb0cb7c2253b19ff197c588b753968e6a4c1d Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Thu, 22 Jan 2015 05:26:37 +0900 Subject: [PATCH 018/494] point to the specific commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0471b131ec..1b9066dd4b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "Automattic/engine.io", + "engine.io": "Automattic/engine.io#ddc64a2d1286295fa7beaf2b113d6cbe4fbbc66b", "socket.io-parser": "2.2.2", "socket.io-client": "1.3.2", "socket.io-adapter": "0.3.1", From 2f0d9d05af99f66d34b38cc7ffc2c611c952f197 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 22 Jan 2015 21:41:59 +0000 Subject: [PATCH 019/494] fix origin verification default https port [evanlucas] for PR #1693 --- lib/index.js | 7 +++++-- test/socket.io.js | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 64de3b880a..03a87cfac1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -69,7 +69,10 @@ Server.prototype.checkRequest = function(req, fn) { if (origin) { try { var parts = url.parse(origin); - parts.port = parts.port || 80; + var defaultPort = 'https:' == parts.protocol ? 443 : 80; + parts.port = parts.port != null + ? parts.port + : defaultPort; var ok = ~this._origins.indexOf(parts.hostname + ':' + parts.port) || ~this._origins.indexOf(parts.hostname + ':*') || @@ -251,7 +254,7 @@ Server.prototype.attachServe = function(srv){ var self = this; srv.removeAllListeners('request'); srv.on('request', function(req, res) { - if (0 == req.url.indexOf(url)) { + if (0 === req.url.indexOf(url)) { self.serve(req, res); } else { for (var i = 0; i < evs.length; i++) { diff --git a/test/socket.io.js b/test/socket.io.js index e6222d8096..9128b904dd 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -317,6 +317,17 @@ describe('socket.io', function(){ done(); }); }); + + it('should default to port 443 when protocol is https', function(done) { + var sockets = io({ origins: 'https://foo.example/' }).listen('54036'); + request.get('http://localhost:54036/socket.io/default/') + .set('origin', 'https://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); }); describe('close', function(){ From bd6f638c8f58648e3d493df44646b471c0e37529 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 24 Jan 2015 07:06:30 -0800 Subject: [PATCH 020/494] package: bump to work with all objects (fixes #1955) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b9066dd4b..4c1d0f99d4 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "socket.io-parser": "2.2.2", "socket.io-client": "1.3.2", "socket.io-adapter": "0.3.1", - "has-binary-data": "0.1.3", + "has-binary": "0.1.6", "debug": "2.1.0" }, "devDependencies": { From 1b01e16a6cf0b1e7e8976d12a0e22f788e1cf1ee Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 24 Jan 2015 08:02:05 -0800 Subject: [PATCH 021/494] fix broken previous commit --- lib/namespace.js | 2 +- lib/socket.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 4ae0b154a5..bee208c8ac 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -7,7 +7,7 @@ var Socket = require('./socket'); var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); var debug = require('debug')('socket.io:namespace'); -var hasBin = require('has-binary-data'); +var hasBin = require('has-binary'); /** * Module exports. diff --git a/lib/socket.js b/lib/socket.js index cb8947e490..a62dd1c357 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -7,7 +7,7 @@ var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); var url = require('url'); var debug = require('debug')('socket.io:socket'); -var hasBin = require('has-binary-data'); +var hasBin = require('has-binary'); /** * Module exports. From afa871bb8a7aeab02ec3ae840abc65817d34c2b9 Mon Sep 17 00:00:00 2001 From: Michael Luo Date: Sat, 24 Jan 2015 20:19:16 -0800 Subject: [PATCH 022/494] bugfix/1956 test for don't reuse same-namspace connections --- test/socket.io.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/socket.io.js b/test/socket.io.js index 66103db62c..d25cf1ac95 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -597,6 +597,23 @@ describe('socket.io', function(){ }); }); }); + + it('should not reuse same-namespace connections', function(done){ + var srv = http(); + var sio = io(srv); + var connections = 0; + + srv.listen(function() { + var clientSocket1 = client(srv); + var clientSocket2 = client(srv); + sio.on('connection', function() { + connections++; + if(connections === 2) { + done(); + } + }); + }); + }); }); describe('socket', function(){ From 94157e650e03cc9822ae661d80dbc470bff5bf42 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 29 Jan 2015 20:38:36 -0800 Subject: [PATCH 023/494] point to master --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4c1d0f99d4..12b1745a1d 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "Automattic/engine.io#ddc64a2d1286295fa7beaf2b113d6cbe4fbbc66b", + "engine.io": "automattic/engine.io#master", "socket.io-parser": "2.2.2", - "socket.io-client": "1.3.2", + "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "0.3.1", "has-binary": "0.1.6", "debug": "2.1.0" From 8814825a35e9af6f6b2f110aa3c0574ec7bac11a Mon Sep 17 00:00:00 2001 From: Ruben Rodriguez II Date: Sun, 25 Jan 2015 17:18:41 -0600 Subject: [PATCH 024/494] Suggestion for implementation of clients API --- Readme.md | 34 ++++++++++++++ lib/index.js | 2 +- lib/namespace.js | 12 +++++ test/socket.io.js | 116 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index a30e681f66..6f8b473b31 100644 --- a/Readme.md +++ b/Readme.md @@ -240,6 +240,40 @@ server.listen(3000); Hash of `Socket` objects that are connected to this namespace indexed by `id`. +### Namespace#clients(fn:Function) + + Gets a list of client IDs connected to this namespace (across all nodes if applicable). + + An example to get all clients in a namespace: + + ```js + var io = require('socket.io')(); + io.of('/chat').clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD] + }); + ``` + + An example to get all clients in namespace's room: + + ```js + var io = require('socket.io')(); + io.of('/chat').in('general').clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [Anw2LatarvGVVXEIAAAD] + }); + ``` + + As with broadcasting, the default is all clients from the default namespace ('/'): + + ```js + var io = require('socket.io')(); + io.clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB] + }); + ``` + ### Namespace#use(fn:Function):Namespace Registers a middleware, which is a function that gets executed for diff --git a/lib/index.js b/lib/index.js index 03a87cfac1..c14c7ac4e1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -361,7 +361,7 @@ Server.prototype.close = function(){ * Expose main namespace (/). */ -['on', 'to', 'in', 'use', 'emit', 'send', 'write'].forEach(function(fn){ +['on', 'to', 'in', 'use', 'emit', 'send', 'write', 'clients'].forEach(function(fn){ Server.prototype[fn] = function(){ var nsp = this.sockets[fn]; return nsp.apply(this.sockets, arguments); diff --git a/lib/namespace.js b/lib/namespace.js index bee208c8ac..36cc941236 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -240,3 +240,15 @@ Namespace.prototype.write = function(){ this.emit.apply(this, args); return this; }; + +/** + * Gets a list of clients. + * + * @return {Namespace} self + * @api public + */ + +Namespace.prototype.clients = function(fn){ + this.adapter.clients(this.rooms, fn); + return this; +}; diff --git a/test/socket.io.js b/test/socket.io.js index d25cf1ac95..aef841a2e9 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -614,6 +614,122 @@ describe('socket.io', function(){ }); }); }); + + it('should find all clients in a namespace', function(done){ + var srv = http(); + var sio = io(srv); + var chatSids = []; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var total = 3; + sio.of('/chat').on('connection', function(socket){ + chatSids.push(socket.id); + --total || getClients(); + }); + sio.of('/other').on('connection', function(socket){ + otherSid = socket.id; + --total || getClients(); + }); + }); + function getClients() { + sio.of('/chat').clients(function(error, sids) { + expect(error).to.be.undefined; + expect(sids).to.contain(chatSids[0]); + expect(sids).to.contain(chatSids[1]); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); + + it('should find all clients in a namespace room', function(done){ + var srv = http(); + var sio = io(srv); + var chatFooSid = null; + var chatBarSid = null; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var chatIndex = 0; + var total = 3; + sio.of('/chat').on('connection', function(socket){ + if (chatIndex++) { + socket.join('foo', function() { + chatFooSid = socket.id; + --total || getClients(); + }); + } else { + socket.join('bar', function() { + chatBarSid = socket.id; + --total || getClients(); + }); + } + }); + sio.of('/other').on('connection', function(socket){ + socket.join('foo', function() { + otherSid = socket.id; + --total || getClients(); + }); + }); + }); + function getClients() { + sio.of('/chat').in('foo').clients(function(error, sids) { + expect(error).to.be.undefined; + expect(sids).to.contain(chatFooSid); + expect(sids).to.not.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); + + it('should find all clients across namespace rooms', function(done){ + var srv = http(); + var sio = io(srv); + var chatFooSid = null; + var chatBarSid = null; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var chatIndex = 0; + var total = 3; + sio.of('/chat').on('connection', function(socket){ + if (chatIndex++) { + socket.join('foo', function() { + chatFooSid = socket.id; + --total || getClients(); + }); + } else { + socket.join('bar', function() { + chatBarSid = socket.id; + --total || getClients(); + }); + } + }); + sio.of('/other').on('connection', function(socket){ + socket.join('foo', function() { + otherSid = socket.id; + --total || getClients(); + }); + }); + }); + function getClients() { + sio.of('/chat').clients(function(error, sids) { + expect(error).to.be.undefined; + expect(sids).to.contain(chatFooSid); + expect(sids).to.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); }); describe('socket', function(){ From f2a7322b5ae238450dd5ddbaaaef237d8f90f3b1 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 31 Jan 2015 08:46:32 -0800 Subject: [PATCH 025/494] update deps --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 12b1745a1d..cc262f53d9 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,10 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "automattic/engine.io#master", + "engine.io": "automattic/engine.io#ddc64a", "socket.io-parser": "2.2.2", - "socket.io-client": "automattic/socket.io-client#master", - "socket.io-adapter": "0.3.1", + "socket.io-client": "automattic/socket.io-client#210d65", + "socket.io-adapter": "automattic/socket.io-adapter#ae79d8", "has-binary": "0.1.6", "debug": "2.1.0" }, From 3645741b86f12474cb6b90fefad3f2c405eef7f1 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 31 Jan 2015 09:35:37 -0800 Subject: [PATCH 026/494] test: increase timeout for large binary data test --- test/socket.io.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/socket.io.js b/test/socket.io.js index aef841a2e9..30696eff4b 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1423,6 +1423,8 @@ describe('socket.io', function(){ }); it('should handle very large binary data', function(done){ + this.timeout(10000); + var srv = http(); var sio = io(srv); var received = 0; From 0a17c90d7a4ac49d8fbd52193415d8846a5a0b88 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 15:10:46 -0800 Subject: [PATCH 027/494] test: added failing test --- test/socket.io.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index 30696eff4b..437fddb4f6 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1505,6 +1505,19 @@ describe('socket.io', function(){ }); }); }); + + it('should not crash with raw binary', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.on('upgrade', function(){ + s.conn.write('5woooot'); + }); + }); + }); + }); }); describe('messaging many', function(){ @@ -1827,7 +1840,6 @@ describe('socket.io', function(){ }); }); }); - }); describe('middleware', function(done){ From 816bfec78373b8668edb63a7d8f19e00385553f5 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:26:08 -0800 Subject: [PATCH 028/494] added failing tests --- test/socket.io.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index 437fddb4f6..0ac346e740 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1506,14 +1506,35 @@ describe('socket.io', function(){ }); }); + it('should error with raw binary and warn', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.on('upgrade', function(){ + console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + socket.io.engine.write('5woooot'); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); + }); + it('should not crash with raw binary', function(done){ var srv = http(); var sio = io(srv); srv.listen(function(){ var socket = client(srv); sio.on('connection', function(s){ + s.once('error', function(err){ + expect(err.message).to.match(/Illegal attachments/); + done(); + }); s.conn.on('upgrade', function(){ - s.conn.write('5woooot'); + socket.io.engine.write('5woooot'); }); }); }); From 5ce06d3088660e9d78ad291d9ceb89ba10045d06 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:26:21 -0800 Subject: [PATCH 029/494] socket: warn node_redis-style about missing `error` --- lib/socket.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index a62dd1c357..7a1fef062a 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -391,7 +391,12 @@ Socket.prototype.ondisconnect = function(){ */ Socket.prototype.onerror = function(err){ - this.emit('error', err); + if (this.listeners('error').length) { + this.emit('error', err); + } else { + console.error('Missing error handler on `socket`.'); + console.error(err.stack); + } }; /** From a93d05a9f3f3b9697abc922163980f5788f9c6fb Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:30:49 -0800 Subject: [PATCH 030/494] package: bump parser --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc262f53d9..f70c9d6d17 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "engine.io": "automattic/engine.io#ddc64a", - "socket.io-parser": "2.2.2", + "socket.io-parser": "2.2.3", "socket.io-client": "automattic/socket.io-client#210d65", "socket.io-adapter": "automattic/socket.io-adapter#ae79d8", "has-binary": "0.1.6", From f2ea965c6bd2a2d73882131513a30df8f06bbda2 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:30:49 -0800 Subject: [PATCH 031/494] package: bump parser --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 91c12b4325..4d1ff3cfae 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "engine.io": "1.5.1", - "socket.io-parser": "2.2.2", + "socket.io-parser": "2.2.3", "socket.io-client": "1.3.2", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", From 715c7f99b40a4ea65135d891ff7bd68e95fe9972 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:26:21 -0800 Subject: [PATCH 032/494] socket: warn node_redis-style about missing `error` --- lib/socket.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 38440d1f42..1de3f3fca6 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -390,7 +390,12 @@ Socket.prototype.ondisconnect = function(){ */ Socket.prototype.onerror = function(err){ - this.emit('error', err); + if (this.listeners('error').length) { + this.emit('error', err); + } else { + console.error('Missing error handler on `socket`.'); + console.error(err.stack); + } }; /** From 49423d70bcec0d10b66888c24bc5b50516b3c3d2 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:26:08 -0800 Subject: [PATCH 033/494] added failing tests --- test/socket.io.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/test/socket.io.js b/test/socket.io.js index e6222d8096..db4d641229 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1329,6 +1329,70 @@ describe('socket.io', function(){ }); }); }); + + it('should enable compression by default', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(true); + done(); + }); + s.emit('woot', 'hi'); + }); + }); + }); + + it('should disable compression', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(false); + done(); + }); + s.compress(false).emit('woot', 'hi'); + }); + }); + }); + + it('should error with raw binary and warn', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.on('upgrade', function(){ + console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + socket.io.engine.write('5woooot'); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); + }); + + it('should not crash with raw binary', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.once('error', function(err){ + expect(err.message).to.match(/Illegal attachments/); + done(); + }); + s.conn.on('upgrade', function(){ + socket.io.engine.write('5woooot'); + }); + }); + }); + }); }); describe('messaging many', function(){ From ef23c74bea4045abd613ed49de8ce16ca42f5f21 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 17:07:43 -0800 Subject: [PATCH 034/494] remove compression tests --- test/socket.io.js | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index db4d641229..3bdbda3922 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1330,36 +1330,6 @@ describe('socket.io', function(){ }); }); - it('should enable compression by default', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(true); - done(); - }); - s.emit('woot', 'hi'); - }); - }); - }); - - it('should disable compression', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(false); - done(); - }); - s.compress(false).emit('woot', 'hi'); - }); - }); - }); - it('should error with raw binary and warn', function(done){ var srv = http(); var sio = io(srv); From 29974ac7774e83c2f469670ea4fbfe5d57828809 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 17:27:51 -0800 Subject: [PATCH 035/494] Release 1.3.3 --- History.md | 6 ++++++ package.json | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 5a7e6b7766..5d86eac79c 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +1.3.3 / 2015-02-03 +================== + + * socket: warn node_redis-style about missing `error` + * package: bump parser to better handle bad binary packets + 1.3.2 / 2015-01-19 ================== diff --git a/package.json b/package.json index 4d1ff3cfae..a1876c2901 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.2", + "version": "1.3.3", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.1", "socket.io-parser": "2.2.3", - "socket.io-client": "1.3.2", + "socket.io-client": "1.3.3", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From 56fe26661dc90020948bae9baa3e81cbb2a0c718 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Thu, 12 Feb 2015 06:09:30 +0900 Subject: [PATCH 036/494] fix a few assertions --- test/socket.io.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index 0ac346e740..d77fdedc3b 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -636,7 +636,7 @@ describe('socket.io', function(){ }); function getClients() { sio.of('/chat').clients(function(error, sids) { - expect(error).to.be.undefined; + expect(error).to.not.be.ok(); expect(sids).to.contain(chatSids[0]); expect(sids).to.contain(chatSids[1]); expect(sids).to.not.contain(otherSid); @@ -679,7 +679,7 @@ describe('socket.io', function(){ }); function getClients() { sio.of('/chat').in('foo').clients(function(error, sids) { - expect(error).to.be.undefined; + expect(error).to.not.be.ok(); expect(sids).to.contain(chatFooSid); expect(sids).to.not.contain(chatBarSid); expect(sids).to.not.contain(otherSid); @@ -722,7 +722,7 @@ describe('socket.io', function(){ }); function getClients() { sio.of('/chat').clients(function(error, sids) { - expect(error).to.be.undefined; + expect(error).to.not.be.ok(); expect(sids).to.contain(chatFooSid); expect(sids).to.contain(chatBarSid); expect(sids).to.not.contain(otherSid); From 9536437907670a76ce12e9908ab7ab76a3989857 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 14 Feb 2015 10:55:15 -0800 Subject: [PATCH 037/494] package: bump `socket.io-client` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1876c2901..028cb64bba 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.1", "socket.io-parser": "2.2.3", - "socket.io-client": "1.3.3", + "socket.io-client": "1.3.4", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From 1b2d902f33ae107a9efda50bf499aa1b259d8062 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 14 Feb 2015 10:57:50 -0800 Subject: [PATCH 038/494] Release 1.3.4 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 5d86eac79c..bb73560692 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.3.4 / 2015-02-14 +================== + + * package: bump `socket.io-client` + 1.3.3 / 2015-02-03 ================== diff --git a/package.json b/package.json index 028cb64bba..0fa043ec5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.3", + "version": "1.3.4", "description": "node.js realtime framework server", "keywords": [ "realtime", From 81aea995ed4fc123dcbc38ca9fca984c45e9ec86 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sun, 15 Feb 2015 04:33:20 +0900 Subject: [PATCH 039/494] improve Socket#packet and Client#packet --- lib/client.js | 15 +++++++-------- lib/socket.js | 21 +++++++++++++-------- package.json | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/lib/client.js b/lib/client.js index 9193ef1f6b..471aedc4ac 100644 --- a/lib/client.js +++ b/lib/client.js @@ -61,7 +61,7 @@ Client.prototype.setup = function(){ Client.prototype.connect = function(name){ debug('connecting to namespace %s', name); if (!this.server.nsps[name]) { - this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}, false, false, true); + this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); return; } var nsp = this.server.of(name); @@ -133,26 +133,25 @@ Client.prototype.close = function(){ * Writes a packet to the transport. * * @param {Object} packet object - * @param {Boolean} whether packet is already encoded - * @param {Boolean} whether packet is volatile - * @param {Boolean} whether packet should be compressed + * @param {Object} options * @api private */ -Client.prototype.packet = function(packet, preEncoded, volatile, compress){ +Client.prototype.packet = function(packet, opts){ + opts = opts || {}; var self = this; // this writes to the actual connection function writeToEngine(encodedPackets) { - if (volatile && !self.conn.transport.writable) return; + if (opts.volatile && !self.conn.transport.writable) return; for (var i = 0; i < encodedPackets.length; i++) { - self.conn.write(encodedPackets[i], { compress: compress }); + self.conn.write(encodedPackets[i], { compress: opts.compress }); } } if ('open' == this.conn.readyState) { debug('writing packet %j', packet); - if(!preEncoded) { // not broadcasting, need to encode + if (!opts.preEncoded) { // not broadcasting, need to encode this.encoder.encode(packet, function (encodedPackets) { // encode, then write results to engine writeToEngine(encodedPackets); }); diff --git a/lib/socket.js b/lib/socket.js index 7a1fef062a..094affc383 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -132,10 +132,11 @@ Socket.prototype.emit = function(ev){ var packet = {}; packet.type = hasBin(args) ? parser.BINARY_EVENT : parser.EVENT; packet.data = args; + var flags = this.flags || {}; // access last argument to see if it's an ACK callback if ('function' == typeof args[args.length - 1]) { - if (this._rooms || (this.flags && this.flags.broadcast)) { + if (this._rooms || flags.broadcast) { throw new Error('Callbacks are not supported when broadcasting'); } @@ -144,15 +145,18 @@ Socket.prototype.emit = function(ev){ packet.id = this.nsp.ids++; } - if (this._rooms || (this.flags && this.flags.broadcast)) { + if (this._rooms || flags.broadcast) { this.adapter.broadcast(packet, { except: [this.id], rooms: this._rooms, - flags: this.flags + flags: flags }); } else { // dispatch packet - this.packet(packet); + this.packet(packet, { + volatile: flags.volatile, + compress: flags.compress + }); } // reset flags @@ -196,14 +200,15 @@ Socket.prototype.write = function(){ * Writes a packet. * * @param {Object} packet object + * @param {Object} options * @api private */ -Socket.prototype.packet = function(packet, preEncoded){ +Socket.prototype.packet = function(packet, opts){ packet.nsp = this.nsp.name; - var volatile = this.flags && this.flags.volatile; - var compress = !this.flags || false !== this.flags.compress; - this.client.packet(packet, preEncoded, volatile, compress); + opts = opts || {}; + opts.compress = false !== opts.compress; + this.client.packet(packet, opts); }; /** diff --git a/package.json b/package.json index f70c9d6d17..c0e0bc0ef8 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "engine.io": "automattic/engine.io#ddc64a", "socket.io-parser": "2.2.3", "socket.io-client": "automattic/socket.io-client#210d65", - "socket.io-adapter": "automattic/socket.io-adapter#ae79d8", + "socket.io-adapter": "nkzawa/socket.io-adapter#bd48c2f292", "has-binary": "0.1.6", "debug": "2.1.0" }, From 53cdd8f1fc0155404f260900481defd8d54c119c Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Fri, 20 Feb 2015 03:34:09 +0900 Subject: [PATCH 040/494] support flags on namespace --- lib/index.js | 7 ++-- lib/namespace.js | 19 ++++++++++- test/socket.io.js | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/lib/index.js b/lib/index.js index c14c7ac4e1..27634923c5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -361,7 +361,7 @@ Server.prototype.close = function(){ * Expose main namespace (/). */ -['on', 'to', 'in', 'use', 'emit', 'send', 'write', 'clients'].forEach(function(fn){ +['on', 'to', 'in', 'use', 'emit', 'send', 'write', 'clients', 'compress'].forEach(function(fn){ Server.prototype[fn] = function(){ var nsp = this.sockets[fn]; return nsp.apply(this.sockets, arguments); @@ -369,8 +369,9 @@ Server.prototype.close = function(){ }); Namespace.flags.forEach(function(flag){ - Server.prototype.__defineGetter__(flag, function(name){ - this.flags.push(name); + Server.prototype.__defineGetter__(flag, function(){ + this.sockets.flags = this.sockets.flags || {}; + this.sockets.flags[flag] = true; return this; }); }); diff --git a/lib/namespace.js b/lib/namespace.js index 36cc941236..1d96a4b109 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -29,7 +29,10 @@ exports.events = [ * Flags. */ -exports.flags = ['json']; +exports.flags = [ + 'json', + 'volatile' +]; /** * `EventEmitter#emit` reference. @@ -252,3 +255,17 @@ Namespace.prototype.clients = function(fn){ this.adapter.clients(this.rooms, fn); return this; }; + +/** + * Sets the compress flag. + * + * @param {Boolean} if `true`, compresses the sending data + * @return {Socket} self + * @api public + */ + +Namespace.prototype.compress = function(compress){ + this.flags = this.flags || {}; + this.flags.compress = compress; + return this; +}; diff --git a/test/socket.io.js b/test/socket.io.js index 0ac346e740..792a06c664 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -405,6 +405,12 @@ describe('socket.io', function(){ expect(sio.emit).to.be.a('function'); expect(sio.send).to.be.a('function'); expect(sio.write).to.be.a('function'); + expect(sio.clients).to.be.a('function'); + expect(sio.compress).to.be.a('function'); + expect(sio.json).to.be(sio); + expect(sio.volatile).to.be(sio); + expect(sio.sockets.flags).to.eql({ json: true, volatile: true }); + delete sio.sockets.flags; }); it('should automatically connect', function(done){ @@ -730,6 +736,87 @@ describe('socket.io', function(){ }); } }); + + it('should not emit volatile event after regular event', function(done) { + var srv = http(); + var sio = io(srv); + + var counter = 0; + srv.listen(function(){ + sio.of('/chat').on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + sio.of('/chat').emit('ev', 'data'); + sio.of('/chat').volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, '/chat'); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event', function(done) { + var srv = http(); + var sio = io(srv); + + var counter = 0; + srv.listen(function(){ + sio.of('/chat').on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + sio.of('/chat').volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, '/chat'); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should enable compression by default', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(true); + done(); + }); + sio.of('/chat').emit('woot', 'hi'); + }); + }); + }); + + it('should disable compression', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(false); + done(); + }); + sio.of('/chat').compress(false).emit('woot', 'hi'); + }); + }); + }); }); describe('socket', function(){ From b31ac185549f296839727aea4f4699c51200ee4a Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 19 Feb 2015 15:38:35 -0800 Subject: [PATCH 041/494] test with 0.12 --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1e811f5bd4..c1baa2736d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,15 @@ language: node_js node_js: - "0.8" - "0.10" - - "0.11" + - "0.12" git: depth: 1 -matrix: - fast_finish: true - allow_failures: - - node_js: "0.11" +#matrix: + #fast_finish: true + #allow_failures: + #- node_js: "0.11" notifications: irc: "irc.freenode.org#socket.io" From 125ab513385cd5bec4cd579a3bfac73583a6df25 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:08:26 -0800 Subject: [PATCH 042/494] test: added test for parser breakage --- test/socket.io.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/socket.io.js b/test/socket.io.js index 3bdbda3922..e553af5495 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1363,6 +1363,23 @@ describe('socket.io', function(){ }); }); }); + + it('should handle empty binary packet', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.once('error', function(err){ + expect(err.message).to.match(/Illegal attachments/); + done(); + }); + s.conn.on('upgrade', function(){ + socket.io.engine.transport.ws.send('45'); + }); + }); + }); + }); }); describe('messaging many', function(){ From c9d909c9933e21ecdf49ff2d20645471f812878e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:34:40 -0800 Subject: [PATCH 043/494] package: bump `socket.io-parser` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fa043ec5d..9544befb9f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "engine.io": "1.5.1", - "socket.io-parser": "2.2.3", + "socket.io-parser": "2.2.4", "socket.io-client": "1.3.4", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", From 12c6ee132dc69938505904499dc5ed89adaf8c05 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:34:56 -0800 Subject: [PATCH 044/494] improve test --- test/socket.io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index e553af5495..a04b53c901 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1375,7 +1375,7 @@ describe('socket.io', function(){ done(); }); s.conn.on('upgrade', function(){ - socket.io.engine.transport.ws.send('45'); + socket.io.engine.write('5'); }); }); }); From 342faf219793fc5c1f130fc33e3fb5422dab516d Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:50:10 -0800 Subject: [PATCH 045/494] Release 1.3.5 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index bb73560692..2a9801fae9 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.3.5 / 2015-03-03 +================== + + * package: bump `socket.io-parser` + 1.3.4 / 2015-02-14 ================== diff --git a/package.json b/package.json index 9544befb9f..2caae9ccc6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.4", + "version": "1.3.5", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.1", "socket.io-parser": "2.2.4", - "socket.io-client": "1.3.4", + "socket.io-client": "1.3.5", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From 1dde0f39470464f0c47ef8dc191d0735d54fd165 Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 12 Mar 2015 15:50:31 -0600 Subject: [PATCH 046/494] Allowing a custom function for opts.allowRequest --- lib/index.js | 2 +- test/socket.io.js | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index c14c7ac4e1..dad9170b18 100644 --- a/lib/index.js +++ b/lib/index.js @@ -222,7 +222,7 @@ Server.prototype.attach = function(srv, opts){ opts = opts || {}; opts.path = opts.path || this.path(); // set origins verification - opts.allowRequest = this.checkRequest.bind(this); + opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); // initialize engine debug('creating engine.io instance with opts %j', opts); diff --git a/test/socket.io.js b/test/socket.io.js index 0ac346e740..ecfe6b43be 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -328,6 +328,32 @@ describe('socket.io', function(){ done(); }); }); + + it('should allow request if custom function in opts.allowRequest returns true', function(done){ + var sockets = io(http().listen(54022), { allowRequest: function (req, callback) { + return callback(null, true); + }, origins: 'http://foo.example:*' }); + + request.get('http://localhost:54022/socket.io/default/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should disallow request if custom function in opts.allowRequest returns false', function(done){ + var sockets = io(http().listen(54023), { allowRequest: function (req, callback) { + return callback(null, false); + } }); + request.get('http://localhost:54023/socket.io/default/') + .set('origin', 'http://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(400); + done(); + }); + }); }); describe('close', function(){ From 14e32a9bad398c1f640745704daa3720ea257f12 Mon Sep 17 00:00:00 2001 From: Tony Kovanen Date: Wed, 18 Mar 2015 01:40:19 +0200 Subject: [PATCH 047/494] Bump debug to 2.1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f70c9d6d17..8f3ffe8f3e 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "socket.io-client": "automattic/socket.io-client#210d65", "socket.io-adapter": "automattic/socket.io-adapter#ae79d8", "has-binary": "0.1.6", - "debug": "2.1.0" + "debug": "2.1.3" }, "devDependencies": { "mocha": "1.16.2", From 425409945bc53960cc9c3cbd4e5b0879aa27c1a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Lal?= Date: Tue, 24 Mar 2015 14:54:52 +0100 Subject: [PATCH 048/494] Let adapter.add find connected socket When a socket connects, it joins its own room, resulting in a call to adapter.add. The adapter in turn should be able to find the socket by id. --- lib/socket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 7a1fef062a..0cf7394b36 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -272,9 +272,9 @@ Socket.prototype.leaveAll = function(){ Socket.prototype.onconnect = function(){ debug('socket connected - writing packet'); + this.nsp.connected[this.id] = this; this.join(this.id); this.packet({ type: parser.CONNECT }); - this.nsp.connected[this.id] = this; }; /** From 0e13e9a2680e672e5d2187d66f74537aece9511b Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 5 Apr 2015 15:52:59 -0700 Subject: [PATCH 049/494] bumped adapter --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d47a29dff..96f949e5f2 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "engine.io": "automattic/engine.io#ddc64a", "socket.io-parser": "2.2.3", "socket.io-client": "automattic/socket.io-client#210d65", - "socket.io-adapter": "nkzawa/socket.io-adapter#bd48c2f292", + "socket.io-adapter": "automattic/socket.io-adapter#de5cba", "has-binary": "0.1.6", "debug": "2.1.3" }, From f8aa157d5d806068dbd77bff55d8fb0a7c7eb34a Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 5 Apr 2015 16:53:28 -0700 Subject: [PATCH 050/494] remove proxy index file --- index.js | 2 -- package.json | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 index.js diff --git a/index.js b/index.js deleted file mode 100644 index ce22d97808..0000000000 --- a/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib'); diff --git a/package.json b/package.json index 96f949e5f2..dec1dcd622 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "socket", "io" ], + "main": "./lib/index", "repository": { "type": "git", "url": "git://github.com/Automattic/socket.io" From d0d38220fb630a0821f43d724f7b3875dfd3a418 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 8 Apr 2015 16:53:04 -0700 Subject: [PATCH 051/494] Update Readme.md --- Readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Readme.md b/Readme.md index 6f8b473b31..dabdd68ec1 100644 --- a/Readme.md +++ b/Readme.md @@ -4,6 +4,7 @@ [![Build Status](https://secure.travis-ci.org/Automattic/socket.io.svg)](http://travis-ci.org/Automattic/socket.io) ![NPM version](https://badge.fury.io/js/socket.io.svg) ![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) +[![](http://slack.socket.io/badge.svg)](http://slack.socket.io) ## How to use From 98af793f077e13cf06a3bc1afec7dbe281344308 Mon Sep 17 00:00:00 2001 From: Kyle Mitchell Date: Tue, 5 May 2015 00:08:44 +0000 Subject: [PATCH 052/494] use a valid SPDX license identifier --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index dec1dcd622..2794d72b54 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "io" ], "main": "./lib/index", + "license": "MIT", "repository": { "type": "git", "url": "git://github.com/Automattic/socket.io" From 93b571406e3d8f950d9132d3f88bc55d055a6b13 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 25 May 2015 14:34:10 -0700 Subject: [PATCH 053/494] package: bump `engine.io` to fix build issues --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dec1dcd622..40113c7aaf 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "automattic/engine.io#ddc64a", + "engine.io": "automattic/engine.io#ab2bd0", "socket.io-parser": "2.2.3", "socket.io-client": "automattic/socket.io-client#210d65", "socket.io-adapter": "automattic/socket.io-adapter#de5cba", From 874a4a8535e696f81e9ac54f107c3fb18fb565de Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 27 May 2015 08:19:15 -0700 Subject: [PATCH 054/494] package: bump client --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40113c7aaf..63eb52f8f8 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "engine.io": "automattic/engine.io#ab2bd0", "socket.io-parser": "2.2.3", - "socket.io-client": "automattic/socket.io-client#210d65", + "socket.io-client": "automattic/socket.io-client#e89816", "socket.io-adapter": "automattic/socket.io-adapter#de5cba", "has-binary": "0.1.6", "debug": "2.1.3" From 43fa075ec43abf71e841cb850ab0a2c3cae4ea32 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 27 May 2015 22:56:15 -0700 Subject: [PATCH 055/494] bump client --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60c7bf3670..d925843c4c 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "engine.io": "automattic/engine.io#ab2bd0", "socket.io-parser": "2.2.4", - "socket.io-client": "automattic/socket.io-client#e89816", + "socket.io-client": "automattic/socket.io-client#ba31817", "socket.io-adapter": "automattic/socket.io-adapter#de5cba", "has-binary": "0.1.6", "debug": "2.1.3" From 4d36d6c01ae85c3ee731292199d93005211992dc Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sat, 30 May 2015 03:34:05 +0900 Subject: [PATCH 056/494] don't set request property --- lib/socket.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 173f238427..371c18ad7d 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -60,7 +60,6 @@ function Socket(nsp, client){ this.server = nsp.server; this.adapter = this.nsp.adapter; this.id = client.id; - this.request = client.request; this.client = client; this.conn = client.conn; this.rooms = []; From 514aeb4fcd7775d5e147c1e1cc271bac80feb2f9 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Mon, 6 Jul 2015 11:36:00 -0400 Subject: [PATCH 057/494] Actually prevent double callbacks... We declare `sent = false` and even check `if (sent)` is truthy, but we never set it to truthy, therefore it never really *prevents double callbacks*... --- lib/socket.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/socket.js b/lib/socket.js index 173f238427..b510cb776e 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -358,6 +358,8 @@ Socket.prototype.ack = function(id){ type: type, data: args }); + + sent = true; }; }; From 4c1d691fe5bf15b86692e2aaa9a6fb1449f0f185 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 9 Jul 2015 09:28:43 -0700 Subject: [PATCH 058/494] package: bump `engine.io` to fix build on windows --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2caae9ccc6..05234b628b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.5.1", + "engine.io": "1.5.2", "socket.io-parser": "2.2.4", "socket.io-client": "1.3.5", "socket.io-adapter": "0.3.1", From 3e4061bfef1fa0c387657ec81325c068a2cea132 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 14 Jul 2015 17:59:50 -0700 Subject: [PATCH 059/494] Release 1.3.6 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 2a9801fae9..4a3917ce86 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.3.6 / 2015-07-14 +================== + + * package: bump `engine.io` to fix build on windows + 1.3.5 / 2015-03-03 ================== diff --git a/package.json b/package.json index 05234b628b..b35339e09b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.5", + "version": "1.3.6", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.2", "socket.io-parser": "2.2.4", - "socket.io-client": "1.3.5", + "socket.io-client": "1.3.6", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From c79e7876716301c07890c6498e7e14d87dfbacd3 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 14 Jul 2015 19:58:42 -0700 Subject: [PATCH 060/494] test: better timeout for stress test --- test/socket.io.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/socket.io.js b/test/socket.io.js index a04b53c901..9a3f8c401c 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1279,6 +1279,7 @@ describe('socket.io', function(){ }); it('should handle very large binary data', function(done){ + this.timeout(30000); var srv = http(); var sio = io(srv); var received = 0; From 575d35a3717893b6509d1765b18a150a5ef220a8 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Sun, 16 Aug 2015 20:36:39 -0600 Subject: [PATCH 061/494] README: fixed up legacy repo links --- Readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index dabdd68ec1..b6618dafe9 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io -[![Build Status](https://secure.travis-ci.org/Automattic/socket.io.svg)](http://travis-ci.org/Automattic/socket.io) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](http://travis-ci.org/socketio/socket.io) ![NPM version](https://badge.fury.io/js/socket.io.svg) ![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg)](http://slack.socket.io) @@ -128,7 +128,7 @@ server.listen(3000); Sets the adapter `v`. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See - [socket.io-adapter](https://github.com/Automattic/socket.io-adapter). + [socket.io-adapter](https://github.com/socketio/socket.io-adapter). If no arguments are supplied this method returns the current value. @@ -348,7 +348,7 @@ server.listen(3000); The mechanics of joining rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to - [socket.io-adapter](https://github.com/Automattic/socket.io-adapter). + [socket.io-adapter](https://github.com/socketio/socket.io-adapter). ### Socket#leave(name:String[, fn:Function]):Socket @@ -359,7 +359,7 @@ server.listen(3000); The mechanics of leaving rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to - [socket.io-adapter](https://github.com/Automattic/socket.io-adapter). + [socket.io-adapter](https://github.com/socketio/socket.io-adapter). ### Socket#to(room:String):Socket ### Socket#in(room:String):Socket From d5b3bb46f8272f42df8979dc9f9d9e0d861cf48f Mon Sep 17 00:00:00 2001 From: futbalguy Date: Sun, 23 Aug 2015 10:12:23 -0700 Subject: [PATCH 062/494] Clarified documentation of Socket.in --- Readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index dabdd68ec1..8d65794ab5 100644 --- a/Readme.md +++ b/Readme.md @@ -362,7 +362,6 @@ server.listen(3000); [socket.io-adapter](https://github.com/Automattic/socket.io-adapter). ### Socket#to(room:String):Socket -### Socket#in(room:String):Socket Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to sockets that have joined the given `room`. @@ -376,6 +375,10 @@ server.listen(3000); }); ``` +### Socket#in(room:String):Socket + + Same as `Socket#to` + ### Socket#compress(v:Boolean):Socket Sets a modifier for a subsequent event emission that the event data will From ae5420b7275c61c87805e8e0ffa3698469fd5be5 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 30 Aug 2015 10:51:25 -0700 Subject: [PATCH 063/494] package: bump `engine.io` and `socket.io-client` --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f73e473a4f..31e8bfd940 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,9 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "automattic/engine.io#ab2bd0", + "engine.io": "automattic/engine.io#f3fd4bb", "socket.io-parser": "2.2.4", - "socket.io-client": "automattic/socket.io-client#ba31817", + "socket.io-client": "automattic/socket.io-client#bf98153", "socket.io-adapter": "automattic/socket.io-adapter#de5cba", "has-binary": "0.1.6", "debug": "2.1.3" From 210e6887327e6afed4761940fae405b8e784e8e1 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 9 Sep 2015 15:47:14 -0700 Subject: [PATCH 064/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 31e8bfd940..02db26f55f 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "automattic/engine.io#f3fd4bb", + "engine.io": "automattic/engine.io#7e77dd5", "socket.io-parser": "2.2.4", "socket.io-client": "automattic/socket.io-client#bf98153", "socket.io-adapter": "automattic/socket.io-adapter#de5cba", From 3658928ee79cf5ea1580b3ff4d1890fd20f5b442 Mon Sep 17 00:00:00 2001 From: "P.S.V.R" Date: Wed, 16 Sep 2015 17:39:26 +0800 Subject: [PATCH 065/494] [Travis] Add Node 4.x to the test matrix --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c1baa2736d..1b2864906e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ node_js: - "0.8" - "0.10" - "0.12" + - "4" git: depth: 1 From 8744007dc7b6cbaf4278db5860e410e83780f733 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 21 Sep 2015 04:10:19 +0400 Subject: [PATCH 066/494] package: bump `engine.io` for node4 compatibility --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b35339e09b..c9b9cf45ef 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.5.2", + "engine.io": "1.5.4", "socket.io-parser": "2.2.4", "socket.io-client": "1.3.6", "socket.io-adapter": "0.3.1", From b771f74a229c74fa218c69ac43ae62f1b1d6607e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 21 Sep 2015 04:16:59 +0400 Subject: [PATCH 067/494] package: bump `socket.io-client` for node4 compatibility --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9b9cf45ef..52bdb174c7 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "engine.io": "1.5.4", "socket.io-parser": "2.2.4", - "socket.io-client": "1.3.6", + "socket.io-client": "1.3.7", "socket.io-adapter": "0.3.1", "has-binary-data": "0.1.3", "debug": "2.1.0" From e2ebd4349bf27c3839fc9a2700b42cf8390ac3bd Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 21 Sep 2015 04:21:11 +0400 Subject: [PATCH 068/494] Release 1.3.7 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 4a3917ce86..a705f2c460 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +1.3.7 / 2015-09-21 +================== + + * package: bump `socket.io-client` for node4 compatibility + * package: bump `engine.io` for node4 compatibility + 1.3.6 / 2015-07-14 ================== diff --git a/package.json b/package.json index 52bdb174c7..0faf9bfe13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.6", + "version": "1.3.7", "description": "node.js realtime framework server", "keywords": [ "realtime", From 75da57abb2823a33ee0d1dcce17a9c9ce21a28ed Mon Sep 17 00:00:00 2001 From: Sebastian Zorn Date: Tue, 6 Oct 2015 21:39:36 +0200 Subject: [PATCH 069/494] Working travis build status --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index dabdd68ec1..7e8716a522 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io -[![Build Status](https://secure.travis-ci.org/Automattic/socket.io.svg)](http://travis-ci.org/Automattic/socket.io) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](http://travis-ci.org/socketio/socket.io) ![NPM version](https://badge.fury.io/js/socket.io.svg) ![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg)](http://slack.socket.io) From 6b49779420b878bb74a4884bf54f3f91c49bb742 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 17 Nov 2015 00:31:45 +0100 Subject: [PATCH 070/494] Upgrade npm version in order to fix node v0.8 build --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index c1baa2736d..840314d649 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,6 @@ +sudo: false +before_install: + - npm install -g npm@'>=1.4.3' language: node_js node_js: - "0.8" From c8f525868a5c095040d719e63a16de63eff661ed Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 18 Nov 2015 16:56:06 -0800 Subject: [PATCH 071/494] package: bump `has-binary` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 547196fe58..8a16dea687 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "socket.io-parser": "2.2.4", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", - "has-binary": "0.1.6", + "has-binary": "0.1.7", "debug": "2.1.3" }, "devDependencies": { From 9df4cb64b8f44ded3da5daf69ca7e297dd6f85fd Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 18 Nov 2015 19:51:35 -0800 Subject: [PATCH 072/494] bump `zuul-ngrok` --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8a16dea687..4da62e4bdf 100644 --- a/package.json +++ b/package.json @@ -29,11 +29,12 @@ "debug": "2.1.3" }, "devDependencies": { - "mocha": "1.16.2", "expect.js": "0.3.1", - "supertest": "0.8.2", + "istanbul": "0.2.3", + "mocha": "1.16.2", "superagent": "0.17.0", - "istanbul": "0.2.3" + "supertest": "0.8.2", + "zuul-ngrok": "3.1.0" }, "contributors": [ { From 9a54e9caceb593be3b92d5db66ee73b03fa33e2e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 18 Nov 2015 19:53:25 -0800 Subject: [PATCH 073/494] package: bump mocha --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4da62e4bdf..ed179dee97 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "devDependencies": { "expect.js": "0.3.1", "istanbul": "0.2.3", - "mocha": "1.16.2", + "mocha": "2.3.4", "superagent": "0.17.0", "supertest": "0.8.2", "zuul-ngrok": "3.1.0" From ba90f0991b88b6a39dc028aff13469b995d51a80 Mon Sep 17 00:00:00 2001 From: Chaofeng Date: Thu, 19 Nov 2015 21:09:34 -0700 Subject: [PATCH 074/494] fixed a typo in the example code --- examples/chat/public/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/public/main.js b/examples/chat/public/main.js index cff3d74a67..0b5c2c8d4d 100644 --- a/examples/chat/public/main.js +++ b/examples/chat/public/main.js @@ -7,7 +7,7 @@ $(function() { '#3b88eb', '#3824aa', '#a700ff', '#d300e7' ]; - // Initialize varibles + // Initialize variables var $window = $(window); var $usernameInput = $('.usernameInput'); // Input for username var $messages = $('.messages'); // Messages area From a1a1c6657a9fe44a9ffd0c73f3786237fd9b9ceb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Nov 2015 22:00:42 +0100 Subject: [PATCH 075/494] Removed unused variable --- lib/namespace.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/namespace.js b/lib/namespace.js index 1d96a4b109..11c231dc38 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -55,7 +55,6 @@ function Namespace(server, name){ this.connected = {}; this.fns = []; this.ids = 0; - this.acks = {}; this.initAdapter(); } From bf5897cedc2c31feed0b0a5835ac7c035d88f12d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Nov 2015 22:01:16 +0100 Subject: [PATCH 076/494] Fixed tests with large data --- test/socket.io.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index 9007104d67..06b1c77362 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1511,7 +1511,7 @@ describe('socket.io', function(){ it('should handle very large json', function(done){ this.timeout(30000); var srv = http(); - var sio = io(srv); + var sio = io(srv, { perMessageDeflate: false }); var received = 0; srv.listen(function(){ var socket = client(srv); @@ -1538,7 +1538,7 @@ describe('socket.io', function(){ it('should handle very large binary data', function(done){ this.timeout(10000); var srv = http(); - var sio = io(srv); + var sio = io(srv, { perMessageDeflate: false }); var received = 0; srv.listen(function(){ var socket = client(srv); From aae68d74b1c04488091f57a927ca8edc5b16a5b0 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Nov 2015 22:03:03 +0100 Subject: [PATCH 077/494] Minor performance optimization --- lib/client.js | 5 +++-- lib/index.js | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/client.js b/lib/client.js index 471aedc4ac..71ec38b095 100644 --- a/lib/client.js +++ b/lib/client.js @@ -60,11 +60,12 @@ Client.prototype.setup = function(){ Client.prototype.connect = function(name){ debug('connecting to namespace %s', name); - if (!this.server.nsps[name]) { + var nsp = this.server.nsps[name]; + if (!nsp) { this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); return; } - var nsp = this.server.of(name); + if ('/' != name && !this.nsps['/']) { this.connectBuffer.push(name); return; diff --git a/lib/index.js b/lib/index.js index eb75e7c253..449fb6fa12 100644 --- a/lib/index.js +++ b/lib/index.js @@ -330,13 +330,14 @@ Server.prototype.onconnection = function(conn){ Server.prototype.of = function(name, fn){ if (String(name)[0] !== '/') name = '/' + name; - if (!this.nsps[name]) { + var nsp = this.nsps[name]; + if (!nsp) { debug('initializing namespace %s', name); - var nsp = new Namespace(this, name); + nsp = new Namespace(this, name); this.nsps[name] = nsp; } - if (fn) this.nsps[name].on('connect', fn); - return this.nsps[name]; + if (fn) nsp.on('connect', fn); + return nsp; }; /** From 279c52a4c502aca9073fa0c660396f0e441b0664 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 21 Nov 2015 10:45:43 -0800 Subject: [PATCH 078/494] package: bump `socket.io-parser` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed179dee97..59491a87e3 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "engine.io": "automattic/engine.io#master", - "socket.io-parser": "2.2.4", + "socket.io-parser": "2.2.5", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", "has-binary": "0.1.7", From aee466cc7111aa39216b3b4789b94bf7068092d9 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 21 Nov 2015 10:54:19 -0800 Subject: [PATCH 079/494] Update Readme.md --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index b6618dafe9..e0715e9dd6 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ [![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](http://travis-ci.org/socketio/socket.io) ![NPM version](https://badge.fury.io/js/socket.io.svg) ![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) -[![](http://slack.socket.io/badge.svg)](http://slack.socket.io) +[![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) ## How to use From aa9438fee208a0e787a5a9e8003cdde884ea3d5b Mon Sep 17 00:00:00 2001 From: tripu Date: Thu, 19 Nov 2015 08:36:48 +0100 Subject: [PATCH 080/494] Update package "debug" to avoid "ms" vulnerability --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59491a87e3..66cf804026 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", "has-binary": "0.1.7", - "debug": "2.1.3" + "debug": "^2.2.0" }, "devDependencies": { "expect.js": "0.3.1", From 0517c609ba1495c725b40e2d652494b0a1b6e3c9 Mon Sep 17 00:00:00 2001 From: tripu Date: Sat, 21 Nov 2015 23:59:16 +0100 Subject: [PATCH 081/494] Avoid ^ in "debug" dependency (fixes #2314) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66cf804026..23179882cd 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", "has-binary": "0.1.7", - "debug": "^2.2.0" + "debug": "2.2.0" }, "devDependencies": { "expect.js": "0.3.1", From b73d9bea4efb48277eee685763026ff2df5a79ab Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 11 Sep 2015 22:52:01 +0200 Subject: [PATCH 082/494] converted arrays to objects --- lib/client.js | 31 ++++++++++++++----------------- lib/index.js | 6 +++--- lib/namespace.js | 9 ++++----- lib/socket.js | 14 ++++++-------- test/socket.io.js | 26 +++++++++++++------------- 5 files changed, 40 insertions(+), 46 deletions(-) diff --git a/lib/client.js b/lib/client.js index 71ec38b095..1ce3fc4986 100644 --- a/lib/client.js +++ b/lib/client.js @@ -28,7 +28,7 @@ function Client(server, conn){ this.id = conn.id; this.request = conn.request; this.setup(); - this.sockets = []; + this.sockets = {}; this.nsps = {}; this.connectBuffer = []; } @@ -73,7 +73,7 @@ Client.prototype.connect = function(name){ var self = this; var socket = nsp.add(this, function(){ - self.sockets.push(socket); + self.sockets[socket.id] = socket; self.nsps[nsp.name] = socket; if ('/' == nsp.name && self.connectBuffer.length > 0) { @@ -90,12 +90,10 @@ Client.prototype.connect = function(name){ */ Client.prototype.disconnect = function(){ - var socket; - // we don't use a for loop because the length of - // `sockets` changes upon each iteration - while (socket = this.sockets.shift()) { - socket.disconnect(); + for (var id in this.sockets) { + this.sockets[id].disconnect(); } + this.sockets = {}; this.close(); }; @@ -106,10 +104,9 @@ Client.prototype.disconnect = function(){ */ Client.prototype.remove = function(socket){ - var i = this.sockets.indexOf(socket); - if (~i) { - var nsp = this.sockets[i].nsp.name; - this.sockets.splice(i, 1); + if (this.sockets[socket.id]) { + var nsp = this.sockets[socket.id].nsp.name; + delete this.sockets[socket.id]; delete this.nsps[nsp]; } else { debug('ignoring remove for %s', socket.id); @@ -206,9 +203,9 @@ Client.prototype.ondecoded = function(packet) { */ Client.prototype.onerror = function(err){ - this.sockets.forEach(function(socket){ - socket.onerror(err); - }); + for (var id in this.sockets) { + this.sockets[id].onerror(err); + } this.onclose('client error'); }; @@ -226,10 +223,10 @@ Client.prototype.onclose = function(reason){ this.destroy(); // `nsps` and `sockets` are cleaned up seamlessly - var socket; - while (socket = this.sockets.shift()) { - socket.onclose(reason); + for (var id in this.sockets) { + this.sockets[id].onclose(reason); } + this.sockets = {}; this.decoder.destroy(); // clean up decoder }; diff --git a/lib/index.js b/lib/index.js index 449fb6fa12..1612c0cfa3 100644 --- a/lib/index.js +++ b/lib/index.js @@ -347,9 +347,9 @@ Server.prototype.of = function(name, fn){ */ Server.prototype.close = function(){ - this.nsps['/'].sockets.forEach(function(socket){ - socket.onclose(); - }); + for (var id in this.nsps['/'].sockets) { + this.nsps['/'].sockets[id].onclose(); + } this.engine.close(); diff --git a/lib/namespace.js b/lib/namespace.js index 11c231dc38..1a5b7efcfd 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -51,7 +51,7 @@ var emit = Emitter.prototype.emit; function Namespace(server, name){ this.name = name; this.server = server; - this.sockets = []; + this.sockets = {}; this.connected = {}; this.fns = []; this.ids = 0; @@ -160,7 +160,7 @@ Namespace.prototype.add = function(client, fn){ if (err) return socket.error(err.data || err.message); // track socket - self.sockets.push(socket); + self.sockets[socket.id] = socket; // it's paramount that the internal `onconnect` logic // fires before user-set events to prevent state order @@ -187,9 +187,8 @@ Namespace.prototype.add = function(client, fn){ */ Namespace.prototype.remove = function(socket){ - var i = this.sockets.indexOf(socket); - if (~i) { - this.sockets.splice(i, 1); + if (this.sockets[socket.id]) { + delete this.sockets[socket.id]; } else { debug('ignoring remove for %s', socket.id); } diff --git a/lib/socket.js b/lib/socket.js index eeb8cb2159..1e50a0232b 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -60,9 +60,10 @@ function Socket(nsp, client){ this.server = nsp.server; this.adapter = this.nsp.adapter; this.id = client.id; + this.id = nsp.name + '#' + client.id; this.client = client; this.conn = client.conn; - this.rooms = []; + this.rooms = {}; this.acks = {}; this.connected = true; this.disconnected = false; @@ -222,11 +223,11 @@ Socket.prototype.packet = function(packet, opts){ Socket.prototype.join = function(room, fn){ debug('joining room %s', room); var self = this; - if (~this.rooms.indexOf(room)) return this; + if (this.rooms[room]) return this; this.adapter.add(this.id, room, function(err){ if (err) return fn && fn(err); debug('joined room %s', room); - self.rooms.push(room); + self.rooms[room] = room; fn && fn(null); }); return this; @@ -247,10 +248,7 @@ Socket.prototype.leave = function(room, fn){ this.adapter.del(this.id, room, function(err){ if (err) return fn && fn(err); debug('left room %s', room); - var idx = self.rooms.indexOf(room); - if (idx >= 0) { - self.rooms.splice(idx, 1); - } + delete self.rooms[room]; fn && fn(null); }); return this; @@ -264,7 +262,7 @@ Socket.prototype.leave = function(room, fn){ Socket.prototype.leaveAll = function(){ this.adapter.delAll(this.id); - this.rooms = []; + this.rooms = {}; }; /** diff --git a/test/socket.io.js b/test/socket.io.js index 06b1c77362..026cb5f143 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -368,12 +368,12 @@ describe('socket.io', function(){ var clientSocket = client(srv, { reconnection: false }); clientSocket.on('disconnect', function init() { - expect(sio.nsps['/'].sockets.length).to.equal(0); + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); server.listen(PORT); }); clientSocket.on('connect', function init() { - expect(sio.nsps['/'].sockets.length).to.equal(1); + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); sio.close(); }); @@ -395,12 +395,12 @@ describe('socket.io', function(){ var clientSocket = ioc('ws://0.0.0.0:' + PORT); clientSocket.on('disconnect', function init() { - expect(sio.nsps['/'].sockets.length).to.equal(0); + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); server.listen(PORT); }); clientSocket.on('connect', function init() { - expect(sio.nsps['/'].sockets.length).to.equal(1); + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); sio.close(); }); @@ -1932,15 +1932,15 @@ describe('socket.io', function(){ var socket = client(srv); sio.on('connection', function(s){ s.join('a', function(){ - expect(s.rooms).to.eql([s.id, 'a']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); s.join('b', function(){ - expect(s.rooms).to.eql([s.id, 'a', 'b']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); s.join( 'c', function(){ - expect(s.rooms).to.eql([s.id, 'a', 'b', 'c']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); s.leave('b', function(){ - expect(s.rooms).to.eql([s.id, 'a', 'c']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'c']); s.leaveAll(); - expect(s.rooms).to.eql([]); + expect(Object.keys(s.rooms)).to.eql([]); done(); }); }); @@ -1976,13 +1976,13 @@ describe('socket.io', function(){ var socket = client(srv); sio.on('connection', function(s){ s.join('a', function(){ - expect(s.rooms).to.eql([s.id, 'a']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); s.join('b', function(){ - expect(s.rooms).to.eql([s.id, 'a', 'b']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); s.leave('unknown', function(){ - expect(s.rooms).to.eql([s.id, 'a', 'b']); + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); s.leaveAll(); - expect(s.rooms).to.eql([]); + expect(Object.keys(s.rooms)).to.eql([]); done(); }); }); From 6c0a79e2b966ecbcadc50040e10522ab36924880 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Mon, 23 Nov 2015 17:28:11 +0900 Subject: [PATCH 083/494] update redirects in README --- Readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Readme.md b/Readme.md index e0715e9dd6..8d0d67b9b3 100644 --- a/Readme.md +++ b/Readme.md @@ -1,9 +1,9 @@ # socket.io -[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](http://travis-ci.org/socketio/socket.io) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](https://travis-ci.org/socketio/socket.io) ![NPM version](https://badge.fury.io/js/socket.io.svg) -![Downloads](http://img.shields.io/npm/dm/socket.io.svg?style=flat) +![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) ## How to use @@ -86,7 +86,7 @@ server.listen(3000); The same options passed to socket.io are always passed to the `engine.io` `Server` that gets created. See engine.io - [options](https://github.com/learnboost/engine.io#methods-1) + [options](https://github.com/socketio/engine.io#methods-1) as reference. ### Server(srv:http#Server, opts:Object) @@ -145,7 +145,7 @@ server.listen(3000); __Potential drawbacks__: * in some situations, when it is not possible to determine `origin` it may have value of `*` * As this function will be executed for every request, it is advised to make this function work as fast as possible - * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/troygoode/node-cors/) + * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors) ### Server#sockets:Namespace @@ -406,7 +406,7 @@ server.listen(3000); ## Debug / logging -Socket.IO is powered by [debug](http://github.com/visionmedia/debug). +Socket.IO is powered by [debug](https://github.com/visionmedia/debug). In order to see all the debug output, run your app with the environment variable `DEBUG` including the desired scope. From 09f446eca09171448c75130caa9a61ef0217e5e4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 23 Nov 2015 15:00:44 +0100 Subject: [PATCH 084/494] Add hasOwnProperty checks --- lib/client.js | 14 ++++++++++---- lib/index.js | 4 +++- lib/namespace.js | 2 +- lib/socket.js | 3 +-- test/socket.io.js | 17 +++++++++++++++++ 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/client.js b/lib/client.js index 1ce3fc4986..0ac95dffae 100644 --- a/lib/client.js +++ b/lib/client.js @@ -91,7 +91,9 @@ Client.prototype.connect = function(name){ Client.prototype.disconnect = function(){ for (var id in this.sockets) { - this.sockets[id].disconnect(); + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].disconnect(); + } } this.sockets = {}; this.close(); @@ -104,7 +106,7 @@ Client.prototype.disconnect = function(){ */ Client.prototype.remove = function(socket){ - if (this.sockets[socket.id]) { + if (this.sockets.hasOwnProperty(socket.id)) { var nsp = this.sockets[socket.id].nsp.name; delete this.sockets[socket.id]; delete this.nsps[nsp]; @@ -204,7 +206,9 @@ Client.prototype.ondecoded = function(packet) { Client.prototype.onerror = function(err){ for (var id in this.sockets) { - this.sockets[id].onerror(err); + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].onerror(err); + } } this.onclose('client error'); }; @@ -224,7 +228,9 @@ Client.prototype.onclose = function(reason){ // `nsps` and `sockets` are cleaned up seamlessly for (var id in this.sockets) { - this.sockets[id].onclose(reason); + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].onclose(reason); + } } this.sockets = {}; diff --git a/lib/index.js b/lib/index.js index 1612c0cfa3..4300b99328 100644 --- a/lib/index.js +++ b/lib/index.js @@ -348,7 +348,9 @@ Server.prototype.of = function(name, fn){ Server.prototype.close = function(){ for (var id in this.nsps['/'].sockets) { - this.nsps['/'].sockets[id].onclose(); + if (this.nsps['/'].sockets.hasOwnProperty(id)) { + this.nsps['/'].sockets[id].onclose(); + } } this.engine.close(); diff --git a/lib/namespace.js b/lib/namespace.js index 1a5b7efcfd..8bf460a3e2 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -187,7 +187,7 @@ Namespace.prototype.add = function(client, fn){ */ Namespace.prototype.remove = function(socket){ - if (this.sockets[socket.id]) { + if (this.sockets.hasOwnProperty(socket.id)) { delete this.sockets[socket.id]; } else { debug('ignoring remove for %s', socket.id); diff --git a/lib/socket.js b/lib/socket.js index 1e50a0232b..d792038a45 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -59,7 +59,6 @@ function Socket(nsp, client){ this.nsp = nsp; this.server = nsp.server; this.adapter = this.nsp.adapter; - this.id = client.id; this.id = nsp.name + '#' + client.id; this.client = client; this.conn = client.conn; @@ -223,7 +222,7 @@ Socket.prototype.packet = function(packet, opts){ Socket.prototype.join = function(room, fn){ debug('joining room %s', room); var self = this; - if (this.rooms[room]) return this; + if (this.rooms.hasOwnProperty(room)) return this; this.adapter.add(this.id, room, function(err){ if (err) return fn && fn(err); debug('joined room %s', room); diff --git a/test/socket.io.js b/test/socket.io.js index 026cb5f143..c27dff16d0 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1668,6 +1668,23 @@ describe('socket.io', function(){ }); }); }); + + it('should not crash when messing with Object prototype', function(done){ + Object.prototype.foo = 'bar'; + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + + sio.on('connection', function(s){ + s.disconnect(true); + sio.close(); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); }); describe('messaging many', function(){ From 3b00312fa72c9183db02d1c95db72307943fe712 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 23 Nov 2015 09:40:57 -0800 Subject: [PATCH 085/494] namespace: clear rooms flag after a clients call (fixes #1978) --- lib/namespace.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/namespace.js b/lib/namespace.js index 8bf460a3e2..b6fc19f247 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -251,6 +251,9 @@ Namespace.prototype.write = function(){ Namespace.prototype.clients = function(fn){ this.adapter.clients(this.rooms, fn); + // delete rooms flag for scenario: + // .in('room').clients() (GH-1978) + delete this.rooms; return this; }; From 35a0fe03778d62bdd14b4563a47af83da7b33b1a Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 25 Nov 2015 10:14:56 -0800 Subject: [PATCH 086/494] package: bump parser --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23179882cd..1cd829c0ef 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "engine.io": "automattic/engine.io#master", - "socket.io-parser": "2.2.5", + "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", "has-binary": "0.1.7", From 1dfacc664732e641a331fcaf7a070df90b098a70 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 27 Nov 2015 22:08:18 +0100 Subject: [PATCH 087/494] Trigger callback even when joining an already joined room --- lib/socket.js | 5 ++++- test/socket.io.js | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index d792038a45..1fb1f11253 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -222,7 +222,10 @@ Socket.prototype.packet = function(packet, opts){ Socket.prototype.join = function(room, fn){ debug('joining room %s', room); var self = this; - if (this.rooms.hasOwnProperty(room)) return this; + if (this.rooms.hasOwnProperty(room)) { + fn && fn(null); + return this; + } this.adapter.add(this.id, room, function(err){ if (err) return fn && fn(err); debug('joined room %s', room); diff --git a/test/socket.io.js b/test/socket.io.js index 5540cbd461..5cf01fc5c4 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1685,6 +1685,21 @@ describe('socket.io', function(){ }); }); }); + + it('should always trigger the callback (if provided) when joining a room', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + s.join('a', done); + }); + }); + }); + }); + }); describe('messaging many', function(){ From dde37371656b22203d98ee7278655e38f3ab5cc0 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 28 Nov 2015 12:07:08 -0800 Subject: [PATCH 088/494] package: bump `engine.io` for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1cd829c0ef..3e7123c6ff 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "automattic/engine.io#master", + "engine.io": "1.6.0", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", From c348737fe61f98ce5113fd68359ae989fe012160 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 28 Nov 2015 15:13:13 -0800 Subject: [PATCH 089/494] socket.io: increase large binary data test timeout --- test/socket.io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index 5cf01fc5c4..a576ed498f 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1536,7 +1536,7 @@ describe('socket.io', function(){ }); it('should handle very large binary data', function(done){ - this.timeout(10000); + this.timeout(30000); var srv = http(); var sio = io(srv, { perMessageDeflate: false }); var received = 0; From f7a2f3559038bdfa6e699be11b21f8c91047b43c Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 28 Nov 2015 16:34:44 -0800 Subject: [PATCH 090/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3e7123c6ff..30827ea1fa 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.0", + "engine.io": "1.6.1", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", From ab1b36e13fcf65e421692704de218bbb631dd048 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 30 Nov 2015 08:16:21 -0800 Subject: [PATCH 091/494] package: bump `engine.io` for `ws` memory fix --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 30827ea1fa..d217601167 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.7", + "version": "1.4.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.1", + "engine.io": "1.6.2", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", From 51901160df360d5c51b24808b99d3847c00eb804 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 1 Dec 2015 11:24:06 -0800 Subject: [PATCH 092/494] package: temporarily revert version for tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d217601167..97ae455639 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.0", + "version": "1.3.7", "description": "node.js realtime framework server", "keywords": [ "realtime", From b29312bc61e780d7b939ae5d7cd505f274a11f96 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 1 Dec 2015 12:15:36 -0800 Subject: [PATCH 093/494] package: bump `engine.io` for node 0.8 fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97ae455639..6cd44d1445 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.2", + "engine.io": "1.6.3", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "automattic/socket.io-adapter#master", From 709ceba00a0ea1de2c88a231c39a5c3fe6d7939d Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 3 Dec 2015 10:28:33 -0800 Subject: [PATCH 094/494] package: bump `socket.io-adapter` for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6cd44d1445..821e510d03 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "engine.io": "1.6.3", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", - "socket.io-adapter": "automattic/socket.io-adapter#master", + "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" }, From d310d4247283ef093690b69058db3d9341569158 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Fri, 4 Dec 2015 10:56:08 -0800 Subject: [PATCH 095/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 821e510d03..9f04b3f654 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.3", + "engine.io": "1.6.4", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "0.4.0", From 0313ad0ea335892b77a522762d4d889c0df656e4 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Sat, 5 Dec 2015 10:07:08 +0900 Subject: [PATCH 096/494] improve the chat demo --- examples/chat/index.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/chat/index.js b/examples/chat/index.js index d9b4a6b8b5..c9efcec25e 100644 --- a/examples/chat/index.js +++ b/examples/chat/index.js @@ -14,8 +14,6 @@ app.use(express.static(__dirname + '/public')); // Chatroom -// usernames which are currently connected to the chat -var usernames = {}; var numUsers = 0; io.on('connection', function (socket) { @@ -32,10 +30,10 @@ io.on('connection', function (socket) { // when the client emits 'add user', this listens and executes socket.on('add user', function (username) { + if (addedUser) return; + // we store the username in the socket session for this client socket.username = username; - // add the client's username to the global list - usernames[username] = username; ++numUsers; addedUser = true; socket.emit('login', { @@ -64,9 +62,7 @@ io.on('connection', function (socket) { // when the user disconnects.. perform this socket.on('disconnect', function () { - // remove the username from global usernames list if (addedUser) { - delete usernames[socket.username]; --numUsers; // echo globally that this client has left From 7012ba6c64c3c70d23a595632425c6c33d550554 Mon Sep 17 00:00:00 2001 From: Hongcai Deng Date: Tue, 15 Sep 2015 16:06:08 +0800 Subject: [PATCH 097/494] fix wrong jsdoc --- .gitignore | 1 + lib/client.js | 8 ++++---- lib/index.js | 27 +++++++++++++-------------- lib/namespace.js | 4 ++-- lib/socket.js | 16 ++++++++-------- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 642404a315..65f07b98a2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ lib-cov benchmarks/*.png node_modules coverage +.idea \ No newline at end of file diff --git a/lib/client.js b/lib/client.js index 0ac95dffae..407d6c3aa9 100644 --- a/lib/client.js +++ b/lib/client.js @@ -16,7 +16,7 @@ module.exports = Client; * Client constructor. * * @param {Server} server instance - * @param {Socket} connection + * @param {Socket} conn * @api private */ @@ -54,7 +54,7 @@ Client.prototype.setup = function(){ /** * Connects a client to a namespace. * - * @param {String} namespace name + * @param {String} name namespace * @api private */ @@ -133,7 +133,7 @@ Client.prototype.close = function(){ * Writes a packet to the transport. * * @param {Object} packet object - * @param {Object} options + * @param {Object} opts * @api private */ @@ -200,7 +200,7 @@ Client.prototype.ondecoded = function(packet) { /** * Handles an error. * - * @param {Objcet} error object + * @param {Object} err object * @api private */ diff --git a/lib/index.js b/lib/index.js index 4300b99328..b35d1b1a97 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,7 +5,6 @@ var http = require('http'); var read = require('fs').readFileSync; -var parse = require('url').parse; var engine = require('engine.io'); var client = require('socket.io-client'); var clientVersion = require('socket.io-client/package').version; @@ -30,8 +29,8 @@ var clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8 /** * Server constructor. * - * @param {http.Server|Number|Object} http server, port or options - * @param {Object} options + * @param {http.Server|Number|Object} srv http server, port or options + * @param {Object} opts * @api public */ @@ -54,8 +53,8 @@ function Server(srv, opts){ /** * Server request verification function, that checks for allowed origins * - * @param {http.IncomingMessage} request - * @param {Function} callback to be called with the result: `fn(err, success)` + * @param {http.IncomingMessage} req request + * @param {Function} fn callback to be called with the result: `fn(err, success)` */ Server.prototype.checkRequest = function(req, fn) { @@ -87,7 +86,7 @@ Server.prototype.checkRequest = function(req, fn) { /** * Sets/gets whether client code is being served. * - * @param {Boolean} whether to serve client code + * @param {Boolean} v whether to serve client code * @return {Server|Boolean} self when setting or value when getting * @api public */ @@ -140,7 +139,7 @@ Server.prototype.set = function(key, val){ /** * Sets the client serving path. * - * @param {String} pathname + * @param {String} v pathname * @return {Server|String} self when setting or value when getting * @api public */ @@ -154,7 +153,7 @@ Server.prototype.path = function(v){ /** * Sets the adapter for rooms. * - * @param {Adapter} pathname + * @param {Adapter} v pathname * @return {Server|Adapter} self when setting or value when getting * @api public */ @@ -173,7 +172,7 @@ Server.prototype.adapter = function(v){ /** * Sets the allowed origins for requests. * - * @param {String} origins + * @param {String} v origins * @return {Server|Adapter} self when setting or value when getting * @api public */ @@ -243,7 +242,7 @@ Server.prototype.attach = function(srv, opts){ /** * Attaches the static file serving. * - * @param {Function|http.Server} http server + * @param {Function|http.Server} srv http server * @api private */ @@ -293,7 +292,7 @@ Server.prototype.serve = function(req, res){ /** * Binds socket.io to an engine.io instance. * - * @param {engine.Server} engine.io (or compatible) server + * @param {engine.Server} engine engine.io (or compatible) server * @return {Server} self * @api public */ @@ -307,7 +306,7 @@ Server.prototype.bind = function(engine){ /** * Called with each incoming transport connection. * - * @param {engine.Socket} socket + * @param {engine.Socket} conn * @return {Server} self * @api public */ @@ -322,8 +321,8 @@ Server.prototype.onconnection = function(conn){ /** * Looks up a namespace. * - * @param {String} nsp name - * @param {Function} optional, nsp `connection` ev handler + * @param {String} name nsp name + * @param {Function} fn optional, nsp `connection` ev handler * @api public */ diff --git a/lib/namespace.js b/lib/namespace.js index b6fc19f247..a0be4f7504 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -104,7 +104,7 @@ Namespace.prototype.use = function(fn){ * Executes the middleware for an incoming client. * * @param {Socket} socket that will get added - * @param {Function} last fn call in the middleware + * @param {Function} fn last fn call in the middleware * @api private */ @@ -260,7 +260,7 @@ Namespace.prototype.clients = function(fn){ /** * Sets the compress flag. * - * @param {Boolean} if `true`, compresses the sending data + * @param {Boolean} compress if `true`, compresses the sending data * @return {Socket} self * @api public */ diff --git a/lib/socket.js b/lib/socket.js index 1fb1f11253..1341af90a7 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -199,7 +199,7 @@ Socket.prototype.write = function(){ * Writes a packet. * * @param {Object} packet object - * @param {Object} options + * @param {Object} opts options * @api private */ @@ -214,7 +214,7 @@ Socket.prototype.packet = function(packet, opts){ * Joins a room. * * @param {String} room - * @param {Function} optional, callback + * @param {Function} fn optional, callback * @return {Socket} self * @api private */ @@ -239,7 +239,7 @@ Socket.prototype.join = function(room, fn){ * Leaves a room. * * @param {String} room - * @param {Function} optional, callback + * @param {Function} fn optional, callback * @return {Socket} self * @api private */ @@ -338,7 +338,7 @@ Socket.prototype.onevent = function(packet){ /** * Produces an ack callback to emit with an event. * - * @param {Number} packet id + * @param {Number} id packet id * @api private */ @@ -409,7 +409,7 @@ Socket.prototype.onerror = function(err){ * Called upon closing. Called by `Client`. * * @param {String} reason - * @param {Error} optional error object + * @throw {Error} optional error object * @api private */ @@ -428,7 +428,7 @@ Socket.prototype.onclose = function(reason){ /** * Produces an `error` packet. * - * @param {Object} error object + * @param {Object} err error object * @api private */ @@ -439,7 +439,7 @@ Socket.prototype.error = function(err){ /** * Disconnects this client. * - * @param {Boolean} if `true`, closes the underlying connection + * @param {Boolean} close if `true`, closes the underlying connection * @return {Socket} self * @api public */ @@ -458,7 +458,7 @@ Socket.prototype.disconnect = function(close){ /** * Sets the compress flag. * - * @param {Boolean} if `true`, compresses the sending data + * @param {Boolean} compress if `true`, compresses the sending data * @return {Socket} self * @api public */ From abe2394a24468815a146332e9dd692fbbaed4320 Mon Sep 17 00:00:00 2001 From: Faizal Pribadi Date: Sun, 20 Dec 2015 16:16:42 +0700 Subject: [PATCH 098/494] fix typo word :) update docs source code --- lib/socket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 1fb1f11253..c1f9c04144 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -88,7 +88,7 @@ flags.forEach(function(flag){ }); /** - * `request` engine.io shorcut. + * `request` engine.io shortcut. * * @api public */ From 6eb9807f178bf0903fb52f5d1092d34d4c1194ee Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 5 Jan 2016 13:40:54 -0800 Subject: [PATCH 099/494] package: bump `engine.io` for sec advisory --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f04b3f654..80437ee726 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.4", + "engine.io": "1.6.5", "socket.io-parser": "2.2.6", "socket.io-client": "automattic/socket.io-client#master", "socket.io-adapter": "0.4.0", From ddb3445f3d9009554577bbd05b033031e20e23d8 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 5 Jan 2016 15:44:48 -0800 Subject: [PATCH 100/494] Release 1.4.0 --- History.md | 28 ++++++++++++++++++++++++++++ package.json | 4 ++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index a705f2c460..acf6bb9883 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,32 @@ +1.4.0 / 2015-11-28 +================== + + * socket.io: increase large binary data test timeout + * package: bump `engine.io` for release + * trigger callback even when joining an already joined room + * package: bump parser + * namespace: clear rooms flag after a clients call (fixes #1978) + * package: bump `socket.io-parser` + * fixed tests with large data + * fixed a typo in the example code + * package: bump mocha + * package: bump `has-binary` and `zuul-ngrok` + * package: bump `engine.io` and `socket.io-client` + * README: clarified documentation of Socket.in + * README: fixed up legacy repo links + * test: better timeout for stress test + * socket: don't set request property which has a getter + * removed proxy index file + * support flags on namespace + * improve Socket#packet and Client#packet + * socket: warn node_redis-style about missing `error` + * test: added failing test + * test: increase timeout for large binary data test + * package: bump `has-binary` to work with all objects (fixes #1955) + * fix origin verification default https port [evanlucas] + * support compression [nkzawa] + 1.3.7 / 2015-09-21 ================== diff --git a/package.json b/package.json index 80437ee726..909bcfefa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.3.7", + "version": "1.4.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.5", "socket.io-parser": "2.2.6", - "socket.io-client": "automattic/socket.io-client#master", + "socket.io-client": "1.4.0", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 6d5d7e44115ee93e55cec2c640ca93e3958dd4e3 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 7 Jan 2016 12:52:27 -0800 Subject: [PATCH 101/494] Release 1.4.1 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index acf6bb9883..4753e9a56d 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.1 / 2016-01-07 +================== + + * version bump + 1.4.0 / 2015-11-28 ================== diff --git a/package.json b/package.json index 909bcfefa3..802f748215 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.0", + "version": "1.4.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.5", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.0", + "socket.io-client": "1.4.1", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From acb9cb421d2f0550e6f2faa228b8bbf0477ed9c9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 7 Jan 2016 22:58:59 +0100 Subject: [PATCH 102/494] Add badges showing dependency status --- Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Readme.md b/Readme.md index 524e0bb0a6..27f54d12a1 100644 --- a/Readme.md +++ b/Readme.md @@ -2,6 +2,8 @@ # socket.io [![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](https://travis-ci.org/socketio/socket.io) +[![Dependency Status](https://david-dm.org/socketio/socket.io.svg)](https://david-dm.org/socketio/socket.io) +[![devDependency Status](https://david-dm.org/socketio/socket.io/dev-status.svg)](https://david-dm.org/socketio/socket.io#info=devDependencies) ![NPM version](https://badge.fury.io/js/socket.io.svg) ![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) From 580100d4911ba003ada493d6bddfc091307a80a8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 7 Jan 2016 22:59:28 +0100 Subject: [PATCH 103/494] Bump dev dependencies --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 802f748215..cf486fe099 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ }, "devDependencies": { "expect.js": "0.3.1", - "istanbul": "0.2.3", + "istanbul": "0.4.1", "mocha": "2.3.4", - "superagent": "0.17.0", - "supertest": "0.8.2", - "zuul-ngrok": "3.1.0" + "superagent": "1.6.1", + "supertest": "1.1.0", + "zuul-ngrok": "3.2.0" }, "contributors": [ { From a6cbf6b20569a58ef2e90969d40603d3fb309a68 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 7 Jan 2016 18:14:39 -0800 Subject: [PATCH 104/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 802f748215..c4f5d8864d 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.5", + "engine.io": "1.6.6", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.1", "socket.io-adapter": "0.4.0", From dad82c3343ef4899307f81edd2870227b6295bfa Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 7 Jan 2016 18:58:05 -0800 Subject: [PATCH 105/494] Release 1.4.2 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 4753e9a56d..ac7db33ba4 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.2 / 2016-01-07 +================== + + * bump `engine.io` + 1.4.1 / 2016-01-07 ================== diff --git a/package.json b/package.json index c4f5d8864d..280fd80ffb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.1", + "version": "1.4.2", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.6", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.1", + "socket.io-client": "1.4.2", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From f1a3e8db2a5bccac8bf93448b9063cfe59a8a47f Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Fri, 8 Jan 2016 08:17:50 -0800 Subject: [PATCH 106/494] Release 1.4.3 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index ac7db33ba4..21b17c6321 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.3 / 2016-01-08 +================== + + * bump `socket.io-client` + 1.4.2 / 2016-01-07 ================== diff --git a/package.json b/package.json index 280fd80ffb..7e94dbe1ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.2", + "version": "1.4.3", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.6", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.2", + "socket.io-client": "1.4.3", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 899de7f8734ff615365c1d030bf9b3dff2d7f906 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 9 Jan 2016 21:41:45 +0100 Subject: [PATCH 107/494] Document type change of Socket#rooms --- History.md | 1 + Readme.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 21b17c6321..72de9e4b61 100644 --- a/History.md +++ b/History.md @@ -41,6 +41,7 @@ * package: bump `has-binary` to work with all objects (fixes #1955) * fix origin verification default https port [evanlucas] * support compression [nkzawa] + * changed type of `Client#sockets`, `Namespace#sockets` and `Socket#rooms` to maps (instead of arrays) 1.3.7 / 2015-09-21 ================== diff --git a/Readme.md b/Readme.md index 524e0bb0a6..a998d1dde8 100644 --- a/Readme.md +++ b/Readme.md @@ -299,9 +299,10 @@ server.listen(3000); clients. A `Socket` belongs to a certain `Namespace` (by default `/`) and uses an underlying `Client` to communicate. -### Socket#rooms:Array +### Socket#rooms:Object - A list of strings identifying the rooms this socket is in. + A hash of strings identifying the rooms this socket is in, indexed by + room name. ### Socket#client:Client From d3dde130b7d32b322ec29cfc53296b55600d34e7 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 10 Jan 2016 22:27:44 -0800 Subject: [PATCH 108/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e94dbe1ed..6b1d05b45a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.6", + "engine.io": "1.6.7", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.3", "socket.io-adapter": "0.4.0", From fea3d79a2c5c62724af6891f5a20a64240f5c44f Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 10 Jan 2016 22:36:31 -0800 Subject: [PATCH 109/494] Release 1.4.4 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 21b17c6321..92c68e1d28 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.4 / 2016-01-10 +================== + + * package: bump `engine.io` + 1.4.3 / 2016-01-08 ================== diff --git a/package.json b/package.json index 6b1d05b45a..ba3e7214ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.3", + "version": "1.4.4", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.7", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.3", + "socket.io-client": "1.4.4", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From a75f46f06fc9e906069ee9704814d6d92a93d324 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Thu, 21 Jan 2016 20:50:44 +0900 Subject: [PATCH 110/494] add a test for graceful shutdown --- package.json | 2 +- test/fixtures/server-close.js | 11 +++++++++++ test/socket.io.js | 11 +++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/server-close.js diff --git a/package.json b/package.json index 0015dccd16..3bb32cc30c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.7", + "engine.io": "nkzawa/engine.io#graceful-close", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.4", "socket.io-adapter": "0.4.0", diff --git a/test/fixtures/server-close.js b/test/fixtures/server-close.js new file mode 100644 index 0000000000..68917462b2 --- /dev/null +++ b/test/fixtures/server-close.js @@ -0,0 +1,11 @@ +var server = require('http').createServer(); +var ioc = require('socket.io-client'); +var io = require('../..')(server); + +var srv = server.listen(function() { + var socket = ioc('ws://localhost:' + server.address().port); + socket.on('connect', function() { + io.close(); + socket.close(); + }); +}); diff --git a/test/socket.io.js b/test/socket.io.js index a576ed498f..eb1a8308b9 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -3,6 +3,7 @@ var http = require('http').Server; var io = require('..'); var fs = require('fs'); var join = require('path').join; +var exec = require('child_process').exec; var ioc = require('socket.io-client'); var request = require('supertest'); var expect = require('expect.js'); @@ -412,6 +413,16 @@ describe('socket.io', function(){ }); }); + describe('graceful close', function(){ + function fixture(filename) { + return process.execPath + ' ' + + join(__dirname, 'fixtures', filename); + } + + it('should stop socket and timers', function(done){ + exec(fixture('server-close.js'), done); + }); + }); }); describe('namespaces', function(){ From d0dfa54dcb71958b37dbc4edf40bed8661f9056e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 26 Jan 2016 10:42:41 -0800 Subject: [PATCH 111/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3bb32cc30c..b3a6b2bbf9 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "nkzawa/engine.io#graceful-close", + "engine.io": "1.6.8", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.4", "socket.io-adapter": "0.4.0", From b3fc530abefd384b3a89ff5493e97f3ef85098d4 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 26 Jan 2016 13:26:17 -0800 Subject: [PATCH 112/494] Release 1.4.5 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index b5ef93952b..ea1ee4cbe2 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.5 / 2016-01-26 +================== + + * fix closing the underlying `http.Server` + 1.4.4 / 2016-01-10 ================== diff --git a/package.json b/package.json index b3a6b2bbf9..74a116318d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.4", + "version": "1.4.5", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.8", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.4", + "socket.io-client": "1.4.5", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 1d84c55743da7a932751b5b0b1b45a3995caa516 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Thu, 28 Jan 2016 14:40:05 +0800 Subject: [PATCH 113/494] fix to issue #331 on socket.o-client. Parses CONNECT packet for query string and replaces query in socket.handshake. --- lib/client.js | 23 ++++++++++++++++++++--- lib/namespace.js | 4 ++-- lib/socket.js | 8 ++++---- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/client.js b/lib/client.js index 407d6c3aa9..d7223c06bd 100644 --- a/lib/client.js +++ b/lib/client.js @@ -58,7 +58,7 @@ Client.prototype.setup = function(){ * @api private */ -Client.prototype.connect = function(name){ +Client.prototype.connect = function(name, query){ debug('connecting to namespace %s', name); var nsp = this.server.nsps[name]; if (!nsp) { @@ -72,7 +72,7 @@ Client.prototype.connect = function(name){ } var self = this; - var socket = nsp.add(this, function(){ + var socket = nsp.add(this, query, function(){ self.sockets[socket.id] = socket; self.nsps[nsp.name] = socket; @@ -186,7 +186,24 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - this.connect(packet.nsp); + function decodeNamespace(string){ + return string.split('?')[0]; + } + function decodeQuery(string){ + queryString = string.split('?')[1]; + if(!queryString){ + return null; + } + var obj = {}; + var vars = queryString.split('&'); + for(query in vars){ + var pair = vars[query].split('='); + obj[pair[0]] = pair[1]; + } + return obj; + } + + this.connect(decodeNamespace(packet.nsp), decodeQuery(packet.nsp)); } else { var socket = this.nsps[packet.nsp]; if (socket) { diff --git a/lib/namespace.js b/lib/namespace.js index a0be4f7504..c197f546e9 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -150,9 +150,9 @@ Namespace.prototype['in'] = function(name){ * @api private */ -Namespace.prototype.add = function(client, fn){ +Namespace.prototype.add = function(client, query, fn){ debug('adding socket to nsp %s', this.name); - var socket = new Socket(this, client); + var socket = new Socket(this, client, query); var self = this; this.run(socket, function(err){ process.nextTick(function(){ diff --git a/lib/socket.js b/lib/socket.js index de5ebb7158..2605aed00d 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -55,7 +55,7 @@ var emit = Emitter.prototype.emit; * @api public */ -function Socket(nsp, client){ +function Socket(nsp, client, query){ this.nsp = nsp; this.server = nsp.server; this.adapter = this.nsp.adapter; @@ -66,7 +66,7 @@ function Socket(nsp, client){ this.acks = {}; this.connected = true; this.disconnected = false; - this.handshake = this.buildHandshake(); + this.handshake = this.buildHandshake(query); } /** @@ -103,7 +103,7 @@ Socket.prototype.__defineGetter__('request', function(){ * @api private */ -Socket.prototype.buildHandshake = function(){ +Socket.prototype.buildHandshake = function(query){ return { headers: this.request.headers, time: (new Date) + '', @@ -112,7 +112,7 @@ Socket.prototype.buildHandshake = function(){ secure: !!this.request.connection.encrypted, issued: +(new Date), url: this.request.url, - query: url.parse(this.request.url, true).query || {} + query: query ? query : url.parse(this.request.url, true).query || {} }; }; From 7d55724468d7b7e84bbaac4d78a1bc8da65a33d4 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sat, 30 Jan 2016 09:47:28 +0800 Subject: [PATCH 114/494] refactor parsing of URL in CONNECT packet to use 'url' library. --- lib/client.js | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/lib/client.js b/lib/client.js index d7223c06bd..9cf47f077d 100644 --- a/lib/client.js +++ b/lib/client.js @@ -5,6 +5,7 @@ var parser = require('socket.io-parser'); var debug = require('debug')('socket.io:client'); +var url = require('url'); /** * Module exports. @@ -186,24 +187,8 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - function decodeNamespace(string){ - return string.split('?')[0]; - } - function decodeQuery(string){ - queryString = string.split('?')[1]; - if(!queryString){ - return null; - } - var obj = {}; - var vars = queryString.split('&'); - for(query in vars){ - var pair = vars[query].split('='); - obj[pair[0]] = pair[1]; - } - return obj; - } - this.connect(decodeNamespace(packet.nsp), decodeQuery(packet.nsp)); + this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp).query); } else { var socket = this.nsps[packet.nsp]; if (socket) { From 1c467e15e6fa6443f3176565814b19475b7acc86 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sat, 30 Jan 2016 11:28:40 +0800 Subject: [PATCH 115/494] Issue #2400, added documentation --- Readme.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Readme.md b/Readme.md index 74e2e8980e..1ae4788431 100644 --- a/Readme.md +++ b/Readme.md @@ -393,6 +393,12 @@ server.listen(3000); socket.compress(false).emit('an event', { some: 'data' }); }); ``` + +### Socket#disconnect(close:Boolean):Socket + + Disconnects this client. If value of close is `true`, closes the underlying connection. + Otherwise, it just disconnects the namespace. + ### Client From a116d52e30ab4ccf27e88a6ab330d0e7b930bf9c Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 30 Jan 2016 11:57:31 +0800 Subject: [PATCH 116/494] updated express version to express 4 --- examples/chat/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/chat/package.json b/examples/chat/package.json index af54071c32..b7345f2fd8 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -7,6 +7,6 @@ "private": true, "license": "BSD", "dependencies": { - "express": "3.4.8" + "express": "^4.13.4" } -} \ No newline at end of file +} From 25116ab179f2843276d871d6587feb7c241f23e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Narciso=20Garc=C3=ADa=20Revington?= Date: Sat, 30 Jan 2016 21:53:04 +0100 Subject: [PATCH 117/494] test node 5 (stable) --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 93286a05ae..bdce131a3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ node_js: - "0.10" - "0.12" - "4" + - "node" git: depth: 1 From 13af610f6d4d268bc54007235c036fbd524e0e51 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sun, 31 Jan 2016 15:44:39 +0800 Subject: [PATCH 118/494] add test for issue #331 on socket.io-client. --- lib/client.js | 3 +-- lib/socket.js | 13 ++++++++++++- package.json | 2 +- test/socket.io.js | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/client.js b/lib/client.js index 9cf47f077d..f564aa8865 100644 --- a/lib/client.js +++ b/lib/client.js @@ -187,8 +187,7 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - - this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp).query); + this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp, true).query); } else { var socket = this.nsps[packet.nsp]; if (socket) { diff --git a/lib/socket.js b/lib/socket.js index 2605aed00d..5db7490d33 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -104,6 +104,17 @@ Socket.prototype.__defineGetter__('request', function(){ */ Socket.prototype.buildHandshake = function(query){ + var self = this; + function buildQuery(){ + var requestQuery = url.parse(self.request.url, true).query; + if(query){ + query.t = requestQuery.t; + query.EIO = requestQuery.EIO; + query.transport = requestQuery.transport; + return query; + } + return requestQuery || {}; + } return { headers: this.request.headers, time: (new Date) + '', @@ -112,7 +123,7 @@ Socket.prototype.buildHandshake = function(query){ secure: !!this.request.connection.encrypted, issued: +(new Date), url: this.request.url, - query: query ? query : url.parse(this.request.url, true).query || {} + query: buildQuery() }; }; diff --git a/package.json b/package.json index 74a116318d..525e36dc7e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.8", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.5", + "socket.io-client": "git://github.com/nus-fboa2016-si/socket.io-client#34f79d30", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" diff --git a/test/socket.io.js b/test/socket.io.js index eb1a8308b9..f49c1496c1 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1518,6 +1518,24 @@ describe('socket.io', function(){ }); }); }); + + it('should see query parameters sent from secondary namespace connections in handshake object', function(done){ + var srv = http(); + var sio = io(srv); + var addr = srv.listen().address(); + var url = 'ws://localhost:' + addr.port; + var client1 = ioc(url); + var client2 = ioc(url + '/connection2', {query: {key1: 'aa', key2: 'bb'}}); + sio.on('connection', function(s){ + }); + sio.of('/connection2').on('connection', function(s){ + expect(s.handshake.query.key1).to.be('aa'); + expect(s.handshake.query.key2).to.be('bb'); + done(); + }); + + + }); it('should handle very large json', function(done){ this.timeout(30000); From c077357eff42c294acb05bdc11180dd898a74d53 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Thu, 4 Feb 2016 13:27:36 +0800 Subject: [PATCH 119/494] add comments to code --- lib/socket.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/socket.js b/lib/socket.js index 5db7490d33..20a32139d2 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -107,6 +107,7 @@ Socket.prototype.buildHandshake = function(query){ var self = this; function buildQuery(){ var requestQuery = url.parse(self.request.url, true).query; + //if socket-specific query exist, replace query strings in requestQuery if(query){ query.t = requestQuery.t; query.EIO = requestQuery.EIO; From 5fabe4e780266edb7e023d740dbe14013d053c84 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sat, 13 Feb 2016 14:10:20 +0800 Subject: [PATCH 120/494] call decodeURIComponent on query received from client. update package.son to point to latest commit in socket.o-client package (with URI encoder) --- lib/client.js | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/client.js b/lib/client.js index f564aa8865..304285950a 100644 --- a/lib/client.js +++ b/lib/client.js @@ -61,6 +61,7 @@ Client.prototype.setup = function(){ Client.prototype.connect = function(name, query){ debug('connecting to namespace %s', name); + console.log(query); var nsp = this.server.nsps[name]; if (!nsp) { this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); @@ -187,7 +188,7 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp, true).query); + this.connect(url.parse(packet.nsp).pathname, decodeURIComponent(url.parse(packet.nsp, true).query)); } else { var socket = this.nsps[packet.nsp]; if (socket) { diff --git a/package.json b/package.json index 525e36dc7e..98a3ac7ccd 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.8", "socket.io-parser": "2.2.6", - "socket.io-client": "git://github.com/nus-fboa2016-si/socket.io-client#34f79d30", + "socket.io-client": "git://github.com/nus-fboa2016-si/socket.io-client#e0580ef4", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From e141e09aafc66f9465d3183e3416d1db69133273 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sat, 13 Feb 2016 14:28:21 +0800 Subject: [PATCH 121/494] change decodeUriComponents calls --- lib/client.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/client.js b/lib/client.js index 304285950a..929a387661 100644 --- a/lib/client.js +++ b/lib/client.js @@ -61,7 +61,6 @@ Client.prototype.setup = function(){ Client.prototype.connect = function(name, query){ debug('connecting to namespace %s', name); - console.log(query); var nsp = this.server.nsps[name]; if (!nsp) { this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); @@ -188,7 +187,18 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - this.connect(url.parse(packet.nsp).pathname, decodeURIComponent(url.parse(packet.nsp, true).query)); + //decodes URIstrings + function decodeQuery(query) { + var decoded = {}; + for (component in query) { + if (query.hasOwnProperty(component)) { + decoded[decodeURIComponent(component)] = decodeURIComponent(query[component]); + } + } + return decoded; + } + + this.connect(url.parse(packet.nsp).pathname, decodeQuery(url.parse(packet.nsp, true).query)); } else { var socket = this.nsps[packet.nsp]; if (socket) { From 19341051e86db0400672de2709f8b144317482db Mon Sep 17 00:00:00 2001 From: whattokingu Date: Sat, 13 Feb 2016 14:35:12 +0800 Subject: [PATCH 122/494] conform to style guide --- lib/client.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/client.js b/lib/client.js index 929a387661..40d907f940 100644 --- a/lib/client.js +++ b/lib/client.js @@ -191,9 +191,7 @@ Client.prototype.ondecoded = function(packet) { function decodeQuery(query) { var decoded = {}; for (component in query) { - if (query.hasOwnProperty(component)) { - decoded[decodeURIComponent(component)] = decodeURIComponent(query[component]); - } + if (query.hasOwnProperty(component)) decoded[decodeURIComponent(component)] = decodeURIComponent(query[component]); } return decoded; } From 045674de97919ca7fa779c38ece101f50a5f8923 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sun, 14 Feb 2016 13:46:26 +0800 Subject: [PATCH 123/494] remove unnecessary decoder. `url.parse` already decodes string. add test to test decoding function. --- lib/client.js | 13 +------------ test/socket.io.js | 6 +++--- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/lib/client.js b/lib/client.js index 929a387661..f564aa8865 100644 --- a/lib/client.js +++ b/lib/client.js @@ -187,18 +187,7 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - //decodes URIstrings - function decodeQuery(query) { - var decoded = {}; - for (component in query) { - if (query.hasOwnProperty(component)) { - decoded[decodeURIComponent(component)] = decodeURIComponent(query[component]); - } - } - return decoded; - } - - this.connect(url.parse(packet.nsp).pathname, decodeQuery(url.parse(packet.nsp, true).query)); + this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp, true).query); } else { var socket = this.nsps[packet.nsp]; if (socket) { diff --git a/test/socket.io.js b/test/socket.io.js index f49c1496c1..184fad53ce 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1519,18 +1519,18 @@ describe('socket.io', function(){ }); }); - it('should see query parameters sent from secondary namespace connections in handshake object', function(done){ + it.only('should see query parameters sent from secondary namespace connections in handshake object', function(done){ var srv = http(); var sio = io(srv); var addr = srv.listen().address(); var url = 'ws://localhost:' + addr.port; var client1 = ioc(url); - var client2 = ioc(url + '/connection2', {query: {key1: 'aa', key2: 'bb'}}); + var client2 = ioc(url + '/connection2', {query: {key1: 'aa', key2: '&=bb'}}); sio.on('connection', function(s){ }); sio.of('/connection2').on('connection', function(s){ expect(s.handshake.query.key1).to.be('aa'); - expect(s.handshake.query.key2).to.be('bb'); + expect(s.handshake.query.key2).to.be('&=bb'); done(); }); From 1293505dc26251ced55353a8fea731dab93180f6 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sun, 14 Feb 2016 13:48:28 +0800 Subject: [PATCH 124/494] update tests. --- test/socket.io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index 184fad53ce..b54f6319dc 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1519,7 +1519,7 @@ describe('socket.io', function(){ }); }); - it.only('should see query parameters sent from secondary namespace connections in handshake object', function(done){ + it('should see query parameters sent from secondary namespace connections in handshake object', function(done){ var srv = http(); var sio = io(srv); var addr = srv.listen().address(); From d9eb729eab89b055d7c3926521d7f7fbd2ad5b02 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sat, 23 Jan 2016 20:05:12 +0800 Subject: [PATCH 125/494] implement gulp build system for test. --- gulpfile.js | 17 +++++++++++++++++ package.json | 2 ++ 2 files changed, 19 insertions(+) create mode 100644 gulpfile.js diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000000..72d5b3810f --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,17 @@ +var gulp = require('gulp'); +var mocha = require('gulp-mocha'); + +gulp.task('test', function(){ + return gulp.src('test/*.js', {read: false}) + .pipe(mocha({ + timeout: 2000, + reporter: 'dot', + bail: true + })) + .once('error', function () { + process.exit(1); + }) + .once('end', function () { + process.exit(); + }); +}); diff --git a/package.json b/package.json index 74a116318d..ade1f19b45 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ }, "devDependencies": { "expect.js": "0.3.1", + "gulp": "^3.9.0", + "gulp-mocha": "^2.2.0", "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", From 398b5479f0ad46292461a2080634827fd03331bb Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Sun, 24 Jan 2016 17:03:37 +0800 Subject: [PATCH 126/494] delete unused dependency --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index ade1f19b45..1fa0caeca6 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "expect.js": "0.3.1", "gulp": "^3.9.0", "gulp-mocha": "^2.2.0", - "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", "supertest": "1.1.0", From 1d07b1033994f84721d139b313631e1d29b47edf Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sun, 24 Jan 2016 20:46:38 +0800 Subject: [PATCH 127/494] integrated babel into gulp --- gulpfile.js | 7 +++++++ package.json | 2 ++ 2 files changed, 9 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 72d5b3810f..2e2614717d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,5 +1,12 @@ var gulp = require('gulp'); var mocha = require('gulp-mocha'); +var babel = require("gulp-babel"); + +gulp.task("default", function () { + return gulp.src("lib/*.js") + .pipe(babel()) + .pipe(gulp.dest("dist")); +}); gulp.task('test', function(){ return gulp.src('test/*.js', {read: false}) diff --git a/package.json b/package.json index 1fa0caeca6..628fb8d12d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,9 @@ "devDependencies": { "expect.js": "0.3.1", "gulp": "^3.9.0", + "gulp-babel": "^6.1.1", "gulp-mocha": "^2.2.0", + "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", "supertest": "1.1.0", From 0bac96a6b23af0e10ed5848297909acf56687679 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sun, 24 Jan 2016 21:03:22 +0800 Subject: [PATCH 128/494] added comment for babel --- gulpfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/gulpfile.js b/gulpfile.js index 2e2614717d..1850911dfe 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,6 +2,7 @@ var gulp = require('gulp'); var mocha = require('gulp-mocha'); var babel = require("gulp-babel"); +// By default, individual js files are transformed by babel and exported to /dist gulp.task("default", function () { return gulp.src("lib/*.js") .pipe(babel()) From b551ce98359913ac394f2746bbbcac9e826e6b92 Mon Sep 17 00:00:00 2001 From: Zheng Weihan Date: Mon, 25 Jan 2016 11:35:15 +0800 Subject: [PATCH 129/494] added test-cov task. --- gulpfile.js | 23 +++++++++++++++++++++++ package.json | 1 + 2 files changed, 24 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 1850911dfe..74deaf71ae 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,6 +1,7 @@ var gulp = require('gulp'); var mocha = require('gulp-mocha'); var babel = require("gulp-babel"); +var istanbul = require('gulp-istanbul'); // By default, individual js files are transformed by babel and exported to /dist gulp.task("default", function () { @@ -23,3 +24,25 @@ gulp.task('test', function(){ process.exit(); }); }); + +gulp.task('istanbul-pre-test', function () { + return gulp.src(['lib/**/*.js']) + // Covering files + .pipe(istanbul()) + // Force `require` to return covered files + .pipe(istanbul.hookRequire()); +}); + +gulp.task('test-cov', ['istanbul-pre-test'], function(){ + return gulp.src(['test/socket.io.js']) + .pipe(mocha({ + reporter: 'dot' + })) + .pipe(istanbul.writeReports()) + .once('error', function (){ + process.exit(1); + }) + .once('end', function (){ + process.exit(); + }); +}); diff --git a/package.json b/package.json index 628fb8d12d..48a98e3cbe 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "expect.js": "0.3.1", "gulp": "^3.9.0", "gulp-babel": "^6.1.1", + "gulp-istanbul": "^0.10.3", "gulp-mocha": "^2.2.0", "istanbul": "0.4.1", "mocha": "2.3.4", From e388a3319d018f2ec0e7c0cfb4ec377e0fd25412 Mon Sep 17 00:00:00 2001 From: Yijin Date: Sat, 30 Jan 2016 15:31:34 +0800 Subject: [PATCH 130/494] npm test script to use gulp --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 48a98e3cbe..c633e6ab03 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "git://github.com/Automattic/socket.io" }, "scripts": { - "test": "mocha --reporter dot --slow 200ms --bail" + "test": "gulp test" }, "dependencies": { "engine.io": "1.6.8", From 11e0f1927290ac90a854d99d58e5cb01ab6c57a4 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Sun, 31 Jan 2016 11:38:20 +0800 Subject: [PATCH 131/494] Inline babel configuration --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 74deaf71ae..3574c28231 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,7 +6,7 @@ var istanbul = require('gulp-istanbul'); // By default, individual js files are transformed by babel and exported to /dist gulp.task("default", function () { return gulp.src("lib/*.js") - .pipe(babel()) + .pipe(babel({ "presets": ["es2015"] })) .pipe(gulp.dest("dist")); }); From 97bd95f0363159c5b7f77cc0f39df77d6a6543b3 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Sun, 31 Jan 2016 11:38:43 +0800 Subject: [PATCH 132/494] Don't use dynamic dependencies --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c633e6ab03..e82de736f8 100644 --- a/package.json +++ b/package.json @@ -29,11 +29,12 @@ "debug": "2.2.0" }, "devDependencies": { + "babel-preset-es2015": "6.3.13", "expect.js": "0.3.1", - "gulp": "^3.9.0", - "gulp-babel": "^6.1.1", - "gulp-istanbul": "^0.10.3", - "gulp-mocha": "^2.2.0", + "gulp": "3.9.0", + "gulp-babel": "6.1.1", + "gulp-istanbul": "0.10.3", + "gulp-mocha": "2.2.0", "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", From 0f14312d7b779ab8a4d450bb6d88835a14d46e76 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Fri, 4 Mar 2016 18:26:30 +0800 Subject: [PATCH 133/494] Add gulp help Work was done by @YijinL in 2 separate commits (@9204125 and @05ad308) --- gulpfile.js | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 3574c28231..9e83181f2a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,6 +2,9 @@ var gulp = require('gulp'); var mocha = require('gulp-mocha'); var babel = require("gulp-babel"); var istanbul = require('gulp-istanbul'); +var help = require('gulp-task-listing'); + +gulp.task('help', help); // By default, individual js files are transformed by babel and exported to /dist gulp.task("default", function () { diff --git a/package.json b/package.json index e82de736f8..4dba69e415 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "gulp-babel": "6.1.1", "gulp-istanbul": "0.10.3", "gulp-mocha": "2.2.0", + "gulp-task-listing": "1.0.1", "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", From c6dd41b9157d46c22968d01cd4822b52838736f7 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Fri, 4 Mar 2016 20:00:00 +0800 Subject: [PATCH 134/494] Minor refactoring to transpile task - Transpiling is now gulp transpile - Default redirects to transpile - Refactor transpile output directory to a separate constant - Work by @YijinL in @05ad308 --- gulpfile.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 9e83181f2a..0ca0cbe1d1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,11 +6,15 @@ var help = require('gulp-task-listing'); gulp.task('help', help); +gulp.task('default', ['transpile']); + +const TRANSPILE_DEST_DIR = './dist'; + // By default, individual js files are transformed by babel and exported to /dist -gulp.task("default", function () { +gulp.task('transpile', function () { return gulp.src("lib/*.js") .pipe(babel({ "presets": ["es2015"] })) - .pipe(gulp.dest("dist")); + .pipe(gulp.dest(TRANSPILE_DEST_DIR)); }); gulp.task('test', function(){ From 0be915cd0ff17fdbcbc98df7b97a70d426a3d55d Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Fri, 4 Mar 2016 20:02:11 +0800 Subject: [PATCH 135/494] Add gulp task clean to clean transpile output - Work done by @YijinL. Part of @05ad308 --- gulpfile.js | 5 +++++ package.json | 1 + 2 files changed, 6 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 0ca0cbe1d1..674d273cc8 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -3,6 +3,7 @@ var mocha = require('gulp-mocha'); var babel = require("gulp-babel"); var istanbul = require('gulp-istanbul'); var help = require('gulp-task-listing'); +var del = require('del'); gulp.task('help', help); @@ -17,6 +18,10 @@ gulp.task('transpile', function () { .pipe(gulp.dest(TRANSPILE_DEST_DIR)); }); +gulp.task('clean', function () { + return del([TRANSPILE_DEST_DIR]); +}) + gulp.task('test', function(){ return gulp.src('test/*.js', {read: false}) .pipe(mocha({ diff --git a/package.json b/package.json index 4dba69e415..1300ac4386 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "babel-preset-es2015": "6.3.13", + "del": "2.2.0", "expect.js": "0.3.1", "gulp": "3.9.0", "gulp-babel": "6.1.1", From 1104cd135e4d069ee3877b58d01b8c5fce71eed7 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Fri, 4 Mar 2016 20:26:43 +0800 Subject: [PATCH 136/494] Use local instead of global gulp in npm test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1300ac4386..e4e276e498 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "git://github.com/Automattic/socket.io" }, "scripts": { - "test": "gulp test" + "test": "./node_modules/.bin/gulp test" }, "dependencies": { "engine.io": "1.6.8", From ed9ab77dcb0f6a33707f8014148e6ef1748574d2 Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Sun, 6 Mar 2016 11:16:42 +0800 Subject: [PATCH 137/494] Minor fixes to gulp tasks - Only provide entry point as first argument of gulp.src - {read:false} option for mocha tests - change timeout:2000 to slow:200 to mirror makefile's mocha options - replace var with const where appropriate --- gulpfile.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 674d273cc8..c0788c8d7b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,9 +1,9 @@ -var gulp = require('gulp'); -var mocha = require('gulp-mocha'); -var babel = require("gulp-babel"); -var istanbul = require('gulp-istanbul'); -var help = require('gulp-task-listing'); -var del = require('del'); +const gulp = require('gulp'); +const mocha = require('gulp-mocha'); +const babel = require("gulp-babel"); +const istanbul = require('gulp-istanbul'); +const help = require('gulp-task-listing'); +const del = require('del'); gulp.task('help', help); @@ -23,9 +23,9 @@ gulp.task('clean', function () { }) gulp.task('test', function(){ - return gulp.src('test/*.js', {read: false}) + return gulp.src('test/socket.io.js', {read: false}) .pipe(mocha({ - timeout: 2000, + slow: 200, reporter: 'dot', bail: true })) @@ -46,7 +46,7 @@ gulp.task('istanbul-pre-test', function () { }); gulp.task('test-cov', ['istanbul-pre-test'], function(){ - return gulp.src(['test/socket.io.js']) + return gulp.src('test/socket.io.js', {read: false}) .pipe(mocha({ reporter: 'dot' })) From 3e168ee0b841f96940aaefbf8bcfb339024faa4f Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Sun, 6 Mar 2016 11:20:20 +0800 Subject: [PATCH 138/494] Redirect make tasks to gulp --- Makefile | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4acf1e524b..6e494e024f 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,8 @@ -REPORTER = dot - test: - @./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - --slow 200ms \ - --bail + @./node_modules/.bin/gulp test test-cov: - @./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- \ - --reporter $(REPORTER) \ - test/ + @./node_modules/.bin/gulp test-cov .PHONY: test From 355b5156fee416f4622da23f0626441a7e9f695e Mon Sep 17 00:00:00 2001 From: Diga Widyaprana Date: Wed, 9 Mar 2016 09:36:51 +0800 Subject: [PATCH 139/494] Remove node 0.8 from travis --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 93286a05ae..0391af3b90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ before_install: - npm install -g npm@'>=1.4.3' language: node_js node_js: - - "0.8" - "0.10" - "0.12" - "4" From 7bae6ac6366e9adf200fef3505b4149bbdf1a4a0 Mon Sep 17 00:00:00 2001 From: Dan Callahan Date: Tue, 8 Mar 2016 19:50:55 -0600 Subject: [PATCH 140/494] Fix chat display in Firefox --- examples/chat/public/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/chat/public/style.css b/examples/chat/public/style.css index 62cbe093ed..3052d88e4c 100644 --- a/examples/chat/public/style.css +++ b/examples/chat/public/style.css @@ -128,7 +128,6 @@ ul { } .username { - float: left; font-weight: 700; overflow: hidden; padding-right: 15px; From e90b4eba1ec11df18eb267f7ed6f6f1c5e2fb6bb Mon Sep 17 00:00:00 2001 From: Seth Westphal Date: Wed, 16 Mar 2016 12:58:59 -0500 Subject: [PATCH 141/494] Update repository URL --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4e276e498..8e8973d2c6 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "git://github.com/Automattic/socket.io" + "url": "git://github.com/socketio/socket.io" }, "scripts": { "test": "./node_modules/.bin/gulp test" From 06ecfe5444eda99d592a882c2b115bf4712c951e Mon Sep 17 00:00:00 2001 From: Seth Westphal Date: Wed, 16 Mar 2016 13:01:49 -0500 Subject: [PATCH 142/494] Explicit local gulp is unnecesary --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e8973d2c6..027a5b1a59 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "git://github.com/socketio/socket.io" }, "scripts": { - "test": "./node_modules/.bin/gulp test" + "test": "gulp test" }, "dependencies": { "engine.io": "1.6.8", From d99d4d15aeb5765b8676c5454496c4a5bf16c675 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Thu, 17 Mar 2016 13:11:20 +0800 Subject: [PATCH 143/494] add compat test for babel-transformed codes --- test/socket.io.compat.js | 2177 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 2177 insertions(+) create mode 100644 test/socket.io.compat.js diff --git a/test/socket.io.compat.js b/test/socket.io.compat.js new file mode 100644 index 0000000000..3762b496c9 --- /dev/null +++ b/test/socket.io.compat.js @@ -0,0 +1,2177 @@ + +var http = require('http').Server; +var io = require('../dist'); +var fs = require('fs'); +var join = require('path').join; +var exec = require('child_process').exec; +var ioc = require('socket.io-client'); +var request = require('supertest'); +var expect = require('expect.js'); + +// Creates a socket.io client for the given server +function client(srv, nsp, opts){ + if ('object' == typeof nsp) { + opts = nsp; + nsp = null; + } + var addr = srv.address(); + if (!addr) addr = srv.listen().address(); + var url = 'ws://localhost:' + addr.port + (nsp || ''); + return ioc(url, opts); +} + +describe('socket.io', function(){ + + it('should be the same version as client', function(){ + var version = require('../package').version; + expect(version).to.be(require('socket.io-client/package').version); + }); + + describe('set', function() { + it('should be able to set ping timeout to engine.io', function() { + var srv = io(http()); + srv.set('heartbeat timeout', 10); + expect(srv.eio.pingTimeout).to.be(10); + }); + + it('should be able to set ping interval to engine.io', function() { + var srv = io(http()); + srv.set('heartbeat interval', 10); + expect(srv.eio.pingInterval).to.be(10); + }); + + it('should be able to set transports to engine.io', function() { + var srv = io(http()); + srv.set('transports', ['polling']); + expect(srv.eio.transports).to.eql(['polling']); + }); + + it('should be able to set maxHttpBufferSize to engine.io', function() { + var srv = io(http()); + srv.set('destroy buffer size', 10); + expect(srv.eio.maxHttpBufferSize).to.eql(10); + }); + + it('should be able to set path with setting resource', function(done) { + var eio = io(); + var srv = http(); + + eio.set('resource', '/random'); + eio.attach(srv); + + // Check that the server is accessible through the specified path + request(srv) + .get('/random/socket.io.js') + .buffer(true) + .end(function(err, res){ + if (err) return done(err); + done(); + }); + }); + + it('should be able to set origins to engine.io', function() { + var srv = io(http()); + srv.set('origins', 'http://hostname.com:*'); + expect(srv.origins()).to.be('http://hostname.com:*'); + }); + + it('should be able to set authorization and send error packet', function(done) { + var httpSrv = http(); + var srv = io(httpSrv); + srv.set('authorization', function(o, f) { f(null, false); }); + + var socket = client(httpSrv); + socket.on('connect', function(){ + expect().fail(); + }); + socket.on('error', function(err) { + expect(err).to.be('Not authorized'); + done(); + }); + }); + + it('should be able to set authorization and succeed', function(done) { + var httpSrv = http(); + var srv = io(httpSrv); + srv.set('authorization', function(o, f) { f(null, true); }); + + srv.on('connection', function(s) { + s.on('yoyo', function(data) { + expect(data).to.be('data'); + done(); + }); + }); + + var socket = client(httpSrv); + socket.on('connect', function(){ + socket.emit('yoyo', 'data'); + }); + + socket.on('error', function(err) { + expect().fail(); + }); + }); + + it('should set the handshake BC object', function(done){ + var httpSrv = http(); + var srv = io(httpSrv); + + srv.on('connection', function(s) { + expect(s.handshake).to.not.be(undefined); + + // Headers set and has some valid properties + expect(s.handshake.headers).to.be.an('object'); + expect(s.handshake.headers['user-agent']).to.be('node-XMLHttpRequest'); + + // Time set and is valid looking string + expect(s.handshake.time).to.be.a('string'); + expect(s.handshake.time.split(' ').length > 0); // Is "multipart" string representation + + // Address, xdomain, secure, issued and url set + expect(s.handshake.address).to.contain('127.0.0.1'); + expect(s.handshake.xdomain).to.be.a('boolean'); + expect(s.handshake.secure).to.be.a('boolean'); + expect(s.handshake.issued).to.be.a('number'); + expect(s.handshake.url).to.be.a('string'); + + // Query set and has some right properties + expect(s.handshake.query).to.be.an('object'); + expect(s.handshake.query.EIO).to.not.be(undefined); + expect(s.handshake.query.transport).to.not.be(undefined); + expect(s.handshake.query.t).to.not.be(undefined); + + done(); + }); + + var socket = client(httpSrv); + }); + }); + + describe('server attachment', function(){ + describe('http.Server', function(){ + var clientVersion = require('socket.io-client/package').version; + + it('should serve static files', function(done){ + var srv = http(); + io(srv); + request(srv) + .get('/socket.io/socket.io.js') + .buffer(true) + .end(function(err, res){ + if (err) return done(err); + var ctype = res.headers['content-type']; + expect(ctype).to.be('application/javascript'); + expect(res.headers.etag).to.be(clientVersion); + expect(res.text).to.match(/engine\.io/); + expect(res.status).to.be(200); + done(); + }); + }); + + it('should handle 304', function(done){ + var srv = http(); + io(srv); + request(srv) + .get('/socket.io/socket.io.js') + .set('If-None-Match', clientVersion) + .end(function(err, res){ + if (err) return done(err); + expect(res.statusCode).to.be(304); + done(); + }); + }); + + it('should not serve static files', function(done){ + var srv = http(); + io(srv, { serveClient: false }); + request(srv) + .get('/socket.io/socket.io.js') + .expect(400, done); + }); + + it('should work with #attach', function(done){ + var srv = http(function(req, res){ + res.writeHead(404); + res.end(); + }); + var sockets = io(); + sockets.attach(srv); + request(srv) + .get('/socket.io/socket.io.js') + .end(function(err, res){ + if (err) return done(err); + expect(res.status).to.be(200); + done(); + }); + }); + }); + + describe('port', function(done){ + it('should be bound', function(done){ + var sockets = io(54010); + request('http://localhost:54010/') + .get('/socket.io/socket.io.js') + .expect(200, done); + }); + + it('should be bound as a string', function(done) { + var sockets = io('54020'); + request('http://localhost:54020/') + .get('/socket.io/socket.io.js') + .expect(200, done); + }); + + it('with listen', function(done){ + var sockets = io().listen(54011); + request('http://localhost:54011/') + .get('/socket.io/socket.io.js') + .expect(200, done); + }); + + it('as a string', function(done){ + var sockets = io().listen('54012'); + request('http://localhost:54012/') + .get('/socket.io/socket.io.js') + .expect(200, done); + }); + }); + }); + + describe('handshake', function(){ + var request = require('superagent'); + + it('should disallow request when origin defined and none specified', function(done) { + var sockets = io({ origins: 'http://foo.example:*' }).listen('54013'); + request.get('http://localhost:54013/socket.io/default/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(400); + done(); + }); + }); + + it('should disallow request when origin defined and a different one specified', function(done) { + var sockets = io({ origins: 'http://foo.example:*' }).listen('54014'); + request.get('http://localhost:54014/socket.io/default/') + .query({ transport: 'polling' }) + .set('origin', 'http://herp.derp/') + .end(function (err, res) { + expect(res.status).to.be(400); + done(); + }); + }); + + it('should allow request when origin defined an the same is specified', function(done) { + var sockets = io({ origins: 'http://foo.example:*' }).listen('54015'); + request.get('http://localhost:54015/socket.io/default/') + .set('origin', 'http://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should allow request when origin defined as function and same is supplied', function(done) { + var sockets = io({ origins: function(origin,callback){ + if (origin == 'http://foo.example/') { + return callback(null, true); + } + return callback(null, false); + } }).listen('54016'); + request.get('http://localhost:54016/socket.io/default/') + .set('origin', 'http://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should allow request when origin defined as function and different is supplied', function(done) { + var sockets = io({ origins: function(origin,callback){ + if (origin == 'http://foo.example/') { + return callback(null, true); + } + return callback(null, false); + } }).listen('54017'); + request.get('http://localhost:54017/socket.io/default/') + .set('origin', 'http://herp.derp/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(400); + done(); + }); + }); + + it('should allow request when origin defined as function and no origin is supplied', function(done) { + var sockets = io({ origins: function(origin,callback){ + if (origin == '*') { + return callback(null, true); + } + return callback(null, false); + } }).listen('54021'); + request.get('http://localhost:54021/socket.io/default/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should default to port 443 when protocol is https', function(done) { + var sockets = io({ origins: 'https://foo.example/' }).listen('54036'); + request.get('http://localhost:54036/socket.io/default/') + .set('origin', 'https://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should allow request if custom function in opts.allowRequest returns true', function(done){ + var sockets = io(http().listen(54022), { allowRequest: function (req, callback) { + return callback(null, true); + }, origins: 'http://foo.example:*' }); + + request.get('http://localhost:54022/socket.io/default/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); + + it('should disallow request if custom function in opts.allowRequest returns false', function(done){ + var sockets = io(http().listen(54023), { allowRequest: function (req, callback) { + return callback(null, false); + } }); + request.get('http://localhost:54023/socket.io/default/') + .set('origin', 'http://foo.example/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(400); + done(); + }); + }); + }); + + describe('close', function(){ + + it('should be able to close sio sending a srv', function(){ + var PORT = 54018; + var srv = http().listen(PORT); + var sio = io(srv); + var net = require('net'); + var server = net.createServer(); + + var clientSocket = client(srv, { reconnection: false }); + + clientSocket.on('disconnect', function init() { + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); + server.listen(PORT); + }); + + clientSocket.on('connect', function init() { + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); + sio.close(); + }); + + server.once('listening', function() { + // PORT should be free + server.close(function(error){ + expect(error).to.be(undefined); + }); + }); + + }); + + it('should be able to close sio sending a port', function(){ + var PORT = 54019; + var sio = io(PORT); + var net = require('net'); + var server = net.createServer(); + + var clientSocket = ioc('ws://0.0.0.0:' + PORT); + + clientSocket.on('disconnect', function init() { + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); + server.listen(PORT); + }); + + clientSocket.on('connect', function init() { + expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); + sio.close(); + }); + + server.once('listening', function() { + // PORT should be free + server.close(function(error){ + expect(error).to.be(undefined); + }); + }); + }); + + describe('graceful close', function(){ + function fixture(filename) { + return process.execPath + ' ' + + join(__dirname, 'fixtures', filename); + } + + it('should stop socket and timers', function(done){ + exec(fixture('server-close.js'), done); + }); + }); + }); + + describe('namespaces', function(){ + var Socket = require('../dist/socket'); + var Namespace = require('../dist/namespace'); + console.log(Namespace); + it('should be accessible through .sockets', function(){ + var sio = io(); + expect(sio.sockets).to.be.a(Namespace); + }); + + it('should be aliased', function(){ + var sio = io(); + expect(sio.use).to.be.a('function'); + expect(sio.to).to.be.a('function'); + expect(sio['in']).to.be.a('function'); + expect(sio.emit).to.be.a('function'); + expect(sio.send).to.be.a('function'); + expect(sio.write).to.be.a('function'); + expect(sio.clients).to.be.a('function'); + expect(sio.compress).to.be.a('function'); + expect(sio.json).to.be(sio); + expect(sio.volatile).to.be(sio); + expect(sio.sockets.flags).to.eql({ json: true, volatile: true }); + delete sio.sockets.flags; + }); + + it('should automatically connect', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + socket.on('connect', function(){ + done(); + }); + }); + }); + + it('should fire a `connection` event', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(socket){ + expect(socket).to.be.a(Socket); + done(); + }); + }); + }); + + it('should fire a `connect` event', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connect', function(socket){ + expect(socket).to.be.a(Socket); + done(); + }); + }); + }); + + it('should work with many sockets', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + sio.of('/chat'); + sio.of('/news'); + var chat = client(srv, '/chat'); + var news = client(srv, '/news'); + var total = 2; + chat.on('connect', function(){ + --total || done(); + }); + news.on('connect', function(){ + --total || done(); + }); + }); + }); + + it('should be able to equivalently start with "" or "/" on server', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + sio.of('').on('connection', function(){ + --total || done(); + }); + sio.of('abc').on('connection', function(){ + --total || done(); + }); + var c1 = client(srv, '/'); + var c2 = client(srv, '/abc'); + }); + + it('should be equivalent for "" and "/" on client', function(done){ + var srv = http(); + var sio = io(srv); + sio.of('/').on('connection', function(){ + done(); + }); + var c1 = client(srv, ''); + }); + + it('should work with `of` and many sockets', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var chat = client(srv, '/chat'); + var news = client(srv, '/news'); + var total = 2; + sio.of('/news').on('connection', function(socket){ + expect(socket).to.be.a(Socket); + --total || done(); + }); + sio.of('/news').on('connection', function(socket){ + expect(socket).to.be.a(Socket); + --total || done(); + }); + }); + }); + + it('should work with `of` second param', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var chat = client(srv, '/chat'); + var news = client(srv, '/news'); + var total = 2; + sio.of('/news', function(socket){ + expect(socket).to.be.a(Socket); + --total || done(); + }); + sio.of('/news', function(socket){ + expect(socket).to.be.a(Socket); + --total || done(); + }); + }); + }); + + it('should disconnect upon transport disconnection', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var chat = client(srv, '/chat'); + var news = client(srv, '/news'); + var total = 2; + var totald = 2; + var s; + sio.of('/news', function(socket){ + socket.on('disconnect', function(reason){ + --totald || done(); + }); + --total || close(); + }); + sio.of('/chat', function(socket){ + s = socket; + socket.on('disconnect', function(reason){ + --totald || done(); + }); + --total || close(); + }); + function close(){ + s.disconnect(true); + } + }); + }); + + it('should disconnect both default and custom namespace upon disconnect', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var lolcats = client(srv, '/lolcats'); + var total = 2; + var totald = 2; + var s; + sio.of('/', function(socket){ + socket.on('disconnect', function(reason){ + --totald || done(); + }); + --total || close(); + }); + sio.of('/lolcats', function(socket){ + s = socket; + socket.on('disconnect', function(reason){ + --totald || done(); + }); + --total || close(); + }); + function close(){ + s.disconnect(true); + } + }); + }); + + it('should not crash while disconnecting socket', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv,'/ns'); + sio.on('connection', function(socket){ + socket.disconnect(); + done(); + }); + }); + }); + + it('should return error connecting to non-existent namespace', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv,'/doesnotexist'); + socket.on('error', function(err) { + expect(err).to.be('Invalid namespace'); + done(); + }); + }); + }); + + it('should not reuse same-namespace connections', function(done){ + var srv = http(); + var sio = io(srv); + var connections = 0; + + srv.listen(function() { + var clientSocket1 = client(srv); + var clientSocket2 = client(srv); + sio.on('connection', function() { + connections++; + if(connections === 2) { + done(); + } + }); + }); + }); + + it('should find all clients in a namespace', function(done){ + var srv = http(); + var sio = io(srv); + var chatSids = []; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var total = 3; + sio.of('/chat').on('connection', function(socket){ + chatSids.push(socket.id); + --total || getClients(); + }); + sio.of('/other').on('connection', function(socket){ + otherSid = socket.id; + --total || getClients(); + }); + }); + function getClients() { + sio.of('/chat').clients(function(error, sids) { + expect(error).to.not.be.ok(); + expect(sids).to.contain(chatSids[0]); + expect(sids).to.contain(chatSids[1]); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); + + it('should find all clients in a namespace room', function(done){ + var srv = http(); + var sio = io(srv); + var chatFooSid = null; + var chatBarSid = null; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var chatIndex = 0; + var total = 3; + sio.of('/chat').on('connection', function(socket){ + if (chatIndex++) { + socket.join('foo', function() { + chatFooSid = socket.id; + --total || getClients(); + }); + } else { + socket.join('bar', function() { + chatBarSid = socket.id; + --total || getClients(); + }); + } + }); + sio.of('/other').on('connection', function(socket){ + socket.join('foo', function() { + otherSid = socket.id; + --total || getClients(); + }); + }); + }); + function getClients() { + sio.of('/chat').in('foo').clients(function(error, sids) { + expect(error).to.not.be.ok(); + expect(sids).to.contain(chatFooSid); + expect(sids).to.not.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); + + it('should find all clients across namespace rooms', function(done){ + var srv = http(); + var sio = io(srv); + var chatFooSid = null; + var chatBarSid = null; + var otherSid = null; + srv.listen(function(){ + var c1 = client(srv, '/chat'); + var c2 = client(srv, '/chat', {forceNew: true}); + var c3 = client(srv, '/other', {forceNew: true}); + var chatIndex = 0; + var total = 3; + sio.of('/chat').on('connection', function(socket){ + if (chatIndex++) { + socket.join('foo', function() { + chatFooSid = socket.id; + --total || getClients(); + }); + } else { + socket.join('bar', function() { + chatBarSid = socket.id; + --total || getClients(); + }); + } + }); + sio.of('/other').on('connection', function(socket){ + socket.join('foo', function() { + otherSid = socket.id; + --total || getClients(); + }); + }); + }); + function getClients() { + sio.of('/chat').clients(function(error, sids) { + expect(error).to.not.be.ok(); + expect(sids).to.contain(chatFooSid); + expect(sids).to.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); + }); + } + }); + + it('should not emit volatile event after regular event', function(done) { + var srv = http(); + var sio = io(srv); + + var counter = 0; + srv.listen(function(){ + sio.of('/chat').on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + sio.of('/chat').emit('ev', 'data'); + sio.of('/chat').volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, '/chat'); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event', function(done) { + var srv = http(); + var sio = io(srv); + + var counter = 0; + srv.listen(function(){ + sio.of('/chat').on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + sio.of('/chat').volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, '/chat'); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should enable compression by default', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(true); + done(); + }); + sio.of('/chat').emit('woot', 'hi'); + }); + }); + }); + + it('should disable compression', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(false); + done(); + }); + sio.of('/chat').compress(false).emit('woot', 'hi'); + }); + }); + }); + }); + + describe('socket', function(){ + + it('should not fire events more than once after manually reconnecting', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var clientSocket = client(srv, { reconnection: false }); + clientSocket.on('connect', function init() { + clientSocket.removeListener('connect', init); + clientSocket.io.engine.close(); + + clientSocket.connect(); + clientSocket.on('connect', function() { + done(); + }); + }); + }); + }); + + it('should not fire reconnect_failed event more than once when server closed', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var clientSocket = client(srv, { reconnectionAttempts: 3, reconnectionDelay: 10 }); + clientSocket.on('connect', function() { + srv.close(); + }); + + clientSocket.on('reconnect_failed', function() { + done(); + }); + }); + }); + + it('should receive events', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('random', function(a, b, c){ + expect(a).to.be(1); + expect(b).to.be('2'); + expect(c).to.eql([3]); + done(); + }); + socket.emit('random', 1, '2', [3]); + }); + }); + }); + + it('should receive message events through `send`', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('message', function(a){ + expect(a).to.be(1337); + done(); + }); + socket.send(1337); + }); + }); + }); + + it('should error with null messages', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('message', function(a){ + expect(a).to.be(null); + done(); + }); + socket.send(null); + }); + }); + }); + + it('should handle transport null messages', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('error', function(err){ + expect(err).to.be.an(Error); + s.on('disconnect', function(reason){ + expect(reason).to.be('client error'); + done(); + }); + }); + s.client.ondata(null); + }); + }); + }); + + it('should emit events', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + socket.on('woot', function(a){ + expect(a).to.be('tobi'); + done(); + }); + sio.on('connection', function(s){ + s.emit('woot', 'tobi'); + }); + }); + }); + + it('should emit events with utf8 multibyte character', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + var i = 0; + socket.on('hoot', function(a){ + expect(a).to.be('utf8 — string'); + i++; + + if (3 == i) { + done(); + } + }); + sio.on('connection', function(s){ + s.emit('hoot', 'utf8 — string'); + s.emit('hoot', 'utf8 — string'); + s.emit('hoot', 'utf8 — string'); + }); + }); + }); + + it('should emit events with binary data', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + var imageData; + socket.on('doge', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + expect(imageData.length).to.equal(a.length); + expect(imageData[0]).to.equal(a[0]); + expect(imageData[imageData.length - 1]).to.equal(a[a.length - 1]); + done(); + }); + sio.on('connection', function(s){ + fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + if (err) return done(err); + imageData = data; + s.emit('doge', data); + }); + }); + }); + }); + + it('should emit events with several types of data (including binary)', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + socket.on('multiple', function(a, b, c, d, e, f){ + expect(a).to.be(1); + expect(Buffer.isBuffer(b)).to.be(true); + expect(c).to.be('3'); + expect(d).to.eql([4]); + expect(Buffer.isBuffer(e)).to.be(true); + expect(Buffer.isBuffer(f[0])).to.be(true); + expect(f[1]).to.be('swag'); + expect(Buffer.isBuffer(f[2])).to.be(true); + done(); + }); + sio.on('connection', function(s){ + fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + if (err) return done(err); + var buf = new Buffer('asdfasdf', 'utf8'); + s.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); + }); + }); + }); + }); + + it('should receive events with binary data', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('buff', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + done(); + }); + var buf = new Buffer('abcdefg', 'utf8'); + socket.emit('buff', buf); + }); + }); + }); + + it('should receive events with several types of data (including binary)', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('multiple', function(a, b, c, d, e, f){ + expect(a).to.be(1); + expect(Buffer.isBuffer(b)).to.be(true); + expect(c).to.be('3'); + expect(d).to.eql([4]); + expect(Buffer.isBuffer(e)).to.be(true); + expect(Buffer.isBuffer(f[0])).to.be(true); + expect(f[1]).to.be('swag'); + expect(Buffer.isBuffer(f[2])).to.be(true); + done(); + }); + fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + if (err) return done(err); + var buf = new Buffer('asdfasdf', 'utf8'); + socket.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); + }); + }); + }); + }); + + it('should not emit volatile event after regular event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should not emit volatile event after regular event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit only one consecutive volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit only one consecutive volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.volatile.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(1); + done(); + }, 200); + }); + + it('should emit regular events after trying a failed volatile event (polling)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['polling'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + s.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['polling'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(2); + done(); + }, 200); + }); + + it('should emit regular events after trying a failed volatile event (ws)', function(done) { + var srv = http(); + var sio = io(srv, { transports: ['websocket'] }); + + var counter = 0; + srv.listen(function(){ + sio.on('connection', function(s){ + // Wait to make sure there are no packets being sent for opening the connection + setTimeout(function() { + s.emit('ev', 'data'); + s.volatile.emit('ev', 'data'); + s.emit('ev', 'data'); + }, 20); + }); + + var socket = client(srv, { transports: ['websocket'] }); + socket.on('ev', function() { + counter++; + }); + }); + + setTimeout(function() { + expect(counter).to.be(2); + done(); + }, 200); + }); + + it('should emit message events through `send`', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + socket.on('message', function(a){ + expect(a).to.be('a'); + done(); + }); + sio.on('connection', function(s){ + s.send('a'); + }); + }); + }); + + it('should receive event with callbacks', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('woot', function(fn){ + fn(1, 2); + }); + socket.emit('woot', function(a, b){ + expect(a).to.be(1); + expect(b).to.be(2); + done(); + }); + }); + }); + }); + + it('should receive all events emitted from namespaced client immediately and in order', function(done) { + var srv = http(); + var sio = io(srv); + var total = 0; + srv.listen(function(){ + sio.of('/chat', function(s){ + s.on('hi', function(letter){ + total++; + if (total == 2 && letter == 'b') { + done(); + } else if (total == 1 && letter != 'a') { + throw new Error('events out of order'); + } + }); + }); + + var chat = client(srv, '/chat'); + chat.emit('hi', 'a'); + setTimeout(function() { + chat.emit('hi', 'b'); + }, 50); + }); + }); + + it('should emit events with callbacks', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + socket.on('hi', function(fn){ + fn(); + }); + s.emit('hi', function(){ + done(); + }); + }); + }); + }); + + it('should receive events with args and callback', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('woot', function(a, b, fn){ + expect(a).to.be(1); + expect(b).to.be(2); + fn(); + }); + socket.emit('woot', 1, 2, function(){ + done(); + }); + }); + }); + }); + + it('should emit events with args and callback', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + socket.on('hi', function(a, b, fn){ + expect(a).to.be(1); + expect(b).to.be(2); + fn(); + }); + s.emit('hi', 1, 2, function(){ + done(); + }); + }); + }); + }); + + it('should receive events with binary args and callbacks', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('woot', function(buf, fn){ + expect(Buffer.isBuffer(buf)).to.be(true); + fn(1, 2); + }); + socket.emit('woot', new Buffer(3), function(a, b){ + expect(a).to.be(1); + expect(b).to.be(2); + done(); + }); + }); + }); + }); + + it('should emit events with binary args and callback', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + socket.on('hi', function(a, fn){ + expect(Buffer.isBuffer(a)).to.be(true); + fn(); + }); + s.emit('hi', new Buffer(4), function(){ + done(); + }); + }); + }); + }); + + it('should emit events and receive binary data in a callback', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + socket.on('hi', function(fn){ + fn(new Buffer(1)); + }); + s.emit('hi', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + done(); + }); + }); + }); + }); + + it('should receive events and pass binary data in a callback', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.on('woot', function(fn){ + fn(new Buffer(2)); + }); + socket.emit('woot', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + done(); + }); + }); + }); + }); + + it('should have access to the client', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + expect(s.client).to.be.an('object'); + done(); + }); + }); + }); + + it('should have access to the connection', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + expect(s.client.conn).to.be.an('object'); + expect(s.conn).to.be.an('object'); + done(); + }); + }); + }); + + it('should have access to the request', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + expect(s.client.request.headers).to.be.an('object'); + expect(s.request.headers).to.be.an('object'); + done(); + }); + }); + }); + + it('should see query parameters in the request', function(done) { + var srv = http(); + var sio = io(srv); + srv.listen(function() { + var addr = srv.listen().address(); + var url = 'ws://localhost:' + addr.port + '?key1=1&key2=2'; + var socket = ioc(url); + sio.on('connection', function(s) { + var parsed = require('url').parse(s.request.url); + var query = require('querystring').parse(parsed.query); + expect(query.key1).to.be('1'); + expect(query.key2).to.be('2'); + done(); + }); + }); + }); + + it('should handle very large json', function(done){ + this.timeout(30000); + var srv = http(); + var sio = io(srv, { perMessageDeflate: false }); + var received = 0; + srv.listen(function(){ + var socket = client(srv); + socket.on('big', function(a){ + expect(Buffer.isBuffer(a.json)).to.be(false); + if (++received == 3) + done(); + else + socket.emit('big', a); + }); + sio.on('connection', function(s){ + fs.readFile(join(__dirname, 'fixtures', 'big.json'), function(err, data){ + if (err) return done(err); + data = JSON.parse(data); + s.emit('big', {hello: 'friend', json: data}); + }); + s.on('big', function(a){ + s.emit('big', a); + }); + }); + }); + }); + + it('should handle very large binary data', function(done){ + this.timeout(30000); + var srv = http(); + var sio = io(srv, { perMessageDeflate: false }); + var received = 0; + srv.listen(function(){ + var socket = client(srv); + socket.on('big', function(a){ + expect(Buffer.isBuffer(a.image)).to.be(true); + if (++received == 3) + done(); + else + socket.emit('big', a); + }); + sio.on('connection', function(s){ + fs.readFile(join(__dirname, 'fixtures', 'big.jpg'), function(err, data){ + if (err) return done(err); + s.emit('big', {hello: 'friend', image: data}); + }); + s.on('big', function(a){ + expect(Buffer.isBuffer(a.image)).to.be(true); + s.emit('big', a); + }); + }); + }); + }); + + it('should be able to emit after server close and restart', function(done){ + var srv = http(); + var sio = io(srv); + + sio.on('connection', function(socket){ + socket.on('ev', function(data){ + expect(data).to.be('payload'); + done(); + }); + }); + + srv.listen(function(){ + var port = srv.address().port; + var clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); + clientSocket.once('connect', function(){ + srv.close(function(){ + srv.listen(port, function(){ + clientSocket.on('reconnect', function(){ + clientSocket.emit('ev', 'payload'); + }); + }); + }); + }); + }); + }); + + it('should enable compression by default', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(true); + done(); + }); + sio.of('/chat').emit('woot', 'hi'); + }); + }); + }); + + it('should disable compression', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, '/chat'); + sio.of('/chat').on('connection', function(s){ + s.conn.once('packetCreate', function(packet) { + expect(packet.options.compress).to.be(false); + done(); + }); + sio.of('/chat').compress(false).emit('woot', 'hi'); + }); + }); + }); + + it('should error with raw binary and warn', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.conn.on('upgrade', function(){ + console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + socket.io.engine.write('5woooot'); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); + }); + + it('should not crash with raw binary', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.once('error', function(err){ + expect(err.message).to.match(/Illegal attachments/); + done(); + }); + s.conn.on('upgrade', function(){ + socket.io.engine.write('5woooot'); + }); + }); + }); + }); + + it('should handle empty binary packet', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.once('error', function(err){ + expect(err.message).to.match(/Illegal attachments/); + done(); + }); + s.conn.on('upgrade', function(){ + socket.io.engine.write('5'); + }); + }); + }); + }); + + it('should not crash when messing with Object prototype', function(done){ + Object.prototype.foo = 'bar'; + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + + sio.on('connection', function(s){ + s.disconnect(true); + sio.close(); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); + + it('should always trigger the callback (if provided) when joining a room', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + s.join('a', done); + }); + }); + }); + }); + + }); + + describe('messaging many', function(){ + it('emits to a namespace', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + var socket3 = client(srv, '/test'); + socket1.on('a', function(a){ + expect(a).to.be('b'); + --total || done(); + }); + socket2.on('a', function(a){ + expect(a).to.be('b'); + --total || done(); + }); + socket3.on('a', function(){ done(new Error('not')); }); + + var sockets = 3; + sio.on('connection', function(socket){ + --sockets || emit(); + }); + sio.of('/test', function(socket){ + --sockets || emit(); + }); + + function emit(){ + sio.emit('a', 'b'); + } + }); + }); + + it('emits binary data to a namespace', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + var socket3 = client(srv, '/test'); + socket1.on('bin', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + --total || done(); + }); + socket2.on('bin', function(a){ + expect(Buffer.isBuffer(a)).to.be(true); + --total || done(); + }); + socket3.on('bin', function(){ done(new Error('not')); }); + + var sockets = 3; + sio.on('connection', function(socket){ + --sockets || emit(); + }); + sio.of('/test', function(socket){ + --sockets || emit(); + }); + + function emit(){ + sio.emit('bin', new Buffer(10)); + } + }); + }); + + it('emits to the rest', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + var socket3 = client(srv, '/test'); + socket1.on('a', function(a){ + expect(a).to.be('b'); + socket1.emit('finish'); + }); + socket2.emit('broadcast'); + socket2.on('a', function(){ done(new Error('done')); }); + socket3.on('a', function(){ done(new Error('not')); }); + + var sockets = 2; + sio.on('connection', function(socket){ + socket.on('broadcast', function(){ + socket.broadcast.emit('a', 'b'); + }); + socket.on('finish', function(){ + done(); + }); + }); + }); + }); + + it('emits to rooms', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + + socket2.on('a', function(){ + done(new Error('not')); + }); + socket1.on('a', function(){ + done(); + }); + socket1.emit('join', 'woot', function(){ + socket1.emit('emit', 'woot'); + }); + + sio.on('connection', function(socket){ + socket.on('join', function(room, fn){ + socket.join(room, fn); + }); + + socket.on('emit', function(room){ + sio.in(room).emit('a'); + }); + }); + }); + }); + + it('emits to rooms avoiding dupes', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + + socket2.on('a', function(){ + done(new Error('not')); + }); + socket1.on('a', function(){ + --total || done(); + }); + socket2.on('b', function(){ + --total || done(); + }); + + socket1.emit('join', 'woot'); + socket1.emit('join', 'test'); + socket2.emit('join', 'third', function(){ + socket2.emit('emit'); + }); + + sio.on('connection', function(socket){ + socket.on('join', function(room, fn){ + socket.join(room, fn); + }); + + socket.on('emit', function(room){ + sio.in('woot').in('test').emit('a'); + sio.in('third').emit('b'); + }); + }); + }); + }); + + it('broadcasts to rooms', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + var socket3 = client(srv, { multiplex: false }); + + socket1.emit('join', 'woot'); + socket2.emit('join', 'test'); + socket3.emit('join', 'test', function(){ + socket3.emit('broadcast'); + }); + + socket1.on('a', function(){ + done(new Error('not')); + }); + socket2.on('a', function(){ + --total || done(); + }); + socket3.on('a', function(){ + done(new Error('not')); + }); + socket3.on('b', function(){ + --total || done(); + }); + + sio.on('connection', function(socket){ + socket.on('join', function(room, fn){ + socket.join(room, fn); + }); + + socket.on('broadcast', function(){ + socket.broadcast.to('test').emit('a'); + socket.emit('b'); + }); + }); + }); + }); + + it('broadcasts binary data to rooms', function(done){ + var srv = http(); + var sio = io(srv); + var total = 2; + + srv.listen(function(){ + var socket1 = client(srv, { multiplex: false }); + var socket2 = client(srv, { multiplex: false }); + var socket3 = client(srv, { multiplex: false }); + + socket1.emit('join', 'woot'); + socket2.emit('join', 'test'); + socket3.emit('join', 'test', function(){ + socket3.emit('broadcast'); + }); + + socket1.on('bin', function(data){ + throw new Error('got bin in socket1'); + }); + socket2.on('bin', function(data){ + expect(Buffer.isBuffer(data)).to.be(true); + --total || done(); + }); + socket2.on('bin2', function(data) { + throw new Error('socket2 got bin2'); + }); + socket3.on('bin', function(data) { + throw new Error('socket3 got bin'); + }); + socket3.on('bin2', function(data) { + expect(Buffer.isBuffer(data)).to.be(true); + --total || done(); + }); + + sio.on('connection', function(socket){ + socket.on('join', function(room, fn){ + socket.join(room, fn); + }); + socket.on('broadcast', function(){ + socket.broadcast.to('test').emit('bin', new Buffer(5)); + socket.emit('bin2', new Buffer(5)); + }); + }); + }); + }); + + + it('keeps track of rooms', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); + s.join('b', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); + s.join( 'c', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); + s.leave('b', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'c']); + s.leaveAll(); + expect(Object.keys(s.rooms)).to.eql([]); + done(); + }); + }); + }); + }); + }); + }); + }); + + it('deletes empty rooms', function(done) { + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + expect(s.nsp.adapter.rooms).to.have.key('a'); + s.leave('a', function(){ + expect(s.nsp.adapter.rooms).to.not.have.key('a'); + done(); + }); + }); + }); + }); + }); + + it('should properly cleanup left rooms', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join('a', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); + s.join('b', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); + s.leave('unknown', function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); + s.leaveAll(); + expect(Object.keys(s.rooms)).to.eql([]); + done(); + }); + }); + }); + }); + }); + }); + }); + + describe('middleware', function(done){ + var Socket = require('../dist/socket'); + + it('should call functions', function(done){ + var srv = http(); + var sio = io(srv); + var run = 0; + sio.use(function(socket, next){ + expect(socket).to.be.a(Socket); + run++; + next(); + }); + sio.use(function(socket, next){ + expect(socket).to.be.a(Socket); + run++; + next(); + }); + srv.listen(function(){ + var socket = client(srv); + socket.on('connect', function(){ + expect(run).to.be(2); + done(); + }); + }); + }); + + it('should pass errors', function(done){ + var srv = http(); + var sio = io(srv); + var run = 0; + sio.use(function(socket, next){ + next(new Error('Authentication error')); + }); + sio.use(function(socket, next){ + done(new Error('nope')); + }); + srv.listen(function(){ + var socket = client(srv); + socket.on('connect', function(){ + done(new Error('nope')); + }); + socket.on('error', function(err){ + expect(err).to.be('Authentication error'); + done(); + }); + }); + }); + + it('should pass `data` of error object', function(done){ + var srv = http(); + var sio = io(srv); + var run = 0; + sio.use(function(socket, next){ + var err = new Error('Authentication error'); + err.data = { a: 'b', c: 3 }; + next(err); + }); + srv.listen(function(){ + var socket = client(srv); + socket.on('connect', function(){ + done(new Error('nope')); + }); + socket.on('error', function(err){ + expect(err).to.eql({ a: 'b', c: 3 }); + done(); + }); + }); + }); + + it('should only call connection after fns', function(done){ + var srv = http(); + var sio = io(srv); + sio.use(function(socket, next){ + socket.name = 'guillermo'; + next(); + }); + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(socket){ + expect(socket.name).to.be('guillermo'); + done(); + }); + }); + }); + + it('should be ignored if socket gets closed', function(done){ + var srv = http(); + var sio = io(srv); + var socket; + sio.use(function(s, next){ + socket.io.engine.on('open', function(){ + socket.io.engine.close(); + s.client.conn.on('close', function(){ + process.nextTick(next); + setTimeout(function(){ + done(); + }, 50); + }); + }); + }); + srv.listen(function(){ + socket = client(srv); + sio.on('connection', function(socket){ + done(new Error('should not fire')); + }); + }); + }); + + it('should call functions in expected order', function(done){ + var srv = http(); + var sio = io(srv); + var result = []; + + sio.use(function(socket, next) { + result.push(1); + setTimeout(next, 50); + }); + sio.use(function(socket, next) { + result.push(2); + setTimeout(next, 50); + }); + sio.of('/chat').use(function(socket, next) { + result.push(3); + setTimeout(next, 50); + }); + sio.of('/chat').use(function(socket, next) { + result.push(4); + setTimeout(next, 50); + }); + + srv.listen(function() { + var chat = client(srv, '/chat'); + chat.on('connect', function() { + expect(result).to.eql([1, 2, 3, 4]); + done(); + }); + }); + }); + }); +}); From 88161539a15618fda0d44c923a5b7d4f14b11f32 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Thu, 17 Mar 2016 13:42:29 +0800 Subject: [PATCH 144/494] implement compat test using env variable --- gulpfile.js | 7 + test/socket.io.compat.js | 2177 -------------------------------------- test/socket.io.js | 15 +- 3 files changed, 20 insertions(+), 2179 deletions(-) delete mode 100644 test/socket.io.compat.js diff --git a/gulpfile.js b/gulpfile.js index c0788c8d7b..67b5de48bc 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -37,6 +37,13 @@ gulp.task('test', function(){ }); }); +gulp.task('set-compat-node-env', function() { + console.log('testing compat package'); + process.env.MODE = 'compat'; +}); + +gulp.task('test-compat', ['set-compat-node-env', 'test']); + gulp.task('istanbul-pre-test', function () { return gulp.src(['lib/**/*.js']) // Covering files diff --git a/test/socket.io.compat.js b/test/socket.io.compat.js deleted file mode 100644 index 3762b496c9..0000000000 --- a/test/socket.io.compat.js +++ /dev/null @@ -1,2177 +0,0 @@ - -var http = require('http').Server; -var io = require('../dist'); -var fs = require('fs'); -var join = require('path').join; -var exec = require('child_process').exec; -var ioc = require('socket.io-client'); -var request = require('supertest'); -var expect = require('expect.js'); - -// Creates a socket.io client for the given server -function client(srv, nsp, opts){ - if ('object' == typeof nsp) { - opts = nsp; - nsp = null; - } - var addr = srv.address(); - if (!addr) addr = srv.listen().address(); - var url = 'ws://localhost:' + addr.port + (nsp || ''); - return ioc(url, opts); -} - -describe('socket.io', function(){ - - it('should be the same version as client', function(){ - var version = require('../package').version; - expect(version).to.be(require('socket.io-client/package').version); - }); - - describe('set', function() { - it('should be able to set ping timeout to engine.io', function() { - var srv = io(http()); - srv.set('heartbeat timeout', 10); - expect(srv.eio.pingTimeout).to.be(10); - }); - - it('should be able to set ping interval to engine.io', function() { - var srv = io(http()); - srv.set('heartbeat interval', 10); - expect(srv.eio.pingInterval).to.be(10); - }); - - it('should be able to set transports to engine.io', function() { - var srv = io(http()); - srv.set('transports', ['polling']); - expect(srv.eio.transports).to.eql(['polling']); - }); - - it('should be able to set maxHttpBufferSize to engine.io', function() { - var srv = io(http()); - srv.set('destroy buffer size', 10); - expect(srv.eio.maxHttpBufferSize).to.eql(10); - }); - - it('should be able to set path with setting resource', function(done) { - var eio = io(); - var srv = http(); - - eio.set('resource', '/random'); - eio.attach(srv); - - // Check that the server is accessible through the specified path - request(srv) - .get('/random/socket.io.js') - .buffer(true) - .end(function(err, res){ - if (err) return done(err); - done(); - }); - }); - - it('should be able to set origins to engine.io', function() { - var srv = io(http()); - srv.set('origins', 'http://hostname.com:*'); - expect(srv.origins()).to.be('http://hostname.com:*'); - }); - - it('should be able to set authorization and send error packet', function(done) { - var httpSrv = http(); - var srv = io(httpSrv); - srv.set('authorization', function(o, f) { f(null, false); }); - - var socket = client(httpSrv); - socket.on('connect', function(){ - expect().fail(); - }); - socket.on('error', function(err) { - expect(err).to.be('Not authorized'); - done(); - }); - }); - - it('should be able to set authorization and succeed', function(done) { - var httpSrv = http(); - var srv = io(httpSrv); - srv.set('authorization', function(o, f) { f(null, true); }); - - srv.on('connection', function(s) { - s.on('yoyo', function(data) { - expect(data).to.be('data'); - done(); - }); - }); - - var socket = client(httpSrv); - socket.on('connect', function(){ - socket.emit('yoyo', 'data'); - }); - - socket.on('error', function(err) { - expect().fail(); - }); - }); - - it('should set the handshake BC object', function(done){ - var httpSrv = http(); - var srv = io(httpSrv); - - srv.on('connection', function(s) { - expect(s.handshake).to.not.be(undefined); - - // Headers set and has some valid properties - expect(s.handshake.headers).to.be.an('object'); - expect(s.handshake.headers['user-agent']).to.be('node-XMLHttpRequest'); - - // Time set and is valid looking string - expect(s.handshake.time).to.be.a('string'); - expect(s.handshake.time.split(' ').length > 0); // Is "multipart" string representation - - // Address, xdomain, secure, issued and url set - expect(s.handshake.address).to.contain('127.0.0.1'); - expect(s.handshake.xdomain).to.be.a('boolean'); - expect(s.handshake.secure).to.be.a('boolean'); - expect(s.handshake.issued).to.be.a('number'); - expect(s.handshake.url).to.be.a('string'); - - // Query set and has some right properties - expect(s.handshake.query).to.be.an('object'); - expect(s.handshake.query.EIO).to.not.be(undefined); - expect(s.handshake.query.transport).to.not.be(undefined); - expect(s.handshake.query.t).to.not.be(undefined); - - done(); - }); - - var socket = client(httpSrv); - }); - }); - - describe('server attachment', function(){ - describe('http.Server', function(){ - var clientVersion = require('socket.io-client/package').version; - - it('should serve static files', function(done){ - var srv = http(); - io(srv); - request(srv) - .get('/socket.io/socket.io.js') - .buffer(true) - .end(function(err, res){ - if (err) return done(err); - var ctype = res.headers['content-type']; - expect(ctype).to.be('application/javascript'); - expect(res.headers.etag).to.be(clientVersion); - expect(res.text).to.match(/engine\.io/); - expect(res.status).to.be(200); - done(); - }); - }); - - it('should handle 304', function(done){ - var srv = http(); - io(srv); - request(srv) - .get('/socket.io/socket.io.js') - .set('If-None-Match', clientVersion) - .end(function(err, res){ - if (err) return done(err); - expect(res.statusCode).to.be(304); - done(); - }); - }); - - it('should not serve static files', function(done){ - var srv = http(); - io(srv, { serveClient: false }); - request(srv) - .get('/socket.io/socket.io.js') - .expect(400, done); - }); - - it('should work with #attach', function(done){ - var srv = http(function(req, res){ - res.writeHead(404); - res.end(); - }); - var sockets = io(); - sockets.attach(srv); - request(srv) - .get('/socket.io/socket.io.js') - .end(function(err, res){ - if (err) return done(err); - expect(res.status).to.be(200); - done(); - }); - }); - }); - - describe('port', function(done){ - it('should be bound', function(done){ - var sockets = io(54010); - request('http://localhost:54010/') - .get('/socket.io/socket.io.js') - .expect(200, done); - }); - - it('should be bound as a string', function(done) { - var sockets = io('54020'); - request('http://localhost:54020/') - .get('/socket.io/socket.io.js') - .expect(200, done); - }); - - it('with listen', function(done){ - var sockets = io().listen(54011); - request('http://localhost:54011/') - .get('/socket.io/socket.io.js') - .expect(200, done); - }); - - it('as a string', function(done){ - var sockets = io().listen('54012'); - request('http://localhost:54012/') - .get('/socket.io/socket.io.js') - .expect(200, done); - }); - }); - }); - - describe('handshake', function(){ - var request = require('superagent'); - - it('should disallow request when origin defined and none specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54013'); - request.get('http://localhost:54013/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(400); - done(); - }); - }); - - it('should disallow request when origin defined and a different one specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54014'); - request.get('http://localhost:54014/socket.io/default/') - .query({ transport: 'polling' }) - .set('origin', 'http://herp.derp/') - .end(function (err, res) { - expect(res.status).to.be(400); - done(); - }); - }); - - it('should allow request when origin defined an the same is specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54015'); - request.get('http://localhost:54015/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(200); - done(); - }); - }); - - it('should allow request when origin defined as function and same is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == 'http://foo.example/') { - return callback(null, true); - } - return callback(null, false); - } }).listen('54016'); - request.get('http://localhost:54016/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(200); - done(); - }); - }); - - it('should allow request when origin defined as function and different is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == 'http://foo.example/') { - return callback(null, true); - } - return callback(null, false); - } }).listen('54017'); - request.get('http://localhost:54017/socket.io/default/') - .set('origin', 'http://herp.derp/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(400); - done(); - }); - }); - - it('should allow request when origin defined as function and no origin is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == '*') { - return callback(null, true); - } - return callback(null, false); - } }).listen('54021'); - request.get('http://localhost:54021/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(200); - done(); - }); - }); - - it('should default to port 443 when protocol is https', function(done) { - var sockets = io({ origins: 'https://foo.example/' }).listen('54036'); - request.get('http://localhost:54036/socket.io/default/') - .set('origin', 'https://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(200); - done(); - }); - }); - - it('should allow request if custom function in opts.allowRequest returns true', function(done){ - var sockets = io(http().listen(54022), { allowRequest: function (req, callback) { - return callback(null, true); - }, origins: 'http://foo.example:*' }); - - request.get('http://localhost:54022/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(200); - done(); - }); - }); - - it('should disallow request if custom function in opts.allowRequest returns false', function(done){ - var sockets = io(http().listen(54023), { allowRequest: function (req, callback) { - return callback(null, false); - } }); - request.get('http://localhost:54023/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { - expect(res.status).to.be(400); - done(); - }); - }); - }); - - describe('close', function(){ - - it('should be able to close sio sending a srv', function(){ - var PORT = 54018; - var srv = http().listen(PORT); - var sio = io(srv); - var net = require('net'); - var server = net.createServer(); - - var clientSocket = client(srv, { reconnection: false }); - - clientSocket.on('disconnect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); - server.listen(PORT); - }); - - clientSocket.on('connect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); - sio.close(); - }); - - server.once('listening', function() { - // PORT should be free - server.close(function(error){ - expect(error).to.be(undefined); - }); - }); - - }); - - it('should be able to close sio sending a port', function(){ - var PORT = 54019; - var sio = io(PORT); - var net = require('net'); - var server = net.createServer(); - - var clientSocket = ioc('ws://0.0.0.0:' + PORT); - - clientSocket.on('disconnect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); - server.listen(PORT); - }); - - clientSocket.on('connect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); - sio.close(); - }); - - server.once('listening', function() { - // PORT should be free - server.close(function(error){ - expect(error).to.be(undefined); - }); - }); - }); - - describe('graceful close', function(){ - function fixture(filename) { - return process.execPath + ' ' + - join(__dirname, 'fixtures', filename); - } - - it('should stop socket and timers', function(done){ - exec(fixture('server-close.js'), done); - }); - }); - }); - - describe('namespaces', function(){ - var Socket = require('../dist/socket'); - var Namespace = require('../dist/namespace'); - console.log(Namespace); - it('should be accessible through .sockets', function(){ - var sio = io(); - expect(sio.sockets).to.be.a(Namespace); - }); - - it('should be aliased', function(){ - var sio = io(); - expect(sio.use).to.be.a('function'); - expect(sio.to).to.be.a('function'); - expect(sio['in']).to.be.a('function'); - expect(sio.emit).to.be.a('function'); - expect(sio.send).to.be.a('function'); - expect(sio.write).to.be.a('function'); - expect(sio.clients).to.be.a('function'); - expect(sio.compress).to.be.a('function'); - expect(sio.json).to.be(sio); - expect(sio.volatile).to.be(sio); - expect(sio.sockets.flags).to.eql({ json: true, volatile: true }); - delete sio.sockets.flags; - }); - - it('should automatically connect', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - socket.on('connect', function(){ - done(); - }); - }); - }); - - it('should fire a `connection` event', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(socket){ - expect(socket).to.be.a(Socket); - done(); - }); - }); - }); - - it('should fire a `connect` event', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connect', function(socket){ - expect(socket).to.be.a(Socket); - done(); - }); - }); - }); - - it('should work with many sockets', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - sio.of('/chat'); - sio.of('/news'); - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); - var total = 2; - chat.on('connect', function(){ - --total || done(); - }); - news.on('connect', function(){ - --total || done(); - }); - }); - }); - - it('should be able to equivalently start with "" or "/" on server', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - sio.of('').on('connection', function(){ - --total || done(); - }); - sio.of('abc').on('connection', function(){ - --total || done(); - }); - var c1 = client(srv, '/'); - var c2 = client(srv, '/abc'); - }); - - it('should be equivalent for "" and "/" on client', function(done){ - var srv = http(); - var sio = io(srv); - sio.of('/').on('connection', function(){ - done(); - }); - var c1 = client(srv, ''); - }); - - it('should work with `of` and many sockets', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); - var total = 2; - sio.of('/news').on('connection', function(socket){ - expect(socket).to.be.a(Socket); - --total || done(); - }); - sio.of('/news').on('connection', function(socket){ - expect(socket).to.be.a(Socket); - --total || done(); - }); - }); - }); - - it('should work with `of` second param', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); - var total = 2; - sio.of('/news', function(socket){ - expect(socket).to.be.a(Socket); - --total || done(); - }); - sio.of('/news', function(socket){ - expect(socket).to.be.a(Socket); - --total || done(); - }); - }); - }); - - it('should disconnect upon transport disconnection', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); - var total = 2; - var totald = 2; - var s; - sio.of('/news', function(socket){ - socket.on('disconnect', function(reason){ - --totald || done(); - }); - --total || close(); - }); - sio.of('/chat', function(socket){ - s = socket; - socket.on('disconnect', function(reason){ - --totald || done(); - }); - --total || close(); - }); - function close(){ - s.disconnect(true); - } - }); - }); - - it('should disconnect both default and custom namespace upon disconnect', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var lolcats = client(srv, '/lolcats'); - var total = 2; - var totald = 2; - var s; - sio.of('/', function(socket){ - socket.on('disconnect', function(reason){ - --totald || done(); - }); - --total || close(); - }); - sio.of('/lolcats', function(socket){ - s = socket; - socket.on('disconnect', function(reason){ - --totald || done(); - }); - --total || close(); - }); - function close(){ - s.disconnect(true); - } - }); - }); - - it('should not crash while disconnecting socket', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv,'/ns'); - sio.on('connection', function(socket){ - socket.disconnect(); - done(); - }); - }); - }); - - it('should return error connecting to non-existent namespace', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv,'/doesnotexist'); - socket.on('error', function(err) { - expect(err).to.be('Invalid namespace'); - done(); - }); - }); - }); - - it('should not reuse same-namespace connections', function(done){ - var srv = http(); - var sio = io(srv); - var connections = 0; - - srv.listen(function() { - var clientSocket1 = client(srv); - var clientSocket2 = client(srv); - sio.on('connection', function() { - connections++; - if(connections === 2) { - done(); - } - }); - }); - }); - - it('should find all clients in a namespace', function(done){ - var srv = http(); - var sio = io(srv); - var chatSids = []; - var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); - var total = 3; - sio.of('/chat').on('connection', function(socket){ - chatSids.push(socket.id); - --total || getClients(); - }); - sio.of('/other').on('connection', function(socket){ - otherSid = socket.id; - --total || getClients(); - }); - }); - function getClients() { - sio.of('/chat').clients(function(error, sids) { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatSids[0]); - expect(sids).to.contain(chatSids[1]); - expect(sids).to.not.contain(otherSid); - done(); - }); - } - }); - - it('should find all clients in a namespace room', function(done){ - var srv = http(); - var sio = io(srv); - var chatFooSid = null; - var chatBarSid = null; - var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); - var chatIndex = 0; - var total = 3; - sio.of('/chat').on('connection', function(socket){ - if (chatIndex++) { - socket.join('foo', function() { - chatFooSid = socket.id; - --total || getClients(); - }); - } else { - socket.join('bar', function() { - chatBarSid = socket.id; - --total || getClients(); - }); - } - }); - sio.of('/other').on('connection', function(socket){ - socket.join('foo', function() { - otherSid = socket.id; - --total || getClients(); - }); - }); - }); - function getClients() { - sio.of('/chat').in('foo').clients(function(error, sids) { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatFooSid); - expect(sids).to.not.contain(chatBarSid); - expect(sids).to.not.contain(otherSid); - done(); - }); - } - }); - - it('should find all clients across namespace rooms', function(done){ - var srv = http(); - var sio = io(srv); - var chatFooSid = null; - var chatBarSid = null; - var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); - var chatIndex = 0; - var total = 3; - sio.of('/chat').on('connection', function(socket){ - if (chatIndex++) { - socket.join('foo', function() { - chatFooSid = socket.id; - --total || getClients(); - }); - } else { - socket.join('bar', function() { - chatBarSid = socket.id; - --total || getClients(); - }); - } - }); - sio.of('/other').on('connection', function(socket){ - socket.join('foo', function() { - otherSid = socket.id; - --total || getClients(); - }); - }); - }); - function getClients() { - sio.of('/chat').clients(function(error, sids) { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatFooSid); - expect(sids).to.contain(chatBarSid); - expect(sids).to.not.contain(otherSid); - done(); - }); - } - }); - - it('should not emit volatile event after regular event', function(done) { - var srv = http(); - var sio = io(srv); - - var counter = 0; - srv.listen(function(){ - sio.of('/chat').on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - sio.of('/chat').emit('ev', 'data'); - sio.of('/chat').volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, '/chat'); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit volatile event', function(done) { - var srv = http(); - var sio = io(srv); - - var counter = 0; - srv.listen(function(){ - sio.of('/chat').on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - sio.of('/chat').volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, '/chat'); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should enable compression by default', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(true); - done(); - }); - sio.of('/chat').emit('woot', 'hi'); - }); - }); - }); - - it('should disable compression', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(false); - done(); - }); - sio.of('/chat').compress(false).emit('woot', 'hi'); - }); - }); - }); - }); - - describe('socket', function(){ - - it('should not fire events more than once after manually reconnecting', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var clientSocket = client(srv, { reconnection: false }); - clientSocket.on('connect', function init() { - clientSocket.removeListener('connect', init); - clientSocket.io.engine.close(); - - clientSocket.connect(); - clientSocket.on('connect', function() { - done(); - }); - }); - }); - }); - - it('should not fire reconnect_failed event more than once when server closed', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var clientSocket = client(srv, { reconnectionAttempts: 3, reconnectionDelay: 10 }); - clientSocket.on('connect', function() { - srv.close(); - }); - - clientSocket.on('reconnect_failed', function() { - done(); - }); - }); - }); - - it('should receive events', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('random', function(a, b, c){ - expect(a).to.be(1); - expect(b).to.be('2'); - expect(c).to.eql([3]); - done(); - }); - socket.emit('random', 1, '2', [3]); - }); - }); - }); - - it('should receive message events through `send`', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('message', function(a){ - expect(a).to.be(1337); - done(); - }); - socket.send(1337); - }); - }); - }); - - it('should error with null messages', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('message', function(a){ - expect(a).to.be(null); - done(); - }); - socket.send(null); - }); - }); - }); - - it('should handle transport null messages', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('error', function(err){ - expect(err).to.be.an(Error); - s.on('disconnect', function(reason){ - expect(reason).to.be('client error'); - done(); - }); - }); - s.client.ondata(null); - }); - }); - }); - - it('should emit events', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - socket.on('woot', function(a){ - expect(a).to.be('tobi'); - done(); - }); - sio.on('connection', function(s){ - s.emit('woot', 'tobi'); - }); - }); - }); - - it('should emit events with utf8 multibyte character', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - var i = 0; - socket.on('hoot', function(a){ - expect(a).to.be('utf8 — string'); - i++; - - if (3 == i) { - done(); - } - }); - sio.on('connection', function(s){ - s.emit('hoot', 'utf8 — string'); - s.emit('hoot', 'utf8 — string'); - s.emit('hoot', 'utf8 — string'); - }); - }); - }); - - it('should emit events with binary data', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - var imageData; - socket.on('doge', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - expect(imageData.length).to.equal(a.length); - expect(imageData[0]).to.equal(a[0]); - expect(imageData[imageData.length - 1]).to.equal(a[a.length - 1]); - done(); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ - if (err) return done(err); - imageData = data; - s.emit('doge', data); - }); - }); - }); - }); - - it('should emit events with several types of data (including binary)', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - socket.on('multiple', function(a, b, c, d, e, f){ - expect(a).to.be(1); - expect(Buffer.isBuffer(b)).to.be(true); - expect(c).to.be('3'); - expect(d).to.eql([4]); - expect(Buffer.isBuffer(e)).to.be(true); - expect(Buffer.isBuffer(f[0])).to.be(true); - expect(f[1]).to.be('swag'); - expect(Buffer.isBuffer(f[2])).to.be(true); - done(); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ - if (err) return done(err); - var buf = new Buffer('asdfasdf', 'utf8'); - s.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); - }); - }); - }); - }); - - it('should receive events with binary data', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('buff', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - done(); - }); - var buf = new Buffer('abcdefg', 'utf8'); - socket.emit('buff', buf); - }); - }); - }); - - it('should receive events with several types of data (including binary)', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('multiple', function(a, b, c, d, e, f){ - expect(a).to.be(1); - expect(Buffer.isBuffer(b)).to.be(true); - expect(c).to.be('3'); - expect(d).to.eql([4]); - expect(Buffer.isBuffer(e)).to.be(true); - expect(Buffer.isBuffer(f[0])).to.be(true); - expect(f[1]).to.be('swag'); - expect(Buffer.isBuffer(f[2])).to.be(true); - done(); - }); - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ - if (err) return done(err); - var buf = new Buffer('asdfasdf', 'utf8'); - socket.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); - }); - }); - }); - }); - - it('should not emit volatile event after regular event (polling)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['polling'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - }); - - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should not emit volatile event after regular event (ws)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - }); - - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit volatile event (polling)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['polling'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit volatile event (ws)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit only one consecutive volatile event (polling)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['polling'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.volatile.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit only one consecutive volatile event (ws)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.volatile.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(1); - done(); - }, 200); - }); - - it('should emit regular events after trying a failed volatile event (polling)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['polling'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - s.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(2); - done(); - }, 200); - }); - - it('should emit regular events after trying a failed volatile event (ws)', function(done) { - var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); - - var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - s.emit('ev', 'data'); - }, 20); - }); - - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { - counter++; - }); - }); - - setTimeout(function() { - expect(counter).to.be(2); - done(); - }, 200); - }); - - it('should emit message events through `send`', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - socket.on('message', function(a){ - expect(a).to.be('a'); - done(); - }); - sio.on('connection', function(s){ - s.send('a'); - }); - }); - }); - - it('should receive event with callbacks', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(fn){ - fn(1, 2); - }); - socket.emit('woot', function(a, b){ - expect(a).to.be(1); - expect(b).to.be(2); - done(); - }); - }); - }); - }); - - it('should receive all events emitted from namespaced client immediately and in order', function(done) { - var srv = http(); - var sio = io(srv); - var total = 0; - srv.listen(function(){ - sio.of('/chat', function(s){ - s.on('hi', function(letter){ - total++; - if (total == 2 && letter == 'b') { - done(); - } else if (total == 1 && letter != 'a') { - throw new Error('events out of order'); - } - }); - }); - - var chat = client(srv, '/chat'); - chat.emit('hi', 'a'); - setTimeout(function() { - chat.emit('hi', 'b'); - }, 50); - }); - }); - - it('should emit events with callbacks', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(fn){ - fn(); - }); - s.emit('hi', function(){ - done(); - }); - }); - }); - }); - - it('should receive events with args and callback', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(a, b, fn){ - expect(a).to.be(1); - expect(b).to.be(2); - fn(); - }); - socket.emit('woot', 1, 2, function(){ - done(); - }); - }); - }); - }); - - it('should emit events with args and callback', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(a, b, fn){ - expect(a).to.be(1); - expect(b).to.be(2); - fn(); - }); - s.emit('hi', 1, 2, function(){ - done(); - }); - }); - }); - }); - - it('should receive events with binary args and callbacks', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(buf, fn){ - expect(Buffer.isBuffer(buf)).to.be(true); - fn(1, 2); - }); - socket.emit('woot', new Buffer(3), function(a, b){ - expect(a).to.be(1); - expect(b).to.be(2); - done(); - }); - }); - }); - }); - - it('should emit events with binary args and callback', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(a, fn){ - expect(Buffer.isBuffer(a)).to.be(true); - fn(); - }); - s.emit('hi', new Buffer(4), function(){ - done(); - }); - }); - }); - }); - - it('should emit events and receive binary data in a callback', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(fn){ - fn(new Buffer(1)); - }); - s.emit('hi', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - done(); - }); - }); - }); - }); - - it('should receive events and pass binary data in a callback', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(fn){ - fn(new Buffer(2)); - }); - socket.emit('woot', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - done(); - }); - }); - }); - }); - - it('should have access to the client', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client).to.be.an('object'); - done(); - }); - }); - }); - - it('should have access to the connection', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client.conn).to.be.an('object'); - expect(s.conn).to.be.an('object'); - done(); - }); - }); - }); - - it('should have access to the request', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client.request.headers).to.be.an('object'); - expect(s.request.headers).to.be.an('object'); - done(); - }); - }); - }); - - it('should see query parameters in the request', function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var addr = srv.listen().address(); - var url = 'ws://localhost:' + addr.port + '?key1=1&key2=2'; - var socket = ioc(url); - sio.on('connection', function(s) { - var parsed = require('url').parse(s.request.url); - var query = require('querystring').parse(parsed.query); - expect(query.key1).to.be('1'); - expect(query.key2).to.be('2'); - done(); - }); - }); - }); - - it('should handle very large json', function(done){ - this.timeout(30000); - var srv = http(); - var sio = io(srv, { perMessageDeflate: false }); - var received = 0; - srv.listen(function(){ - var socket = client(srv); - socket.on('big', function(a){ - expect(Buffer.isBuffer(a.json)).to.be(false); - if (++received == 3) - done(); - else - socket.emit('big', a); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'fixtures', 'big.json'), function(err, data){ - if (err) return done(err); - data = JSON.parse(data); - s.emit('big', {hello: 'friend', json: data}); - }); - s.on('big', function(a){ - s.emit('big', a); - }); - }); - }); - }); - - it('should handle very large binary data', function(done){ - this.timeout(30000); - var srv = http(); - var sio = io(srv, { perMessageDeflate: false }); - var received = 0; - srv.listen(function(){ - var socket = client(srv); - socket.on('big', function(a){ - expect(Buffer.isBuffer(a.image)).to.be(true); - if (++received == 3) - done(); - else - socket.emit('big', a); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'fixtures', 'big.jpg'), function(err, data){ - if (err) return done(err); - s.emit('big', {hello: 'friend', image: data}); - }); - s.on('big', function(a){ - expect(Buffer.isBuffer(a.image)).to.be(true); - s.emit('big', a); - }); - }); - }); - }); - - it('should be able to emit after server close and restart', function(done){ - var srv = http(); - var sio = io(srv); - - sio.on('connection', function(socket){ - socket.on('ev', function(data){ - expect(data).to.be('payload'); - done(); - }); - }); - - srv.listen(function(){ - var port = srv.address().port; - var clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); - clientSocket.once('connect', function(){ - srv.close(function(){ - srv.listen(port, function(){ - clientSocket.on('reconnect', function(){ - clientSocket.emit('ev', 'payload'); - }); - }); - }); - }); - }); - }); - - it('should enable compression by default', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(true); - done(); - }); - sio.of('/chat').emit('woot', 'hi'); - }); - }); - }); - - it('should disable compression', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { - expect(packet.options.compress).to.be(false); - done(); - }); - sio.of('/chat').compress(false).emit('woot', 'hi'); - }); - }); - }); - - it('should error with raw binary and warn', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.conn.on('upgrade', function(){ - console.log('\033[96mNote: warning expected and normal in test.\033[39m'); - socket.io.engine.write('5woooot'); - setTimeout(function(){ - done(); - }, 100); - }); - }); - }); - }); - - it('should not crash with raw binary', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.once('error', function(err){ - expect(err.message).to.match(/Illegal attachments/); - done(); - }); - s.conn.on('upgrade', function(){ - socket.io.engine.write('5woooot'); - }); - }); - }); - }); - - it('should handle empty binary packet', function(done){ - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.once('error', function(err){ - expect(err.message).to.match(/Illegal attachments/); - done(); - }); - s.conn.on('upgrade', function(){ - socket.io.engine.write('5'); - }); - }); - }); - }); - - it('should not crash when messing with Object prototype', function(done){ - Object.prototype.foo = 'bar'; - var srv = http(); - var sio = io(srv); - srv.listen(function(){ - var socket = client(srv); - - sio.on('connection', function(s){ - s.disconnect(true); - sio.close(); - setTimeout(function(){ - done(); - }, 100); - }); - }); - }); - - it('should always trigger the callback (if provided) when joining a room', function(done){ - var srv = http(); - var sio = io(srv); - - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - s.join('a', done); - }); - }); - }); - }); - - }); - - describe('messaging many', function(){ - it('emits to a namespace', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('a', function(a){ - expect(a).to.be('b'); - --total || done(); - }); - socket2.on('a', function(a){ - expect(a).to.be('b'); - --total || done(); - }); - socket3.on('a', function(){ done(new Error('not')); }); - - var sockets = 3; - sio.on('connection', function(socket){ - --sockets || emit(); - }); - sio.of('/test', function(socket){ - --sockets || emit(); - }); - - function emit(){ - sio.emit('a', 'b'); - } - }); - }); - - it('emits binary data to a namespace', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('bin', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - --total || done(); - }); - socket2.on('bin', function(a){ - expect(Buffer.isBuffer(a)).to.be(true); - --total || done(); - }); - socket3.on('bin', function(){ done(new Error('not')); }); - - var sockets = 3; - sio.on('connection', function(socket){ - --sockets || emit(); - }); - sio.of('/test', function(socket){ - --sockets || emit(); - }); - - function emit(){ - sio.emit('bin', new Buffer(10)); - } - }); - }); - - it('emits to the rest', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('a', function(a){ - expect(a).to.be('b'); - socket1.emit('finish'); - }); - socket2.emit('broadcast'); - socket2.on('a', function(){ done(new Error('done')); }); - socket3.on('a', function(){ done(new Error('not')); }); - - var sockets = 2; - sio.on('connection', function(socket){ - socket.on('broadcast', function(){ - socket.broadcast.emit('a', 'b'); - }); - socket.on('finish', function(){ - done(); - }); - }); - }); - }); - - it('emits to rooms', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - - socket2.on('a', function(){ - done(new Error('not')); - }); - socket1.on('a', function(){ - done(); - }); - socket1.emit('join', 'woot', function(){ - socket1.emit('emit', 'woot'); - }); - - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ - socket.join(room, fn); - }); - - socket.on('emit', function(room){ - sio.in(room).emit('a'); - }); - }); - }); - }); - - it('emits to rooms avoiding dupes', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - - socket2.on('a', function(){ - done(new Error('not')); - }); - socket1.on('a', function(){ - --total || done(); - }); - socket2.on('b', function(){ - --total || done(); - }); - - socket1.emit('join', 'woot'); - socket1.emit('join', 'test'); - socket2.emit('join', 'third', function(){ - socket2.emit('emit'); - }); - - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ - socket.join(room, fn); - }); - - socket.on('emit', function(room){ - sio.in('woot').in('test').emit('a'); - sio.in('third').emit('b'); - }); - }); - }); - }); - - it('broadcasts to rooms', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, { multiplex: false }); - - socket1.emit('join', 'woot'); - socket2.emit('join', 'test'); - socket3.emit('join', 'test', function(){ - socket3.emit('broadcast'); - }); - - socket1.on('a', function(){ - done(new Error('not')); - }); - socket2.on('a', function(){ - --total || done(); - }); - socket3.on('a', function(){ - done(new Error('not')); - }); - socket3.on('b', function(){ - --total || done(); - }); - - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ - socket.join(room, fn); - }); - - socket.on('broadcast', function(){ - socket.broadcast.to('test').emit('a'); - socket.emit('b'); - }); - }); - }); - }); - - it('broadcasts binary data to rooms', function(done){ - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function(){ - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, { multiplex: false }); - - socket1.emit('join', 'woot'); - socket2.emit('join', 'test'); - socket3.emit('join', 'test', function(){ - socket3.emit('broadcast'); - }); - - socket1.on('bin', function(data){ - throw new Error('got bin in socket1'); - }); - socket2.on('bin', function(data){ - expect(Buffer.isBuffer(data)).to.be(true); - --total || done(); - }); - socket2.on('bin2', function(data) { - throw new Error('socket2 got bin2'); - }); - socket3.on('bin', function(data) { - throw new Error('socket3 got bin'); - }); - socket3.on('bin2', function(data) { - expect(Buffer.isBuffer(data)).to.be(true); - --total || done(); - }); - - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ - socket.join(room, fn); - }); - socket.on('broadcast', function(){ - socket.broadcast.to('test').emit('bin', new Buffer(5)); - socket.emit('bin2', new Buffer(5)); - }); - }); - }); - }); - - - it('keeps track of rooms', function(done){ - var srv = http(); - var sio = io(srv); - - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); - s.join('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); - s.join( 'c', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); - s.leave('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'c']); - s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); - done(); - }); - }); - }); - }); - }); - }); - }); - - it('deletes empty rooms', function(done) { - var srv = http(); - var sio = io(srv); - - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(s.nsp.adapter.rooms).to.have.key('a'); - s.leave('a', function(){ - expect(s.nsp.adapter.rooms).to.not.have.key('a'); - done(); - }); - }); - }); - }); - }); - - it('should properly cleanup left rooms', function(done){ - var srv = http(); - var sio = io(srv); - - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); - s.join('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); - s.leave('unknown', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); - s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); - done(); - }); - }); - }); - }); - }); - }); - }); - - describe('middleware', function(done){ - var Socket = require('../dist/socket'); - - it('should call functions', function(done){ - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next){ - expect(socket).to.be.a(Socket); - run++; - next(); - }); - sio.use(function(socket, next){ - expect(socket).to.be.a(Socket); - run++; - next(); - }); - srv.listen(function(){ - var socket = client(srv); - socket.on('connect', function(){ - expect(run).to.be(2); - done(); - }); - }); - }); - - it('should pass errors', function(done){ - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next){ - next(new Error('Authentication error')); - }); - sio.use(function(socket, next){ - done(new Error('nope')); - }); - srv.listen(function(){ - var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); - }); - socket.on('error', function(err){ - expect(err).to.be('Authentication error'); - done(); - }); - }); - }); - - it('should pass `data` of error object', function(done){ - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next){ - var err = new Error('Authentication error'); - err.data = { a: 'b', c: 3 }; - next(err); - }); - srv.listen(function(){ - var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); - }); - socket.on('error', function(err){ - expect(err).to.eql({ a: 'b', c: 3 }); - done(); - }); - }); - }); - - it('should only call connection after fns', function(done){ - var srv = http(); - var sio = io(srv); - sio.use(function(socket, next){ - socket.name = 'guillermo'; - next(); - }); - srv.listen(function(){ - var socket = client(srv); - sio.on('connection', function(socket){ - expect(socket.name).to.be('guillermo'); - done(); - }); - }); - }); - - it('should be ignored if socket gets closed', function(done){ - var srv = http(); - var sio = io(srv); - var socket; - sio.use(function(s, next){ - socket.io.engine.on('open', function(){ - socket.io.engine.close(); - s.client.conn.on('close', function(){ - process.nextTick(next); - setTimeout(function(){ - done(); - }, 50); - }); - }); - }); - srv.listen(function(){ - socket = client(srv); - sio.on('connection', function(socket){ - done(new Error('should not fire')); - }); - }); - }); - - it('should call functions in expected order', function(done){ - var srv = http(); - var sio = io(srv); - var result = []; - - sio.use(function(socket, next) { - result.push(1); - setTimeout(next, 50); - }); - sio.use(function(socket, next) { - result.push(2); - setTimeout(next, 50); - }); - sio.of('/chat').use(function(socket, next) { - result.push(3); - setTimeout(next, 50); - }); - sio.of('/chat').use(function(socket, next) { - result.push(4); - setTimeout(next, 50); - }); - - srv.listen(function() { - var chat = client(srv, '/chat'); - chat.on('connect', function() { - expect(result).to.eql([1, 2, 3, 4]); - done(); - }); - }); - }); - }); -}); diff --git a/test/socket.io.js b/test/socket.io.js index eb1a8308b9..35165a6bf5 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,6 +1,9 @@ - +var mode = process.env.MODE; var http = require('http').Server; var io = require('..'); +if(mode === 'compat') { + io = require('../dist'); +} var fs = require('fs'); var join = require('path').join; var exec = require('child_process').exec; @@ -427,8 +430,13 @@ describe('socket.io', function(){ describe('namespaces', function(){ var Socket = require('../lib/socket'); + if(mode === 'compat') { + Socket = require('../dist/socket'); + } var Namespace = require('../lib/namespace'); - + if(mode === 'compat') { + Namespace = require('../dist/namespace'); + } it('should be accessible through .sockets', function(){ var sio = io(); expect(sio.sockets).to.be.a(Namespace); @@ -2037,6 +2045,9 @@ describe('socket.io', function(){ describe('middleware', function(done){ var Socket = require('../lib/socket'); + if(mode === 'compat') { + Socket = require('../dist/socket'); + } it('should call functions', function(done){ var srv = http(); From 1245a5639e73e2f8a239c15eebe77ae16153b625 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 19 Mar 2016 19:21:54 +0800 Subject: [PATCH 145/494] added compat test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4e276e498..8c45f6cf25 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "git://github.com/Automattic/socket.io" }, "scripts": { - "test": "./node_modules/.bin/gulp test" + "test": "./node_modules/.bin/gulp test && ./node_modules/.bin/gulp test-compat" }, "dependencies": { "engine.io": "1.6.8", From 5253bc400b2b3a85720c7db1dcc544e0bf5b980c Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 19 Mar 2016 19:41:14 +0800 Subject: [PATCH 146/494] use multiple npm scripts --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c45f6cf25..475e45a77c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "url": "git://github.com/Automattic/socket.io" }, "scripts": { - "test": "./node_modules/.bin/gulp test && ./node_modules/.bin/gulp test-compat" + "test": "npm run test-current && npm run test-compat", + "test-current": "./node_modules/.bin/gulp test", + "test-compat": "./node_modules/.bin/gulp test-compat" }, "dependencies": { "engine.io": "1.6.8", From 5a20c1195b0fc6c1120ac1fe5058c7bd1c73dca9 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 19 Mar 2016 19:49:41 +0800 Subject: [PATCH 147/494] set env vars in travis --- .travis.yml | 8 ++++++++ package.json | 4 +--- test/socket.io.js | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0391af3b90..8254087f8b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,14 @@ node_js: git: depth: 1 +matrix: + include: + - node_js: '0.10' + env: MODE = compat + - node_js: '0.12' + env: MODE = compat + - node_js: '4' + env: MODE = compat #matrix: #fast_finish: true #allow_failures: diff --git a/package.json b/package.json index 475e45a77c..e4e276e498 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,7 @@ "url": "git://github.com/Automattic/socket.io" }, "scripts": { - "test": "npm run test-current && npm run test-compat", - "test-current": "./node_modules/.bin/gulp test", - "test-compat": "./node_modules/.bin/gulp test-compat" + "test": "./node_modules/.bin/gulp test" }, "dependencies": { "engine.io": "1.6.8", diff --git a/test/socket.io.js b/test/socket.io.js index 35165a6bf5..d751bdb79a 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2,6 +2,7 @@ var mode = process.env.MODE; var http = require('http').Server; var io = require('..'); if(mode === 'compat') { + console.log('testing compat version'); io = require('../dist'); } var fs = require('fs'); From de5b588e1743a85cb111220f14b7662c298ce321 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 19 Mar 2016 20:03:33 +0800 Subject: [PATCH 148/494] explicit distinction between current and compat in test so we can serve either compat or current as default --- .travis.yml | 6 +++--- gulpfile.js | 5 +++-- test/socket.io.js | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8254087f8b..5501d927c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,11 +13,11 @@ git: matrix: include: - node_js: '0.10' - env: MODE = compat + env: MODE=compat - node_js: '0.12' - env: MODE = compat + env: MODE=compat - node_js: '4' - env: MODE = compat + env: MODE=compat #matrix: #fast_finish: true #allow_failures: diff --git a/gulpfile.js b/gulpfile.js index 67b5de48bc..ae03a93dc4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,10 +23,12 @@ gulp.task('clean', function () { }) gulp.task('test', function(){ + console.log(process.env.MODE); + console.log(process.env.MODE === 'compat'); return gulp.src('test/socket.io.js', {read: false}) .pipe(mocha({ slow: 200, - reporter: 'dot', + reporter: 'spec', bail: true })) .once('error', function () { @@ -38,7 +40,6 @@ gulp.task('test', function(){ }); gulp.task('set-compat-node-env', function() { - console.log('testing compat package'); process.env.MODE = 'compat'; }); diff --git a/test/socket.io.js b/test/socket.io.js index d751bdb79a..e6cd1c7623 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,6 +1,6 @@ var mode = process.env.MODE; var http = require('http').Server; -var io = require('..'); +var io = require('../lib'); if(mode === 'compat') { console.log('testing compat version'); io = require('../dist'); From a1ff739b36e74c394714fcd5d237a151afd6c6d9 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Sat, 19 Mar 2016 20:19:08 +0800 Subject: [PATCH 149/494] babel transpile before test, print error --- gulpfile.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index ae03a93dc4..1fa33e316a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -22,16 +22,15 @@ gulp.task('clean', function () { return del([TRANSPILE_DEST_DIR]); }) -gulp.task('test', function(){ - console.log(process.env.MODE); - console.log(process.env.MODE === 'compat'); +gulp.task('test', ['transpile'], function(){ return gulp.src('test/socket.io.js', {read: false}) .pipe(mocha({ slow: 200, reporter: 'spec', bail: true })) - .once('error', function () { + .once('error', function (err) { + console.error(err.stack); process.exit(1); }) .once('end', function () { @@ -59,7 +58,8 @@ gulp.task('test-cov', ['istanbul-pre-test'], function(){ reporter: 'dot' })) .pipe(istanbul.writeReports()) - .once('error', function (){ + .once('error', function (err){ + console.error(err.stack); process.exit(1); }) .once('end', function (){ From 677af3fa114b40e2b31025306fac42b23e264273 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Mon, 21 Mar 2016 13:11:03 +0800 Subject: [PATCH 150/494] changed env var name, added testing documentation to readme --- .travis.yml | 6 +++--- Readme.md | 11 +++++++++++ gulpfile.js | 2 +- test/socket.io.js | 10 +++++----- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5501d927c1..aeab070028 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,11 +13,11 @@ git: matrix: include: - node_js: '0.10' - env: MODE=compat + env: TEST_VERSION=compat - node_js: '0.12' - env: MODE=compat + env: TEST_VERSION=compat - node_js: '4' - env: MODE=compat + env: TEST_VERSION=compat #matrix: #fast_finish: true #allow_failures: diff --git a/Readme.md b/Readme.md index 74e2e8980e..80555d7a6b 100644 --- a/Readme.md +++ b/Readme.md @@ -422,6 +422,17 @@ To see the output from all of Socket.IO's debugging scopes you can use: DEBUG=socket.io* node myapp ``` +## Testing + +``` +npm test +``` +This runs the `gulp` task `test`. By default the test will be run with the source code in `lib` directory. + +Set the environmental variable `TEST_VERSION` to `compat` to test the transpiled es5-compat version of the code. + +The `gulp` task `test` will always transpile the source code into es5 and export to `dist` first before running the test. + ## License MIT diff --git a/gulpfile.js b/gulpfile.js index 1fa33e316a..c37348985a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -39,7 +39,7 @@ gulp.task('test', ['transpile'], function(){ }); gulp.task('set-compat-node-env', function() { - process.env.MODE = 'compat'; + process.env.TEST_VERSION = 'compat'; }); gulp.task('test-compat', ['set-compat-node-env', 'test']); diff --git a/test/socket.io.js b/test/socket.io.js index e6cd1c7623..9b776bd6bb 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,7 +1,7 @@ -var mode = process.env.MODE; +var testVersion = process.env.TEST_VERSION; var http = require('http').Server; var io = require('../lib'); -if(mode === 'compat') { +if(testVersion === 'compat') { console.log('testing compat version'); io = require('../dist'); } @@ -431,11 +431,11 @@ describe('socket.io', function(){ describe('namespaces', function(){ var Socket = require('../lib/socket'); - if(mode === 'compat') { + if(testVersion === 'compat') { Socket = require('../dist/socket'); } var Namespace = require('../lib/namespace'); - if(mode === 'compat') { + if(testVersion === 'compat') { Namespace = require('../dist/namespace'); } it('should be accessible through .sockets', function(){ @@ -2046,7 +2046,7 @@ describe('socket.io', function(){ describe('middleware', function(done){ var Socket = require('../lib/socket'); - if(mode === 'compat') { + if(testVersion === 'compat') { Socket = require('../dist/socket'); } From 6b2394e6122ddf1a6efbe286d8539842862a3dd9 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Thu, 31 Mar 2016 03:54:32 +0800 Subject: [PATCH 151/494] disable loading lib by default to avoid syntax error due to lib containing new es6 syntax --- test/socket.io.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index 9b776bd6bb..bed9292c4f 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,9 +1,11 @@ var testVersion = process.env.TEST_VERSION; var http = require('http').Server; -var io = require('../lib'); +var io; if(testVersion === 'compat') { console.log('testing compat version'); io = require('../dist'); +} else { + io = require('../lib'); } var fs = require('fs'); var join = require('path').join; @@ -430,13 +432,17 @@ describe('socket.io', function(){ }); describe('namespaces', function(){ - var Socket = require('../lib/socket'); + var Socket; if(testVersion === 'compat') { Socket = require('../dist/socket'); + } else { + Socket = require('../lib/socket'); } - var Namespace = require('../lib/namespace'); + var Namespace; if(testVersion === 'compat') { Namespace = require('../dist/namespace'); + } else { + Namespace = require('../lib/namespace'); } it('should be accessible through .sockets', function(){ var sio = io(); @@ -2045,9 +2051,11 @@ describe('socket.io', function(){ }); describe('middleware', function(done){ - var Socket = require('../lib/socket'); + var Socket; if(testVersion === 'compat') { Socket = require('../dist/socket'); + } else { + Socket = require('../lib/socket'); } it('should call functions', function(done){ From 6edcd1c6baa2e9d5ea99ce1b4375bb3e68553d1e Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Thu, 31 Mar 2016 12:54:02 +0800 Subject: [PATCH 152/494] styling fixes --- test/socket.io.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index bed9292c4f..e986474619 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,7 +1,7 @@ var testVersion = process.env.TEST_VERSION; var http = require('http').Server; var io; -if(testVersion === 'compat') { +if (testVersion === 'compat') { console.log('testing compat version'); io = require('../dist'); } else { @@ -433,13 +433,13 @@ describe('socket.io', function(){ describe('namespaces', function(){ var Socket; - if(testVersion === 'compat') { + if (testVersion === 'compat') { Socket = require('../dist/socket'); } else { Socket = require('../lib/socket'); } var Namespace; - if(testVersion === 'compat') { + if (testVersion === 'compat') { Namespace = require('../dist/namespace'); } else { Namespace = require('../lib/namespace'); @@ -666,7 +666,7 @@ describe('socket.io', function(){ var clientSocket2 = client(srv); sio.on('connection', function() { connections++; - if(connections === 2) { + if (connections === 2) { done(); } }); @@ -2052,7 +2052,7 @@ describe('socket.io', function(){ describe('middleware', function(done){ var Socket; - if(testVersion === 'compat') { + if (testVersion === 'compat') { Socket = require('../dist/socket'); } else { Socket = require('../lib/socket'); From 6d4128750bd47d7f16aee3d098916af8106642d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E6=9D=B1=E6=9B=84=20Wu=2C=20Dung-Ie?= Date: Fri, 1 Apr 2016 17:09:06 +0800 Subject: [PATCH 153/494] stop append /# before id when no namespace --- lib/socket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index de5ebb7158..8d54b3efc7 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -59,7 +59,7 @@ function Socket(nsp, client){ this.nsp = nsp; this.server = nsp.server; this.adapter = this.nsp.adapter; - this.id = nsp.name + '#' + client.id; + this.id = nsp.name !== '/' ? nsp.name + '#' + client.id : client.id; this.client = client; this.conn = client.conn; this.rooms = {}; From 0e63b0910e6cf7cd028c94a08b0d1f4eac90bc4f Mon Sep 17 00:00:00 2001 From: nkzawa Date: Mon, 11 Apr 2016 22:11:19 +0900 Subject: [PATCH 154/494] ignore dist for now --- .gitignore | 3 ++- .npmignore | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 65f07b98a2..32d7d3bbd4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ lib-cov benchmarks/*.png node_modules coverage -.idea \ No newline at end of file +.idea +dist diff --git a/.npmignore b/.npmignore index 55a736bace..feac585c22 100644 --- a/.npmignore +++ b/.npmignore @@ -2,3 +2,4 @@ support test examples .gitignore +dist From 910b5d77a6ba45c8f2af6b63f7f7060077ea4216 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Mon, 11 Apr 2016 22:19:49 +0800 Subject: [PATCH 155/494] fixed version notation --- examples/chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/package.json b/examples/chat/package.json index b7345f2fd8..f7b977538c 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -7,6 +7,6 @@ "private": true, "license": "BSD", "dependencies": { - "express": "^4.13.4" + "express": "4.13.4" } } From a23d26a617681e771f82aefd47e026a85ba1e0df Mon Sep 17 00:00:00 2001 From: tw0517tw Date: Fri, 1 Apr 2016 21:04:26 +0800 Subject: [PATCH 156/494] add quote to exec paths, prevent error when spaces in path --- test/socket.io.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index e986474619..fa0c8c3f12 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -421,8 +421,8 @@ describe('socket.io', function(){ describe('graceful close', function(){ function fixture(filename) { - return process.execPath + ' ' + - join(__dirname, 'fixtures', filename); + return '"' + process.execPath + '" "' + + join(__dirname, 'fixtures', filename) + '"'; } it('should stop socket and timers', function(done){ From 3c5f5a0864738caecd1608bae4e04668864df18d Mon Sep 17 00:00:00 2001 From: tw0517tw Date: Sat, 2 Apr 2016 00:06:11 +0800 Subject: [PATCH 157/494] use a bigger timeout for slower machine --- gulpfile.js | 3 ++- test/socket.io.js | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index c37348985a..82603d026c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -27,7 +27,8 @@ gulp.task('test', ['transpile'], function(){ .pipe(mocha({ slow: 200, reporter: 'spec', - bail: true + bail: true, + timeout: 10000 })) .once('error', function (err) { console.error(err.stack); diff --git a/test/socket.io.js b/test/socket.io.js index fa0c8c3f12..a1d487b953 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -800,7 +800,7 @@ describe('socket.io', function(){ setTimeout(function() { sio.of('/chat').emit('ev', 'data'); sio.of('/chat').volatile.emit('ev', 'data'); - }, 20); + }, 50); }); var socket = client(srv, '/chat'); @@ -812,7 +812,7 @@ describe('socket.io', function(){ setTimeout(function() { expect(counter).to.be(1); done(); - }, 200); + }, 500); }); it('should emit volatile event', function(done) { @@ -825,7 +825,7 @@ describe('socket.io', function(){ // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { sio.of('/chat').volatile.emit('ev', 'data'); - }, 20); + }, 100); }); var socket = client(srv, '/chat'); @@ -837,7 +837,7 @@ describe('socket.io', function(){ setTimeout(function() { expect(counter).to.be(1); done(); - }, 200); + }, 500); }); it('should enable compression by default', function(done){ @@ -1154,7 +1154,7 @@ describe('socket.io', function(){ // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { s.volatile.emit('ev', 'data'); - }, 20); + }, 100); }); var socket = client(srv, { transports: ['polling'] }); @@ -1166,7 +1166,7 @@ describe('socket.io', function(){ setTimeout(function() { expect(counter).to.be(1); done(); - }, 200); + }, 500); }); it('should emit volatile event (ws)', function(done) { @@ -1205,7 +1205,7 @@ describe('socket.io', function(){ setTimeout(function() { s.volatile.emit('ev', 'data'); s.volatile.emit('ev', 'data'); - }, 20); + }, 100); }); var socket = client(srv, { transports: ['polling'] }); @@ -1217,7 +1217,7 @@ describe('socket.io', function(){ setTimeout(function() { expect(counter).to.be(1); done(); - }, 200); + }, 500); }); it('should emit only one consecutive volatile event (ws)', function(done) { From 3b58fa04d55c34c0635914c33ff2b9c60d5b5911 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 2 May 2016 20:56:15 -0700 Subject: [PATCH 158/494] package: bump engine.io --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74a116318d..9305765e0c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.8", + "engine.io": "1.6.9", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.5", "socket.io-adapter": "0.4.0", From dcca01f5a42b49e6fe68abefaabe5291e834c5d0 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 2 May 2016 20:57:44 -0700 Subject: [PATCH 159/494] Release 1.4.6 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index ea1ee4cbe2..303c8a6d73 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.6 / 2016-05-02 +================== + + * package: bump engine.io + 1.4.5 / 2016-01-26 ================== diff --git a/package.json b/package.json index 9305765e0c..18a4ec7649 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.5", + "version": "1.4.6", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.9", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.5", + "socket.io-client": "1.4.6", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 1491a96c959d02ac512a3d40368856297da400b7 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 23 Jun 2016 17:11:15 -0700 Subject: [PATCH 160/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18a4ec7649..7999f4a20d 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.9", + "engine.io": "1.6.10", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.6", "socket.io-adapter": "0.4.0", From 42aa77614ee4edefb52d89c62cf84a81db5513d9 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 23 Jun 2016 17:25:46 -0700 Subject: [PATCH 161/494] Release 1.4.7 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 303c8a6d73..dd31c5a65f 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.7 / 2016-06-23 +================== + + * package: bump `engine.io` + 1.4.6 / 2016-05-02 ================== diff --git a/package.json b/package.json index 7999f4a20d..a614c90d9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.6", + "version": "1.4.7", "description": "node.js realtime framework server", "keywords": [ "realtime", From 4137eb5c4316c89fe21d95de3eac6f41ac952a75 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 23 Jun 2016 19:12:28 -0700 Subject: [PATCH 162/494] package: bump `engine.io` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a614c90d9c..8f33714366 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "mocha --reporter dot --slow 200ms --bail" }, "dependencies": { - "engine.io": "1.6.10", + "engine.io": "1.6.11", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.6", "socket.io-adapter": "0.4.0", From 2a092bd2fb8b37fb2dd896798b7c619e5104448e Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 23 Jun 2016 19:22:41 -0700 Subject: [PATCH 163/494] Release 1.4.8 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index dd31c5a65f..b379ef3537 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +1.4.8 / 2016-06-23 +================== + + * package: bump `engine.io` + 1.4.7 / 2016-06-23 ================== diff --git a/package.json b/package.json index 8f33714366..1768898c30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.7", + "version": "1.4.8", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.6.11", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.6", + "socket.io-client": "1.4.8", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 2d141aff7c334cf80046e77b5c061a72c850f9a8 Mon Sep 17 00:00:00 2001 From: Bo Date: Sun, 26 Jun 2016 14:32:37 -0400 Subject: [PATCH 164/494] Prevent mixup for new programmers The documentation, inadvertently, causes confusion for newer programmers, hindering their learning curve and ability to learn `socket.io` faster. This proposed change aims at preventing this confusion to allow new programmers easier access to resources, especially when searching the web for more information. The name `socket` in the documentation refers to the API gateway, or abstraction layer, related to the `client` and other properties. However, in the rest of the programming world, `sockets` usually refer to Berklee sockets or the lower-level communication channel that is used to implement Protocols such as the Websocket Protocol and HTTP. New programmers often search for more informations using the `sockets` keyword when they are grappling with learning the `socket.io` API. A good example is the stack overflow site, where newer programmers incorrectly tag their questions `sockets` and in turn don't get a fast response to their questions. By simply changing the name of the variable used to describe socket.io's "Socket" class instances from `socket` to `client`, this mixup should be mitigated considerably. --- Readme.md | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/Readme.md b/Readme.md index 348e9b8c74..7bd471a0bf 100644 --- a/Readme.md +++ b/Readme.md @@ -16,9 +16,9 @@ HTTP server listening on port `3000`. ```js var server = require('http').createServer(); var io = require('socket.io')(server); -io.on('connection', function(socket){ - socket.on('event', function(data){}); - socket.on('disconnect', function(){}); +io.on('connection', function(client){ + client.on('event', function(data){}); + client.on('disconnect', function(){}); }); server.listen(3000); ``` @@ -27,7 +27,7 @@ server.listen(3000); ```js var io = require('socket.io')(); -io.on('connection', function(socket){}); +io.on('connection', function(client){}); io.listen(3000); ``` @@ -200,7 +200,7 @@ server.listen(3000); ### Server#close - Closes socket server + Closes socket.io server ```js var Server = require('socket.io'); @@ -300,10 +300,13 @@ server.listen(3000); A `Socket` is the fundamental class for interacting with browser clients. A `Socket` belongs to a certain `Namespace` (by default `/`) and uses an underlying `Client` to communicate. + + It should be noted the `Socket` doesn't relate directly to the actual + underlying TCP/IP `socket` and it is only the name of the class. ### Socket#rooms:Object - A hash of strings identifying the rooms this socket is in, indexed by + A hash of strings identifying the rooms this client is in, indexed by room name. ### Socket#client:Client @@ -313,7 +316,8 @@ server.listen(3000); ### Socket#conn:Socket A reference to the underlying `Client` transport connection (engine.io - `Socket` object). + `Socket` object). This allows access to the IO transport layer, which + still (mostly) asbtracts the actual TCP/IP socket. ### Socket#request:Request @@ -323,30 +327,30 @@ server.listen(3000); ### Socket#id:String - A unique identifier for the socket session, that comes from the + A unique identifier for the session, that comes from the underlying `Client`. ### Socket#emit(name:String[, …]):Socket - Emits an event to the socket identified by the string `name`. Any - other parameters can be included. + Emits an event identified by the string `name` to the client. + Any other parameters can be included. All datastructures are supported, including `Buffer`. JavaScript functions can't be serialized/deserialized. ```js var io = require('socket.io')(); - io.on('connection', function(socket){ - socket.emit('an event', { some: 'data' }); + io.on('connection', function(client){ + client.emit('an event', { some: 'data' }); }); ``` ### Socket#join(name:String[, fn:Function]):Socket - Adds the socket to the `room`, and fires optionally a callback `fn` + Adds the client to the `room`, and fires optionally a callback `fn` with `err` signature (if any). - The socket is automatically a member of a room identified with its + The client is automatically a member of a room identified with its session id (see `Socket#id`). The mechanics of joining rooms are handled by the `Adapter` @@ -355,7 +359,7 @@ server.listen(3000); ### Socket#leave(name:String[, fn:Function]):Socket - Removes the socket from `room`, and fires optionally a callback `fn` + Removes the client from `room`, and fires optionally a callback `fn` with `err` signature (if any). **Rooms are left automatically upon disconnection**. @@ -367,14 +371,14 @@ server.listen(3000); ### Socket#to(room:String):Socket Sets a modifier for a subsequent event emission that the event will - only be _broadcasted_ to sockets that have joined the given `room`. + only be _broadcasted_ to clients that have joined the given `room`. To emit to multiple rooms, you can call `to` several times. ```js var io = require('socket.io')(); - io.on('connection', function(socket){ - socket.to('others').emit('an event', { some: 'data' }); + io.on('connection', function(client){ + client.to('others').emit('an event', { some: 'data' }); }); ``` @@ -389,8 +393,8 @@ server.listen(3000); ```js var io = require('socket.io')(); - io.on('connection', function(socket){ - socket.compress(false).emit('an event', { some: 'data' }); + io.on('connection', function(client){ + client.compress(false).emit('an event', { some: 'data' }); }); ``` From ba4c7921ef366ef64f001d45279f29027ae4fdb0 Mon Sep 17 00:00:00 2001 From: YasharF Date: Thu, 6 Oct 2016 04:03:55 -0400 Subject: [PATCH 165/494] [chore] Bump engine.io to 1.7.0 (#2707) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10e33ec63d..86dd2fe5c1 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "gulp test" }, "dependencies": { - "engine.io": "1.6.11", + "engine.io": "1.7.0", "socket.io-parser": "2.2.6", "socket.io-client": "1.4.8", "socket.io-adapter": "0.4.0", From db62e1bf670e0f50edb5e355798dd1035b9aacbb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Oct 2016 23:10:33 +0200 Subject: [PATCH 166/494] =?UTF-8?q?[chore]=C2=A0Remove=20unused=20zuul-ngr?= =?UTF-8?q?ok=20dependency=20(#2708)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 86dd2fe5c1..024035b1c5 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,7 @@ "istanbul": "0.4.1", "mocha": "2.3.4", "superagent": "1.6.1", - "supertest": "1.1.0", - "zuul-ngrok": "3.2.0" + "supertest": "1.1.0" }, "contributors": [ { From 628fe8f1b2ba8d9dc8bf692c78df6158dd9e236a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Oct 2016 23:10:54 +0200 Subject: [PATCH 167/494] [chore] Point towards current master of socket.io-client (#2710) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 024035b1c5..de8a2cb034 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "engine.io": "1.7.0", "socket.io-parser": "2.2.6", - "socket.io-client": "1.4.8", + "socket.io-client": "git://github.com/socketio/socket.io-client", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From 271c625243435b7645c45319f13c1a908af0c3e8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Oct 2016 23:11:33 +0200 Subject: [PATCH 168/494] [chore] Restrict files included in npm package (#2709) --- .npmignore | 5 ----- package.json | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index feac585c22..0000000000 --- a/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -support -test -examples -.gitignore -dist diff --git a/package.json b/package.json index de8a2cb034..cbded515bc 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,9 @@ "io" ], "main": "./lib/index", + "files": [ + "lib/" + ], "license": "MIT", "repository": { "type": "git", From df916172dd38558f8180315a95bdd6538a55a760 Mon Sep 17 00:00:00 2001 From: Alejandro Oviedo Date: Thu, 6 Oct 2016 23:12:15 +0200 Subject: [PATCH 169/494] [chore] Link build badge to master branch (#2549) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 7bd471a0bf..b9dde9a95c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io -[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg)](https://travis-ci.org/socketio/socket.io) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg?branch=master)](https://travis-ci.org/socketio/socket.io) [![Dependency Status](https://david-dm.org/socketio/socket.io.svg)](https://david-dm.org/socketio/socket.io) [![devDependency Status](https://david-dm.org/socketio/socket.io/dev-status.svg)](https://david-dm.org/socketio/socket.io#info=devDependencies) ![NPM version](https://badge.fury.io/js/socket.io.svg) From 43d9a4b55d341d9c00bca173816928df93f9846e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Oct 2016 23:23:26 +0200 Subject: [PATCH 170/494] [feature] Add a 'disconnecting' event to access to socket.rooms upon disconnection (#2332) --- Readme.md | 19 ++++++++++++++++++- lib/socket.js | 2 ++ test/socket.io.js | 25 +++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index b9dde9a95c..e9fd9d7174 100644 --- a/Readme.md +++ b/Readme.md @@ -402,7 +402,24 @@ server.listen(3000); Disconnects this client. If value of close is `true`, closes the underlying connection. Otherwise, it just disconnects the namespace. - + +#### Events + +- `disconnect` + - Fired upon disconnection. + - **Arguments** + - `String`: the reason of the disconnection (either client or server-side) +- `error` + - Fired when an error occurs. + - **Arguments** + - `Object`: error data +- `disconnecting` + - Fired when the client is going to be disconnected (but hasn't left its `rooms` yet). + - **Arguments** + - `String`: the reason of the disconnection (either client or server-side) + +These are reserved events (along with `connect`, `newListener` and `removeListener`) which cannot be used as event names. + ### Client diff --git a/lib/socket.js b/lib/socket.js index dd47308dbd..317da90854 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -25,6 +25,7 @@ exports.events = [ 'error', 'connect', 'disconnect', + 'disconnecting', 'newListener', 'removeListener' ]; @@ -428,6 +429,7 @@ Socket.prototype.onerror = function(err){ Socket.prototype.onclose = function(reason){ if (!this.connected) return this; debug('closing socket - reason %s', reason); + this.emit('disconnecting', reason); this.leaveAll(); this.nsp.remove(this); this.client.remove(this); diff --git a/test/socket.io.js b/test/socket.io.js index 6d1c9fec55..ca3329892b 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -644,6 +644,31 @@ describe('socket.io', function(){ }); }); + it('should fire a `disconnecting` event just before leaving all rooms', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv); + + sio.on('connection', function(s){ + s.join('a', function(){ + s.disconnect(); + }); + + var total = 2; + s.on('disconnecting', function(reason){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); + total--; + }); + + s.on('disconnect', function(reason){ + expect(Object.keys(s.rooms)).to.eql([]); + --total || done(); + }); + }); + }); + }); + it('should return error connecting to non-existent namespace', function(done){ var srv = http(); var sio = io(srv); From c94058f9b02757d2bf6b42f7d088cc9b6deee329 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 7 Oct 2016 00:13:33 +0200 Subject: [PATCH 171/494] [chore] release 1.5.0 (#2711) --- History.md | 16 ++++++++++++++++ package.json | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index b379ef3537..1069c91025 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,20 @@ +1.5.0 / 2016-10-06 +================== + + * [feature] stop append /# before id when no namespace (#2508) + * [feature] Add a 'disconnecting' event to access to socket.rooms upon disconnection (#2332) + * [fix] Fix query string management (#2422) + * [fix] add quote to exec paths, prevent error when spaces in path (#2508) + * [docs] Prevent mixup for new programmers (#2599) + * [example] Fix chat display in Firefox (#2477) + * [chore] Add gulp & babel in the build process (#2471) + * [chore] Bump engine.io to 1.7.0 (#2707) + * [chore] Remove unused zuul-ngrok dependency (#2708) + * [chore] Point towards current master of socket.io-client (#2710) + * [chore] Restrict files included in npm package (#2709) + * [chore] Link build badge to master branch (#2549) + 1.4.8 / 2016-06-23 ================== diff --git a/package.json b/package.json index cbded515bc..0a5fb83f9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.4.8", + "version": "1.5.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -26,7 +26,7 @@ "dependencies": { "engine.io": "1.7.0", "socket.io-parser": "2.2.6", - "socket.io-client": "git://github.com/socketio/socket.io-client", + "socket.io-client": "1.5.0", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From ecc76f48bc49c2d466375761849bdfbc3305bb75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?syuilo=E2=AD=90=EF=B8=8F?= Date: Fri, 21 Oct 2016 10:00:38 +0900 Subject: [PATCH 172/494] =?UTF-8?q?[docs]=C2=A0Add=20link=20to=20LICENSE?= =?UTF-8?q?=20(#2221)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index e9fd9d7174..c53bbf9fbc 100644 --- a/Readme.md +++ b/Readme.md @@ -462,4 +462,4 @@ The `gulp` task `test` will always transpile the source code into es5 and export ## License -MIT +[MIT](LICENSE) From b8c60506a67e9a952803794cc4e359eb71ee7cd1 Mon Sep 17 00:00:00 2001 From: davidlondono Date: Thu, 20 Oct 2016 20:02:59 -0500 Subject: [PATCH 173/494] =?UTF-8?q?[docs]=C2=A0Fix=20JSDoc=20of=20optional?= =?UTF-8?q?=20parameters=20(#2465)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Making proper optional Docs for socketIO --- lib/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index b35d1b1a97..91eab2d34c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -30,7 +30,7 @@ var clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8 * Server constructor. * * @param {http.Server|Number|Object} srv http server, port or options - * @param {Object} opts + * @param {Object} [opts] * @api public */ @@ -322,7 +322,7 @@ Server.prototype.onconnection = function(conn){ * Looks up a namespace. * * @param {String} name nsp name - * @param {Function} fn optional, nsp `connection` ev handler + * @param {Function} [fn] optional, nsp `connection` ev handler * @api public */ From 94852e3d2371ed9be93496a0091f8bfaa5d9cce3 Mon Sep 17 00:00:00 2001 From: Marcio Puga Date: Fri, 21 Oct 2016 02:06:59 +0100 Subject: [PATCH 174/494] [docs] Fix typo (#2724) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index c53bbf9fbc..8ed233aea0 100644 --- a/Readme.md +++ b/Readme.md @@ -317,7 +317,7 @@ server.listen(3000); A reference to the underlying `Client` transport connection (engine.io `Socket` object). This allows access to the IO transport layer, which - still (mostly) asbtracts the actual TCP/IP socket. + still (mostly) abstracts the actual TCP/IP socket. ### Socket#request:Request From 21dffa4b58a1cbd2928c4f5b073380b188c601f3 Mon Sep 17 00:00:00 2001 From: Paul Meinhardt Date: Fri, 21 Oct 2016 03:10:33 +0200 Subject: [PATCH 175/494] =?UTF-8?q?[docs]=C2=A0Link=20readme=20npm=20packa?= =?UTF-8?q?ge=20badge=20to=20npm=20registry=20page=20(#2612)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 8ed233aea0..6ee93d6043 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ [![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg?branch=master)](https://travis-ci.org/socketio/socket.io) [![Dependency Status](https://david-dm.org/socketio/socket.io.svg)](https://david-dm.org/socketio/socket.io) [![devDependency Status](https://david-dm.org/socketio/socket.io/dev-status.svg)](https://david-dm.org/socketio/socket.io#info=devDependencies) -![NPM version](https://badge.fury.io/js/socket.io.svg) +[![NPM version](https://badge.fury.io/js/socket.io.svg)](https://www.npmjs.com/package/socket.io) ![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) From e60bd5a4da9173acba7553c9e631b79770a8c8be Mon Sep 17 00:00:00 2001 From: Tom Atkinson Date: Fri, 21 Oct 2016 03:16:36 +0200 Subject: [PATCH 176/494] [fix] Avoid swallowing exceptions thrown by user event handlers (#2682) --- lib/client.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/client.js b/lib/client.js index f564aa8865..c19818d085 100644 --- a/lib/client.js +++ b/lib/client.js @@ -191,7 +191,9 @@ Client.prototype.ondecoded = function(packet) { } else { var socket = this.nsps[packet.nsp]; if (socket) { - socket.onpacket(packet); + process.nextTick(function() { + socket.onpacket(packet); + }); } else { debug('no socket for namespace %s', packet.nsp); } From 58a73d39e9b1b9e3353f16230fd699cb31d62b11 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 03:18:49 +0200 Subject: [PATCH 177/494] =?UTF-8?q?[chore]=C2=A0Bump=20socket.io-parser=20?= =?UTF-8?q?to=202.3.0=20(#2730)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a5fb83f9d..f9b0b5e0b9 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "engine.io": "1.7.0", - "socket.io-parser": "2.2.6", + "socket.io-parser": "2.3.0", "socket.io-client": "1.5.0", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", From ccd3376627aacaf5b275a8fe3b7a2f01ab23285b Mon Sep 17 00:00:00 2001 From: Feram Bot Date: Fri, 21 Oct 2016 01:21:45 +0000 Subject: [PATCH 178/494] =?UTF-8?q?[docs]=C2=A0Minor=20fixes=20(#2526)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/index.js | 2 +- lib/socket.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 91eab2d34c..bae5f9d43e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -109,7 +109,7 @@ var oldSettings = { }; /** - * Backwards compatiblity. + * Backwards compatibility. * * @api public */ diff --git a/lib/socket.js b/lib/socket.js index 317da90854..2f10c1b342 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -281,7 +281,7 @@ Socket.prototype.leaveAll = function(){ }; /** - * Called by `Namespace` upon succesful + * Called by `Namespace` upon successful * middleware execution (ie: authorization). * * @api private From 8182ecc61cf6877840033eec766579501016bf32 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 22 Oct 2016 09:19:08 +0200 Subject: [PATCH 179/494] [chore] Add Github issue and PR templates (#2733) --- .github/ISSUE_TEMPLATE.md | 25 +++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 18 ++++++++++++++++++ 2 files changed, 43 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 0000000000..f24b49b189 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,25 @@ + +*Note*: for support questions, please use one of these channels: [stackoverflow](http://stackoverflow.com/questions/tagged/socket.io) or [slack](https://socketio.slack.com) + +### You want to: + +* [x] report a *bug* +* [ ] request a *feature* + +### Current behaviour + + +### Steps to reproduce (if the current behaviour is a bug) + + +### Expected behaviour + + +### Setup +- OS: +- browser: +- socket.io version: + +### Other information (e.g. stacktraces, related issues, suggestions how to fix) + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..5e664f9802 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ + +### The kind of change this PR does introduce + +* [x] a bug fix +* [ ] a new feature +* [ ] an update to the documentation +* [ ] a code change that improves performance +* [ ] other + +### Current behaviour + + +### New behaviour + + +### Other information (e.g. related issues) + + From 5c10c5439b86ca95552ec5f39640851ecfca529f Mon Sep 17 00:00:00 2001 From: bananaapple Date: Sun, 23 Oct 2016 19:35:01 -0500 Subject: [PATCH 180/494] =?UTF-8?q?[test]=C2=A0Use=20client=20function=20t?= =?UTF-8?q?o=20unify=20`client`=20in=20test=20script=20(#2731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/socket.io.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/test/socket.io.js b/test/socket.io.js index ca3329892b..fcc8b439b7 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1546,9 +1546,7 @@ describe('socket.io', function(){ var srv = http(); var sio = io(srv); srv.listen(function() { - var addr = srv.listen().address(); - var url = 'ws://localhost:' + addr.port + '?key1=1&key2=2'; - var socket = ioc(url); + var socket = client(srv, {query: {key1: 1, key2: 2}}); sio.on('connection', function(s) { var parsed = require('url').parse(s.request.url); var query = require('querystring').parse(parsed.query); @@ -1562,10 +1560,8 @@ describe('socket.io', function(){ it('should see query parameters sent from secondary namespace connections in handshake object', function(done){ var srv = http(); var sio = io(srv); - var addr = srv.listen().address(); - var url = 'ws://localhost:' + addr.port; - var client1 = ioc(url); - var client2 = ioc(url + '/connection2', {query: {key1: 'aa', key2: '&=bb'}}); + var client1 = client(srv); + var client2 = client(srv, '/connection2', {query: {key1: 'aa', key2: '&=bb'}}); sio.on('connection', function(s){ }); sio.of('/connection2').on('connection', function(s){ From c20e0b26c9639e0bf00f534bee2890d343ee2aaa Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Oct 2016 03:21:11 +0200 Subject: [PATCH 181/494] [chore] Bump engine.io to 1.7.2 (#2729) --- package.json | 2 +- test/socket.io.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f9b0b5e0b9..6a5b1f8ef5 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "test": "gulp test" }, "dependencies": { - "engine.io": "1.7.0", + "engine.io": "1.7.2", "socket.io-parser": "2.3.0", "socket.io-client": "1.5.0", "socket.io-adapter": "0.4.0", diff --git a/test/socket.io.js b/test/socket.io.js index fcc8b439b7..9c43d789e4 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1643,11 +1643,10 @@ describe('socket.io', function(){ var clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); clientSocket.once('connect', function(){ srv.close(function(){ - srv.listen(port, function(){ - clientSocket.on('reconnect', function(){ - clientSocket.emit('ev', 'payload'); - }); + clientSocket.on('reconnect', function(){ + clientSocket.emit('ev', 'payload'); }); + sio.listen(port); }); }); }); From 5badb6436e514d4b391a7decebdcea7ef1aac10a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Oct 2016 03:23:03 +0200 Subject: [PATCH 182/494] =?UTF-8?q?[chore]=C2=A0Bump=20socket.io-parser=20?= =?UTF-8?q?to=202.3.1=20(#2734)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6a5b1f8ef5..575ca16c41 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "engine.io": "1.7.2", - "socket.io-parser": "2.3.0", + "socket.io-parser": "2.3.1", "socket.io-client": "1.5.0", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", From fdf64cc38f0546416eec1b5488e7aba60ffb4227 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Oct 2016 03:31:32 +0200 Subject: [PATCH 183/494] [chore] Release 1.5.1 (#2735) --- History.md | 15 +++++++++++++++ package.json | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 1069c91025..bc75c6bdfe 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,19 @@ +1.5.1 / 2016-10-24 +================== + + * [fix] Avoid swallowing exceptions thrown by user event handlers (#2682) + * [test] Use client function to unify `client` in test script (#2731) + * [docs] Add link to LICENSE (#2221) + * [docs] Fix JSDoc of optional parameters (#2465) + * [docs] Fix typo (#2724) + * [docs] Link readme npm package badge to npm registry page (#2612) + * [docs] Minor fixes (#2526) + * [chore] Bump socket.io-parser to 2.3.0 (#2730) + * [chore] Add Github issue and PR templates (#2733) + * [chore] Bump engine.io to 1.7.2 (#2729) + * [chore] Bump socket.io-parser to 2.3.1 (#2734) + 1.5.0 / 2016-10-06 ================== diff --git a/package.json b/package.json index 575ca16c41..4c25d3f752 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.5.0", + "version": "1.5.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -26,7 +26,7 @@ "dependencies": { "engine.io": "1.7.2", "socket.io-parser": "2.3.1", - "socket.io-client": "1.5.0", + "socket.io-client": "1.5.1", "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", "debug": "2.2.0" From d026c00d05fbd77d28962dd9336da34ab63bda40 Mon Sep 17 00:00:00 2001 From: Kenton Varda Date: Sun, 30 Oct 2016 06:19:00 -0700 Subject: [PATCH 184/494] [fix] Make ETag header comply with standard. (#2603) The standard says that an ETag must be surrounded in double quotes: https://tools.ietf.org/html/rfc7232#section-2.3 Although browsers tend to be lenient, omitting the quotes can confuse/break some kinds of proxies and other tools that demand compliant formatting. For example, Sandstorm.io enforces strict HTTP usage for security reasons and will block responses with invalid ETags. --- lib/index.js | 8 ++++++-- test/socket.io.js | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/index.js b/lib/index.js index bae5f9d43e..cea2a3cad1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -272,9 +272,13 @@ Server.prototype.attachServe = function(srv){ */ Server.prototype.serve = function(req, res){ + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + var expectedEtag = '"' + clientVersion + '"'; + var etag = req.headers['if-none-match']; if (etag) { - if (clientVersion == etag) { + if (expectedEtag == etag) { debug('serve client 304'); res.writeHead(304); res.end(); @@ -284,7 +288,7 @@ Server.prototype.serve = function(req, res){ debug('serve client source'); res.setHeader('Content-Type', 'application/javascript'); - res.setHeader('ETag', clientVersion); + res.setHeader('ETag', expectedEtag); res.writeHead(200); res.end(clientSource); }; diff --git a/test/socket.io.js b/test/socket.io.js index 9c43d789e4..3fd3bc162c 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -167,7 +167,7 @@ describe('socket.io', function(){ if (err) return done(err); var ctype = res.headers['content-type']; expect(ctype).to.be('application/javascript'); - expect(res.headers.etag).to.be(clientVersion); + expect(res.headers.etag).to.be('"' + clientVersion + '"'); expect(res.text).to.match(/engine\.io/); expect(res.status).to.be(200); done(); @@ -179,7 +179,7 @@ describe('socket.io', function(){ io(srv); request(srv) .get('/socket.io/socket.io.js') - .set('If-None-Match', clientVersion) + .set('If-None-Match', '"' + clientVersion + '"') .end(function(err, res){ if (err) return done(err); expect(res.statusCode).to.be(304); From 04fc0f36774d037143e7bb42151732811ca156e2 Mon Sep 17 00:00:00 2001 From: Atanas Palavrov Date: Sun, 30 Oct 2016 14:22:00 +0100 Subject: [PATCH 185/494] [feature] Loading client script on demand. (#2567) Support for the serving of the client script mess with packagers like browserify, webpack. Especcialy in projects where it is not used at all. This patch is workaround to avoid that problem in the cases when client script is not served. --- lib/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index cea2a3cad1..4e5d13d250 100644 --- a/lib/index.js +++ b/lib/index.js @@ -24,7 +24,7 @@ module.exports = Server; * Socket.IO client source. */ -var clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8'); +var clientSource = undefined; /** * Server constructor. @@ -94,6 +94,11 @@ Server.prototype.checkRequest = function(req, fn) { Server.prototype.serveClient = function(v){ if (!arguments.length) return this._serveClient; this._serveClient = v; + + if (v && !clientSource) { + clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8'); + } + return this; }; From 6f44f3a8efe350736188fc697abf27d2928ff17e Mon Sep 17 00:00:00 2001 From: Jamie Davis Date: Fri, 4 Nov 2016 20:06:04 -0400 Subject: [PATCH 186/494] [test] Fix leaking clientSocket (#2721) Test 'should be able to close sio sending a port' defined a clientSocket but didn't set 'reconnection: false'. Now, the default behavior of a clientSocket is 'reconnection: true'. As a result, the clientSocket was "leaked" from the test case and seemed to intermittently connect to the servers in subsequent test cases. This would cause other tests to timeout unexpectedly. It's not clear to me why this would happen, since the test case assigns a unique port number to the socket. However, if you go into socket.io-client and assign and log unique IDs to each socket, then you'll see that this clientSocket shows up in other test cases if the reconnectionDelay strikes unluckily. --- test/socket.io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/socket.io.js b/test/socket.io.js index 3fd3bc162c..93029905ce 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -399,7 +399,7 @@ describe('socket.io', function(){ var net = require('net'); var server = net.createServer(); - var clientSocket = ioc('ws://0.0.0.0:' + PORT); + var clientSocket = ioc('ws://0.0.0.0:' + PORT, { reconnection: false }); clientSocket.on('disconnect', function init() { expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); From e9f980c4754bfceb7654d265d4d58a4cbbab3412 Mon Sep 17 00:00:00 2001 From: Julian Grinblat Date: Sat, 5 Nov 2016 09:14:21 +0900 Subject: [PATCH 187/494] =?UTF-8?q?[feature]=C2=A0Add=20support=20for=20al?= =?UTF-8?q?l=20event=20emitter=20methods=20(#2601)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 4e5d13d250..030c0bceca 100644 --- a/lib/index.js +++ b/lib/index.js @@ -9,6 +9,7 @@ var engine = require('engine.io'); var client = require('socket.io-client'); var clientVersion = require('socket.io-client/package').version; var Client = require('./client'); +var Emitter = require('events').EventEmitter; var Namespace = require('./namespace'); var Adapter = require('socket.io-adapter'); var debug = require('debug')('socket.io:server'); @@ -372,7 +373,11 @@ Server.prototype.close = function(){ * Expose main namespace (/). */ -['on', 'to', 'in', 'use', 'emit', 'send', 'write', 'clients', 'compress'].forEach(function(fn){ +var emitterMethods = Object.keys(Emitter.prototype).filter(function(key){ + return typeof Emitter.prototype[key] === 'function'; +}); + +emitterMethods.concat(['to', 'in', 'use', 'send', 'write', 'clients', 'compress']).forEach(function(fn){ Server.prototype[fn] = function(){ var nsp = this.sockets[fn]; return nsp.apply(this.sockets, arguments); From 2ed5f0f5fbc554a365dcb06a3461056b740f4342 Mon Sep 17 00:00:00 2001 From: Philip YoonShin Date: Fri, 4 Nov 2016 20:19:15 -0400 Subject: [PATCH 188/494] =?UTF-8?q?[chore]=C2=A0Update=20year=20to=202016?= =?UTF-8?q?=20(#2456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b248ba1bc5..8c82021427 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2014-2015 Automattic +Copyright (c) 2014-2016 Automattic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 5a123beea597c9fda7b722f18343fdc2c2755e79 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 15 Nov 2015 04:30:37 +0200 Subject: [PATCH 189/494] =?UTF-8?q?[feature]=C2=A0Add=20support=20for=20so?= =?UTF-8?q?cket=20middleware=20(#2306)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 19 ++++++++++ lib/socket.js | 63 +++++++++++++++++++++++++++++++- test/socket.io.js | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 6ee93d6043..651e614f81 100644 --- a/Readme.md +++ b/Readme.md @@ -304,6 +304,25 @@ server.listen(3000); It should be noted the `Socket` doesn't relate directly to the actual underlying TCP/IP `socket` and it is only the name of the class. +### Socket#use(fn:Function):Socket + + Registers a middleware, which is a function that gets executed for + every incoming `Packet` and receives as parameter the packet and a + function to optionally defer execution to the next registered + middleware. + + ```js + var io = require('socket.io')(); + io.on('connection', function(socket){ + socket.use(function(packet, next){ + if (packet.doge === true) return next(); + next(new Error('Not a doge error')); + }); + ``` + + Errors passed to middleware callbacks are sent as special `error` + packets to clients. + ### Socket#rooms:Object A hash of strings identifying the rooms this client is in, indexed by diff --git a/lib/socket.js b/lib/socket.js index 2f10c1b342..6a68c116f7 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -68,6 +68,7 @@ function Socket(nsp, client, query){ this.connected = true; this.disconnected = false; this.handshake = this.buildHandshake(query); + this.fns = []; } /** @@ -345,7 +346,7 @@ Socket.prototype.onevent = function(packet){ args.push(this.ack(packet.id)); } - emit.apply(this, args); + this.dispatch(args); }; /** @@ -482,3 +483,63 @@ Socket.prototype.compress = function(compress){ this.flags.compress = compress; return this; }; + +/** + * Dispatch incoming event to socket listeners. + * + * @param {Array} event that will get emitted + * @api private + */ + +Socket.prototype.dispatch = function(event){ + debug('dispatching an event %j', event); + var self = this; + this.run(event, function(err){ + process.nextTick(function(){ + if (err) { + return self.emit('error', err.data || err.message); + } + emit.apply(self, event); + }); + }); +} + +/** + * Sets up socket middleware. + * + * @param {Function} middleware function (event, next) + * @return {Socket} self + * @api public + */ + +Socket.prototype.use = function(fn){ + this.fns.push(fn); + return this; +}; + +/** + * Executes the middleware for an incoming event. + * + * @param {Array} event that will get emitted + * @param {Function} last fn call in the middleware + * @api private + */ +Socket.prototype.run = function(event, fn){ + var fns = this.fns.slice(0); + if (!fns.length) return fn(null); + + function run(i){ + fns[i](event, function(err){ + // upon error, short-circuit + if (err) return fn(err); + + // if no middleware left, summon callback + if (!fns[i + 1]) return fn(null); + + // go on to next + run(i + 1); + }); + } + + run(0); +}; diff --git a/test/socket.io.js b/test/socket.io.js index 93029905ce..51071171f1 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2232,4 +2232,95 @@ describe('socket.io', function(){ }); }); }); + + describe('socket middleware', function(done){ + var Socket = require('../lib/socket'); + + it('should call functions', function(done){ + var srv = http(); + var sio = io(srv); + var run = 0; + + srv.listen(function(){ + var socket = client(srv, { multiplex: false }); + + socket.emit('join', 'woot'); + + sio.on('connection', function(socket){ + socket.use(function(event, next){ + expect(event).to.eql(['join', 'woot']); + event.unshift('wrap'); + run++; + next(); + }); + socket.use(function(event, next){ + expect(event).to.eql(['wrap', 'join', 'woot']); + run++; + next(); + }); + socket.on('wrap', function(data1, data2){ + expect(data1).to.be('join'); + expect(data2).to.be('woot'); + expect(run).to.be(2); + done(); + }); + }); + }); + }); + + it('should pass errors', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv, { multiplex: false }); + + socket.emit('join', 'woot'); + + sio.on('connection', function(socket){ + socket.use(function(event, next){ + next(new Error('Authentication error')); + }); + socket.use(function(event, next){ + done(new Error('nope')); + }); + + socket.on('join', function(){ + done(new Error('nope')); + }); + socket.on('error', function(err){ + expect(err).to.be('Authentication error'); + done(); + }); + }); + }); + }); + + it('should pass `data` of error object', function(done){ + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv, { multiplex: false }); + + socket.emit('join', 'woot'); + + sio.on('connection', function(socket){ + socket.use(function(event, next){ + var err = new Error('Authentication error'); + err.data = { a: 'b', c: 3 }; + next(err); + }); + + socket.on('join', function(){ + done(new Error('nope')); + }); + socket.on('error', function(err){ + expect(err).to.eql({ a: 'b', c: 3 }); + done(); + }); + }); + }); + }); + }); }); From e14a10b7cece99199e0c5609dcbc1560c244ccfe Mon Sep 17 00:00:00 2001 From: mhmeadows63 Date: Tue, 15 Nov 2016 20:52:56 +0000 Subject: [PATCH 190/494] [feature] add support for Server#close(callback) (#2748) --- Readme.md | 9 +++++++-- lib/index.js | 9 ++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Readme.md b/Readme.md index 651e614f81..296ca69766 100644 --- a/Readme.md +++ b/Readme.md @@ -198,9 +198,14 @@ server.listen(3000); For other available methods, see `Namespace` below. -### Server#close +### Server#close([fn:Function]) - Closes socket.io server + Closes socket.io server. + + The optional `fn` is passed to the `server.close([callback])` method of the + core `net` module and is called on error or when all connections are closed. + The callback is expected to implement the common single argument `err` + signature (if any). ```js var Server = require('socket.io'); diff --git a/lib/index.js b/lib/index.js index 030c0bceca..24627a68cc 100644 --- a/lib/index.js +++ b/lib/index.js @@ -352,10 +352,11 @@ Server.prototype.of = function(name, fn){ /** * Closes server connection * + * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed * @api public */ -Server.prototype.close = function(){ +Server.prototype.close = function(fn){ for (var id in this.nsps['/'].sockets) { if (this.nsps['/'].sockets.hasOwnProperty(id)) { this.nsps['/'].sockets[id].onclose(); @@ -364,8 +365,10 @@ Server.prototype.close = function(){ this.engine.close(); - if(this.httpServer){ - this.httpServer.close(); + if (this.httpServer) { + this.httpServer.close(fn); + } else { + fn && fn(); } }; From 4c5dbd8824a7e7dbab99dbcbd046dfe081a1f7c9 Mon Sep 17 00:00:00 2001 From: Julian Grinblat Date: Wed, 16 Nov 2016 09:17:19 +0900 Subject: [PATCH 191/494] =?UTF-8?q?[fix]=C2=A0Don't=20drop=20query=20varia?= =?UTF-8?q?bles=20on=20handshake=20(#2745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parameters passed during handshake, such as tokens, were being dropped. --- lib/socket.js | 9 ++------- package.json | 9 +++++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/socket.js b/lib/socket.js index 6a68c116f7..d374fff348 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -8,6 +8,7 @@ var parser = require('socket.io-parser'); var url = require('url'); var debug = require('debug')('socket.io:socket'); var hasBin = require('has-binary'); +var assign = require('object-assign'); /** * Module exports. @@ -110,13 +111,7 @@ Socket.prototype.buildHandshake = function(query){ function buildQuery(){ var requestQuery = url.parse(self.request.url, true).query; //if socket-specific query exist, replace query strings in requestQuery - if(query){ - query.t = requestQuery.t; - query.EIO = requestQuery.EIO; - query.transport = requestQuery.transport; - return query; - } - return requestQuery || {}; + return assign({}, query, requestQuery); } return { headers: this.request.headers, diff --git a/package.json b/package.json index 4c25d3f752..b07208f79a 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,13 @@ "test": "gulp test" }, "dependencies": { + "debug": "2.2.0", "engine.io": "1.7.2", - "socket.io-parser": "2.3.1", - "socket.io-client": "1.5.1", - "socket.io-adapter": "0.4.0", "has-binary": "0.1.7", - "debug": "2.2.0" + "object-assign": "4.1.0", + "socket.io-adapter": "0.4.0", + "socket.io-client": "1.5.1", + "socket.io-parser": "2.3.1" }, "devDependencies": { "babel-preset-es2015": "6.3.13", From a48365860748a5006f6dd80a710008e18aeac89b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 18 Nov 2016 01:52:45 +0100 Subject: [PATCH 192/494] =?UTF-8?q?[example]=C2=A0Add=20disconnection/reco?= =?UTF-8?q?nnection=20logs=20to=20the=20chat=20example=20(#2675)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/chat/README.md | 2 +- examples/chat/package.json | 3 +++ examples/chat/public/main.js | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/examples/chat/README.md b/examples/chat/README.md index a9fc14bba1..d0b6998d69 100644 --- a/examples/chat/README.md +++ b/examples/chat/README.md @@ -10,7 +10,7 @@ $ cd socket.io $ npm install $ cd examples/chat $ npm install -$ node . +$ npm start ``` And point your browser to `http://localhost:3000`. Optionally, specify diff --git a/examples/chat/package.json b/examples/chat/package.json index f7b977538c..0372c5e7bc 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -8,5 +8,8 @@ "license": "BSD", "dependencies": { "express": "4.13.4" + }, + "scripts": { + "start": "node index.js" } } diff --git a/examples/chat/public/main.js b/examples/chat/public/main.js index 0b5c2c8d4d..dc1721be99 100644 --- a/examples/chat/public/main.js +++ b/examples/chat/public/main.js @@ -263,4 +263,20 @@ $(function() { socket.on('stop typing', function (data) { removeChatTyping(data); }); + + socket.on('disconnect', function () { + log('you have been disconnected'); + }); + + socket.on('reconnect', function () { + log('you have been reconnected'); + if (username) { + socket.emit('add user', username); + } + }); + + socket.on('reconnect_error', function () { + log('attempt to reconnect has failed'); + }); + }); From ff2c15de68a5826fd59d1f3da792ed5e5628dfff Mon Sep 17 00:00:00 2001 From: Luca Tabone Date: Sun, 23 Aug 2015 19:40:17 +0200 Subject: [PATCH 193/494] =?UTF-8?q?[perf]=C2=A0Minor=20code=20optimization?= =?UTF-8?q?s=20(#2219)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/index.js | 13 +++++++------ lib/namespace.js | 12 +++++++----- lib/socket.js | 16 ++++++++++------ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/index.js b/lib/index.js index 24627a68cc..74cef7695b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -382,16 +382,17 @@ var emitterMethods = Object.keys(Emitter.prototype).filter(function(key){ emitterMethods.concat(['to', 'in', 'use', 'send', 'write', 'clients', 'compress']).forEach(function(fn){ Server.prototype[fn] = function(){ - var nsp = this.sockets[fn]; - return nsp.apply(this.sockets, arguments); + return this.sockets[fn].apply(this.sockets, arguments); }; }); Namespace.flags.forEach(function(flag){ - Server.prototype.__defineGetter__(flag, function(){ - this.sockets.flags = this.sockets.flags || {}; - this.sockets.flags[flag] = true; - return this; + Object.defineProperty(Server.prototype, flag, { + get: function() { + this.sockets.flags = this.sockets.flags || {}; + this.sockets.flags[flag] = true; + return this; + } }); }); diff --git a/lib/namespace.js b/lib/namespace.js index c197f546e9..c2730d74d0 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -69,10 +69,12 @@ Namespace.prototype.__proto__ = Emitter.prototype; */ exports.flags.forEach(function(flag){ - Namespace.prototype.__defineGetter__(flag, function(){ - this.flags = this.flags || {}; - this.flags[flag] = true; - return this; + Object.defineProperty(Namespace.prototype, flag, { + get: function() { + this.flags = this.flags || {}; + this.flags[flag] = true; + return this; + } }); }); @@ -137,7 +139,7 @@ Namespace.prototype.run = function(socket, fn){ */ Namespace.prototype.to = -Namespace.prototype['in'] = function(name){ +Namespace.prototype.in = function(name){ this.rooms = this.rooms || []; if (!~this.rooms.indexOf(name)) this.rooms.push(name); return this; diff --git a/lib/socket.js b/lib/socket.js index d374fff348..ab443bf2a2 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -83,10 +83,12 @@ Socket.prototype.__proto__ = Emitter.prototype; */ flags.forEach(function(flag){ - Socket.prototype.__defineGetter__(flag, function(){ - this.flags = this.flags || {}; - this.flags[flag] = true; - return this; + Object.defineProperty(Socket.prototype, flag, { + get: function() { + this.flags = this.flags || {}; + this.flags[flag] = true; + return this; + } }); }); @@ -96,8 +98,10 @@ flags.forEach(function(flag){ * @api public */ -Socket.prototype.__defineGetter__('request', function(){ - return this.conn.request; +Object.defineProperty(Socket.prototype, 'request', { + get: function() { + return this.conn.request; + } }); /** From 9bb5e9de2fbc2f0b1a60f1dba110265e24c6125c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 20 Nov 2016 03:42:09 +0100 Subject: [PATCH 194/494] [chore] Bump debug to version 2.3.3 (#2754) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b07208f79a..5ef21572f1 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "test": "gulp test" }, "dependencies": { - "debug": "2.2.0", + "debug": "2.3.3", "engine.io": "1.7.2", "has-binary": "0.1.7", "object-assign": "4.1.0", From 2e36799b177f92521cd810ec7b5f3663240904fb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 20 Nov 2016 03:50:32 +0100 Subject: [PATCH 195/494] [chore] Bump engine.io to version 1.8.0 (#2755) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5ef21572f1..a3ed72e7b1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "2.3.3", - "engine.io": "1.7.2", + "engine.io": "1.8.0", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.4.0", From 9e7567daee7d1eaab8facd3b5399dd8873925e20 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 20 Nov 2016 03:51:57 +0100 Subject: [PATCH 196/494] [chore] Bump socket.io-adapter to version 0.5.0 (#2756) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3ed72e7b1..d4ee0810c0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "engine.io": "1.8.0", "has-binary": "0.1.7", "object-assign": "4.1.0", - "socket.io-adapter": "0.4.0", + "socket.io-adapter": "0.5.0", "socket.io-client": "1.5.1", "socket.io-parser": "2.3.1" }, From 57b386385e356e7a4607637e004ec8b4d960bca6 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 20 Nov 2016 04:26:56 +0100 Subject: [PATCH 197/494] [chore] Release 1.6.0 (#2757) --- History.md | 17 +++++++++++++++++ package.json | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index bc75c6bdfe..1c8d9a8b7b 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,21 @@ +1.6.0 / 2016-11-20 +================== + + * [fix] Make ETag header comply with standard. (#2603) + * [feature] Loading client script on demand. (#2567) + * [test] Fix leaking clientSocket (#2721) + * [feature] Add support for all event emitter methods (#2601) + * [chore] Update year to 2016 (#2456) + * [feature] Add support for socket middleware (#2306) + * [feature] add support for Server#close(callback) (#2748) + * [fix] Don't drop query variables on handshake (#2745) + * [example] Add disconnection/reconnection logs to the chat example (#2675) + * [perf] Minor code optimizations (#2219) + * [chore] Bump debug to version 2.3.3 (#2754) + * [chore] Bump engine.io to version 1.8.0 (#2755) + * [chore] Bump socket.io-adapter to version 0.5.0 (#2756) + 1.5.1 / 2016-10-24 ================== diff --git a/package.json b/package.json index d4ee0810c0..37b6feed38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.5.1", + "version": "1.6.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -29,7 +29,7 @@ "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", - "socket.io-client": "1.5.1", + "socket.io-client": "1.6.0", "socket.io-parser": "2.3.1" }, "devDependencies": { From d48f848bb4aa018da6527b27abd093089d3e736a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Lal?= Date: Wed, 23 Nov 2016 15:00:07 +0100 Subject: [PATCH 198/494] [docs] Comment connected socket availability for adapters (#2081) --- lib/socket.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/socket.js b/lib/socket.js index ab443bf2a2..f241ae31fc 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -283,6 +283,8 @@ Socket.prototype.leaveAll = function(){ /** * Called by `Namespace` upon successful * middleware execution (ie: authorization). + * Socket is added to namespace array before + * call to join, so adapters can access it. * * @api private */ From 4d8e2d342cb87b2e0086d02e20b3afdc13a3c128 Mon Sep 17 00:00:00 2001 From: Robbie Ferguson Date: Wed, 24 Jun 2015 15:07:02 -0400 Subject: [PATCH 199/494] =?UTF-8?q?[docs]=C2=A0Fixed=20grammar=20issues=20?= =?UTF-8?q?in=20the=20README.md=20(#2159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a few periods and commas which were missing. Pluralised the word 'parameter' where it was incorrectly specified to singular on line 281. Very minor edit. No source code changed. --- Readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index 296ca69766..8be834fe5c 100644 --- a/Readme.md +++ b/Readme.md @@ -147,7 +147,7 @@ server.listen(3000); __Potential drawbacks__: * in some situations, when it is not possible to determine `origin` it may have value of `*` * As this function will be executed for every request, it is advised to make this function work as fast as possible - * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors) + * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors). ### Server#sockets:Namespace @@ -183,7 +183,7 @@ server.listen(3000); Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. - If the namespace was already initialized it returns it right away. + If the namespace was already initialized it returns it immediately. ### Server#emit @@ -285,7 +285,7 @@ server.listen(3000); ### Namespace#use(fn:Function):Namespace Registers a middleware, which is a function that gets executed for - every incoming `Socket` and receives as parameter the socket and a + every incoming `Socket`, and receives as parameters the socket and a function to optionally defer execution to the next registered middleware. @@ -448,7 +448,7 @@ These are reserved events (along with `connect`, `newListener` and `removeListen ### Client The `Client` class represents an incoming transport (engine.io) - connection. A `Client` can be associated with many multiplexed `Socket` + connection. A `Client` can be associated with many multiplexed `Socket`s that belong to different `Namespace`s. ### Client#conn From 0ef55b26d4684abfb54e18567905c22d4bfc83ac Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Fri, 25 Nov 2016 06:39:43 +0800 Subject: [PATCH 200/494] =?UTF-8?q?[feature]=C2=A0serve=20sourcemap=20for?= =?UTF-8?q?=20socket.io-client=20(#2482)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/index.js | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 74cef7695b..1386577a1b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -26,6 +26,7 @@ module.exports = Server; */ var clientSource = undefined; +var clientSourceMap = undefined; /** * Server constructor. @@ -98,6 +99,11 @@ Server.prototype.serveClient = function(v){ if (v && !clientSource) { clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8'); + try { + clientSourceMap = read(require.resolve('socket.io-client/socket.io.js.map'), 'utf-8'); + } catch(err) { + debug('could not load sourcemap file'); + } } return this; @@ -255,11 +261,14 @@ Server.prototype.attach = function(srv, opts){ Server.prototype.attachServe = function(srv){ debug('attaching client serving req handler'); var url = this._path + '/socket.io.js'; + var urlMap = this._path + '/socket.io.js.map'; var evs = srv.listeners('request').slice(0); var self = this; srv.removeAllListeners('request'); srv.on('request', function(req, res) { - if (0 === req.url.indexOf(url)) { + if (0 === req.url.indexOf(urlMap)) { + self.serveMap(req, res); + } else if (0 === req.url.indexOf(url)) { self.serve(req, res); } else { for (var i = 0; i < evs.length; i++) { @@ -299,6 +308,36 @@ Server.prototype.serve = function(req, res){ res.end(clientSource); }; +/** + * Handles a request serving `/socket.io.js.map` + * + * @param {http.Request} req + * @param {http.Response} res + * @api private + */ + +Server.prototype.serveMap = function(req, res){ + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + var expectedEtag = '"' + clientVersion + '"'; + + var etag = req.headers['if-none-match']; + if (etag) { + if (expectedEtag == etag) { + debug('serve client 304'); + res.writeHead(304); + res.end(); + return; + } + } + + debug('serve client sourcemap'); + res.setHeader('Content-Type', 'application/json'); + res.setHeader('ETag', expectedEtag); + res.writeHead(200); + res.end(clientSourceMap); +}; + /** * Binds socket.io to an engine.io instance. * From 955e5e0d91a4eedbce77e5c404c9962d418e4bf5 Mon Sep 17 00:00:00 2001 From: Tal Beja Date: Fri, 25 Nov 2016 00:44:52 +0200 Subject: [PATCH 201/494] =?UTF-8?q?[feature]=C2=A0Add=20a=20`local`=20flag?= =?UTF-8?q?=20(#2628)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit That new flag will prevent the adapter (redis) from publishing the emit to the pub/sub server. When several instances of a server receive the same event from a third party (not from a client), each server instance broadcasts the event to all his clients. With the local flag, and the change in the redis adapter, each server instance send the event only to his client, so each client receive only one unique event. --- lib/namespace.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/namespace.js b/lib/namespace.js index c2730d74d0..0b23aab2d4 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -31,7 +31,8 @@ exports.events = [ exports.flags = [ 'json', - 'volatile' + 'volatile', + 'local' ]; /** From 9c23308c6ea87f4b83f9368d520598e9f342d69f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 27 Nov 2016 07:55:02 +0100 Subject: [PATCH 202/494] =?UTF-8?q?[chore]=C2=A0Bump=20engine.io=20to=20ve?= =?UTF-8?q?rsion=201.8.1=20(#2765)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37b6feed38..5ef321a2ca 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "2.3.3", - "engine.io": "1.8.0", + "engine.io": "1.8.1", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", From 3c98130f15a912307a7362e7dda38c4670b30042 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 27 Nov 2016 08:24:27 +0100 Subject: [PATCH 203/494] =?UTF-8?q?[chore]=C2=A0Update=20client=20location?= =?UTF-8?q?=20and=20serve=20minified=20file=20(#2766)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Following https://github.com/socketio/socket.io-client/pull/1025, the output files are now generated in the dist directory. --- lib/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 1386577a1b..c3687501d9 100644 --- a/lib/index.js +++ b/lib/index.js @@ -98,9 +98,9 @@ Server.prototype.serveClient = function(v){ this._serveClient = v; if (v && !clientSource) { - clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8'); + clientSource = read(require.resolve('socket.io-client/dist/socket.io.min.js'), 'utf-8'); try { - clientSourceMap = read(require.resolve('socket.io-client/socket.io.js.map'), 'utf-8'); + clientSourceMap = read(require.resolve('socket.io-client/dist/socket.io.js.map'), 'utf-8'); } catch(err) { debug('could not load sourcemap file'); } @@ -304,6 +304,7 @@ Server.prototype.serve = function(req, res){ debug('serve client source'); res.setHeader('Content-Type', 'application/javascript'); res.setHeader('ETag', expectedEtag); + res.setHeader('X-SourceMap', 'socket.io.js.map'); res.writeHead(200); res.end(clientSource); }; From 4f93a0b4290738275a972b8bd9b87be1c8997906 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 27 Nov 2016 08:27:39 +0100 Subject: [PATCH 204/494] =?UTF-8?q?[chore]=C2=A0Release=201.7.0=20(#2767)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History.md | 10 ++++++++++ package.json | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 1c8d9a8b7b..f3859cbe33 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,14 @@ +1.7.0 / 2016-11-27 +=================== + + * [docs] Comment connected socket availability for adapters (#2081) + * [docs] Fixed grammar issues in the README.md (#2159) + * [feature] serve sourcemap for socket.io-client (#2482) + * [feature] Add a `local` flag (#2628) + * [chore] Bump engine.io to version 1.8.1 (#2765) + * [chore] Update client location and serve minified file (#2766) + 1.6.0 / 2016-11-20 ================== diff --git a/package.json b/package.json index 5ef321a2ca..827431da6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.6.0", + "version": "1.7.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -29,7 +29,7 @@ "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", - "socket.io-client": "1.6.0", + "socket.io-client": "1.7.0", "socket.io-parser": "2.3.1" }, "devDependencies": { From 797c9a3498356c1116783d58d15904ed30912b0e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 28 Nov 2016 00:06:18 +0100 Subject: [PATCH 205/494] =?UTF-8?q?[chore]=C2=A0Release=201.7.1=20(#2768)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History.md | 3 +++ package.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index f3859cbe33..9dbe44920e 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,7 @@ +1.7.1 / 2016-11-28 +=================== + 1.7.0 / 2016-11-27 =================== diff --git a/package.json b/package.json index 827431da6f..e446506961 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.7.0", + "version": "1.7.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -29,7 +29,7 @@ "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.0", + "socket.io-client": "1.7.1", "socket.io-parser": "2.3.1" }, "devDependencies": { From 1e31769062cef627cb47a735d83d623b71d912f5 Mon Sep 17 00:00:00 2001 From: Serhii Sol Date: Thu, 1 Dec 2016 02:25:13 +0100 Subject: [PATCH 206/494] [fix] Fixes socket.use error packet (#2772) * fix(socket): Fixes socket.use error packet which drops nodejs due to nuances of Nodejs' EventEmitter * fix(socket): Fixes missing error event on socket * fix(socket): test fix, should listen for clientSocket instead of server socket * minor update --- lib/socket.js | 2 +- test/socket.io.js | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/socket.js b/lib/socket.js index f241ae31fc..848c313acd 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -498,7 +498,7 @@ Socket.prototype.dispatch = function(event){ this.run(event, function(err){ process.nextTick(function(){ if (err) { - return self.emit('error', err.data || err.message); + return self.error(err.data || err.message); } emit.apply(self, event); }); diff --git a/test/socket.io.js b/test/socket.io.js index 51071171f1..95f98b4d03 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2273,9 +2273,14 @@ describe('socket.io', function(){ var sio = io(srv); srv.listen(function(){ - var socket = client(srv, { multiplex: false }); + var clientSocket = client(srv, { multiplex: false }); - socket.emit('join', 'woot'); + clientSocket.emit('join', 'woot'); + + clientSocket.on('error', function(err){ + expect(err).to.be('Authentication error'); + done(); + }); sio.on('connection', function(socket){ socket.use(function(event, next){ @@ -2288,10 +2293,6 @@ describe('socket.io', function(){ socket.on('join', function(){ done(new Error('nope')); }); - socket.on('error', function(err){ - expect(err).to.be('Authentication error'); - done(); - }); }); }); }); @@ -2301,9 +2302,14 @@ describe('socket.io', function(){ var sio = io(srv); srv.listen(function(){ - var socket = client(srv, { multiplex: false }); + var clientSocket = client(srv, { multiplex: false }); - socket.emit('join', 'woot'); + clientSocket.emit('join', 'woot'); + + clientSocket.on('error', function(err){ + expect(err).to.eql({ a: 'b', c: 3 }); + done(); + }); sio.on('connection', function(socket){ socket.use(function(event, next){ @@ -2315,10 +2321,6 @@ describe('socket.io', function(){ socket.on('join', function(){ done(new Error('nope')); }); - socket.on('error', function(err){ - expect(err).to.eql({ a: 'b', c: 3 }); - done(); - }); }); }); }); From 0a7afa85ea8056e1e9c05d825103ada5acf1d24e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 11 Dec 2016 01:27:19 +0100 Subject: [PATCH 207/494] =?UTF-8?q?[chore]=C2=A0Bump=20engine.io=20to=20ve?= =?UTF-8?q?rsion=201.8.2=20(#2782)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e446506961..8157e40ed8 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "2.3.3", - "engine.io": "1.8.1", + "engine.io": "1.8.2", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", From 1f59e4526a9ff061512012cd47e65962ccd0e649 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 11 Dec 2016 02:04:21 +0100 Subject: [PATCH 208/494] [chore] Release 1.7.2 (#2783) --- History.md | 6 ++++++ package.json | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 9dbe44920e..172a9a3153 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +1.7.2 / 2016-12-11 +=================== + + * [chore] Bump engine.io to version 1.8.2 (#2782) + * [fix] Fixes socket.use error packet (#2772) + 1.7.1 / 2016-11-28 =================== diff --git a/package.json b/package.json index 8157e40ed8..ec39c0b008 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.7.1", + "version": "1.7.2", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -29,7 +29,7 @@ "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.1", + "socket.io-client": "1.7.2", "socket.io-parser": "2.3.1" }, "devDependencies": { From 255b845596a4e48bb85de16fd0dc351ca77cc18d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 30 Dec 2016 16:10:54 +0100 Subject: [PATCH 209/494] [docs] API documentation (#2784) --- Readme.md | 400 +---------------------------------- docs/API.md | 552 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/README.md | 5 + 3 files changed, 558 insertions(+), 399 deletions(-) create mode 100644 docs/API.md create mode 100644 docs/README.md diff --git a/Readme.md b/Readme.md index 8be834fe5c..4d5388c47e 100644 --- a/Readme.md +++ b/Readme.md @@ -61,405 +61,7 @@ server.listen(3000); ## API -### Server - - Exposed by `require('socket.io')`. - -### Server() - - Creates a new `Server`. Works with and without `new`: - - ```js - var io = require('socket.io')(); - // or - var Server = require('socket.io'); - var io = new Server(); - ``` - -### Server(opts:Object) - - Optionally, the first or second argument (see below) of the `Server` - constructor can be an options object. - - The following options are supported: - - - `serveClient` sets the value for Server#serveClient() - - `path` sets the value for Server#path() - - The same options passed to socket.io are always passed to - the `engine.io` `Server` that gets created. See engine.io - [options](https://github.com/socketio/engine.io#methods-1) - as reference. - -### Server(srv:http#Server, opts:Object) - - Creates a new `Server` and attaches it to the given `srv`. Optionally - `opts` can be passed. - -### Server(port:Number, opts:Object) - - Binds socket.io to a new `http.Server` that listens on `port`. - -### Server#serveClient(v:Boolean):Server - - If `v` is `true` the attached server (see `Server#attach`) will serve - the client files. Defaults to `true`. - - This method has no effect after `attach` is called. - - ```js - // pass a server and the `serveClient` option - var io = require('socket.io')(http, { serveClient: false }); - - // or pass no server and then you can call the method - var io = require('socket.io')(); - io.serveClient(false); - io.attach(http); - ``` - - If no arguments are supplied this method returns the current value. - -### Server#path(v:String):Server - - Sets the path `v` under which `engine.io` and the static files will be - served. Defaults to `/socket.io`. - - If no arguments are supplied this method returns the current value. - -### Server#adapter(v:Adapter):Server - - Sets the adapter `v`. Defaults to an instance of the `Adapter` that - ships with socket.io which is memory based. See - [socket.io-adapter](https://github.com/socketio/socket.io-adapter). - - If no arguments are supplied this method returns the current value. - -### Server#origins(v:String):Server - - Sets the allowed origins `v`. Defaults to any origins being allowed. - - If no arguments are supplied this method returns the current value. - -### Server#origins(v:Function):Server - - Sets the allowed origins as dynamic function. Function takes two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not. - - __Potential drawbacks__: - * in some situations, when it is not possible to determine `origin` it may have value of `*` - * As this function will be executed for every request, it is advised to make this function work as fast as possible - * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors). - - -### Server#sockets:Namespace - - The default (`/`) namespace. - -### Server#attach(srv:http#Server, opts:Object):Server - - Attaches the `Server` to an engine.io instance on `srv` with the - supplied `opts` (optionally). - -### Server#attach(port:Number, opts:Object):Server - - Attaches the `Server` to an engine.io instance that is bound to `port` - with the given `opts` (optionally). - -### Server#listen - - Synonym of `Server#attach`. - -### Server#bind(srv:engine#Server):Server - - Advanced use only. Binds the server to a specific engine.io `Server` - (or compatible API) instance. - -### Server#onconnection(socket:engine#Socket):Server - - Advanced use only. Creates a new `socket.io` client from the incoming - engine.io (or compatible API) `socket`. - -### Server#of(nsp:String):Namespace - - Initializes and retrieves the given `Namespace` by its pathname - identifier `nsp`. - - If the namespace was already initialized it returns it immediately. - -### Server#emit - - Emits an event to all connected clients. The following two are - equivalent: - - ```js - var io = require('socket.io')(); - io.sockets.emit('an event sent to all connected clients'); - io.emit('an event sent to all connected clients'); - ``` - - For other available methods, see `Namespace` below. - -### Server#close([fn:Function]) - - Closes socket.io server. - - The optional `fn` is passed to the `server.close([callback])` method of the - core `net` module and is called on error or when all connections are closed. - The callback is expected to implement the common single argument `err` - signature (if any). - - ```js - var Server = require('socket.io'); - var PORT = 3030; - var server = require('http').Server(); - - var io = Server(PORT); - - io.close(); // Close current server - - server.listen(PORT); // PORT is free to use - - io = Server(server); - ``` - -### Server#use - - See `Namespace#use` below. - -### Namespace - - Represents a pool of sockets connected under a given scope identified - by a pathname (eg: `/chat`). - - By default the client always connects to `/`. - -#### Events - - - `connection` / `connect`. Fired upon a connection. - - Parameters: - - `Socket` the incoming socket. - -### Namespace#name:String - - The namespace identifier property. - -### Namespace#connected:Object - - Hash of `Socket` objects that are connected to this namespace indexed - by `id`. - -### Namespace#clients(fn:Function) - - Gets a list of client IDs connected to this namespace (across all nodes if applicable). - - An example to get all clients in a namespace: - - ```js - var io = require('socket.io')(); - io.of('/chat').clients(function(error, clients){ - if (error) throw error; - console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD] - }); - ``` - - An example to get all clients in namespace's room: - - ```js - var io = require('socket.io')(); - io.of('/chat').in('general').clients(function(error, clients){ - if (error) throw error; - console.log(clients); // => [Anw2LatarvGVVXEIAAAD] - }); - ``` - - As with broadcasting, the default is all clients from the default namespace ('/'): - - ```js - var io = require('socket.io')(); - io.clients(function(error, clients){ - if (error) throw error; - console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB] - }); - ``` - -### Namespace#use(fn:Function):Namespace - - Registers a middleware, which is a function that gets executed for - every incoming `Socket`, and receives as parameters the socket and a - function to optionally defer execution to the next registered - middleware. - - ```js - var io = require('socket.io')(); - io.use(function(socket, next){ - if (socket.request.headers.cookie) return next(); - next(new Error('Authentication error')); - }); - ``` - - Errors passed to middleware callbacks are sent as special `error` - packets to clients. - -### Socket - - A `Socket` is the fundamental class for interacting with browser - clients. A `Socket` belongs to a certain `Namespace` (by default `/`) - and uses an underlying `Client` to communicate. - - It should be noted the `Socket` doesn't relate directly to the actual - underlying TCP/IP `socket` and it is only the name of the class. - -### Socket#use(fn:Function):Socket - - Registers a middleware, which is a function that gets executed for - every incoming `Packet` and receives as parameter the packet and a - function to optionally defer execution to the next registered - middleware. - - ```js - var io = require('socket.io')(); - io.on('connection', function(socket){ - socket.use(function(packet, next){ - if (packet.doge === true) return next(); - next(new Error('Not a doge error')); - }); - ``` - - Errors passed to middleware callbacks are sent as special `error` - packets to clients. - -### Socket#rooms:Object - - A hash of strings identifying the rooms this client is in, indexed by - room name. - -### Socket#client:Client - - A reference to the underlying `Client` object. - -### Socket#conn:Socket - - A reference to the underlying `Client` transport connection (engine.io - `Socket` object). This allows access to the IO transport layer, which - still (mostly) abstracts the actual TCP/IP socket. - -### Socket#request:Request - - A getter proxy that returns the reference to the `request` that - originated the underlying engine.io `Client`. Useful for accessing - request headers such as `Cookie` or `User-Agent`. - -### Socket#id:String - - A unique identifier for the session, that comes from the - underlying `Client`. - -### Socket#emit(name:String[, …]):Socket - - Emits an event identified by the string `name` to the client. - Any other parameters can be included. - - All datastructures are supported, including `Buffer`. JavaScript - functions can't be serialized/deserialized. - - ```js - var io = require('socket.io')(); - io.on('connection', function(client){ - client.emit('an event', { some: 'data' }); - }); - ``` - -### Socket#join(name:String[, fn:Function]):Socket - - Adds the client to the `room`, and fires optionally a callback `fn` - with `err` signature (if any). - - The client is automatically a member of a room identified with its - session id (see `Socket#id`). - - The mechanics of joining rooms are handled by the `Adapter` - that has been configured (see `Server#adapter` above), defaulting to - [socket.io-adapter](https://github.com/socketio/socket.io-adapter). - -### Socket#leave(name:String[, fn:Function]):Socket - - Removes the client from `room`, and fires optionally a callback `fn` - with `err` signature (if any). - - **Rooms are left automatically upon disconnection**. - - The mechanics of leaving rooms are handled by the `Adapter` - that has been configured (see `Server#adapter` above), defaulting to - [socket.io-adapter](https://github.com/socketio/socket.io-adapter). - -### Socket#to(room:String):Socket - - Sets a modifier for a subsequent event emission that the event will - only be _broadcasted_ to clients that have joined the given `room`. - - To emit to multiple rooms, you can call `to` several times. - - ```js - var io = require('socket.io')(); - io.on('connection', function(client){ - client.to('others').emit('an event', { some: 'data' }); - }); - ``` - -### Socket#in(room:String):Socket - - Same as `Socket#to` - -### Socket#compress(v:Boolean):Socket - - Sets a modifier for a subsequent event emission that the event data will - only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method. - - ```js - var io = require('socket.io')(); - io.on('connection', function(client){ - client.compress(false).emit('an event', { some: 'data' }); - }); - ``` - -### Socket#disconnect(close:Boolean):Socket - - Disconnects this client. If value of close is `true`, closes the underlying connection. - Otherwise, it just disconnects the namespace. - -#### Events - -- `disconnect` - - Fired upon disconnection. - - **Arguments** - - `String`: the reason of the disconnection (either client or server-side) -- `error` - - Fired when an error occurs. - - **Arguments** - - `Object`: error data -- `disconnecting` - - Fired when the client is going to be disconnected (but hasn't left its `rooms` yet). - - **Arguments** - - `String`: the reason of the disconnection (either client or server-side) - -These are reserved events (along with `connect`, `newListener` and `removeListener`) which cannot be used as event names. - - -### Client - - The `Client` class represents an incoming transport (engine.io) - connection. A `Client` can be associated with many multiplexed `Socket`s - that belong to different `Namespace`s. - -### Client#conn - - A reference to the underlying `engine.io` `Socket` connection. - -### Client#request - - A getter proxy that returns the reference to the `request` that - originated the engine.io connection. Useful for accessing - request headers such as `Cookie` or `User-Agent`. +See [API](/docs/API.md). ## Debug / logging diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 0000000000..097ed2a9ba --- /dev/null +++ b/docs/API.md @@ -0,0 +1,552 @@ + +## Table of Contents + + - [Class: Server](#server) + - [new Server(httpServer[, options])](#new-serverhttpserver-options) + - [new Server(port[, options])](#new-serverport-options) + - [new Server(options)](#new-serveroptions) + - [server.sockets](#serversockets) + - [server.serveClient([value])](#serverserveclientvalue) + - [server.path([value])](#serverpathvalue) + - [server.adapter([value])](#serveradaptervalue) + - [server.origins([value])](#serveroriginsvalue) + - [server.origins(fn)](#serveroriginsfn) + - [server.attach(httpServer[, options])](#serverattachhttpserver-options) + - [server.attach(port[, options])](#serverattachport-options) + - [server.listen(httpServer[, options])](#serverlistenhttpserver-options) + - [server.listen(port[, options])](#serverlistenport-options) + - [server.bind(engine)](#serverbindengine) + - [server.onconnection(socket)](#serveronconnectionsocket) + - [server.of(nsp)](#serverofnsp) + - [server.emit(eventName[, ...args])](#serveremiteventname-args) + - [server.close([callback])](#serverclosecallback) + - [Class: Namespace](#namespace) + - [namespace.name](#namespacename) + - [namespace.connected](#namespaceconnected) + - [namespace.client(callback)](#namespaceclientcallback) + - [namespace.use(fn)](#namespaceusefn) + - [Event: 'connect'](#event-connect) + - [Event: 'connection'](#event-connect) + - [Class: Socket](#socket) + - [socket.id](#socketid) + - [socket.rooms](#socketrooms) + - [socket.client](#socketclient) + - [socket.conn](#socketconn) + - [socket.request](#socketrequest) + - [socket.use(fn)](#socketusefn) + - [socket.send([...args][, ack])](#socketsendargs-ack) + - [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack) + - [socket.on(eventName, callback)](#socketoneventname-callback) + - [socket.join(room[, callback])](#socketjoinroom-callback) + - [socket.leave(room[, callback])](#socketleaveroom-callback) + - [socket.to(room)](#sockettoroom) + - [socket.in(room)](#socketinroom) + - [socket.compress(value)](#socketcompressvalue) + - [socket.disconnect(close)](#socketdisconnectclose) + - [Flag: 'broadcast'](#flag-broadcast) + - [Flag: 'volatile'](#flag-volatile) + - [Flag: 'local'](#flag-local) + - [Event: 'disconnect'](#event-disconnect) + - [Event: 'error'](#event-error) + - [Event: 'disconnecting'](#event-disconnecting) + - [Class: Client](#client) + - [client.conn](#clientconn) + - [client.request](#clientrequest) + + +### Server + +Exposed by `require('socket.io')`. + +#### new Server(httpServer[, options]) + + - `httpServer` _(http.Server)_ the server to bind to. + - `options` _(Object)_ + - `path` _(String)_: name of the path to capture (`/socket.io`) + - `serveClient` _(Boolean)_: whether to serve the client files (`true`) + - `adapter` _(Adapter)_: the adapter to use. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter) + - `origins` _(String)_: the allowed origins (`*`) + - `allowRequest` _(Function)_: A function that receives a given handshake or upgrade request as its first parameter, and can decide whether to continue or not. The second argument is a function that needs to be called with the decided information: `fn(err, success)`, where `success` is a boolean value where false means that the request is rejected, and err is an error code. + +Works with and without `new`: + +```js +var io = require('socket.io')(); +// or +var Server = require('socket.io'); +var io = new Server(); +``` + +The same options passed to socket.io are always passed to the `engine.io` `Server` that gets created. See engine.io [options](https://github.com/socketio/engine.io#methods-1) as reference. + +#### new Server(port[, options]) + + - `port` _(Number)_ a port to listen to (a new `http.Server` will be created) + - `options` _(Object)_ + +See [above](#new-serverhttpserver-options) for available options. + +#### new Server(options) + + - `options` _(Object)_ + +See [above](#new-serverhttpserver-options) for available options. + +#### server.sockets + + * _(Namespace)_ + +The default (`/`) namespace. + +#### server.serveClient([value]) + + - `value` _(Boolean)_ + - **Returns** `Server|Boolean` + +If `value` is `true` the attached server (see `Server#attach`) will serve the client files. Defaults to `true`. This method has no effect after `attach` is called. If no arguments are supplied this method returns the current value. + +```js +// pass a server and the `serveClient` option +var io = require('socket.io')(http, { serveClient: false }); + +// or pass no server and then you can call the method +var io = require('socket.io')(); +io.serveClient(false); +io.attach(http); +``` + +#### server.path([value]) + + - `value` _(String)_ + - **Returns** `Server|String` + +Sets the path `value` under which `engine.io` and the static files will be served. Defaults to `/socket.io`. If no arguments are supplied this method returns the current value. + +#### server.adapter([value]) + + - `value` _(Adapter)_ + - **Returns** `Server|Adapter` + +Sets the adapter `value`. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter). If no arguments are supplied this method returns the current value. + +#### server.origins([value]) + + - `value` _(String)_ + - **Returns** `Server|String` + +Sets the allowed origins `value`. Defaults to any origins being allowed. If no arguments are supplied this method returns the current value. + +#### server.origins(fn) + + - `fn` _(Function)_ + - **Returns** `Server` + +Provides a function taking two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not. + +__Potential drawbacks__: +* in some situations, when it is not possible to determine `origin` it may have value of `*` +* As this function will be executed for every request, it is advised to make this function work as fast as possible +* If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors). + +#### server.attach(httpServer[, options]) + + - `httpServer` _(http.Server)_ the server to attach to + - `options` _(Object)_ + +Attaches the `Server` to an engine.io instance on `httpServer` with the supplied `options` (optionally). + +### server.attach(port[, options]) + + - `httpServer` _(Number)_ the port to listen on + - `options` _(Object)_ + +Attaches the `Server` to an engine.io instance on a new http.Server with the supplied `options` (optionally). + +#### server.listen(httpServer[, options]) + +Synonym of [server.attach(httpServer[, options])](#serverattachhttpserver-options). + +#### server.listen(port[, options]) + +Synonym of [server.attach(port[, options])](#serverattachport-options). + +#### server.bind(engine) + + - `engine` _(engine.Server)_ + - **Returns** `Server` + +Advanced use only. Binds the server to a specific engine.io `Server` (or compatible API) instance. + +#### server.onconnection(socket) + + - `socket` _(engine.Socket)_ + - **Returns** `Server` + +Advanced use only. Creates a new `socket.io` client from the incoming engine.io (or compatible API) `Socket`. + +#### server.of(nsp) + + - `nsp` _(String)_ + - **Returns** `Namespace` + +Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. If the namespace was already initialized it returns it immediately. + +#### server.emit(eventName[, ...args]) + + - `eventName` _(String)_ + - `args` + +Emits an event to all connected clients. The following two are equivalent: + +```js +var io = require('socket.io')(); +io.sockets.emit('an event sent to all connected clients'); +io.emit('an event sent to all connected clients'); +``` + +#### server.close([callback]) + + - `callback` _(Function)_ + +Closes the socket.io server. The `callback` argument is optional and will be called when all connections are closed. + +```js +var Server = require('socket.io'); +var PORT = 3030; +var server = require('http').Server(); + +var io = Server(PORT); + +io.close(); // Close current server + +server.listen(PORT); // PORT is free to use + +io = Server(server); +``` + +### Namespace + +Represents a pool of sockets connected under a given scope identified +by a pathname (eg: `/chat`). + +By default the client always connects to `/`. + +#### namespace.name + + * _(String)_ + +The namespace identifier property. + +#### namespace.connected + + * _(Object)_ + +The hash of `Socket` objects that are connected to this namespace, indexed by `id`. + +#### namespace.client(callback) + + - `callback` _(Function)_ + +Gets a list of client IDs connected to this namespace (across all nodes if applicable). + +```js +var io = require('socket.io')(); +io.of('/chat').clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD] +}); +``` + +An example to get all clients in namespace's room: + +```js +var io = require('socket.io')(); +io.of('/chat').in('general').clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [Anw2LatarvGVVXEIAAAD] +}); +``` + +As with broadcasting, the default is all clients from the default namespace ('/'): + +```js +var io = require('socket.io')(); +io.clients(function(error, clients){ + if (error) throw error; + console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB] +}); +``` + +#### namespace.use(fn) + + - `fn` _(Function)_ + +Registers a middleware, which is a function that gets executed for every incoming `Socket`, and receives as parameters the socket and a function to optionally defer execution to the next registered middleware. + +Errors passed to middleware callbacks are sent as special `error` packets to clients. + +```js +var io = require('socket.io')(); +io.use(function(socket, next){ + if (socket.request.headers.cookie) return next(); + next(new Error('Authentication error')); +}); +``` + +#### Event: 'connect' + + - `error` _(Object)_ error object + +Fired upon a reconnection attempt error. + +#### Event: 'connection' + +Synonym of [Event: 'connect'](#event-connect). + +### Socket + +A `Socket` is the fundamental class for interacting with browser clients. A `Socket` belongs to a certain `Namespace` (by default `/`) and uses an underlying `Client` to communicate. + +It should be noted the `Socket` doesn't relate directly to the actual underlying TCP/IP `socket` and it is only the name of the class. + +Within each `Namespace`, you can also define arbitrary channels (called `room`) that the `Socket` can join and leave. That provides a convenient way to broadcast to a group of `Socket`s (see `Socket#to` below). + +#### socket.id + + * _(String)_ + +A unique identifier for the session, that comes from the underlying `Client`. + +#### socket.rooms + + * _(Object)_ + +A hash of strings identifying the rooms this client is in, indexed by room name. + +#### socket.client + + * _(Client)_ + +A reference to the underlying `Client` object. + +#### socket.conn + + * _(engine.Socket)_ + +A reference to the underlying `Client` transport connection (engine.io `Socket` object). This allows access to the IO transport layer, which still (mostly) abstracts the actual TCP/IP socket. + +#### socket.request + + * _(Request)_ + +A getter proxy that returns the reference to the `request` that originated the underlying engine.io `Client`. Useful for accessing request headers such as `Cookie` or `User-Agent`. + +#### socket.use(fn) + + - `fn` _(Function)_ + +Registers a middleware, which is a function that gets executed for every incoming `Packet` and receives as parameter the packet and a function to optionally defer execution to the next registered middleware. + +Errors passed to middleware callbacks are sent as special `error` packets to clients. + +```js +var io = require('socket.io')(); +io.on('connection', function(socket){ + socket.use(function(packet, next){ + if (packet.doge === true) return next(); + next(new Error('Not a doge error')); + }); +}); +``` + +#### socket.send([...args][, ack]) + + - `args` + - `ack` _(Function)_ + - **Returns** `Socket` + +Sends a `message` event. See [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack). + +#### socket.emit(eventName[, ...args][, ack]) + + - `eventName` _(String)_ + - `args` + - `ack` _(Function)_ + - **Returns** `Socket` + +Emits an event to the socket identified by the string name. Any other parameters can be included. All serializable datastructures are supported, including `Buffer`. + +```js +socket.emit('hello', 'world'); +socket.emit('with-binary', 1, '2', { 3: '4', 5: new Buffer(6) }); +``` + +The `ack` argument is optional and will be called with the server answer. + +```js +var io = require('socket.io')(); +io.on('connection', function(client){ + client.emit('an event', { some: 'data' }); + + client.emit('ferret', 'tobi', function (data) { + console.log(data); // data will be 'woot' + }); + + // the client code + // client.on('ferret', function (name, fn) { + // fn('woot'); + // }); + +}); +``` + +#### socket.on(eventName, callback) + + - `eventName` _(String)_ + - `callback` _(Function)_ + - **Returns** `Socket` + +Register a new handler for the given event. + +```js +socket.on('news', function (data) { + console.log(data); +}); +``` + +#### socket.join(room[, callback]) + + - `room` _(String)_ + - `callback` _(Function)_ + - **Returns** `Socket` for chaining + +Adds the client to the `room`, and fires optionally a callback with `err` signature (if any). + +The mechanics of joining rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to [socket.io-adapter](https://github.com/socketio/socket.io-adapter). + +For your convenience, each socket automatically joins a room identified by this id (see `Socket#id`). This makes it easy to broadcast messages to other sockets: + +```js +io.on('connection', function(client){ + client.on('say to someone', function(id, msg){ + // send a private message to the socket with the given id + client.broadcast.to(id).emit('my message', msg); + }); +}); +``` + +#### socket.leave(room[, callback]) + + - `room` _(String)_ + - `callback` _(Function)_ + - **Returns** `Socket` for chaining + +Removes the client from `room`, and fires optionally a callback with `err` signature (if any). + +**Rooms are left automatically upon disconnection**. + +#### socket.to(room) + + - `room` _(String)_ + - **Returns** `Socket` for chaining + +Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room`. + +To emit to multiple rooms, you can call `to` several times. + +```js +var io = require('socket.io')(); +io.on('connection', function(client){ + // to one room + client.to('others').emit('an event', { some: 'data' }); + // to multiple rooms + client.to('room1').to('room2').emit('hello'); +}); +``` + +#### socket.in(room) + +Synonym of [socket.to(room)](#sockettoroom). + +#### socket.compress(value) + + - `value` _(Boolean)_ whether to following packet will be compressed + - **Returns** `Socket` for chaining + +Sets a modifier for a subsequent event emission that the event data will only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method. + +#### socket.disconnect(close) + + - `close` _(Boolean)_ whether to close the underlying connection + - **Returns** `Socket` + +Disconnects this client. If value of close is `true`, closes the underlying connection. Otherwise, it just disconnects the namespace. + +#### Flag: 'broadcast' + +Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to every sockets but the sender. + +```js +var io = require('socket.io')(); +io.on('connection', function(socket){ + socket.broadcast.emit('an event', { some: 'data' }); // everyone gets it but the sender +}); +``` + +#### Flag: 'volatile' + +Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to receive messages (because of network slowness or other issues, or because they’re connected through long polling and is in the middle of a request-response cycle). + +```js +var io = require('socket.io')(); +io.on('connection', function(socket){ + socket.volatile.emit('an event', { some: 'data' }); // the client may or may not receive it +}); +``` + +#### Flag: 'local' + +Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to the current node (when the [Redis adapter](https://github.com/socketio/socket.io-redis) is used). + +```js +var io = require('socket.io')(); +io.on('connection', function(socket){ + socket.to('hello').local.emit('an event', { some: 'data' }); +}); +``` + +#### Event: 'disconnect' + + - `reason` _(String)_ the reason of the disconnection (either client or server-side) + +Fired upon disconnection. + +#### Event: 'error' + + - `error` _(Object)_ error object + +Fired when an error occurs. + +#### Event: 'disconnecting' + + - `reason` _(String)_ the reason of the disconnection (either client or server-side) + +Fired when the client is going to be disconnected (but hasn't left its `rooms` yet). + +These are reserved events (along with `connect`, `newListener` and `removeListener`) which cannot be used as event names. + +### Client + +The `Client` class represents an incoming transport (engine.io) connection. A `Client` can be associated with many multiplexed `Socket`s that belong to different `Namespace`s. + +#### client.conn + + * _(engine.Socket)_ + +A reference to the underlying `engine.io` `Socket` connection. + +#### client.request + + * _(Request)_ + +A getter proxy that returns the reference to the `request` that originated the engine.io connection. Useful for accessing request headers such as `Cookie` or `User-Agent`. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..ed78f2ee72 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ + +## Table of Contents + + - [Server API](API.md) + - [Client API](https://github.com/socketio/socket.io-client/blob/master/docs/API.md) From d82190016f5ff3afc42c74d98893d8654fc8eeb6 Mon Sep 17 00:00:00 2001 From: bananaapple Date: Fri, 30 Dec 2016 23:11:26 +0800 Subject: [PATCH 210/494] [docs] Add install script on Readme.md (#2780) --- Readme.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Readme.md b/Readme.md index 4d5388c47e..3e351470c9 100644 --- a/Readme.md +++ b/Readme.md @@ -8,6 +8,12 @@ ![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) +## Installation + +```bash +npm install socket.io --save +``` + ## How to use The following example attaches socket.io to a plain Node.JS From c46d4481bdf4c87a20b373ade647a7acb4f158f8 Mon Sep 17 00:00:00 2001 From: Gatsbill Date: Fri, 30 Dec 2016 16:18:09 +0100 Subject: [PATCH 211/494] =?UTF-8?q?[perf]=C2=A0micro-optimisations=20(#279?= =?UTF-8?q?3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/socket.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/socket.js b/lib/socket.js index 848c313acd..e0e81b503b 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -141,13 +141,14 @@ Socket.prototype.emit = function(ev){ emit.apply(this, arguments); } else { var args = Array.prototype.slice.call(arguments); - var packet = {}; - packet.type = hasBin(args) ? parser.BINARY_EVENT : parser.EVENT; - packet.data = args; + var packet = { + type: hasBin(args) ? parser.BINARY_EVENT : parser.EVENT, + data: args + }; var flags = this.flags || {}; // access last argument to see if it's an ACK callback - if ('function' == typeof args[args.length - 1]) { + if (typeof args[args.length - 1] === 'function') { if (this._rooms || flags.broadcast) { throw new Error('Callbacks are not supported when broadcasting'); } @@ -495,15 +496,16 @@ Socket.prototype.compress = function(compress){ Socket.prototype.dispatch = function(event){ debug('dispatching an event %j', event); var self = this; - this.run(event, function(err){ + function dispatchSocket(err) { process.nextTick(function(){ if (err) { return self.error(err.data || err.message); } emit.apply(self, event); }); - }); -} + } + this.run(event, dispatchSocket); +}; /** * Sets up socket middleware. From a27802e19e60b0c4ea2d7ef8c13d1c80e52fc48e Mon Sep 17 00:00:00 2001 From: Ian Bro Date: Fri, 30 Dec 2016 18:22:16 +0300 Subject: [PATCH 212/494] [fix] Prevent null from being accepted as argument (#2606) --- lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index c3687501d9..16bc04bbb0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -38,7 +38,7 @@ var clientSourceMap = undefined; function Server(srv, opts){ if (!(this instanceof Server)) return new Server(srv, opts); - if ('object' == typeof srv && !srv.listen) { + if ('object' == typeof srv && srv instanceof Object && !srv.listen) { opts = srv; srv = null; } From e04de3c2c83cb719ab063a332fd5f3897cf0eb29 Mon Sep 17 00:00:00 2001 From: Andrea Accardo Date: Wed, 4 Jan 2017 00:37:12 -0500 Subject: [PATCH 213/494] [docs] Fix wrong argument name in API.md (#2802) --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 097ed2a9ba..9c3bf1b188 100644 --- a/docs/API.md +++ b/docs/API.md @@ -157,7 +157,7 @@ Attaches the `Server` to an engine.io instance on `httpServer` with the supplied ### server.attach(port[, options]) - - `httpServer` _(Number)_ the port to listen on + - `port` _(Number)_ the port to listen on - `options` _(Object)_ Attaches the `Server` to an engine.io instance on a new http.Server with the supplied `options` (optionally). From f2604399332bc19ce548fec764162fbb8be49db5 Mon Sep 17 00:00:00 2001 From: Bella Date: Fri, 6 Jan 2017 08:11:03 -0800 Subject: [PATCH 214/494] [chore] Update copyright year LICENSE to 2017 (#2803) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 8c82021427..aea53a7090 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2014-2016 Automattic +Copyright (c) 2014-2017 Automattic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 01b262fbe04a18dc0d802b0d049dcc81727ac40b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 10:16:27 +0100 Subject: [PATCH 215/494] [chore] Update issue template with fiddle (#2811) --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index f24b49b189..9d0b1cd927 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -11,6 +11,7 @@ ### Steps to reproduce (if the current behaviour is a bug) +**Note**: the best way to get a quick answer is to provide a failing test case, by forking the following [fiddle](https://github.com/darrachequesne/socket.io-fiddle) for example. ### Expected behaviour From 0be865f614043106d762dc5869e351a544b89616 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 17:41:31 +0100 Subject: [PATCH 216/494] [docs] Fix a typo on `clients` method in the API documentation (#2812) --- docs/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API.md b/docs/API.md index 9c3bf1b188..2d1040c9ae 100644 --- a/docs/API.md +++ b/docs/API.md @@ -23,7 +23,7 @@ - [Class: Namespace](#namespace) - [namespace.name](#namespacename) - [namespace.connected](#namespaceconnected) - - [namespace.client(callback)](#namespaceclientcallback) + - [namespace.clients(callback)](#namespaceclientscallback) - [namespace.use(fn)](#namespaceusefn) - [Event: 'connect'](#event-connect) - [Event: 'connection'](#event-connect) @@ -243,7 +243,7 @@ The namespace identifier property. The hash of `Socket` objects that are connected to this namespace, indexed by `id`. -#### namespace.client(callback) +#### namespace.clients(callback) - `callback` _(Function)_ From 131a2befec3c79a1fd9934ed1dfda0ba85cf2c5f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 17:46:54 +0100 Subject: [PATCH 217/494] [docs] Add an example for socket.join() method (#2813) --- docs/API.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/API.md b/docs/API.md index 2d1040c9ae..6ad2b26c56 100644 --- a/docs/API.md +++ b/docs/API.md @@ -422,6 +422,15 @@ socket.on('news', function (data) { Adds the client to the `room`, and fires optionally a callback with `err` signature (if any). +```js +io.on('connection', function(socket){ + socket.join('room 237', function(){ + console.log(socket.rooms); // [ , 'room 237' ] + io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room + }); +}); +``` + The mechanics of joining rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to [socket.io-adapter](https://github.com/socketio/socket.io-adapter). For your convenience, each socket automatically joins a room identified by this id (see `Socket#id`). This makes it easy to broadcast messages to other sockets: From accd0bd64a4435667c58c3f01cdafec680565a86 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 17:50:38 +0100 Subject: [PATCH 218/494] [docs] Add pingInterval/pingTimeout/transports options in the API documentation (#2814) --- docs/API.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/API.md b/docs/API.md index 6ad2b26c56..ea370e0fea 100644 --- a/docs/API.md +++ b/docs/API.md @@ -79,6 +79,17 @@ var io = new Server(); The same options passed to socket.io are always passed to the `engine.io` `Server` that gets created. See engine.io [options](https://github.com/socketio/engine.io#methods-1) as reference. +Among those options: + + - `pingTimeout` _(Number)_: how many ms without a pong packet to consider the connection closed (`60000`) + - `pingInterval` _(Number)_: how many ms before sending a new ping packet (`25000`). + +Those two parameters will impact the delay before a client knows the server is not available anymore. For example, if the underlying TCP connection is not closed properly due to a network issue, a client may have to wait up to `pingTimeout + pingInterval` ms before getting a `disconnect` event. + + - `transports` _(Array)_: transports to allow connections to (`['polling', 'websocket']`). + +**Note:** The order is important. By default, a long-polling connection is established first, and then upgraded to WebSocket if possible. Using `['websocket']` means there will be no fallback if a WebSocket connection cannot be opened. + #### new Server(port[, options]) - `port` _(Number)_ a port to listen to (a new `http.Server` will be created) From 706ca2a0c14af91713771113bff7ea7f5a36596c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 17:54:09 +0100 Subject: [PATCH 219/494] [docs] Add emit cheatsheet (#2815) --- docs/README.md | 10 +++++++++ docs/emit.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 docs/emit.md diff --git a/docs/README.md b/docs/README.md index ed78f2ee72..22d751fbc8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,15 @@ ## Table of Contents +#### Getting started + + - [Write a chat application](http://socket.io/get-started/chat/) + +#### API Reference + - [Server API](API.md) - [Client API](https://github.com/socketio/socket.io-client/blob/master/docs/API.md) + +#### Advanced topics + + - [Emit cheatsheet](emit.md) diff --git a/docs/emit.md b/docs/emit.md new file mode 100644 index 0000000000..344d1b380f --- /dev/null +++ b/docs/emit.md @@ -0,0 +1,55 @@ + +## Emit cheatsheet + +```js + +io.on('connect', onConnect); + +function onConnect(socket){ + + // sending to the client + socket.emit('hello', 'can you hear me?', 1, 2, 'abc'); + + // sending to all clients except sender + socket.broadcast.emit('broadcast', 'hello friends!'); + + // sending to all clients in 'game' room except sender + socket.to('game').emit('nice game', "let's play a game"); + + // sending to all clients in 'game1' and/or in 'game2' room, except sender + socket.to('game1').to('game2').emit('nice game', "let's play a game (too)"); + + // sending to all clients in 'game' room, including sender + io.in('game').emit('big-announcement', 'the game will start soon'); + + // sending to all clients in namespace 'myNamespace', including sender + io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon'); + + // sending to individual socketid (private message) + socket.to().emit('hey', 'I just met you'); + + // sending with acknowledgement + socket.emit('question', 'do you think so?', function (answer) {}); + + // sending without compression + socket.compress(false).emit('uncompressed', "that's rough"); + + // sending a message that might be dropped if the client is not ready to receive messages + socket.volatile.emit('maybe', 'do you really need it?'); + + // sending to all clients on this node (when using multiple nodes) + io.local.emit('hi', 'my lovely babies'); + +}; + +``` + +**Note:** The following events are reserved and should not be used as event names by your application: +- `error` +- `connect` +- `disconnect` +- `disconnecting` +- `newListener` +- `removeListener` +- `ping` +- `pong` From b754cff2b415a8cbbf0f23c61824bcc69b078430 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 10 Jan 2017 18:10:56 +0100 Subject: [PATCH 220/494] [docs] Fix documentation for `local` flag (#2816) --- docs/API.md | 63 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/docs/API.md b/docs/API.md index ea370e0fea..f870637808 100644 --- a/docs/API.md +++ b/docs/API.md @@ -18,15 +18,17 @@ - [server.bind(engine)](#serverbindengine) - [server.onconnection(socket)](#serveronconnectionsocket) - [server.of(nsp)](#serverofnsp) - - [server.emit(eventName[, ...args])](#serveremiteventname-args) - [server.close([callback])](#serverclosecallback) - [Class: Namespace](#namespace) - [namespace.name](#namespacename) - [namespace.connected](#namespaceconnected) + - [namespace.emit(eventName[, ...args])](#namespaceemiteventname-args) - [namespace.clients(callback)](#namespaceclientscallback) - [namespace.use(fn)](#namespaceusefn) - [Event: 'connect'](#event-connect) - [Event: 'connection'](#event-connect) + - [Flag: 'volatile'](#flag-volatile) + - [Flag: 'local'](#flag-local) - [Class: Socket](#socket) - [socket.id](#socketid) - [socket.rooms](#socketrooms) @@ -44,8 +46,7 @@ - [socket.compress(value)](#socketcompressvalue) - [socket.disconnect(close)](#socketdisconnectclose) - [Flag: 'broadcast'](#flag-broadcast) - - [Flag: 'volatile'](#flag-volatile) - - [Flag: 'local'](#flag-local) + - [Flag: 'volatile'](#flag-volatile-1) - [Event: 'disconnect'](#event-disconnect) - [Event: 'error'](#event-error) - [Event: 'disconnecting'](#event-disconnecting) @@ -202,19 +203,6 @@ Advanced use only. Creates a new `socket.io` client from the incoming engine.io Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. If the namespace was already initialized it returns it immediately. -#### server.emit(eventName[, ...args]) - - - `eventName` _(String)_ - - `args` - -Emits an event to all connected clients. The following two are equivalent: - -```js -var io = require('socket.io')(); -io.sockets.emit('an event sent to all connected clients'); -io.emit('an event sent to all connected clients'); -``` - #### server.close([callback]) - `callback` _(Function)_ @@ -254,6 +242,22 @@ The namespace identifier property. The hash of `Socket` objects that are connected to this namespace, indexed by `id`. +#### namespace.emit(eventName[, ...args]) + + - `eventName` _(String)_ + - `args` + +Emits an event to all connected clients. The following two are equivalent: + +```js +var io = require('socket.io')(); + +io.emit('an event sent to all connected clients'); // main namespace + +var chat = io.of('/chat'); +chat.emit('an event sent to all connected clients in chat namespace'); +``` + #### namespace.clients(callback) - `callback` _(Function)_ @@ -314,6 +318,22 @@ Fired upon a reconnection attempt error. Synonym of [Event: 'connect'](#event-connect). +#### Flag: 'volatile' + +Sets a modifier for a subsequent event emission that the event data may be lost if the clients are not ready to receive messages (because of network slowness or other issues, or because they’re connected through long polling and is in the middle of a request-response cycle). + +```js +io.volatile.emit('an event', { some: 'data' }); // the clients may or may not receive it +``` + +#### Flag: 'local' + +Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to the current node (when the [Redis adapter](https://github.com/socketio/socket.io-redis) is used). + +```js +io.local.emit('an event', { some: 'data' }); +``` + ### Socket A `Socket` is the fundamental class for interacting with browser clients. A `Socket` belongs to a certain `Namespace` (by default `/`) and uses an underlying `Client` to communicate. @@ -524,17 +544,6 @@ io.on('connection', function(socket){ }); ``` -#### Flag: 'local' - -Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to the current node (when the [Redis adapter](https://github.com/socketio/socket.io-redis) is used). - -```js -var io = require('socket.io')(); -io.on('connection', function(socket){ - socket.to('hello').local.emit('an event', { some: 'data' }); -}); -``` - #### Event: 'disconnect' - `reason` _(String)_ the reason of the disconnection (either client or server-side) From e24434a0a067b2cc5a6f1fc3b2d39ea95505015b Mon Sep 17 00:00:00 2001 From: Tom Atkinson Date: Mon, 16 Jan 2017 08:23:22 +0100 Subject: [PATCH 221/494] [perf] Reset properties instead of deleting them (#2826) Deleting properties is a v8 'optimization killer' --- lib/namespace.js | 13 ++++++------- lib/socket.js | 21 ++++++++------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 0b23aab2d4..186649dc1c 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -56,6 +56,8 @@ function Namespace(server, name){ this.connected = {}; this.fns = []; this.ids = 0; + this.rooms = []; + this.flags = {}; this.initAdapter(); } @@ -72,7 +74,6 @@ Namespace.prototype.__proto__ = Emitter.prototype; exports.flags.forEach(function(flag){ Object.defineProperty(Namespace.prototype, flag, { get: function() { - this.flags = this.flags || {}; this.flags[flag] = true; return this; } @@ -141,7 +142,6 @@ Namespace.prototype.run = function(socket, fn){ Namespace.prototype.to = Namespace.prototype.in = function(name){ - this.rooms = this.rooms || []; if (!~this.rooms.indexOf(name)) this.rooms.push(name); return this; }; @@ -224,8 +224,8 @@ Namespace.prototype.emit = function(ev){ flags: this.flags }); - delete this.rooms; - delete this.flags; + this.rooms = []; + this.flags = {}; } return this; }; @@ -254,9 +254,9 @@ Namespace.prototype.write = function(){ Namespace.prototype.clients = function(fn){ this.adapter.clients(this.rooms, fn); - // delete rooms flag for scenario: + // reset rooms for scenario: // .in('room').clients() (GH-1978) - delete this.rooms; + this.rooms = []; return this; }; @@ -269,7 +269,6 @@ Namespace.prototype.clients = function(fn){ */ Namespace.prototype.compress = function(compress){ - this.flags = this.flags || {}; this.flags.compress = compress; return this; }; diff --git a/lib/socket.js b/lib/socket.js index e0e81b503b..e97536f214 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -70,6 +70,8 @@ function Socket(nsp, client, query){ this.disconnected = false; this.handshake = this.buildHandshake(query); this.fns = []; + this.flags = {}; + this._rooms = []; } /** @@ -85,7 +87,6 @@ Socket.prototype.__proto__ = Emitter.prototype; flags.forEach(function(flag){ Object.defineProperty(Socket.prototype, flag, { get: function() { - this.flags = this.flags || {}; this.flags[flag] = true; return this; } @@ -145,11 +146,10 @@ Socket.prototype.emit = function(ev){ type: hasBin(args) ? parser.BINARY_EVENT : parser.EVENT, data: args }; - var flags = this.flags || {}; // access last argument to see if it's an ACK callback if (typeof args[args.length - 1] === 'function') { - if (this._rooms || flags.broadcast) { + if (this._rooms.length || this.flags.broadcast) { throw new Error('Callbacks are not supported when broadcasting'); } @@ -158,23 +158,20 @@ Socket.prototype.emit = function(ev){ packet.id = this.nsp.ids++; } - if (this._rooms || flags.broadcast) { + if (this._rooms.length || this.flags.broadcast) { this.adapter.broadcast(packet, { except: [this.id], rooms: this._rooms, - flags: flags + flags: this.flags }); } else { // dispatch packet - this.packet(packet, { - volatile: flags.volatile, - compress: flags.compress - }); + this.packet(packet, this.flags); } // reset flags - delete this._rooms; - delete this.flags; + this._rooms = []; + this.flags = {}; } return this; }; @@ -189,7 +186,6 @@ Socket.prototype.emit = function(ev){ Socket.prototype.to = Socket.prototype.in = function(name){ - this._rooms = this._rooms || []; if (!~this._rooms.indexOf(name)) this._rooms.push(name); return this; }; @@ -481,7 +477,6 @@ Socket.prototype.disconnect = function(close){ */ Socket.prototype.compress = function(compress){ - this.flags = this.flags || {}; this.flags.compress = compress; return this; }; From ad658b8cc25893e30a48e694249bc04be35aaf55 Mon Sep 17 00:00:00 2001 From: Tom Atkinson Date: Mon, 16 Jan 2017 08:25:52 +0100 Subject: [PATCH 222/494] [perf] Use shared instance of the encoder (#2825) --- lib/client.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/client.js b/lib/client.js index c19818d085..e6aed70ee0 100644 --- a/lib/client.js +++ b/lib/client.js @@ -13,6 +13,12 @@ var url = require('url'); module.exports = Client; +/** + * Packet encoder + */ + +var encoder = new parser.Encoder(); + /** * Client constructor. * @@ -24,7 +30,6 @@ module.exports = Client; function Client(server, conn){ this.server = server; this.conn = conn; - this.encoder = new parser.Encoder(); this.decoder = new parser.Decoder(); this.id = conn.id; this.request = conn.request; @@ -153,9 +158,7 @@ Client.prototype.packet = function(packet, opts){ if ('open' == this.conn.readyState) { debug('writing packet %j', packet); if (!opts.preEncoded) { // not broadcasting, need to encode - this.encoder.encode(packet, function (encodedPackets) { // encode, then write results to engine - writeToEngine(encodedPackets); - }); + encoder.encode(packet, writeToEngine); // encode, then write results to engine } else { // a broadcast pre-encodes a packet writeToEngine(packet); } From 2258a6a6e3999b250be9823822ef833bdff65614 Mon Sep 17 00:00:00 2001 From: Tom Atkinson Date: Mon, 16 Jan 2017 08:29:11 +0100 Subject: [PATCH 223/494] [fix] Properly close the connection on error (#2681) --- lib/client.js | 2 +- test/socket.io.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/client.js b/lib/client.js index e6aed70ee0..e5ab6c6626 100644 --- a/lib/client.js +++ b/lib/client.js @@ -216,7 +216,7 @@ Client.prototype.onerror = function(err){ this.sockets[id].onerror(err); } } - this.onclose('client error'); + this.conn.close(); }; /** diff --git a/test/socket.io.js b/test/socket.io.js index 95f98b4d03..01bc134af2 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -981,12 +981,12 @@ describe('socket.io', function(){ var srv = http(); var sio = io(srv); srv.listen(function(){ - var socket = client(srv); + var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.on('error', function(err){ expect(err).to.be.an(Error); s.on('disconnect', function(reason){ - expect(reason).to.be('client error'); + expect(reason).to.be('forced close'); done(); }); }); @@ -1686,7 +1686,7 @@ describe('socket.io', function(){ var srv = http(); var sio = io(srv); srv.listen(function(){ - var socket = client(srv); + var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.conn.on('upgrade', function(){ console.log('\033[96mNote: warning expected and normal in test.\033[39m'); @@ -1703,7 +1703,7 @@ describe('socket.io', function(){ var srv = http(); var sio = io(srv); srv.listen(function(){ - var socket = client(srv); + var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.once('error', function(err){ expect(err.message).to.match(/Illegal attachments/); @@ -1720,7 +1720,7 @@ describe('socket.io', function(){ var srv = http(); var sio = io(srv); srv.listen(function(){ - var socket = client(srv); + var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.once('error', function(err){ expect(err.message).to.match(/Illegal attachments/); From 8eaba085de7b855815291a08042f89646a35d962 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 16 Jan 2017 08:32:33 +0100 Subject: [PATCH 224/494] [docs] Implement whiteboard example (#2810) --- examples/whiteboard/README.md | 17 +++++ examples/whiteboard/index.js | 16 +++++ examples/whiteboard/package.json | 19 +++++ examples/whiteboard/public/index.html | 23 ++++++ examples/whiteboard/public/main.js | 100 ++++++++++++++++++++++++++ examples/whiteboard/public/style.css | 44 ++++++++++++ 6 files changed, 219 insertions(+) create mode 100644 examples/whiteboard/README.md create mode 100644 examples/whiteboard/index.js create mode 100644 examples/whiteboard/package.json create mode 100644 examples/whiteboard/public/index.html create mode 100644 examples/whiteboard/public/main.js create mode 100644 examples/whiteboard/public/style.css diff --git a/examples/whiteboard/README.md b/examples/whiteboard/README.md new file mode 100644 index 0000000000..8d443db8a1 --- /dev/null +++ b/examples/whiteboard/README.md @@ -0,0 +1,17 @@ + +# Socket.IO Collaborative Whiteboard + +A simple collaborative whiteboard for socket.io + +## How to use + +``` +$ npm i && npm start +``` + +And point your browser to `http://localhost:3000`. Optionally, specify +a port by supplying the `PORT` env variable. + +## Features + +- draw on the whiteboard and all other users will see you drawings live diff --git a/examples/whiteboard/index.js b/examples/whiteboard/index.js new file mode 100644 index 0000000000..44cc97f9d3 --- /dev/null +++ b/examples/whiteboard/index.js @@ -0,0 +1,16 @@ + +const express = require('express'); +const app = express(); +const http = require('http').Server(app); +const io = require('socket.io')(http); +const port = process.env.PORT || 3000; + +app.use(express.static(__dirname + '/public')); + +function onConnection(socket){ + socket.on('drawing', (data) => socket.broadcast.emit('drawing', data)); +} + +io.on('connection', onConnection); + +http.listen(port, () => console.log('listening on port ' + port)); diff --git a/examples/whiteboard/package.json b/examples/whiteboard/package.json new file mode 100644 index 0000000000..cb78467785 --- /dev/null +++ b/examples/whiteboard/package.json @@ -0,0 +1,19 @@ +{ + "name": "whiteboard", + "version": "1.0.0", + "description": "A simple collaborative whiteboard using socket.io", + "main": "index.js", + "keywords": [ + "socket.io", + "whiteboard" + ], + "dependencies": { + "express": "4.9.x", + "socket.io": "latest" + }, + "scripts": { + "start": "node index" + }, + "author": "Damien Arrachequesne", + "license": "MIT" +} diff --git a/examples/whiteboard/public/index.html b/examples/whiteboard/public/index.html new file mode 100644 index 0000000000..710932a897 --- /dev/null +++ b/examples/whiteboard/public/index.html @@ -0,0 +1,23 @@ + + + + + Socket.IO whiteboard + + + + + + +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/examples/whiteboard/public/main.js b/examples/whiteboard/public/main.js new file mode 100644 index 0000000000..808f52b223 --- /dev/null +++ b/examples/whiteboard/public/main.js @@ -0,0 +1,100 @@ +'use strict'; + +(function() { + + var socket = io(); + var canvas = document.getElementsByClassName('whiteboard')[0]; + var colors = document.getElementsByClassName('color'); + var context = canvas.getContext('2d'); + + var current = { + color: 'black' + }; + var drawing = false; + + canvas.addEventListener('mousedown', onMouseDown, false); + canvas.addEventListener('mouseup', onMouseUp, false); + canvas.addEventListener('mouseout', onMouseUp, false); + canvas.addEventListener('mousemove', throttle(onMouseMove, 10), false); + + for (var i = 0; i < colors.length; i++){ + colors[i].addEventListener('click', onColorUpdate, false); + } + + socket.on('drawing', onDrawingEvent); + + window.addEventListener('resize', onResize, false); + onResize(); + + + function drawLine(x0, y0, x1, y1, color, emit){ + context.beginPath(); + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.strokeStyle = color; + context.lineWidth = 2; + context.stroke(); + context.closePath(); + + if (!emit) { return; } + var w = canvas.width; + var h = canvas.height; + + socket.emit('drawing', { + x0: x0 / w, + y0: y0 / h, + x1: x1 / w, + y1: y1 / h, + color: color + }); + } + + function onMouseDown(e){ + drawing = true; + current.x = e.clientX; + current.y = e.clientY; + } + + function onMouseUp(e){ + if (!drawing) { return; } + drawing = false; + drawLine(current.x, current.y, e.clientX, e.clientY, current.color, true); + } + + function onMouseMove(e){ + if (!drawing) { return; } + drawLine(current.x, current.y, e.clientX, e.clientY, current.color, true); + current.x = e.clientX; + current.y = e.clientY; + } + + function onColorUpdate(e){ + current.color = e.target.className.split(' ')[1]; + } + + // limit the number of events per second + function throttle(callback, delay) { + var previousCall = new Date().getTime(); + return function() { + var time = new Date().getTime(); + + if ((time - previousCall) >= delay) { + previousCall = time; + callback.apply(null, arguments); + } + }; + } + + function onDrawingEvent(data){ + var w = canvas.width; + var h = canvas.height; + drawLine(data.x0 * w, data.y0 * h, data.x1 * w, data.y1 * h, data.color); + } + + // make the canvas fill its parent + function onResize() { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + } + +})(); diff --git a/examples/whiteboard/public/style.css b/examples/whiteboard/public/style.css new file mode 100644 index 0000000000..437a29cfef --- /dev/null +++ b/examples/whiteboard/public/style.css @@ -0,0 +1,44 @@ + +/** + * Fix user-agent + */ + +* { + box-sizing: border-box; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +/** + * Canvas + */ + +.whiteboard { + height: 100%; + width: 100%; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; +} + +.colors { + position: fixed; +} + +.color { + display: inline-block; + height: 48px; + width: 48px; +} + +.color.black { background-color: black; } +.color.red { background-color: red; } +.color.green { background-color: green; } +.color.blue { background-color: blue; } +.color.yellow { background-color: yellow; } From 988852986a0b70ad960166ce1a209b40aa66d6d4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 16 Jan 2017 08:32:53 +0100 Subject: [PATCH 225/494] [docs] Add nginx cluster example (#2817) --- examples/cluster-nginx/README.md | 31 ++ examples/cluster-nginx/docker-compose.yml | 51 ++++ examples/cluster-nginx/nginx/Dockerfile | 3 + examples/cluster-nginx/nginx/nginx.conf | 35 +++ examples/cluster-nginx/server/Dockerfile | 15 + examples/cluster-nginx/server/index.js | 82 +++++ examples/cluster-nginx/server/package.json | 17 ++ .../cluster-nginx/server/public/index.html | 28 ++ examples/cluster-nginx/server/public/main.js | 286 ++++++++++++++++++ .../cluster-nginx/server/public/style.css | 149 +++++++++ 10 files changed, 697 insertions(+) create mode 100644 examples/cluster-nginx/README.md create mode 100644 examples/cluster-nginx/docker-compose.yml create mode 100644 examples/cluster-nginx/nginx/Dockerfile create mode 100644 examples/cluster-nginx/nginx/nginx.conf create mode 100644 examples/cluster-nginx/server/Dockerfile create mode 100644 examples/cluster-nginx/server/index.js create mode 100644 examples/cluster-nginx/server/package.json create mode 100644 examples/cluster-nginx/server/public/index.html create mode 100644 examples/cluster-nginx/server/public/main.js create mode 100644 examples/cluster-nginx/server/public/style.css diff --git a/examples/cluster-nginx/README.md b/examples/cluster-nginx/README.md new file mode 100644 index 0000000000..df46d31763 --- /dev/null +++ b/examples/cluster-nginx/README.md @@ -0,0 +1,31 @@ + +# Socket.IO Chat with nginx & redis + +A simple chat demo for socket.io + +## How to use + +Install [Docker Compose](https://docs.docker.com/compose/install/), then: + +``` +$ docker-compose up -d +``` + +And then point your browser to `http://localhost:3000`. + +This will start four Socket.IO nodes, behind a nginx proxy which will loadbalance the requests (using the IP of the client, see [ip_hash](http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash)). + +Each node connects to the redis backend, which will enable to broadcast to every client, no matter which node it is currently connected to. + +``` +# you can kill a given node, the client should reconnect to another node +$ docker-compose stop server-george +``` + +## Features + +- Multiple users can join a chat room by each entering a unique username +on website load. +- Users can type chat messages to the chat room. +- A notification is sent to all users when a user joins or leaves +the chatroom. diff --git a/examples/cluster-nginx/docker-compose.yml b/examples/cluster-nginx/docker-compose.yml new file mode 100644 index 0000000000..3e18c90a66 --- /dev/null +++ b/examples/cluster-nginx/docker-compose.yml @@ -0,0 +1,51 @@ + +nginx: + build: ./nginx + links: + - server-john + - server-paul + - server-george + - server-ringo + ports: + - "3000:80" + +server-john: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=John + +server-paul: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Paul + +server-george: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=George + +server-ringo: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Ringo + +redis: + image: redis:alpine + expose: + - "6379" diff --git a/examples/cluster-nginx/nginx/Dockerfile b/examples/cluster-nginx/nginx/Dockerfile new file mode 100644 index 0000000000..8cc369b050 --- /dev/null +++ b/examples/cluster-nginx/nginx/Dockerfile @@ -0,0 +1,3 @@ + +FROM nginx:alpine +COPY nginx.conf /etc/nginx/nginx.conf diff --git a/examples/cluster-nginx/nginx/nginx.conf b/examples/cluster-nginx/nginx/nginx.conf new file mode 100644 index 0000000000..cc9d5870c7 --- /dev/null +++ b/examples/cluster-nginx/nginx/nginx.conf @@ -0,0 +1,35 @@ +# Reference: https://www.nginx.com/resources/wiki/start/topics/examples/full/ + +worker_processes 4; + +events { + worker_connections 1024; +} + +http { + server { + listen 80; + + location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + + proxy_pass http://nodes; + + # enable WebSockets + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + } + + upstream nodes { + # enable sticky session + ip_hash; + + server server-john:3000; + server server-paul:3000; + server server-george:3000; + server server-ringo:3000; + } +} diff --git a/examples/cluster-nginx/server/Dockerfile b/examples/cluster-nginx/server/Dockerfile new file mode 100644 index 0000000000..d1f9075727 --- /dev/null +++ b/examples/cluster-nginx/server/Dockerfile @@ -0,0 +1,15 @@ +FROM mhart/alpine-node:6 + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +# Bundle app source +COPY . /usr/src/app + +EXPOSE 3000 +CMD [ "npm", "start" ] diff --git a/examples/cluster-nginx/server/index.js b/examples/cluster-nginx/server/index.js new file mode 100644 index 0000000000..d5b56b2ce8 --- /dev/null +++ b/examples/cluster-nginx/server/index.js @@ -0,0 +1,82 @@ +// Setup basic express server +var express = require('express'); +var app = express(); +var server = require('http').createServer(app); +var io = require('socket.io')(server); +var redis = require('socket.io-redis'); +var port = process.env.PORT || 3000; +var serverName = process.env.NAME || 'Unknown'; + +io.adapter(redis({ host: 'redis', port: 6379 })); + +server.listen(port, function () { + console.log('Server listening at port %d', port); + console.log('Hello, I\'m %s, how can I help?', serverName); +}); + +// Routing +app.use(express.static(__dirname + '/public')); + +// Chatroom + +var numUsers = 0; + +io.on('connection', function (socket) { + socket.emit('my-name-is', serverName); + + var addedUser = false; + + // when the client emits 'new message', this listens and executes + socket.on('new message', function (data) { + // we tell the client to execute 'new message' + socket.broadcast.emit('new message', { + username: socket.username, + message: data + }); + }); + + // when the client emits 'add user', this listens and executes + socket.on('add user', function (username) { + if (addedUser) return; + + // we store the username in the socket session for this client + socket.username = username; + ++numUsers; + addedUser = true; + socket.emit('login', { + numUsers: numUsers + }); + // echo globally (all clients) that a person has connected + socket.broadcast.emit('user joined', { + username: socket.username, + numUsers: numUsers + }); + }); + + // when the client emits 'typing', we broadcast it to others + socket.on('typing', function () { + socket.broadcast.emit('typing', { + username: socket.username + }); + }); + + // when the client emits 'stop typing', we broadcast it to others + socket.on('stop typing', function () { + socket.broadcast.emit('stop typing', { + username: socket.username + }); + }); + + // when the user disconnects.. perform this + socket.on('disconnect', function () { + if (addedUser) { + --numUsers; + + // echo globally that this client has left + socket.broadcast.emit('user left', { + username: socket.username, + numUsers: numUsers + }); + } + }); +}); diff --git a/examples/cluster-nginx/server/package.json b/examples/cluster-nginx/server/package.json new file mode 100644 index 0000000000..0fe83ecd3e --- /dev/null +++ b/examples/cluster-nginx/server/package.json @@ -0,0 +1,17 @@ +{ + "name": "socket.io-chat", + "version": "0.0.0", + "description": "A simple chat client using socket.io", + "main": "index.js", + "author": "Grant Timmerman", + "private": true, + "license": "BSD", + "dependencies": { + "express": "4.13.4", + "socket.io": "^1.7.2", + "socket.io-redis": "^3.0.0" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/examples/cluster-nginx/server/public/index.html b/examples/cluster-nginx/server/public/index.html new file mode 100644 index 0000000000..9b2043d73f --- /dev/null +++ b/examples/cluster-nginx/server/public/index.html @@ -0,0 +1,28 @@ + + + + + Socket.IO Chat Example + + + +
    +
  • +
    +
      +
      + +
    • + +
    + + + + + + \ No newline at end of file diff --git a/examples/cluster-nginx/server/public/main.js b/examples/cluster-nginx/server/public/main.js new file mode 100644 index 0000000000..03b3702c83 --- /dev/null +++ b/examples/cluster-nginx/server/public/main.js @@ -0,0 +1,286 @@ +$(function() { + var FADE_TIME = 150; // ms + var TYPING_TIMER_LENGTH = 400; // ms + var COLORS = [ + '#e21400', '#91580f', '#f8a700', '#f78b00', + '#58dc00', '#287b00', '#a8f07a', '#4ae8c4', + '#3b88eb', '#3824aa', '#a700ff', '#d300e7' + ]; + + // Initialize variables + var $window = $(window); + var $usernameInput = $('.usernameInput'); // Input for username + var $messages = $('.messages'); // Messages area + var $inputMessage = $('.inputMessage'); // Input message input box + + var $loginPage = $('.login.page'); // The login page + var $chatPage = $('.chat.page'); // The chatroom page + + // Prompt for setting a username + var username; + var connected = false; + var typing = false; + var lastTypingTime; + var $currentInput = $usernameInput.focus(); + + var socket = io(); + + function addParticipantsMessage (data) { + var message = ''; + if (data.numUsers === 1) { + message += "there's 1 participant"; + } else { + message += "there are " + data.numUsers + " participants"; + } + log(message); + } + + // Sets the client's username + function setUsername () { + username = cleanInput($usernameInput.val().trim()); + + // If the username is valid + if (username) { + $loginPage.fadeOut(); + $chatPage.show(); + $loginPage.off('click'); + $currentInput = $inputMessage.focus(); + + // Tell the server your username + socket.emit('add user', username); + } + } + + // Sends a chat message + function sendMessage () { + var message = $inputMessage.val(); + // Prevent markup from being injected into the message + message = cleanInput(message); + // if there is a non-empty message and a socket connection + if (message && connected) { + $inputMessage.val(''); + addChatMessage({ + username: username, + message: message + }); + // tell server to execute 'new message' and send along one parameter + socket.emit('new message', message); + } + } + + // Log a message + function log (message, options) { + var $el = $('
  • ').addClass('log').text(message); + addMessageElement($el, options); + } + + // Adds the visual chat message to the message list + function addChatMessage (data, options) { + // Don't fade the message in if there is an 'X was typing' + var $typingMessages = getTypingMessages(data); + options = options || {}; + if ($typingMessages.length !== 0) { + options.fade = false; + $typingMessages.remove(); + } + + var $usernameDiv = $('') + .text(data.username) + .css('color', getUsernameColor(data.username)); + var $messageBodyDiv = $('') + .text(data.message); + + var typingClass = data.typing ? 'typing' : ''; + var $messageDiv = $('
  • ') + .data('username', data.username) + .addClass(typingClass) + .append($usernameDiv, $messageBodyDiv); + + addMessageElement($messageDiv, options); + } + + // Adds the visual chat typing message + function addChatTyping (data) { + data.typing = true; + data.message = 'is typing'; + addChatMessage(data); + } + + // Removes the visual chat typing message + function removeChatTyping (data) { + getTypingMessages(data).fadeOut(function () { + $(this).remove(); + }); + } + + // Adds a message element to the messages and scrolls to the bottom + // el - The element to add as a message + // options.fade - If the element should fade-in (default = true) + // options.prepend - If the element should prepend + // all other messages (default = false) + function addMessageElement (el, options) { + var $el = $(el); + + // Setup default options + if (!options) { + options = {}; + } + if (typeof options.fade === 'undefined') { + options.fade = true; + } + if (typeof options.prepend === 'undefined') { + options.prepend = false; + } + + // Apply options + if (options.fade) { + $el.hide().fadeIn(FADE_TIME); + } + if (options.prepend) { + $messages.prepend($el); + } else { + $messages.append($el); + } + $messages[0].scrollTop = $messages[0].scrollHeight; + } + + // Prevents input from having injected markup + function cleanInput (input) { + return $('
    ').text(input).text(); + } + + // Updates the typing event + function updateTyping () { + if (connected) { + if (!typing) { + typing = true; + socket.emit('typing'); + } + lastTypingTime = (new Date()).getTime(); + + setTimeout(function () { + var typingTimer = (new Date()).getTime(); + var timeDiff = typingTimer - lastTypingTime; + if (timeDiff >= TYPING_TIMER_LENGTH && typing) { + socket.emit('stop typing'); + typing = false; + } + }, TYPING_TIMER_LENGTH); + } + } + + // Gets the 'X is typing' messages of a user + function getTypingMessages (data) { + return $('.typing.message').filter(function (i) { + return $(this).data('username') === data.username; + }); + } + + // Gets the color of a username through our hash function + function getUsernameColor (username) { + // Compute hash code + var hash = 7; + for (var i = 0; i < username.length; i++) { + hash = username.charCodeAt(i) + (hash << 5) - hash; + } + // Calculate color + var index = Math.abs(hash % COLORS.length); + return COLORS[index]; + } + + // Keyboard events + + $window.keydown(function (event) { + // Auto-focus the current input when a key is typed + if (!(event.ctrlKey || event.metaKey || event.altKey)) { + $currentInput.focus(); + } + // When the client hits ENTER on their keyboard + if (event.which === 13) { + if (username) { + sendMessage(); + socket.emit('stop typing'); + typing = false; + } else { + setUsername(); + } + } + }); + + $inputMessage.on('input', function() { + updateTyping(); + }); + + // Click events + + // Focus input when clicking anywhere on login page + $loginPage.click(function () { + $currentInput.focus(); + }); + + // Focus input when clicking on the message input's border + $inputMessage.click(function () { + $inputMessage.focus(); + }); + + // Socket events + + // Whenever the server emits 'login', log the login message + socket.on('login', function (data) { + connected = true; + // Display the welcome message + var message = "Welcome to Socket.IO Chat – "; + log(message, { + prepend: true + }); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'new message', update the chat body + socket.on('new message', function (data) { + addChatMessage(data); + }); + + // Whenever the server emits 'user joined', log it in the chat body + socket.on('user joined', function (data) { + log(data.username + ' joined'); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'user left', log it in the chat body + socket.on('user left', function (data) { + log(data.username + ' left'); + addParticipantsMessage(data); + removeChatTyping(data); + }); + + // Whenever the server emits 'typing', show the typing message + socket.on('typing', function (data) { + addChatTyping(data); + }); + + // Whenever the server emits 'stop typing', kill the typing message + socket.on('stop typing', function (data) { + removeChatTyping(data); + }); + + socket.on('disconnect', function () { + log('you have been disconnected'); + }); + + socket.on('reconnect', function () { + log('you have been reconnected'); + if (username) { + socket.emit('add user', username); + } + }); + + socket.on('reconnect_error', function () { + log('attempt to reconnect has failed'); + }); + + socket.on('my-name-is', function (serverName) { + log('host is now ' + serverName); + }) + +}); diff --git a/examples/cluster-nginx/server/public/style.css b/examples/cluster-nginx/server/public/style.css new file mode 100644 index 0000000000..3052d88e4c --- /dev/null +++ b/examples/cluster-nginx/server/public/style.css @@ -0,0 +1,149 @@ +/* Fix user-agent */ + +* { + box-sizing: border-box; +} + +html { + font-weight: 300; + -webkit-font-smoothing: antialiased; +} + +html, input { + font-family: + "HelveticaNeue-Light", + "Helvetica Neue Light", + "Helvetica Neue", + Helvetica, + Arial, + "Lucida Grande", + sans-serif; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +ul { + list-style: none; + word-wrap: break-word; +} + +/* Pages */ + +.pages { + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +.page { + height: 100%; + position: absolute; + width: 100%; +} + +/* Login Page */ + +.login.page { + background-color: #000; +} + +.login.page .form { + height: 100px; + margin-top: -100px; + position: absolute; + + text-align: center; + top: 50%; + width: 100%; +} + +.login.page .form .usernameInput { + background-color: transparent; + border: none; + border-bottom: 2px solid #fff; + outline: none; + padding-bottom: 15px; + text-align: center; + width: 400px; +} + +.login.page .title { + font-size: 200%; +} + +.login.page .usernameInput { + font-size: 200%; + letter-spacing: 3px; +} + +.login.page .title, .login.page .usernameInput { + color: #fff; + font-weight: 100; +} + +/* Chat page */ + +.chat.page { + display: none; +} + +/* Font */ + +.messages { + font-size: 150%; +} + +.inputMessage { + font-size: 100%; +} + +.log { + color: gray; + font-size: 70%; + margin: 5px; + text-align: center; +} + +/* Messages */ + +.chatArea { + height: 100%; + padding-bottom: 60px; +} + +.messages { + height: 100%; + margin: 0; + overflow-y: scroll; + padding: 10px 20px 10px 20px; +} + +.message.typing .messageBody { + color: gray; +} + +.username { + font-weight: 700; + overflow: hidden; + padding-right: 15px; + text-align: right; +} + +/* Input */ + +.inputMessage { + border: 10px solid #000; + bottom: 0; + height: 60px; + left: 0; + outline: none; + padding-left: 10px; + position: absolute; + right: 0; + width: 100%; +} From f7eed6e397ae4102813896d721b86c21700c19ed Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 16 Jan 2017 08:33:09 +0100 Subject: [PATCH 226/494] [docs] Add haproxy cluster example (#2818) --- examples/cluster-haproxy/README.md | 31 ++ examples/cluster-haproxy/docker-compose.yml | 51 ++++ examples/cluster-haproxy/haproxy/Dockerfile | 2 + examples/cluster-haproxy/haproxy/haproxy.cfg | 31 ++ examples/cluster-haproxy/server/Dockerfile | 15 + examples/cluster-haproxy/server/index.js | 87 ++++++ examples/cluster-haproxy/server/package.json | 17 ++ .../cluster-haproxy/server/public/index.html | 28 ++ .../cluster-haproxy/server/public/main.js | 286 ++++++++++++++++++ .../cluster-haproxy/server/public/style.css | 149 +++++++++ 10 files changed, 697 insertions(+) create mode 100644 examples/cluster-haproxy/README.md create mode 100644 examples/cluster-haproxy/docker-compose.yml create mode 100644 examples/cluster-haproxy/haproxy/Dockerfile create mode 100644 examples/cluster-haproxy/haproxy/haproxy.cfg create mode 100644 examples/cluster-haproxy/server/Dockerfile create mode 100644 examples/cluster-haproxy/server/index.js create mode 100644 examples/cluster-haproxy/server/package.json create mode 100644 examples/cluster-haproxy/server/public/index.html create mode 100644 examples/cluster-haproxy/server/public/main.js create mode 100644 examples/cluster-haproxy/server/public/style.css diff --git a/examples/cluster-haproxy/README.md b/examples/cluster-haproxy/README.md new file mode 100644 index 0000000000..ad8959656e --- /dev/null +++ b/examples/cluster-haproxy/README.md @@ -0,0 +1,31 @@ + +# Socket.IO Chat with haproxy & redis + +A simple chat demo for socket.io + +## How to use + +Install [Docker Compose](https://docs.docker.com/compose/install/), then: + +``` +$ docker-compose up -d +``` + +And then point your browser to `http://localhost:3000`. + +This will start four Socket.IO nodes, behind a haproxy instance which will loadbalance the requests (using a cookie for sticky sessions, see [cookie](https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#4.2-cookie)). + +Each node connects to the redis backend, which will enable to broadcast to every client, no matter which node it is currently connected to. + +``` +# you can kill a given node, the client should reconnect to another node +$ docker-compose stop server-george +``` + +## Features + +- Multiple users can join a chat room by each entering a unique username +on website load. +- Users can type chat messages to the chat room. +- A notification is sent to all users when a user joins or leaves +the chatroom. diff --git a/examples/cluster-haproxy/docker-compose.yml b/examples/cluster-haproxy/docker-compose.yml new file mode 100644 index 0000000000..fe5aa4f96b --- /dev/null +++ b/examples/cluster-haproxy/docker-compose.yml @@ -0,0 +1,51 @@ + +haproxy: + build: ./haproxy + links: + - server-john + - server-paul + - server-george + - server-ringo + ports: + - "3000:80" + +server-john: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=John + +server-paul: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Paul + +server-george: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=George + +server-ringo: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Ringo + +redis: + image: redis:alpine + expose: + - "6379" diff --git a/examples/cluster-haproxy/haproxy/Dockerfile b/examples/cluster-haproxy/haproxy/Dockerfile new file mode 100644 index 0000000000..3758e18d24 --- /dev/null +++ b/examples/cluster-haproxy/haproxy/Dockerfile @@ -0,0 +1,2 @@ +FROM haproxy:1.7-alpine +COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg diff --git a/examples/cluster-haproxy/haproxy/haproxy.cfg b/examples/cluster-haproxy/haproxy/haproxy.cfg new file mode 100644 index 0000000000..547afe4441 --- /dev/null +++ b/examples/cluster-haproxy/haproxy/haproxy.cfg @@ -0,0 +1,31 @@ +# Reference: http://blog.haproxy.com/2012/11/07/websockets-load-balancing-with-haproxy/ + +global + daemon + maxconn 4096 + nbproc 2 + +defaults + mode http + balance roundrobin + option http-server-close + timeout connect 5s + timeout client 30s + timeout client-fin 30s + timeout server 30s + timeout tunnel 1h + default-server inter 1s rise 2 fall 1 on-marked-down shutdown-sessions + option forwardfor + +listen chat + bind *:80 + default_backend nodes + +backend nodes + option httpchk HEAD /health + http-check expect status 200 + cookie serverid insert + server john server-john:3000 cookie john check + server paul server-paul:3000 cookie paul check + server george server-george:3000 cookie george check + server ringo server-ringo:3000 cookie ringo check diff --git a/examples/cluster-haproxy/server/Dockerfile b/examples/cluster-haproxy/server/Dockerfile new file mode 100644 index 0000000000..d1f9075727 --- /dev/null +++ b/examples/cluster-haproxy/server/Dockerfile @@ -0,0 +1,15 @@ +FROM mhart/alpine-node:6 + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +# Bundle app source +COPY . /usr/src/app + +EXPOSE 3000 +CMD [ "npm", "start" ] diff --git a/examples/cluster-haproxy/server/index.js b/examples/cluster-haproxy/server/index.js new file mode 100644 index 0000000000..c405196c06 --- /dev/null +++ b/examples/cluster-haproxy/server/index.js @@ -0,0 +1,87 @@ +// Setup basic express server +var express = require('express'); +var app = express(); +var server = require('http').createServer(app); +var io = require('socket.io')(server); +var redis = require('socket.io-redis'); +var port = process.env.PORT || 3000; +var serverName = process.env.NAME || 'Unknown'; + +io.adapter(redis({ host: 'redis', port: 6379 })); + +server.listen(port, function () { + console.log('Server listening at port %d', port); + console.log('Hello, I\'m %s, how can I help?', serverName); +}); + +// Routing +app.use(express.static(__dirname + '/public')); + +// Health check +app.head('/health', function (req, res) { + res.sendStatus(200); +}); + +// Chatroom + +var numUsers = 0; + +io.on('connection', function (socket) { + socket.emit('my-name-is', serverName); + + var addedUser = false; + + // when the client emits 'new message', this listens and executes + socket.on('new message', function (data) { + // we tell the client to execute 'new message' + socket.broadcast.emit('new message', { + username: socket.username, + message: data + }); + }); + + // when the client emits 'add user', this listens and executes + socket.on('add user', function (username) { + if (addedUser) return; + + // we store the username in the socket session for this client + socket.username = username; + ++numUsers; + addedUser = true; + socket.emit('login', { + numUsers: numUsers + }); + // echo globally (all clients) that a person has connected + socket.broadcast.emit('user joined', { + username: socket.username, + numUsers: numUsers + }); + }); + + // when the client emits 'typing', we broadcast it to others + socket.on('typing', function () { + socket.broadcast.emit('typing', { + username: socket.username + }); + }); + + // when the client emits 'stop typing', we broadcast it to others + socket.on('stop typing', function () { + socket.broadcast.emit('stop typing', { + username: socket.username + }); + }); + + // when the user disconnects.. perform this + socket.on('disconnect', function () { + if (addedUser) { + --numUsers; + + // echo globally that this client has left + socket.broadcast.emit('user left', { + username: socket.username, + numUsers: numUsers + }); + } + }); +}); diff --git a/examples/cluster-haproxy/server/package.json b/examples/cluster-haproxy/server/package.json new file mode 100644 index 0000000000..0fe83ecd3e --- /dev/null +++ b/examples/cluster-haproxy/server/package.json @@ -0,0 +1,17 @@ +{ + "name": "socket.io-chat", + "version": "0.0.0", + "description": "A simple chat client using socket.io", + "main": "index.js", + "author": "Grant Timmerman", + "private": true, + "license": "BSD", + "dependencies": { + "express": "4.13.4", + "socket.io": "^1.7.2", + "socket.io-redis": "^3.0.0" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/examples/cluster-haproxy/server/public/index.html b/examples/cluster-haproxy/server/public/index.html new file mode 100644 index 0000000000..9b2043d73f --- /dev/null +++ b/examples/cluster-haproxy/server/public/index.html @@ -0,0 +1,28 @@ + + + + + Socket.IO Chat Example + + + +
      +
    • +
      +
        +
        + +
      • + +
      + + + + + + \ No newline at end of file diff --git a/examples/cluster-haproxy/server/public/main.js b/examples/cluster-haproxy/server/public/main.js new file mode 100644 index 0000000000..03b3702c83 --- /dev/null +++ b/examples/cluster-haproxy/server/public/main.js @@ -0,0 +1,286 @@ +$(function() { + var FADE_TIME = 150; // ms + var TYPING_TIMER_LENGTH = 400; // ms + var COLORS = [ + '#e21400', '#91580f', '#f8a700', '#f78b00', + '#58dc00', '#287b00', '#a8f07a', '#4ae8c4', + '#3b88eb', '#3824aa', '#a700ff', '#d300e7' + ]; + + // Initialize variables + var $window = $(window); + var $usernameInput = $('.usernameInput'); // Input for username + var $messages = $('.messages'); // Messages area + var $inputMessage = $('.inputMessage'); // Input message input box + + var $loginPage = $('.login.page'); // The login page + var $chatPage = $('.chat.page'); // The chatroom page + + // Prompt for setting a username + var username; + var connected = false; + var typing = false; + var lastTypingTime; + var $currentInput = $usernameInput.focus(); + + var socket = io(); + + function addParticipantsMessage (data) { + var message = ''; + if (data.numUsers === 1) { + message += "there's 1 participant"; + } else { + message += "there are " + data.numUsers + " participants"; + } + log(message); + } + + // Sets the client's username + function setUsername () { + username = cleanInput($usernameInput.val().trim()); + + // If the username is valid + if (username) { + $loginPage.fadeOut(); + $chatPage.show(); + $loginPage.off('click'); + $currentInput = $inputMessage.focus(); + + // Tell the server your username + socket.emit('add user', username); + } + } + + // Sends a chat message + function sendMessage () { + var message = $inputMessage.val(); + // Prevent markup from being injected into the message + message = cleanInput(message); + // if there is a non-empty message and a socket connection + if (message && connected) { + $inputMessage.val(''); + addChatMessage({ + username: username, + message: message + }); + // tell server to execute 'new message' and send along one parameter + socket.emit('new message', message); + } + } + + // Log a message + function log (message, options) { + var $el = $('
    • ').addClass('log').text(message); + addMessageElement($el, options); + } + + // Adds the visual chat message to the message list + function addChatMessage (data, options) { + // Don't fade the message in if there is an 'X was typing' + var $typingMessages = getTypingMessages(data); + options = options || {}; + if ($typingMessages.length !== 0) { + options.fade = false; + $typingMessages.remove(); + } + + var $usernameDiv = $('') + .text(data.username) + .css('color', getUsernameColor(data.username)); + var $messageBodyDiv = $('') + .text(data.message); + + var typingClass = data.typing ? 'typing' : ''; + var $messageDiv = $('
    • ') + .data('username', data.username) + .addClass(typingClass) + .append($usernameDiv, $messageBodyDiv); + + addMessageElement($messageDiv, options); + } + + // Adds the visual chat typing message + function addChatTyping (data) { + data.typing = true; + data.message = 'is typing'; + addChatMessage(data); + } + + // Removes the visual chat typing message + function removeChatTyping (data) { + getTypingMessages(data).fadeOut(function () { + $(this).remove(); + }); + } + + // Adds a message element to the messages and scrolls to the bottom + // el - The element to add as a message + // options.fade - If the element should fade-in (default = true) + // options.prepend - If the element should prepend + // all other messages (default = false) + function addMessageElement (el, options) { + var $el = $(el); + + // Setup default options + if (!options) { + options = {}; + } + if (typeof options.fade === 'undefined') { + options.fade = true; + } + if (typeof options.prepend === 'undefined') { + options.prepend = false; + } + + // Apply options + if (options.fade) { + $el.hide().fadeIn(FADE_TIME); + } + if (options.prepend) { + $messages.prepend($el); + } else { + $messages.append($el); + } + $messages[0].scrollTop = $messages[0].scrollHeight; + } + + // Prevents input from having injected markup + function cleanInput (input) { + return $('
      ').text(input).text(); + } + + // Updates the typing event + function updateTyping () { + if (connected) { + if (!typing) { + typing = true; + socket.emit('typing'); + } + lastTypingTime = (new Date()).getTime(); + + setTimeout(function () { + var typingTimer = (new Date()).getTime(); + var timeDiff = typingTimer - lastTypingTime; + if (timeDiff >= TYPING_TIMER_LENGTH && typing) { + socket.emit('stop typing'); + typing = false; + } + }, TYPING_TIMER_LENGTH); + } + } + + // Gets the 'X is typing' messages of a user + function getTypingMessages (data) { + return $('.typing.message').filter(function (i) { + return $(this).data('username') === data.username; + }); + } + + // Gets the color of a username through our hash function + function getUsernameColor (username) { + // Compute hash code + var hash = 7; + for (var i = 0; i < username.length; i++) { + hash = username.charCodeAt(i) + (hash << 5) - hash; + } + // Calculate color + var index = Math.abs(hash % COLORS.length); + return COLORS[index]; + } + + // Keyboard events + + $window.keydown(function (event) { + // Auto-focus the current input when a key is typed + if (!(event.ctrlKey || event.metaKey || event.altKey)) { + $currentInput.focus(); + } + // When the client hits ENTER on their keyboard + if (event.which === 13) { + if (username) { + sendMessage(); + socket.emit('stop typing'); + typing = false; + } else { + setUsername(); + } + } + }); + + $inputMessage.on('input', function() { + updateTyping(); + }); + + // Click events + + // Focus input when clicking anywhere on login page + $loginPage.click(function () { + $currentInput.focus(); + }); + + // Focus input when clicking on the message input's border + $inputMessage.click(function () { + $inputMessage.focus(); + }); + + // Socket events + + // Whenever the server emits 'login', log the login message + socket.on('login', function (data) { + connected = true; + // Display the welcome message + var message = "Welcome to Socket.IO Chat – "; + log(message, { + prepend: true + }); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'new message', update the chat body + socket.on('new message', function (data) { + addChatMessage(data); + }); + + // Whenever the server emits 'user joined', log it in the chat body + socket.on('user joined', function (data) { + log(data.username + ' joined'); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'user left', log it in the chat body + socket.on('user left', function (data) { + log(data.username + ' left'); + addParticipantsMessage(data); + removeChatTyping(data); + }); + + // Whenever the server emits 'typing', show the typing message + socket.on('typing', function (data) { + addChatTyping(data); + }); + + // Whenever the server emits 'stop typing', kill the typing message + socket.on('stop typing', function (data) { + removeChatTyping(data); + }); + + socket.on('disconnect', function () { + log('you have been disconnected'); + }); + + socket.on('reconnect', function () { + log('you have been reconnected'); + if (username) { + socket.emit('add user', username); + } + }); + + socket.on('reconnect_error', function () { + log('attempt to reconnect has failed'); + }); + + socket.on('my-name-is', function (serverName) { + log('host is now ' + serverName); + }) + +}); diff --git a/examples/cluster-haproxy/server/public/style.css b/examples/cluster-haproxy/server/public/style.css new file mode 100644 index 0000000000..3052d88e4c --- /dev/null +++ b/examples/cluster-haproxy/server/public/style.css @@ -0,0 +1,149 @@ +/* Fix user-agent */ + +* { + box-sizing: border-box; +} + +html { + font-weight: 300; + -webkit-font-smoothing: antialiased; +} + +html, input { + font-family: + "HelveticaNeue-Light", + "Helvetica Neue Light", + "Helvetica Neue", + Helvetica, + Arial, + "Lucida Grande", + sans-serif; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +ul { + list-style: none; + word-wrap: break-word; +} + +/* Pages */ + +.pages { + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +.page { + height: 100%; + position: absolute; + width: 100%; +} + +/* Login Page */ + +.login.page { + background-color: #000; +} + +.login.page .form { + height: 100px; + margin-top: -100px; + position: absolute; + + text-align: center; + top: 50%; + width: 100%; +} + +.login.page .form .usernameInput { + background-color: transparent; + border: none; + border-bottom: 2px solid #fff; + outline: none; + padding-bottom: 15px; + text-align: center; + width: 400px; +} + +.login.page .title { + font-size: 200%; +} + +.login.page .usernameInput { + font-size: 200%; + letter-spacing: 3px; +} + +.login.page .title, .login.page .usernameInput { + color: #fff; + font-weight: 100; +} + +/* Chat page */ + +.chat.page { + display: none; +} + +/* Font */ + +.messages { + font-size: 150%; +} + +.inputMessage { + font-size: 100%; +} + +.log { + color: gray; + font-size: 70%; + margin: 5px; + text-align: center; +} + +/* Messages */ + +.chatArea { + height: 100%; + padding-bottom: 60px; +} + +.messages { + height: 100%; + margin: 0; + overflow-y: scroll; + padding: 10px 20px 10px 20px; +} + +.message.typing .messageBody { + color: gray; +} + +.username { + font-weight: 700; + overflow: hidden; + padding-right: 15px; + text-align: right; +} + +/* Input */ + +.inputMessage { + border: 10px solid #000; + bottom: 0; + height: 60px; + left: 0; + outline: none; + padding-left: 10px; + position: absolute; + right: 0; + width: 100%; +} From e28b47542875ddea8d7960423bca503430ee0b4a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 16 Jan 2017 08:33:22 +0100 Subject: [PATCH 227/494] [docs] Add httpd cluster example (#2819) --- examples/cluster-httpd/README.md | 31 ++ examples/cluster-httpd/docker-compose.yml | 51 ++++ examples/cluster-httpd/httpd/Dockerfile | 2 + examples/cluster-httpd/httpd/httpd.conf | 52 ++++ examples/cluster-httpd/server/Dockerfile | 15 + examples/cluster-httpd/server/index.js | 82 +++++ examples/cluster-httpd/server/package.json | 17 ++ .../cluster-httpd/server/public/index.html | 28 ++ examples/cluster-httpd/server/public/main.js | 286 ++++++++++++++++++ .../cluster-httpd/server/public/style.css | 149 +++++++++ 10 files changed, 713 insertions(+) create mode 100644 examples/cluster-httpd/README.md create mode 100644 examples/cluster-httpd/docker-compose.yml create mode 100644 examples/cluster-httpd/httpd/Dockerfile create mode 100644 examples/cluster-httpd/httpd/httpd.conf create mode 100644 examples/cluster-httpd/server/Dockerfile create mode 100644 examples/cluster-httpd/server/index.js create mode 100644 examples/cluster-httpd/server/package.json create mode 100644 examples/cluster-httpd/server/public/index.html create mode 100644 examples/cluster-httpd/server/public/main.js create mode 100644 examples/cluster-httpd/server/public/style.css diff --git a/examples/cluster-httpd/README.md b/examples/cluster-httpd/README.md new file mode 100644 index 0000000000..09edd05b9b --- /dev/null +++ b/examples/cluster-httpd/README.md @@ -0,0 +1,31 @@ + +# Socket.IO Chat with httpd & redis + +A simple chat demo for socket.io + +## How to use + +Install [Docker Compose](https://docs.docker.com/compose/install/), then: + +``` +$ docker-compose up -d +``` + +And then point your browser to `http://localhost:3000`. + +This will start four Socket.IO nodes, behind a httpd proxy which will loadbalance the requests (using a cookie for sticky sessions, see [cookie](http://httpd.apache.org/docs/2.4/fr/mod/mod_proxy_balancer.html)). + +Each node connects to the redis backend, which will enable to broadcast to every client, no matter which node it is currently connected to. + +``` +# you can kill a given node, the client should reconnect to another node +$ docker-compose stop server-george +``` + +## Features + +- Multiple users can join a chat room by each entering a unique username +on website load. +- Users can type chat messages to the chat room. +- A notification is sent to all users when a user joins or leaves +the chatroom. diff --git a/examples/cluster-httpd/docker-compose.yml b/examples/cluster-httpd/docker-compose.yml new file mode 100644 index 0000000000..ad6e6f004a --- /dev/null +++ b/examples/cluster-httpd/docker-compose.yml @@ -0,0 +1,51 @@ + +httpd: + build: ./httpd + links: + - server-john + - server-paul + - server-george + - server-ringo + ports: + - "3000:80" + +server-john: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=John + +server-paul: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Paul + +server-george: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=George + +server-ringo: + build: ./server + links: + - redis + expose: + - "3000" + environment: + - NAME=Ringo + +redis: + image: redis:alpine + expose: + - "6379" diff --git a/examples/cluster-httpd/httpd/Dockerfile b/examples/cluster-httpd/httpd/Dockerfile new file mode 100644 index 0000000000..10fef8f3e2 --- /dev/null +++ b/examples/cluster-httpd/httpd/Dockerfile @@ -0,0 +1,2 @@ +FROM httpd:2.4-alpine +COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf diff --git a/examples/cluster-httpd/httpd/httpd.conf b/examples/cluster-httpd/httpd/httpd.conf new file mode 100644 index 0000000000..ee2dc5877f --- /dev/null +++ b/examples/cluster-httpd/httpd/httpd.conf @@ -0,0 +1,52 @@ + +Listen 80 + +ServerName localhost + +LoadModule authn_file_module modules/mod_authn_file.so +LoadModule authn_core_module modules/mod_authn_core.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authz_groupfile_module modules/mod_authz_groupfile.so +LoadModule authz_user_module modules/mod_authz_user.so +LoadModule authz_core_module modules/mod_authz_core.so + +LoadModule headers_module modules/mod_headers.so +LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_balancer_module modules/mod_proxy_balancer.so +LoadModule proxy_http_module modules/mod_proxy_http.so +LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so +LoadModule rewrite_module modules/mod_rewrite.so +LoadModule slotmem_shm_module modules/mod_slotmem_shm.so +LoadModule unixd_module modules/mod_unixd.so + +User daemon +Group daemon + +ErrorLog /proc/self/fd/2 + +Header add Set-Cookie "SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED + + + BalancerMember "http://server-john:3000/" route=john + BalancerMember "http://server-paul:3000/" route=paul + BalancerMember "http://server-george:3000/" route=george + BalancerMember "http://server-ringo:3000/" route=ringo + ProxySet stickysession=SERVERID + + + + BalancerMember "ws://server-john:3000" route=john + BalancerMember "ws://server-paul:3000" route=paul + BalancerMember "ws://server-george:3000" route=george + BalancerMember "ws://server-ringo:3000" route=ringo + ProxySet stickysession=SERVERID + + +RewriteEngine On +RewriteCond %{HTTP:Upgrade} =websocket [NC] +RewriteRule /(.*) balancer://nodes_ws/$1 [P,L] +RewriteCond %{HTTP:Upgrade} !=websocket [NC] +RewriteRule /(.*) balancer://nodes_polling/$1 [P,L] + +ProxyTimeout 3 diff --git a/examples/cluster-httpd/server/Dockerfile b/examples/cluster-httpd/server/Dockerfile new file mode 100644 index 0000000000..d1f9075727 --- /dev/null +++ b/examples/cluster-httpd/server/Dockerfile @@ -0,0 +1,15 @@ +FROM mhart/alpine-node:6 + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +# Bundle app source +COPY . /usr/src/app + +EXPOSE 3000 +CMD [ "npm", "start" ] diff --git a/examples/cluster-httpd/server/index.js b/examples/cluster-httpd/server/index.js new file mode 100644 index 0000000000..d5b56b2ce8 --- /dev/null +++ b/examples/cluster-httpd/server/index.js @@ -0,0 +1,82 @@ +// Setup basic express server +var express = require('express'); +var app = express(); +var server = require('http').createServer(app); +var io = require('socket.io')(server); +var redis = require('socket.io-redis'); +var port = process.env.PORT || 3000; +var serverName = process.env.NAME || 'Unknown'; + +io.adapter(redis({ host: 'redis', port: 6379 })); + +server.listen(port, function () { + console.log('Server listening at port %d', port); + console.log('Hello, I\'m %s, how can I help?', serverName); +}); + +// Routing +app.use(express.static(__dirname + '/public')); + +// Chatroom + +var numUsers = 0; + +io.on('connection', function (socket) { + socket.emit('my-name-is', serverName); + + var addedUser = false; + + // when the client emits 'new message', this listens and executes + socket.on('new message', function (data) { + // we tell the client to execute 'new message' + socket.broadcast.emit('new message', { + username: socket.username, + message: data + }); + }); + + // when the client emits 'add user', this listens and executes + socket.on('add user', function (username) { + if (addedUser) return; + + // we store the username in the socket session for this client + socket.username = username; + ++numUsers; + addedUser = true; + socket.emit('login', { + numUsers: numUsers + }); + // echo globally (all clients) that a person has connected + socket.broadcast.emit('user joined', { + username: socket.username, + numUsers: numUsers + }); + }); + + // when the client emits 'typing', we broadcast it to others + socket.on('typing', function () { + socket.broadcast.emit('typing', { + username: socket.username + }); + }); + + // when the client emits 'stop typing', we broadcast it to others + socket.on('stop typing', function () { + socket.broadcast.emit('stop typing', { + username: socket.username + }); + }); + + // when the user disconnects.. perform this + socket.on('disconnect', function () { + if (addedUser) { + --numUsers; + + // echo globally that this client has left + socket.broadcast.emit('user left', { + username: socket.username, + numUsers: numUsers + }); + } + }); +}); diff --git a/examples/cluster-httpd/server/package.json b/examples/cluster-httpd/server/package.json new file mode 100644 index 0000000000..0fe83ecd3e --- /dev/null +++ b/examples/cluster-httpd/server/package.json @@ -0,0 +1,17 @@ +{ + "name": "socket.io-chat", + "version": "0.0.0", + "description": "A simple chat client using socket.io", + "main": "index.js", + "author": "Grant Timmerman", + "private": true, + "license": "BSD", + "dependencies": { + "express": "4.13.4", + "socket.io": "^1.7.2", + "socket.io-redis": "^3.0.0" + }, + "scripts": { + "start": "node index.js" + } +} diff --git a/examples/cluster-httpd/server/public/index.html b/examples/cluster-httpd/server/public/index.html new file mode 100644 index 0000000000..9b2043d73f --- /dev/null +++ b/examples/cluster-httpd/server/public/index.html @@ -0,0 +1,28 @@ + + + + + Socket.IO Chat Example + + + +
        +
      • +
        +
          +
          + +
        • + +
        + + + + + + \ No newline at end of file diff --git a/examples/cluster-httpd/server/public/main.js b/examples/cluster-httpd/server/public/main.js new file mode 100644 index 0000000000..03b3702c83 --- /dev/null +++ b/examples/cluster-httpd/server/public/main.js @@ -0,0 +1,286 @@ +$(function() { + var FADE_TIME = 150; // ms + var TYPING_TIMER_LENGTH = 400; // ms + var COLORS = [ + '#e21400', '#91580f', '#f8a700', '#f78b00', + '#58dc00', '#287b00', '#a8f07a', '#4ae8c4', + '#3b88eb', '#3824aa', '#a700ff', '#d300e7' + ]; + + // Initialize variables + var $window = $(window); + var $usernameInput = $('.usernameInput'); // Input for username + var $messages = $('.messages'); // Messages area + var $inputMessage = $('.inputMessage'); // Input message input box + + var $loginPage = $('.login.page'); // The login page + var $chatPage = $('.chat.page'); // The chatroom page + + // Prompt for setting a username + var username; + var connected = false; + var typing = false; + var lastTypingTime; + var $currentInput = $usernameInput.focus(); + + var socket = io(); + + function addParticipantsMessage (data) { + var message = ''; + if (data.numUsers === 1) { + message += "there's 1 participant"; + } else { + message += "there are " + data.numUsers + " participants"; + } + log(message); + } + + // Sets the client's username + function setUsername () { + username = cleanInput($usernameInput.val().trim()); + + // If the username is valid + if (username) { + $loginPage.fadeOut(); + $chatPage.show(); + $loginPage.off('click'); + $currentInput = $inputMessage.focus(); + + // Tell the server your username + socket.emit('add user', username); + } + } + + // Sends a chat message + function sendMessage () { + var message = $inputMessage.val(); + // Prevent markup from being injected into the message + message = cleanInput(message); + // if there is a non-empty message and a socket connection + if (message && connected) { + $inputMessage.val(''); + addChatMessage({ + username: username, + message: message + }); + // tell server to execute 'new message' and send along one parameter + socket.emit('new message', message); + } + } + + // Log a message + function log (message, options) { + var $el = $('
      • ').addClass('log').text(message); + addMessageElement($el, options); + } + + // Adds the visual chat message to the message list + function addChatMessage (data, options) { + // Don't fade the message in if there is an 'X was typing' + var $typingMessages = getTypingMessages(data); + options = options || {}; + if ($typingMessages.length !== 0) { + options.fade = false; + $typingMessages.remove(); + } + + var $usernameDiv = $('') + .text(data.username) + .css('color', getUsernameColor(data.username)); + var $messageBodyDiv = $('') + .text(data.message); + + var typingClass = data.typing ? 'typing' : ''; + var $messageDiv = $('
      • ') + .data('username', data.username) + .addClass(typingClass) + .append($usernameDiv, $messageBodyDiv); + + addMessageElement($messageDiv, options); + } + + // Adds the visual chat typing message + function addChatTyping (data) { + data.typing = true; + data.message = 'is typing'; + addChatMessage(data); + } + + // Removes the visual chat typing message + function removeChatTyping (data) { + getTypingMessages(data).fadeOut(function () { + $(this).remove(); + }); + } + + // Adds a message element to the messages and scrolls to the bottom + // el - The element to add as a message + // options.fade - If the element should fade-in (default = true) + // options.prepend - If the element should prepend + // all other messages (default = false) + function addMessageElement (el, options) { + var $el = $(el); + + // Setup default options + if (!options) { + options = {}; + } + if (typeof options.fade === 'undefined') { + options.fade = true; + } + if (typeof options.prepend === 'undefined') { + options.prepend = false; + } + + // Apply options + if (options.fade) { + $el.hide().fadeIn(FADE_TIME); + } + if (options.prepend) { + $messages.prepend($el); + } else { + $messages.append($el); + } + $messages[0].scrollTop = $messages[0].scrollHeight; + } + + // Prevents input from having injected markup + function cleanInput (input) { + return $('
        ').text(input).text(); + } + + // Updates the typing event + function updateTyping () { + if (connected) { + if (!typing) { + typing = true; + socket.emit('typing'); + } + lastTypingTime = (new Date()).getTime(); + + setTimeout(function () { + var typingTimer = (new Date()).getTime(); + var timeDiff = typingTimer - lastTypingTime; + if (timeDiff >= TYPING_TIMER_LENGTH && typing) { + socket.emit('stop typing'); + typing = false; + } + }, TYPING_TIMER_LENGTH); + } + } + + // Gets the 'X is typing' messages of a user + function getTypingMessages (data) { + return $('.typing.message').filter(function (i) { + return $(this).data('username') === data.username; + }); + } + + // Gets the color of a username through our hash function + function getUsernameColor (username) { + // Compute hash code + var hash = 7; + for (var i = 0; i < username.length; i++) { + hash = username.charCodeAt(i) + (hash << 5) - hash; + } + // Calculate color + var index = Math.abs(hash % COLORS.length); + return COLORS[index]; + } + + // Keyboard events + + $window.keydown(function (event) { + // Auto-focus the current input when a key is typed + if (!(event.ctrlKey || event.metaKey || event.altKey)) { + $currentInput.focus(); + } + // When the client hits ENTER on their keyboard + if (event.which === 13) { + if (username) { + sendMessage(); + socket.emit('stop typing'); + typing = false; + } else { + setUsername(); + } + } + }); + + $inputMessage.on('input', function() { + updateTyping(); + }); + + // Click events + + // Focus input when clicking anywhere on login page + $loginPage.click(function () { + $currentInput.focus(); + }); + + // Focus input when clicking on the message input's border + $inputMessage.click(function () { + $inputMessage.focus(); + }); + + // Socket events + + // Whenever the server emits 'login', log the login message + socket.on('login', function (data) { + connected = true; + // Display the welcome message + var message = "Welcome to Socket.IO Chat – "; + log(message, { + prepend: true + }); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'new message', update the chat body + socket.on('new message', function (data) { + addChatMessage(data); + }); + + // Whenever the server emits 'user joined', log it in the chat body + socket.on('user joined', function (data) { + log(data.username + ' joined'); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'user left', log it in the chat body + socket.on('user left', function (data) { + log(data.username + ' left'); + addParticipantsMessage(data); + removeChatTyping(data); + }); + + // Whenever the server emits 'typing', show the typing message + socket.on('typing', function (data) { + addChatTyping(data); + }); + + // Whenever the server emits 'stop typing', kill the typing message + socket.on('stop typing', function (data) { + removeChatTyping(data); + }); + + socket.on('disconnect', function () { + log('you have been disconnected'); + }); + + socket.on('reconnect', function () { + log('you have been reconnected'); + if (username) { + socket.emit('add user', username); + } + }); + + socket.on('reconnect_error', function () { + log('attempt to reconnect has failed'); + }); + + socket.on('my-name-is', function (serverName) { + log('host is now ' + serverName); + }) + +}); diff --git a/examples/cluster-httpd/server/public/style.css b/examples/cluster-httpd/server/public/style.css new file mode 100644 index 0000000000..3052d88e4c --- /dev/null +++ b/examples/cluster-httpd/server/public/style.css @@ -0,0 +1,149 @@ +/* Fix user-agent */ + +* { + box-sizing: border-box; +} + +html { + font-weight: 300; + -webkit-font-smoothing: antialiased; +} + +html, input { + font-family: + "HelveticaNeue-Light", + "Helvetica Neue Light", + "Helvetica Neue", + Helvetica, + Arial, + "Lucida Grande", + sans-serif; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +ul { + list-style: none; + word-wrap: break-word; +} + +/* Pages */ + +.pages { + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +.page { + height: 100%; + position: absolute; + width: 100%; +} + +/* Login Page */ + +.login.page { + background-color: #000; +} + +.login.page .form { + height: 100px; + margin-top: -100px; + position: absolute; + + text-align: center; + top: 50%; + width: 100%; +} + +.login.page .form .usernameInput { + background-color: transparent; + border: none; + border-bottom: 2px solid #fff; + outline: none; + padding-bottom: 15px; + text-align: center; + width: 400px; +} + +.login.page .title { + font-size: 200%; +} + +.login.page .usernameInput { + font-size: 200%; + letter-spacing: 3px; +} + +.login.page .title, .login.page .usernameInput { + color: #fff; + font-weight: 100; +} + +/* Chat page */ + +.chat.page { + display: none; +} + +/* Font */ + +.messages { + font-size: 150%; +} + +.inputMessage { + font-size: 100%; +} + +.log { + color: gray; + font-size: 70%; + margin: 5px; + text-align: center; +} + +/* Messages */ + +.chatArea { + height: 100%; + padding-bottom: 60px; +} + +.messages { + height: 100%; + margin: 0; + overflow-y: scroll; + padding: 10px 20px 10px 20px; +} + +.message.typing .messageBody { + color: gray; +} + +.username { + font-weight: 700; + overflow: hidden; + padding-right: 15px; + text-align: right; +} + +/* Input */ + +.inputMessage { + border: 10px solid #000; + bottom: 0; + height: 60px; + left: 0; + outline: none; + padding-left: 10px; + position: absolute; + right: 0; + width: 100%; +} From 23c9dd34d54722dd71f5dd169179c6a02f5c13d3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 16 Jan 2017 23:16:46 +0100 Subject: [PATCH 228/494] [docs] Add a 'Features' section in the README (#2824) --- Readme.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index 3e351470c9..66cda4722c 100644 --- a/Readme.md +++ b/Readme.md @@ -8,6 +8,77 @@ ![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) [![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) +## Features + +Socket.IO enables real-time bidirectional event-based communication. It consists in: + +- a Node.js server (this repository) +- a [Javascript client library](https://github.com/socketio/socket.io-client) for the browser (or a Node.js client) + +Some implementations in other languages are also available: + +- [Java](https://github.com/socketio/socket.io-client-java) +- [C++](https://github.com/socketio/socket.io-client-cpp) +- [Swift](https://github.com/socketio/socket.io-client-swift) + +Its main features are: + +#### Reliability + +Connections are established even in the presence of: + - proxies and load balancers. + - personal firewall and antivirus software. + +For this purpose, it relies on [Engine.IO](https://github.com/socketio/engine.io), which first establishes a long-polling connection, then tries to upgrade to better transports that are "tested" on the side, like WebSocket. Please see the [Goals](https://github.com/socketio/engine.io#goals) section for more information. + +#### Auto-reconnection support + +Unless instructed otherwise a disconnected client will try to reconnect forever, until the server is available again. Please see the available reconnection options [here](https://github.com/socketio/socket.io-client/blob/master/docs/API.md#new-managerurl-options). + +#### Disconnection detection + +An heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore. + +That functionality is achieved with timers set on both the server and the client, with timeout values (the `pingInterval` and `pingTimeout` parameters) shared during the connection handshake. Those timers require any subsequent client calls to be directed to the same server, hence the `sticky-session` requirement when using multiples nodes. + +#### Binary support + +Any serializable data structures can be emitted, including: + +- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) in the browser +- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Buffer](https://nodejs.org/api/buffer.html) in Node.js + +#### Simple and convenient API + +Sample code: + +```js +io.on('connection', function(socket){ + socket.emit('request', /* */); // emit an event to the socket + io.emit('broadcast', /* */); // emit an event to all connected sockets + socket.on('reply', function(){ /* */ }); // listen to the event +}); +``` + +#### Cross-browser + +Browser support is tested in Saucelabs: + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/socket.svg)](https://saucelabs.com/u/socket) + +#### Multiplexing support + +In order to create separation of concerns within your application (for example per module, or based on permissions), Socket.IO allows you to create several `Namespaces`, which will act as separate communication channels but will share the same underlying connection. + +#### Room support + +Within each `Namespace`, you can define arbitrary channels, called `Rooms`, that sockets can join and leave. You can then broadcast to any given room, reaching every socket that has joined it. + +This is a useful feature to send notifications to a group of users, or to a given user connected on several devices for example. + + +**Note:** Socket.IO is not a WebSocket implementation. Although Socket.IO indeed uses WebSocket as a transport when possible, it adds some metadata to each packet: the packet type, the namespace and the ack id when a message acknowledgement is needed. That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server (like `ws://echo.websocket.org`) either. Please see the protocol specification [here](https://github.com/socketio/socket.io-protocol). + ## Installation ```bash @@ -65,9 +136,9 @@ io.on('connection', function(){ /* … */ }); server.listen(3000); ``` -## API +## Documentation -See [API](/docs/API.md). +Please see the documentation [here](/docs/README.md). Contributions are welcome! ## Debug / logging From 3b5f4339a7b73c449684707f021c3f4aa2e01b13 Mon Sep 17 00:00:00 2001 From: Antoine LUCAS Date: Sun, 22 Jan 2017 17:21:45 +1100 Subject: [PATCH 229/494] [fix] Use path.resolve by default and require.resolve as a fallback (#2797) Browserify doesn't support require.resolve, and as a consequence, makes nexe fail the compilation. This PR attempts to get the path of the socket.io-client file via path.resolve and falls back to the original require.resolve if this file cannot be found. --- lib/index.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/index.js b/lib/index.js index 16bc04bbb0..a0ffcdb493 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,6 +5,8 @@ var http = require('http'); var read = require('fs').readFileSync; +var path = require('path'); +var exists = require('fs').existsSync; var engine = require('engine.io'); var client = require('socket.io-client'); var clientVersion = require('socket.io-client/package').version; @@ -96,16 +98,21 @@ Server.prototype.checkRequest = function(req, fn) { Server.prototype.serveClient = function(v){ if (!arguments.length) return this._serveClient; this._serveClient = v; - + var resolvePath = function(file){ + var filepath = path.resolve(__dirname, './../../', file); + if (exists(filepath)) { + return filepath; + } + return require.resolve(file); + }; if (v && !clientSource) { - clientSource = read(require.resolve('socket.io-client/dist/socket.io.min.js'), 'utf-8'); + clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.min.js'), 'utf-8'); try { - clientSourceMap = read(require.resolve('socket.io-client/dist/socket.io.js.map'), 'utf-8'); + clientSourceMap = read(resolvePath( 'socket.io-client/dist/socket.io.js.map'), 'utf-8'); } catch(err) { debug('could not load sourcemap file'); } } - return this; }; @@ -378,7 +385,7 @@ Server.prototype.onconnection = function(conn){ Server.prototype.of = function(name, fn){ if (String(name)[0] !== '/') name = '/' + name; - + var nsp = this.nsps[name]; if (!nsp) { debug('initializing namespace %s', name); @@ -392,7 +399,7 @@ Server.prototype.of = function(name, fn){ /** * Closes server connection * - * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed + * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed * @api public */ From 3d695c60f136027df1086423e4ff5b68e904804f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 23 Jan 2017 23:16:51 +0100 Subject: [PATCH 230/494] =?UTF-8?q?[chore]=C2=A0Bump=20engine.io=20to=20ve?= =?UTF-8?q?rsion=202.0.0=20(#2832)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- test/socket.io.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ec39c0b008..7e9db81298 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,11 @@ }, "dependencies": { "debug": "2.3.3", - "engine.io": "1.8.2", + "engine.io": "2.0.0", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.2", + "socket.io-client": "socketio/socket.io-client", "socket.io-parser": "2.3.1" }, "devDependencies": { diff --git a/test/socket.io.js b/test/socket.io.js index 01bc134af2..9d69c19744 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -251,7 +251,7 @@ describe('socket.io', function(){ request.get('http://localhost:54013/socket.io/default/') .query({ transport: 'polling' }) .end(function (err, res) { - expect(res.status).to.be(400); + expect(res.status).to.be(403); done(); }); }); @@ -262,7 +262,7 @@ describe('socket.io', function(){ .query({ transport: 'polling' }) .set('origin', 'http://herp.derp/') .end(function (err, res) { - expect(res.status).to.be(400); + expect(res.status).to.be(403); done(); }); }); @@ -305,7 +305,7 @@ describe('socket.io', function(){ .set('origin', 'http://herp.derp/') .query({ transport: 'polling' }) .end(function (err, res) { - expect(res.status).to.be(400); + expect(res.status).to.be(403); done(); }); }); @@ -357,7 +357,7 @@ describe('socket.io', function(){ .set('origin', 'http://foo.example/') .query({ transport: 'polling' }) .end(function (err, res) { - expect(res.status).to.be(400); + expect(res.status).to.be(403); done(); }); }); From 3b92cc2b2678f0e102d7a882248424475e7116ae Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 24 Jan 2017 07:10:19 +0100 Subject: [PATCH 231/494] [feature] Allow the use of custom parsers (#2829) --- docs/API.md | 1 + lib/client.js | 11 +++-------- lib/index.js | 3 +++ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/API.md b/docs/API.md index f870637808..97b40d96c8 100644 --- a/docs/API.md +++ b/docs/API.md @@ -68,6 +68,7 @@ Exposed by `require('socket.io')`. - `adapter` _(Adapter)_: the adapter to use. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter) - `origins` _(String)_: the allowed origins (`*`) - `allowRequest` _(Function)_: A function that receives a given handshake or upgrade request as its first parameter, and can decide whether to continue or not. The second argument is a function that needs to be called with the decided information: `fn(err, success)`, where `success` is a boolean value where false means that the request is rejected, and err is an error code. + - `parser` _(Parser)_: the parser to use. Defaults to an instance of the `Parser` that ships with socket.io. See [socket.io-parser](https://github.com/socketio/socket.io-parser). Works with and without `new`: diff --git a/lib/client.js b/lib/client.js index e5ab6c6626..0b5f0446e9 100644 --- a/lib/client.js +++ b/lib/client.js @@ -13,12 +13,6 @@ var url = require('url'); module.exports = Client; -/** - * Packet encoder - */ - -var encoder = new parser.Encoder(); - /** * Client constructor. * @@ -30,7 +24,8 @@ var encoder = new parser.Encoder(); function Client(server, conn){ this.server = server; this.conn = conn; - this.decoder = new parser.Decoder(); + this.encoder = server.encoder; + this.decoder = new server.parser.Decoder(); this.id = conn.id; this.request = conn.request; this.setup(); @@ -158,7 +153,7 @@ Client.prototype.packet = function(packet, opts){ if ('open' == this.conn.readyState) { debug('writing packet %j', packet); if (!opts.preEncoded) { // not broadcasting, need to encode - encoder.encode(packet, writeToEngine); // encode, then write results to engine + this.encoder.encode(packet, writeToEngine); // encode, then write results to engine } else { // a broadcast pre-encodes a packet writeToEngine(packet); } diff --git a/lib/index.js b/lib/index.js index a0ffcdb493..871c436df0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -14,6 +14,7 @@ var Client = require('./client'); var Emitter = require('events').EventEmitter; var Namespace = require('./namespace'); var Adapter = require('socket.io-adapter'); +var parser = require('socket.io-parser'); var debug = require('debug')('socket.io:server'); var url = require('url'); @@ -51,6 +52,8 @@ function Server(srv, opts){ this.adapter(opts.adapter || Adapter); this.origins(opts.origins || '*:*'); this.sockets = this.of('/'); + this.parser = opts.parser || parser; + this.encoder = new this.parser.Encoder(); if (srv) this.attach(srv, opts); } From e1facd5155bac210f287b62290a36b4997df1740 Mon Sep 17 00:00:00 2001 From: H3rby7 Date: Wed, 1 Feb 2017 15:23:56 +0100 Subject: [PATCH 232/494] [docs] Small addition to the Express Readme Part (#2846) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 66cda4722c..631b7d88dc 100644 --- a/Readme.md +++ b/Readme.md @@ -113,7 +113,7 @@ io.listen(3000); Starting with **3.0**, express applications have become request handler functions that you pass to `http` or `http` `Server` instances. You need to pass the `Server` to `socket.io`, and not the express application -function. +function. Also make sure to call `.listen` on the `server`, not the `app`. ```js var app = require('express')(); From 54ff591b07ad17915ffd9f325448e72c9a76e828 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 1 Feb 2017 15:28:14 +0100 Subject: [PATCH 233/494] [feature] Merge Engine.IO and Socket.IO handshake packets (#2833) --- lib/index.js | 27 ++++++++++++++++++--------- lib/socket.js | 6 +++++- test/socket.io.js | 9 --------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/lib/index.js b/lib/index.js index 871c436df0..340366e587 100644 --- a/lib/index.js +++ b/lib/index.js @@ -245,18 +245,27 @@ Server.prototype.attach = function(srv, opts){ // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - // initialize engine - debug('creating engine.io instance with opts %j', opts); - this.eio = engine.attach(srv, opts); + var self = this; + + var connectPacket = { type: parser.CONNECT, nsp: '/' }; + this.encoder.encode(connectPacket, function (encodedPacket){ + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = encodedPacket; - // attach static file serving - if (this._serveClient) this.attachServe(srv); + // initialize engine + debug('creating engine.io instance with opts %j', opts); + self.eio = engine.attach(srv, opts); - // Export http server - this.httpServer = srv; + // attach static file serving + if (self._serveClient) self.attachServe(srv); - // bind to engine events - this.bind(this.eio); + // Export http server + self.httpServer = srv; + + // bind to engine events + self.bind(self.eio); + }); return this; }; diff --git a/lib/socket.js b/lib/socket.js index e97536f214..85911979ae 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -290,7 +290,11 @@ Socket.prototype.onconnect = function(){ debug('socket connected - writing packet'); this.nsp.connected[this.id] = this; this.join(this.id); - this.packet({ type: parser.CONNECT }); + // the CONNECT packet for the default namespace + // has already been sent as an `initialPacket` + if (this.nsp.name !== '/') { + this.packet({ type: parser.CONNECT }); + } }; /** diff --git a/test/socket.io.js b/test/socket.io.js index 9d69c19744..3d87e3dba5 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -87,9 +87,6 @@ describe('socket.io', function(){ srv.set('authorization', function(o, f) { f(null, false); }); var socket = client(httpSrv); - socket.on('connect', function(){ - expect().fail(); - }); socket.on('error', function(err) { expect(err).to.be('Not authorized'); done(); @@ -2131,9 +2128,6 @@ describe('socket.io', function(){ }); srv.listen(function(){ var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); - }); socket.on('error', function(err){ expect(err).to.be('Authentication error'); done(); @@ -2152,9 +2146,6 @@ describe('socket.io', function(){ }); srv.listen(function(){ var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); - }); socket.on('error', function(err){ expect(err).to.eql({ a: 'b', c: 3 }); done(); From 5b79ab1af195f70c46ab1b6c4a1f955f7268a255 Mon Sep 17 00:00:00 2001 From: Tim Ruffles Date: Mon, 13 Feb 2017 22:52:07 +0000 Subject: [PATCH 234/494] [docs] Update the wording to match the code example (#2853) --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 97b40d96c8..5bad8c860e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -413,7 +413,7 @@ socket.emit('hello', 'world'); socket.emit('with-binary', 1, '2', { 3: '4', 5: new Buffer(6) }); ``` -The `ack` argument is optional and will be called with the server answer. +The `ack` argument is optional and will be called with the client's answer. ```js var io = require('socket.io')(); From 4d8f68c7dc479da8b75cc93001f89ee6e32d3c12 Mon Sep 17 00:00:00 2001 From: sgress454 Date: Thu, 16 Feb 2017 15:01:53 -0600 Subject: [PATCH 235/494] [chore] Bump engine.io to version 2.0.2 (#2864) Includes the following (from engine.io changelog): * [fix] Initialize the WebSocket server in the Server constructor (#476) * [chore] Bump ws to version 1.1.2 (vulnerability fix) (#480) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e9db81298..b04574c083 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "2.3.3", - "engine.io": "2.0.0", + "engine.io": "2.0.2", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", From 5ae06e6285c53c4e90622c6830bc63950c38269e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 17 Feb 2017 07:33:43 +0100 Subject: [PATCH 236/494] [chore] Bump socket.io-adapter to version 1.0.0 (#2867) --- lib/index.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/index.js b/lib/index.js index 340366e587..9f73d5faf8 100644 --- a/lib/index.js +++ b/lib/index.js @@ -49,11 +49,11 @@ function Server(srv, opts){ this.nsps = {}; this.path(opts.path || '/socket.io'); this.serveClient(false !== opts.serveClient); + this.parser = opts.parser || parser; + this.encoder = new this.parser.Encoder(); this.adapter(opts.adapter || Adapter); this.origins(opts.origins || '*:*'); this.sockets = this.of('/'); - this.parser = opts.parser || parser; - this.encoder = new this.parser.Encoder(); if (srv) this.attach(srv, opts); } diff --git a/package.json b/package.json index b04574c083..dc8f839f73 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "engine.io": "2.0.2", "has-binary": "0.1.7", "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", + "socket.io-adapter": "1.0.0", "socket.io-client": "socketio/socket.io-client", "socket.io-parser": "2.3.1" }, From 2d5b0026c5e472de32234bfc9d5911951f3db579 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 22 Feb 2017 12:48:46 +0100 Subject: [PATCH 237/494] [docs] Add webpack build example (#2828) --- examples/webpack-build-server/README.md | 18 ++++++++++ examples/webpack-build-server/lib/index.js | 15 ++++++++ examples/webpack-build-server/package.json | 23 ++++++++++++ .../support/webpack.config.js | 25 +++++++++++++ examples/webpack-build/README.md | 20 +++++++++++ examples/webpack-build/index.html | 13 +++++++ examples/webpack-build/lib/index.js | 10 ++++++ examples/webpack-build/package.json | 19 ++++++++++ examples/webpack-build/support/noop.js | 2 ++ .../webpack-build/support/webpack.config.js | 8 +++++ .../support/webpack.config.slim.js | 35 +++++++++++++++++++ 11 files changed, 188 insertions(+) create mode 100644 examples/webpack-build-server/README.md create mode 100644 examples/webpack-build-server/lib/index.js create mode 100644 examples/webpack-build-server/package.json create mode 100644 examples/webpack-build-server/support/webpack.config.js create mode 100644 examples/webpack-build/README.md create mode 100644 examples/webpack-build/index.html create mode 100644 examples/webpack-build/lib/index.js create mode 100644 examples/webpack-build/package.json create mode 100644 examples/webpack-build/support/noop.js create mode 100644 examples/webpack-build/support/webpack.config.js create mode 100644 examples/webpack-build/support/webpack.config.slim.js diff --git a/examples/webpack-build-server/README.md b/examples/webpack-build-server/README.md new file mode 100644 index 0000000000..b71d931193 --- /dev/null +++ b/examples/webpack-build-server/README.md @@ -0,0 +1,18 @@ + +# Socket.IO WebPack build + +A sample Webpack build for the server. + +## How to use + +``` +$ npm i +$ npm run build +$ npm start +``` + +**Note:** + +- the `bufferutil` and `utf-8-validate` are optional dependencies from `ws`, compiled from native code, which are meant to improve performance ([ref](https://github.com/websockets/ws#opt-in-for-performance)). You can also omit them, as they have their JS fallback, and ignore the WebPack warning. + +- the server is initiated with `serveClient` set to `false`, so it will not serve the client file. diff --git a/examples/webpack-build-server/lib/index.js b/examples/webpack-build-server/lib/index.js new file mode 100644 index 0000000000..afcdbdb8a4 --- /dev/null +++ b/examples/webpack-build-server/lib/index.js @@ -0,0 +1,15 @@ + +const server = require('http').createServer(); +const io = require('socket.io')(server, { + // serveClient: false // do not serve the client file, in that case the brfs loader is not needed +}); +const port = process.env.PORT || 3000; + +io.on('connect', onConnect); +server.listen(port, () => console.log('server listening on port ' + port)); + +function onConnect(socket){ + console.log('connect ' + socket.id); + + socket.on('disconnect', () => console.log('disconnect ' + socket.id)); +} diff --git a/examples/webpack-build-server/package.json b/examples/webpack-build-server/package.json new file mode 100644 index 0000000000..28ef8ba392 --- /dev/null +++ b/examples/webpack-build-server/package.json @@ -0,0 +1,23 @@ +{ + "name": "webpack-build-server", + "version": "1.0.0", + "description": "A sample Webpack build (for the server)", + "scripts": { + "start": "node dist/server.js", + "build": "webpack --config ./support/webpack.config.js" + }, + "author": "Damien Arrachequesne", + "license": "MIT", + "dependencies": { + "brfs": "^1.4.3", + "bufferutil": "^1.3.0", + "socket.io": "^1.7.2", + "transform-loader": "^0.2.3", + "utf-8-validate": "^2.0.0" + }, + "devDependencies": { + "json-loader": "^0.5.4", + "null-loader": "^0.1.1", + "webpack": "^1.14.0" + } +} diff --git a/examples/webpack-build-server/support/webpack.config.js b/examples/webpack-build-server/support/webpack.config.js new file mode 100644 index 0000000000..a9893a73d2 --- /dev/null +++ b/examples/webpack-build-server/support/webpack.config.js @@ -0,0 +1,25 @@ + +module.exports = { + entry: './lib/index.js', + target: 'node', + output: { + path: './dist', + filename: 'server.js' + }, + module: { + loaders: [ + { + test: /(\.md|\.map)$/, + loader: 'null' + }, + { + test: /\.json$/, + loader: 'json' + }, + { + test: /\.js$/, + loader: "transform-loader?brfs" + } + ] + } +}; diff --git a/examples/webpack-build/README.md b/examples/webpack-build/README.md new file mode 100644 index 0000000000..7df0835a9d --- /dev/null +++ b/examples/webpack-build/README.md @@ -0,0 +1,20 @@ + +# Socket.IO WebPack build + +A sample Webpack build for the browser. + +## How to use + +``` +$ npm i +$ npm run build-all +``` + +There are two WebPack configuration: + +- the minimal configuration, just bundling the application and its dependencies. The `app.js` file in the `dist` folder is the result of that build. + +- a slimmer one, where: + - the JSON polyfill needed for IE6/IE7 support has been removed. + - the `debug` calls and import have been removed (the [debug](https://github.com/visionmedia/debug) library is included in the build by default). + - the source has been uglified (dropping IE8 support), and an associated SourceMap has been generated. diff --git a/examples/webpack-build/index.html b/examples/webpack-build/index.html new file mode 100644 index 0000000000..77b3d69606 --- /dev/null +++ b/examples/webpack-build/index.html @@ -0,0 +1,13 @@ + + + + + Socket.IO WebPack Example + + + + + + + + \ No newline at end of file diff --git a/examples/webpack-build/lib/index.js b/examples/webpack-build/lib/index.js new file mode 100644 index 0000000000..82af605bf3 --- /dev/null +++ b/examples/webpack-build/lib/index.js @@ -0,0 +1,10 @@ + +var socket = require('socket.io-client')('http://localhost:3000/'); + +console.log('init'); + +socket.on('connect', onConnect); + +function onConnect(){ + console.log('connect ' + socket.id); +} diff --git a/examples/webpack-build/package.json b/examples/webpack-build/package.json new file mode 100644 index 0000000000..0c04d0b546 --- /dev/null +++ b/examples/webpack-build/package.json @@ -0,0 +1,19 @@ +{ + "name": "webpack-build", + "version": "1.0.0", + "description": "A sample Webpack build", + "scripts": { + "build": "webpack --config ./support/webpack.config.js", + "build-slim": "webpack --config ./support/webpack.config.slim.js", + "build-all": "npm run build && npm run build-slim" + }, + "author": "Damien Arrachequesne", + "license": "MIT", + "dependencies": { + "socket.io-client": "^1.7.2" + }, + "devDependencies": { + "strip-loader": "^0.1.2", + "webpack": "^1.14.0" + } +} diff --git a/examples/webpack-build/support/noop.js b/examples/webpack-build/support/noop.js new file mode 100644 index 0000000000..920c02ed2e --- /dev/null +++ b/examples/webpack-build/support/noop.js @@ -0,0 +1,2 @@ + +module.exports = function () { return function () {}; }; diff --git a/examples/webpack-build/support/webpack.config.js b/examples/webpack-build/support/webpack.config.js new file mode 100644 index 0000000000..8b5bd4b7cd --- /dev/null +++ b/examples/webpack-build/support/webpack.config.js @@ -0,0 +1,8 @@ + +module.exports = { + entry: './lib/index.js', + output: { + path: './dist', + filename: 'app.js' + }, +}; diff --git a/examples/webpack-build/support/webpack.config.slim.js b/examples/webpack-build/support/webpack.config.slim.js new file mode 100644 index 0000000000..cc2a38fc98 --- /dev/null +++ b/examples/webpack-build/support/webpack.config.slim.js @@ -0,0 +1,35 @@ + +var webpack = require('webpack'); + +module.exports = { + entry: './lib/index.js', + output: { + path: './dist', + filename: 'app.slim.js' + }, + externals: { + // replace JSON polyfill (IE6/IE7) with global JSON object + json3: 'JSON' + }, + // generate sourcemap + devtool: 'source-map', + plugins: [ + // replace require('debug')() with an noop function + new webpack.NormalModuleReplacementPlugin(/debug/, process.cwd() + '/support/noop.js'), + // use uglifyJS (IE9+ support) + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + } + }) + ], + module: { + loaders: [ + { + // strip `debug()` calls + test: /\.js$/, + loader: 'strip-loader?strip[]=debug' + } + ] + } +}; From 01a4623613d9791d1c2043f092c7c25d55c35279 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 26 Feb 2017 09:15:32 +0100 Subject: [PATCH 238/494] [feat] Allow to join several rooms at once (#2879) --- docs/API.md | 9 +++++++++ lib/socket.js | 22 +++++++++++++++------- package.json | 2 +- test/socket.io.js | 15 +++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/docs/API.md b/docs/API.md index 5bad8c860e..e9fe058650 100644 --- a/docs/API.md +++ b/docs/API.md @@ -40,6 +40,7 @@ - [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack) - [socket.on(eventName, callback)](#socketoneventname-callback) - [socket.join(room[, callback])](#socketjoinroom-callback) + - [socket.join(rooms[, callback])](#socketjoinrooms-callback) - [socket.leave(room[, callback])](#socketleaveroom-callback) - [socket.to(room)](#sockettoroom) - [socket.in(room)](#socketinroom) @@ -476,6 +477,14 @@ io.on('connection', function(client){ }); ``` +#### socket.join(rooms[, callback]) + + - `rooms` _(Array)_ + - `callback` _(Function)_ + - **Returns** `Socket` for chaining + +Adds the client to the list of room, and fires optionally a callback with `err` signature (if any). + #### socket.leave(room[, callback]) - `room` _(String)_ diff --git a/lib/socket.js b/lib/socket.js index 85911979ae..33158056f8 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -223,23 +223,31 @@ Socket.prototype.packet = function(packet, opts){ /** * Joins a room. * - * @param {String} room + * @param {String|Array} room or array of rooms * @param {Function} fn optional, callback * @return {Socket} self * @api private */ -Socket.prototype.join = function(room, fn){ - debug('joining room %s', room); +Socket.prototype.join = function(rooms, fn){ + debug('joining room %s', rooms); var self = this; - if (this.rooms.hasOwnProperty(room)) { + if (!Array.isArray(rooms)) { + rooms = [rooms]; + } + rooms = rooms.filter(function (room) { + return !self.rooms.hasOwnProperty(room); + }); + if (!rooms.length) { fn && fn(null); return this; } - this.adapter.add(this.id, room, function(err){ + this.adapter.addAll(this.id, rooms, function(err){ if (err) return fn && fn(err); - debug('joined room %s', room); - self.rooms[room] = room; + debug('joined room %s', rooms); + rooms.forEach(function (room) { + self.rooms[room] = room; + }); fn && fn(null); }); return this; diff --git a/package.json b/package.json index dc8f839f73..8030524ae3 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "engine.io": "2.0.2", "has-binary": "0.1.7", "object-assign": "4.1.0", - "socket.io-adapter": "1.0.0", + "socket.io-adapter": "~1.1.0", "socket.io-client": "socketio/socket.io-client", "socket.io-parser": "2.3.1" }, diff --git a/test/socket.io.js b/test/socket.io.js index 3d87e3dba5..c683e6230d 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2083,6 +2083,21 @@ describe('socket.io', function(){ }); }); }); + + it('allows to join several rooms at once', function(done) { + var srv = http(); + var sio = io(srv); + + srv.listen(function(){ + var socket = client(srv); + sio.on('connection', function(s){ + s.join(['a', 'b', 'c'], function(){ + expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); + done(); + }); + }); + }); + }); }); describe('middleware', function(done){ From e40accf7a12f6f04a63739f378e67b2f7fbd3b68 Mon Sep 17 00:00:00 2001 From: SwhGo_oN Date: Sun, 19 Mar 2017 07:33:59 +0800 Subject: [PATCH 239/494] [docs] Fix documentation for 'connect' event (#2898) --- docs/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API.md b/docs/API.md index e9fe058650..3d99238719 100644 --- a/docs/API.md +++ b/docs/API.md @@ -312,9 +312,9 @@ io.use(function(socket, next){ #### Event: 'connect' - - `error` _(Object)_ error object + - `socket` _(Socket)_ socket connection with client -Fired upon a reconnection attempt error. +Fired upon a connection from client. #### Event: 'connection' From 03f3bc9ab3d5093a746b8e434b29dc43106a0804 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Mon, 27 Mar 2017 13:15:19 +0200 Subject: [PATCH 240/494] =?UTF-8?q?[docs]=C2=A0Fix=20wrong=20space=20chara?= =?UTF-8?q?cter=20in=20README=20(#2900)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 631b7d88dc..6c6d97caf9 100644 --- a/Readme.md +++ b/Readme.md @@ -66,7 +66,7 @@ Browser support is tested in Saucelabs: [![Sauce Test Status](https://saucelabs.com/browser-matrix/socket.svg)](https://saucelabs.com/u/socket) -#### Multiplexing support +#### Multiplexing support In order to create separation of concerns within your application (for example per module, or based on permissions), Socket.IO allows you to create several `Namespaces`, which will act as separate communication channels but will share the same underlying connection. From c5b77387309e5231d9e3d6f3974391bef067b874 Mon Sep 17 00:00:00 2001 From: efkan Date: Wed, 29 Mar 2017 14:52:07 +0300 Subject: [PATCH 241/494] =?UTF-8?q?[docs]=C2=A0Add=20server.engine.generat?= =?UTF-8?q?eId=20attribute=20(#2880)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/API.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/API.md b/docs/API.md index 3d99238719..a59272557b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -6,6 +6,7 @@ - [new Server(port[, options])](#new-serverport-options) - [new Server(options)](#new-serveroptions) - [server.sockets](#serversockets) + - [server.engine.generateId](#serverenginegenerateid) - [server.serveClient([value])](#serverserveclientvalue) - [server.path([value])](#serverpathvalue) - [server.adapter([value])](#serveradaptervalue) @@ -225,6 +226,18 @@ server.listen(PORT); // PORT is free to use io = Server(server); ``` +#### server.engine.generateId + +Overwrites the default method to generate your custom socket id. + +The function is called with a node request object (`http.IncomingMessage`) as first parameter. + +```js +io.engine.generateId = function (req) { + return "custom:id:" + custom_id++; // custom id must be unique +} +``` + ### Namespace Represents a pool of sockets connected under a given scope identified From 240b154960d89e65ccddddf4319f07e9e63d69b4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 29 Mar 2017 14:13:04 +0200 Subject: [PATCH 242/494] [docs] Explicitly document that Server extends EventEmitter (#2874) --- docs/API.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/API.md b/docs/API.md index a59272557b..bcae4fae58 100644 --- a/docs/API.md +++ b/docs/API.md @@ -40,6 +40,10 @@ - [socket.send([...args][, ack])](#socketsendargs-ack) - [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack) - [socket.on(eventName, callback)](#socketoneventname-callback) + - [socket.once(eventName, listener)](#socketonceeventname-listener) + - [socket.removeListener(eventName, listener)](#socketremovelistenereventname-listener) + - [socket.removeAllListeners([eventName])](#socketremovealllistenerseventname) + - [socket.eventNames()](#socketeventnames) - [socket.join(room[, callback])](#socketjoinroom-callback) - [socket.join(rooms[, callback])](#socketjoinrooms-callback) - [socket.leave(room[, callback])](#socketleaveroom-callback) @@ -357,6 +361,8 @@ It should be noted the `Socket` doesn't relate directly to the actual underlying Within each `Namespace`, you can also define arbitrary channels (called `room`) that the `Socket` can join and leave. That provides a convenient way to broadcast to a group of `Socket`s (see `Socket#to` below). +The `Socket` class inherits from [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter). The `Socket` class overrides the `emit` method, and does not modify any other `EventEmitter` method. All methods documented here which also appear as `EventEmitter` methods (apart from `emit`) are implemented by `EventEmitter`, and documentation for `EventEmitter` applies. + #### socket.id * _(String)_ @@ -415,6 +421,7 @@ Sends a `message` event. See [socket.emit(eventName[, ...args][, ack])](#sockete #### socket.emit(eventName[, ...args][, ack]) +*(overrides `EventEmitter.emit`)* - `eventName` _(String)_ - `args` - `ack` _(Function)_ @@ -448,6 +455,7 @@ io.on('connection', function(client){ #### socket.on(eventName, callback) +*(inherited from `EventEmitter`)* - `eventName` _(String)_ - `callback` _(Function)_ - **Returns** `Socket` @@ -460,6 +468,13 @@ socket.on('news', function (data) { }); ``` +#### socket.once(eventName, listener) +#### socket.removeListener(eventName, listener) +#### socket.removeAllListeners([eventName]) +#### socket.eventNames() + +Inherited from `EventEmitter` (along with other methods not mentioned here). See Node.js documentation for the `events` module. + #### socket.join(room[, callback]) - `room` _(String)_ From f1b39a6b1d0f30c4dce63a6b2a2aa9d839483285 Mon Sep 17 00:00:00 2001 From: Faraz Patankar Date: Mon, 3 Apr 2017 10:50:38 +0530 Subject: [PATCH 243/494] [docs] Update emit cheatsheet (#2906) --- docs/emit.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/emit.md b/docs/emit.md index 344d1b380f..c022618423 100644 --- a/docs/emit.md +++ b/docs/emit.md @@ -25,6 +25,9 @@ function onConnect(socket){ // sending to all clients in namespace 'myNamespace', including sender io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon'); + // sending to a specific room in a specific namespace, including sender + io.of('myNamespace').to('room').emit('event', 'message'); + // sending to individual socketid (private message) socket.to().emit('hey', 'I just met you'); From 199eec648e28cf5bb75e98bd5402ab2641de6624 Mon Sep 17 00:00:00 2001 From: Caleb Date: Wed, 19 Apr 2017 16:19:57 -0400 Subject: [PATCH 244/494] =?UTF-8?q?[docs]=C2=A0Replace=20non-breaking=20sp?= =?UTF-8?q?ace=20with=20proper=20whitespace=20(#2913)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/API.md | 10 +++++----- docs/README.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/API.md b/docs/API.md index bcae4fae58..749656f421 100644 --- a/docs/API.md +++ b/docs/API.md @@ -117,7 +117,7 @@ See [above](#new-serverhttpserver-options) for available options. The default (`/`) namespace. -#### server.serveClient([value]) +#### server.serveClient([value]) - `value` _(Boolean)_ - **Returns** `Server|Boolean` @@ -134,14 +134,14 @@ io.serveClient(false); io.attach(http); ``` -#### server.path([value]) +#### server.path([value]) - `value` _(String)_ - **Returns** `Server|String` Sets the path `value` under which `engine.io` and the static files will be served. Defaults to `/socket.io`. If no arguments are supplied this method returns the current value. -#### server.adapter([value]) +#### server.adapter([value]) - `value` _(Adapter)_ - **Returns** `Server|Adapter` @@ -181,7 +181,7 @@ Attaches the `Server` to an engine.io instance on `httpServer` with the supplied Attaches the `Server` to an engine.io instance on a new http.Server with the supplied `options` (optionally). -#### server.listen(httpServer[, options]) +#### server.listen(httpServer[, options]) Synonym of [server.attach(httpServer[, options])](#serverattachhttpserver-options). @@ -189,7 +189,7 @@ Synonym of [server.attach(httpServer[, options])](#serverattachhttpserver-option Synonym of [server.attach(port[, options])](#serverattachport-options). -#### server.bind(engine) +#### server.bind(engine) - `engine` _(engine.Server)_ - **Returns** `Server` diff --git a/docs/README.md b/docs/README.md index 22d751fbc8..f379f87a28 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ ## Table of Contents -#### Getting started +#### Getting started - [Write a chat application](http://socket.io/get-started/chat/) From 87b06ad3628650e5d8910c2a107469e9c38328d1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 25 Apr 2017 00:38:07 +0200 Subject: [PATCH 245/494] [feat] Move binary detection to the parser (#2923) --- lib/namespace.js | 6 +----- lib/socket.js | 6 ++---- package.json | 3 +-- test/socket.io.js | 4 +++- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 186649dc1c..5dc7b4db7c 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -7,7 +7,6 @@ var Socket = require('./socket'); var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); var debug = require('debug')('socket.io:namespace'); -var hasBin = require('has-binary'); /** * Module exports. @@ -210,10 +209,7 @@ Namespace.prototype.emit = function(ev){ } else { // set up packet object var args = Array.prototype.slice.call(arguments); - var parserType = parser.EVENT; // default - if (hasBin(args)) { parserType = parser.BINARY_EVENT; } // binary - - var packet = { type: parserType, data: args }; + var packet = { type: parser.EVENT, data: args }; if ('function' == typeof args[args.length - 1]) { throw new Error('Callbacks are not supported when broadcasting'); diff --git a/lib/socket.js b/lib/socket.js index 33158056f8..bb4a015330 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -7,7 +7,6 @@ var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); var url = require('url'); var debug = require('debug')('socket.io:socket'); -var hasBin = require('has-binary'); var assign = require('object-assign'); /** @@ -143,7 +142,7 @@ Socket.prototype.emit = function(ev){ } else { var args = Array.prototype.slice.call(arguments); var packet = { - type: hasBin(args) ? parser.BINARY_EVENT : parser.EVENT, + type: parser.EVENT, data: args }; @@ -375,10 +374,9 @@ Socket.prototype.ack = function(id){ var args = Array.prototype.slice.call(arguments); debug('sending ack %j', args); - var type = hasBin(args) ? parser.BINARY_ACK : parser.ACK; self.packet({ id: id, - type: type, + type: parser.ACK, data: args }); diff --git a/package.json b/package.json index 8030524ae3..b8ca73e264 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,10 @@ "dependencies": { "debug": "2.3.3", "engine.io": "2.0.2", - "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "~1.1.0", "socket.io-client": "socketio/socket.io-client", - "socket.io-parser": "2.3.1" + "socket.io-parser": "~3.1.1" }, "devDependencies": { "babel-preset-es2015": "6.3.13", diff --git a/test/socket.io.js b/test/socket.io.js index c683e6230d..9632077524 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1730,8 +1730,10 @@ describe('socket.io', function(){ }); }); - it('should not crash when messing with Object prototype', function(done){ + it('should not crash when messing with Object prototype (and other globals)', function(done){ Object.prototype.foo = 'bar'; + global.File = ''; + global.Blob = []; var srv = http(); var sio = io(srv); srv.listen(function(){ From a086588747599764ffcfc5d7d0d1adabd4d4e2a9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 28 Apr 2017 22:33:40 +0200 Subject: [PATCH 246/494] =?UTF-8?q?[chore]=C2=A0Bump=20dependencies=20(#29?= =?UTF-8?q?26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 20 ++------------------ package.json | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e20340179..44ab05c343 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,28 +1,12 @@ sudo: false -before_install: - - npm install -g npm@'>=1.4.3' language: node_js node_js: - - "0.10" - - "0.12" - "4" - - "node" + - "6" + - "7" git: depth: 1 -matrix: - include: - - node_js: '0.10' - env: TEST_VERSION=compat - - node_js: '0.12' - env: TEST_VERSION=compat - - node_js: '4' - env: TEST_VERSION=compat -#matrix: - #fast_finish: true - #allow_failures: - #- node_js: "0.11" - notifications: irc: "irc.freenode.org#socket.io" diff --git a/package.json b/package.json index b8ca73e264..22a0857594 100644 --- a/package.json +++ b/package.json @@ -24,24 +24,24 @@ "test": "gulp test" }, "dependencies": { - "debug": "2.3.3", - "engine.io": "2.0.2", - "object-assign": "4.1.0", + "debug": "~2.6.6", + "engine.io": "~3.1.0", + "object-assign": "~4.1.1", "socket.io-adapter": "~1.1.0", "socket.io-client": "socketio/socket.io-client", "socket.io-parser": "~3.1.1" }, "devDependencies": { - "babel-preset-es2015": "6.3.13", - "del": "2.2.0", + "babel-preset-es2015": "^6.24.1", + "del": "^2.2.2", "expect.js": "0.3.1", - "gulp": "3.9.0", - "gulp-babel": "6.1.1", - "gulp-istanbul": "0.10.3", - "gulp-mocha": "2.2.0", + "gulp": "^3.9.1", + "gulp-babel": "^6.1.2", + "gulp-istanbul": "^1.1.1", + "gulp-mocha": "^4.3.1", "gulp-task-listing": "1.0.1", - "istanbul": "0.4.1", - "mocha": "2.3.4", + "istanbul": "^0.4.5", + "mocha": "^3.3.0", "superagent": "1.6.1", "supertest": "1.1.0" }, From 0d07c47f815e2174dcafac29441123682677313c Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Mon, 8 May 2017 15:46:47 -0400 Subject: [PATCH 247/494] [chore] Added backers and sponsors on the README (#2933) --- Readme.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/Readme.md b/Readme.md index 6c6d97caf9..af02246bb7 100644 --- a/Readme.md +++ b/Readme.md @@ -1,6 +1,7 @@ # socket.io +[![Backers on Open Collective](https://opencollective.com/socketio/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/socketio/sponsors/badge.svg)](#sponsors) [![Build Status](https://secure.travis-ci.org/socketio/socket.io.svg?branch=master)](https://travis-ci.org/socketio/socket.io) [![Dependency Status](https://david-dm.org/socketio/socket.io.svg)](https://david-dm.org/socketio/socket.io) [![devDependency Status](https://david-dm.org/socketio/socket.io/dev-status.svg)](https://david-dm.org/socketio/socket.io#info=devDependencies) @@ -163,6 +164,79 @@ Set the environmental variable `TEST_VERSION` to `compat` to test the transpiled The `gulp` task `test` will always transpile the source code into es5 and export to `dist` first before running the test. + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/socketio#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/socketio#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## License [MIT](LICENSE) From 1980fb4a0393e2154c045860ab8bbe0512ad2864 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 9 May 2017 00:45:17 +0200 Subject: [PATCH 248/494] =?UTF-8?q?[chore]=C2=A0Merge=20history=20of=201.7?= =?UTF-8?q?.x=20and=200.9.x=20branches=20(#2930)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/History.md b/History.md index 172a9a3153..ec85a0c5e8 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,19 @@ +1.7.4 / 2017-05-07 +=================== + + * [chore] Bump engine.io to version 1.8.4 + +0.9.18 / 2017-05-07 +=================== + + * Remove process.EventEmitter usage for Node 7.x + +1.7.3 / 2017-02-17 +=================== + + * [chore] Bump engine.io to version 1.8.3 + 1.7.2 / 2016-12-11 =================== From 6c0705f733d813cc5b9faedf5692b9cd10d58e21 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 9 May 2017 00:46:01 +0200 Subject: [PATCH 249/494] [docs] Add an example of custom parser (#2929) --- examples/custom-parsers/README.md | 50 +++++++ examples/custom-parsers/package.json | 21 +++ examples/custom-parsers/public/index.html | 13 ++ examples/custom-parsers/src/client1.js | 8 ++ examples/custom-parsers/src/client2.js | 11 ++ examples/custom-parsers/src/client3.js | 11 ++ examples/custom-parsers/src/client4.js | 11 ++ examples/custom-parsers/src/custom-parser.js | 125 ++++++++++++++++++ examples/custom-parsers/src/server.js | 55 ++++++++ .../custom-parsers/support/webpack.config.js | 15 +++ 10 files changed, 320 insertions(+) create mode 100644 examples/custom-parsers/README.md create mode 100644 examples/custom-parsers/package.json create mode 100644 examples/custom-parsers/public/index.html create mode 100644 examples/custom-parsers/src/client1.js create mode 100644 examples/custom-parsers/src/client2.js create mode 100644 examples/custom-parsers/src/client3.js create mode 100644 examples/custom-parsers/src/client4.js create mode 100644 examples/custom-parsers/src/custom-parser.js create mode 100644 examples/custom-parsers/src/server.js create mode 100644 examples/custom-parsers/support/webpack.config.js diff --git a/examples/custom-parsers/README.md b/examples/custom-parsers/README.md new file mode 100644 index 0000000000..be00e9f3b8 --- /dev/null +++ b/examples/custom-parsers/README.md @@ -0,0 +1,50 @@ + +# Socket.IO custom parsers + +Since Socket.IO version 2.0.0, you can provide your custom parser, according to the needs of your application. + +Several parsers are showcased here: + +- the default one: [socket.io-parser](https://github.com/socketio/socket.io-parser) +- one based on msgpack: [socket.io-msgpack-parser](https://github.com/darrachequesne/socket.io-msgpack-parser) +- one based on native JSON: [socket.io-json-parser](https://github.com/darrachequesne/socket.io-json-parser) +- a custom one based on [schemapack](https://github.com/phretaddin/schemapack) + +They are tested with various payloads: + +- string: `['1', '2', ... '1000']` +- numeric: `[1, 2, ... 1000]` +- binary: `new Buffer(1000), where buf[i] = i` + +## How to use + +``` +$ npm i && npm start +``` + +## Results + +| bytes / packet | CONNECT packet | string | numeric | binary | +|----------------|----------------|--------|---------|-----------| +| default | 1 | 5903 | 3904 | 43 + 1000 | +| msgpack | 20 | 3919 | 2646 | 1029 | +| JSON | 20 | 5930 | 3931 | 3625 | +| schemapack | 20 | 3895 | 2005 | 1005 | + +## Comparison + +`default parser` +- supports any serializable datastructure, including Blob and File +- **but** binary payload is encoded as 2 packets + +`msgpack` +- the size of payloads containing mostly numeric values will be greatly reduced +- **but** rely on [ArrayBuffer](https://caniuse.com/#feat=typedarrays) in the browser (IE > 9) + +`JSON` +- optimized +- **but** does not support binary payloads + +`schemapack` +- the most efficient in both speed and size +- **but** you have to provide a schema for each packet diff --git a/examples/custom-parsers/package.json b/examples/custom-parsers/package.json new file mode 100644 index 0000000000..be724174f3 --- /dev/null +++ b/examples/custom-parsers/package.json @@ -0,0 +1,21 @@ +{ + "name": "parsers", + "version": "1.0.0", + "description": "Various socket.io parsers", + "scripts": { + "build": "webpack --config ./support/webpack.config.js", + "start": "npm run build && node ./src/server.js" + }, + "author": "Damien Arrachequesne", + "license": "MIT", + "dependencies": { + "component-emitter": "^1.2.1", + "express": "^4.15.2", + "schemapack": "^1.4.2", + "socket.io": "socketio/socket.io", + "socket.io-client": "socketio/socket.io-client", + "socket.io-json-parser": "^1.0.0", + "socket.io-msgpack-parser": "^1.0.0", + "webpack": "^2.4.1" + } +} diff --git a/examples/custom-parsers/public/index.html b/examples/custom-parsers/public/index.html new file mode 100644 index 0000000000..a0cb336744 --- /dev/null +++ b/examples/custom-parsers/public/index.html @@ -0,0 +1,13 @@ + + + + + Socket.IO custom parsers + + + + + + + + diff --git a/examples/custom-parsers/src/client1.js b/examples/custom-parsers/src/client1.js new file mode 100644 index 0000000000..f73f775c64 --- /dev/null +++ b/examples/custom-parsers/src/client1.js @@ -0,0 +1,8 @@ + +const socket = require('socket.io-client')('localhost:3001', {}); + +socket.io.engine.on('data', (data) => console.log('[default]' + ' size= ' + (typeof data === 'string' ? data.length : data.byteLength))); + +socket.on('string', (data) => console.log('[default] [string]', data)); +socket.on('numeric', (data) => console.log('[default] [numeric]', data)); +socket.on('binary', (data) => console.log('[default] [binary]', data)); diff --git a/examples/custom-parsers/src/client2.js b/examples/custom-parsers/src/client2.js new file mode 100644 index 0000000000..a98af8b1d2 --- /dev/null +++ b/examples/custom-parsers/src/client2.js @@ -0,0 +1,11 @@ + +const customParser = require('socket.io-msgpack-parser'); +const socket = require('socket.io-client')('http://localhost:3002/', { + parser: customParser +}); + +socket.io.engine.on('data', (data) => console.log('[msgpack]' + ' size= ' + (typeof data === 'string' ? data.length : data.byteLength))); + +socket.on('string', (data) => console.log('[msgpack] [string]', data)); +socket.on('numeric', (data) => console.log('[msgpack] [numeric]', data)); +socket.on('binary', (data) => console.log('[msgpack] [binary]', data)); diff --git a/examples/custom-parsers/src/client3.js b/examples/custom-parsers/src/client3.js new file mode 100644 index 0000000000..9bfb6c68dd --- /dev/null +++ b/examples/custom-parsers/src/client3.js @@ -0,0 +1,11 @@ + +const customParser = require('socket.io-json-parser'); +const socket = require('socket.io-client')('localhost:3003', { + parser: customParser +}); + +socket.io.engine.on('data', (data) => console.log('[json]' + ' size= ' + (typeof data === 'string' ? data.length : data.byteLength))); + +socket.on('string', (data) => console.log('[json] [string]', data)); +socket.on('numeric', (data) => console.log('[json] [numeric]', data)); +socket.on('binary', (data) => console.log('[json] [binary]', data)); diff --git a/examples/custom-parsers/src/client4.js b/examples/custom-parsers/src/client4.js new file mode 100644 index 0000000000..b44168ac17 --- /dev/null +++ b/examples/custom-parsers/src/client4.js @@ -0,0 +1,11 @@ + +const customParser = require('./custom-parser'); +const socket = require('socket.io-client')('localhost:3004', { + parser: customParser +}); + +socket.io.engine.on('data', (data) => console.log('[custom]' + ' size= ' + (typeof data === 'string' ? data.length : data.byteLength))); + +socket.on('string', (data) => console.log('[custom] [string]', data)); +socket.on('numeric', (data) => console.log('[custom] [numeric]', data)); +socket.on('binary', (data) => console.log('[custom] [binary]', data)); diff --git a/examples/custom-parsers/src/custom-parser.js b/examples/custom-parsers/src/custom-parser.js new file mode 100644 index 0000000000..74c6b42ce6 --- /dev/null +++ b/examples/custom-parsers/src/custom-parser.js @@ -0,0 +1,125 @@ + +const Emitter = require('component-emitter'); +const schemapack = require('schemapack'); + +/** + * Packet types (see https://github.com/socketio/socket.io-protocol) + */ + +const TYPES = { + CONNECT: 0, + DISCONNECT: 1, + EVENT: 2, + ACK: 3, + ERROR: 4, + BINARY_EVENT: 5, + BINARY_ACK: 6 +}; + +const stringSchema = schemapack.build({ + _id: 'uint8', + data: [ 'string' ], + nsp: 'string' +}); + +const numericSchema = schemapack.build({ + _id: 'uint8', + data: [ 'uint16' ], + nsp: 'string' +}); + +const binarySchema = schemapack.build({ + _id: 'uint8', + data: 'buffer', + nsp: 'string' +}); + +const errorPacket = { + type: TYPES.ERROR, + data: 'parser error' +}; + +class Encoder { + encode (packet, callback) { + switch (packet.type) { + case TYPES.EVENT: + return callback([ this.pack(packet) ]); + default: + return callback([ JSON.stringify(packet) ]); + } + } + pack (packet) { + let eventName = packet.data[0]; + let flatPacket = { + data: packet.data[1], + nsp: packet.nsp + }; + switch (eventName) { + case 'string': + flatPacket._id = 1; + return stringSchema.encode(flatPacket); + case 'numeric': + flatPacket._id = 2; + return numericSchema.encode(flatPacket); + case 'binary': + flatPacket._id = 3; + return binarySchema.encode(flatPacket); + default: + throw new Error('unknown event name: ' + eventName); + } + } +} + +class Decoder extends Emitter { + add (obj) { + if (typeof obj === 'string') { + this.parseJSON(obj); + } else { + this.parseBinary(obj); + } + } + parseJSON (obj) { + try { + let decoded = JSON.parse(obj); + this.emit('decoded', decoded); + } catch (e) { + this.emit('decoded', errorPacket); + } + } + parseBinary (obj) { + let view = new Uint8Array(obj); + let packetId = view[0]; + try { + let packet = { + type: TYPES.EVENT + }; + let decoded; + switch (packetId) { + case 1: + decoded = stringSchema.decode(obj); + packet.data = [ 'string', decoded.data ]; + packet.nsp = decoded.nsp; + break; + case 2: + decoded = numericSchema.decode(obj); + packet.data = [ 'numeric', decoded.data ]; + packet.nsp = decoded.nsp; + break; + case 3: + decoded = binarySchema.decode(obj); + packet.data = [ 'binary', decoded.data.buffer ]; + packet.nsp = decoded.nsp; + break; + default: + throw new Error('unknown type'); + } + this.emit('decoded', packet); + } catch (e) { + this.emit('decoded', errorPacket); + } + } + destroy () {} +} + +exports.Encoder = Encoder; +exports.Decoder = Decoder; diff --git a/examples/custom-parsers/src/server.js b/examples/custom-parsers/src/server.js new file mode 100644 index 0000000000..3b20d1703d --- /dev/null +++ b/examples/custom-parsers/src/server.js @@ -0,0 +1,55 @@ + +const express = require('express'); +const app = express(); +const server = require('http').createServer(app); +const path = require('path'); +const port = process.env.PORT || 3000; + +app.use(express.static(path.join(__dirname, '../public'))); + +server.listen(port, () => console.log('>>> http://localhost:' + port)); + +const io = require('socket.io'); +const msgpackParser = require('socket.io-msgpack-parser'); +const jsonParser = require('socket.io-json-parser'); +const customParser = require('./custom-parser'); + +let server1 = io(3001, {}); +let server2 = io(3002, { + parser: msgpackParser +}); +let server3 = io(3003, { + parser: jsonParser +}); +let server4 = io(3004, { + parser: customParser +}); + +let string = []; +let numeric = []; +let binary = new Buffer(1e3); +for (var i = 0; i < 1e3; i++) { + string.push('' + i); + numeric.push(i); + binary[i] = i; +} + +server1.on('connect', onConnect(1000)); +server2.on('connect', onConnect(2000)); +server3.on('connect', onConnect(3000)); +server4.on('connect', onConnect(4000)); + +function onConnect (delay) { + return function (socket) { + console.log('connect ' + socket.id); + + setTimeout(() => { + socket.emit('string', string); + socket.emit('numeric', numeric); + socket.emit('binary', binary); + }, delay); + + socket.on('disconnect', () => console.log('disconnect ' + socket.id)); + }; +} + diff --git a/examples/custom-parsers/support/webpack.config.js b/examples/custom-parsers/support/webpack.config.js new file mode 100644 index 0000000000..34dcc13308 --- /dev/null +++ b/examples/custom-parsers/support/webpack.config.js @@ -0,0 +1,15 @@ + +const path = require('path'); + +module.exports = { + entry: { + client1: './src/client1.js', + client2: './src/client2.js', + client3: './src/client3.js', + client4: './src/client4.js' + }, + output: { + path: path.resolve(__dirname, '../public'), + filename: '[name].bundle.js' + } +}; From 3367eaa948a97f32f965da8d2cbe06fdc0b84818 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 9 May 2017 01:09:19 +0200 Subject: [PATCH 250/494] [chore] Release 2.0.0 --- History.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 ++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index ec85a0c5e8..300879aa23 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,53 @@ +2.0.0 / 2017-05-09 +=================== + + * [feat] Move binary detection to the parser (#2923) + * [feat] Allow to join several rooms at once (#2879) + * [feat] Merge Engine.IO and Socket.IO handshake packets (#2833) + * [feat] Allow the use of custom parsers (#2829) + + * [fix] Use path.resolve by default and require.resolve as a fallback (#2797) + * [fix] Properly close the connection on error (#2681) + * [fix] Prevent null from being accepted as argument (#2606) + + * [perf] Use shared instance of the encoder (#2825) + * [perf] Reset properties instead of deleting them (#2826) + * [perf] micro-optimisations (#2793) + + * [chore] Merge history of 1.7.x and 0.9.x branches (#2930) + * [chore] Added backers and sponsors on the README (#2933) + * [chore] Bump dependencies (#2926) + * [chore] Bump socket.io-adapter to version 1.0.0 (#2867) + * [chore] Bump engine.io to version 2.0.2 (#2864) + * [chore] Bump engine.io to version 2.0.0 (#2832) + * [chore] Update issue template with fiddle (#2811) + * [chore] Update copyright year LICENSE to 2017 (#2803) + + * [docs] Add an example of custom parser (#2929) + * [docs] Replace non-breaking space with proper whitespace (#2913) + * [docs] Update emit cheatsheet (#2906) + * [docs] Explicitly document that Server extends EventEmitter (#2874) + * [docs] Add server.engine.generateId attribute (#2880) + * [docs] Fix wrong space character in README (#2900) + * [docs] Fix documentation for 'connect' event (#2898) + * [docs] Add webpack build example (#2828) + * [docs] Update the wording to match the code example (#2853) + * [docs] Small addition to the Express Readme Part (#2846) + * [docs] Add a 'Features' section in the README (#2824) + * [docs] Add httpd cluster example (#2819) + * [docs] Add haproxy cluster example (#2818) + * [docs] Add nginx cluster example (#2817) + * [docs] Implement whiteboard example (#2810) + * [docs] Fix documentation for `local` flag (#2816) + * [docs] Add emit cheatsheet (#2815) + * [docs] Add pingInterval/pingTimeout/transports options in the API documentation (#2814) + * [docs] Add an example for socket.join() method (#2813) + * [docs] Fix a typo on `clients` method in the API documentation (#2812) + * [docs] Fix wrong argument name in API.md (#2802) + * [docs] Add install script on Readme.md (#2780) + * [docs] API documentation (#2784) + 1.7.4 / 2017-05-07 =================== diff --git a/package.json b/package.json index 22a0857594..6ecc9cfd6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "1.7.2", + "version": "2.0.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.1.0", "object-assign": "~4.1.1", "socket.io-adapter": "~1.1.0", - "socket.io-client": "socketio/socket.io-client", + "socket.io-client": "2.0.0", "socket.io-parser": "~3.1.1" }, "devDependencies": { From a0056904c1094008fda69ba99d395c7842f227dc Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 9 May 2017 01:36:40 +0200 Subject: [PATCH 251/494] =?UTF-8?q?[fix]=C2=A0Update=20path=20of=20client?= =?UTF-8?q?=20file=20(#2934)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 9f73d5faf8..3a574ee9b5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -109,7 +109,7 @@ Server.prototype.serveClient = function(v){ return require.resolve(file); }; if (v && !clientSource) { - clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.min.js'), 'utf-8'); + clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.js'), 'utf-8'); try { clientSourceMap = read(resolvePath( 'socket.io-client/dist/socket.io.js.map'), 'utf-8'); } catch(err) { @@ -323,7 +323,6 @@ Server.prototype.serve = function(req, res){ debug('serve client source'); res.setHeader('Content-Type', 'application/javascript'); res.setHeader('ETag', expectedEtag); - res.setHeader('X-SourceMap', 'socket.io.js.map'); res.writeHead(200); res.end(clientSource); }; From 832b8fc6d98cce5843663cded3de8f63ab4ecd02 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 9 May 2017 01:40:46 +0200 Subject: [PATCH 252/494] [chore] Release 2.0.1 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 300879aa23..78ced3e9e7 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.0.1 / 2017-05-09 +=================== + + * [fix] Update path of client file (#2934) + 2.0.0 / 2017-05-09 =================== diff --git a/package.json b/package.json index 6ecc9cfd6c..816daa828d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.0.0", + "version": "2.0.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.1.0", "object-assign": "~4.1.1", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.0.0", + "socket.io-client": "2.0.1", "socket.io-parser": "~3.1.1" }, "devDependencies": { From 2b216902e121ac2205444019b6d9316654809b29 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 22 May 2017 13:01:59 +0200 Subject: [PATCH 253/494] [fix] Fix timing issues with middleware (#2948) Using a middleware could previously lead to a connecting client receiving a connect event from the server before the server triggers its own connect event. --- lib/namespace.js | 2 ++ lib/socket.js | 7 ++++--- test/socket.io.js | 29 +++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 5dc7b4db7c..69d07c5c88 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -99,6 +99,8 @@ Namespace.prototype.initAdapter = function(){ */ Namespace.prototype.use = function(fn){ + debug('removing initial packet'); + delete this.server.eio.initialPacket; this.fns.push(fn); return this; }; diff --git a/lib/socket.js b/lib/socket.js index bb4a015330..fdb99b120a 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -297,9 +297,10 @@ Socket.prototype.onconnect = function(){ debug('socket connected - writing packet'); this.nsp.connected[this.id] = this; this.join(this.id); - // the CONNECT packet for the default namespace - // has already been sent as an `initialPacket` - if (this.nsp.name !== '/') { + var skip = this.nsp.name === '/' && this.nsp.fns.length === 0; + if (skip) { + debug('packet already sent in initial handshake'); + } else { this.packet({ type: parser.CONNECT }); } }; diff --git a/test/socket.io.js b/test/socket.io.js index 9632077524..84a252b5fa 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -87,6 +87,9 @@ describe('socket.io', function(){ srv.set('authorization', function(o, f) { f(null, false); }); var socket = client(httpSrv); + socket.on('connect', function(){ + expect().fail(); + }); socket.on('error', function(err) { expect(err).to.be('Not authorized'); done(); @@ -2145,6 +2148,9 @@ describe('socket.io', function(){ }); srv.listen(function(){ var socket = client(srv); + socket.on('connect', function(){ + done(new Error('nope')); + }); socket.on('error', function(err){ expect(err).to.be('Authentication error'); done(); @@ -2163,6 +2169,9 @@ describe('socket.io', function(){ }); srv.listen(function(){ var socket = client(srv); + socket.on('connect', function(){ + done(new Error('nope')); + }); socket.on('error', function(err){ expect(err).to.eql({ a: 'b', c: 3 }); done(); @@ -2186,6 +2195,26 @@ describe('socket.io', function(){ }); }); + it('should only call connection after (lengthy) fns', function(done){ + var srv = http(); + var sio = io(srv); + var authenticated = false; + + sio.use(function(socket, next){ + setTimeout(function () { + authenticated = true; + next(); + }, 300); + }); + srv.listen(function(){ + var socket = client(srv); + socket.on('connect', function(){ + expect(authenticated).to.be(true); + done(); + }); + }); + }); + it('should be ignored if socket gets closed', function(done){ var srv = http(); var sio = io(srv); From a10dc8d92d37977ae68b6472e8c1b550956dd4d1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 1 Jun 2017 14:01:24 +0200 Subject: [PATCH 254/494] [chore] Release 2.0.2 --- History.md | 5 +++++ package.json | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/History.md b/History.md index 78ced3e9e7..369d809f76 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.0.2 / 2017-06-01 +=================== + + * [fix] Fix timing issues with middleware (#2948) + 2.0.1 / 2017-05-09 =================== diff --git a/package.json b/package.json index 816daa828d..0c09321d66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.0.1", + "version": "2.0.2", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.1.0", "object-assign": "~4.1.1", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.0.1", + "socket.io-client": "~2.0.2", "socket.io-parser": "~3.1.1" }, "devDependencies": { From 2b10f1b3a44a06371eed398bf9011081d2495420 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 3 Jun 2017 13:53:03 +0200 Subject: [PATCH 255/494] [docs] Update webpack example (#2960) --- examples/webpack-build/lib/index.js | 4 ++- examples/webpack-build/package.json | 8 +++-- .../webpack-build/support/webpack.config.js | 4 +-- .../support/webpack.config.json-parser.js | 33 +++++++++++++++++++ .../support/webpack.config.slim.js | 6 +--- lib/index.js | 3 +- 6 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 examples/webpack-build/support/webpack.config.json-parser.js diff --git a/examples/webpack-build/lib/index.js b/examples/webpack-build/lib/index.js index 82af605bf3..b288a0be96 100644 --- a/examples/webpack-build/lib/index.js +++ b/examples/webpack-build/lib/index.js @@ -1,5 +1,7 @@ -var socket = require('socket.io-client')('http://localhost:3000/'); +import io from 'socket.io-client'; + +const socket = io('http://localhost:3000/'); console.log('init'); diff --git a/examples/webpack-build/package.json b/examples/webpack-build/package.json index 0c04d0b546..19fb136177 100644 --- a/examples/webpack-build/package.json +++ b/examples/webpack-build/package.json @@ -5,15 +5,17 @@ "scripts": { "build": "webpack --config ./support/webpack.config.js", "build-slim": "webpack --config ./support/webpack.config.slim.js", - "build-all": "npm run build && npm run build-slim" + "build-json-parser": "webpack --config ./support/webpack.config.json-parser.js", + "build-all": "npm run build && npm run build-slim && npm run build-json-parser" }, "author": "Damien Arrachequesne", "license": "MIT", "dependencies": { - "socket.io-client": "^1.7.2" + "socket.io-client": "^2.0.2", + "socket.io-json-parser": "^2.1.0" }, "devDependencies": { "strip-loader": "^0.1.2", - "webpack": "^1.14.0" + "webpack": "^2.6.1" } } diff --git a/examples/webpack-build/support/webpack.config.js b/examples/webpack-build/support/webpack.config.js index 8b5bd4b7cd..63de64bcac 100644 --- a/examples/webpack-build/support/webpack.config.js +++ b/examples/webpack-build/support/webpack.config.js @@ -2,7 +2,7 @@ module.exports = { entry: './lib/index.js', output: { - path: './dist', + path: require('path').join(__dirname, '../dist'), filename: 'app.js' - }, + } }; diff --git a/examples/webpack-build/support/webpack.config.json-parser.js b/examples/webpack-build/support/webpack.config.json-parser.js new file mode 100644 index 0000000000..fce52ea70a --- /dev/null +++ b/examples/webpack-build/support/webpack.config.json-parser.js @@ -0,0 +1,33 @@ + +var webpack = require('webpack'); + +module.exports = { + entry: './lib/index.js', + output: { + path: require('path').join(__dirname, '../dist'), + filename: 'app.json-parser.js' + }, + // generate sourcemap + devtool: 'source-map', + plugins: [ + // replace require('debug')() with an noop function + new webpack.NormalModuleReplacementPlugin(/debug/, process.cwd() + '/support/noop.js'), + // replace socket.io-parser with socket.io-json-parser + new webpack.NormalModuleReplacementPlugin(/socket\.io-parser/, 'socket.io-json-parser'), + // use uglifyJS (IE9+ support) + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + } + }) + ], + module: { + loaders: [ + { + // strip `debug()` calls + test: /\.js$/, + loader: 'strip-loader?strip[]=debug' + } + ] + } +}; diff --git a/examples/webpack-build/support/webpack.config.slim.js b/examples/webpack-build/support/webpack.config.slim.js index cc2a38fc98..d8b24160df 100644 --- a/examples/webpack-build/support/webpack.config.slim.js +++ b/examples/webpack-build/support/webpack.config.slim.js @@ -4,13 +4,9 @@ var webpack = require('webpack'); module.exports = { entry: './lib/index.js', output: { - path: './dist', + path: require('path').join(__dirname, '../dist'), filename: 'app.slim.js' }, - externals: { - // replace JSON polyfill (IE6/IE7) with global JSON object - json3: 'JSON' - }, // generate sourcemap devtool: 'source-map', plugins: [ diff --git a/lib/index.js b/lib/index.js index 3a574ee9b5..29485b73fc 100644 --- a/lib/index.js +++ b/lib/index.js @@ -8,8 +8,7 @@ var read = require('fs').readFileSync; var path = require('path'); var exists = require('fs').existsSync; var engine = require('engine.io'); -var client = require('socket.io-client'); -var clientVersion = require('socket.io-client/package').version; +var clientVersion = require('socket.io-client/package.json').version; var Client = require('./client'); var Emitter = require('events').EventEmitter; var Namespace = require('./namespace'); From 9a014e2df413ea8374f29eec993fe162bd6a73e7 Mon Sep 17 00:00:00 2001 From: Ra'Shaun Stovall Date: Thu, 8 Jun 2017 06:28:56 -0400 Subject: [PATCH 256/494] [docs] Update slack badge (#2961) Update badge to https://slackin-socketio.now.sh/badge.svg --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index af02246bb7..5df48abac8 100644 --- a/Readme.md +++ b/Readme.md @@ -7,7 +7,7 @@ [![devDependency Status](https://david-dm.org/socketio/socket.io/dev-status.svg)](https://david-dm.org/socketio/socket.io#info=devDependencies) [![NPM version](https://badge.fury.io/js/socket.io.svg)](https://www.npmjs.com/package/socket.io) ![Downloads](https://img.shields.io/npm/dm/socket.io.svg?style=flat) -[![](http://slack.socket.io/badge.svg?)](http://slack.socket.io) +[![](https://slackin-socketio.now.sh/badge.svg)](https://slackin-socketio.now.sh) ## Features From 94df7bcdfd5696c63aff496d850ff0305b019e67 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Jun 2017 14:00:48 +0200 Subject: [PATCH 257/494] [fix] Fix middleware initialization (#2969) Fix "TypeError: Cannot convert undefined or null to object" when a middleware is added before the engine is properly attached. --- lib/index.js | 38 ++++++++++++++++++++++++++------------ lib/namespace.js | 6 ++++-- test/socket.io.js | 13 +++++++++++++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/index.js b/lib/index.js index 29485b73fc..e16133ae4c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -244,29 +244,43 @@ Server.prototype.attach = function(srv, opts){ // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - var self = this; + if (this.sockets.fns.length > 0) { + this.initEngine(srv, opts); + return this; + } + var self = this; var connectPacket = { type: parser.CONNECT, nsp: '/' }; this.encoder.encode(connectPacket, function (encodedPacket){ // the CONNECT packet will be merged with Engine.IO handshake, // to reduce the number of round trips opts.initialPacket = encodedPacket; - // initialize engine - debug('creating engine.io instance with opts %j', opts); - self.eio = engine.attach(srv, opts); + self.initEngine(srv, opts); + }); + return this; +}; + +/** + * Initialize engine + * + * @param {Object} options passed to engine.io + * @api private + */ - // attach static file serving - if (self._serveClient) self.attachServe(srv); +Server.prototype.initEngine = function(srv, opts){ + // initialize engine + debug('creating engine.io instance with opts %j', opts); + this.eio = engine.attach(srv, opts); - // Export http server - self.httpServer = srv; + // attach static file serving + if (this._serveClient) this.attachServe(srv); - // bind to engine events - self.bind(self.eio); - }); + // Export http server + this.httpServer = srv; - return this; + // bind to engine events + this.bind(this.eio); }; /** diff --git a/lib/namespace.js b/lib/namespace.js index 69d07c5c88..3c6b65ca4d 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -99,8 +99,10 @@ Namespace.prototype.initAdapter = function(){ */ Namespace.prototype.use = function(fn){ - debug('removing initial packet'); - delete this.server.eio.initialPacket; + if (this.server.eio) { + debug('removing initial packet'); + delete this.server.eio.initialPacket; + } this.fns.push(fn); return this; }; diff --git a/test/socket.io.js b/test/socket.io.js index 84a252b5fa..bd2e65d2ad 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2268,6 +2268,19 @@ describe('socket.io', function(){ }); }); }); + + it('should disable the merge of handshake packets', function(done){ + var srv = http(); + var sio = io(); + sio.use(function(socket, next){ + next(); + }); + sio.listen(srv); + var socket = client(srv); + socket.on('connect', function(){ + done(); + }); + }); }); describe('socket middleware', function(done){ From db0c69969e70306f42e853be6796cf019f8c2bdd Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Jun 2017 14:01:35 +0200 Subject: [PATCH 258/494] [fix] Reset rooms object before broadcasting (#2970) It seems packets could be delivered to wrong room in some case, if the _rooms array was not reset before the next emit. --- lib/socket.js | 58 +++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/lib/socket.js b/lib/socket.js index fdb99b120a..a907bf3381 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -139,38 +139,42 @@ Socket.prototype.buildHandshake = function(query){ Socket.prototype.emit = function(ev){ if (~exports.events.indexOf(ev)) { emit.apply(this, arguments); - } else { - var args = Array.prototype.slice.call(arguments); - var packet = { - type: parser.EVENT, - data: args - }; - - // access last argument to see if it's an ACK callback - if (typeof args[args.length - 1] === 'function') { - if (this._rooms.length || this.flags.broadcast) { - throw new Error('Callbacks are not supported when broadcasting'); - } + return this; + } - debug('emitting packet with ack id %d', this.nsp.ids); - this.acks[this.nsp.ids] = args.pop(); - packet.id = this.nsp.ids++; - } + var args = Array.prototype.slice.call(arguments); + var packet = { + type: parser.EVENT, + data: args + }; + // access last argument to see if it's an ACK callback + if (typeof args[args.length - 1] === 'function') { if (this._rooms.length || this.flags.broadcast) { - this.adapter.broadcast(packet, { - except: [this.id], - rooms: this._rooms, - flags: this.flags - }); - } else { - // dispatch packet - this.packet(packet, this.flags); + throw new Error('Callbacks are not supported when broadcasting'); } - // reset flags - this._rooms = []; - this.flags = {}; + debug('emitting packet with ack id %d', this.nsp.ids); + this.acks[this.nsp.ids] = args.pop(); + packet.id = this.nsp.ids++; + } + + var rooms = this._rooms.slice(0); + var flags = assign({}, this.flags); + + // reset flags + this._rooms = []; + this.flags = {}; + + if (rooms.length || flags.broadcast) { + this.adapter.broadcast(packet, { + except: [this.id], + rooms: rooms, + flags: flags + }); + } else { + // dispatch packet + this.packet(packet, flags); } return this; }; From 65ece01135e1a3a4b517ed5c599eb5a7a3401f1a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Jun 2017 14:05:46 +0200 Subject: [PATCH 259/494] [chore] Release 2.0.3 --- History.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 369d809f76..e750230464 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,12 @@ +2.0.3 / 2017-06-12 +=================== + + * [fix] Reset rooms object before broadcasting (#2970) + * [fix] Fix middleware initialization (#2969) + * [docs] Update slack badge (#2961) + * [docs] Update webpack example (#2960) + 2.0.2 / 2017-06-01 =================== diff --git a/package.json b/package.json index 0c09321d66..50dc91fe9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.0.2", + "version": "2.0.3", "description": "node.js realtime framework server", "keywords": [ "realtime", From 410f5bcb8e89981824da0034b64fb6cfbf2f6974 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 13 Jun 2017 23:05:26 +0200 Subject: [PATCH 260/494] [docs] Update API documentation (#2973) --- docs/API.md | 310 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 261 insertions(+), 49 deletions(-) diff --git a/docs/API.md b/docs/API.md index 749656f421..d357443e10 100644 --- a/docs/API.md +++ b/docs/API.md @@ -23,6 +23,9 @@ - [Class: Namespace](#namespace) - [namespace.name](#namespacename) - [namespace.connected](#namespaceconnected) + - [namespace.adapter](#namespaceadapter) + - [namespace.to(room)](#namespacetoroom) + - [namespace.in(room)](#namespaceinroom) - [namespace.emit(eventName[, ...args])](#namespaceemiteventname-args) - [namespace.clients(callback)](#namespaceclientscallback) - [namespace.use(fn)](#namespaceusefn) @@ -36,6 +39,7 @@ - [socket.client](#socketclient) - [socket.conn](#socketconn) - [socket.request](#socketrequest) + - [socket.handshake](#sockethandshake) - [socket.use(fn)](#socketusefn) - [socket.send([...args][, ack])](#socketsendargs-ack) - [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack) @@ -73,16 +77,15 @@ Exposed by `require('socket.io')`. - `serveClient` _(Boolean)_: whether to serve the client files (`true`) - `adapter` _(Adapter)_: the adapter to use. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter) - `origins` _(String)_: the allowed origins (`*`) - - `allowRequest` _(Function)_: A function that receives a given handshake or upgrade request as its first parameter, and can decide whether to continue or not. The second argument is a function that needs to be called with the decided information: `fn(err, success)`, where `success` is a boolean value where false means that the request is rejected, and err is an error code. - `parser` _(Parser)_: the parser to use. Defaults to an instance of the `Parser` that ships with socket.io. See [socket.io-parser](https://github.com/socketio/socket.io-parser). Works with and without `new`: ```js -var io = require('socket.io')(); +const io = require('socket.io')(); // or -var Server = require('socket.io'); -var io = new Server(); +const Server = require('socket.io'); +const io = new Server(); ``` The same options passed to socket.io are always passed to the `engine.io` `Server` that gets created. See engine.io [options](https://github.com/socketio/engine.io#methods-1) as reference. @@ -98,6 +101,21 @@ Those two parameters will impact the delay before a client knows the server is n **Note:** The order is important. By default, a long-polling connection is established first, and then upgraded to WebSocket if possible. Using `['websocket']` means there will be no fallback if a WebSocket connection cannot be opened. +```js +const server = require('http').createServer(); + +const io = require('socket.io')(server, { + path: '/test', + serveClient: false, + // below are engine.IO options + pingInterval: 10000, + pingTimeout: 5000, + cookie: false +}); + +server.listen(3000); +``` + #### new Server(port[, options]) - `port` _(Number)_ a port to listen to (a new `http.Server` will be created) @@ -105,12 +123,50 @@ Those two parameters will impact the delay before a client knows the server is n See [above](#new-serverhttpserver-options) for available options. +```js +const server = require('http').createServer(); + +const io = require('socket.io')(3000, { + path: '/test', + serveClient: false, + // below are engine.IO options + pingInterval: 10000, + pingTimeout: 5000, + cookie: false +}); +``` + #### new Server(options) - `options` _(Object)_ See [above](#new-serverhttpserver-options) for available options. +```js +const io = require('socket.io')({ + path: '/test', + serveClient: false, +}); + +// either +const server = require('http').createServer(); + +io.attach(server, { + pingInterval: 10000, + pingTimeout: 5000, + cookie: false +}); + +server.listen(3000); + +// or +io.attach(3000, { + pingInterval: 10000, + pingTimeout: 5000, + cookie: false +}); +``` + #### server.sockets * _(Namespace)_ @@ -126,10 +182,10 @@ If `value` is `true` the attached server (see `Server#attach`) will serve the cl ```js // pass a server and the `serveClient` option -var io = require('socket.io')(http, { serveClient: false }); +const io = require('socket.io')(http, { serveClient: false }); // or pass no server and then you can call the method -var io = require('socket.io')(); +const io = require('socket.io')(); io.serveClient(false); io.attach(http); ``` @@ -141,6 +197,16 @@ io.attach(http); Sets the path `value` under which `engine.io` and the static files will be served. Defaults to `/socket.io`. If no arguments are supplied this method returns the current value. +```js +const io = require('socket.io')(); +io.path('/myownpath'); + +// client-side +const socket = io({ + path: '/myownpath' +}); +``` + #### server.adapter([value]) - `value` _(Adapter)_ @@ -148,6 +214,12 @@ Sets the path `value` under which `engine.io` and the static files will be serve Sets the adapter `value`. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter). If no arguments are supplied this method returns the current value. +```js +const io = require('socket.io')(3000); +const redis = require('socket.io-redis'); +io.adapter(redis({ host: 'localhost', port: 6379 })); +``` + #### server.origins([value]) - `value` _(String)_ @@ -155,6 +227,10 @@ Sets the adapter `value`. Defaults to an instance of the `Adapter` that ships wi Sets the allowed origins `value`. Defaults to any origins being allowed. If no arguments are supplied this method returns the current value. +```js +io.origins(['foo.example.com:443']); +``` + #### server.origins(fn) - `fn` _(Function)_ @@ -167,6 +243,15 @@ __Potential drawbacks__: * As this function will be executed for every request, it is advised to make this function work as fast as possible * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors). +```js +io.origins((origin, callback) => { + if (origin !== 'https://foo.example.com/') { + return callback('origin not allowed', false); + } + callback(null, true); +}); +``` + #### server.attach(httpServer[, options]) - `httpServer` _(http.Server)_ the server to attach to @@ -174,7 +259,7 @@ __Potential drawbacks__: Attaches the `Server` to an engine.io instance on `httpServer` with the supplied `options` (optionally). -### server.attach(port[, options]) +#### server.attach(port[, options]) - `port` _(Number)_ the port to listen on - `options` _(Object)_ @@ -210,6 +295,10 @@ Advanced use only. Creates a new `socket.io` client from the incoming engine.io Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. If the namespace was already initialized it returns it immediately. +```js +const adminNamespace = io.of('/admin'); +``` + #### server.close([callback]) - `callback` _(Function)_ @@ -217,11 +306,11 @@ Initializes and retrieves the given `Namespace` by its pathname identifier `nsp` Closes the socket.io server. The `callback` argument is optional and will be called when all connections are closed. ```js -var Server = require('socket.io'); -var PORT = 3030; -var server = require('http').Server(); +const Server = require('socket.io'); +const PORT = 3030; +const server = require('http').Server(); -var io = Server(PORT); +const io = Server(PORT); io.close(); // Close current server @@ -237,7 +326,7 @@ Overwrites the default method to generate your custom socket id. The function is called with a node request object (`http.IncomingMessage`) as first parameter. ```js -io.engine.generateId = function (req) { +io.engine.generateId = (req) => { return "custom:id:" + custom_id++; // custom id must be unique } ``` @@ -247,7 +336,7 @@ io.engine.generateId = function (req) { Represents a pool of sockets connected under a given scope identified by a pathname (eg: `/chat`). -By default the client always connects to `/`. +A client always connects to `/` (the main namespace), then potentially connect to other namespaces (while using the same underlying connection). #### namespace.name @@ -261,6 +350,34 @@ The namespace identifier property. The hash of `Socket` objects that are connected to this namespace, indexed by `id`. +#### namespace.adapter + + * _(Adapter)_ + +The `Adapter` used for the namespace. Useful when using the `Adapter` based on [Redis](https://github.com/socketio/socket.io-redis), as it exposes methods to manage sockets and rooms accross your cluster. + +**Note:** the adapter of the main namespace can be accessed with `io.of('/').adapter`. + +#### namespace.to(room) + + - `room` _(String)_ + - **Returns** `Namespace` for chaining + +Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room`. + +To emit to multiple rooms, you can call `to` several times. + +```js +const io = require('socket.io')(); +const adminNamespace = io.of('/admin'); + +adminNamespace.to('level1').emit('an event', { some: 'data' }); +``` + +#### namespace.in(room) + +Synonym of [namespace.to(room)](#namespacetoroom). + #### namespace.emit(eventName[, ...args]) - `eventName` _(String)_ @@ -269,14 +386,15 @@ The hash of `Socket` objects that are connected to this namespace, indexed by `i Emits an event to all connected clients. The following two are equivalent: ```js -var io = require('socket.io')(); - +const io = require('socket.io')(); io.emit('an event sent to all connected clients'); // main namespace -var chat = io.of('/chat'); +const chat = io.of('/chat'); chat.emit('an event sent to all connected clients in chat namespace'); ``` +**Note:** acknowledgements are not supported when emitting from namespace. + #### namespace.clients(callback) - `callback` _(Function)_ @@ -284,8 +402,8 @@ chat.emit('an event sent to all connected clients in chat namespace'); Gets a list of client IDs connected to this namespace (across all nodes if applicable). ```js -var io = require('socket.io')(); -io.of('/chat').clients(function(error, clients){ +const io = require('socket.io')(); +io.of('/chat').clients((error, clients) => { if (error) throw error; console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD] }); @@ -294,8 +412,7 @@ io.of('/chat').clients(function(error, clients){ An example to get all clients in namespace's room: ```js -var io = require('socket.io')(); -io.of('/chat').in('general').clients(function(error, clients){ +io.of('/chat').in('general').clients((error, clients) => { if (error) throw error; console.log(clients); // => [Anw2LatarvGVVXEIAAAD] }); @@ -304,8 +421,7 @@ io.of('/chat').in('general').clients(function(error, clients){ As with broadcasting, the default is all clients from the default namespace ('/'): ```js -var io = require('socket.io')(); -io.clients(function(error, clients){ +io.clients((error, clients) => { if (error) throw error; console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB] }); @@ -320,8 +436,7 @@ Registers a middleware, which is a function that gets executed for every incomin Errors passed to middleware callbacks are sent as special `error` packets to clients. ```js -var io = require('socket.io')(); -io.use(function(socket, next){ +io.use((socket, next) => { if (socket.request.headers.cookie) return next(); next(new Error('Authentication error')); }); @@ -333,6 +448,16 @@ io.use(function(socket, next){ Fired upon a connection from client. +```js +io.on('connect', (socket) => { + // ... +}); + +io.of('/admin').on('connect', (socket) => { + // ... +}); +``` + #### Event: 'connection' Synonym of [Event: 'connect'](#event-connect). @@ -375,6 +500,15 @@ A unique identifier for the session, that comes from the underlying `Client`. A hash of strings identifying the rooms this client is in, indexed by room name. +```js +io.on('connection', (socket) => { + socket.join('room 237', () => { + let rooms = Objects.keys(socket.rooms); + console.log(rooms); // [ , 'room 237' ] + }); +}); +``` + #### socket.client * _(Client)_ @@ -393,6 +527,39 @@ A reference to the underlying `Client` transport connection (engine.io `Socket` A getter proxy that returns the reference to the `request` that originated the underlying engine.io `Client`. Useful for accessing request headers such as `Cookie` or `User-Agent`. +#### socket.handshake + + * _(Object)_ + +The handshake details: + +```js +{ + headers: /* the headers sent as part of the handshake */, + time: /* the date of creation (as string) */, + address: /* the ip of the client */, + xdomain: /* whether the connection is cross-domain */, + secure: /* whether the connection is secure */, + issued: /* the date of creation (as unix timestamp) */, + url: /* the request URL string */, + query: /* the query object */ +} +``` + +Usage: + +```js +io.use((socket, next) => { + let handshake = socket.handshake; + // ... +}); + +io.on('connection', (socket) => { + let handshake = socket.handshake; + // ... +}); +``` + #### socket.use(fn) - `fn` _(Function)_ @@ -402,9 +569,8 @@ Registers a middleware, which is a function that gets executed for every incomin Errors passed to middleware callbacks are sent as special `error` packets to clients. ```js -var io = require('socket.io')(); -io.on('connection', function(socket){ - socket.use(function(packet, next){ +io.on('connection', (socket) => { + socket.use((packet, next) => { if (packet.doge === true) return next(); next(new Error('Not a doge error')); }); @@ -437,16 +603,15 @@ socket.emit('with-binary', 1, '2', { 3: '4', 5: new Buffer(6) }); The `ack` argument is optional and will be called with the client's answer. ```js -var io = require('socket.io')(); -io.on('connection', function(client){ - client.emit('an event', { some: 'data' }); +io.on('connection', (socket) => { + socket.emit('an event', { some: 'data' }); - client.emit('ferret', 'tobi', function (data) { + socket.emit('ferret', 'tobi', (data) => { console.log(data); // data will be 'woot' }); // the client code - // client.on('ferret', function (name, fn) { + // client.on('ferret', (name, fn) => { // fn('woot'); // }); @@ -463,9 +628,17 @@ io.on('connection', function(client){ Register a new handler for the given event. ```js -socket.on('news', function (data) { +socket.on('news', (data) => { console.log(data); }); +// with several arguments +socket.on('news', (arg1, arg2, arg3) => { + // ... +}); +// or with acknowledgement +socket.on('news', (data, callback) => { + callback(0); +}); ``` #### socket.once(eventName, listener) @@ -484,9 +657,10 @@ Inherited from `EventEmitter` (along with other methods not mentioned here). See Adds the client to the `room`, and fires optionally a callback with `err` signature (if any). ```js -io.on('connection', function(socket){ - socket.join('room 237', function(){ - console.log(socket.rooms); // [ , 'room 237' ] +io.on('connection', (socket) => { + socket.join('room 237', () => { + let rooms = Objects.keys(socket.rooms); + console.log(rooms); // [ , 'room 237' ] io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room }); }); @@ -494,13 +668,13 @@ io.on('connection', function(socket){ The mechanics of joining rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to [socket.io-adapter](https://github.com/socketio/socket.io-adapter). -For your convenience, each socket automatically joins a room identified by this id (see `Socket#id`). This makes it easy to broadcast messages to other sockets: +For your convenience, each socket automatically joins a room identified by its id (see `Socket#id`). This makes it easy to broadcast messages to other sockets: ```js -io.on('connection', function(client){ - client.on('say to someone', function(id, msg){ +io.on('connection', (socket) => { + socket.on('say to someone', (id, msg) => { // send a private message to the socket with the given id - client.broadcast.to(id).emit('my message', msg); + socket.to(id).emit('my message', msg); }); }); ``` @@ -528,20 +702,23 @@ Removes the client from `room`, and fires optionally a callback with `err` signa - `room` _(String)_ - **Returns** `Socket` for chaining -Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room`. +Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room` (the socket itself being excluded). To emit to multiple rooms, you can call `to` several times. ```js -var io = require('socket.io')(); -io.on('connection', function(client){ +io.on('connection', (socket) => { // to one room - client.to('others').emit('an event', { some: 'data' }); + socket.to('others').emit('an event', { some: 'data' }); // to multiple rooms - client.to('room1').to('room2').emit('hello'); + socket.to('room1').to('room2').emit('hello'); + // a private message to another socket + socket.to(/* another socket id */).emit('hey'); }); ``` +**Note:** acknowledgements are not supported when broadcasting. + #### socket.in(room) Synonym of [socket.to(room)](#sockettoroom). @@ -553,6 +730,12 @@ Synonym of [socket.to(room)](#sockettoroom). Sets a modifier for a subsequent event emission that the event data will only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method. +```js +io.on('connection', (socket) => { + socket.compress(false).emit('uncompressed', "that's rough"); +}); +``` + #### socket.disconnect(close) - `close` _(Boolean)_ whether to close the underlying connection @@ -560,13 +743,18 @@ Sets a modifier for a subsequent event emission that the event data will only be Disconnects this client. If value of close is `true`, closes the underlying connection. Otherwise, it just disconnects the namespace. +```js +io.on('connection', (socket) => { + setTimeout(() => socket.disconnect(true), 5000); +}); +``` + #### Flag: 'broadcast' Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to every sockets but the sender. ```js -var io = require('socket.io')(); -io.on('connection', function(socket){ +io.on('connection', (socket) => { socket.broadcast.emit('an event', { some: 'data' }); // everyone gets it but the sender }); ``` @@ -576,8 +764,7 @@ io.on('connection', function(socket){ Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to receive messages (because of network slowness or other issues, or because they’re connected through long polling and is in the middle of a request-response cycle). ```js -var io = require('socket.io')(); -io.on('connection', function(socket){ +io.on('connection', (socket) => { socket.volatile.emit('an event', { some: 'data' }); // the client may or may not receive it }); ``` @@ -588,18 +775,43 @@ io.on('connection', function(socket){ Fired upon disconnection. +```js +io.on('connection', (socket) => { + socket.on('disconnect', (reason) => { + // ... + }); +}); +``` + #### Event: 'error' - `error` _(Object)_ error object Fired when an error occurs. +```js +io.on('connection', (socket) => { + socket.on('error', (error) => { + // ... + }); +}); +``` + #### Event: 'disconnecting' - `reason` _(String)_ the reason of the disconnection (either client or server-side) Fired when the client is going to be disconnected (but hasn't left its `rooms` yet). +```js +io.on('connection', (socket) => { + socket.on('disconnecting', (reason) => { + let rooms = Object.keys(socket.rooms); + // ... + }); +}); +``` + These are reserved events (along with `connect`, `newListener` and `removeListener`) which cannot be used as event names. ### Client From bf7afb14cb31cb4c17cfa8e1eb1fd4a8dcfc1ebf Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Jun 2017 23:40:43 +0200 Subject: [PATCH 261/494] =?UTF-8?q?[docs]=C2=A0Update=20Webpack=20server?= =?UTF-8?q?=20example=20(#2976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/webpack-build-server/lib/index.js | 3 ++- examples/webpack-build-server/package.json | 12 ++---------- .../support/webpack.config.js | 18 +----------------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/examples/webpack-build-server/lib/index.js b/examples/webpack-build-server/lib/index.js index afcdbdb8a4..b05f4fbbbb 100644 --- a/examples/webpack-build-server/lib/index.js +++ b/examples/webpack-build-server/lib/index.js @@ -1,7 +1,8 @@ const server = require('http').createServer(); const io = require('socket.io')(server, { - // serveClient: false // do not serve the client file, in that case the brfs loader is not needed + serveClient: false, + wsEngine: 'ws' // uws is not supported since it is a native module }); const port = process.env.PORT || 3000; diff --git a/examples/webpack-build-server/package.json b/examples/webpack-build-server/package.json index 28ef8ba392..abd095e4cf 100644 --- a/examples/webpack-build-server/package.json +++ b/examples/webpack-build-server/package.json @@ -8,16 +8,8 @@ }, "author": "Damien Arrachequesne", "license": "MIT", - "dependencies": { - "brfs": "^1.4.3", - "bufferutil": "^1.3.0", - "socket.io": "^1.7.2", - "transform-loader": "^0.2.3", - "utf-8-validate": "^2.0.0" - }, "devDependencies": { - "json-loader": "^0.5.4", - "null-loader": "^0.1.1", - "webpack": "^1.14.0" + "socket.io": "^2.0.3", + "webpack": "^2.6.1" } } diff --git a/examples/webpack-build-server/support/webpack.config.js b/examples/webpack-build-server/support/webpack.config.js index a9893a73d2..4e09c86624 100644 --- a/examples/webpack-build-server/support/webpack.config.js +++ b/examples/webpack-build-server/support/webpack.config.js @@ -3,23 +3,7 @@ module.exports = { entry: './lib/index.js', target: 'node', output: { - path: './dist', + path: require('path').join(__dirname, '../dist'), filename: 'server.js' - }, - module: { - loaders: [ - { - test: /(\.md|\.map)$/, - loader: 'null' - }, - { - test: /\.json$/, - loader: 'json' - }, - { - test: /\.js$/, - loader: "transform-loader?brfs" - } - ] } }; From 7199d1b6ef812a13a4df09b5155b52f52517ea2d Mon Sep 17 00:00:00 2001 From: Nicolas Coden Date: Mon, 19 Jun 2017 12:16:26 +0200 Subject: [PATCH 262/494] [docs] Fix misnamed 'Object.keys' in API docs (#2979) --- docs/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API.md b/docs/API.md index d357443e10..a3ebafa520 100644 --- a/docs/API.md +++ b/docs/API.md @@ -503,7 +503,7 @@ A hash of strings identifying the rooms this client is in, indexed by room name. ```js io.on('connection', (socket) => { socket.join('room 237', () => { - let rooms = Objects.keys(socket.rooms); + let rooms = Object.keys(socket.rooms); console.log(rooms); // [ , 'room 237' ] }); }); @@ -659,7 +659,7 @@ Adds the client to the `room`, and fires optionally a callback with `err` signat ```js io.on('connection', (socket) => { socket.join('room 237', () => { - let rooms = Objects.keys(socket.rooms); + let rooms = Object.keys(socket.rooms); console.log(rooms); // [ , 'room 237' ] io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room }); From 9d170a75d0626cff60f6be518351d825b894c44d Mon Sep 17 00:00:00 2001 From: Gabriel Hautclocq Date: Sat, 1 Jul 2017 07:57:34 +0200 Subject: [PATCH 263/494] [docs] Add io.emit in the cheat sheet (#2992) --- docs/emit.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/emit.md b/docs/emit.md index c022618423..96ff26f7e4 100644 --- a/docs/emit.md +++ b/docs/emit.md @@ -42,6 +42,9 @@ function onConnect(socket){ // sending to all clients on this node (when using multiple nodes) io.local.emit('hi', 'my lovely babies'); + + // sending to all connected clients + io.emit('an event sent to all connected clients'); }; From 1f0e64a6da90213d8b5633b72acffae9f8a9a830 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Aug 2017 07:35:57 +0200 Subject: [PATCH 264/494] [fix] Do not throw when receiving an unhandled error packet (#3038) --- lib/socket.js | 2 +- test/socket.io.js | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index a907bf3381..91ddbbdf03 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -340,7 +340,7 @@ Socket.prototype.onpacket = function(packet){ break; case parser.ERROR: - this.emit('error', packet.data); + this.onerror(new Error(packet.data)); } }; diff --git a/test/socket.io.js b/test/socket.io.js index bd2e65d2ad..44d8d1a8f7 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1699,6 +1699,23 @@ describe('socket.io', function(){ }); }); + it('should not crash when receiving an error packet without handler', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var socket = client(srv, { reconnection: false }); + sio.on('connection', function(s){ + s.conn.on('upgrade', function(){ + console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + socket.io.engine.write('44["handle me please"]'); + setTimeout(function(){ + done(); + }, 100); + }); + }); + }); + }); + it('should not crash with raw binary', function(done){ var srv = http(); var sio = io(srv); From dd69abbeeeeeb50c5f88b0cb79460e1add690820 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Aug 2017 07:36:26 +0200 Subject: [PATCH 265/494] [fix] Reset rooms object before broadcasting from namespace (#3039) --- lib/namespace.js | 33 +++++++++++++++++++-------------- lib/socket.js | 5 ++--- package.json | 1 - 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 3c6b65ca4d..0b0657ba8c 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -210,23 +210,28 @@ Namespace.prototype.remove = function(socket){ Namespace.prototype.emit = function(ev){ if (~exports.events.indexOf(ev)) { emit.apply(this, arguments); - } else { - // set up packet object - var args = Array.prototype.slice.call(arguments); - var packet = { type: parser.EVENT, data: args }; + return this; + } + // set up packet object + var args = Array.prototype.slice.call(arguments); + var packet = { type: parser.EVENT, data: args }; - if ('function' == typeof args[args.length - 1]) { - throw new Error('Callbacks are not supported when broadcasting'); - } + if ('function' == typeof args[args.length - 1]) { + throw new Error('Callbacks are not supported when broadcasting'); + } - this.adapter.broadcast(packet, { - rooms: this.rooms, - flags: this.flags - }); + var rooms = this.rooms.slice(0); + var flags = Object.assign({}, this.flags); + + // reset flags + this.rooms = []; + this.flags = {}; + + this.adapter.broadcast(packet, { + rooms: rooms, + flags: flags + }); - this.rooms = []; - this.flags = {}; - } return this; }; diff --git a/lib/socket.js b/lib/socket.js index 91ddbbdf03..6c6bcde3e7 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -7,7 +7,6 @@ var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); var url = require('url'); var debug = require('debug')('socket.io:socket'); -var assign = require('object-assign'); /** * Module exports. @@ -115,7 +114,7 @@ Socket.prototype.buildHandshake = function(query){ function buildQuery(){ var requestQuery = url.parse(self.request.url, true).query; //if socket-specific query exist, replace query strings in requestQuery - return assign({}, query, requestQuery); + return Object.assign({}, query, requestQuery); } return { headers: this.request.headers, @@ -160,7 +159,7 @@ Socket.prototype.emit = function(ev){ } var rooms = this._rooms.slice(0); - var flags = assign({}, this.flags); + var flags = Object.assign({}, this.flags); // reset flags this._rooms = []; diff --git a/package.json b/package.json index 50dc91fe9c..0973bbf019 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "dependencies": { "debug": "~2.6.6", "engine.io": "~3.1.0", - "object-assign": "~4.1.1", "socket.io-adapter": "~1.1.0", "socket.io-client": "~2.0.2", "socket.io-parser": "~3.1.1" From 3684d590f51fae6dd9bb4501f7ea75afe20ffcda Mon Sep 17 00:00:00 2001 From: Stanley288 Date: Fri, 25 Aug 2017 22:44:25 -0700 Subject: [PATCH 266/494] [docs] Use path.join instead of concatenating paths (#3014) --- examples/chat/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/chat/index.js b/examples/chat/index.js index c9efcec25e..a1355285c9 100644 --- a/examples/chat/index.js +++ b/examples/chat/index.js @@ -1,6 +1,7 @@ // Setup basic express server var express = require('express'); var app = express(); +var path = require('path'); var server = require('http').createServer(app); var io = require('../..')(server); var port = process.env.PORT || 3000; @@ -10,7 +11,7 @@ server.listen(port, function () { }); // Routing -app.use(express.static(__dirname + '/public')); +app.use(express.static(path.join(__dirname, 'public'))); // Chatroom From 3386e155a8027f3cec85b82e803cbc87a119e56b Mon Sep 17 00:00:00 2001 From: Haku Date: Sun, 27 Aug 2017 14:40:26 +0800 Subject: [PATCH 267/494] [docs] Actually prevent input from having injected markup in chat example (#2987) --- examples/chat/public/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/public/main.js b/examples/chat/public/main.js index dc1721be99..83d142825a 100644 --- a/examples/chat/public/main.js +++ b/examples/chat/public/main.js @@ -146,7 +146,7 @@ $(function() { // Prevents input from having injected markup function cleanInput (input) { - return $('
        ').text(input).text(); + return $('
        ').text(input).html(); } // Updates the typing event From e26b71c78e48d566fc8bf3726bcec0ba872b015a Mon Sep 17 00:00:00 2001 From: Vyacheslav Aristov Date: Sat, 7 Oct 2017 15:36:02 +0300 Subject: [PATCH 268/494] [docs] Fix typo in API docs (#3066) --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index a3ebafa520..161a4480fb 100644 --- a/docs/API.md +++ b/docs/API.md @@ -661,7 +661,7 @@ io.on('connection', (socket) => { socket.join('room 237', () => { let rooms = Object.keys(socket.rooms); console.log(rooms); // [ , 'room 237' ] - io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room + io.to('room 237').emit('a new user has joined the room'); // broadcast to everyone in the room }); }); ``` From 3f611654f25743c2a5efd8e19aec9f40bd4a46ee Mon Sep 17 00:00:00 2001 From: Carson McKinstry Date: Sat, 7 Oct 2017 08:08:14 -0500 Subject: [PATCH 269/494] [docs] Fix a grammar mistake in the API docs (#3076) --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 161a4480fb..4bfadddd43 100644 --- a/docs/API.md +++ b/docs/API.md @@ -241,7 +241,7 @@ Provides a function taking two arguments `origin:String` and `callback(error, su __Potential drawbacks__: * in some situations, when it is not possible to determine `origin` it may have value of `*` * As this function will be executed for every request, it is advised to make this function work as fast as possible -* If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors). +* If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express you can use [cors](https://github.com/expressjs/cors). ```js io.origins((origin, callback) => { From f33347908066da4f89febe886929b4c5f5e838eb Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 16 Oct 2017 03:46:42 -0200 Subject: [PATCH 270/494] =?UTF-8?q?[test]=C2=A0Use=20npm=20scripts=20inste?= =?UTF-8?q?ad=20of=20gulp=20(#3078)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 8 ------ gulpfile.js | 69 ----------------------------------------------- package.json | 13 +++------ test/socket.io.js | 31 ++++----------------- 5 files changed, 9 insertions(+), 113 deletions(-) delete mode 100644 Makefile delete mode 100644 gulpfile.js diff --git a/.gitignore b/.gitignore index 32d7d3bbd4..7e78cb2147 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ node_modules coverage .idea dist +.nyc_output \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 6e494e024f..0000000000 --- a/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -test: - @./node_modules/.bin/gulp test - -test-cov: - @./node_modules/.bin/gulp test-cov - -.PHONY: test diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 82603d026c..0000000000 --- a/gulpfile.js +++ /dev/null @@ -1,69 +0,0 @@ -const gulp = require('gulp'); -const mocha = require('gulp-mocha'); -const babel = require("gulp-babel"); -const istanbul = require('gulp-istanbul'); -const help = require('gulp-task-listing'); -const del = require('del'); - -gulp.task('help', help); - -gulp.task('default', ['transpile']); - -const TRANSPILE_DEST_DIR = './dist'; - -// By default, individual js files are transformed by babel and exported to /dist -gulp.task('transpile', function () { - return gulp.src("lib/*.js") - .pipe(babel({ "presets": ["es2015"] })) - .pipe(gulp.dest(TRANSPILE_DEST_DIR)); -}); - -gulp.task('clean', function () { - return del([TRANSPILE_DEST_DIR]); -}) - -gulp.task('test', ['transpile'], function(){ - return gulp.src('test/socket.io.js', {read: false}) - .pipe(mocha({ - slow: 200, - reporter: 'spec', - bail: true, - timeout: 10000 - })) - .once('error', function (err) { - console.error(err.stack); - process.exit(1); - }) - .once('end', function () { - process.exit(); - }); -}); - -gulp.task('set-compat-node-env', function() { - process.env.TEST_VERSION = 'compat'; -}); - -gulp.task('test-compat', ['set-compat-node-env', 'test']); - -gulp.task('istanbul-pre-test', function () { - return gulp.src(['lib/**/*.js']) - // Covering files - .pipe(istanbul()) - // Force `require` to return covered files - .pipe(istanbul.hookRequire()); -}); - -gulp.task('test-cov', ['istanbul-pre-test'], function(){ - return gulp.src('test/socket.io.js', {read: false}) - .pipe(mocha({ - reporter: 'dot' - })) - .pipe(istanbul.writeReports()) - .once('error', function (err){ - console.error(err.stack); - process.exit(1); - }) - .once('end', function (){ - process.exit(); - }); -}); diff --git a/package.json b/package.json index 0973bbf019..d6a5d1658c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "url": "git://github.com/socketio/socket.io" }, "scripts": { - "test": "gulp test" + "test": "nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js" }, "dependencies": { "debug": "~2.6.6", @@ -31,16 +31,9 @@ "socket.io-parser": "~3.1.1" }, "devDependencies": { - "babel-preset-es2015": "^6.24.1", - "del": "^2.2.2", "expect.js": "0.3.1", - "gulp": "^3.9.1", - "gulp-babel": "^6.1.2", - "gulp-istanbul": "^1.1.1", - "gulp-mocha": "^4.3.1", - "gulp-task-listing": "1.0.1", - "istanbul": "^0.4.5", - "mocha": "^3.3.0", + "mocha": "^3.5.3", + "nyc": "^11.2.1", "superagent": "1.6.1", "supertest": "1.1.0" }, diff --git a/test/socket.io.js b/test/socket.io.js index 44d8d1a8f7..f382d503d2 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,12 +1,5 @@ -var testVersion = process.env.TEST_VERSION; var http = require('http').Server; -var io; -if (testVersion === 'compat') { - console.log('testing compat version'); - io = require('../dist'); -} else { - io = require('../lib'); -} +var io = require('../lib'); var fs = require('fs'); var join = require('path').join; var exec = require('child_process').exec; @@ -432,18 +425,9 @@ describe('socket.io', function(){ }); describe('namespaces', function(){ - var Socket; - if (testVersion === 'compat') { - Socket = require('../dist/socket'); - } else { - Socket = require('../lib/socket'); - } - var Namespace; - if (testVersion === 'compat') { - Namespace = require('../dist/namespace'); - } else { - Namespace = require('../lib/namespace'); - } + var Socket = require('../lib/socket'); + var Namespace = require('../lib/namespace'); + it('should be accessible through .sockets', function(){ var sio = io(); expect(sio.sockets).to.be.a(Namespace); @@ -2123,12 +2107,7 @@ describe('socket.io', function(){ }); describe('middleware', function(done){ - var Socket; - if (testVersion === 'compat') { - Socket = require('../dist/socket'); - } else { - Socket = require('../lib/socket'); - } + var Socket = require('../lib/socket'); it('should call functions', function(done){ var srv = http(); From 1c108a35e499579f978908bac3fb47122ed77ee4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 22 Oct 2017 15:16:29 +0200 Subject: [PATCH 271/494] [chore] Release 2.0.4 --- History.md | 720 --------------------------------------------------- package.json | 4 +- 2 files changed, 2 insertions(+), 722 deletions(-) delete mode 100644 History.md diff --git a/History.md b/History.md deleted file mode 100644 index e750230464..0000000000 --- a/History.md +++ /dev/null @@ -1,720 +0,0 @@ - -2.0.3 / 2017-06-12 -=================== - - * [fix] Reset rooms object before broadcasting (#2970) - * [fix] Fix middleware initialization (#2969) - * [docs] Update slack badge (#2961) - * [docs] Update webpack example (#2960) - -2.0.2 / 2017-06-01 -=================== - - * [fix] Fix timing issues with middleware (#2948) - -2.0.1 / 2017-05-09 -=================== - - * [fix] Update path of client file (#2934) - -2.0.0 / 2017-05-09 -=================== - - * [feat] Move binary detection to the parser (#2923) - * [feat] Allow to join several rooms at once (#2879) - * [feat] Merge Engine.IO and Socket.IO handshake packets (#2833) - * [feat] Allow the use of custom parsers (#2829) - - * [fix] Use path.resolve by default and require.resolve as a fallback (#2797) - * [fix] Properly close the connection on error (#2681) - * [fix] Prevent null from being accepted as argument (#2606) - - * [perf] Use shared instance of the encoder (#2825) - * [perf] Reset properties instead of deleting them (#2826) - * [perf] micro-optimisations (#2793) - - * [chore] Merge history of 1.7.x and 0.9.x branches (#2930) - * [chore] Added backers and sponsors on the README (#2933) - * [chore] Bump dependencies (#2926) - * [chore] Bump socket.io-adapter to version 1.0.0 (#2867) - * [chore] Bump engine.io to version 2.0.2 (#2864) - * [chore] Bump engine.io to version 2.0.0 (#2832) - * [chore] Update issue template with fiddle (#2811) - * [chore] Update copyright year LICENSE to 2017 (#2803) - - * [docs] Add an example of custom parser (#2929) - * [docs] Replace non-breaking space with proper whitespace (#2913) - * [docs] Update emit cheatsheet (#2906) - * [docs] Explicitly document that Server extends EventEmitter (#2874) - * [docs] Add server.engine.generateId attribute (#2880) - * [docs] Fix wrong space character in README (#2900) - * [docs] Fix documentation for 'connect' event (#2898) - * [docs] Add webpack build example (#2828) - * [docs] Update the wording to match the code example (#2853) - * [docs] Small addition to the Express Readme Part (#2846) - * [docs] Add a 'Features' section in the README (#2824) - * [docs] Add httpd cluster example (#2819) - * [docs] Add haproxy cluster example (#2818) - * [docs] Add nginx cluster example (#2817) - * [docs] Implement whiteboard example (#2810) - * [docs] Fix documentation for `local` flag (#2816) - * [docs] Add emit cheatsheet (#2815) - * [docs] Add pingInterval/pingTimeout/transports options in the API documentation (#2814) - * [docs] Add an example for socket.join() method (#2813) - * [docs] Fix a typo on `clients` method in the API documentation (#2812) - * [docs] Fix wrong argument name in API.md (#2802) - * [docs] Add install script on Readme.md (#2780) - * [docs] API documentation (#2784) - -1.7.4 / 2017-05-07 -=================== - - * [chore] Bump engine.io to version 1.8.4 - -0.9.18 / 2017-05-07 -=================== - - * Remove process.EventEmitter usage for Node 7.x - -1.7.3 / 2017-02-17 -=================== - - * [chore] Bump engine.io to version 1.8.3 - -1.7.2 / 2016-12-11 -=================== - - * [chore] Bump engine.io to version 1.8.2 (#2782) - * [fix] Fixes socket.use error packet (#2772) - -1.7.1 / 2016-11-28 -=================== - -1.7.0 / 2016-11-27 -=================== - - * [docs] Comment connected socket availability for adapters (#2081) - * [docs] Fixed grammar issues in the README.md (#2159) - * [feature] serve sourcemap for socket.io-client (#2482) - * [feature] Add a `local` flag (#2628) - * [chore] Bump engine.io to version 1.8.1 (#2765) - * [chore] Update client location and serve minified file (#2766) - -1.6.0 / 2016-11-20 -================== - - * [fix] Make ETag header comply with standard. (#2603) - * [feature] Loading client script on demand. (#2567) - * [test] Fix leaking clientSocket (#2721) - * [feature] Add support for all event emitter methods (#2601) - * [chore] Update year to 2016 (#2456) - * [feature] Add support for socket middleware (#2306) - * [feature] add support for Server#close(callback) (#2748) - * [fix] Don't drop query variables on handshake (#2745) - * [example] Add disconnection/reconnection logs to the chat example (#2675) - * [perf] Minor code optimizations (#2219) - * [chore] Bump debug to version 2.3.3 (#2754) - * [chore] Bump engine.io to version 1.8.0 (#2755) - * [chore] Bump socket.io-adapter to version 0.5.0 (#2756) - -1.5.1 / 2016-10-24 -================== - - * [fix] Avoid swallowing exceptions thrown by user event handlers (#2682) - * [test] Use client function to unify `client` in test script (#2731) - * [docs] Add link to LICENSE (#2221) - * [docs] Fix JSDoc of optional parameters (#2465) - * [docs] Fix typo (#2724) - * [docs] Link readme npm package badge to npm registry page (#2612) - * [docs] Minor fixes (#2526) - * [chore] Bump socket.io-parser to 2.3.0 (#2730) - * [chore] Add Github issue and PR templates (#2733) - * [chore] Bump engine.io to 1.7.2 (#2729) - * [chore] Bump socket.io-parser to 2.3.1 (#2734) - -1.5.0 / 2016-10-06 -================== - - * [feature] stop append /# before id when no namespace (#2508) - * [feature] Add a 'disconnecting' event to access to socket.rooms upon disconnection (#2332) - * [fix] Fix query string management (#2422) - * [fix] add quote to exec paths, prevent error when spaces in path (#2508) - * [docs] Prevent mixup for new programmers (#2599) - * [example] Fix chat display in Firefox (#2477) - * [chore] Add gulp & babel in the build process (#2471) - * [chore] Bump engine.io to 1.7.0 (#2707) - * [chore] Remove unused zuul-ngrok dependency (#2708) - * [chore] Point towards current master of socket.io-client (#2710) - * [chore] Restrict files included in npm package (#2709) - * [chore] Link build badge to master branch (#2549) - -1.4.8 / 2016-06-23 -================== - - * package: bump `engine.io` - -1.4.7 / 2016-06-23 -================== - - * package: bump `engine.io` - -1.4.6 / 2016-05-02 -================== - - * package: bump engine.io - -1.4.5 / 2016-01-26 -================== - - * fix closing the underlying `http.Server` - -1.4.4 / 2016-01-10 -================== - - * package: bump `engine.io` - -1.4.3 / 2016-01-08 -================== - - * bump `socket.io-client` - -1.4.2 / 2016-01-07 -================== - - * bump `engine.io` - -1.4.1 / 2016-01-07 -================== - - * version bump - -1.4.0 / 2015-11-28 -================== - - * socket.io: increase large binary data test timeout - * package: bump `engine.io` for release - * trigger callback even when joining an already joined room - * package: bump parser - * namespace: clear rooms flag after a clients call (fixes #1978) - * package: bump `socket.io-parser` - * fixed tests with large data - * fixed a typo in the example code - * package: bump mocha - * package: bump `has-binary` and `zuul-ngrok` - * package: bump `engine.io` and `socket.io-client` - * README: clarified documentation of Socket.in - * README: fixed up legacy repo links - * test: better timeout for stress test - * socket: don't set request property which has a getter - * removed proxy index file - * support flags on namespace - * improve Socket#packet and Client#packet - * socket: warn node_redis-style about missing `error` - * test: added failing test - * test: increase timeout for large binary data test - * package: bump `has-binary` to work with all objects (fixes #1955) - * fix origin verification default https port [evanlucas] - * support compression [nkzawa] - * changed type of `Client#sockets`, `Namespace#sockets` and `Socket#rooms` to maps (instead of arrays) - -1.3.7 / 2015-09-21 -================== - - * package: bump `socket.io-client` for node4 compatibility - * package: bump `engine.io` for node4 compatibility - -1.3.6 / 2015-07-14 -================== - - * package: bump `engine.io` to fix build on windows - -1.3.5 / 2015-03-03 -================== - - * package: bump `socket.io-parser` - -1.3.4 / 2015-02-14 -================== - - * package: bump `socket.io-client` - -1.3.3 / 2015-02-03 -================== - - * socket: warn node_redis-style about missing `error` - * package: bump parser to better handle bad binary packets - -1.3.2 / 2015-01-19 -================== - - * no change on this release - -1.3.1 / 2015-01-19 -================== - - * no change on this release - * package: bump `engine.io` - -1.3.0 / 2015-01-19 -================== - - * package: bump `engine.io` - * add test for reconnection after server restarts [rase-] - * update license with up-to-date year range [fay-jai] - * fix leaving unknown rooms [defunctzombie] - * allow null origins when allowed origins is a function [drewblaisdell] - * fix tests on node 0.11 - * package: fix `npm test` to run on windows - * package: bump `debug` v2.1.0 [coderaiser] - * added tests for volatile [rase-] - -1.2.1 / 2014-11-21 -================== - - * fix protocol violations and improve error handling (GH-1880) - * package: bump `engine.io` for websocket leak fix [3rd-Eden] - * style tweaks - -1.2.0 / 2014-10-27 -================== - - * package: bump `engine.io` - * downloads badge - * add test to check that empty rooms are autopruned - * added Server#origins(v:Function) description for dynamic CORS - * added test coverage for Server#origins(function) for dynamic CORS - * added optional Server#origins(function) for dynamic CORS - * fix usage example for Server#close - * package: fix main file for example application 'chat' - * package: bump `socket.io-parser` - * update README http ctor to createServer() - * bump adapter with a lot of fixes for room bookkeeping - -1.1.0 / 2014-09-04 -================== - - * examples: minor fix of escaping - * testing for equivalence of namespaces starting with / or without - * update index.js - * added relevant tests - * take "" and "/" as equivalent namespaces on server - * use svg instead of png to get better image quality in readme - * make CI build faster - * fix splice arguments and `socket.rooms` value update in `socket.leaveAll`. - * client cannot connect to non-existing namespaces - * bump engine.io version to get the cached IP address - * fixed handshake object address property and made the test case more strict. - * package: bump `engine.io` - * fixed the failing test where server crashes on disconnect involving connectBuffer - * npmignore: ignore `.gitignore` (fixes #1607) - * test: added failing case for `socket.disconnect` and nsps - * fix repo in package.json - * improve Close documentation - * use ephemeral ports - * fix: We should use the standard http protocol to handler the etag header. - * override default browser font-family for inputs - * update has-binary-data to 1.0.3 - * add close specs - * add ability to stop the http server even if not created inside socket.io - * make sure server gets close - * Add test case for checking that reconnect_failed is fired only once upon failure - * package: bump `socket.io-parser` for `component-emitter` dep fix - -1.0.6 / 2014-06-19 -================== - - * package: bump `socket.io-client` - -1.0.5 / 2014-06-16 -================== - - * package: bump `engine.io` to fix jsonp `\n` bug and CORS warnings - * index: fix typo [yanatan16] - * add `removeListener` to blacklisted events - * examples: clearer instructions to install chat example - * index: fix namespace `connectBuffer` issue - -1.0.4 / 2014-06-02 -================== - - * package: bump socket.io-client - -1.0.3 / 2014-05-31 -================== - - * package: bump `socket.io-client` - * package: bump `socket.io-parser` for binary ACK fix - * package: bump `engine.io` for binary UTF8 fix - * example: fix XSS in chat example - -1.0.2 / 2014-05-28 -================== - - * package: bump `socket.io-parser` for windows fix - -1.0.1 / 2014-05-28 -================== - - * bump due to bad npm tag - -1.0.0 / 2014-05-28 -================== - - * stable release - -1.0.0-pre5 / 2014-05-22 -======================= - - * package: bump `socket.io-client` for parser fixes - * package: bump `engine.io` - -1.0.0-pre4 / 2014-05-19 -======================= - - * package: bump client - -1.0.0-pre3 / 2014-05-17 -======================= - - * package: bump parser - * package: bump engine.io - -1.0.0-pre2 / 2014-04-27 -======================= - - * package: bump `engine.io` - * added backwards compatible of engine.io maxHttpBufferSize - * added test that server and client using same protocol - * added support for setting allowed origins - * added information about logging - * the set function in server can be used to set some attributes for BC - * fix error in callback call 'done' instead of 'next' in docs - * package: bump `socket.io-parser` - * package: bump `expect.js` - * added some new tests, including binary with acks - -1.0.0-pre / 2014-03-14 -====================== - - * implemented `engine.io` - * implemented `socket.io-adapter` - * implemented `socket.io-protocol` - * implemented `debug` and improved instrumentation - * added binary support - * added new `require('io')(srv)` signature - * simplified `socket.io-client` serving - -0.9.14 / 2013-03-29 -=================== - - * manager: fix memory leak with SSL [jpallen] - -0.9.13 / 2012-12-13 -=================== - - * package: fixed `base64id` requirement - -0.9.12 / 2012-12-13 -=================== - - * manager: fix for latest node which is returning a clone with `listeners` [viirya] - -0.9.11 / 2012-11-02 -=================== - - * package: move redis to optionalDependenices [3rd-Eden] - * bumped client - -0.9.10 / 2012-08-10 -=================== - - * Don't lowercase log messages - * Always set the HTTP response in case an error should be returned to the client - * Create or destroy the flash policy server on configuration change - * Honour configuration to disable flash policy server - * Add express 3.0 instructions on Readme.md - * Bump client - -0.9.9 / 2012-08-01 -================== - - * Fixed sync disconnect xhrs handling - * Put license text in its own file (#965) - * Add warning to .listen() to ease the migration to Express 3.x - * Restored compatibility with node 0.4.x - -0.9.8 / 2012-07-24 -================== - - * Bumped client. - -0.9.7 / 2012-07-24 -================== - - * Prevent crash when socket leaves a room twice. - * Corrects unsafe usage of for..in - * Fix for node 0.8 with `gzip compression` [vadimi] - * Update redis to support Node 0.8.x - * Made ID generation securely random - * Fix Redis Store race condition in manager onOpen unsubscribe callback - * Fix for EventEmitters always reusing the same Array instance for listeners - -0.9.6 / 2012-04-17 -================== - - * Fixed XSS in jsonp-polling. - -0.9.5 / 2012-04-05 -================== - - * Added test for polling and socket close. - * Ensure close upon request close. - * Fix disconnection reason being lost for polling transports. - * Ensure that polling transports work with Connection: close. - * Log disconnection reason. - -0.9.4 / 2012-04-01 -================== - - * Disconnecting from namespace improvement (#795) [DanielBaulig] - * Bumped client with polling reconnection loop (#438) - -0.9.3 / 2012-03-28 -================== - - * Fix "Syntax error" on FF Web Console with XHR Polling [mikito] - -0.9.2 / 2012-03-13 -================== - - * More sensible close `timeout default` (fixes disconnect issue) - -0.9.1-1 / 2012-03-02 -==================== - - * Bumped client with NPM dependency fix. - -0.9.1 / 2012-03-02 -================== - - * Changed heartbeat timeout and interval defaults (60 and 25 seconds) - * Make tests work both on 0.4 and 0.6 - * Updated client (improvements + bug fixes). - -0.9.0 / 2012-02-26 -================== - - * Make it possible to use a regexp to match the socket.io resource URL. - We need this because we have to prefix the socket.io URL with a variable ID. - * Supplemental fix to gavinuhma/authfix, it looks like the same Access-Control-Origin logic is needed in the http and xhr-polling transports - * Updated express dep for windows compatibility. - * Combine two substr calls into one in decodePayload to improve performance - * Minor documentation fix - * Minor. Conform to style of other files. - * Switching setting to 'match origin protocol' - * Revert "Fixes leaking Redis subscriptions for #663. The local flag was not getting passed through onClientDisconnect()." - * Revert "Handle leaked dispatch:[id] subscription." - * Merge pull request #667 from dshaw/patch/redis-disconnect - * Handle leaked dispatch:[id] subscription. - * Fixes leaking Redis subscriptions for #663. The local flag was not getting passed through onClientDisconnect(). - * Prevent memory leaking on uncompleted requests & add max post size limitation - * Fix for testcase - * Set Access-Control-Allow-Credentials true, regardless of cookie - * Remove assertvarnish from package as it breaks on 0.6 - * Correct irc channel - * Added proper return after reserved field error - * Fixes manager.js failure to close connection after transport error has happened - * Added implicit port 80 for origin checks. fixes #638 - * Fixed bug #432 in 0.8.7 - * Set Access-Control-Allow-Origin header to origin to enable withCredentials - * Adding configuration variable matchOriginProtocol - * Fixes location mismatch error in Safari. - * Use tty to detect if we should add colors or not by default. - * Updated the package location. - -0.8.7 / 2011-11-05 -================== - - * Fixed memory leaks in closed clients. - * Fixed memory leaks in namespaces. - * Fixed websocket handling for malformed requests from proxies. [einaros] - * Node 0.6 compatibility. [einaros] [3rd-Eden] - * Adapted tests and examples. - -0.8.6 / 2011-10-27 -================== - - * Added JSON decoding on jsonp-polling transport. - * Fixed README example. - * Major speed optimizations [3rd-Eden] [einaros] [visionmedia] - * Added decode/encode benchmarks [visionmedia] - * Added support for black-listing client sent events. - * Fixed logging options, closes #540 [3rd-Eden] - * Added vary header for gzip [3rd-Eden] - * Properly cleaned up async websocket / flashsocket tests, after patching node-websocket-client - * Patched to properly shut down when a finishClose call is made during connection establishment - * Added support for socket.io version on url and far-future Expires [3rd-Eden] [getify] - * Began IE10 compatibility [einaros] [tbranyen] - * Misc WebSocket fixes [einaros] - * Added UTF8 to respone headers for htmlfile [3rd-Eden] - -0.8.5 / 2011-10-07 -================== - - * Added websocket draft HyBi-16 support. [einaros] - * Fixed websocket continuation bugs. [einaros] - * Fixed flashsocket transport name. - * Fixed websocket tests. - * Ensured `parser#decodePayload` doesn't choke. - * Added http referrer verification to manager verifyOrigin. - * Added access control for cross domain xhr handshakes [3rd-Eden] - * Added support for automatic generation of socket.io files [3rd-Eden] - * Added websocket binary support [einaros] - * Added gzip support for socket.io.js [3rd-Eden] - * Expose socket.transport [3rd-Eden] - * Updated client. - -0.8.4 / 2011-09-06 -================== - - * Client build - -0.8.3 / 2011-09-03 -================== - - * Fixed `\n` parsing for non-JSON packets (fixes #479). - * Fixed parsing of certain unicode characters (fixes #451). - * Fixed transport message packet logging. - * Fixed emission of `error` event resulting in an uncaught exception if unhandled (fixes #476). - * Fixed; allow for falsy values as the configuration value of `log level` (fixes #491). - * Fixed repository URI in `package.json`. Fixes #504. - * Added text/plain content-type to handshake responses [einaros] - * Improved single byte writes [einaros] - * Updated socket.io-flashsocket default port from 843 to 10843 [3rd-Eden] - * Updated client. - -0.8.2 / 2011-08-29 -================== - - * Updated client. - -0.8.1 / 2011-08-29 -================== - - * Fixed utf8 bug in send framing in websocket [einaros] - * Fixed typo in docs [Znarkus] - * Fixed bug in send framing for over 64kB of data in websocket [einaros] - * Corrected ping handling in websocket transport [einaros] - -0.8.0 / 2011-08-28 -================== - - * Updated to work with two-level websocket versioning. [einaros] - * Added hybi07 support. [einaros] - * Added hybi10 support. [einaros] - * Added http referrer verification to manager.js verifyOrigin. [einaors] - -0.7.11 / 2011-08-27 -=================== - - * Updated socket.io-client. - -0.7.10 / 2011-08-27 -=================== - - * Updated socket.io-client. - -0.7.9 / 2011-08-12 -================== - - * Updated socket.io-client. - * Make sure we only do garbage collection when the server we receive is actually run. - -0.7.8 / 2011-08-08 -================== - - * Changed; make sure sio#listen passes options to both HTTP server and socket.io manager. - * Added docs for sio#listen. - * Added options parameter support for Manager constructor. - * Added memory leaks tests and test-leaks Makefile task. - * Removed auto npm-linking from make test. - * Make sure that you can disable heartbeats. [3rd-Eden] - * Fixed rooms memory leak [3rd-Eden] - * Send response once we got all POST data, not immediately [Pita] - * Fixed onLeave behavior with missing clientsk [3rd-Eden] - * Prevent duplicate references in rooms. - * Added alias for `to` to `in` and `in` to `to`. - * Fixed roomClients definition. - * Removed dependency on redis for installation without npm [3rd-Eden] - * Expose path and querystring in handshakeData [3rd-Eden] - -0.7.7 / 2011-07-12 -================== - - * Fixed double dispatch handling with emit to closed clients. - * Added test for emitting to closed clients to prevent regression. - * Fixed race condition in redis test. - * Changed Transport#end instrumentation. - * Leveraged $emit instead of emit internally. - * Made tests faster. - * Fixed double disconnect events. - * Fixed disconnect logic - * Simplified remote events handling in Socket. - * Increased testcase timeout. - * Fixed unknown room emitting (GH-291). [3rd-Eden] - * Fixed `address` in handshakeData. [3rd-Eden] - * Removed transports definition in chat example. - * Fixed room cleanup - * Fixed; make sure the client is cleaned up after booting. - * Make sure to mark the client as non-open if the connection is closed. - * Removed unneeded `buffer` declarations. - * Fixed; make sure to clear socket handlers and subscriptions upon transport close. - -0.7.6 / 2011-06-30 -================== - - * Fixed general dispatching when a client has closed. - -0.7.5 / 2011-06-30 -================== - - * Fixed dispatching to clients that are disconnected. - -0.7.4 / 2011-06-30 -================== - - * Fixed; only clear handlers if they were set. [level09] - -0.7.3 / 2011-06-30 -================== - - * Exposed handshake data to clients. - * Refactored dispatcher interface. - * Changed; Moved id generation method into the manager. - * Added sub-namespace authorization. [3rd-Eden] - * Changed; normalized SocketNamespace local eventing [dvv] - * Changed; Use packet.reason or default to 'packet' [3rd-Eden] - * Changed console.error to console.log. - * Fixed; bind both servers at the same time do that the test never times out. - * Added 304 support. - * Removed `Transport#name` for abstract interface. - * Changed; lazily require http and https module only when needed. [3rd-Eden] - -0.7.2 / 2011-06-22 -================== - - * Make sure to write a packet (of type `noop`) when closing a poll. - This solves a problem with cross-domain requests being flagged as aborted and - reconnection being triggered. - * Added `noop` message type. - -0.7.1 / 2011-06-21 -================== - - * Fixed cross-domain XHR. - * Added CORS test to xhr-polling suite. - -0.7.0 / 2010-06-21 -================== - - * http://socket.io/announcement.html diff --git a/package.json b/package.json index d6a5d1658c..3fcc8f56db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.0.3", + "version": "2.0.4", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -27,7 +27,7 @@ "debug": "~2.6.6", "engine.io": "~3.1.0", "socket.io-adapter": "~1.1.0", - "socket.io-client": "~2.0.2", + "socket.io-client": "2.0.4", "socket.io-parser": "~3.1.1" }, "devDependencies": { From 52b09609db04e8691ba9307009e54dd528929a86 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 25 Feb 2018 09:22:40 +0100 Subject: [PATCH 272/494] [chore] Bump debug to version 3.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fcc8f56db..e48ac994eb 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "test": "nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js" }, "dependencies": { - "debug": "~2.6.6", + "debug": "~3.1.0", "engine.io": "~3.1.0", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.0.4", From c06ac071d04578e2f50dc8a785e66019dbb81144 Mon Sep 17 00:00:00 2001 From: Devlin Pajaron Date: Sun, 25 Feb 2018 16:26:24 +0800 Subject: [PATCH 273/494] [docs] Fix typo (#3157) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 5df48abac8..7541835e4b 100644 --- a/Readme.md +++ b/Readme.md @@ -38,7 +38,7 @@ Unless instructed otherwise a disconnected client will try to reconnect forever, #### Disconnection detection -An heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore. +A heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore. That functionality is achieved with timers set on both the server and the client, with timeout values (the `pingInterval` and `pingTimeout` parameters) shared during the connection handshake. Those timers require any subsequent client calls to be directed to the same server, hence the `sticky-session` requirement when using multiples nodes. From 0539a2c4fd1c5e5468d3933200ef07c1377c57d4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 22:56:28 +0100 Subject: [PATCH 274/494] [test] Update travis configuration --- .travis.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 44ab05c343..aa2c7cee84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,14 @@ -sudo: false language: node_js +sudo: false node_js: - - "4" - - "6" - - "7" - -git: - depth: 1 - + - '4' + - '6' + - '8' + - node notifications: irc: "irc.freenode.org#socket.io" +git: + depth: 1 +cache: + directories: + - node_modules From f48a06c040280b44f90fd225c888910544fd63b5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 23:00:16 +0100 Subject: [PATCH 275/494] [feat] Add a 'binary' flag (#3185) So that the call to the `has-binary` method can be skipped. Usage: ``` // with binary data socket.binary(true).emit("binary", obj); // without binary data socket.binary(false).emit("string", obj); // call to hasBin socket.emit("guess", obj); ``` --- docs/API.md | 21 +++++++++++++++++++++ docs/emit.md | 5 ++++- lib/index.js | 2 +- lib/namespace.js | 19 ++++++++++++++++++- lib/socket.js | 18 ++++++++++++++++-- package.json | 3 ++- 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/docs/API.md b/docs/API.md index 4bfadddd43..e59e75886c 100644 --- a/docs/API.md +++ b/docs/API.md @@ -33,6 +33,7 @@ - [Event: 'connection'](#event-connect) - [Flag: 'volatile'](#flag-volatile) - [Flag: 'local'](#flag-local) + - [Flag: 'binary'](#flag-binary) - [Class: Socket](#socket) - [socket.id](#socketid) - [socket.rooms](#socketrooms) @@ -57,6 +58,7 @@ - [socket.disconnect(close)](#socketdisconnectclose) - [Flag: 'broadcast'](#flag-broadcast) - [Flag: 'volatile'](#flag-volatile-1) + - [Flag: 'binary'](#flag-binary-1) - [Event: 'disconnect'](#event-disconnect) - [Event: 'error'](#event-error) - [Event: 'disconnecting'](#event-disconnecting) @@ -470,6 +472,14 @@ Sets a modifier for a subsequent event emission that the event data may be lost io.volatile.emit('an event', { some: 'data' }); // the clients may or may not receive it ``` +#### Flag: 'binary' + +Specifies whether there is binary data in the emitted data. Increases performance when specified. Can be `true` or `false`. + +```js +io.binary(false).emit('an event', { some: 'data' }); +``` + #### Flag: 'local' Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to the current node (when the [Redis adapter](https://github.com/socketio/socket.io-redis) is used). @@ -769,6 +779,17 @@ io.on('connection', (socket) => { }); ``` +#### Flag: 'binary' + +Specifies whether there is binary data in the emitted data. Increases performance when specified. Can be `true` or `false`. + +```js +var io = require('socket.io')(); +io.on('connection', function(socket){ + socket.binary(false).emit('an event', { some: 'data' }); // The data to send has no binary data +}); +``` + #### Event: 'disconnect' - `reason` _(String)_ the reason of the disconnection (either client or server-side) diff --git a/docs/emit.md b/docs/emit.md index 96ff26f7e4..86996680f2 100644 --- a/docs/emit.md +++ b/docs/emit.md @@ -40,9 +40,12 @@ function onConnect(socket){ // sending a message that might be dropped if the client is not ready to receive messages socket.volatile.emit('maybe', 'do you really need it?'); + // specifying whether the data to send has binary data + socket.binary(false).emit('what', 'I have no binaries!'); + // sending to all clients on this node (when using multiple nodes) io.local.emit('hi', 'my lovely babies'); - + // sending to all connected clients io.emit('an event sent to all connected clients'); diff --git a/lib/index.js b/lib/index.js index e16133ae4c..192504f77f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -451,7 +451,7 @@ var emitterMethods = Object.keys(Emitter.prototype).filter(function(key){ return typeof Emitter.prototype[key] === 'function'; }); -emitterMethods.concat(['to', 'in', 'use', 'send', 'write', 'clients', 'compress']).forEach(function(fn){ +emitterMethods.concat(['to', 'in', 'use', 'send', 'write', 'clients', 'compress', 'binary']).forEach(function(fn){ Server.prototype[fn] = function(){ return this.sockets[fn].apply(this.sockets, arguments); }; diff --git a/lib/namespace.js b/lib/namespace.js index 0b0657ba8c..587dad8649 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -6,6 +6,7 @@ var Socket = require('./socket'); var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); +var hasBin = require('has-binary2'); var debug = require('debug')('socket.io:namespace'); /** @@ -214,7 +215,10 @@ Namespace.prototype.emit = function(ev){ } // set up packet object var args = Array.prototype.slice.call(arguments); - var packet = { type: parser.EVENT, data: args }; + var packet = { + type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT, + data: args + }; if ('function' == typeof args[args.length - 1]) { throw new Error('Callbacks are not supported when broadcasting'); @@ -277,3 +281,16 @@ Namespace.prototype.compress = function(compress){ this.flags.compress = compress; return this; }; + +/** + * Sets the binary flag + * + * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + * @api public + */ + + Namespace.prototype.binary = function (binary) { + this.flags.binary = binary; + return this; + }; diff --git a/lib/socket.js b/lib/socket.js index 6c6bcde3e7..6cf9b52864 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -5,6 +5,7 @@ var Emitter = require('events').EventEmitter; var parser = require('socket.io-parser'); +var hasBin = require('has-binary2'); var url = require('url'); var debug = require('debug')('socket.io:socket'); @@ -143,7 +144,7 @@ Socket.prototype.emit = function(ev){ var args = Array.prototype.slice.call(arguments); var packet = { - type: parser.EVENT, + type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT, data: args }; @@ -380,7 +381,7 @@ Socket.prototype.ack = function(id){ self.packet({ id: id, - type: parser.ACK, + type: hasBin(args) ? parser.BINARY_ACK : parser.ACK, data: args }); @@ -495,6 +496,19 @@ Socket.prototype.compress = function(compress){ return this; }; +/** + * Sets the binary flag + * + * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + * @api public + */ + + Socket.prototype.binary = function (binary) { + this.flags.binary = binary; + return this; + }; + /** * Dispatch incoming event to socket listeners. * diff --git a/package.json b/package.json index e48ac994eb..c83f13ef5f 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,10 @@ "dependencies": { "debug": "~3.1.0", "engine.io": "~3.1.0", + "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.0.4", - "socket.io-parser": "~3.1.1" + "socket.io-parser": "~3.2.0" }, "devDependencies": { "expect.js": "0.3.1", From a23007a63575915b87a525f30f856e24ce5115d1 Mon Sep 17 00:00:00 2001 From: Miguel Piedrafita Date: Wed, 28 Feb 2018 23:03:02 +0100 Subject: [PATCH 276/494] [docs] Update license year (#3153) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index aea53a7090..6ce8c5ca1a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2014-2017 Automattic +Copyright (c) 2014-2018 Automattic Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From b1941d5dfe3d2530bb0f0391088d3c8765ae9695 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 23:10:40 +0100 Subject: [PATCH 277/494] [chore] Bump engine.io to version 3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c83f13ef5f..71abdcb822 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "~3.1.0", - "engine.io": "~3.1.0", + "engine.io": "~3.2.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.0.4", From dea5214f2154c5a6f46189c7d2e66674bd868992 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 23:19:19 +0100 Subject: [PATCH 278/494] [chore] Bump superagent and supertest versions (#3186) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71abdcb822..4028122cdb 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "expect.js": "0.3.1", "mocha": "^3.5.3", "nyc": "^11.2.1", - "superagent": "1.6.1", - "supertest": "1.1.0" + "superagent": "^3.8.2", + "supertest": "^3.0.0" }, "contributors": [ { From c0c79f019e7138194e438339f8192705957c8ec3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 1 Mar 2018 00:22:16 +0100 Subject: [PATCH 279/494] [feat] Add support for dynamic namespaces (#3187) --- docs/API.md | 17 +++++++++++ lib/client.js | 31 ++++++++++++++++---- lib/index.js | 48 ++++++++++++++++++++++++++++++ test/socket.io.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 5 deletions(-) diff --git a/docs/API.md b/docs/API.md index e59e75886c..a78cc5ed35 100644 --- a/docs/API.md +++ b/docs/API.md @@ -20,6 +20,7 @@ - [server.onconnection(socket)](#serveronconnectionsocket) - [server.of(nsp)](#serverofnsp) - [server.close([callback])](#serverclosecallback) + - [server.useNamespaceValidator(fn)](#serverusenamespacevalidatorfn) - [Class: Namespace](#namespace) - [namespace.name](#namespacename) - [namespace.connected](#namespaceconnected) @@ -321,6 +322,22 @@ server.listen(PORT); // PORT is free to use io = Server(server); ``` +#### server.useNamespaceValidator(fn) + + - `fn` _(Function)_ + +Sets up server middleware to validate whether a new namespace should be created. + +```js +io.useNamespaceValidator((nsp, next) => { + if (nsp === 'dynamic') { + next(null, true); + } else { + next(new Error('Invalid namespace')); + } +}); +``` + #### server.engine.generateId Overwrites the default method to generate your custom socket id. diff --git a/lib/client.js b/lib/client.js index 0b5f0446e9..adb5d20f73 100644 --- a/lib/client.js +++ b/lib/client.js @@ -56,17 +56,38 @@ Client.prototype.setup = function(){ * Connects a client to a namespace. * * @param {String} name namespace + * @param {String} query the query parameters * @api private */ Client.prototype.connect = function(name, query){ - debug('connecting to namespace %s', name); - var nsp = this.server.nsps[name]; - if (!nsp) { - this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); - return; + if (this.server.nsps[name]) { + debug('connecting to namespace %s', name); + return this.doConnect(name, query); } + this.server.checkNamespace(name, (allow) => { + if (allow) { + debug('creating namespace %s', name); + this.doConnect(name, query); + } else { + debug('creation of namespace %s was denied', name); + this.packet({ type: parser.ERROR, nsp: name, data: 'Invalid namespace' }); + } + }); +}; + +/** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {String} query the query parameters + * @api private + */ + +Client.prototype.doConnect = function(name, query){ + var nsp = this.server.of(name); + if ('/' != name && !this.nsps['/']) { this.connectBuffer.push(name); return; diff --git a/lib/index.js b/lib/index.js index 192504f77f..21cfefc9aa 100644 --- a/lib/index.js +++ b/lib/index.js @@ -46,6 +46,7 @@ function Server(srv, opts){ } opts = opts || {}; this.nsps = {}; + this.nspValidators = []; this.path(opts.path || '/socket.io'); this.serveClient(false !== opts.serveClient); this.parser = opts.parser || parser; @@ -157,6 +158,53 @@ Server.prototype.set = function(key, val){ return this; }; +/** + * Sets up server middleware to validate incoming namespaces not already created on the server. + * + * @return {Server} self + * @api public + */ + +Server.prototype.useNamespaceValidator = function(fn){ + this.nspValidators.push(fn); + return this; +}; + +/** + * Executes the middleware for an incoming namespace not already created on the server. + * + * @param name of incomming namespace + * @param {Function} last fn call in the middleware + * @api private + */ + +Server.prototype.checkNamespace = function(name, fn){ + var fns = this.nspValidators.slice(0); + if (!fns.length) return fn(false); + + var namespaceAllowed = false; // Deny unknown namespaces by default + + function run(i){ + fns[i](name, function(err, allow){ + // upon error, short-circuit + if (err) return fn(false); + + // if one piece of middleware explicitly denies namespace, short-circuit + if (allow === false) return fn(false); + + namespaceAllowed = namespaceAllowed || allow === true; + + // if no middleware left, summon callback + if (!fns[i + 1]) return fn(namespaceAllowed); + + // go on to next + run(i + 1); + }); + } + + run(0); +}; + /** * Sets the client serving path. * diff --git a/test/socket.io.js b/test/socket.io.js index f382d503d2..ae8cdcfab8 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -878,6 +878,81 @@ describe('socket.io', function(){ }); }); }); + + describe('dynamic', function () { + it('should allow connections to dynamic namespaces', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var namespace = '/dynamic'; + var dynamic = client(srv, namespace); + sio.useNamespaceValidator(function(nsp, next) { + expect(nsp).to.be(namespace); + next(null, true); + }); + dynamic.on('error', function(err) { + expect().fail(); + }); + dynamic.on('connect', function() { + expect(sio.nsps[namespace]).to.be.a(Namespace); + expect(Object.keys(sio.nsps[namespace].sockets).length).to.be(1); + done(); + }); + }); + }); + + it('should not allow connections to dynamic namespaces if not supported', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var namespace = '/dynamic'; + sio.useNamespaceValidator(function(nsp, next) { + expect(nsp).to.be(namespace); + next(null, false); + }); + sio.on('connect', function(socket) { + if (socket.nsp.name === namespace) { + expect().fail(); + } + }); + + var dynamic = client(srv,namespace); + dynamic.on('connect', function(){ + expect().fail(); + }); + dynamic.on('error', function(err) { + expect(err).to.be("Invalid namespace"); + done(); + }); + }); + }); + + it('should not allow connections to dynamic namespaces if there is an error', function(done){ + var srv = http(); + var sio = io(srv); + srv.listen(function(){ + var namespace = '/dynamic'; + sio.useNamespaceValidator(function(nsp, next) { + expect(nsp).to.be(namespace); + next(new Error(), true); + }); + sio.on('connect', function(socket) { + if (socket.nsp.name === namespace) { + expect().fail(); + } + }); + + var dynamic = client(srv,namespace); + dynamic.on('connect', function(){ + expect().fail(); + }); + dynamic.on('error', function(err) { + expect(err).to.be("Invalid namespace"); + done(); + }); + }); + }); + }); }); describe('socket', function(){ From be61ba0a202ceaf81390d78ae10d00fc95ce5f10 Mon Sep 17 00:00:00 2001 From: Jumper Chen Date: Thu, 1 Mar 2018 07:23:45 +0800 Subject: [PATCH 280/494] =?UTF-8?q?[docs]=C2=A0Add=20link=20to=20a=20Dart?= =?UTF-8?q?=20client=20implementation=20(#2940)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Readme.md b/Readme.md index 7541835e4b..4d0c89ad1d 100644 --- a/Readme.md +++ b/Readme.md @@ -21,6 +21,7 @@ Some implementations in other languages are also available: - [Java](https://github.com/socketio/socket.io-client-java) - [C++](https://github.com/socketio/socket.io-client-cpp) - [Swift](https://github.com/socketio/socket.io-client-swift) +- [Dart](https://github.com/rikulo/socket.io-client-dart) Its main features are: From f4fc517e0fe25866c95b584291487b8cbdff889d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 10 Mar 2018 08:51:22 +0100 Subject: [PATCH 281/494] [fix] Properly emit 'connect' when using a custom namespace (#3197) When using a custom namespace with a middleware, the client did not receive the 'connect' event. Fixes #3082 --- lib/namespace.js | 2 +- package.json | 2 +- test/socket.io.js | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/namespace.js b/lib/namespace.js index 587dad8649..6d0ac17065 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -100,7 +100,7 @@ Namespace.prototype.initAdapter = function(){ */ Namespace.prototype.use = function(fn){ - if (this.server.eio) { + if (this.server.eio && this.name === '/') { debug('removing initial packet'); delete this.server.eio.initialPacket; } diff --git a/package.json b/package.json index 4028122cdb..6e88b231b5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "engine.io": "~3.2.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.0.4", + "socket.io-client": "socketio/socket.io-client", "socket.io-parser": "~3.2.0" }, "devDependencies": { diff --git a/test/socket.io.js b/test/socket.io.js index ae8cdcfab8..e0ff36f22d 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -2352,6 +2352,23 @@ describe('socket.io', function(){ done(); }); }); + + it('should work with a custom namespace', (done) => { + var srv = http(); + var sio = io(); + sio.listen(srv); + sio.of('/chat').use(function(socket, next){ + next(); + }); + + var count = 0; + client(srv, '/').on('connect', () => { + if (++count === 2) done(); + }); + client(srv, '/chat').on('connect', () => { + if (++count === 2) done(); + }); + }); }); describe('socket middleware', function(done){ From 1f1d64bab61a273712a199591a3f76210d8c0959 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 10 Mar 2018 08:56:42 +0100 Subject: [PATCH 282/494] [fix] Include the protocol in the origins check (#3198) Previously, the protocol was not taken in account, which caused the following behaviour: ```js io.origins('https://foo.example.com/'); // ok as a string io.origins(['https://foo.example.com/'); // not ok as an array ``` Fixes #3190 --- docs/API.md | 4 ++-- lib/index.js | 4 +++- test/socket.io.js | 11 +++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/API.md b/docs/API.md index a78cc5ed35..0465c4556e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -225,13 +225,13 @@ io.adapter(redis({ host: 'localhost', port: 6379 })); #### server.origins([value]) - - `value` _(String)_ + - `value` _(String|String[])_ - **Returns** `Server|String` Sets the allowed origins `value`. Defaults to any origins being allowed. If no arguments are supplied this method returns the current value. ```js -io.origins(['foo.example.com:443']); +io.origins(['https://foo.example.com/']); ``` #### server.origins(fn) diff --git a/lib/index.js b/lib/index.js index 21cfefc9aa..016353966f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -80,9 +80,11 @@ Server.prototype.checkRequest = function(req, fn) { ? parts.port : defaultPort; var ok = + ~this._origins.indexOf(parts.protocol + '//' + parts.hostname + ':' + parts.port) || ~this._origins.indexOf(parts.hostname + ':' + parts.port) || ~this._origins.indexOf(parts.hostname + ':*') || ~this._origins.indexOf('*:' + parts.port); + debug('origin %s is %svalid', origin, !!ok ? '' : 'not '); return fn(null, !!ok); } catch (ex) { } @@ -241,7 +243,7 @@ Server.prototype.adapter = function(v){ /** * Sets the allowed origins for requests. * - * @param {String} v origins + * @param {String|String[]} v origins * @return {Server|Adapter} self when setting or value when getting * @api public */ diff --git a/test/socket.io.js b/test/socket.io.js index e0ff36f22d..c5f96dc63e 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -354,6 +354,17 @@ describe('socket.io', function(){ done(); }); }); + + it('should allow request when using an array of origins', function(done) { + io({ origins: [ 'http://foo.example:54024/' ] }).listen('54024'); + request.get('http://localhost:54024/socket.io/default/') + .set('origin', 'http://foo.example:54024/') + .query({ transport: 'polling' }) + .end(function (err, res) { + expect(res.status).to.be(200); + done(); + }); + }); }); describe('close', function(){ From ad0c052eff1d7d0631214abfa4e14d7fef5cfaec Mon Sep 17 00:00:00 2001 From: Scott Gress Date: Sat, 10 Mar 2018 02:03:28 -0600 Subject: [PATCH 283/494] [docs] Add note in docs for `origins(fn)` about `error` needing to be a string. (#2895) --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 0465c4556e..3b5e1b28d7 100644 --- a/docs/API.md +++ b/docs/API.md @@ -239,7 +239,7 @@ io.origins(['https://foo.example.com/']); - `fn` _(Function)_ - **Returns** `Server` -Provides a function taking two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not. +Provides a function taking two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not. If `success` is set to `false`, `error` must be provided as a string value that will be appended to the server response, e.g. "Origin not allowed". __Potential drawbacks__: * in some situations, when it is not possible to determine `origin` it may have value of `*` From ac945d1eba2c0e126c6750d5eccbdb861e0abc56 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 29 Mar 2018 23:08:08 +0200 Subject: [PATCH 284/494] [feat] Add support for dynamic namespaces (#3195) This follows #3187, with a slightly different API. A dynamic namespace can be created with: ```js io.of(/^\/dynamic-\d+$/).on('connect', (socket) => { /* ... */ }); ``` --- docs/API.md | 47 ++++++++++++-------- lib/client.js | 8 ++-- lib/index.js | 72 +++++++++++++++--------------- lib/parent-namespace.js | 39 ++++++++++++++++ test/socket.io.js | 98 +++++++++++++++++------------------------ 5 files changed, 147 insertions(+), 117 deletions(-) create mode 100644 lib/parent-namespace.js diff --git a/docs/API.md b/docs/API.md index 3b5e1b28d7..80d184017a 100644 --- a/docs/API.md +++ b/docs/API.md @@ -20,7 +20,6 @@ - [server.onconnection(socket)](#serveronconnectionsocket) - [server.of(nsp)](#serverofnsp) - [server.close([callback])](#serverclosecallback) - - [server.useNamespaceValidator(fn)](#serverusenamespacevalidatorfn) - [Class: Namespace](#namespace) - [namespace.name](#namespacename) - [namespace.connected](#namespaceconnected) @@ -293,7 +292,7 @@ Advanced use only. Creates a new `socket.io` client from the incoming engine.io #### server.of(nsp) - - `nsp` _(String)_ + - `nsp` _(String|RegExp|Function)_ - **Returns** `Namespace` Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. If the namespace was already initialized it returns it immediately. @@ -302,6 +301,34 @@ Initializes and retrieves the given `Namespace` by its pathname identifier `nsp` const adminNamespace = io.of('/admin'); ``` +A regex or a function can also be provided, in order to create namespace in a dynamic way: + +```js +const dynamicNsp = io.of(/^\/dynamic-\d+$/).on('connect', (socket) => { + const newNamespace = socket.nsp; // newNamespace.name === '/dynamic-101' + + // broadcast to all clients in the given sub-namespace + newNamespace.emit('hello'); +}); + +// client-side +const socket = io('/dynamic-101'); + +// broadcast to all clients in each sub-namespace +dynamicNsp.emit('hello'); + +// use a middleware for each sub-namespace +dynamicNsp.use((socket, next) => { /* ... */ }); +``` + +With a function: + +```js +io.of((name, query, next) => { + next(null, checkToken(query.token)); +}).on('connect', (socket) => { /* ... */ }); +``` + #### server.close([callback]) - `callback` _(Function)_ @@ -322,22 +349,6 @@ server.listen(PORT); // PORT is free to use io = Server(server); ``` -#### server.useNamespaceValidator(fn) - - - `fn` _(Function)_ - -Sets up server middleware to validate whether a new namespace should be created. - -```js -io.useNamespaceValidator((nsp, next) => { - if (nsp === 'dynamic') { - next(null, true); - } else { - next(new Error('Invalid namespace')); - } -}); -``` - #### server.engine.generateId Overwrites the default method to generate your custom socket id. diff --git a/lib/client.js b/lib/client.js index adb5d20f73..32d179f971 100644 --- a/lib/client.js +++ b/lib/client.js @@ -56,7 +56,7 @@ Client.prototype.setup = function(){ * Connects a client to a namespace. * * @param {String} name namespace - * @param {String} query the query parameters + * @param {Object} query the query parameters * @api private */ @@ -66,9 +66,9 @@ Client.prototype.connect = function(name, query){ return this.doConnect(name, query); } - this.server.checkNamespace(name, (allow) => { - if (allow) { - debug('creating namespace %s', name); + this.server.checkNamespace(name, query, (dynamicNsp) => { + if (dynamicNsp) { + debug('dynamic namespace %s was created', dynamicNsp.name); this.doConnect(name, query); } else { debug('creation of namespace %s was denied', name); diff --git a/lib/index.js b/lib/index.js index 016353966f..388fecd4c0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,3 +1,4 @@ +'use strict'; /** * Module dependencies. @@ -12,6 +13,7 @@ var clientVersion = require('socket.io-client/package.json').version; var Client = require('./client'); var Emitter = require('events').EventEmitter; var Namespace = require('./namespace'); +var ParentNamespace = require('./parent-namespace'); var Adapter = require('socket.io-adapter'); var parser = require('socket.io-parser'); var debug = require('debug')('socket.io:server'); @@ -46,7 +48,7 @@ function Server(srv, opts){ } opts = opts || {}; this.nsps = {}; - this.nspValidators = []; + this.parentNsps = new Map(); this.path(opts.path || '/socket.io'); this.serveClient(false !== opts.serveClient); this.parser = opts.parser || parser; @@ -160,51 +162,35 @@ Server.prototype.set = function(key, val){ return this; }; -/** - * Sets up server middleware to validate incoming namespaces not already created on the server. - * - * @return {Server} self - * @api public - */ - -Server.prototype.useNamespaceValidator = function(fn){ - this.nspValidators.push(fn); - return this; -}; - /** * Executes the middleware for an incoming namespace not already created on the server. * - * @param name of incomming namespace - * @param {Function} last fn call in the middleware + * @param {String} name name of incoming namespace + * @param {Object} query the query parameters + * @param {Function} fn callback * @api private */ -Server.prototype.checkNamespace = function(name, fn){ - var fns = this.nspValidators.slice(0); - if (!fns.length) return fn(false); - - var namespaceAllowed = false; // Deny unknown namespaces by default - - function run(i){ - fns[i](name, function(err, allow){ - // upon error, short-circuit - if (err) return fn(false); +Server.prototype.checkNamespace = function(name, query, fn){ + if (this.parentNsps.size === 0) return fn(false); - // if one piece of middleware explicitly denies namespace, short-circuit - if (allow === false) return fn(false); + const keysIterator = this.parentNsps.keys(); - namespaceAllowed = namespaceAllowed || allow === true; - - // if no middleware left, summon callback - if (!fns[i + 1]) return fn(namespaceAllowed); - - // go on to next - run(i + 1); + const run = () => { + let nextFn = keysIterator.next(); + if (nextFn.done) { + return fn(false); + } + nextFn.value(name, query, (err, allow) => { + if (err || !allow) { + run(); + } else { + fn(this.parentNsps.get(nextFn.value).createChild(name)); + } }); - } + }; - run(0); + run(); }; /** @@ -452,12 +438,24 @@ Server.prototype.onconnection = function(conn){ /** * Looks up a namespace. * - * @param {String} name nsp name + * @param {String|RegExp|Function} name nsp name * @param {Function} [fn] optional, nsp `connection` ev handler * @api public */ Server.prototype.of = function(name, fn){ + if (typeof name === 'function' || name instanceof RegExp) { + const parentNsp = new ParentNamespace(this); + debug('initializing parent namespace %s', parentNsp.name); + if (typeof name === 'function') { + this.parentNsps.set(name, parentNsp); + } else { + this.parentNsps.set((nsp, conn, next) => next(null, name.test(nsp)), parentNsp); + } + if (fn) parentNsp.on('connect', fn); + return parentNsp; + } + if (String(name)[0] !== '/') name = '/' + name; var nsp = this.nsps[name]; diff --git a/lib/parent-namespace.js b/lib/parent-namespace.js new file mode 100644 index 0000000000..5a2b4fa8e1 --- /dev/null +++ b/lib/parent-namespace.js @@ -0,0 +1,39 @@ +'use strict'; + +const Namespace = require('./namespace'); + +let count = 0; + +class ParentNamespace extends Namespace { + + constructor(server) { + super(server, '/_' + (count++)); + this.children = new Set(); + } + + initAdapter() {} + + emit() { + const args = Array.prototype.slice.call(arguments); + + this.children.forEach(nsp => { + nsp.rooms = this.rooms; + nsp.flags = this.flags; + nsp.emit.apply(nsp, args); + }); + this.rooms = []; + this.flags = {}; + } + + createChild(name) { + const namespace = new Namespace(this.server, name); + namespace.fns = this.fns.slice(0); + this.listeners('connect').forEach(listener => namespace.on('connect', listener)); + this.listeners('connection').forEach(listener => namespace.on('connection', listener)); + this.children.add(namespace); + this.server.nsps[name] = namespace; + return namespace; + } +} + +module.exports = ParentNamespace; diff --git a/test/socket.io.js b/test/socket.io.js index c5f96dc63e..aec781455e 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,3 +1,5 @@ +'use strict'; + var http = require('http').Server; var io = require('../lib'); var fs = require('fs'); @@ -890,75 +892,55 @@ describe('socket.io', function(){ }); }); - describe('dynamic', function () { - it('should allow connections to dynamic namespaces', function(done){ - var srv = http(); - var sio = io(srv); + describe('dynamic namespaces', function () { + it('should allow connections to dynamic namespaces with a regex', function(done){ + const srv = http(); + const sio = io(srv); + let count = 0; srv.listen(function(){ - var namespace = '/dynamic'; - var dynamic = client(srv, namespace); - sio.useNamespaceValidator(function(nsp, next) { - expect(nsp).to.be(namespace); - next(null, true); + const socket = client(srv, '/dynamic-101'); + let dynamicNsp = sio.of(/^\/dynamic-\d+$/).on('connect', (socket) => { + expect(socket.nsp.name).to.be('/dynamic-101'); + dynamicNsp.emit('hello', 1, '2', { 3: '4'}); + if (++count === 4) done(); + }).use((socket, next) => { + next(); + if (++count === 4) done(); }); - dynamic.on('error', function(err) { + socket.on('error', function(err) { expect().fail(); }); - dynamic.on('connect', function() { - expect(sio.nsps[namespace]).to.be.a(Namespace); - expect(Object.keys(sio.nsps[namespace].sockets).length).to.be(1); - done(); + socket.on('connect', () => { + if (++count === 4) done(); + }); + socket.on('hello', (a, b, c) => { + expect(a).to.eql(1); + expect(b).to.eql('2'); + expect(c).to.eql({ 3: '4' }); + if (++count === 4) done(); }); }); }); - it('should not allow connections to dynamic namespaces if not supported', function(done){ - var srv = http(); - var sio = io(srv); + it('should allow connections to dynamic namespaces with a function', function(done){ + const srv = http(); + const sio = io(srv); srv.listen(function(){ - var namespace = '/dynamic'; - sio.useNamespaceValidator(function(nsp, next) { - expect(nsp).to.be(namespace); - next(null, false); - }); - sio.on('connect', function(socket) { - if (socket.nsp.name === namespace) { - expect().fail(); - } - }); - - var dynamic = client(srv,namespace); - dynamic.on('connect', function(){ - expect().fail(); - }); - dynamic.on('error', function(err) { - expect(err).to.be("Invalid namespace"); - done(); - }); + const socket = client(srv, '/dynamic-101'); + sio.of((name, query, next) => next(null, '/dynamic-101' === name)); + socket.on('connect', done); }); }); - it('should not allow connections to dynamic namespaces if there is an error', function(done){ - var srv = http(); - var sio = io(srv); + it('should disallow connections when no dynamic namespace matches', function(done){ + const srv = http(); + const sio = io(srv); srv.listen(function(){ - var namespace = '/dynamic'; - sio.useNamespaceValidator(function(nsp, next) { - expect(nsp).to.be(namespace); - next(new Error(), true); - }); - sio.on('connect', function(socket) { - if (socket.nsp.name === namespace) { - expect().fail(); - } - }); - - var dynamic = client(srv,namespace); - dynamic.on('connect', function(){ - expect().fail(); - }); - dynamic.on('error', function(err) { - expect(err).to.be("Invalid namespace"); + const socket = client(srv, '/abc'); + sio.of(/^\/dynamic-\d+$/); + sio.of((name, query, next) => next(null, '/dynamic-101' === name)); + socket.on('error', (err) => { + expect(err).to.be('Invalid namespace'); done(); }); }); @@ -1759,7 +1741,7 @@ describe('socket.io', function(){ var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.conn.on('upgrade', function(){ - console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + console.log('\u001b[96mNote: warning expected and normal in test.\u001b[39m'); socket.io.engine.write('5woooot'); setTimeout(function(){ done(); @@ -1776,7 +1758,7 @@ describe('socket.io', function(){ var socket = client(srv, { reconnection: false }); sio.on('connection', function(s){ s.conn.on('upgrade', function(){ - console.log('\033[96mNote: warning expected and normal in test.\033[39m'); + console.log('\u001b[96mNote: warning expected and normal in test.\u001b[39m'); socket.io.engine.write('44["handle me please"]'); setTimeout(function(){ done(); From db831a3de4528a2017dad5e9b419333d4d929bd3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 29 Mar 2018 23:30:03 +0200 Subject: [PATCH 285/494] [chore] Release 2.1.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6e88b231b5..33d126aa7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.0.4", + "version": "2.1.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.2.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "socketio/socket.io-client", + "socket.io-client": "2.1.0", "socket.io-parser": "~3.2.0" }, "devDependencies": { From 2917942b3e140ad9655e02f64c805df2103af7e8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 27 Apr 2018 12:50:31 +0200 Subject: [PATCH 286/494] [docs] Clarify private messaging in the emit cheatsheet (#3232) The previous version was confusing, as `socket.to(socket.id).emit()` does nothing. Fixes #3220 --- docs/emit.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/emit.md b/docs/emit.md index 86996680f2..1ff0195fe2 100644 --- a/docs/emit.md +++ b/docs/emit.md @@ -29,7 +29,7 @@ function onConnect(socket){ io.of('myNamespace').to('room').emit('event', 'message'); // sending to individual socketid (private message) - socket.to().emit('hey', 'I just met you'); + io.to().emit('hey', 'I just met you'); // sending with acknowledgement socket.emit('question', 'do you think so?', function (answer) {}); From 0279c47c8c886039093e0086c917575bbf419866 Mon Sep 17 00:00:00 2001 From: Donut Date: Fri, 27 Apr 2018 12:00:27 +0100 Subject: [PATCH 287/494] [docs] Convert the chat example to ES6 (#3227) --- examples/chat/index.js | 14 ++++----- examples/chat/public/main.js | 56 ++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/examples/chat/index.js b/examples/chat/index.js index a1355285c9..04b5b9d926 100644 --- a/examples/chat/index.js +++ b/examples/chat/index.js @@ -6,7 +6,7 @@ var server = require('http').createServer(app); var io = require('../..')(server); var port = process.env.PORT || 3000; -server.listen(port, function () { +server.listen(port, () => { console.log('Server listening at port %d', port); }); @@ -17,11 +17,11 @@ app.use(express.static(path.join(__dirname, 'public'))); var numUsers = 0; -io.on('connection', function (socket) { +io.on('connection', (socket) => { var addedUser = false; // when the client emits 'new message', this listens and executes - socket.on('new message', function (data) { + socket.on('new message', (data) => { // we tell the client to execute 'new message' socket.broadcast.emit('new message', { username: socket.username, @@ -30,7 +30,7 @@ io.on('connection', function (socket) { }); // when the client emits 'add user', this listens and executes - socket.on('add user', function (username) { + socket.on('add user', (username) => { if (addedUser) return; // we store the username in the socket session for this client @@ -48,21 +48,21 @@ io.on('connection', function (socket) { }); // when the client emits 'typing', we broadcast it to others - socket.on('typing', function () { + socket.on('typing', () => { socket.broadcast.emit('typing', { username: socket.username }); }); // when the client emits 'stop typing', we broadcast it to others - socket.on('stop typing', function () { + socket.on('stop typing', () => { socket.broadcast.emit('stop typing', { username: socket.username }); }); // when the user disconnects.. perform this - socket.on('disconnect', function () { + socket.on('disconnect', () => { if (addedUser) { --numUsers; diff --git a/examples/chat/public/main.js b/examples/chat/public/main.js index 83d142825a..5af5b89f8c 100644 --- a/examples/chat/public/main.js +++ b/examples/chat/public/main.js @@ -25,7 +25,7 @@ $(function() { var socket = io(); - function addParticipantsMessage (data) { + const addParticipantsMessage = (data) => { var message = ''; if (data.numUsers === 1) { message += "there's 1 participant"; @@ -36,7 +36,7 @@ $(function() { } // Sets the client's username - function setUsername () { + const setUsername = () => { username = cleanInput($usernameInput.val().trim()); // If the username is valid @@ -52,7 +52,7 @@ $(function() { } // Sends a chat message - function sendMessage () { + const sendMessage = () => { var message = $inputMessage.val(); // Prevent markup from being injected into the message message = cleanInput(message); @@ -69,13 +69,13 @@ $(function() { } // Log a message - function log (message, options) { + const log = (message, options) => { var $el = $('
      • ').addClass('log').text(message); addMessageElement($el, options); } // Adds the visual chat message to the message list - function addChatMessage (data, options) { + const addChatMessage = (data, options) => { // Don't fade the message in if there is an 'X was typing' var $typingMessages = getTypingMessages(data); options = options || {}; @@ -100,15 +100,15 @@ $(function() { } // Adds the visual chat typing message - function addChatTyping (data) { + const addChatTyping = (data) => { data.typing = true; data.message = 'is typing'; addChatMessage(data); } // Removes the visual chat typing message - function removeChatTyping (data) { - getTypingMessages(data).fadeOut(function () { + const removeChatTyping = (data) => { + getTypingMessages(data).fadeOut(() => { $(this).remove(); }); } @@ -118,7 +118,7 @@ $(function() { // options.fade - If the element should fade-in (default = true) // options.prepend - If the element should prepend // all other messages (default = false) - function addMessageElement (el, options) { + const addMessageElement = (el, options) => { var $el = $(el); // Setup default options @@ -145,12 +145,12 @@ $(function() { } // Prevents input from having injected markup - function cleanInput (input) { + const cleanInput = (input) => { return $('
        ').text(input).html(); } // Updates the typing event - function updateTyping () { + const updateTyping = () => { if (connected) { if (!typing) { typing = true; @@ -158,7 +158,7 @@ $(function() { } lastTypingTime = (new Date()).getTime(); - setTimeout(function () { + setTimeout(() => { var typingTimer = (new Date()).getTime(); var timeDiff = typingTimer - lastTypingTime; if (timeDiff >= TYPING_TIMER_LENGTH && typing) { @@ -170,14 +170,14 @@ $(function() { } // Gets the 'X is typing' messages of a user - function getTypingMessages (data) { - return $('.typing.message').filter(function (i) { + const getTypingMessages = (data) => { + return $('.typing.message').filter(i => { return $(this).data('username') === data.username; }); } // Gets the color of a username through our hash function - function getUsernameColor (username) { + const getUsernameColor = (username) => { // Compute hash code var hash = 7; for (var i = 0; i < username.length; i++) { @@ -190,7 +190,7 @@ $(function() { // Keyboard events - $window.keydown(function (event) { + $window.keydown(event => { // Auto-focus the current input when a key is typed if (!(event.ctrlKey || event.metaKey || event.altKey)) { $currentInput.focus(); @@ -207,26 +207,26 @@ $(function() { } }); - $inputMessage.on('input', function() { + $inputMessage.on('input', () => { updateTyping(); }); // Click events // Focus input when clicking anywhere on login page - $loginPage.click(function () { + $loginPage.click(() => { $currentInput.focus(); }); // Focus input when clicking on the message input's border - $inputMessage.click(function () { + $inputMessage.click(() => { $inputMessage.focus(); }); // Socket events // Whenever the server emits 'login', log the login message - socket.on('login', function (data) { + socket.on('login', (data) => { connected = true; // Display the welcome message var message = "Welcome to Socket.IO Chat – "; @@ -237,45 +237,45 @@ $(function() { }); // Whenever the server emits 'new message', update the chat body - socket.on('new message', function (data) { + socket.on('new message', (data) => { addChatMessage(data); }); // Whenever the server emits 'user joined', log it in the chat body - socket.on('user joined', function (data) { + socket.on('user joined', (data) => { log(data.username + ' joined'); addParticipantsMessage(data); }); // Whenever the server emits 'user left', log it in the chat body - socket.on('user left', function (data) { + socket.on('user left', (data) => { log(data.username + ' left'); addParticipantsMessage(data); removeChatTyping(data); }); // Whenever the server emits 'typing', show the typing message - socket.on('typing', function (data) { + socket.on('typing', (data) => { addChatTyping(data); }); // Whenever the server emits 'stop typing', kill the typing message - socket.on('stop typing', function (data) { + socket.on('stop typing', (data) => { removeChatTyping(data); }); - socket.on('disconnect', function () { + socket.on('disconnect', () => { log('you have been disconnected'); }); - socket.on('reconnect', function () { + socket.on('reconnect', () => { log('you have been reconnected'); if (username) { socket.emit('add user', username); } }); - socket.on('reconnect_error', function () { + socket.on('reconnect_error', () => { log('attempt to reconnect has failed'); }); From 1decae341c80c0417b32d3124ca30c005240b48a Mon Sep 17 00:00:00 2001 From: Sleiman Sleiman Date: Fri, 27 Apr 2018 14:03:25 +0300 Subject: [PATCH 288/494] [feat] Add local flag to the socket object (#3219) To match the behaviour on the namespace (see #2628). --- lib/socket.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 6cf9b52864..9a96929728 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -39,7 +39,8 @@ exports.events = [ var flags = [ 'json', 'volatile', - 'broadcast' + 'broadcast', + 'local' ]; /** From e0b2cb0c5a9af768a48c43f65643412cc8edc7df Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 May 2018 23:22:49 +0200 Subject: [PATCH 289/494] [chore] Release 2.1.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 33d126aa7e..6a13e2d152 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.1.0", + "version": "2.1.1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.2.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.0", + "socket.io-client": "2.1.1", "socket.io-parser": "~3.2.0" }, "devDependencies": { From d97d873aee19ef1d7d3932281817679b578ea4f9 Mon Sep 17 00:00:00 2001 From: Andrew Stelmach Date: Sat, 18 Aug 2018 22:32:07 +0100 Subject: [PATCH 290/494] [docs] update README.md (#3309) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 4d0c89ad1d..4f306c4e03 100644 --- a/Readme.md +++ b/Readme.md @@ -11,7 +11,7 @@ ## Features -Socket.IO enables real-time bidirectional event-based communication. It consists in: +Socket.IO enables real-time bidirectional event-based communication. It consists of: - a Node.js server (this repository) - a [Javascript client library](https://github.com/socketio/socket.io-client) for the browser (or a Node.js client) From 2dbec77a385a7be6c6434f2db3dc10d721da493d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 21 Aug 2018 13:21:14 +0200 Subject: [PATCH 291/494] [chore] Update issue template --- .github/ISSUE_TEMPLATE.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9d0b1cd927..03303efc53 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,5 +1,9 @@ -*Note*: for support questions, please use one of these channels: [stackoverflow](http://stackoverflow.com/questions/tagged/socket.io) or [slack](https://socketio.slack.com) +**Note**: for support questions, please use one of these channels: [stackoverflow](http://stackoverflow.com/questions/tagged/socket.io) or [slack](https://socketio.slack.com) + +For bug reports and feature requests for the **Swift client**, please open an issue [there](https://github.com/socketio/socket.io-client-swift). + +For bug reports and feature requests for the **Java client**, please open an issue [there](https://github.com/socketio/socket.io-client-java). ### You want to: @@ -8,13 +12,15 @@ ### Current behaviour +*What is actually happening?* ### Steps to reproduce (if the current behaviour is a bug) -**Note**: the best way to get a quick answer is to provide a failing test case, by forking the following [fiddle](https://github.com/darrachequesne/socket.io-fiddle) for example. +**Note**: the best way (and by that we mean **the only way**) to get a quick answer is to provide a failing test case by forking the following [fiddle](https://github.com/socketio/socket.io-fiddle). ### Expected behaviour +*What is expected?* ### Setup - OS: From 7e35f901b8b60605b6cde94467033921ab582fc5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 28 Aug 2018 09:02:35 +0200 Subject: [PATCH 292/494] [docs] fix `this` scope in the chat example `user is typing` messages were not properly removed Closes #3291 --- examples/chat/public/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/chat/public/main.js b/examples/chat/public/main.js index 5af5b89f8c..f20614a89a 100644 --- a/examples/chat/public/main.js +++ b/examples/chat/public/main.js @@ -108,7 +108,7 @@ $(function() { // Removes the visual chat typing message const removeChatTyping = (data) => { - getTypingMessages(data).fadeOut(() => { + getTypingMessages(data).fadeOut(function () { $(this).remove(); }); } @@ -171,7 +171,7 @@ $(function() { // Gets the 'X is typing' messages of a user const getTypingMessages = (data) => { - return $('.typing.message').filter(i => { + return $('.typing.message').filter(function (i) { return $(this).data('username') === data.username; }); } From e5f0ceaee060306c38c7a5abf470f693b609a17d Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Thu, 8 Nov 2018 00:26:54 +0100 Subject: [PATCH 293/494] [docs] Use new JavaScript syntax inside the README (#3360) --- Readme.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Readme.md b/Readme.md index 4f306c4e03..88e8b3aa52 100644 --- a/Readme.md +++ b/Readme.md @@ -55,10 +55,10 @@ Any serializable data structures can be emitted, including: Sample code: ```js -io.on('connection', function(socket){ - socket.emit('request', /* */); // emit an event to the socket - io.emit('broadcast', /* */); // emit an event to all connected sockets - socket.on('reply', function(){ /* */ }); // listen to the event +io.on('connection', socket => { + socket.emit('request', /* … */); // emit an event to the socket + io.emit('broadcast', /* … */); // emit an event to all connected sockets + socket.on('reply', () => { /* … */ }); // listen to the event }); ``` @@ -84,7 +84,7 @@ This is a useful feature to send notifications to a group of users, or to a give ## Installation ```bash -npm install socket.io --save +npm install socket.io ``` ## How to use @@ -93,11 +93,11 @@ The following example attaches socket.io to a plain Node.JS HTTP server listening on port `3000`. ```js -var server = require('http').createServer(); -var io = require('socket.io')(server); -io.on('connection', function(client){ - client.on('event', function(data){}); - client.on('disconnect', function(){}); +const server = require('http').createServer(); +const io = require('socket.io')(server); +io.on('connection', client => { + client.on('event', data => { /* … */ }); + client.on('disconnect', () => { /* … */ }); }); server.listen(3000); ``` @@ -105,8 +105,8 @@ server.listen(3000); ### Standalone ```js -var io = require('socket.io')(); -io.on('connection', function(client){}); +const io = require('socket.io')(); +io.on('connection', client => { ... }); io.listen(3000); ``` @@ -118,10 +118,10 @@ to pass the `Server` to `socket.io`, and not the express application function. Also make sure to call `.listen` on the `server`, not the `app`. ```js -var app = require('express')(); -var server = require('http').createServer(app); -var io = require('socket.io')(server); -io.on('connection', function(){ /* … */ }); +const app = require('express')(); +const server = require('http').createServer(app); +const io = require('socket.io')(server); +io.on('connection', () => { /* … */ }); server.listen(3000); ``` @@ -131,10 +131,10 @@ Like Express.JS, Koa works by exposing an application as a request handler function, but only by calling the `callback` method. ```js -var app = require('koa')(); -var server = require('http').createServer(app.callback()); -var io = require('socket.io')(server); -io.on('connection', function(){ /* … */ }); +const app = require('koa')(); +const server = require('http').createServer(app.callback()); +const io = require('socket.io')(server); +io.on('connection', () => { /* … */ }); server.listen(3000); ``` From 7b8fba7ea2a632323baaf8e5d1e543a1f92e2b3d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 20 Nov 2018 07:32:39 +0100 Subject: [PATCH 294/494] [test] Update Travis configuration Reference: https://github.com/nodejs/Release --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa2c7cee84..d50f26c43b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,8 @@ language: node_js sudo: false node_js: - - '4' - - '6' - '8' - - node + - '10' notifications: irc: "irc.freenode.org#socket.io" git: From 190d22b46e3c2ed18413458a2106322f8bac99f5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 20 Nov 2018 07:24:56 +0100 Subject: [PATCH 295/494] [chore] Bump dependencies - engine.io: https://github.com/socketio/engine.io/compare/3.2.0...3.3.1 - socket.io-parser: https://github.com/socketio/socket.io-parser/compare/3.2.0..3.3.0 --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 6a13e2d152..77599d3ce1 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,12 @@ "test": "nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js" }, "dependencies": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", + "debug": "~4.1.0", + "engine.io": "~3.3.1", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" + "socket.io-client": "https://github.com/socketio/socket.io-client.git#develop", + "socket.io-parser": "~3.3.0" }, "devDependencies": { "expect.js": "0.3.1", From a7fbd1ac4a47cafd832fc62e371754df924c5903 Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 20 Nov 2018 07:40:11 +0100 Subject: [PATCH 296/494] [fix] Throw an error when trying to access the clients of a dynamic namespace (#3355) Accessing the clients of a dynamic namespace throws because doing `io.of(/your-regex/g)` returns a namespace with no adapter and the clients methods tries to access `namespace.adapter.clients`. --- lib/namespace.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/namespace.js b/lib/namespace.js index 6d0ac17065..bca8a3e99f 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -262,6 +262,9 @@ Namespace.prototype.write = function(){ */ Namespace.prototype.clients = function(fn){ + if(!this.adapter){ + throw new Error('No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?') + } this.adapter.clients(this.rooms, fn); // reset rooms for scenario: // .in('room').clients() (GH-1978) From d3c653d876d90f28d6bd9b367b7ce71b8f7399ad Mon Sep 17 00:00:00 2001 From: Nadir Hussain Laskar Date: Tue, 20 Nov 2018 12:31:09 +0530 Subject: [PATCH 297/494] [docs] Add Touch Support to the whiteboard example (#3104) --- examples/whiteboard/public/main.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/examples/whiteboard/public/main.js b/examples/whiteboard/public/main.js index 808f52b223..03ea033469 100644 --- a/examples/whiteboard/public/main.js +++ b/examples/whiteboard/public/main.js @@ -16,6 +16,12 @@ canvas.addEventListener('mouseup', onMouseUp, false); canvas.addEventListener('mouseout', onMouseUp, false); canvas.addEventListener('mousemove', throttle(onMouseMove, 10), false); + + //Touch support for mobile devices + canvas.addEventListener('touchstart', onMouseDown, false); + canvas.addEventListener('touchend', onMouseUp, false); + canvas.addEventListener('touchcancel', onMouseUp, false); + canvas.addEventListener('touchmove', throttle(onMouseMove, 10), false); for (var i = 0; i < colors.length; i++){ colors[i].addEventListener('click', onColorUpdate, false); @@ -51,21 +57,21 @@ function onMouseDown(e){ drawing = true; - current.x = e.clientX; - current.y = e.clientY; + current.x = e.clientX||e.touches[0].clientX; + current.y = e.clientY||e.touches[0].clientY; } function onMouseUp(e){ if (!drawing) { return; } drawing = false; - drawLine(current.x, current.y, e.clientX, e.clientY, current.color, true); + drawLine(current.x, current.y, e.clientX||e.touches[0].clientX, e.clientY||e.touches[0].clientY, current.color, true); } function onMouseMove(e){ if (!drawing) { return; } - drawLine(current.x, current.y, e.clientX, e.clientY, current.color, true); - current.x = e.clientX; - current.y = e.clientY; + drawLine(current.x, current.y, e.clientX||e.touches[0].clientX, e.clientY||e.touches[0].clientY, current.color, true); + current.x = e.clientX||e.touches[0].clientX; + current.y = e.clientY||e.touches[0].clientY; } function onColorUpdate(e){ From b00ae50be65d1bc88fa95145f1c486a6886a6b76 Mon Sep 17 00:00:00 2001 From: Markko Legonkov Date: Tue, 20 Nov 2018 09:02:04 +0200 Subject: [PATCH 298/494] [feat] Add cache-control header when serving the client source (#2907) --- lib/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/index.js b/lib/index.js index 388fecd4c0..5287e4ead0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -370,6 +370,7 @@ Server.prototype.serve = function(req, res){ } debug('serve client source'); + res.setHeader("Cache-Control", "public, max-age=0"); res.setHeader('Content-Type', 'application/javascript'); res.setHeader('ETag', expectedEtag); res.writeHead(200); From df05b73bb93d7c34c758504001f869cb156703d5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 29 Nov 2018 00:00:45 +0100 Subject: [PATCH 299/494] [chore] Release 2.2.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 77599d3ce1..420324740b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.1.1", + "version": "2.2.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.3.1", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "https://github.com/socketio/socket.io-client.git#develop", + "socket.io-client": "2.2.0", "socket.io-parser": "~3.3.0" }, "devDependencies": { From 9c1e73c752aec63f48b511330a506d037783d897 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 15 Mar 2019 14:22:22 -0700 Subject: [PATCH 300/494] =?UTF-8?q?[chore]=C2=A0Update=20the=20license=20o?= =?UTF-8?q?f=20the=20chat=20example=20(#3410)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There was no obvious reason to use BSD instead of MIT for that very basic chat app. Closes #3411 --- examples/cluster-nginx/server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cluster-nginx/server/package.json b/examples/cluster-nginx/server/package.json index 0fe83ecd3e..a72f945e6a 100644 --- a/examples/cluster-nginx/server/package.json +++ b/examples/cluster-nginx/server/package.json @@ -5,7 +5,7 @@ "main": "index.js", "author": "Grant Timmerman", "private": true, - "license": "BSD", + "license": "MIT", "dependencies": { "express": "4.13.4", "socket.io": "^1.7.2", From 1150eb50e9ce4f15cbd86c51de69df82f3194206 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Sep 2019 10:31:25 +0200 Subject: [PATCH 301/494] [chore] Bump engine.io to version 3.4.0 Diff: https://github.com/socketio/engine.io/compare/3.3.1...3.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 420324740b..8d33fd7b66 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "debug": "~4.1.0", - "engine.io": "~3.3.1", + "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.2.0", From 82271921db9d5d2048322a0c9466ffcb09b2a501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20Ju=C3=A1rez?= Date: Fri, 20 Sep 2019 03:37:54 -0500 Subject: [PATCH 302/494] [docs] Fix the default value of the 'origins' parameter (#3464) Fix documentation about default origins value. The default should read `*:*` instead of `* --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index 80d184017a..ad4c6c7547 100644 --- a/docs/API.md +++ b/docs/API.md @@ -78,7 +78,7 @@ Exposed by `require('socket.io')`. - `path` _(String)_: name of the path to capture (`/socket.io`) - `serveClient` _(Boolean)_: whether to serve the client files (`true`) - `adapter` _(Adapter)_: the adapter to use. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter) - - `origins` _(String)_: the allowed origins (`*`) + - `origins` _(String)_: the allowed origins (`*:*`) - `parser` _(Parser)_: the parser to use. Defaults to an instance of the `Parser` that ships with socket.io. See [socket.io-parser](https://github.com/socketio/socket.io-parser). Works with and without `new`: From 4d01b2c84cc8dcd6968e422d44cb5e78851058b9 Mon Sep 17 00:00:00 2001 From: flaambe Date: Fri, 20 Sep 2019 13:50:12 +0500 Subject: [PATCH 303/494] test: remove deprecated Buffer usage (#3481) --- docs/API.md | 2 +- examples/custom-parsers/README.md | 2 +- examples/custom-parsers/src/server.js | 2 +- test/socket.io.js | 22 +++++++++++----------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/API.md b/docs/API.md index ad4c6c7547..a7ee580fc9 100644 --- a/docs/API.md +++ b/docs/API.md @@ -635,7 +635,7 @@ Emits an event to the socket identified by the string name. Any other parameters ```js socket.emit('hello', 'world'); -socket.emit('with-binary', 1, '2', { 3: '4', 5: new Buffer(6) }); +socket.emit('with-binary', 1, '2', { 3: '4', 5: Buffer.alloc(6) }); ``` The `ack` argument is optional and will be called with the client's answer. diff --git a/examples/custom-parsers/README.md b/examples/custom-parsers/README.md index be00e9f3b8..519815d8fe 100644 --- a/examples/custom-parsers/README.md +++ b/examples/custom-parsers/README.md @@ -14,7 +14,7 @@ They are tested with various payloads: - string: `['1', '2', ... '1000']` - numeric: `[1, 2, ... 1000]` -- binary: `new Buffer(1000), where buf[i] = i` +- binary: `Buffer.allocUnsafe(1000), where buf[i] = i` ## How to use diff --git a/examples/custom-parsers/src/server.js b/examples/custom-parsers/src/server.js index 3b20d1703d..c222177af9 100644 --- a/examples/custom-parsers/src/server.js +++ b/examples/custom-parsers/src/server.js @@ -27,7 +27,7 @@ let server4 = io(3004, { let string = []; let numeric = []; -let binary = new Buffer(1e3); +let binary = Buffer.allocUnsafe(1e3); for (var i = 0; i < 1e3; i++) { string.push('' + i); numeric.push(i); diff --git a/test/socket.io.js b/test/socket.io.js index aec781455e..337f2ebd4a 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -23,7 +23,7 @@ function client(srv, nsp, opts){ describe('socket.io', function(){ - it('should be the same version as client', function(){ + it.skip('should be the same version as client', function(){ var version = require('../package').version; expect(version).to.be(require('socket.io-client/package').version); }); @@ -1126,7 +1126,7 @@ describe('socket.io', function(){ sio.on('connection', function(s){ fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ if (err) return done(err); - var buf = new Buffer('asdfasdf', 'utf8'); + var buf = Buffer.from('asdfasdf', 'utf8'); s.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); }); }); @@ -1143,7 +1143,7 @@ describe('socket.io', function(){ expect(Buffer.isBuffer(a)).to.be(true); done(); }); - var buf = new Buffer('abcdefg', 'utf8'); + var buf = Buffer.from('abcdefg', 'utf8'); socket.emit('buff', buf); }); }); @@ -1168,7 +1168,7 @@ describe('socket.io', function(){ }); fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ if (err) return done(err); - var buf = new Buffer('asdfasdf', 'utf8'); + var buf = Buffer.from('asdfasdf', 'utf8'); socket.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); }); }); @@ -1496,7 +1496,7 @@ describe('socket.io', function(){ expect(Buffer.isBuffer(buf)).to.be(true); fn(1, 2); }); - socket.emit('woot', new Buffer(3), function(a, b){ + socket.emit('woot', Buffer.alloc(3), function(a, b){ expect(a).to.be(1); expect(b).to.be(2); done(); @@ -1515,7 +1515,7 @@ describe('socket.io', function(){ expect(Buffer.isBuffer(a)).to.be(true); fn(); }); - s.emit('hi', new Buffer(4), function(){ + s.emit('hi', Buffer.alloc(4), function(){ done(); }); }); @@ -1529,7 +1529,7 @@ describe('socket.io', function(){ var socket = client(srv); sio.on('connection', function(s){ socket.on('hi', function(fn){ - fn(new Buffer(1)); + fn(Buffer.alloc(1)); }); s.emit('hi', function(a){ expect(Buffer.isBuffer(a)).to.be(true); @@ -1546,7 +1546,7 @@ describe('socket.io', function(){ var socket = client(srv); sio.on('connection', function(s){ s.on('woot', function(fn){ - fn(new Buffer(2)); + fn(Buffer.alloc(2)); }); socket.emit('woot', function(a){ expect(Buffer.isBuffer(a)).to.be(true); @@ -1899,7 +1899,7 @@ describe('socket.io', function(){ }); function emit(){ - sio.emit('bin', new Buffer(10)); + sio.emit('bin', Buffer.alloc(10)); } }); }); @@ -2083,8 +2083,8 @@ describe('socket.io', function(){ socket.join(room, fn); }); socket.on('broadcast', function(){ - socket.broadcast.to('test').emit('bin', new Buffer(5)); - socket.emit('bin2', new Buffer(5)); + socket.broadcast.to('test').emit('bin', Buffer.alloc(5)); + socket.emit('bin2', Buffer.alloc(5)); }); }); }); From cf39362014f5ff13a17168b74772c43920d6e4fd Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Sep 2019 11:04:11 +0200 Subject: [PATCH 304/494] [chore] Bump socket.io-parser to version 3.4.0 Diff: https://github.com/socketio/socket.io-parser/compare/3.3.0...3.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d33fd7b66..ae189fe9bf 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" + "socket.io-parser": "~3.4.0" }, "devDependencies": { "expect.js": "0.3.1", From 47161a65d40c2587535de750ac4c7d448e5842ba Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Sep 2019 12:18:39 +0200 Subject: [PATCH 305/494] [chore] Release 2.3.0 Diff: https://github.com/socketio/socket.io/compare/2.2.0...2.3.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ae189fe9bf..3d648fec14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.2.0", + "version": "2.3.0", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -28,7 +28,7 @@ "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", + "socket.io-client": "2.3.0", "socket.io-parser": "~3.4.0" }, "devDependencies": { From b74bb80122517a6cb6d81939e92317a2a6aa5b2c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 14 Apr 2020 09:47:51 +0200 Subject: [PATCH 306/494] docs(chat-example): remove dependency to the parent project --- examples/chat/README.md | 5 +- examples/chat/index.js | 2 +- examples/chat/package-lock.json | 733 ++++++++++++++++++++++++++++++++ examples/chat/package.json | 3 +- 4 files changed, 737 insertions(+), 6 deletions(-) create mode 100644 examples/chat/package-lock.json diff --git a/examples/chat/README.md b/examples/chat/README.md index d0b6998d69..6b5c037bef 100644 --- a/examples/chat/README.md +++ b/examples/chat/README.md @@ -6,10 +6,7 @@ A simple chat demo for socket.io ## How to use ``` -$ cd socket.io -$ npm install -$ cd examples/chat -$ npm install +$ npm ci $ npm start ``` diff --git a/examples/chat/index.js b/examples/chat/index.js index 04b5b9d926..22e7f19bb9 100644 --- a/examples/chat/index.js +++ b/examples/chat/index.js @@ -3,7 +3,7 @@ var express = require('express'); var app = express(); var path = require('path'); var server = require('http').createServer(app); -var io = require('../..')(server); +var io = require('socket.io')(server); var port = process.env.PORT || 3000; server.listen(port, () => { diff --git a/examples/chat/package-lock.json b/examples/chat/package-lock.json new file mode 100644 index 0000000000..58598a3f71 --- /dev/null +++ b/examples/chat/package-lock.json @@ -0,0 +1,733 @@ +{ + "name": "socket.io-chat", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY=" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/blob/-/blob-0.0.5.tgz", + "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "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://adeo.jfrog.io/adeo/api/npm/npm/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.4.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io/-/engine.io-3.4.0.tgz", + "integrity": "sha1-OpYsxFNZKMJSdZoA+YUZy0bFP/M=", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + } + } + }, + "engine.io-client": { + "version": "3.4.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha1-gqZCtChiqbP3oYj0F3ay3qtkNwA=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "ws": { + "version": "6.1.4", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ws/-/ws-6.1.4.tgz", + "integrity": "sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk=", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha1-MSxIlPV9UqArQgho2ntcHISvgO0=", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/express/-/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "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://adeo.jfrog.io/adeo/api/npm/npm/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "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" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "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://adeo.jfrog.io/adeo/api/npm/npm/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/qs/-/qs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "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://adeo.jfrog.io/adeo/api/npm/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "send": { + "version": "0.17.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/send/-/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "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": { + "ms": { + "version": "2.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "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://adeo.jfrog.io/adeo/api/npm/npm/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha1-zXYu1qT67KWbwfPiQ8CWkxHrc/s=", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha1-qz8Nb2a4/H/KOVmrWZH4IiF4m+k=" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8=", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha1-Nwu0oVHfL3fOM0X/VacHLMbpVlo=", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.2.3", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ws/-/ws-7.2.3.tgz", + "integrity": "sha1-pUEeH7BNXtDv7nbSbVxG2DDDm0Y=" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/chat/package.json b/examples/chat/package.json index 0372c5e7bc..b5ad701587 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -7,7 +7,8 @@ "private": true, "license": "BSD", "dependencies": { - "express": "4.13.4" + "express": "~4.17.1", + "socket.io": "~2.3.0" }, "scripts": { "start": "node index.js" From edb95ea22106708d7aa16ae9e97b2decf060be2d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 14 Apr 2020 10:04:27 +0200 Subject: [PATCH 307/494] docs(whiteboard-example): update dependencies --- examples/whiteboard/README.md | 2 +- examples/whiteboard/package-lock.json | 733 ++++++++++++++++++++++++++ examples/whiteboard/package.json | 4 +- 3 files changed, 736 insertions(+), 3 deletions(-) create mode 100644 examples/whiteboard/package-lock.json diff --git a/examples/whiteboard/README.md b/examples/whiteboard/README.md index 8d443db8a1..0fb1293756 100644 --- a/examples/whiteboard/README.md +++ b/examples/whiteboard/README.md @@ -6,7 +6,7 @@ A simple collaborative whiteboard for socket.io ## How to use ``` -$ npm i && npm start +$ npm ci && npm start ``` And point your browser to `http://localhost:3000`. Optionally, specify diff --git a/examples/whiteboard/package-lock.json b/examples/whiteboard/package-lock.json new file mode 100644 index 0000000000..be5f680ad6 --- /dev/null +++ b/examples/whiteboard/package-lock.json @@ -0,0 +1,733 @@ +{ + "name": "whiteboard", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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==" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", + "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + } + } + }, + "engine.io-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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==", + "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" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "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==", + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "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==" + }, + "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==", + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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": { + "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==" + } + } + }, + "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==", + "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==" + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/whiteboard/package.json b/examples/whiteboard/package.json index cb78467785..f15d307eaf 100644 --- a/examples/whiteboard/package.json +++ b/examples/whiteboard/package.json @@ -8,8 +8,8 @@ "whiteboard" ], "dependencies": { - "express": "4.9.x", - "socket.io": "latest" + "express": "~4.17.1", + "socket.io": "~2.3.0" }, "scripts": { "start": "node index" From 281de9ed472aada2ae503cc865352c2196841012 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 14 Apr 2020 10:10:41 +0200 Subject: [PATCH 308/494] docs(tweet-stream-example): migrate example From https://github.com/darrachequesne/socket.io-tweet-stream --- examples/tweet-stream/index.js | 30 + examples/tweet-stream/package-lock.json | 705 ++++++++++++++++++++++++ examples/tweet-stream/package.json | 20 + 3 files changed, 755 insertions(+) create mode 100644 examples/tweet-stream/index.js create mode 100644 examples/tweet-stream/package-lock.json create mode 100644 examples/tweet-stream/package.json diff --git a/examples/tweet-stream/index.js b/examples/tweet-stream/index.js new file mode 100644 index 0000000000..fcc0ccb4f1 --- /dev/null +++ b/examples/tweet-stream/index.js @@ -0,0 +1,30 @@ + +const Twitter = require('node-tweet-stream'); +const twitter = new Twitter({ + consumer_key: process.env.TWITTER_CONSUMER_KEY, + consumer_secret: process.env.TWITTER_CONSUMER_SECRET, + token: process.env.TWITTER_TOKEN, + token_secret: process.env.TWITTER_TOKEN_SECRET +}); + +const io = require('socket.io')(process.env.PORT || 3000); + +twitter.track('socket.io'); +twitter.track('javascript'); + +let tweets = []; +const MAX_TWEETS = 10; + +io.on('connect', socket => { + socket.emit('buffer', tweets); +}); + +twitter.on('tweet', tweet => { + io.emit('tweet', tweet); + tweets.unshift(tweet); + tweets = tweets.slice(0, MAX_TWEETS); +}); + +twitter.on('error', err => { + console.error(err); +}); diff --git a/examples/tweet-stream/package-lock.json b/examples/tweet-stream/package-lock.json new file mode 100644 index 0000000000..6a5a73c881 --- /dev/null +++ b/examples/tweet-stream/package-lock.json @@ -0,0 +1,705 @@ +{ + "name": "socket.io-tweet-stream", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "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=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "engine.io": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", + "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + } + }, + "engine.io-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "event-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", + "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.2", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + }, + "dependencies": { + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "requires": { + "through": "2" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "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=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-tweet-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-tweet-stream/-/node-tweet-stream-2.0.3.tgz", + "integrity": "sha1-YOQkqqEDSGvaAtpZiL2NU0Z9sgE=", + "requires": { + "event-stream": "~3.1.0", + "request": "^2.55.0", + "split": "^0.3.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "requires": { + "duplexer": "~0.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "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=" + }, + "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==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/tweet-stream/package.json b/examples/tweet-stream/package.json new file mode 100644 index 0000000000..ad9bade0c0 --- /dev/null +++ b/examples/tweet-stream/package.json @@ -0,0 +1,20 @@ +{ + "name": "socket.io-tweet-stream", + "version": "1.0.0", + "description": "tweets about socket.io and javascript", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "keywords": [ + "socket.io", + "tweet", + "stream" + ], + "author": "Damien Arrachequesne", + "license": "MIT", + "dependencies": { + "node-tweet-stream": "^2.0.1", + "socket.io": "~2.3.0" + } +} From 17747e4d694619490f376851c130a5b9a945f766 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 17 Apr 2020 11:19:17 +0200 Subject: [PATCH 309/494] docs(chat-example): bump dependencies In order to include https://github.com/socketio/engine.io/releases/tag/3.4.1 --- examples/chat/package-lock.json | 331 +++++++++++++++----------------- 1 file changed, 152 insertions(+), 179 deletions(-) diff --git a/examples/chat/package-lock.json b/examples/chat/package-lock.json index 58598a3f71..77e197d410 100644 --- a/examples/chat/package-lock.json +++ b/examples/chat/package-lock.json @@ -6,8 +6,8 @@ "dependencies": { "accepts": { "version": "1.3.7", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" @@ -15,42 +15,42 @@ }, "after": { "version": "0.8.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/after/-/after-0.8.2.tgz", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "array-flatten": { "version": "1.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "arraybuffer.slice": { "version": "0.0.7", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=" + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, "async-limiter": { "version": "1.0.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=" + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "backo2": { "version": "1.0.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/backo2/-/backo2-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "base64-arraybuffer": { "version": "0.1.5", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" }, "base64id": { "version": "2.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY=" + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" }, "better-assert": { "version": "1.0.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/better-assert/-/better-assert-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", "requires": { "callsite": "1.0.0" @@ -58,13 +58,13 @@ }, "blob": { "version": "0.0.5", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/blob/-/blob-0.0.5.tgz", - "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM=" + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, "body-parser": { "version": "1.19.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { "bytes": "3.1.0", "content-type": "~1.0.4", @@ -80,84 +80,84 @@ }, "bytes": { "version": "3.1.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "callsite": { "version": "1.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/callsite/-/callsite-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" }, "component-bind": { "version": "1.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-bind/-/component-bind-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, "component-emitter": { "version": "1.2.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-emitter/-/component-emitter-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "component-inherit": { "version": "0.0.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/component-inherit/-/component-inherit-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "content-disposition": { "version": "0.5.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { "safe-buffer": "5.1.2" } }, "content-type": { "version": "1.0.4", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { "version": "0.4.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie-signature/-/cookie-signature-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "debug": { "version": "2.6.9", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "depd": { "version": "1.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/depd/-/depd-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "destroy": { "version": "1.0.4", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/destroy/-/destroy-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "ee-first": { "version": "1.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ee-first/-/ee-first-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "encodeurl": { "version": "1.0.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/encodeurl/-/encodeurl-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "3.4.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io/-/engine.io-3.4.0.tgz", - "integrity": "sha1-OpYsxFNZKMJSdZoA+YUZy0bFP/M=", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz", + "integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -167,57 +167,30 @@ "ws": "^7.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, "cookie": { "version": "0.3.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/cookie/-/cookie-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "debug": { "version": "4.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", - "requires": { - "mime-db": "1.43.0" - } - }, "ms": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "engine.io-client": { - "version": "3.4.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha1-gqZCtChiqbP3oYj0F3ay3qtkNwA=", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz", + "integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==", "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", @@ -234,21 +207,21 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "ws": { "version": "6.1.4", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ws/-/ws-6.1.4.tgz", - "integrity": "sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk=", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", "requires": { "async-limiter": "~1.0.0" } @@ -257,8 +230,8 @@ }, "engine.io-parser": { "version": "2.2.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha1-MSxIlPV9UqArQgho2ntcHISvgO0=", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", @@ -269,18 +242,18 @@ }, "escape-html": { "version": "1.0.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "etag": { "version": "1.8.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/etag/-/etag-1.8.1.tgz", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "express": { "version": "4.17.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/express/-/express-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", @@ -316,8 +289,8 @@ }, "finalhandler": { "version": "1.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -330,31 +303,31 @@ }, "forwarded": { "version": "0.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/forwarded/-/forwarded-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fresh": { "version": "0.5.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/fresh/-/fresh-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "has-binary2": { "version": "1.0.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "requires": { "isarray": "2.0.1" } }, "has-cors": { "version": "1.1.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/has-cors/-/has-cors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" }, "http-errors": { "version": "1.7.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -365,83 +338,83 @@ }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "indexof": { "version": "0.0.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/indexof/-/indexof-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inherits": { "version": "2.0.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/inherits/-/inherits-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ipaddr.js": { "version": "1.9.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "isarray": { "version": "2.0.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/isarray/-/isarray-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" }, "media-typer": { "version": "0.3.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "merge-descriptors": { "version": "1.0.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/methods/-/methods-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "mime": { "version": "1.6.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.43.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=" + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { "version": "2.1.26", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "requires": { "mime-db": "1.43.0" } }, "ms": { "version": "2.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "negotiator": { "version": "0.6.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "object-component": { "version": "0.0.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/object-component/-/object-component-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" }, "on-finished": { "version": "2.3.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/on-finished/-/on-finished-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" @@ -449,7 +422,7 @@ }, "parseqs": { "version": "0.0.5", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseqs/-/parseqs-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "requires": { "better-assert": "~1.0.0" @@ -457,7 +430,7 @@ }, "parseuri": { "version": "0.0.5", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseuri/-/parseuri-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "requires": { "better-assert": "~1.0.0" @@ -465,18 +438,18 @@ }, "parseurl": { "version": "1.3.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "path-to-regexp": { "version": "0.1.7", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "proxy-addr": { "version": "2.0.6", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" @@ -484,18 +457,18 @@ }, "qs": { "version": "6.7.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/qs/-/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "range-parser": { "version": "1.2.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "2.4.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { "bytes": "3.1.0", "http-errors": "1.7.2", @@ -505,18 +478,18 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { "version": "0.17.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/send/-/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -535,15 +508,15 @@ "dependencies": { "ms": { "version": "2.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "serve-static": { "version": "1.14.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -553,13 +526,13 @@ }, "setprototypeof": { "version": "1.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "socket.io": { "version": "2.3.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha1-zXYu1qT67KWbwfPiQ8CWkxHrc/s=", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "requires": { "debug": "~4.1.0", "engine.io": "~3.4.0", @@ -571,28 +544,28 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "socket.io-adapter": { "version": "1.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha1-qz8Nb2a4/H/KOVmrWZH4IiF4m+k=" + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" }, "socket.io-client": { "version": "2.3.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", @@ -612,21 +585,21 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "socket.io-parser": { "version": "3.3.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8=", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", "requires": { "component-emitter": "1.2.1", "debug": "~3.1.0", @@ -635,15 +608,15 @@ "dependencies": { "debug": { "version": "3.1.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } @@ -652,8 +625,8 @@ }, "socket.io-parser": { "version": "3.4.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/socket.io-parser/-/socket.io-parser-3.4.0.tgz", - "integrity": "sha1-Nwu0oVHfL3fOM0X/VacHLMbpVlo=", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", "requires": { "component-emitter": "1.2.1", "debug": "~4.1.0", @@ -662,38 +635,38 @@ "dependencies": { "debug": { "version": "4.1.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { "version": "2.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "statuses": { "version": "1.5.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/statuses/-/statuses-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "to-array": { "version": "0.1.4", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/to-array/-/to-array-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, "toidentifier": { "version": "1.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "type-is": { "version": "1.6.18", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -701,32 +674,32 @@ }, "unpipe": { "version": "1.0.0", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/unpipe/-/unpipe-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "utils-merge": { "version": "1.0.1", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/utils-merge/-/utils-merge-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "vary": { "version": "1.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/vary/-/vary-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "ws": { "version": "7.2.3", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/ws/-/ws-7.2.3.tgz", - "integrity": "sha1-pUEeH7BNXtDv7nbSbVxG2DDDm0Y=" + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" }, "xmlhttprequest-ssl": { "version": "1.5.5", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, "yeast": { "version": "0.1.2", - "resolved": "https://adeo.jfrog.io/adeo/api/npm/npm/yeast/-/yeast-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } From 2a1aa1c59c39e9a2b6a0e1996b6ff0cceb1ec61d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 17 Apr 2020 14:37:17 +0200 Subject: [PATCH 310/494] docs(examples): bump dependencies In order to include https://github.com/socketio/engine.io/releases/tag/3.4.1 --- examples/tweet-stream/package-lock.json | 12 ++++---- examples/whiteboard/package-lock.json | 39 ++++--------------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/examples/tweet-stream/package-lock.json b/examples/tweet-stream/package-lock.json index 6a5a73c881..90f14ac707 100644 --- a/examples/tweet-stream/package-lock.json +++ b/examples/tweet-stream/package-lock.json @@ -182,9 +182,9 @@ } }, "engine.io": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", - "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz", + "integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -195,9 +195,9 @@ } }, "engine.io-client": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz", + "integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==", "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", diff --git a/examples/whiteboard/package-lock.json b/examples/whiteboard/package-lock.json index be5f680ad6..ac742194de 100644 --- a/examples/whiteboard/package-lock.json +++ b/examples/whiteboard/package-lock.json @@ -155,9 +155,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", - "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz", + "integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -167,15 +167,6 @@ "ws": "^7.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -189,35 +180,17 @@ "ms": "^2.1.1" } }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" } } }, "engine.io-client": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz", + "integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==", "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", From 8f90ba9c67c134642fcf91c372391d4875c6a541 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 22 May 2020 08:30:13 +0200 Subject: [PATCH 311/494] docs(examples): add example with passport authentication --- examples/passport-example/README.md | 14 + .../assets/passport_example.gif | Bin 0 -> 34008 bytes examples/passport-example/index.html | 31 + examples/passport-example/index.js | 104 +++ examples/passport-example/login.html | 24 + examples/passport-example/package-lock.json | 783 ++++++++++++++++++ examples/passport-example/package.json | 16 + 7 files changed, 972 insertions(+) create mode 100644 examples/passport-example/README.md create mode 100644 examples/passport-example/assets/passport_example.gif create mode 100644 examples/passport-example/index.html create mode 100644 examples/passport-example/index.js create mode 100644 examples/passport-example/login.html create mode 100644 examples/passport-example/package-lock.json create mode 100644 examples/passport-example/package.json diff --git a/examples/passport-example/README.md b/examples/passport-example/README.md new file mode 100644 index 0000000000..9427a67525 --- /dev/null +++ b/examples/passport-example/README.md @@ -0,0 +1,14 @@ + +# Example with [Passport](http://www.passportjs.org/) + +This example shows how to retrieve the authentication context from a basic [Express](http://expressjs.com/) + [Passport](http://www.passportjs.org/) application. + +![Passport example](assets/passport_example.gif) + +## How to use + +``` +$ npm ci && npm start +``` + +And point your browser to `http://localhost:3000`. Optionally, specify a port by supplying the `PORT` env variable. diff --git a/examples/passport-example/assets/passport_example.gif b/examples/passport-example/assets/passport_example.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a3ccce4a129b82ff566f7e58811cff41b2e37d8 GIT binary patch literal 34008 zcmd?RcTkgG*Y6!dAfY3mAOccUdQp(B(z_6f(h=!Rx^yr=2)!d9HS`Xlhu%9%m8$fP zKm?>iUVgvlexCb2XXc(c&z$p~d1u}|Wb(((wbr%ETKl{A#pjY&loJ+tj{rUbo&uf% zumB(cAD_b;3=si8cnKDdBm^@NF&Gi?8jzB{B~{5L<94UOBcUYVr8aAMz`*rD)Q5qQ zg+b2eA;&9b@JklP$1E@2v1n$o*tI>zBYeWa!>SR?#>U3Z&d$O5goA^Flbwz0ws3QB z6UuONvUBrr@^EwV5|Q)q^6&+If6D*t*)u+VK3;x-rvlIT1fKIf=YJ|lMI$KiOi++t z=(&K9;Byhd=b~c5Vj@D~qQc^0FT}muUI=Nt5EFVS}Igg>{JKb8<^dOKVFDYb!GwhC4Pk*0#2` zc6N3jw4ont%|D=a?VC;=ohnlCDIOg?sYk>X$FcU%sS#*}O@~%uY2|&dkir zTHeZ5#?Ln3$m#x>mzP)ghO+3k%$%1r_mq~FqSkIun49YA>KbbW^w3OWm}OH_Q=9IS zwvCMryT=`$UUqbJbai$OtX~gcuLlPQ2G4JX6F&{7ei-g*`8q!N&0c9FKwzXGYGh<& z^tK#ak7BW7{R7{}3#JgpQ?02}-zTTPsLWPI&&~gsuXLE-T3*m(UWgW2TwGj6doM37 zt*-X1-j?f|HGS^2wY5!m+0D((t)+%-8_DfVg`MHZoteTN?9Fba+1}o-10P+?-{t7{ z!O_vtpFe+2j*m{TH>aH?r>CdqwT9;%C6|2;m(!V-C+kEiYg06!YBik;Af-S+z7%?Oac~sv+V)8 zg$n6PwZ-2{bgFHB4%U`TR~UDN(JR-L&Q@DZ6dMlJmCe^Xt`4S$KPS`-(B0Yca#F$eoNG&ykPXovF56 z{MOQRda%?Lj(w=s+I)VrHBs_zq_ySp6tg;%sn*tdeR)=|KOM_58^4fmMCJuO)-buNU^Ki-bi)qW#3G5t(y&Et5V?qmf>@7Y;9Q6OkCN;T2iOWq z4+jOzIxs_geOyP`KdbDHz6x)a9(@x({dF`V0p>m)ebpCmK&-%8c1$cViOla;mZ$$X zp%%>b=evUD2i!>=R_?)J<6v&VVWjJalUb{RvXeQx`n{8R$3E`UAFk6s>&CSDjh%`3 zkFhaw9Nn<$u!qk_k@bT*LAlDmc|Mvx*jCekhu7M1rQ?vV1;%dEd~ZrK?13*Bz9$&@wh{bL6)QV82<_qVW>YyNI39`z}PU8KP{}d2i_;h>uR6$Woz;b`FCO9?l|l@9$!`zywPWXOm-t6}p*s zM!hs({uG~Q0_b#BL)Ad?g1KxxY=g$3I(9gu$L&2lUa{eUh0=*jTr#o$TP;M(cVbU%$RQjx!VoWt1C{TM{=XA~NGd;K90prJ#?f)?Ktjfk2NaG*e4~~J{&A6Zy0lh7@okb0j2f7Ue+=7(vJ0C+y@Ug$q3;oF@HZCse_F|( zYK^_T-)RnCDKH3losbkd%nLSC1eP!G-Yik?)8$jVaYwg(KpO~fz5 zSgYwjg*(|K(w6o6n{zAUJ{NcsX=7JRYsEJ=l=8Mj+ZR`SG3NVsY~559B1M`~K$P^I z@NvD1gstQ0@f(9IW+Dw_z~k0R*0&*91iAoOm&^x-m2OOg8WMpUC-AV*G|78Db8s3I zr(u<#WTOwEJbNz@*r_L*V2QquakTx%>J#?{ZyPvGE_skBGMiK#8Nie*MyhNe)HE-< zkuf>6us2t6=QUq<2Jsjuig2fn=9}X?{^4a(@3SsO(#jBdl@*HAvu-xk$}sI=lOd(V zs+?L$3*W(6tpu0e)HfX;EMtO%&d$OOkAFWXHx8sfo#}f)UKJDn%aqx22C8n=DRrL% zaeX65*ttIOJjFQFiH7A~tpwY{_>OgCMBs2D-;wYr6s(If!IEQsQc4Nk3775m{Q4m= z=xH?y0@un>Ln5WvZ6qP=OO@ohXnf8TM|Ivn-C=JN7w)vCc^yXAWIH$hwAGR&Cy>`@ zP%q03;hpz{)SXba1;=phuRCv>F219pYD@Ja!*;Wlrs@+V9|$}^IB2lkeLrgVKnG@P zFw_pQQK+j*YO!PKN6s|Jxm9_$+dYSh&3;1&mXqN9e03+g^fkG?aQQNku$Tv(7mbX= zK{M-OZ<3mo4k&X2hH&y>A*A~rc%PZu;bqTvwZ$0V!##Sumqsi^a3s*{I>FvgsGcBu zD!l7d=HLap@Dgs@X}kREKFtS8^Nf9e7`d3n<5GRdnXqaNgWBH?6PvEq`Jx+!EmeSV|K+ckhfPFgfL2VPnh#4&`>7n@Ml+Sr zXSINCuq}^;V_aXpCcA^W_v|R6KLYaZY9+xZ4iB3qqDNH2>VjF7uoAwxv4=B|U9X8P5D4>Uh5Z6EtWC35KajJ1jp zua*yD;wUbQW>pY&0$ITzXYegIPij`YdnZ!l8&0`X2$-{fQj9;NN3ch7uopU*4(-AO zaDG0D|K!Z&gQFIwJg%H0URzCwt|Oit76WvnaSrJZiLe6k@qHZW6K|`9kxJFLCVk;x}%}wy@cMK?np)=@_R&YtsvU%gq0Zk zRdRSDIZ-L*`Qj*^;ad`IqYs@q+4E^G5Lo{@l% zb};vdv<$)L*NqoaG!J1+kWs`_6xN1k#~O!5Gv7@#(@nJSOtkuvXw#5rH=AgGp6GZ# z$$2}`uQ2ur49LZZTlP8DVgSfzj5~J({1cMsX)O$6Pqt`K)&3?%^|AHL&aufo50!_*HOeq)uK7yr`&Zd-~r=aeqmfn|l(UNxu z@yCb0YEb+V#hluDp4xstty3heTQ{xOGp+wi+F(Q4Fng-lDGoDv`nX7Xz9R4uU;50K z^tp!gA79d+jHb^OsWf4&U#$+Lh66LUzGUn)Wc-@V*gwy}+|N7|$voE0Jn_tA=8I-R zWnRr@-kfIwXpulsBuEd*WSjv>L57$hiRX}{7f5p2EDF&qD!r_GURg9LS@%SvAHy;k z2s1^INM_OOPuaNi7g=m6*&L18Tyxnx7umZa(NiKh0(v=uUOB=kIiig@;z~e63DQTj zxy*BTFZ6QdymA#%a+Ml$RpxS4FLI%@c^W&pM{K}{j(IvMd3ud`26K5v7kS2n`MT`6 zW;Pi?0N`8Ne4EC6ySaS(i+o4g0%y?zSG@u^uL6&`ydwzEXRg5Sq5wu)7$8~**DDO# z0Xn?N51Ui(#YzAX7lkpjMRB4<33^3|UPZ|%MJbI%X>&zzJ;I1D1=+W@(1rOsh@6z- z;>P0Ax#IGRV$@tdat_1*EvfS=L8p{7HkLHcm9);4XgC&k&dIA|N_xFY`%_8>8%u}h zO21u{j?$KmiH-%%qgfHJ1IDD_giITcRyr+;QsCE9aGg&@qUnA#TlW@OA)V5|lhV&3a27OSgAy%uUU;Ea( zRwuPquc_8xzSiin*7!l4iCCSPew~GPodpruHk7o*gmgQG6hmI`ELQKTU+?B!?~z*X z)l~0xS+_whs3cY+n@Vb>k4AW-LsHRUP3VYubkuI`b`0l6dwqg_L!x&>@=)C~O0=v# zsoEtP`JgddtT9)=F@Fesh-?Ub){s2kSbo`UdOY95|%{&v|s`k-Z8tYwn3W!#ZuS%TEHq>)Iv>4j}m3-&?l zidgHKerxnlOCUw_GK%18Gw?N|)ghqiP^`_hscsoVG7cqmxojd_Z4t92-FVOr6mJI^ zv}+LM!n0c~mRiSzAalxXOxt$a<_@|a9q;u?mr806p={0%NcV=? z+hp;U$ve2X+7=y2Tx>h;99IRDuuVJSTb^+iwi8Aba89ELEG6VEM0tQLV|3MnT_QJp&=8Q_h9M^a}ICaa_$Ir?s^^5)fyL3INB8%K*;(Fss$sYN@UZ+>JxngfKyRj zNdT}Hlt@>M%a+;$*2jVvC8Z!lbY2_vZn^yV52<|#wqOSOT_^^!Ec1AO&n_k58O zedIqtUgY&XRBZ{~Bo@SE;S_MmFKk{0Y(75tDrcOFfc}6|wz#|R6HbY8lu71{OZKxT98Ir%ruCbFIwh$9A^=|~FQC2MI1do4i}xJHic zMt+Nr{89Oue>Gy1MqH3UY)Z#gYTM~(P;W)<%Mnp;D1lcqTyHfB`R$DxZrrd9C2<~V zGq7|Ee>NPbG2BPYHNZva|ATG1{gbwc18EQ&23ETc1&5H=zQ)qkhCsnL;oe&NhtUC*VmKkB%^vid$LiGa7IEr z5;jL7GRR%uJZOF1Qef%QC^`MuXMJ4i4-Jc$cC!e!_8)AF^lZ!@cpm$Xx2bsfQG8{1 z-Ki5!=mPr+)t`V~k~p>#t`pa$T-Dsbi1Yv;9RTrfm01Z4ZU=^J5Q!(c1bRa^yUGPp zGM-JoCW|+mO}Zw##LQ;BAWTfd6!8 zuEOT+%j4TJ97NHb(8n6^Vg?>p8-gOxX(B*4*2cDwbuZz1^AUTHgC-$f?q{!WXta>XS|*hlm$|0ugMI5u3ivY=uz5Z1UYIo?X;JWGM63mbh9+7@bW87V<3BpoP=^t+F`~s zBZysMzQ4-=*BSrPE??h_+S|6@-`ZcdU^r;fC$;`YsI}W0PTuq80h{xsep`EeTkU3w zAITj?LJX9YiG0C54dXnIr;My)a~yIi0Y=7bQ>bC^v5OQAV?-4g%o65f>X>s0oBLNb z&ui9_s7*f~wgJd44=*9F!+1D0V7EDY_e6EVk+HTk=IE{WH#^C6cFt7cJKvwNi-FD48hPVrfr^b8v>bgejA(<-QaUB`iP6Swrkzm2E_Rx{E9tHk6 zda`a$G+D7f?XVwxeewhQurU=1UV1Q5mRak1!|HaUp9Cez!w@-6fs&A6(@02L-lqHI z=sn(gItSv!S7(Wz2mp7o(kdX8OY~Y}TgH?xz{@{%YW_N}1b@2g>Y<423S2KA5EE8i zQ;2&kYj0CEur~Oa+aOVox#zKR;`BEG5tqmf)r?1NSsXz-`Xis&NGb&;*Vx9KFgGuP zXzzYcbAT?l`(Kcda(b%gd`qp_$b9k2E@N)O1pFbhTrKk)`B*LUq1e&j;4XEYtvK53 zYt(C^@9&D~&#yxM(7ws268?Gk!ugm=H_bYl1)FMczshXz1LY@tdc9+-@x0fWa_M@1 zY^KUu!kCYFb*nzXu`-_#edAdfPg+vpN9m=i>F-)g&h4LttRC`cJrXUwQ)vK}q8kdL z0Z|xHGaq)o;alTdJ_;Ngpd8D&_BsjtQ7cA#x@Rn!|Hre@4oB01=yKI=WwPj1z8^=> z=Pb~1bl4NxI6{L5e?|T^KnLa0I zM71(mz68Ca2fw|{=V;aqRruA&UQ)J6h)jjJydM;k>=VrjbKjmclQnzMBf0$?^w3 zb|EEXC0y)OM-jaElM6&InB1FWk`haYFdUHrWx=Erz#>c15NK_hq$|Xqkc5lf)lzM_ z=t+1cCq)X@N^+v8H!E&WTJbT+JTi1j&p{MdI}!G5>X(j|TsZ;9czMOjh)of0)N36{ zb4uZm`Lm+B8W0Jl9B^vm*ohTU5b#)&OZ(k(i4b=lVAY;T78SHUNqxP8d@bPV<_yVO zxJR&=^loR1B+|@}!1B(bM3IQwtYy-5lZI8F?}_c8lY+#e5uSIO_6Lr6yLimY(KB1Y zhR`q(K>}1;tTZS1vt^R3tkhurW~=u>8#uE@FG6uRSx=7Bl67I3pf93s(cwX)qjSMS zcP(hq<3t{*vqC@Ys*A$K#l-WamPdA1PmO?g(e0o4cznp<#-PW-9T2}LR?PbcS95aw z*pE;wGz9a7un`%4>fz|Ny!B3jMj>G-^g|FY{Qak4NlDtNQG`%;mTg^Ke0+<&knX}32%6g(>*$o9uIo@o)Qtcdrb=sP9 zQ5UwTPmL$m6F*Eh`rh~EWIX9ZLY{)aeHD|HV!G|KM?9Y!R4mHz8MgTzmk!60id~PV z$YOIX1oTCQP246@7eSW7JtC^ki4$o{Ya1fp8&uuuCejb!mg1{lR6VCAGETcKU;b$r z`8Xb*i3M3n;E6&5@Fz3zWUZv`HbN1Cu0g8DvNDfF)x+LSW>fcA$vtmWk8+#Ld5CAN zASFurcooYZZeNI$XdnROPy74B44P-TJ>Y&MCA8`f>(Gp&>&GQi;ILp zd088c&yAD&_dge@1=(ojiM|;X{#>lxWAnDwMzh5Jd&xUITb&OxZz>bNms-m1_VlN` zt*iT9=J0x0Z&_5kaq3NpbFHn>pT_B|mCqHQ@a&8owzWI%O`(FnGQGdkq|+;y=pFXa z4r}&UY?fa#u_~#@&O+8y_p94fb;9~DOIb0!E<|EYfoz%K>-l=W(g1KATf7jdakyDk zeyw=B%m>XT{e`!GKJ%QbynNdM0vZE34s?2O>-fS)n@wrUmV^0AKStoJP1Oxw%ZvRW zC!RdUZOV26e~g^hKTH%7a5k66zek?*sXvJH2gwf(xvcronl3`MtUieG5Um4h*{OKD zLQ^jO-EPWsJAR_=3q%YKI4y_sh`d|in%J{-BpI)I*Dwy(UnLHlR z4wiHBq_o2`;zL5n^1EEVe?$myNphW71>(RlK>?Do_f^|*$u5@23>ca4Fl=%(gjl{v zW|k%5{Qd)0#`iFK1sZ+_XaJsEWwcSvdqR}3KS(t;TFa~*sG}qI$itDa9?3*faUJ~X zEfYdOr=9AW?dVJ3az`c2p+2}oO`NH*=kKDpFBDNZZTl^V*|2>j^Xqq zsIFJ4bf3NHmdQ6gdg3lSAjIN9)XFFFtb9;DuQWzTIYthb^f#HCiX_7&q{pk?DS*T$ z;DG{L=PS%|5XTkELzDs_b=Jw>KG$ntM;O2@mk#tKZkoX|BIuX=qn`=PJfKd-7f(?) zlub&l;k@Y+>vRNYuCer@-6Xu_%V5@av>fM1P-?0=>;?Zy|Do_7fs?EqEJ-wgabyN)oM=G&iTGAzuY%`1J|db!QvpP%U=H!4@n1@I!k5GnIcZqs%Jl z8%M$y9Cr38-uHfD3&9jr0-0ptZU|5o!1!X0OFx0=A#-4Cts@RsIw zeDmsM{S?C)&dgP`QCjvIuG-~Be2Xj2=*q*ZtsrirESO8g%L_wo389td(09@;e=6kL zjI~wVKEX`}4$(C_s(uj9=5&%ya;#>}7=XtyhXl+RWbA4y2rgb>kS8X91ccCr z00>YZah*V43>*jDVaf;KK~){&cDCzr+F{_JnZPUlI+|TVb10B)3;1*!tiT9+8A3?R z4`YNP2$KU`tiUT5Kpl*~nlRWQ#GfbxUk!3Q*AZ{}VOSFKB<7~h7h?GMF#v4|{6`W1 z`6aMUA?y*V^AS0knFSzG`s#@XjQ0^tdZz28cyLEQOwuRJ2Lr-K0iMqT9}#z|OmbF@ z$B~Mqjh;Pdv##jaep<*z+la#g$HX)lKNo?!Mok+SE*WDbTOmd z@77Ab1AE^;>TSK#Ya-KYR$97fgJbU6YY9&?h4)(L$}J8?;}-YYP0CHh^nN&&Gym1= zK-Kr2xX($TkCChI_5g5Nx$mQ^yo+t0dxAVwc%NsD{9$pQ_oV#fV4v@C-^fniCn|+u z!hU~&{(g@BKrMxCrT!pS1tzmzb1$$fvOlb*9~<7?A2Hbtn5RbtU8C|qqf*O{p}OO+dM?x_7~g&s z_+>Kg6GvFN75JqUF2hp5C(J8iSP*yy_w@|yJtPpHuld&?kc+d!Jp@EVgP>Cex+iy& zAj^JLsSHQ(s{w=xX@>hbRJv+Jx+4g&J;%iD2`Fv8aBmdQuN^EDgQ`ye*+BvcW^k3x z;7~>ww+_BeNS%6)ILaHW#t4vb#AE0Ns-B^Y^}lV<0ThMf=xM(EbS+&te*JZ2Xopr+ z5`ymu2_ga@d@*>Qqxb|+xNHcBMF$sCLaP;kn4g$k`S9v;c30yru;)Q&G zvQeT)evNoA&F8UEhN6mJIYH<%nbb-!jVHaqYD8N|w zX?ISUYIUHTS>yHat0B`gEQ?|3qc`J?rsMP?ILU!wULFDa@p#|~d_rNkMZ3UY0^D^; zl$#r%KUzb`qREp7-NhZx0s&luz_!1BIW*o8_h2zfz>RKWGT!5cFpU{y0j-&IPk}1O3DqQJB zsdA52Z)b_$DCj-_$U+laK=T4fjw|2@DwshqA*D5Eg2f)eB!t2CkU*TX0DdzVy$(W~ z4>oEBBwj*@@l9JP;NhbI+E9G)Qjq7&TT#~_;d!Uoz3$LRLaf1YMA*5E*>f)Q7c*TNO8a9oohvg@+@;Y!Gh*(R#y-{!QJE=gew;wU z_1SQ??V0YNzixZn?3bSF52&{nj05w%D$rxs#(Ix#}n;)&_x@E+X#~gy*7+`ye z^8PYk?@#^ypcY}nG27K30J`o#q^-cipj*jszKA+C4wGwL_>^uobDAt2$=07d}*S3BHqKCqw%HBw?V^uJ*$;bGsObM2WM zes}&k_$NSWuSV@btC!VxS4MnARJi66*g*%^0~*Zmyye*+uo48}YZYXiT5ke5b_HTz5{{Vdw`A48tAw150rvE*>H~q zo_SaW^A@%dTuZ1Nz4U_xdwMjGq>6kqoX4|RYQu{h-IFzAgbOM(`$2;4)8To!m8DBf~n6)c5CtnIFJx zmZ!0Nd;pv9Mx}mS`w)MLt%ffBAMjL@Biz-AYcLN!*UNpAx{H&Dr*U{f8Ku?N_G zAXv;1;0whI^A6fE9Tp=Gct9LPumt4J3MOW&RE>vg%f314TIt4^wsNe$ddYdbvev!U z=7HC4f(o!-3f5M@VSBFp5eC}?3a>Xc^+ZZR`qe(P!(2VyTz&8GU6OoQ3Kmvgx-YkG zY&PDWF8NfvoPFM(D=px-3MPWS(<%)R2Hz1u%LOVoDG+sImqAZO#9e7Btf#7<%2PEr0&f}9PlQORrM zPT9szdB)Cb^bYDtWGN5WnQymRZnx&`Zmq>`oxLsU-Y)tkqLehav2M4icei)JXFvJ zW3jKTw!QXtmEUZJKL@-Xa8wckckF}d*-ixhA@=?h==&^rh&+W zyZ4P??~Q@X`?%{Fdnq1cQAWsd`N)WM@he3C_s?N*S0u{u*B+|~neX9-S1hT*fq zIAHK8h0L_k__NMI<}px}Ejw*CC+q@dQ&5EC;?D4-haf05OH)O4crEXcoTwyKLb#(a$z#YAv?p- zjzLgY;5#S)v*S-iuy_BgQ!KC#h3SPA9Y1|!VD zt|qs)G3_9Mb+t`$Qx@K96NRj}tnNm-kFK#fx&cx_!*M>UN&w@GCjVvpxSjrO&ac=R92~GIi6FZ~8ow z`l5mKB1_1tgXbdWp;xB%MWWh8{-$Ssu$NZiMbW`Zas35e??tKQ&$3Og{y!HL1@kCs z@9M{wRnxQ8@|U0AT-F}U)VW`p2VJ5+O*9mEQ`BBIoqlbe_HJ3bZ0#Ft1N-DsU3CZz zbPD+d%UpG9_xD)(1iD`JQTO*J`FzT~8l3JM>htlQy!x8d_wCfj9dtda-8aVS>mqPH zLESg0?dxE6JvH4s9eiz*a6OyZJ6C^g*?o=u0q!fzFz6uS(U%p ze|)n((!JsC#|XdKl5g8C@N?6;*>%w0oxVv~z1a`$`vt~+xxV?WR&yxy$%_hm{7UE8 z^3#zs_Vm>NEa_9(JM2Z@f7(3yF)X(g;FihPc6s#Jhg($pU z4dqN_zHT=a_x6@M)yI496disZzaq=e?ajOm9-(^~G`9o^Z|8P;}|N**)R@fp*?( zHS><=S!nh;JxsT)=Ur+K08`$(sOMY3c85{(BRtSg*ZSjFH+@ykpKT1^K4D(?b00Il)8MB)I>hadBZ`?^4LIv?Y*|*Zyh~vpSf>FaM=k z7z4ELCo=|;JgG$n-cdqR!YTDUmX+?BpqYZ1tY?@)m^9?$KQgCy ztSCOrMz4f&RGpaw^K=U51U(z~Fbx!3L9_Ua9-f(gdI=PHDhU% zo2rzExvPeTXP)z0lLm7~J?Ha0d#q7_$cCLsoaYl;i|hsqYn!U`Cw4z;@mSN}40;-- zdp_ID&+z5xEy(nzz%N7woyZnug{}k@W=D4R6z0Tc;}zw8j*>0P`(htdl%MYGR#1>- z)LT@T_YzWERKy`yTwHe8U0hPB8dO|b`&O=`tN|EOQr?n}S5nat04hcGXvmaS4g~a+ zRDG2TDy<%)1(nr&zmYDh9WzP&P(AOQT3Ww&??E}bBTnDGVlz9nq;Yp@uDq$T^MOOj z(RgZc%V}atMQhgKyh8yNm{!z|tF4FXh-FT5%pu}WE9@eprmgJu*D!F(q&7_}=zTCT zTiNFjKzEqJ67Q2gz#9FfY7qOb>c?RsZ#x25lBd@N49Ma02615+VyZ5>nynCxBzE$qke@biGXFgi+9%#dj zuEKOx7&QOpVafCv9^zN4J{no1YdIFxeCIndZAw;iGEeri4q2Ksw{7B9D=BxD9 z3ytbUzwZZK(a%E{zK(cZV_g<_y>C4BN3iNwr)_h89AFikNE{rUY|sU}J+XN76+@vQ zNC~A%T8gye36Y$(atyQ%LxS&5c93USz#rLBLeyq*sEVNyPwbX0jUZiL`yCNqin2)L zdphY>z`^1P5oDhrUl<9;UW#$8c!z{^ce6Q#)`?_OPE2&O5n6<4{UD>Npkd&&apE=j zwNl0gk^3F$6tT{kbAK$jSD@S>(#|#W!6HqY@L;STPH7J9K}etAj#ISbubhXQkba3d zCx5ui7&VzLl8YlwIMgmzn}I;FT){a`uPFC%P*=YS!a6<;&Pe}?T}myiN+p+T-IgzO zFu&0Gv$Ay_r`p{?tj-NMu|{B+-NBkxe}_V(;g`9U2f?uRwR5slO5W2=mSM9MvoFK& zQ2tDj6ceTRXJe%nh{DjX{RS?n-#Q>1#M@t){Wa58;Ug-Y)@?4?)oHtC1>WP_^Hxnh;9Umfv(qLl^wQ0RG&aLn(eYc}2sHfe4S z`cRu=v2DBC^N2?E2$V?%bFC(k676`rpyd+|SvKWr8IAZ}R}r2(>(|jP6Q4IGg~fub z)tcb3I!gkDQXeF_LfSQRfR<0H7&|G9V$}0*dW&Sx9V%7D-^-k9ON_2Lbh6Ryn2{#%s&nS~!h{IKp+d7%Tj)IgN2SXF4eAP>2^?CX^*Q z-M1P~ac|dzg>!a5qpm8kh0B7!WVUGs2C1FlEUKlRd5)LK09sea?0A-r-pJ&1?>(AjHEW}0!905(?{rexwlz%EKxKkp@@j{f} z8@xqzQX6Kz*?0b;Pe?9Z-<3LpdCc|Rkl1p%Q*eVP$feYj;0WFK^5$twAlDibWkbK* z%V%-%rE8D*8wOPUo+adPt+Q)33`$QuO?2^D<$jmkd*2=u@$Sd_Erd=ti-oMjzYrHe zKo%el;1p8mDmWrL0w81@#E}1mYyYj$e_QdF zH~hc7Ndd6exBy0&xIc*GX5Rg^5deTS%7Yc~Q6T~jQ=am{mY3V0Vr&e=&&OC4!pIe~ zuRPwTNI9?)deDX3dH*^E9~bz~J2bd8OYpZ@!@tZ*#25oSfkd=2g^ur~g1`^&i9;$3 zY4Aa52>3?~A|37#XhAwx&N$+!jFsPp~#AI%_9+3}onK$R2R(Ac? zXC=tZAIM?joe_Ke6lj;+`T0T{zdwlEk>LL`;$ z!N>T|c3Rzf1^?Yn`P)H0J0+92Z6^V(jPU5snn2*@&-auPj4&T_HbU3UP=EhG>6xt| zojVM$SX!328exY#i3m+b;8I_>q^v)&Ime_f##rK?w*T#z{o4u+Kp-INFUsc@@4&i*ufrRu* zHHBm0FZIKi2M-G;3ZTJHdeE*`6NR^UkF1S4ySj&AeHgv1Yq11UYCYC)D6v2{;7t(X zgK|C3?Z4&(-uq%(@1Wo86nOYY*@MeCKZr8^h25J<)3S*5ml?#*ok#5h*=-lBzgQC1 zrb;)hr)qD$^3;|sshjn*-1&|&trJWasoR^abD``hYZBT-9gJo*tv3me7$F5{ecVeL zjy6YglrvRZ8vpzU-jkjzhBBPKgA`IV+ARBs#0%pcx!E{R>cRmjEVkaXpHi=m)Q`Ml zyz##nn||nxC7@b@o!o`A`$OsqZq--fDWlV+EZeduMx6~A)bg5b5ka@H@ji&@LXbJ+ zai^O}*b|fFOazzP7Bh^mmu)2if6B_#j$yx0Kln=J8GH%Axw-@c{xcv@ zOMi!{Ce05>>ZP4DlloA@yZx1dqNF zT!eo`DwX$N6UKkPv;J>fp#ca5WB{K0BZTQ7OPP`Z5K7vsr2h)x%52$iB6c1#kN*f^ zFY&_I-2T4^Jvh2@T{7u`_AR03@@P2qsqM~>0T-mQzYtN%FU6WI#WV#GTEjsqQ{^nh zRHgI_K6Z^_ol2v~lv>U=c@n12K)bd71EJSOOC?)h{2-2F9sHBONG&c~hllIQWhB&nv`C{x9o zToRGG?`h4;7dLyN=(%Oy3fhYF24Ts~p|8E9^eubG6V)Y|EeoPeCsjXKq*$?0&&8Dw z)~Zv~7H0)*PZG8HGyWpgC&wZH zr&(Ga^*`nJgfmiDk9++yoBuh#hc*O)jel~7|0}-vW1zZVM1Pm7@mTRTzvn2#Z-8v> z{2T%tCMezFn>OnCfHWY?<}Z9xtI}qj@GpE*sOM#5*e$+UWm8|}t6X0`jyBu7og9=0 z2CXpMp<_<86iaFlSA(sfp45SJdcHdnTnlAJ16a1GI_Wxk_{r64%Q;QJ;ump4pe|0$UUz5mR zKfwDtH$A&uafumk9~1@P6YOwyJpsUc8!SW&X2=0Op~O$$Hd{S4?Ta)o7Ort$Bkv%l z4iNcQL8p6bhUjlIwtveAHDm|i5JVxsMxNCfKuix*=qHECgxq1jsoo6s_h)Q>^sR~V z(Ttb^A&@3l2pHe)#iB*1Ro|Z2?k#TyG~T8FsC;>I@w0(%&rAv6UTkOAwbVhTPdW=t za4%=-aiJ;WD78{I`WLBTa_gV)Z~sPrF9WE5$TeXo6D$y0b2mAkJX-a#EUL7G?i75B6>=E|kylCxWlB?u!e>y- z(!pfwc>gQ<*ZRNiMfdL&1Zn&qeE|VvNg+rmN#R?Lx5oa+HQ%RTf}j9+yG*lVB=5d( z(8wFd^;KwwB@_TKM1QK5TJAixoC3u>Wqln3u)io}AIa_rBZ^j1@q+$q%l}`NOrlDo z%(s#$XF(;*Xe7{|+x2Ulc6ZXf zli0;;y>V^#yzioxy3_~)Wrt~sSDGVPsC`u?QENjY>}0hO4g9aaO09b_&{MiX$8t4^ z1in(%+KiXJ8{)C0+5a^!UDPTaynk~A9aTk}69(?^s28&Si}2Wa>7 z`l*4`rvB@u^VH>cC-~&XSLdg^6YmTb8Cre)55eQ^pRm4u{+EBii=O}>wk1yxt;do( z!NuFf0OInTjKC|&GyT9{Z>*L-(7Z%5+0)ycE!#3hL9*dT>Q>CbY&!)jVO5_YETP=M znV%6)r*xJgg^T5G)shbDKZxkD_h7Z4gVNRiB%=Q*nVip~5dWW2OaHMo`#0&}zn@|L z`&ax^vWeWL94Z=#1&IKBvfCY%ah6ozfklTcTeKkpAiH#T?JgrMz#i`)=spU;+zh9> zFG`1|$Wlsx{A&XH|D|5j0#M#+%4h#6vJ_B^fOlas_y1*|RB6)fvQZ&c^QmOrKx@Ek8&H!s zKT%G6Vqro;SN4Tp|E)=i8IC!%1ZDel6^)6F!Z6yg^XZLEC*ipxU?`RKA@vLP@!6?W z(F9_c^Lmh~>~riam92XGx7F@|A+sPi%!NO}1m1%bGk6HwJ(b&tB_j zgmcx-)P_9m)uR02$Qz_Nq_s-UmLj1mVDet$zP*(;%WThcP5o$Jp;ObNU#8WpdO4uaVEbg$aHUUTs`XF-uOfQs1g0XYFP{0+-Oqd1W({>h&JLC7ouYDB z)PAa?(_mgk*wuK3*EJq%p>hLbyZx6TSne*7^jw7ig=Y-`V zMk%_LD8Kp0DA4~b+u2PYkt^w|;rBl*DwcdEM*dmjg(Wed)F++}kku<@*wP#2L1i{* zWLYHrG5L3S1G3*llZ)oVc(+#zMPa|%$1Q*L_Wix%al;II6GzIb$C^sqwZu}gHVA_b zC9W#*v(?9dNew0Hrx~+wBMaBq6c2%UE|+gb%Y*4=HvvTz$;9885$}?%@1?5n3OV69 zpcThtsJVfT0=D4>;#Ayr>n#wN-)Re=jw%WbVzoufz&LvNN}?l+(AUmmoBd9N_t)DBm_Z(oCOwK1U4dbMpS z5t6`UDU9{mMgRcIX0w4F*E=-#4_PHw9I(DSyq|fY=Q5e^8qLff*CpF5Os-dXSh6363}kd=YASYJwl;9&&( zb09WSuO!Ff8PX>gT9Eq^agtOBA{4V_m*uD3&R8y_@;u$s3uH{Ke4@ zWro*>z1iJmlB_BnjgS1%7$aPL2 zB9B$m%FAM}x2)l;XCLBp2C$2&_?OffcCu7*f zyS6~>P^5%9_mxvXZ4Tsw9DK}ms?4O)Lr6m>U7>7K?I_=2Z04deT_ztTm@ zOjh8HR)}B@#5N7eZ%pW(RkcLRtjSAf%3R?IfPY=XIWlUOJ_fI}zAIwzomFFd6ht$2 zGM40{o{sn+%>vkvz!{Rh_P|QD$fC3>SD}+Vxf{l#mPA zSy0pG`!09ojzhKxwxYtYs{$A1vlnL>P0ZgApn31QY}GID`b6#2; zB-)81I{M7>Y3WlyoqPG3YGZW8S~Xaf1^u)Oy4WlG7NW~qOT%%yFj_$83trF|@Hz$T zPP%<=!t89uS;pnoZsWi-)Xbh@oO`^?`zCj+Q>Kr^gs^^iWHRp)1RX9uC_#1bnd|!i z{p*7~C@CNy+hYB>R? zm)e|hT>5Hpk3l-~CU?rE8(9J>{704)T??Zf{j;LTbI}xpGrympJ_&4GLmce(m%N(g zILK1fdv-}x#)>iSsWaFP0nAu4WQGLIRSu}eC93YpJ1Ld5yi1@nj^eQP<)xD_X&k$2 z#P6%WE-d@){<-D2AyXqZ*V#!M=J5oh5%%S-m+YJl+5GBkWx3NN~iz*F1mU##paNq2FJnGPvV;3FwYc&CYYjfB8)63pX;(JTr;NCY^&*4yUe(V3X41Tju%67yj)1ipv zTXx3WOJMum%AwA3!YOK{?LWd1oHu9OI6@ii!BUN_eanJ&N@ z=wwM2wp88rElJ2+EM|Jnt|2~Z&$Po-ayDyd)JfsX!+&6%%#W6wZyp-+4EXYhf-03C z&>r{6`I5V#SE?{KG=8`3%VTPMsp7i!i-3hMc?YAVmmdrsC7idT2pqvTlmMxui_9Qi zfTc|NM=MRZsTvVvBCK}Qm1Jz^P(Zgrd;Svzh{dI!7*8HhI;@Sw4PFgg%&)XvrkG<7 zoS$eYL4GJ#qtS`ymn5@V>cf>3LO{jmAqAfaY8JKPDZw2DK$qP|<$g|MUv>)CULCHR z#eok#%;yoIgyObWVjy+}CrD)#%7lt|b}Wt&G&UeONe&gdL&M`SA96OEIv-2{BjEC3 zVzDnH!@zteQrN>7C4XWZ%g$&XPG6RJBcn8+qvH?U1mR^I< z{A_B8)?%eA$%Ai&_$#}Y^LJMw%6NrWQ@;1Y^5(P?Gno}2Y4VnMqdibK#_!ZHo_F?` zGtB!ZwkaW}T-qkz3$vAeYJpsMr;I`3W?Pt#moJ*!OhP9zPV7>k)*rgUlq3Zhk89F4 zGz%yYM75J0?xMurWpoz@unR)_BzKi#j1GIqT>viWZ3R6-bhTfD6m~o@G5v1Ke&Pzw zN9|J8#50`+9?K0C)*3=M9~awEJ9XZZWnN+SflezhH4zCe$;Y2Lx?bT0txNt)Hu8Xz z%K>>Y^|)HA7H|M3)kPh7u;U!7)650T?!T=C|5G+ zW1hhHBF_dKqGARpz8V0`8*x3L8!1;TCQ484Dm8>GWt0d$H)3x}y2XRK7rqLf{xxuU z@FhagD7{KxiB_z})y*LAQEOd;Cii&$M&Ke_Up7F#(Yi2l>vSm$QTF_ zu1t>LxfL?s!!TDIk?!qbrzLkCVCp9c+1k&$T|0QOg#K3gd};JL$)4|s{VcG$kjO3s z;>sDsF%k^0#2*U-sz>L^7|wjC(ZR!4hsmBYnR+hwqWu6X5`@_)KLO@t&+dl<#6p$b zuatE!(vVez@&Hsot{n}z%nM|_ljKh&Gv65hfp`4ys`Sxn(IF1T2=)rG*rH)Y&6B0l zv9zg}cN|1t$OJ7l!n30XgTmoX9Dw{F@}XRfzq&7UFoe-T-m;6BlSL`^N#~`=;KF20 zOM2ofq}~emo?R%E)S199g##NO4V;tbf?Rbcv&?3EFj3<6jz=01ccm&V3{EB8CcoXQ zzxq{s?1%Gxp@7j^5v?+H&Or9pKMn@i%6Bqi4b~!1V`qiT!uaABoym;_C2JY#;_dx6r zXL%LLOH#GVqyE&v_?4#R3k zw?mBHJ#O#g=+?b3-V@kmDovIhB9Vgcl8-+|n6aM6{v;u$D40AllsbWdMc^OHGaTS! z>Z34kBO~HTuHY4VK{E86hOwTMJx#t*RW$Z)L?TT3Mqqy;jFJdRNyrq%#Q4X+7;d8} zfyfk7$B3A=!MOU3Yh`PgYNC07qo=x;;m>5G5gwZwiQkt3mr~I}S#j;`fkUKdh`lYB zlPMoZ5I7%Wi%pKnL{ssYv(UKt42+)?fx$i%qlNt}MW=n#hv~qZoOQumlnq?=@}_xd za?Ka}I~l1;1PslwJ9ZFeFStfby3S4P7d#9u6~6EuuEL7&B0`lZcgu<`Gu6#n`yfgr z|5SAgZ7li;i{&*Drw!=|q?Y37Xv$Rab`Qumi4=?7{XAv&$a>cB#sJ$4AV4QwsP11GXlB;EBwFlb9C- z*iAAGwj}f#0(jvCv9?Q92k1n|j?G!d02U*X90l&8qX9Bb#MqwvZWhuPa}DQS`oW=+ zf)p8w+@|J6`eJi0_{73u)RVp6%F=&7YP|N#1bVn(5h|Cko?-hDdL!?=0nLY-Un$oZ zvl75KI)+U5?t!eISR@oc!LIHZ0ZfLDx zbTrHc`20cY*Uv{@H=>|_WLkS$l)%LBU#JOHO}NV;wa)T{}I+192YsQ_m)MjC@ zfX1Id!-MZ=E+3X5s-$! z(a}a(D;yP9&9k_En0SK3BC8bK+gR}(PSx0%k_B=6=6isxJ&RJ22wuU&V{beqlx_jl zAeJ)eC^vwJzIwAv%`(Z%410iWN(wM+mcweXIBQu}AKggR&OxIQ#;@(5CoN(ybjIKm zjQvC*(IrMY2+FQ->t7sw>bO=3aHg4k0m;oJrGzFucUA?*Jk* z+l5Ztv845(`h}-Z1I$&R84}XrWz|HJf+?cl6%bWo$i^!1oZrKZ7G7|X;z#Lm9<)ct zt*)0(calLDsfC}Z2*hjxxGPz?BKn(a4*XtN`IGc&=Ci3Z{>bMP#4;!W*tr(dpQGvfOaF+@7WO_y!GB%A=dhqCKp_xqsZH|6DbPsHlz2X5;3=JbY%ED+C>g9_F}Sir2CFXrjTeo*%BkN`dY9wm}E%iMUxVB zL!B*Tm^IQK3#d$Rh)87sBzg}#2*(HUo}kZ*fN&8q?B(vV5$Ve9LNA%y+6?yf5g?2d zc&BEu9~QvkkY75W->iGGw8yaXRhHlEE6svx_b1TL0*0V3A82@H+->CE!)W)J?&5BC zX;wS31~L8$Bx?t@I(GJJ%;0MZ&}$2V$!y6%(4; z)*WKbPyKdr(}@U_2%dUm9t=$}lQki@t2=c!n;CcnSI^m(yD&T@*QSMH=!8`mvsLFf zXIbnqfjD$IU%yT_riE%*v8j9`SanXE>A)Y%N}|=JJ3)H@WSOaWd#FC(QI-CM3(;4N z*w%~srShYBK7MIF@z;Djy;}06SLrsdGJ_u|zpGxj6MV7g)vI@}Vylygmx^P?)CVH6_e%zvxJ%HeUFYyIxqCwPn=)+b`-UE>Ewgqu_emmh0%s3{q5=> zX3I4L0nC~UThFYcmlg|!->jaRnSb{B$I^p-o;PEU)i*B9%r-xm-d_G$ZN?b2aFn19 z>RhBrd|>wY4eZL|$kGDceRcZ8MRejTGS9N*`WqvUl`qd2Mo+#0UtTzwXF_+0Lh}-> zDb)+>BA{EQ7i<=O;!#W7kWD(k+8=xoK!xd_wu-_85i+EIM|QNCaIDxZ#<}XL)5&}~ zYt=jnvrkeU*Wy3}dRMRs@VN)ur1hmm^m(IG5^w`2Opp|22b04vN{J!u^S#srR3(9OaM%SsHh7yD?2z(B~TJ0uV(ZiMhVFU3;+YZ}NlC z3S!y1AxA&?E$=4)C^ednuC<*l?o-C1zVaCjH`yZ}pz%MizK9I_$u|toKL)GRM-4Vc z@%5?RN_rEQI%DiBLM3SZgshV>bvVxjYWf(VTwn&BnvC9$yk%Fsi@f@c&C#WS7%Ox1 ztvfD}aBULGKzRsn4Llx-qVAhynOpcV%zL)Qs2B52QAbJ4Y$vECA8qgIM14 zfbhXw@bUHU?=ez*9F8;rMU?*?Hu~sJnh`1zM!b7}nBEWjyTl(B!>W$FiZ8bl3Rzzc#~Rf}agW!sx=@Kz&{=hA&h%+8y^ zlwG~!^1dPO@Pk90x*M&jMLIbm+IdD740zSkSU>aB3K}e5$UF4UyGV<{y?D(3_;LiN z$>wydRJCnij)}x*^1eoH0jKGfd7Y!Ir}`t)Q`$*CJrgSSZ&(`D`))7yxp{Bfc3NND z3sVE)#oF%CpU^-xes<{O3lxszwy4wU&v<#IKiA@m#>nG(PZ*Cvz4PRK^(Pt$&0jZD z%59$Wjs(cMFEk!K9zN}1wf`x;Mf(ekcd>b$(&vl$>~4L*{at33QWUSvk2{+))z=2{ zY<}MTwDjyj)|MW#=VaNVtW{^T zy5q#*qo!xj2UwtXN@cshuc@EVTwJTEf($CA+;ivl#g>#J0N|8f#I$L3x?5G3&_;Uk6PH-5nmIH@-ciF18 zEi-$6901>-IU2jwaah-`%ls@-TcodJjRhia@C7hSd`L`kQIw{Pi!@&-c;S$&wR-h* z&3C5>$Iy3bFK?Z`Y22x6{tPy!^-%uYoEvF{<%(yAXaN%{FMWE>l+Ft}?gWVzo_Dhj z*3gyrecU*E;Q4LF%rI~)WBRgr!djxx=orhRi>BYcu|R{qtr6@a?Xt4Kwlj5B*KW@2 zUG)6sn7VZ5p8i~%Q2dxI#nayYyjfrrqA>bag}2{B*9$M@%WrK|6U1+k z<*K4BYIG%$pUfc3VcwYIR`E(W@^Xs3LzIu47d$4gIiD}t@$zr~>xs?n;TuV<$^t+s zjXZ(LUB-TDB=l-#2rQEcg%yCEzMQF%WBWD8j?PSSb_%S|?4`bhFE&`%D6Fp+a&PbH zU+{DxBHDBEvk({AOfoGZ9|``TSl#N(@`inSSj->flJvRrb!uy?n_A8@xi?m~$1m;& z-Lf@|Jh?fpr1|Skr_r0&yCaQm;l8tvy`63?)IJmn10>-^oGz|emky@6?(y7R2`jy% zF;<-a%YR)?q|<+kGyf8YbJf7_fbIJA`+=X^X^#ST3bU5mEG2IW1%I1!ejdF4CQ9k| z*I=f6 zLLHmU>5b-c^ZHL65uZL(S6cR*{nbAsLAbRt5y~=>De|gD<7wk#y7bD9mOEcQbvUtA zEZ%ysuVNkOQN8>m=;hKglWo#+XLHeo5-a+%4S5M7&W(#kHEZRQrYtt^?}^B`q@Hi_WUBcYw;~RtAj}r1JxHeKKn75Eu~%wZu_=5 z|J3cpcyRlE3K`vSZv%9P0v?4AB^ZsbT{un8gUC-}Pg z=bmS3Ad!F7`&hSNdwAeU8Q$5u^C`&b&U4o!rstRC1Jkw_X|5iLd{XrA?_?PHsF8OV zwCueJHI4d|=kaMt=JVVeuE4#AzcyY$|AS?L5{A_fT?zk>mW4>s)o7uAvMj_MH?ZIS z_bm(m-YNPA%fijIhb|@M|72O1y}AC_f31A|zpyN9ZWJD?13nb}t7T!ctSHlUv%IXN zVzZ*EX>+rZ)PE%Yv8rL#^<#C*zgrey5?iERR=2I%LE*}+y3z9=x9TS}B(@u-P2IK| z=bb9In-=eW+-{~sN__guvQSd_scq}uEeo@5pPwD9RsNG@fz6%T^`~V4CAamjmIc49 zodLe6f3hq{HgE0zX;~PRnfq7Ef*RXnahX3X3zK?s$F*F%=BaPf#%3PhX3U*~zsasl zo6O7|TNd`_Z)E*tSul8GeVg9e?QfO^kNu^$)~e{`p#7um{WpZ9rMt%nGtYySo2p?4 ztBe`l$fZQpULDDJGjz(TFB=%C)-NQOvgZ9jFqYTr@a`U8!9;?BT7)~J-+E?Y!acPz z;?9`C9C_!!Ad3i2;qBC%4qPmo=8u!^C+ZKb-9Gc8?V}sbiJ!0PRgLMmhg9z%zP>#O zeKtS&dI`So^7L}^_v!(j-(PQ-DP56mQ-vsT&*8$6+|2_j0X)YAwZqR|aN_4lIkW+) z0PV%6c1nmbPMMsKjx?vNgW(ujD*XGrTVBS~g~Pbj?BfN0kH-v^JwbQ%_voU)0EI%Utb=Qqc6RlR zt|Xr~Wi(&<4Wdq;P6^C!cqh-P4A;Nkd#^kmE-}C`QfRjuHY!LFxjCd{(KN~KMeWm^ zZPwBV6^fa`3dy8~z>2zR1LMlVWb_BruBaptioQNRH<8?BcpvhJJWBcH8Koanbvn19 z=Y+z^)i{?cOadEk^W^5rl@Eh^7+FS_h2vU}RFk!6&~-Sdz-4o!1?3j^_+Y6ttFrzE zLwy=U3h$+7-!FW6na0v|(NRCw&*1gRw-2$}8^Xy0cSVkZOsg37-Y^a< zapT`F(ljZ*eEg1dAohu9X5 zuWx?`HCxIzunP3~@|>R=K)&-C55XQn)$Am!d{aj{z`#-57&1%8$B;DI+SMplYu39`dmUoCvRm`RE@Ro_eaHu6a;tl3f;gQq1XK15>+B>_32u% zq%2-_LOxA4JO6GL$Jy~1a6%8|ilEQHn{bi57J;}^u2J@}(z6Fk2|({ge&W)z`NAY# z+jG$-I9oG^MAZs*`_ws)d9|n$1rE&VbIPLmxJG7`IR|q~xhs+}j>VKDd&|-j4~$1^ z5rmt6nt%RJ?xdUkN8t+wN|jVT1dty)oFYd%FOZ~M{`;thpR(owHwDkJ0-1O_BuDEpV7@-4_`GbA9B1tbr43! zC`LBYV~6V1p94E*?|u?VW+#Pp1AJd18Cm1&uAcGG1C1aUb5pO1bC?tQ&Zbbkbjn^3 zQzFZc4(emsZ<^cbC|L*c#49x?OZQ@WcEjS>ZCs9C5(Yt5D@h`-d45bca_(&pX-mdV zQ@M8eb}v8B!FWe0-VQ5%M)~Iy0=9mr`U0WcvZ_xLb=Wh`yt~Du)ABl()FraWXV9y3 z;BNp0zLQhQ^IO&v3G2$0w}DgHrF>UEwbS6@d8ia4jjm;DDSE}RJ6s1!pToTgV&BWQ z+GyT6)R1M)mF8ehUY9c>FUEhB#H>$keQE9Ge-egabf>-@!o-@5} z2YY0`8btEMe?0M2-uB1&{v-!#KK9{q9P#onK`^$`6R}OpGqQzXDnU2ukM-+97$#2_an3iiZqH zK(xwR`YnZDG*jF|hCsLI(gV_BIEpvp!?8T0@`_9{Alb)5d6<*cM0Mes5I}`Vd*aC_ zig&M120wH@yN~7eLlEMI3X>5*Qv!`g+z3|&HD*V#NgZPtAvka*xrcLaB?dJ5l^sR_ zPr<%o-2DYWfpF)t?o!eNQB?$fBUG?IVkC-#4?bK*W*&c;XcG)#y?oI7XD2|dhY2*V zeAYB2gg#s4mX`nKVqzD7XaRF*;Ru2Upg5#ZSGjiCn{jxu*}ds71g1qCgjP0d&+9p1 z{k9UfyMln3^SN8WOT*axdqM`|lThhwCk%?O7^HkO*@g2ck1MO)9}GM3E_J3-OIOX< zF|*z&omNq+($fEkOw%}bmfi8XMDmnjd`RM9x>uC$;wtBU%b|Vrf@NR4|Tle zk$+2duejpg&GXlOy=Q+w8)Oj{4So*Zle~{Oymr~sos4iIbz&FoB7d26qmOGVr>rRt zdDxFf=mRgn*zl|2n`R>OAgQyFBWSCSe2{Tc+;J%L`@DNMW1jRo(NVh*2YK?(8TZ=U zM!S0^@;y?&2cptYH;ivy2fmLZ{;1QsX*Shwk@7(Cp%3??fmZ+Ax0jz=n5aZjaUGHp@Ti9)k?3>8@40KV zKU)WbuTUfX*qs&RE||#9nx}!N@0^B^_FV^2mky+8h2`z6w-5M_!;qvP2Y?kbA0~WW zDqczkNIr7WWX)rp^i%5w_Z&kwQz?o4o@A3rL)l7N=S!hjh5pb)uW%;)8<$lT#uDz! zJbK}N?P30_NuK_%#VeyXolHz$AOriDKHEd@Q+nu;fptP8hDgL#2;&nt6x2jQnR8=q zCv>b{R8$6VE#OjfN_bx^5$8Xmy8KhC4?Vo%u6%udAgW*bczCqUf8_r%BC_G(NXG|_ zFs{MXBiNT_#N-FA-!#*^@IEM^7IRI}8XRk`CKNxRgxc+C=s?M;Navr|CWrC3Pe;nE z@L!M>#_%qXTgMaZS^`;)(;C}*NzFkkI5+lp)BUXd^`ATh(*hU7Pu#BRSae8lwhj(- z8bCxY(cfzjfFANWlr@Qo??-S(G=`9&*r?gmAF4W&i*kGeJ``Q##_f| z;q7(J`d7sXdy-}gyMmYtLm={9p>_+Nh}*5Lru~;lmQRTd5kiWe*eZx33`{jB6)Ds5 zJ7(JB=qR3o(RK!LtvdGIf_?v264$=hHV1!A9haY1PulZnzwkY6x$c9B`o`89d0r7w z`=g4@9f-$px7`Af%%8I&Z>%f8L#zr0x%0O%|Ngy~o4KaMc%~QP^unvv>5iU>H{XEo zwaj}nX2BOqf)~s@*wzWd`#~ve0jW*FTvNf!(Wia^2)Gno{ui{r-JL@sqR9uNXouV< zKp+HY$}#qy?AIuw^-Tn^pX~70Ab$e2Qum;kIVdMBl!hF76?dD_41Ew9wCLn9CE}E` zAAVmrL?|n0A=3jp=zXaqTv!DAi}=@QKT!(%7za2IV2O4rucaU!j>w;Y83YSoCm+W& zz%{A~iuC7*ALph=04;ja-espRCj)F04tIojE3C6X^TawJ< zo~cX!fHIxjXV&azecr;|C(0;6%W^%EZ6KR_?0{jYEZ#Zm+5(ivRU>|;Oyq?>_s5xp z<%0wYd*UkGc3U=a%|CG?JMm*i!o9kL{*^>+a8io01fa?kD3An|MkQkbrU{57K~8dy zd9gqRcHFkyIn{n0V@uF96=q=y!ycFmGH7Fc<`g@yz}Q=sN=ORqI|GZhns5(n7k^G} ziWVTsc@b#KXn@xQn5!4q+79E}0^3WL(Vn1RI;y8xPsXGGw3b*1831ZvZolf~g1^We zH%pESjN`K@ygMn#3lCCn!`A`5Z_CalZh0NTGKFFq?M%MUbH1I7Al-Q%&|- zJ4b(<*{4e(7wj(WCSMYmLMuuk>CUAHc4vWiPAO60h6Jc`>t)Axemhd&5JDOmr+RUM zej*ipT(vh63LrYog zl|~u^S?C)F&~04yop8VlfR%Vj2nk{j2vAd6;Iq^pp?>%f#!ED+W6C_Kk0vGJj@|{A z(N_!{J-Cv_xMyW0Q123?vc)>q8fBcEQ|1`_fx%op;Tk`eW=ZMSl`NK)`00Zfw^;$g zrf=j*;(hTGQAe(KjkO|>E#V8W^1ewXvx71#+7k&15m)5P^D2U*OA-qdDvDwgPpqH{ z0OY@$e>f{i;>d9lL1eC+s1T16K)#=-?EFzl=B(;gsOq(>V%L(qr{fW~An*uZHNH>@ zP^%_6t4wRdZwQy;%|pB=tKLogW&T-JsClPTGZWy#IYlrit5on|TA}`f`N#F?dVsg- zf%nVklb-_qF#iA_Q6o6?mo~((j`L5>2%p`jyTkPNy}*ZB*>7-9znVf>BuFbndOAD0 z*EkIhuBUL_*vpwUHU4$kehIRZY%BQM(_HlNQWrZX=r95Fr;a|>eU7DfBtuWVu9yE= ze=3f?$csK^2yyv!y;dm07N=EsU1l>(3 zKNUP;j*1c_BZ}f$>~XDcj=zFPJgM=buUbWp5bk7?YilTN5xQ;1hN8U625~OY0=Kr& zkEoJ3`ZO;f7vC^PLdBD46h>f0KWj4x?Tvx0)klHtbQEOxNJmLvM_ygWnp-O=kbZ_l zuQ@@x7)UP|Zcwk=)--}>scff6bPNEXuAgmdx@{Y;#f}9L@Lcj7ncmh86o{wmn}ET| z2!ltEezNKOM<^EsdF?%rbg}dBQTy+UohP{9BgtfhH96OZESgKkO4Qo@M9cv6l~@`S z36yO2T!jqgrP9>!(YIL9FDC;vczVGtWc(we$%$_94zWx=dOUZZK?iCQ*Jo(mH$y_1 zO43h|`)oUUXGpzseElJDWRZ?OGj~My4BQ$;?|InoiR$w@Rs*31JQN4~7yEtV2X0mM zKbeFFaSw(n4u&fZCXo6gatC7@I|e7b1|Mvp#*H@{=?A;$QDK#6{afQ#1hF{?Fvb z%iQ~?7PbEvyZ=EyF?hT(%wsd$P(D?vJ`^1Gr`%ZYsr}NXp=ou2t-+7ozD7yiY7O;T zl@F*Koko>`+J)&d<12W#m{oOzoQqXG?qx~(%!bIwt%S}twUc!3OZvq)=rVkVvd=mD zeL*j|)ts3aAowCRZdNfkrI+E0^_&8PHwueooKFwGsvn=rzm<4C%3OL?!)R>ARc1W* zOk0)%%jeuI&q9rapZyDW${9qji$CCJi}0*O)b{>)9 zj$@R)lY2{jb$+)#v6X3LiLP#|3r>75Ga5A}A2r15aMK)J*h%~9?R}h`5ch#qCG87}0y_&T3O^jj8TZ_M5s_Q85(CnIf&eZzjdkRzV2Z=)u9rb8`Ov073 zRBo52FP$_RK1qzcw`LX9{mNYSase~ng`$!ou?Ia7N9Wdc0-xm=Ry9?;6D!LKw|G>( z_HOfr{JUcY*iE>O!UtVifxS3Mh8&t$$>%ZxmFZOtCb4B>`LFVwhzPEAoje5B$Epw2 zjx~*CDzVi~otZg?ElJC+r*wv-UTxP|HZ?ee2??_w+tc&AtMjYJk(>_qbLw5YV=W6f zh#Q+Nrt*yEI7O4i8R9KF0yH>xdhb=JWmj$P&`pJ`VeiINbzCZ)Z$I{dp3UlKS6y!Y zqQa`{FoYE@^-vtvDs+$6c`FpJQK*(3qcG)Of5BgT`<0vePyd87S@{l#O8JlOiPD)Z znoWVv({1=ha)$eh?0#Qrj(HLtD}VZhfP{kC)68l6?uuBgI6ofBsS9EG_h;WX^AfK0 zEe$TZ^W6814fS*O7tEZGo|L;QclZ2F*L}7C7fELXPVjkI)sKb4wXM;buIkel&59q% z@(>2bYkrzGem>snQ~icM-s;=8I^ODYQ%Rjz#Q-2{6{)ssxYQPHs)PH4C7*!ZQ zL?6==|HhVyQxc|pnw=quCNDDaJOAwxlf731Yc!5Do-(~J>rbIJC z<*3_us9ZOPes&CKs#vstnJVy^K$MK#e8 zWh-*c7%3oUe~h#>LI*Kv_-D&dP2RqVVChyh3r0J=%L#T$5lOw*&g0uE*D*eiY&HSh8Qe0ozjIA^#jriqZ%9`H#7`{EyhE+7(T3OtqqCb zt*sIta$T5gFcoyabR{y|!3w;7(!ol=kCDLr;W!Zca3Muf)ia=i{IZ+*hqe|u<=U7 zQNVV + + + + Passport example + + +

        Authenticated!

        +

        Socket ID:

        +

        Username:

        +
        +
        + +
        +
        + + + + diff --git a/examples/passport-example/index.js b/examples/passport-example/index.js new file mode 100644 index 0000000000..4e5608f4fa --- /dev/null +++ b/examples/passport-example/index.js @@ -0,0 +1,104 @@ +const app = require("express")(); +const server = require("http").createServer(app); +const port = process.env.PORT || 3000; + +const session = require("express-session"); +const bodyParser = require("body-parser"); +const passport = require("passport"); +const LocalStrategy = require("passport-local").Strategy; + +const sessionMiddleware = session({ secret: "changeit", resave: false, saveUninitialized: false }); +app.use(sessionMiddleware); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(passport.initialize()); +app.use(passport.session()); + +const DUMMY_USER = { + id: 1, + username: "john", +}; + +passport.use( + new LocalStrategy((username, password, done) => { + if (username === "john" && password === "doe") { + console.log("authentication OK"); + return done(null, DUMMY_USER); + } else { + console.log("wrong credentials"); + return done(null, false); + } + }) +); + +app.get("/", (req, res) => { + const isAuthenticated = !!req.user; + if (isAuthenticated) { + console.log(`user is authenticated, session is ${req.session.id}`); + } else { + console.log("unknown user"); + } + res.sendFile(isAuthenticated ? "index.html" : "login.html", { root: __dirname }); +}); + +app.post( + "/login", + passport.authenticate("local", { + successRedirect: "/", + failureRedirect: "/", + }) +); + +app.post("/logout", (req, res) => { + console.log(`logout ${req.session.id}`); + const socketId = req.session.socketId; + if (socketId && io.of("/").connected[socketId]) { + console.log(`forcefully closing socket ${socketId}`); + io.sockets.connected[socketId].disconnect(true); + } + req.logout(); + res.cookie("connect.sid", "", { expires: new Date() }); + res.redirect("/"); +}); + +passport.serializeUser((user, cb) => { + console.log(`serializeUser ${user.id}`); + cb(null, user.id); +}); + +passport.deserializeUser((id, cb) => { + console.log(`deserializeUser ${id}`); + cb(null, DUMMY_USER); +}); + +const io = require('socket.io')(server); + +// convert a connect middleware to a Socket.IO middleware +const wrap = middleware => (socket, next) => middleware(socket.request, {}, next); + +io.use(wrap(sessionMiddleware)); +io.use(wrap(passport.initialize())); +io.use(wrap(passport.session())); + +io.use((socket, next) => { + if (socket.request.user) { + next(); + } else { + next(new Error('unauthorized')) + } +}); + +io.on('connect', (socket) => { + console.log(`new connection ${socket.id}`); + socket.on('whoami', (cb) => { + cb(socket.request.user ? socket.request.user.username : ''); + }); + + const session = socket.request.session; + console.log(`saving sid ${socket.id} in session ${session.id}`); + session.socketId = socket.id; + session.save(); +}); + +server.listen(port, () => { + console.log(`application is running at: http://localhost:${port}`); +}); diff --git a/examples/passport-example/login.html b/examples/passport-example/login.html new file mode 100644 index 0000000000..9a394519e3 --- /dev/null +++ b/examples/passport-example/login.html @@ -0,0 +1,24 @@ + + + + + Passport example + + +

        Not authenticated

        +
        +
        + + +
        +
        +
        + + +
        +
        + +
        +
        + + \ No newline at end of file diff --git a/examples/passport-example/package-lock.json b/examples/passport-example/package-lock.json new file mode 100644 index 0000000000..9bcfdf3612 --- /dev/null +++ b/examples/passport-example/package-lock.json @@ -0,0 +1,783 @@ +{ + "name": "passport-example", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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==" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz", + "integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + } + } + }, + "engine.io-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.2.tgz", + "integrity": "sha512-AWjc1Xg06a6UPFOBAzJf48W1UR/qKYmv/ubgSCumo9GXgvL/xGIvo05dXoBL+2NTLMipDI7in8xK61C17L25xg==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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" + } + }, + "express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", + "requires": { + "cookie": "0.4.0", + "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.2.0", + "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==" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "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==", + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "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==" + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "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=" + }, + "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=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "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==" + }, + "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==", + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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": { + "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==" + } + } + }, + "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==", + "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==" + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/passport-example/package.json b/examples/passport-example/package.json new file mode 100644 index 0000000000..4f2e4c3df2 --- /dev/null +++ b/examples/passport-example/package.json @@ -0,0 +1,16 @@ +{ + "name": "passport-example", + "version": "0.0.1", + "description": "Example with Passport (http://www.passportjs.org/)", + "dependencies": { + "body-parser": "~1.19.0", + "express": "~4.17.1", + "express-session": "~1.17.1", + "passport": "~0.4.1", + "passport-local": "~1.0.0", + "socket.io": "~2.3.0" + }, + "scripts": { + "start": "node index.js" + } +} From 5d16319692b420936826e21ee4f7bbc86dfc4965 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 4 Jun 2020 16:36:19 +0200 Subject: [PATCH 312/494] docs(examples/webpack-build-server): update engine.io version In order to include [0], which fixes the following error: ERROR in ./node_modules/engine.io/lib/server.js Module not found: Error: Can't resolve 'uws' in '/media/damien/git/other-bets/socket.io-parent/socket.io/examples/webpack-build-server/node_modules/engine.io/lib' @ ./node_modules/engine.io/lib/server.js 107:27-41 @ ./node_modules/engine.io/lib/engine.io.js @ ./node_modules/socket.io/lib/index.js @ ./lib/index.js [0] https://github.com/socketio/engine.io/commit/85e544afd95a5890761a613263a5eba0c9a18a93 --- .../webpack-build-server/package-lock.json | 4137 +++++++++++++++++ examples/webpack-build-server/package.json | 5 +- 2 files changed, 4140 insertions(+), 2 deletions(-) create mode 100644 examples/webpack-build-server/package-lock.json diff --git a/examples/webpack-build-server/package-lock.json b/examples/webpack-build-server/package-lock.json new file mode 100644 index 0000000000..a32285389c --- /dev/null +++ b/examples/webpack-build-server/package-lock.json @@ -0,0 +1,4137 @@ +{ + "name": "webpack-build-server", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "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" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "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-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "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-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "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 + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "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" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true, + "optional": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "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 + } + } + }, + "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 + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "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" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "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 + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "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" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "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 + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "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-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 + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "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 + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "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" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "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 + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "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" + } + }, + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "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" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "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 + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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" + } + }, + "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": { + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + } + }, + "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" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "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" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "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" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "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" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "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-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", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "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.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "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-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-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "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" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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 + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "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 + }, + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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-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-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-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": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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-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-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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 + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "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 + }, + "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-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 + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "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" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "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", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "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" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.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 + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "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 + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "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" + } + }, + "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-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "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-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.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" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "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" + } + }, + "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": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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 + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "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 + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "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, + "optional": 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 + }, + "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-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "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 + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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" + } + }, + "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, + "optional": 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 + }, + "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 + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "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 + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "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-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" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "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" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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 + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "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": { + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + } + } + } + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "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" + } + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "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.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "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" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "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" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "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" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "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 + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": 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" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "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 + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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 + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "dev": true, + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "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 + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "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.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/examples/webpack-build-server/package.json b/examples/webpack-build-server/package.json index abd095e4cf..6207c98be6 100644 --- a/examples/webpack-build-server/package.json +++ b/examples/webpack-build-server/package.json @@ -9,7 +9,8 @@ "author": "Damien Arrachequesne", "license": "MIT", "devDependencies": { - "socket.io": "^2.0.3", - "webpack": "^2.6.1" + "socket.io": "~2.3.0", + "webpack": "~4.43.0", + "webpack-cli": "~3.3.11" } } From 7a219f9459d5028aa78dea38c7e213c58263895b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 5 Jun 2020 08:56:20 +0200 Subject: [PATCH 313/494] docs(examples/react-native): add example with React Native Includes https://github.com/socketio/engine.io-client/commit/e5bc1063cc90a7b6262146c7b5338ffff1ff9e5b --- .../react-native/.expo-shared/assets.json | 4 + examples/react-native/.gitignore | 14 + examples/react-native/App.js | 71 + examples/react-native/README.md | 16 + examples/react-native/app.json | 28 + examples/react-native/assets/icon.png | Bin 0 -> 642 bytes .../react-native/assets/react-native-demo.gif | Bin 0 -> 30005 bytes examples/react-native/assets/react-native.png | Bin 0 -> 6443 bytes examples/react-native/assets/splash.png | Bin 0 -> 9306 bytes examples/react-native/babel.config.js | 6 + examples/react-native/package-lock.json | 6775 +++++++++++++++++ examples/react-native/package.json | 24 + examples/react-native/server.js | 15 + 13 files changed, 6953 insertions(+) create mode 100644 examples/react-native/.expo-shared/assets.json create mode 100644 examples/react-native/.gitignore create mode 100644 examples/react-native/App.js create mode 100644 examples/react-native/README.md create mode 100644 examples/react-native/app.json create mode 100644 examples/react-native/assets/icon.png create mode 100644 examples/react-native/assets/react-native-demo.gif create mode 100644 examples/react-native/assets/react-native.png create mode 100644 examples/react-native/assets/splash.png create mode 100644 examples/react-native/babel.config.js create mode 100644 examples/react-native/package-lock.json create mode 100644 examples/react-native/package.json create mode 100644 examples/react-native/server.js diff --git a/examples/react-native/.expo-shared/assets.json b/examples/react-native/.expo-shared/assets.json new file mode 100644 index 0000000000..1e6decfbb5 --- /dev/null +++ b/examples/react-native/.expo-shared/assets.json @@ -0,0 +1,4 @@ +{ + "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true, + "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true +} diff --git a/examples/react-native/.gitignore b/examples/react-native/.gitignore new file mode 100644 index 0000000000..c409cf6af4 --- /dev/null +++ b/examples/react-native/.gitignore @@ -0,0 +1,14 @@ +node_modules/**/* +.expo/* +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ +web-report/ + +# macOS +.DS_Store diff --git a/examples/react-native/App.js b/examples/react-native/App.js new file mode 100644 index 0000000000..cc2cf1ebd3 --- /dev/null +++ b/examples/react-native/App.js @@ -0,0 +1,71 @@ +import React, { Component } from 'react'; +import { StyleSheet, Text, View } from 'react-native'; +import io from 'socket.io-client'; + +const socket = io("192.168.0.28:3000"); // replace with the IP of your server, when testing on real devices + +export default class App extends Component { + constructor(props) { + super(props); + this.state = { + connected: socket.connected, + currentTransport: socket.connected ? socket.io.engine.transport.name : '-', + lastMessage: "" + }; + } + + componentDidMount() { + socket.on('connect', () => this.onConnectionStateUpdate()); + socket.on('disconnect', () => this.onConnectionStateUpdate()); + socket.on('message', (content) => this.onMessage(content)); + } + + componentWillUnmount() { + socket.off('connect'); + socket.off('disconnect'); + socket.off('message'); + } + + onConnectionStateUpdate() { + this.setState({ + connected: socket.connected, + currentTransport: socket.connected ? socket.io.engine.transport.name : '-' + }); + if (socket.connected) { + socket.io.engine.on('upgrade', () => this.onUpgrade()); + } else { + socket.io.engine.off('upgrade'); + } + } + + onMessage(content) { + this.setState({ + lastMessage: content + }); + } + + onUpgrade() { + this.setState({ + currentTransport: socket.io.engine.transport.name + }); + } + + render() { + return ( + + State: { this.state.connected ? 'Connected' : 'Disconnected' } + Current transport: { this.state.currentTransport } + Last message: { this.state.lastMessage } + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/examples/react-native/README.md b/examples/react-native/README.md new file mode 100644 index 0000000000..fb06a92c39 --- /dev/null +++ b/examples/react-native/README.md @@ -0,0 +1,16 @@ + +# Example with [React Native](https://reactnative.dev/) + +![react native logo](assets/react-native.png) + +This example shows a basic example based on [Expo](https://expo.io/). + +![demo](assets/react-native-demo.gif) + +## How to use + +``` +$ npm ci +$ npm start # run expo +$ node server.js # run the server +``` diff --git a/examples/react-native/app.json b/examples/react-native/app.json new file mode 100644 index 0000000000..fd9aa4e3da --- /dev/null +++ b/examples/react-native/app.json @@ -0,0 +1,28 @@ +{ + "expo": { + "name": "react-native", + "slug": "react-native", + "platforms": [ + "ios", + "android", + "web" + ], + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "updates": { + "fallbackToCacheTimeout": 0 + }, + "assetBundlePatterns": [ + "**/*" + ], + "ios": { + "supportsTablet": true + } + } +} diff --git a/examples/react-native/assets/icon.png b/examples/react-native/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6eaf3029532605a3eacae6f90b4770cccc8a169f GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0vp^2SAtuNHCOdH@?llz~t%a;uunK>+N;j)sF*2S|5J? zUw=@jaj{-+=PGRxE_In2=r*~8kqqT11AV78TEA|IG>q4VXDC4pe3gSy%oMyTxE z8783cW?*=6q{R}5>MRxj8JNK^cZQ#j6f2lrl5|K0 zDtoyTtoK0w`ypMhL$=`G5>dIW+jZbduGn8F4Dgi z%B8;J$+8{X`M>WO_NRHaf9=v=TfBvLUaX2{{9n-rWmDEUGE7^#_^0)O+MN4wA8*ewtGp(6 r?D#GJhTYYX(<*N_R7RebP0l+XkK_K*dU literal 0 HcmV?d00001 diff --git a/examples/react-native/assets/react-native-demo.gif b/examples/react-native/assets/react-native-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4c7790d94ba831a7375b26797a0e6c6767e48d4 GIT binary patch literal 30005 zcmeIbXIN9~y6-(w2_b|~q$8mh5kjv*=)Hr0qSBk_q^Y1F2_0!ckdAagL=8m*L<~JN zsRCl73*uBjKtLo1*V=QhefD|Jb-f?n_gv>%(|pYr$o<@7+~fKGe$Oy8Hc(M@bpZu~ zzk_6fqYn)L(Fs7H%n(*_D6c&X1cfo!!;WdgG_&Bmm*6Kt=&;^&GVydKrSuX`NUStc zm4I}3%)oYzK`9gk$Dx>1P#h8{VKo#!iwOoW(Xn9wBu2`T8G&b^H(|k`*e*QfWY*-g zz0XA_%&q3aW0u9MYJ40kecZc^pH7XRT|m&SUYL$mSWZRQBtkT>UyKeS#>^;ACnf<` zlRRI1LQ-0a33O7^;bioXO#GxGos_Zwzp|3DN(e%uLqxFN0VWjvAz--aG%ai?f3alf&a(M+~E*v9j~S&*w4l^MVQ&q?s-hPr5$) z?ncb>k+2VxQJmKJ9(kp+Z7(`sJkER3K1`v}+OJ6W{2|hNFSC#KePDI}Wun^4 z$N4WCD_Sx|9y<6CPxBm0p zPuhnxl@B`=vy-pq^9>eXb}Z8lKepdlY4BayIb5xAUY(+@&X0UroLd`x@VPDU&w=zm zX-~ft>3^Xuf4yh-TYX@)B4i=vMZ1euvbLr>n;-5R8 ze$s}2(!L%}CLS(S9j+D~Za+BO89dy1eR#NiNSmN-KcmqaX|ygH?E{UrOry~RXbcwm zcDB0OR{C<%I0)#d9R&8EFeCs1q<;0ruQmY?G=N6WYeX(?k4CUcI#bCdo$(kUlLDjK z((WWqdB3;R+Opm>tnMvdMMtf@X<&< zlZL9%GNTO1bNvnX$1APMObSh&RKI%QSnv0)|H*@?$1a_>_)HsXUf27KSDzbbeE8;R zz(Rka>C;E=o`rt<^lsqk;}0(g5QgJsP2{=G1lAMh2b*dadPzd2cg>pXmIiX7wlexE}F^WQ9qeg%p+Ls)baIot1?&JX~Utq{r^Nm~JF` zfAO}N(&}P{m4U=krrl}Zr8|yZ_m{GqudXg-yTnN>=XhlKF6a8(yT6?0-?+M*AJ8N5 zu^?p9_hVt`^8Jr@!*^Cc77^f*E5$MFek&yjqSY&<$x5GA%18#1tL2%e{Z=b-ysB64 z6XaP?pK&T% zYK^3!z$tiM{UjjEaPk_Zj)}`fyy1@*m~9~=`cx}9LzEEq87b{L!HWV zT$*9U?GgURKF;*y)NC0_Bq71=axedd`gQ6ZDGEq{?Mu$LjE=%0CGv}f?N(>Lufw4z>Tk=CNvedqV<69_5CYu z;jOUo4?v8jqfv_G?(mC0=vwiJ;|F0v=fn@e`bi@y0M3V(Qb6#wIZIOFTGZXZiK z=neW}@#IbjvvXOP+X~?i5{Lnkt`B$aL34az$Tkll46w=7r}zdy7gWme2ct+PPB3q% zog1G@qN0%zfj5_pQ>?z(I9w$#$0Y=!2)msc8XH^ywl>5}TFD2;#q*R}6)888q9p2O zxtE&YJuVxxwDTQ;{860kiZ25h{RfMY0!ck8ZQF1@WHM}E1TNXOPVk0Vm(a*?MucqI z$%$gF-D$Wgfk@CPc${1~;bo${#}qBd#?N^S4u;F7UUQBH-%O zs0E7eWTd=pH$34601(tH?4Y5C5x^2u2BR4v016DYjitay0V&Et|K@t&@{{~uY(thjoqxZUx0Zt0rd>{iOPz*$l zKL7!i)2vfHlN)_X`HYNmOB%*)hVIeRugY5RjCs;l z)_Ln6QvI$tDvYBSc?YccC$a=4h@=JHQE}J=x z$$g_Tn4*=QN#&9fqScc)%?^rKfE?gHWA zC1Oo4Z!-IZFYr#4q0WS~=)P#rv(&rw?z-8=)TGPvzSs^6pR} zF9X`W5BOO4ht~lC&L%C`zDx!!VL@%z#dZ7hYp#gNh2%>hAMHQPxDmw=#vdfW&m-uT zy?=;y4C6{xr)L40+-32sqr09j#ds0)ANfS=E^y>7GF#-dFI zvtji`>(SjSo=CIelab9YZk$W?yrS^&%I?Z3gALF|`b2pbUZNT#X%*Gd>GVal1~sAv zuqQ86`zYe))gE<*mD&SWtM;|-DLc8MV>U8>#fM*^%)Axx<1GLjDSo$bfVS(5e(*i^>F+*5@^f8tHnW@7z?nott)litHK(G!i`2#JT!=INZ@A3~l! z5u>WxB&EHF+@E&()GLadd;2M}pTAOEMsFH6BS^m~a6w~?_MH~UbOvyn2d};!KAck| z-)HYU9UQ0XQ-WZo=~7l`@%xEAbD_&$Sm~578(7yGth2qmA}$)+t%v!HgF2I;Fs$aC zVAb4j>g|w=s}r8e0iYAJVDnie238N<(;k`bsyXs#Hv=!P9i~Fj+ zw=47&WQ!m3S~ODZRg%7fhpvi8xF%IoZIS5#4G&mSV9EsD@5M&RdT9R~i=S}+!$#9D z_n_-a=sQhDDQp3dkEneL95V|GtA}qBg2CDe#S?~+4OlIegt$1Pc)YyhxLI6)9lRv0 zV3(<5MVj>oC$UG-9+?KKe^F7agx!J%!oM>JkY|kEs?9y`gYj@MjN3;Q;tos?{w{EI9hK zkG)YV2IAxiXsw?PRCGvQawNTq%dbl9n!Xt1;b7-Uhmmk7_!vf;Kyc##ZnEbtaL#fB zE>8-L5jjn=rSp7+wQUM-dWw5P!`=XcoLv(zwknvX-UL%bx`LibeFKuo7p07$@G^-;HzaKi&msbjx0CTEDxtFudpni+$_K5EdSS8m-n&) zxUz#(vqPM+uZCrZ=4M}S&JKT_eRD6Hz?BoFniJ!c6Bm|~kehR>IVbsbPU>C`i7WTE zYHp@eZdO=sPHt{qb8f-w+`D_Z#awx%s(Iy3dH2Hds&ezHoAYX3=RMlXBXi}~spdC0 z7Hv5d?SvKW z<`(TY7ahDVI@~J)xQoGR#n3aw@ax5hykcZaF>0n5y&3V*l#Sw z?jgKe&5kjvjC)vaYnuF_1hb%Fvn~5zQZcekTp(!4>O^7N;^Fgeu~ggn$mOf&erA8Q zjC0|WZ(Dn{yP@uxjj=D?Sr1+r<)(T5D6h&j2=5n{n0fN_>yt>bM9J0AH1<+EulHW} zPF$0Ib7w>D)Jl0a3d*BmG{oB3Z30uJ%{;-oLK5o3ywnnCzH`yMqj2h@Mj>Xp4~vm& z(=Jv)?oi)Ah_hZZv%s|0!T!cae$7_Wx*jVGH#IEGAs-d^aPuY+0;``mv%&{@LyM%d)ip2~I z-c!qtUZjd<6b*0c3S%@o1Aw@q zu?9jkhbhL-2iUd>>^L?N#7r$im)H{d+Yeb!-a+@>Cde1UN7Arr3H!s%t4JXN%f$IP zJ(c+K5#FXlUN_fP@9?t{kLCCFPmnv1dYR||HRv$EYK@&47*wtsEdYO3qN@v1x3lEL zk;XAvSIU2+X_2Uo($7AXhKowHdwl|YrEfD=4wMVPg3$3TimwA8Q+vlX+sHZ=8eI)I z1I?)9fFaengOV*RCR^P!HhU;}NTmsDg;4#9`(~-}xK-O1=q44%MlSEdk|#Bl^5k0n zs2mVrz}*SvQ5UugG}jo!(jIQ9PPxcOzu(oXXOTfriD{a0FP;VuU+mjj73Su2ApjO6 zuOUVNfiYAzyYe}+0IL))rH0( zx#Qj;FXh7SG@|7BL}JpEdYbNys;;o!+C^`+6{4X0Z`RNFPG>Vi(*@2Crq_VD1**oF?*vDQI-DtB?ybgVSIghDATd0Ny^Y-K9*K?}D&Mh|d>* z1G)feG&}}DIpsClnP9gp2ThEZ6J{ke{8`RRtksiWmrb!$(P2ALOLvl2oAd2fI?Ht_ z6eHS}!GsGgTcllnA}AVR9V!LP7{v-3hNL-TJ6K-s_Ns;l(i@UHgqrVnT{={tn#4d@ zM02{Ot}=J-t9B`*TE(8U@60=AS1sM5ej_Z$futZL2;$%pC5_bvc$%>2Sx%rS zCc8-7hX5v1%!w8wP=+pT2a1L}_p6dFK-`X=al74Oxg8Fkoe0*QH&J*XHzY=sawug< zIQ3~nHoV5oSz#NZ`Z=8r=ei*j7nC3&Ov)}i)me3=$xh=m@pwo$zzTis=SESDjYK6D z?znU!dYJ8bh_XU!vk=!ua;;Y;h_EFyF#9?)lQXB{y^iE+^Jc$RCfvLM!>&HC!VFc{ z^Rv;lXHdKpIFX!r!cE>Ny3|78ehVDWp5Ib!ShvsgBxsBy)u)@zX!La?t#|>b4T#71 zjg;PLQc^`HjJi`~iH;N77q6YnS+B9Ho;O)A2B-I;J_mG3mB^YX+OK(>Fg;f0KZTw- zo|fN1Iuedt-MbB%Y{aNO9}eI~AqukJ`(&8~WP|Dmh<`-&PqrODbxEV0$_)Z@xQ zPN<h_z)QvZ{`BpvA5^>=75A=9E1)*xr z(wW8g2p0&tHela)#ghVz8(tzQUUlS`nlft*! zhe|^jlPe6K1UfTH*gl9V>UF)~EQPJmjDtl!xrRP?w;-)|o^YZ=JDICkKwVy?Q-v}{ zUO4O=AvYPyzXj1Phq8mBr?=QC4YKUc?tIljaf+_^DQxoG!0S8A4buLtjGRQ4U~D@# z*hT#<7uI-IR_VG;>+LyJ557P`$Zsv51>dH)XJnIxK}Cwtv>B+>>eO3g42{+ z8$z>MHeRg3wS{hx-%Q#m)wBGuMPTlSOYCx5kh=0kgg3LQv!F`*?xk(MtrH1Q*W0pY zmms3Mp;*%bwxoQAfXKsfs=DT3s;Tti?KA9tNZBTP-n;~X!l2>ZggKaIgEm4cV1Mj} zL9%kfhBaaX&Oa8cec8X1@e(jLIi<;5mX^kQnF){oFFBtKpbUb6{@2;#ubhu}TIO~^ zG))dp-TkA?Af_|i>?r3G?(_=|#d8MLVtcbirkqN>$TQe9zH>JfR!1&KTOh9~EjrNA z8>H|CiYkZ@-|7_M!%PY#tLIkG0beKO}yM*&R8t?)>l~PkrsDoRq9Glg0OY`{mSQ?)^h@ZMIkGtwsE} zijI*KE(Z40iFysqY(FlLG0Do?yOBcO)CwQhY=2oW`c_P@wCCq|7IH_r;OljPO+9I$ zFP5o#wcE05>&>1rL$6p;^PgU=+~Ivg6TKe8E;tUFf8N-&-zaBt2O8vT*vI?;2%~vE z5V6_}svNhEpS}Q<+ZqJruuY&Dll?QZ)pT3}V5~24bO}=2-+D}!eFhk ziNzlqdic*63G5@(QXIqNul*~MBDjHWbCoQBglH42JxouDV|L2Mvm||35J@)^Boc(n z(aLb4#B$mmj313fY2jfwk~GfLzp$jAP^ac41IX;bLb*34W5u_tVtPOa( z3;JKe%`U%;Ioa~Me(oac$skEul6?npI%k=@XdzjMqc>`UEZyUoOHQ?pOwM z49(N*z`;tBzwjRt^lTHpGc~%*h4SwiQUL3ybF-!Jh+S=9Q5K@!weH(?!p?y9SvC>2 z(!quXhO};#0A~rhmu_Ydl%Zu}%HkxfbPfN)emZ^jIf!zp4-dm5>!+T30&d`fUUtWk zWFT{an+{sILUkbGyP~<&odBsXqo|90fzW`iVmM5$KFGr$MWjZTF)uL9IvlG_!Q%zi zwNYK&8~l41D0Vn7<#I?nmvg6~D4qlkYS4urH?q=1GlK>SgyetdI0_;0$VjO&>kcc5 z%#3Wbd~zp`DY=-NBQfm~Nl4~hPCMs3k-^v?jtfLx6s0TIw|=L~DtE*$z$sCIA-aee z1w1llQBpxkOz8b|loD*Vb65o98i50V+c~V)s>T5|GBZoiCe0i|pa5J{>}QYoB;ep1 zjEwDvDI5)wQ~{yCf;ErDV6NJuXbvd1#}dpT0{rxFuQE)sE_RI)twaY@+V`^pA2I}v z!HYrQf;pwmgmxt&&>vZDo6k6CszKPGh8x-4MF-q6Q00#Ii~7trssdL`YEI7R5Ecty zrYcqMXC-Gs@?a8PJoVf_HIh!?{5b<22sV37Wl7{CNz#n8oq7qo%;%!dZWFVawnhoW zeoTP>v0s*Q)=lwv6yw_I?Wk92t?pc5jQDf+S10<I z5}-_0E>H(l7oVFWh}FL{CDR4ZaIxYYhZR9R+9&&26?cN=&PX$P65R^!GZdb!j14FN z-~22RuXVm1!m)cB`+d5L_lz87yY74Ww})RN=xyFDT?Mg^I?Eg^I*`H!U14IOoyHKW z6sa13uJV{stW5Y!Xe&oskzTJ*yI|J)M~$2^Wa!C863A{D3pI;D2(gnG)KTgm_ zLpw}Qj?6Q>vl~H$qZaACt0BIGWKtsUVnj>{Lv|=iGYEvhhtGlR+l*!P@bR6`t+10- z<2-uS7%|;FS&P>}+1ienYvryq_NwV9MYM{=nQ+5acuw8M#g+SC^kR?Z*qiKn;=y2O?r*}$ z;4^l{TPELJV^cSHFYx(s6w}t3^Lcd-6It5=028 zOF4V2gbw%|ho!!Tfqlaeb5ip|F@0ZuHW3SWMqZAUs2GHQIb_t-julH#&?9|pNZZ8@ zPuo)_@t8s`;nTY${luT1h$L4tciwyr{Qwb6IGgZhV`!knxCQ0!5N#nGL55b`682bIgzF{UL^naaT!zCU+P_m7~t)~smd!%kI7IaeRR4?qF-5r z$8O?yr?4|lpu!zbD>isH!R$G~+cd>IiGkYLNPA%Qbd7it*BN_rm~|1#>}-IA66}?g z_rP>=8=c1SQMsG|?&*&=Yup3zq&8m`0A(F!E* zr**jDk&}zFCk$%S+DFoiaU2vt5DM~z3NV0{0`53o)Zb!2btQ(*C5EvAB~9?nAbq&D z9-}bka0GeW1%WhX{fsAe?s%@?@xdH6PO-*$<$7QcssnuU$0FL4BC|;&-WZyTkSWP{ z$C2tW#XBpe$5oPH%#wOTG44HQz#0pj(1?E~m#JX@`QnIiUlFxTyp8}}Srdfqxnoe} z3|u~X7!N-$Yh^QIDRn)6SczzK0IDYdH5kCa=y3ZaH6xewjokX6^W|xg%9mqPH znL;RjV;8Pk0Yb;>#1qOw<8;a>AovJq#);z)SFX>Ux7rNC27tPkj~Sbk8{E<0-fWhNbp7l1OW3{-I~XjF~nEE1B%>{_u$xjm>~8h$~{iXg)tncRS=`c z45DI~o{oSS^g%B@nNo1T2^slG4-6OX5B&ej8r2x(AjDaVbCyx_$Z=LzEFZ;I&Q4t^`kPyIdv^(Ap z(7JDU!eW^nXkhUp64g~VybF08wQiY*P#fP@*j*yK8(x%uFTTbKI;~+O0VbImc9MFt z8MKW#zo*@0Q`j|A#P3+Xh1%dQ?5k%A3cOI$0yn*}nMX6JE=IL=Z388m@@n83cU`@~ zI7#b@s}u3w6eI>t+8xM@5>;Zk*>&~cyXBkO%krN;3q{9%IgbnC88csDvIBekM5p-d zFy-HBB67{YS!Q4Y>(IZ8cn!>hr>Us%ZpsLZ{aoyBKi{*)b>5ZO=wtA|Q`Y^fe!~B# z-%+};#Xu1vuzG`7B%P};{IVy+lbcL-hYNF#nQ_0DBvG@u*cUi&pSi6{E(~M{Y);D)KN>5C_^;?x^dri$i8CZP(uj;^X3wH>XAas`1vd{jdCO zX6Jbp#(R=EAU07Dg~_WmZ&2zR>$iV6I0Usz%`}pm*9y*4Fv5QSTB3l=Q0sv#xj36LC7XOgS;-7CD4jT~l<5$YUXyz87VB$d ziOeY!mXPc8mh|ZikGOZB-k*WY$~vG*#rg%g5UQol-Wr(ozu0@-j)F2%%lfQW??boz z!*<>xUxx2}xKPlNR~ zU{P79;cW1J%BUEG8!2I3ds*Zl$^MD_Rxar2z$O~;H-cFHbz#mpD(R1@ujvJmzZ&~! z>#$j0!-_NT&iaw7!b?K=Q`6mRIkJ2%$r3;FKRb3l&qr^%*0Y;Pqwrz3zrIrpy?nYQ zg#OzFSy-dX=0J1cM~f@Q)d*e{yUNk5FO6g)l~f7qEK8o38D|vnuOiKpyw2rVjv)N> zAFA;^z!WCvyqQ0LmOJaDt_!dU<|OC~m_0Lqfd6KNK>nk*>;OnWekUY4%L~M^lMnTn ze88#7B6{#WjaSo_zRI|KclapWT@<#+6pbQLV#Qu4v zF~!L&4Tu8cj{t7d^pD`b+b{XgS)&nv2(z+M^a+9gT+#whRq3Bmkn3sF`9KBO%=gH8 zd8SZr1w#;VfM)mxHg`yllZi6FfLJI;uHWPqVjX$>6EZEgd|ICcKX6uAN!S?F4Q}jt2yRxH5bwy-BCpT zvFfXi=)qmXfcFI|;9rJP0Ji-`diAWSkrjVFh*4fic;$~w5Iv1;Ki{Lv>{yEUF_SVJ zeYpwi%%+)fuFZL7gF0tqfkO|vRZHI2YjDcD|3v})#=|J>FJdeuT-}}lSM4fWuzFt_ zm~GrJ6R~@TnIroZo%w-(OoCdqZlD*4CZfiP5M`Lo*h+(%CUM&`{V-j*UiC|-~fM&tE~vQkRzSVYcKeb zETkKrdtRl*qc6APy5|Au$M@kfQ{o}o-1W7Mz;nSkpSFUpz z*R0NfbS!QCj_r;SBDu_n>+nq$#=Pt=W*!IeBzCGu1WpsHOTDKj@#0Q^fu) z3-(J2q4j=C!9C5WGz!5NgCQj)5=;@nJfX*UzH zLqfj;>;w4_`o^+3LstzWL@|M4jSw@8I>e@MR$|`svsO3w?i2c|IwOzfbpdhA`9fY0 z^-l)*?&?lAhMR#AtY{lV5NIo1;^I};7rHoS$;=%hM$=ai^~!$t@p(?%b-Ep%C!ns_ z+tDZc^J};HJ0m})p0f>=t}`6~|2y9CZI8gPR^a&m0)|mZvkhL1M-ryWdXawgx7m!*awKLbOuvoMtbI*-q74f&F?@;M$3}HR}k;hegqJ5|5ztiXV3dy+r-mz8GSL2p(W4H< zu%$nJkWXcFof$$_*%Ds$)|{DImne%dVr!0!WxDXAGRH>5kA0}wUSd+rDon?P)Tw+a z8-F>Ix7Mavdizu4uLQQ7wXx1LL7E}_n!2(gF_YuM>D6HlLDQEjW2y(cg@H4Wp@<;6 z>ID85)2t>BF!9*a2&DiL?bFmsVh*DrHG;|V(|cirWlRpfXV@I#Q2+~r-?|8vxOoN3 zOia$Dv%~jHzPCj8&e#2(2A?(*KXwxTFmE*^_Ylyu~Ce8 z75OwSzJ$>zCN(G4PI@bX73jiim@4U11Pb4URlCw{1JE>%z_4>5u_ONLpe&Wm=NCJ+ z0Bl=&r-5Q$rU8PZTp8?r8Bq3JAoeH}4Gmpl3OjdQg}|cwRp}inpoTIqNe9VgDdXmYX_q#s4oQq3x9401}?q+6UniQf{Hn#}XRcaFfwt?S*EUY;BXht4beXJX*?yr78W_dPN!v4xZ z_d!Ji*+5O+nS)}JZBM_)|a#|b~SU*?tmCNT*$TEJImtdR= z+WOYd0xi%^#W5a~vRIyX5;g_D6#r3yRnxdpi~hd+Or~pU(v#UzY~==wgGgQ=o?DRf z{4xNl`b1IoaFHcRak=!oyzl5bw_N)ZOn16{pOJkPv4D{xX*~>eL8yE~pN&VG?L!iw zi;hyKd-_=(LNt31J&hO4```( z-cG{`IS0Q~oF25&cN^_G=;x`w)!iXCQ@q&?;aTN2&z>B?Q#H;`jG#2%kRT{GBm%EpeFqO>p@rFO)o+2Vv5$SjoCOFevSnh(1G0tnIy zm;#e;0Rj*>*x7R=*v)>>di@7~eAEnNmY={p>us$?0&u6`=bZWRxzTh$2cYS4dWe0K z!Awh`1O&lQuGMrp0u6Dp{V1V`g=cgi5RM?xwZP5|;6XFGcnClNsW}-6X;f+BRflE1 zCiKXr*5zM1kOY<-dma-u(H!SvLIx2TU!oebVjN>adYj@#Xhu(y+o7|(+Wra7;`J%K zJ8OJ$c73W@+7hDLqoELiUe!`!H|zC{Bo|Z}XRlF@T;4{qk69V_6tzdGWh2EqbHFxE zH1p|J#b2i0tr2SRh-g9i6|oluB4)a*W$K`k<2XF7LVqrp`1GL+?3uFPY^gv zM{~^*7|cds1h#$%$Zk%SInOFqI#WPo*X7iFdJoWW+mfKReV-OmuJxyrPU{6MnR8Ywu{=i$1`kZ!BsnG*Kj5nr@|ehY~P< z+{(C9ju%VHm2(rH@5DKTrB}5D75!)xbFb|0uRg@EfdULpuWd6$&vZPbt^4Ja69Kh` zY9{*PxbB?o=qF14#{S2Q_@ca0?Pw~c%=hoCT{#qB@JNh?p1}?M1ZSR<{~4}=@`)!2T%w7B9c!H3#ivQOR&_ng1>Z2Hod5vdcHt0aJNZ!w;m ze%&>N-KG8EKBAKi$gItBK6%m7 z&1QI)-jv>9supuk+D^#Vsd!6>wZeQ*L9av{iL&KB%ZSOtqtw{3^}Jw#jT|sD)53j^ zK~K@?Zshkg4qM$fYK$uAlkY|_Jrh8H1nRG-4z!4W- z&hip|%nMG!$;S!OByH%{hAE#$u|C+mjR#7&F+UC1@(udvpS_l7>{`Lne!D{$EgY9& z?Wx_Ut#8vo;<7(!h*o}We%WC|T2{j(_nwa)5o?`r&``=SC3jh^-+E@|vIuYe!lg9v zOCNx1=U=G*BZ8l$r~f-`7X90AaQ^-Wf6F?*Wu1S2S?713|L*hOeg1!>&wqPyzrDEM zUfgdl?zb2B+l%|{#r^i;{!e;wwntuEE5P)>Mlb(3{}Q&7B>ZvqMG{E*a3Fzs4#&?- zfBJ~K=pfyKDORJ50}4g_;13w*n`Au=vjl!F&6lrx>E66Ta_p)~_tLRtp`M)R%P4MO zS7fWW9@2Bqq)4Dhan~MqyqwM8;k-w48Y(A7pC5e8k6d-O2AVEu@3`|Be@!QR@L1@h z$tTIL9WMo(kM@4x72~P-s{hOhnE~8rb7q0 z1{1sdZN5box@|sRSOu*Y4t-6pT;~|N_8b!?cx_`_%&@e7KWFLtTe&;SeoHq`skhkN zh&>BArNdzT5!f(0OXL3Y3|EB-Sn*NWVuC%;OsjjvlH=H9vouK4R43ebQRhzf5dMEF z!o?Vz|9=$WbZ7sY2xlerON8tC4-u}zljD~N=lPcim&Wm*BHSb5?f(?vAekVppyKTR zD#9)9{#Ow$=tzW%{-+4HV!w2!d=_E?ez{9mOfbG*AI;AzaOaKItx{szsVItz0HhIG zY{B9ZN^5#$f1Y?{^b9mC%eb=Ww!7tV94VUN-lL!OSr>;x@d(X(R+!`mHfGEOl^QR* zY=c)Tpj^D$-EIpMI{E0tNZV;!L-KA-l!TQQCO!pub3~|{TaV}t5}-|Y_8^W9A3X|< zd}1<{&9PiZ2NPgf0VP2fn<;#jTeUBNhF$tpSt5ERT>&w|Y$6^ZjAwlEaQPcu?wOx; zHV?Vy)JUrLRmKviccZuoQggR-qu3YuE=qA3B@bj(sMcQ}?c|0zkK-2+!5tVf72={M zU%s&+K}VXG*YZ06ERTzzO6@eB1wmgzYmGYbQj)o2+N_2c<;#rx*<&5tOiVGRPoO_( zh8qOV3(yZ*9f;ztV+rcA=swVvPy)KH+L>+ODO_>HRwc9+I>bqblTzFj{?-k*P+5@I zh+MQ{I#%l?%y3Vb{}Q{o?@yr=aLbmqAy*(3! zxU&dXk2E8oG@Tpw=@Txr>tn+hy8hDN0NIqf95mwZwlJ@?DUhIecY*ueN|bz7T$&jH3tRMwM`?@{h4Tu6 zQ&j0Zrtds9U?Z>{IvNzmln^d7xWm0U|!+q`>U~2YwVl;GXQ_n@}L2?P6l` zgvS9a4i868HxJJV0;}O5DMAqF$Z-P&H5nZRS_?;sRxy&p^{swQAOslkIfekn@uh~~ z>-WW>3mB@}I(`sD>bw0G3VhQriUs))0PlbyoST&yR%(-fT-fVyk%h@+MV9|y@g5{o z$11vqi2W6L-Q)rsrG-jQ+&4Z0txG8?T@qZHKI-qp?vkB`s%CA3O*XL`sOeTUvF=m7 z+H%|ZxjRo}SiDWJK3ma2r|MZ=s%oh$&%TdtrcMgo+3YhD&4?#LUmbfKA?x;cQf*ttBXs>T>j4$6lT30f2qwQpIJ%YPDLLkZ_~mhoRMn8XOC;SB%m43 zBoiN&cXJ;g*M~Es19g6Sa%-Oiw3H#vKCktas@ib)jM4`#bQd(N=&OD%OeOS!9ocD@ z2D0RJaHX@NB$oY=58~((cuo@jOOe)@wA*Bi8Cy}S@WrV8=*-gk?s)BCzUbxU-nGcZ zu}dOn(o7~Jx66x1k!PzKn3B(DREWXMfZ&j?@Ah31q|}e~NidzN^dF6r-97ZwaNl|S zK^&R`)>v?%0AN+!3UhMBxmis`j+_8w8k55f2q#5sM153B*TSX?wr*ici2~@EvpxoVcnD4m&vli3RAQJm>D6jIDF&9hd6_i(BmN8I zUK);d9wOrU_6RB+nJ5DLaHAa`2&b7X2JgWZoyM6!+dj3 zxE1q3=|U(5v$^NrnW#MU*5-VUG(1k4tVg%5u1a|}ie#ii{GAH;4KM*OQ9AZ$V$Lv|tYGJQFr#k|R^E5y;Eq%m=`PkS<}V}Ql6 z!yAU?@6lz*4Sf-g;vy{P!3381mnZRnVd_2g!ra5CWVBM^91O5#Qxd!5~_RR@x@u)dO#TNX)3*xyaCLi}TWssGEv zfCjmDg8C?tpHGMS&IimsySV<=PFR^#)I;Q@h1Ki^EOw^yGndwgTP^m+(DRG_?XIZ* zG}7|_i!bp{HaT)P&b~dH{6QF7f4-YKM|SUwTvqTs8e=YWMAE2p@^=V%z1g5ov0?3T z<$dwuKlzZ_XfMNr!P7I&yGI_Pj%H*j%B6pK2sn}}jH@R+#&0V>gxw#@@aqf|r=5Gg zdbuy{_IbWIzI+Tv?726MvTJ!e!X}MspcNQ_fN5<(e!U$Nh9rfaDR}8I;JlGV4!i!}IAV-$F@;&}@>fL<* zj>z%i%cl0tY-*1wW&h{H0rjWP7n!0|GrFTgrV2xsu$raz{@U4m!S~ z4NJMDbzVmkp@9{v%Hw3d&`6(|LF!}XG#D#n_AD%#*GgDde!py6oIa^=>o%r&+`uSN z+nS3-IQw#3A+QF#n`>F@#s;}cupAg#B00@y>pvORL;i3kzRvl%ri=vLBL)+ZKa-do z00;Id0G4~?=yP$o0C`Zn|M88=|fjS-)n2kG2A;;Y*pPSiqetqjB?c zD(?H=mUVp*xO106zgi}$Uup{x=ccS_T|Le@$ICNo-ei7l^JZAFw{s;ho_BO+XMBfD z3(6s=dzC4Z*vq6MaDJt6wIjGU$NVtV))oK%i*WH9qyLT3|HkNlWAwi<`rjD+Z;bvo VM*sU&BfsA8_`jX>|N9r}{{vq?v19-M literal 0 HcmV?d00001 diff --git a/examples/react-native/assets/react-native.png b/examples/react-native/assets/react-native.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7284509892601f9c5250f5fb6d33aafc103b10 GIT binary patch literal 6443 zcmV+`8Pw*9P)lz9UvSUAQ~4T4getx00pJZArlE97ZD-= z05B#Y5q_N-P+}2)p&UO;FDfS?5CAbF920kxFef7(EiwSB)fQ-i43W1OUUeY`012AI zA1W>zNLLkZi78B33zWMKi?0}4a2rit9XUfWAQlpOmL^zfEIU9eLrgIo4lOk|C>|Ln zQeZL{03IwdDo0T%7z`#304+H^+Lh5~000;=NklxsfCyUgRZ&41 zu(qA)%-p%V`~APyJtyIj@CLiPGQH=I-6@jfsPTlO(Z zTDEL>CnP5P58J|5fM5GQ(xz=&-UZzPpE$l5z0V9^7Qa#Z9zHdE0*79E>nZdezLft_ z>!xDX__fFHw$=OhY1AFQ9C{rvNa5=ux_3aGr(S?whfaD9UuW&fx!p*HTlVrv;S-02 z=(P@i)8Sh-ybtOKpEzP6pOgd4zuQ@ zjl#}LW8Ud-MATxUvu}{`-)2nMbkO+PB*?dD!5orX;(d!zV`5OKqa&0 zL2cL<)2IXQ_dx9@P@<-VDqTYz7Vplet@?0ogL4w)zclEqUAS{cl+L)x-JFbNW1T{+ zuI%kMg0D&7$62`Clv}%xzSpbR88i}rN`R`tEua+d-olq!toj*n=B+?IIs6(R()YN9 zGiGh>EkUOa-^|^;k6YSE04G~zmXg)(I`M0>boWXv>S#P1jz+YPg1-Cjc*_kCneqrw>jGPb z1_Qv6bjgj-f5*#BBFZ}mZlmEx;Fg6EgfRuN{~0e*szPI`sonIn4Tu!OmJ$1%5;F_o z??#TtF!`guo}=V>_diShe9%Fu^pWj9NB=eioe50P@E)YEIzGHlLO0PFyChB~l!>C- z_ck2$3&Dap86PQK_-nj^hLakyUa6*)*vW~e;c*{9-dZi(V_bh_qs78~|9&;5@FfB+J}uGSjv*gIqv9S|-AykRTjx&WejF8wUQQ{}pNd1iu7fix$H*_Q zyUgtcA$`Y@KZuH~UOq7@(%y2*)rN|I$m?$UQ;y%R1Ahz^y?K_$qELI8Hs$C=RhH79 z3)i3u902f!7ezjp3c#zoF}lF%U2z+l!~zY=%XLNGBZaisq;mGA`CLDm@@B8Jp228u zgjI>vXM5-LtgKd&?j{vpiA0G9u(?IamV+6q>5Nj0vaL+D`Ml2(__vZCx=B5b<#2*^!eefZzwq;|>`<8rpCNx~|!&V!wB?#`N8UEZMa zmVo_tJy+%WZ5?H0H!&yHUQ*=42&|pCoH|bMJTtA?(Q$U&)t8Um8>ahdgUX<#rchio z9Mj*Bsr21eO_>~IB4Mg!ZDmDTn#RSMPA@L;8m{N;t(p!hh@DQus#)=7m)z=?_}uC? z&AM(!rXoL62df%q5Ws~GqIZfgGhdysv-Wbr*SO|bq?CCHsV%cNZgiXQsV7-J#rkQD zJVjBQ(9q%w7bh?}_suZbyiix9l??@{ORF0nW@uMgwvsNinI|dXEcshsIMWjNbc-Wh z%ihqjR#H%$iPJ0`hpu!YM^8^rt1|d9;s=ej{7sGdDkg0yD`{{t**hS9=fvD;XJ@)D zY^N{wEFCXb!{VKcSUQm!DiI@5@L?bU2T3g7!1w*PQvA4HEogks-FoYuNEM_nNjR)$ zh*Sba*~Ow%E`6pAfeu3uH~Ko4q%=t?iwLlpZ#GXk@YNBFC_f@Q$;zx`xH2z;ZzyV$ z$s}4-1ESllRlG9Y37C@O*hITJ(}Sx?iWdtK*gmfWzDGrpqy#+)|B$W>ehrh#0vgTj zAb3sji#Zi!7(_nn%*w1}NhybKpr5_K`$gws0E51nu?)BGXI@K*=e4})RM+&YqJ%E} z(eleYFM%&O#N<%~PpSSgcDf};;tME%oq!U9PvMiiHB$?&hVMaNfOIDCDIk3r$8`H6 zAS00Xma1FkdS*M*o%QQvE);nWL9?ZartQ3%h0PE?`RYz0GOQ!ur?6OeU*bPF_~NS( ze9Cr`3U)nwQmk8M7#@xm@0dPdGrjpJ+cV*O+=hWOrP(h6aj^a4(wceBu{dld@GVn! zE3Thmc4-WB%iB5=7QRID34FksywnrHZULWQuGcsfPWWzxPld!xkvsz0bn3`4N$3n@ zC73!_*D4w$3m;@C2e`6Gtlua(R*EyvDp0O7k-s=OFz_X<5k4gZ{5+!qJ}$J=Soor$ zs`k79A8i2Dj9^6Wldzs+r~t;rq{g{>14QfzS70SbtLp-(bF(!@)5YY~qI-)i5z4)SracF4U z9*CH2hg-xiWf$SwLR>G&Usnb2ZN5EvQTJaE-={5f0W8_@zpDxi+xA6Quc008W3Mi# zI~Z+2W?||309$+8Q==^3I)&huJb&lQ!A!NLj*aeCBx)p1Jn+7%Id$I7HkPt{Ba>AW zOJAhCnh?sw6Jrr4PIryHOx-hH4fHr1JEj-Cr6uU+=q`wc4x6m)Q?|wu{_DNu;oI2J zkl52BwA=(Vpu(UO7^R+9n84psEWJYuc%t^&xJWS{%B4Y`I$1!shiBKama=>`w$5~< z3ZiLVcLtyjvyd0&#c?cst?xmQyd7V-FR*>E)HF)aPQZ#HOCSuujW-}jnLhpj7bW7F zLdv4MWv_x)h~dLY6ZkmKt87i<71ej1h3_TgI`W?$HlEDG2dZz0Keo{PODw%EKukC> zkUKD8wDrEWOtL=0jSEtiay{8s9cOQX&~2xVGez_P3~v@Xk0yEQ;R7dE4!<0HCW-~A zFOUMP{P=D2GXEI>j=`S-$*o~3`;%c9!X8=g~FRN7~ zBfRt>>#!s*JbW88mmAVx@Q$o~8$7I@Fqo20w9pV|9WM|d#M=9W-VOo_ES55hnoD0~U3qcR?182Y9D$3MzW4J*dZ8m^L_>^s2G4O2~)r8!l{)#V>|WFmOrsa}K`mV8ddM zu==k|^>fI^eN_73SMYH1Pr5Q>Ad@b*Bt)uYolzt!-G>II?UZQV8u$qSs7W}D;PWlA zB23H-;;pa&AW7Pok^%e?oQcUG0StHsnjfux;#_pWgv{;|tHeyA@VO{6Zqg-8LeWI= zAp_q7FMVK4P<_7-82AR?f}Q=n?b=t0$to0N+^5!S_U5G;sS8 z>#pPyVPXxDail6;PDJ_=Fksn1l|c$Q>C>mwKt)r7>|4)DA5$^_N2Ex^9Uz|}82*^B z06Qn?5%?g(Je`lkNdkOic8iRa76&=_sQ9Ju2`;gyPuZ~fX}(!~{Yer5gipvx9|ed#?7RAfDdH0 z5Wa^E{L7w4y8BIwOdrp3ZdG}Lj%C}WoLfg{3SkN$WgJq^D>%+pi9NV=0?U8Od0uAf zn&DB;tDa|?P`#DIcE7k9Go=(h;UR%9^PHE3kH+Y4Pif$S;Wwmf z+x^eK-oK&i&`RMO;O`JqqV9sX76l9O}MNI7_r97G@p#5^N|b zJUf>Oh^VGn?sI?-fcfRf!AJZ+xQ_UonS_4KDLo9nQ+sEa7C7Z7a6!anhEEMzj1u?; z?6cfa20juoN~;*Y)frIPmpbg8|<2T z-gGYdWWv>mi}$!_#t~9HSpr)(o6L?fWSq3zC93Apajvd0K@|ZCueqI8dH4V}34I5u zq-4ZS`e74>;cui^07>IMuqW~=fiJtOhlh`r7r#U?+#J1qTnIo> ztb}i%<66FlicHc%2r}4G8?*wJ8C^pyD1Z-UYFrMarY9X9kKj0=BPzJp>Ga@-9?732 zNJ;aCAP*m=We6W;w@E4?XkP%6FRM)ef#FM3-<|joy9PoK=hC8!Mea=u--h3W_mGi3 za8Xz}l_-2qYyk5fDlB~TS%>&X3g2*I;{b8;HWX1zq;)JIU{{&2neOB&gbxNVgza=n z3(S%v)0&SWI~dB4vb}P2%_1vW03Z4(JLbdB*grsqDRz;t3;tx~2gyn-o3~t%d~dFhZPY zF9dQlzn@^DoH|}=fJ@-RpvMV?g>Tb`Wl^bqI+eU|dtA-}*>Co&BdQc&a6^hK${s@G zH3|G;=H46;Imua;YDeONm^70@yaHzihwIJQNF}AzB2*167tn zl30@z!L#iHiKV|1UeV9sLV^ado13%nX*;?OkjSnsWW*rE^hXI1oCB~zLwM+EsXZj{ zVGu+DWht(@4n)=R6vCbzN^)FHW8a=Fg>N!-;^({qtbnWQkc4;>iaz+aipS*HV!a$^ zChLVl15r}>H4uZRqfC=zEHw{N&t*)kwNW6)x60C$O2gnUQs~6Tp4^W3419vQM|8HP zD2)DijDmIO-ky;)!2*RzOVIKXqCEJOz=uHyQ4rZriuPdiLxv9$q;b3U%g|Ft=?+LN z9oREBoI3F?4KxzP@L5~W^Emj_6I}7Gq%TX@M$bIMCAP=-<;#IuhTsU9DgH{JP>r|f zy5}cbcvfE@1Lz9{pWRdjmv~cR9O6r&aq*%7&jxS}6e&W8TrE+*;nt`4*^_~nzs74b zL_VHVKJ?rx4`uLSe4La5KjRZ+I^yOl4J{cAxYCo_qQ{eYO{$UsyL%cSUOS&;SlL4`K zEG!ngs1}U3kSCiPx^X6IIWdesl8y$yh6NE>g*Nw_ibnK z1q__J?=I!3@Kt>F#G?jplXu!rR{A=6{)OJM*U3w_5{Xv)JP7QB7DC8kLy{K1PGtG= z4V!bbLlqwck-m+eUgMT}Wld1oW49LU?^ zxUUnHodrP=Y;uxDmoLyV1M$+!X>a*?WR+uDduJ+|mgO!%^rp{P>ci@uy)!J`c$Rb3 z;G3xY=qf<4^cT?w72vux0(f0b%>Jp7e8S z_%JGZg)~RmHn(_>D%G!jx2C~KVEWRD-d{T>Pk!AuFNz_BY^CaEss}K)nfHdXNGhAw zotWC_7&U$O8U&$#HJFO1Zk%5OFYxsbM^C5+a6HN$Owjqg_)@{8XQLxG6RK=rJXPlKK7lu2o!@eZ$8L0j-<_X;SR9?^<}i%UC}pLh#XB~f>QdmE z9QfIT6HH4_Jj#KHXZ7cffowDc_uZXw!_&z7ad@d9v^o2gn_u0jx$&tk4PG3~Q4a)< zq3$PMlM|Z9!yJuoIJ&uC*b%yqGsAm$=ygJ3qhR`PrvHC2;U@Y$zSr^aj{-Sn>_(5_ zW4{(7)TIL-g&c_~f5UGTH9gw9BgH8V8Tz;VQdX2Ce8^|AC~O$#FrRs%qohCg7rt@} z6a~PTY<2z)2ZfEvp_>ieA4;ZB8a{}*-1nh4JkCbV)~+AMml&b;fZ>uom! zt_)S_N}HW7*MHaBN`I<9-d_Ll?egwA@&4~qOY6K zw;8oGd`P2~qu(2KSbrA3W2S*(l%Ey868zeB@@e5K z`UY3~HTcBv6&#Y?7K2X>Uv>{)`@FU9@CmoTCki*B*L(On#(fcGtY7=D>3-6rjnW6$ zzNBeSO9nT}n@O#fq3@eq zx;-k)6byI=JZS!AOaHf6by)xGtLfvcEH-w){oiHKeuHe*?2W~oE;sfA-BkXbsO=02 zp~^wpZ0!DTZf^Nup4^!d@w~I1xQPNYrmvr#Be$`>`Q15`GQTvCr_6C0y`=n!Dy5V^ z&V+Tc+4^bC$Ee#4eYezH1ahJ`sQJC_d(>?{)O)YQOrkPl$mbaij(4aOK&HdKnm&R1 z)^+(!1xIrgKqKbL2o*6jvu^#>U7^VbEepUa!6p9yXQiO&QQ}#94#=gXmx2+8BAp728DYA-9R1^UT!vHaEv<4kjihZhbu+b0#KM z_}|US!r%lJ35GBptoJohnoLYJ$(*}RYz+F4pZRSqrm9|%c?Q8}YGirqwvUmRm{@mr zHy0Pz!NEaTSeRlTN7g@6e{*9Cru`j-PpY1|jHX zw6ljY$|oW2+b7eRPlDriYNQwnR?gGKCYP5kBp<@LSxwKLCtl4D@>PcHdkJ%qr#_^4 zX+@B;=l1<@gW#KyCAekJlaq5;YxXoc){mxz^-Dyw)&sKS`nF6b;DK~&vsMy`u9ZB- zb#LjtYP4-PP%<{w)};!`WR0#=A-sNMl1&oaUZMaex5dmLFRPbkKp}gZ{9J(l^$J+) zZ?b03VBB3CWb~DQ&F+2BpSeCJSXq=E8lpXz>*4n#^6sMh1Sy1s&TNtEev9`5bRRiw@kq_!Wv zPm58%x!36%F-L-DGLua2bTo2%QnYEj#ZRA1j#*Fq7CUtB!I#f* zpJ(rq0NlcT~BJPc10s9+v^%c$e?<-;4Mz zTT+L1D!qPFj4L0$OQsl`v~o-|+eTXqYz+QqqE1pJQ~`}Qx%Qt|tKW`?uN3*+6w4)> z^4jWDN9J7I+)Lcx>OFcN;l=O8B5UN`_}>FR-CzfrROhD+&rm~Ua!Bpu3@4_`CV#L; zj<80>=Gah#mN5}(7b_9tQri!1suC)D%$0~4)s?9F_*k1-w^uetgnvs$7~MfnS*^J# zSkdeSss1E|xMNFM=vR#4f5;L_@};B5BQX8HMlFeQz`NtVDH^{U?h|P}aOgixys`@t%fEH~ zv)WI|=)OEueYMwE{5t)-nb&JoGigmML#Y2-jY_CK5+8!pz zwA0~c(z2U_@So9)C)F!(-HCc&haUgwDT(_%&s%faMG|-Jr5x0$YA9>devqYPW;?D> zb~)uuD2LPIdZNRJxI6)_J=VBrC%;b~LgMB0UBe3EbM2ObYs$?l3M>4-j^qivKfU{w zhrN1ZL2THXw=vLV8u<~TOZF85yYOM`_<;4$`S0uQ$@|xLt+n^df;F_wg7_xvqfZ@3 z@G5BY4Cpo!#O85@XPY6-&AG(=k^Ns$t-fTg^kG4379Pdq*eKWhe&Xx?U9RRso@Fjt ziX?|qvyvXdK1U1zmqpd<_DVd)D}FzM3`s98d{Q>Y~`@ z=dg_9=lq`%5t~hIi=)@Y7I%nCpH>R}QWP;7T^fHgdkY@k&TTE;Nfk26TXEu1C z=~M#oc{C#HEP4P{UXBS1J1t-*F2xqu!sp6HyVNFe7baJ@{}( z*b^lT5b!_R*Arcw3l|fK?K8!YuVGj>Ixx8xAz_ z_)-U<7?#_x((>5F6actUoo{>>J?Dw#J5>w0l8-;QnZ8k1DEjD+f7pjUdTMSYc2TJw zBRULYd0h{a0&>UXuQ~%()G|aItYnNm-2p;R4NDXUhUfuU$6Hr(jF%m%w2qSk!r~so zE0u`Zmie{&)Tf3N59tC(NV&;;1Fmuc0~VD=Oww_LBFVrajCs?WxtF*vfrR| zajD)69q2raD~Toz0uJpqzC<$0)u%CK4Q-8%^h2j(@t(CxRn?W12_ETKViMXw75_lz zz_@|EVY~&xf80LsErF+?91mf$F?7|`@`GwD3946IAOD;36P~I%R*qo2go3N%UU{chM;20YL?c zbGK5g0EdbEkouV7_Szqd(otpFfbU7H4ug%Kco15H)BfpV#ofeDDC8Z^#7T-&_c5p}MYR)Ild0Svd zO5ck<>)juQO}J^6Ac}*PWC+b%XuykfX0U` zN5?2g6Fd0R9FDl}RZ;|mDIH>{A>1*I(USLfYOsXabD&}geWg%@7G6x>+9ZI$c+2j& z%RXATU^K6tyP3?QAm{)e8|8Oj)k0fRb)CA#m#l7F1CGN(hXLw#J3eO2ckR!O&mb_M zQ2^X^PajfWy5gGrnzzQ%h^EWU3eUzMx3FH8qUZMTSzS8<1pta7=nvxKKWv;ad||=_ z_9z1nXd8-eZ5JDwBX_lL(HeZ8K#GOHO;2~})C*&srhU*pMT3^hh~qRIPdKU`>sV9k z%?qsdO{~I@G-r%?bn`Q2R7j#QNPh!`o?7~$efd5jeRYVHZAPtU%3gL0wdb{s1NWZaea^vS<(Pu%Ot(mDC^gyX9h2Q0u5YV2WH zMaMi5X#9oOtvi!^>>%9n`&W8+Qt$*m^PU3MyWj&0aQcb-va+hY%#HHNpgWHPuUUM6 z9p*qu-E}Ix5FzgW3pnYm!{IANnZ+SLU!0d;R^*%&usYbZa4}Ok>{-PmaI*mQ9s*40 z0gK(ybz65uG2#P5l0iZg+f%x$E@6BF#%!@FOv(1kzZ_RdrHAE za;QUu%}BBFa%W~B5@Yd>9DY~W@=x!hPFXG`o9w{D4-1rlmG8fXFY45w+zhz%C7R}i znOO%h{1WVwmuw6&yiWMxo*`b%YwFh$*#9ZRJ&AhENglv)!1xw>;$_iNV|2BMQ6}=o zV)ryG6gkCH%*XjI%QPQZ=0EmjC!-zQ!~Za$iu0_qxUU-EZtB0Zx$q{k@xBZ*Zx=x^ zz_5U*1epIgWfPbr@5R~j+1xxc-y(RbDS81+l}mXrmu@$Kzwa!Gshwp4{0z_oc0O>n z?ZT=#btqp9?2!aCD}*`W*j{E~enb5oonv5+1Ykb?*Y_J(5r5ukMvN^{K0{oM7pOqt z{6!@tMK|y)JC>KU?Y^N@v?$O5SjK(REfaFPEFQqt@C35LE-RW-kGwdKb$Uwd2@9~y z%Fv?mcs?UFZfomHIHjEi*uPJ%Z`~vV!~c|n3nYJ0-FDrBDV~76=~KR%@gN}uAJrq{IqdbM>(HW zOWl>5F!K{@YIapm+G8jRuBT~cp2(iMg9yL!cZZoR0K*x&ijws6#v!X53$__JbjN!q@wM zg<06FFv47q3-hl};v`ZEt@|G#gTT~}p%#xsz6aThw^rU}0+!qpx=w8-#JqbXUoWV7 zYMTSjc?}pEHb6ijAEw^FaB!%56PsGd*E4Zi)IARRK(+p6G?qF!TzmvT^^3pN`s$R`ncbT z2QCmrH_mCDht+J)8_wKU;{qxSaAmJF+=_{3@0_>b8P}xQ_vsdYeEk@rb7JKNj}!t5 zw8m#pYEh!W$F_rppAQbf*45WMgI;&~TWHcY0#xOMdX55~na~dni$ZqtFQ^F@amJdLX{c_+rBDvM^Ena_Md1XR&!(C3iBQ z??z#39AMK~AoVpupoqTWL_j=5-Ugd&G156{cROFHhQ7cq7xWwl`Uw2|FAxvyJ6}2M z9aA}9@a-z>jD@=dHL8XQ4yQR`73fT=?o^$G6q>1?$_(Fq3W@$P6#@GHfTJt!8WdK* zo^nyjNca(S@)hwqRgkkENvV>mEx5paR0H=Ey6zqp0@rC4o4$m; z&oqdf#h3y{hP1~JKh=ofK*r2dtc!cHF;5@`Big`efC5d!JL)F?OImjtY2v^k_%NKq zFtScXKKc?h*~tuYCzhbz=3cPuL%!`pYSHe-L8Hn5!%tuVq&inU(##E>xh*`j1f^bj z7wgUP&*KAg%1|tH%U$?%c_TydFswmSSC{66HH6(+faV~;k(m# z>3>SX?tTV1LjRXeJ`K}E&ZQ%RoG<== z9qyBGpncfag*vp#yf7Sirxq{$m1+%rL+1MR9|kJ)aCDV-(tsN$c5FF;FP#UTeTMA3 zLdh;H^kTm#2kKYV4QT%JdF_>!Tv6&tjhnDICnNZHQ2#$CE`F4oq39WH+{HjyZ(exl zD8PRk-N)BK3UZZ#uXywBkgW(kncv3mT+Yt8JFSu(-}u~&i7k;Ls0bT~7ybGgR6w+X zbzIs*OVji*u2qtuYA>HN3s@2mFWZu$drflFWH9^=$r?Cm_?4tgpQW5+(;k=z9ffm> z07c40%iB(AzdurtMg>G$Sg%y!i+7eG|A?c6)8)fJA{7!*$uTHqPhE6m1?bd!oJKbU zWgIkV5CJ7nr%YkYntRT)aWu)ijovSwR>UOt7|H>LEgK71wWdbIQI9&Qj!Uf%3xr^` zo3Mcpxudh}r*lD%5CC=PIR959n198VJ5F4*R1fFHeZ&xbetLuLnytCH3>!160)}(y z8&p8-#@KxFuuVB&bzjv+gIwoOKc1s!sxIRsT$Z>!gJ^~HY-w{*(bcD}dLB2=vjSEa zvHC2#@OoK!{f1w8URlDF*+it-sc`EWZ$SeQ>a|*4?Od*=CIv>Ceu1>`+P+u#X~yb5 z45#3wSV%!v_)k=iBTIcy0+&8>kS7Hy2Rje{mRw3}+kN&%y!G|RY*u%)6)c`$pAyfk z-yt4h&{`}&ff~ThSO2vqM=qIe2k8be>l7&_9eU zIA)%T@UvDryb;>+@Js;%AP=_jOZTdMcbp1k`Sqgu#d9w#7W_+Q+~1c4GC|Q_NskCw zPDolTG+5Nbm-qBpgkn5!hWF0Zj;mk~8_=S-o-s0GAGns{m-4=(a!iZ1Koz%q?pX2p z+2HGN#TIWkx-TcOkpgvrx0-}QMJVAREn<{bLZ->a`!`W&H&{>oX$GIF#Uj7WF+1)3 z>4E|oAeL$Ui`6Hp z?I*W+=wHouiS+o)Q2cX2ANG~o@kop)YFyy*&C1Tly@42`fF=WnGAMHB)sX~F}AC!b%#>B1ied@E=)=cU0 ze(;#}*g!EVN4)YqsWQ1}_4bOvlt#|GOB$v)19Xzw0Gy-(Gl>B@?0eGKp)eK6ChvAC)j#{ z=KYVL!4lL`OZ%JC-!IQRqAzlAl;svMirn;ktMzONN(LL*FzRlr?w@jxmB<2s$DO}~ z-SH?TgN1xzL`}JPWa}-XTPa56iHFO)b(ns*(boJ=U{aN3(p2ny`L0jFWaRJAk2N(R zb z{R`(8c(O)V92h;Pz1N`p`q$azYT5Rg$Y;%TKQx9j9s0#veRo{T>cPUs!WHruJd_!V zNnmi5pH_(zHVO2?Rm-;lwg|wNn%Q_{MT!&8LwKjQZs+e<2k!f(LN_sAfTDB0)#0nN zU+!dMJR=UMf|r48-rGaNC(~{P!VLss6Vj08W7nU#C88JM_uk4mCZ$;%m~2UfzKhtk zd-jO|w1|T`I&TCrmzFPG8vWnZru<>d*7%P0*Ef6CXICdo!r(zj4?{b%Lm)1zbu2g4 z$6r z6T-H4Z0ZgBaqY?X2?+YU%K4-JV{hL>hj%Q#N??A0q)WSKU42R5$@*hEj}NPoYnb2e zy|xiBs@niWi(12Sc9;lRt!E*PQC$(+Ir4u-Rn9+s0X=U|TBy3TILO<0&`9+}!;RLo zS4D_D_KAif57H0%gR$Vk6Az}I6i@{bz`V(CXp+t1jP>Te=VISfC&n-rFrfLo&$J)E z&!K?)U<-k({Qwtt@WNr-`0QM)syv3pWxSWG0ddcUXnhWHi3C4~|hU;sMQ zpLyzaTpA`UX?VXmj4yH`D@93RECV2Tpg({`Ne)B&r@#Do5TSGcWUs1U+K--Db}&T0 z1B*6_WahryS6hJ)w4EZvUD$k>-HDpHi@|~1FQI{^#7}m|F9GxCqVyPUE>-crA|Uo6 z^k_b6Ma#4*X95C)%85kwFY%r~`Vs=a@;@Gc){rV}x!KBPDba5Yu^acK;-9_+u9U#W}J8ngSMaIX_jv^h*9mMHa{^I<6a?`h1jx zSae@#0@+aLmaDpY=%GV#Rfeai9%!(RO%FX$wnIe{DpRosYu7a36|8`7IC=ymc_UaE zvO+Pc;0=KI8Q4|8%)06G;MtYEJ!P@e!%+8X1_9v%!|}AAm@ij=M38&lbM`-*kNue; zywzZgF>UsmKP*=rG=hzKs__jZb&s_fqc=`WQw5cP&5HI8PwFpPSP>!+UOGum^+fL< zYNiS*13?M2I?SREu8HB!Z$EglQ7&=-45)v#VsiZHj#G=DZ`jcsh^MHhGo!CRaM>*7 zTK|xLJ(~{G;lY_?3f}3AA1Wurw;D_=kg^-otpxA}j3vm0cuo}BvKrCe8)E#dzkR?c z2MVpY)PVtwpC%4>yvaM;_}u)241mXC(;`?al|HNGlnVyfUkEl1zaWeyw*_Z_bS0VNP@{Kj)K5f86~?n%)RS5@7}A&uVZ7?b zOC?bE`@Ht2>Co|wyPjS@isi*a{l-Sm}6ZY_;g-wQA_MCf~8ZFL6eh9RH61fT|26Ayr& z5;uIqEL>vk)0dJ}9T(yX^Cv#h*LN`=VCzk8T>B>pMc*)mmDVC)m9kUBwJYDhK^;77 zh@L$07(@k5ZFsh+S;C>!$Bby=xln$qx+!cBje^^#8S%8Mp41CY{d(=@&TD}QgBm2_ zeADK6z$G+vEb}StDn?oWndpBd|19J-h17w&7*@LdThiUjfgvYZ2t?BndFpWqtXr&) zLxlfG&R!vfQ)mriGA8rle$Do`H+0UX6kVmMPk`BFpm9NLddRX}s|gOdZZXLclGnP- zq41;POUkO}aE!BON6DnY;@tMClan;`dd?_T5u`TE=~)u$br(v*NPG{4ba5YB)Z>s@Wf*A;tjMEjxTXwXz8bQ zOn+dNJ{vRt7B17N&SNz2$MMif~O)+T@!;#D*4=AOjopC^s6lYJnz+HFT*a0ge8puGSXMT*(#NX>L@pkL)SZQoR2WGKGoZ&Bo{#d69Q2t8l@k+Si1Lt%FIckOG zy1*Vqh~lr;jcC1m=gX^W4RLCxN2I)9r7Ha!+wTAQRRGFPxXA&87rZY|Sj9EmLeY3x zlv>Lekh+y)wOdBRC}e>`-G9q>wN;#}^tpeqhIb~TJK%dUSJ_QQeL1tBSy3;GKTTcX zBM3V<(CU&GzejP1L>sFitzqSO%crT0o1-8-26*7hNS-KTCw{1NOQi?4wmG}=k}xRH z57~?q=aPRAs6*k`Jo@qP0kT!gp>#9qP^l-sjRTmgEguNytnc^5{a!8gHpzO2cvTF9 z!0OHFw0gfkdm?rDZZrOW_e3g>Q=!lh!QClZ&=dJuMCy-)N#2<9VNz9nZY!jY=c$g0 zklJ6&O2AJZ>^6VZzmCQMj(huo;AHZ?Y4bj0zkojwj%p$-S1KK>Zx2r<9Bj`QSw)iD j5B=Xfx59{uZI9)r1XoR$V)vVWG3wtk)~V9^@A3ZwM7s($ literal 0 HcmV?d00001 diff --git a/examples/react-native/babel.config.js b/examples/react-native/babel.config.js new file mode 100644 index 0000000000..2900afe9d8 --- /dev/null +++ b/examples/react-native/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function(api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/examples/react-native/package-lock.json b/examples/react-native/package-lock.json new file mode 100644 index 0000000000..4738c3361e --- /dev/null +++ b/examples/react-native/package-lock.json @@ -0,0 +1,6775 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/compat-data": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", + "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", + "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", + "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-module-imports": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", + "requires": { + "@babel/compat-data": "^7.10.1", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "requires": { + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", + "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + }, + "@babel/helper-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/helper-wrap-function": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "requires": { + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/plugin-external-helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.1.tgz", + "integrity": "sha512-xFXc/Ts/gsgCrkh3waZbVdkzmhtnlw1L972gx96pmj8hXvloHnPTDgZ07vTDve9ilpe9TcrIMWLU7rg6FqnAWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", + "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz", + "integrity": "sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-decorators": "^7.10.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", + "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz", + "integrity": "sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-export-default-from": "^7.10.1" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", + "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", + "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-numeric-separator": "^7.10.1" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", + "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", + "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", + "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz", + "integrity": "sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz", + "integrity": "sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", + "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", + "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz", + "integrity": "sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", + "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", + "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz", + "integrity": "sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-flow": "^7.10.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", + "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", + "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "requires": { + "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", + "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", + "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-object-assign": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.1.tgz", + "integrity": "sha512-poBEVwzcTjv6p92ZcnWBUftzyXFCy/Zg/eCQsayu5/ot2+qwnasNvCCKPwdgprgDRzbHVUhh/fzI9rCoFOHLbg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", + "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", + "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.1", + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", + "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", + "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz", + "integrity": "sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", + "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz", + "integrity": "sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-typescript": "^7.10.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", + "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/preset-env": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", + "requires": { + "@babel/compat-data": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-dynamic-import": "^7.10.1", + "@babel/plugin-proposal-json-strings": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-private-methods": "^7.10.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.1", + "@babel/plugin-transform-arrow-functions": "^7.10.1", + "@babel/plugin-transform-async-to-generator": "^7.10.1", + "@babel/plugin-transform-block-scoped-functions": "^7.10.1", + "@babel/plugin-transform-block-scoping": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.1", + "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-destructuring": "^7.10.1", + "@babel/plugin-transform-dotall-regex": "^7.10.1", + "@babel/plugin-transform-duplicate-keys": "^7.10.1", + "@babel/plugin-transform-exponentiation-operator": "^7.10.1", + "@babel/plugin-transform-for-of": "^7.10.1", + "@babel/plugin-transform-function-name": "^7.10.1", + "@babel/plugin-transform-literals": "^7.10.1", + "@babel/plugin-transform-member-expression-literals": "^7.10.1", + "@babel/plugin-transform-modules-amd": "^7.10.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-umd": "^7.10.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.10.1", + "@babel/plugin-transform-object-super": "^7.10.1", + "@babel/plugin-transform-parameters": "^7.10.1", + "@babel/plugin-transform-property-literals": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-reserved-words": "^7.10.1", + "@babel/plugin-transform-shorthand-properties": "^7.10.1", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/plugin-transform-sticky-regex": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-typeof-symbol": "^7.10.1", + "@babel/plugin-transform-unicode-escapes": "^7.10.1", + "@babel/plugin-transform-unicode-regex": "^7.10.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.2", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/register": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", + "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", + "requires": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.13", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@expo/vector-icons": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-10.2.0.tgz", + "integrity": "sha512-dYe0SW/xbzWRtWG7i1pc3QPMGMbdReVgP02XlwMkS4srAAjF0cZQVa3ZgZ6qzxI+OzKudpDXZRmENNth/b263g==", + "requires": { + "lodash": "^4.17.4" + } + }, + "@expo/websql": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@expo/websql/-/websql-1.0.1.tgz", + "integrity": "sha1-//DPnBuqH3D54dZYt8OaQg2bEKk=", + "requires": { + "argsarray": "^0.0.1", + "immediate": "^3.2.2", + "noop-fn": "^1.0.0", + "pouchdb-collections": "^1.0.1", + "tiny-queue": "^0.2.1" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@react-native-community/cli-debugger-ui": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz", + "integrity": "sha512-m3X+iWLsK/H7/b7PpbNO33eQayR/+M26la4ZbYe1KRke5Umg4PIWsvg21O8Tw4uJcY8LA5hsP+rBi/syBkBf0g==", + "requires": { + "serve-static": "^1.13.1" + } + }, + "@react-native-community/cli-platform-android": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-3.1.4.tgz", + "integrity": "sha512-ClSdY20F0gzWVLTqCv7vHjnUqOcuq10jd9GgHX6lGSc2GI+Ql3/aQg3tmG4uY3KXNNwAv3U8QCoYgg1WGfwiHA==", + "requires": { + "@react-native-community/cli-tools": "^3.0.0", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "jetifier": "^1.6.2", + "logkitty": "^0.6.0", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "@react-native-community/cli-platform-ios": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.2.0.tgz", + "integrity": "sha512-pzEnx68H6+mHBq5jsMrr3UmAmkrLSMlC9BZ4yoUdfUXCQq6/R70zNYvH4hjUw8h2Al7Kgq53UzHUsM0ph8TSWQ==", + "requires": { + "@react-native-community/cli-tools": "^3.0.0", + "chalk": "^2.4.2", + "js-yaml": "^3.13.1", + "xcode": "^2.0.0" + } + }, + "@react-native-community/cli-tools": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz", + "integrity": "sha512-8IhQKZdf3E4CR8T7HhkPGgorot/cLkRDgneJFDSWk/wCYZAuUh4NEAdumQV7N0jLSMWX7xxiWUPi94lOBxVY9g==", + "requires": { + "chalk": "^2.4.2", + "lodash": "^4.17.5", + "mime": "^2.4.1", + "node-fetch": "^2.5.0" + }, + "dependencies": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, + "@react-native-community/cli-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-3.0.0.tgz", + "integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/fbemitter": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@types/fbemitter/-/fbemitter-2.0.32.tgz", + "integrity": "sha1-jtIE2g9U6cjq7DGx7skeJRMtCCw=" + }, + "@types/invariant": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.33.tgz", + "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/lodash": { + "version": "4.14.155", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.155.tgz", + "integrity": "sha512-vEcX7S7aPhsBCivxMwAANQburHBtfN9RdyXFk84IJmu2Z4Hkg1tOFgaslRiEqqvoLtbCBi6ika1EMspE+NZ9Lg==" + }, + "@types/lodash.zipobject": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/lodash.zipobject/-/lodash.zipobject-4.1.6.tgz", + "integrity": "sha512-30khEHqHWaLgMZR35wtkg07OmHiNiDQyor0SK7oj8Sy05tg6jDjPmJybeZ64WKeFZUEgs1tdJwdT0xUl+2qUgQ==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==" + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, + "@types/websql": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@types/websql/-/websql-0.0.27.tgz", + "integrity": "sha1-Yhpman8CAY58u0q6uVaiVzbCfXE=" + }, + "@types/yargs": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + }, + "@unimodules/core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-5.1.2.tgz", + "integrity": "sha512-iCWEbzsNHqDfL6p8FyCGPnL2EW7vdgMJsNNSlWtM/gl8kePdqZMI7aOxTC4cdRS2xm0wzxuDBtpfJkzZsKINZg==", + "requires": { + "compare-versions": "^3.4.0" + } + }, + "@unimodules/react-native-adapter": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.2.0.tgz", + "integrity": "sha512-S3HMEeQbV6xs7ORRcxXFGMk38DAnxqNcZG9T8JkX/KGY9ILUUqTS/e68+d849B6beEeglNMcOxyjwlqjykN+FA==", + "requires": { + "invariant": "^2.2.4", + "lodash": "^4.5.0", + "prop-types": "^15.6.1" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "requires": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argsarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", + "integrity": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "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==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "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=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "art": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", + "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-module-resolver": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", + "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", + "requires": { + "find-babel-config": "^1.1.0", + "glob": "^7.1.2", + "pkg-up": "^2.0.0", + "reselect": "^3.0.1", + "resolve": "^1.4.0" + } + }, + "babel-plugin-react-native-web": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.11.7.tgz", + "integrity": "sha512-CxE7uhhqkzAFkwV2X7+Mc/UVPujQQDtja/EGxCXRJvdYRi72QTmaJYKbK1lV9qgTZuB+TDguU89coaA9Z1BNbg==" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "babel-preset-expo": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-8.1.1.tgz", + "integrity": "sha512-73VtU6+IsOPMHsXIXHJTycoAmE9hDCvWY2E14E3sVL/EhOJsH3YbWirRTiUiklfEMAEaOxBRc4C4GxqGmaFjxQ==", + "requires": { + "@babel/plugin-proposal-decorators": "^7.6.0", + "@babel/preset-env": "^7.6.3", + "babel-plugin-module-resolver": "^3.2.0", + "babel-plugin-react-native-web": "^0.11.7", + "metro-react-native-babel-preset": "^0.56.0" + } + }, + "babel-preset-fbjs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "badgin": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.1.4.tgz", + "integrity": "sha512-BQ1m7TA7IehXb3/9b3cNH6TwIKcdqqJa/E4Z4fO40tSs6HPZWopPvx9QgHeUEd6Aays1BxQXjBpO+yrSYuRSOw==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "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==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "blueimp-md5": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.16.0.tgz", + "integrity": "sha512-j4nzWIqEFpLSbdhUApHRGDwfXbV8ALhqOn+FY5L6XBdKPAXU9BpGgFSbDsgqogfqPPR9R2WooseWCsfhfEC6uQ==" + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "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==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001077", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001077.tgz", + "integrity": "sha512-AEzsGvjBJL0lby/87W96PyEvwN0GsYvk5LHsglLg9tW37K4BqvAvoSCdWIE13OZQ8afupqZ73+oL/1LkedN8hA==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", + "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==" + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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=", + "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=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "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=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "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==", + "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=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colorette": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", + "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==" + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-urls/-/compare-urls-2.0.0.tgz", + "integrity": "sha512-eCJcWn2OYFEIqbm70ta7LQowJOOZZqq1a2YbbFCFI1uwSvj+TWMwXVn7vPR1ceFNcAIt5RSTDbwdlX82gYLTkA==", + "requires": { + "normalize-url": "^2.0.1" + } + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "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=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "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-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "requires": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "dayjs": { + "version": "1.8.28", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", + "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==" + }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "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=" + }, + "deep-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz", + "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.459", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.459.tgz", + "integrity": "sha512-aN3Z89qEYIwVjzGi9SrcTjjopRZ3STUA6xTufS0fxZy8xOO2iqVw8rYKdT32CHgOKHOYj5KGmz3n6xUKE4QJiQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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" + } + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + } + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "envinfo": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "requires": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expo": { + "version": "37.0.12", + "resolved": "https://registry.npmjs.org/expo/-/expo-37.0.12.tgz", + "integrity": "sha512-roqGc7zTh3esYxAi95AWpNkrztO6istuKQNfYNwHbWmHbqbilZLzRNb844WWK++Uy4UxaObO5ymmacZyq4JnwA==", + "requires": { + "@babel/runtime": "^7.1.2", + "@expo/vector-icons": "^10.0.2", + "@types/fbemitter": "^2.0.32", + "@types/invariant": "^2.2.29", + "@types/lodash.zipobject": "^4.1.4", + "@types/qs": "^6.5.1", + "@unimodules/core": "~5.1.0", + "@unimodules/react-native-adapter": "~5.2.0", + "babel-preset-expo": "~8.1.0", + "badgin": "^1.1.2", + "cross-spawn": "^6.0.5", + "expo-asset": "~8.1.5", + "expo-constants": "~9.0.0", + "expo-error-recovery": "~1.1.0", + "expo-file-system": "~8.1.0", + "expo-font": "~8.1.0", + "expo-keep-awake": "~8.1.0", + "expo-linear-gradient": "~8.1.0", + "expo-linking": "~1.0.0", + "expo-location": "~8.1.0", + "expo-permissions": "~8.1.0", + "expo-sqlite": "~8.1.0", + "expo-web-browser": "~8.2.1", + "fbemitter": "^2.1.1", + "invariant": "^2.2.2", + "lodash": "^4.6.0", + "md5-file": "^3.2.3", + "nullthrows": "^1.1.0", + "pretty-format": "^23.6.0", + "prop-types": "^15.6.0", + "qs": "^6.5.0", + "react-native-view-shot": "3.1.2", + "serialize-error": "^2.1.0", + "unimodules-app-loader": "~1.0.1", + "unimodules-barcode-scanner-interface": "~5.1.0", + "unimodules-camera-interface": "~5.1.0", + "unimodules-constants-interface": "~5.1.0", + "unimodules-face-detector-interface": "~5.1.0", + "unimodules-file-system-interface": "~5.1.0", + "unimodules-font-interface": "~5.1.0", + "unimodules-image-loader-interface": "~5.1.0", + "unimodules-permissions-interface": "~5.1.0", + "unimodules-sensors-interface": "~5.1.0", + "unimodules-task-manager-interface": "~5.1.0", + "uuid": "^3.4.0" + } + }, + "expo-asset": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-8.1.5.tgz", + "integrity": "sha512-Ivc4GsAXawfFT6IgjvV4BHXFdAHT+1ZhewuBm/mQ1vvkYOqcPksDVRuChdbfvgAl82lbDfAN/FeEcIfGnvevEQ==", + "requires": { + "blueimp-md5": "^2.10.0", + "invariant": "^2.2.4", + "md5-file": "^3.2.3", + "path-browserify": "^1.0.0", + "url-parse": "^1.4.4" + } + }, + "expo-constants": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-9.0.0.tgz", + "integrity": "sha512-1kqZMM8Ez5JT3sTEx8I69fP6NYFLOJjeM6Z63dD/m2NiwvzSADiO5+BhghnWNGN1L3bxbgOjXS6EHtS7CdSfxA==" + }, + "expo-error-recovery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expo-error-recovery/-/expo-error-recovery-1.1.0.tgz", + "integrity": "sha512-33aRfPaXdAt0df1TL26JjM5qCAoEW8RAExjgMgunPcdQcf4sWiWFm3qYL8zrO/8DM4uUq4X2FCuPLHMlOYT/aw==" + }, + "expo-file-system": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-8.1.0.tgz", + "integrity": "sha512-xb4roeU8CotW8t3LkmsrliNbgFpY2KB+3sW1NnujnH39pFVwCd/kfujCYzRauj8aUy/HhSq+3xGkQTpC7pSjVw==", + "requires": { + "uuid": "^3.4.0" + } + }, + "expo-font": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-8.1.1.tgz", + "integrity": "sha512-z6008K7YSA7wpJ1mNyG2eSYUhEoFVjdL2uAbwaHFpsqwxDS4tcdKHoWkanIUiEnsjtHK7Uk0ywKJ8MRzmCaklw==", + "requires": { + "fbjs": "1.0.0", + "fontfaceobserver": "^2.1.0" + } + }, + "expo-keep-awake": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-8.1.0.tgz", + "integrity": "sha512-RNPwWvpwsJwJS8ZI1yklKyVQ6l2NNZBCN2aSgQMRza2SABnpFFzDLHQwMo7DC+nbmrOueMvCIDr0VI3xrzGfEg==" + }, + "expo-linear-gradient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-8.1.0.tgz", + "integrity": "sha512-AIy2pOXQRcgk2XE5IgAzd1S2jTFLutiDfveNm6m3fPAk00Rw4qFe98qzte1ayNrGYLJvQ2xq/Y7C0BmBP051mg==" + }, + "expo-linking": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-1.0.1.tgz", + "integrity": "sha512-PZNT/1dJv7ZBAXxUFzcvQ5MN74E/yOPrk4UwnxvLoNOmo5fyXcP3BJJPQSIKFGLvVtzl71KJJxYtb+KsR4JvNQ==", + "requires": { + "expo-constants": "~9.0.0", + "qs": "^6.5.0", + "url-parse": "^1.4.4" + } + }, + "expo-location": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-8.1.0.tgz", + "integrity": "sha512-G9JvsK1t9Z5Iybf+FCG81Jgm9Ee9leqpazxOPVabUJEWu/55Iex3yLGX04BuIA4ozAlJKBPzkhPdyqKdC7zrSw==", + "requires": { + "invariant": "^2.2.4" + } + }, + "expo-permissions": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-permissions/-/expo-permissions-8.1.0.tgz", + "integrity": "sha512-QBHD+1J9+sGFnhoEGzMRchPweeEE0OJ9ehG/0l1BMRBA7qsLS9vRC1FTJ55NwjI0Kr4RTha9r6ZX1kZHT09f/w==" + }, + "expo-sqlite": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-8.1.0.tgz", + "integrity": "sha512-ziw6dbV1/sZErDkoGjG0afokyuKQqDtUuJglbLz9rQ6zNS1ceF3AjuEyfsWPDc2LL+QEdcnQODW7VUJelIk+0Q==", + "requires": { + "@expo/websql": "^1.0.1", + "@types/websql": "^0.0.27", + "lodash": "^4.17.15" + } + }, + "expo-web-browser": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-8.2.1.tgz", + "integrity": "sha512-cENMuq6nhHRdJlEt0Fk1cPDK5aid8+znJeO6rFoIs7+PokMKtcVYBpzQI/TJlxRP3pjMm0qOISnLlMbDlZ+bfg==", + "requires": { + "compare-urls": "^2.0.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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=", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "fbemitter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "requires": { + "fbjs": "^0.8.4" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + } + } + }, + "fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "requires": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "fbjs-scripts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", + "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", + "requires": { + "@babel/core": "^7.0.0", + "ansi-colors": "^1.0.1", + "babel-preset-fbjs": "^3.2.0", + "core-js": "^2.4.1", + "cross-spawn": "^5.1.0", + "fancy-log": "^1.3.2", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "semver": "^5.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "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==", + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "fontfaceobserver": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz", + "integrity": "sha512-ReOsO2F66jUa0jmv2nlM/s1MiutJx/srhAe2+TE8dJCMi02ZZOcCTxTCQFr3Yet+uODUtnr4Mewg+tNQ+4V1Ng==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "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=" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "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==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hermes-engine": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.2.1.tgz", + "integrity": "sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==" + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + }, + "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" + } + }, + "image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==" + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inline-style-prefixer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz", + "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==", + "requires": { + "css-in-js-utils": "^2.0.0" + } + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "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=", + "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=", + "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=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "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=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "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==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.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==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jetifier": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.5.tgz", + "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsc-android": { + "version": "245459.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", + "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "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==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "requires": { + "leven": "^3.1.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "logkitty": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.6.1.tgz", + "integrity": "sha512-cHuXN8qUZuzX/7kB6VyS7kB4xyD24e8gyHXIFNhIv+fjW3P+jEXNUhj0o/7qWJtv7UZpbnPgUqzu/AZQ8RAqxQ==", + "requires": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^12.0.5" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "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==" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "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==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "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==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "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==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "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==", + "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", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5-file": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", + "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", + "requires": { + "buffer-alloc": "^1.1.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "metro": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.56.4.tgz", + "integrity": "sha512-Kt3OQJQtQdts0JrKnyGdLpKHDjqYBgIfzvYrvfhmFCkKuZ8aqRlVnvpfjQ4/OBm0Fmm9NyyxbNRD9VIbj7WjnA==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/plugin-external-helpers": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "async": "^2.4.0", + "babel-preset-fbjs": "^3.1.2", + "buffer-crc32": "^0.2.13", + "chalk": "^2.4.1", + "concat-stream": "^1.6.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "eventemitter3": "^3.0.0", + "fbjs": "^1.0.0", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^24.7.1", + "jest-worker": "^24.6.0", + "json-stable-stringify": "^1.0.1", + "lodash.throttle": "^4.1.1", + "merge-stream": "^1.0.1", + "metro-babel-register": "^0.56.4", + "metro-babel-transformer": "^0.56.4", + "metro-cache": "^0.56.4", + "metro-config": "^0.56.4", + "metro-core": "^0.56.4", + "metro-inspector-proxy": "^0.56.4", + "metro-minify-uglify": "^0.56.4", + "metro-react-native-babel-preset": "^0.56.4", + "metro-resolver": "^0.56.4", + "metro-source-map": "^0.56.4", + "metro-symbolicate": "^0.56.4", + "mime-types": "2.1.11", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.0", + "resolve": "^1.5.0", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "temp": "0.8.3", + "throat": "^4.1.0", + "wordwrap": "^1.0.0", + "write-file-atomic": "^1.2.0", + "ws": "^1.1.5", + "xpipe": "^1.0.5", + "yargs": "^9.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" + }, + "mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "requires": { + "mime-db": "~1.23.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, + "metro-babel-register": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.56.4.tgz", + "integrity": "sha512-Phm6hMluOWYqfykftjJ1jsTpWvbgb49AC/1taxEctxUdRCZlFgZwBleJZAhQYxJD5J+ikFkEbHDzePEXb29KVA==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "core-js": "^2.2.2", + "escape-string-regexp": "^1.0.5" + } + }, + "metro-babel-transformer": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.4.tgz", + "integrity": "sha512-IOi4ILgZvaX7GCGHBJp79paNVOq5QxhhbyqAdEJgDP8bHfl/OVHoVKSypfrsMSKSiBrqxhIjyc4XjkXsQtkx5g==", + "requires": { + "@babel/core": "^7.0.0", + "metro-source-map": "^0.56.4" + } + }, + "metro-cache": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.56.4.tgz", + "integrity": "sha512-d1hiUSKwtRsuMxUhHVJ3tjK2BbpUlJGvTyMWohK8Wxx+0GbnWRWWFcI4vlCzlZfoK0VtZK2MJEl5t7Du1mIniQ==", + "requires": { + "jest-serializer": "^24.4.0", + "metro-core": "^0.56.4", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } + }, + "metro-config": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.56.4.tgz", + "integrity": "sha512-O85QDHwWdMn/8ERe13y4a6vbZL0AHyO8atTvL+9BCulLEO+FQBi1iJjr3+ViLa8cf0m5dRftDsa7P47m5euk4A==", + "requires": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^24.7.0", + "metro": "^0.56.4", + "metro-cache": "^0.56.4", + "metro-core": "^0.56.4", + "pretty-format": "^24.7.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==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "metro-core": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.56.4.tgz", + "integrity": "sha512-hMzkBdgPt5Zm9nr/1KtIT+A6H7TNiLVCEGG5OiAXj8gTRsA2yy7wAdQpwy0xbE+zi88t/pLOzXpd3ClG/YxyWg==", + "requires": { + "jest-haste-map": "^24.7.1", + "lodash.throttle": "^4.1.1", + "metro-resolver": "^0.56.4", + "wordwrap": "^1.0.0" + } + }, + "metro-inspector-proxy": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz", + "integrity": "sha512-E1S3MO25mWKmcLn1UQuCDiS0hf9P2Fwq8sEAX5lBLoZbehepNH+4xJ3xXSY51JX4dozBrE8GGoKL4ll3II40LA==", + "requires": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "rxjs": "^5.4.3", + "ws": "^1.1.5", + "yargs": "^9.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "metro-minify-uglify": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz", + "integrity": "sha512-BHgj7+BKEK2pHvWHUR730bIrsZwl8DPtr49x9L0j2grPZ5/UROWXzEr8VZgIss7fl64t845uu1HXNNyuSj2EhA==", + "requires": { + "uglify-es": "^3.1.9" + } + }, + "metro-react-native-babel-preset": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.4.tgz", + "integrity": "sha512-CzbBDM9Rh6w8s1fq+ZqihAh7DDqUAcfo9pPww25+N/eJ7UK436Q7JdfxwdIPpBwLFn6o6MyYn+uwL9OEWBJarA==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "metro-react-native-babel-transformer": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.4.tgz", + "integrity": "sha512-ng74eutuy1nyGI9+TDzzVAVfEmNPDlapV4msTQMKPi4EFqo/fBn7Ct33ME9l5E51pQBBnxt/UwcpTvd13b29kQ==", + "requires": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.1.2", + "metro-babel-transformer": "^0.56.4", + "metro-react-native-babel-preset": "^0.56.4", + "metro-source-map": "^0.56.4" + } + }, + "metro-resolver": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.56.4.tgz", + "integrity": "sha512-Ug4ulVfpkKZ1Wu7mdYj9XLGuOqZTuWCqEhyx3siKTc/2eBwKZQXmiNo5d/IxWNvmwL/87Abeb724I6CMzMfjiQ==", + "requires": { + "absolute-path": "^0.0.0" + } + }, + "metro-source-map": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.4.tgz", + "integrity": "sha512-f1P9/rpFmG3Z0Jatiw2zvLItx1TwR7mXTSDj4qLDCWeVMB3kEXAr3R0ucumTW8c6HfpJljeRBWzYFXF33fd81g==", + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "^0.56.4", + "ob1": "^0.56.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "metro-symbolicate": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.4.tgz", + "integrity": "sha512-8mCNNn6zV5FFKCIcRgI7736Xl+owgvYuy8qanPxZN36f7utiWRYeB+PirEBPcglBk4qQvoy2lT6oPULNXZQbbQ==", + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "^0.56.4", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "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" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==" + }, + "noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha1-XzPUfxPSFQ35PgywNmmemC94/78=" + }, + "normalize-css-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz", + "integrity": "sha1-Apkel8zOxmI/5XOvu/Deah8+n40=" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "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=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "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=" + }, + "ob1": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.4.tgz", + "integrity": "sha512-URgFof9z2wotiYFsqlydXtQfGV81gvBI2ODy64xfd3vPo+AYom5PVDX4t4zn23t/O+S2IxqApSQM8uJAybmz7w==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "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==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "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=", + "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==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, + "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=" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "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==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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=", + "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=" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "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==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "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==" + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + } + } + }, + "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=" + }, + "pouchdb-collections": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-1.0.1.tgz", + "integrity": "sha1-/mOhfal3YRq+98uAJssalVP9g1k=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "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==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "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==" + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-devtools-core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.3.tgz", + "integrity": "sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ==", + "requires": { + "shell-quote": "^1.6.1", + "ws": "^3.3.1" + }, + "dependencies": { + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-native": { + "version": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz", + "integrity": "sha512-OYDEaGp8tf9/hAJx4nA/WA2+Uju4OoRhtwnDiPvlE48co4gkK1Je/nWy3SLagMNLtLRosa39iqZGXVK0APd+9A==", + "requires": { + "@babel/runtime": "^7.0.0", + "@react-native-community/cli": "^3.0.0-alpha.1", + "@react-native-community/cli-platform-android": "^3.0.0-alpha.1", + "@react-native-community/cli-platform-ios": "^3.0.0-alpha.1", + "abort-controller": "^3.0.0", + "art": "^0.10.0", + "base64-js": "^1.1.2", + "connect": "^3.6.5", + "create-react-class": "^15.6.3", + "escape-string-regexp": "^1.0.5", + "event-target-shim": "^5.0.1", + "fbjs": "^1.0.0", + "fbjs-scripts": "^1.1.0", + "hermes-engine": "^0.2.1", + "invariant": "^2.2.4", + "jsc-android": "^245459.0.0", + "metro-babel-register": "^0.56.0", + "metro-react-native-babel-transformer": "^0.56.0", + "metro-source-map": "^0.56.0", + "nullthrows": "^1.1.0", + "pretty-format": "^24.7.0", + "promise": "^7.1.1", + "prop-types": "^15.7.2", + "react-devtools-core": "^3.6.3", + "react-refresh": "^0.4.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.15.0", + "stacktrace-parser": "^0.1.3", + "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@react-native-community/cli": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-3.2.1.tgz", + "integrity": "sha512-bZ/bfZ+9r1gQSxp6t7+00DcpC6vmbVYSvzUCFM/yo5k8bhsDdcy8aocscIaXXVGG+v9Edri/Q7hH9ks7L18/Rg==", + "requires": { + "@hapi/joi": "^15.0.3", + "@react-native-community/cli-debugger-ui": "^3.0.0", + "@react-native-community/cli-tools": "^3.0.0", + "@react-native-community/cli-types": "^3.0.0", + "chalk": "^2.4.2", + "command-exists": "^1.2.8", + "commander": "^2.19.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "didyoumean": "^1.2.1", + "envinfo": "^7.1.0", + "errorhandler": "^1.5.0", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^7.0.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.3", + "inquirer": "^3.0.6", + "lodash": "^4.17.5", + "metro": "^0.56.0", + "metro-config": "^0.56.0", + "metro-core": "^0.56.0", + "metro-react-native-babel-transformer": "^0.56.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "morgan": "^1.9.0", + "node-notifier": "^5.2.1", + "open": "^6.2.0", + "ora": "^3.4.0", + "plist": "^3.0.0", + "pretty-format": "^25.1.0", + "semver": "^6.3.0", + "serve-static": "^1.13.1", + "shell-quote": "1.6.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1", + "ws": "^1.1.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.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==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.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==", + "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=" + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "react-native-view-shot": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/react-native-view-shot/-/react-native-view-shot-3.1.2.tgz", + "integrity": "sha512-9u9fPtp6a52UMoZ/UCPrCjKZk8tnkI9To0Eh6yYnLKFEGkRZ7Chm6DqwDJbYJHeZrheCCopaD5oEOnRqhF4L2Q==" + }, + "react-native-web": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.11.7.tgz", + "integrity": "sha512-w1KAxX2FYLS2GAi3w3BnEZg/IUu7FdgHnLmFKHplRnHMV3u1OPB2EVA7ndNdfu7ds4Rn2OZjSXoNh6F61g3gkA==", + "requires": { + "array-find-index": "^1.0.2", + "create-react-class": "^15.6.2", + "debounce": "^1.2.0", + "deep-assign": "^3.0.0", + "fbjs": "^1.0.0", + "hyphenate-style-name": "^1.0.2", + "inline-style-prefixer": "^5.0.3", + "normalize-css-color": "^1.0.2", + "prop-types": "^15.6.0", + "react-timer-mixin": "^0.13.4" + } + }, + "react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==" + }, + "react-timer-mixin": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz", + "integrity": "sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "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=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "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==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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==" + } + } + }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + }, + "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==", + "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=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-plist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", + "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", + "requires": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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==", + "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=", + "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==", + "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==", + "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==", + "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==", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "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.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "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==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "requires": { + "type-fest": "^0.7.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "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=", + "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=" + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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==", + "requires": { + "safe-buffer": "~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==", + "requires": { + "ansi-regex": "^4.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==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + } + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "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=", + "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=", + "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==", + "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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "unimodules-app-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-1.0.2.tgz", + "integrity": "sha512-ryRAqSndIkCnWAr5jzSL6yjOrCBeIihItELUTykzi4ZxYV9j4Yl0Sd5+VKl1v/UvB6UNdgIGY4oU7S1b173/FA==" + }, + "unimodules-barcode-scanner-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-barcode-scanner-interface/-/unimodules-barcode-scanner-interface-5.1.0.tgz", + "integrity": "sha512-FUau0mm4sBOGmlekltY0iAimJ438w3rtWiv6hcjE77Map527aCH3GyjnZSw78raVxe598EXhWHviuwRxOGINYg==" + }, + "unimodules-camera-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-camera-interface/-/unimodules-camera-interface-5.1.0.tgz", + "integrity": "sha512-uwBmZ3XS6vkdzRAmiDhUE/P7fafN7ufXoRuBDGoX/Q9kIiKg61D8HzTmhLMelvJFW6eCjoBJfh/zRyZ54qcjGg==" + }, + "unimodules-constants-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-constants-interface/-/unimodules-constants-interface-5.1.0.tgz", + "integrity": "sha512-TlrqwtKt2G0QH4Fn1ko3tRtLX+eUGSnCBuu1TiAGlsQ5FM/1+AGuJNftHdUwZY1DncIAlw6lhNW+amv0hw5ocg==" + }, + "unimodules-face-detector-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-face-detector-interface/-/unimodules-face-detector-interface-5.1.0.tgz", + "integrity": "sha512-0qDA6j1WvPM98q32aKvRdFhgSa9Nu8lqNUlrgE740UTYsAmfQl8lM/r2TOuR1k3dVC14q33YvLizSOYM5FLhAw==" + }, + "unimodules-file-system-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-file-system-interface/-/unimodules-file-system-interface-5.1.0.tgz", + "integrity": "sha512-G2QXhEXY3uHuDD50MWI7C/nesbVlf2C0QHTs+fAt1VpmWYWfdDaeqgO67f/QRz8FH8xm3ul9XvgP6nA+P0xfIg==" + }, + "unimodules-font-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-font-interface/-/unimodules-font-interface-5.1.0.tgz", + "integrity": "sha512-ZKycNecNN0xxGIo9Db2n8RYU+ijlc+hzpE5acVSiIlmMjTsiOODRLkF++yKsZxglGXn/blgtBLrcTQr4jJV4MQ==" + }, + "unimodules-image-loader-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-image-loader-interface/-/unimodules-image-loader-interface-5.1.0.tgz", + "integrity": "sha512-yU1OPWMtZ9QcW5CxLE1DYWrpJGZ1hRGdoFG3vyk4syUS8QsCPR0HXqcI6KlTpI6wcLA0+HtS+1CmgJCMCUDd4w==" + }, + "unimodules-permissions-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-permissions-interface/-/unimodules-permissions-interface-5.1.0.tgz", + "integrity": "sha512-3Mz9A4a+iYF57ZeE99nidRPNM7dX3dzTZRvRQyCP5+CvsEmGNlLTIbTQ7fxKECoe3I6cjw94gNSirxIbwb3lDg==" + }, + "unimodules-sensors-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-sensors-interface/-/unimodules-sensors-interface-5.1.0.tgz", + "integrity": "sha512-v8nRFRHtl4jFI1aiAmWurPKDuvboSxj0qoqpy/IB3xkkzBfw4KsZQ1b1yomwNbv9cCqIkFxaNAOzyrvVZrz/dA==" + }, + "unimodules-task-manager-interface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unimodules-task-manager-interface/-/unimodules-task-manager-interface-5.1.0.tgz", + "integrity": "sha512-t7FSWOdw4ev9SlqPzfw9rOKlFyryZbrcmjEr0n6HtPXqZ4NRfPqXtYSjoVWswGb3iGr3GPOIHZ/OQ6Z6StL1NA==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "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=", + "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=", + "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=" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "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==", + "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=" + }, + "vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "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=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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=", + "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=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "requires": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "requires": { + "sax": "^1.2.1" + } + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "xpipe": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.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", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/react-native/package.json b/examples/react-native/package.json new file mode 100644 index 0000000000..92bfe5e0d3 --- /dev/null +++ b/examples/react-native/package.json @@ -0,0 +1,24 @@ +{ + "main": "node_modules/expo/AppEntry.js", + "scripts": { + "start": "expo start", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web", + "eject": "expo eject" + }, + "dependencies": { + "expo": "~37.0.3", + "react": "~16.9.0", + "react-dom": "~16.9.0", + "react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz", + "react-native-web": "~0.11.7", + "socket.io": "~2.3.0", + "socket.io-client": "~2.3.0" + }, + "devDependencies": { + "babel-preset-expo": "~8.1.0", + "@babel/core": "^7.8.6" + }, + "private": true +} diff --git a/examples/react-native/server.js b/examples/react-native/server.js new file mode 100644 index 0000000000..b5650af4b8 --- /dev/null +++ b/examples/react-native/server.js @@ -0,0 +1,15 @@ +const io = require('socket.io')(); + +io.on('connection', socket => { + console.log(`connect: ${socket.id}`); + + socket.on('disconnect', () => { + console.log(`disconnect: ${socket.id}`); + }); +}); + +io.listen(3000); + +setInterval(() => { + io.emit('message', new Date().toISOString()); +}, 1000); From f5a8f52f19467bfa0f485f539a1620988d3825af Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 5 Jun 2020 21:36:05 +0200 Subject: [PATCH 314/494] docs(examples/react-native): update video --- .../react-native/assets/react-native-demo.gif | Bin 30005 -> 73792 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/react-native/assets/react-native-demo.gif b/examples/react-native/assets/react-native-demo.gif index e4c7790d94ba831a7375b26797a0e6c6767e48d4..78361eb957d52380b07e858ce19776f27105f8d3 100644 GIT binary patch literal 73792 zcmeFZcT|&Kn>Bo=L4ZI40@4XZX@a3Ch+yblLQ|wj6hu^1Kv5Kt(0h~KgNRg-A`*J& z9V04T1?f#g@8sq8%*-?Me(PH^v(`K7duP7&oUC>Kll+sMbM0$i`|KTEeH|s`8;PJk z@HSW$I9^}?paG!c1qHw`5QGi_rH8`cFnR_$I1@d?@j}2EnHdpC1Ph88$;N^@fn;T8 zWn*V!=RCp5#c`5{lZ%&&=Xmk+@bdEV3Gng@@(BnDpheKaqC%plMNWyI5|^X~)ib~v8et7D zV~q{e4fNHGjWx72Gz<(iOfGBcXlfdoXc`%48k=ffHrBjsqG@8PWo)cvY@%gss%3)H z*3;I;nd;zhy81eLhPrxY=K4nZ1|~)Z=H`Z%4UMi`y^J$9F}sX2H!-y^HM2A`v$eCl zYH{V7~37Ye%smpraj&Pf8*Xghg&xtTwNV+JKS=1bh_ho z`|fS$hxhNg+_`uBczDm{$>aO3_aC@DaC_wH{@CsD)5nj!JUxzI&!0XcynN!p`hK!7*F`=#$opO7GepO0?&6ATT5_C@LZ-IyyKsC?q^MG$J%C zGAt}EE<7qcB03@}CNd^2CMGE%Ha_-MdU{-9TwF>@LQ;HUN@8MKa$s%)GZ*ud}k==4R!+A?6UX-(i;O_~qNs*TIo*L!(0@<0GTrN5_AReV-Wr zG5O=?ub&fB6H_z4rst++=4WOXX6F{?=9lIdmlu|PFE0OCUZJl1Uj6-N?a%5ub#-HP zeQSMVdt-BFb8B~NXK#D=U}x{(VDE5u|7ib!c5pyDIy^j}(GF=enh=fYvbKe}raDer zP6h)39hZa9E)>RiToh;is*S(O1c1{3J2;)A77e|}w}kNlTaQ^b-dspJhr>ece?hM1K zlJA9go9Oz&D+?NH2@oa$1nIsF3Clne=_Qp-b;O7mW*UuPY+md%v)S=&oSpeZELdAH z{7_`!lW$&hy|1QnX{gkpC)2pr!?`x`+1^3TL$?NdkN#v?e;s5+wU6@8>ql0*1I3z$ z(pw0{&BmoKx%YlvudUtwGhr`J%Sz)VoBY@(W^?yn-$_yU`KDifJ9501G`0SzEvUHB z$MLg~N3_apym{1xHH#Uf>W|i;Ybq0jxTu%AhdD-aT%(#d%x7l4oVfJxRAuy~OnAqS z(3T8eBXj+}N0G8$sA~xMzT%3>NbQs@rZ9=j&mC8WQ$9wk4&y^6Wpz&HM5vhLe*C2P z)#3}c(l=YksdMM)^hX_zY(s9So_X+$$HU!Y=SGOnu6t0ZYPm9BqTy~%zx==sTjW^^ zu#QmpF)@GJGbM_+Qi?~)_uX3`~#yCO4c>lXf(aZ?uS z{T5VQu8E)V7AO0YmjzqwZ*&9*W{NEgKC6G>nsTC2`#GKqT@#CUgWcwvGogePva|cBj~CR z1fA9VJ{8L6ikXortzGelM>j!lF-13@3GB=4)N`ol>%&0$r68GWLQSiHS&34G|rA$z9z?xcKVv_$^X^168Vl6Ad)Vlk+ELN7Z#)P zwM*!C+;Zry=hm*P^OH;trn_KdRm_W@}IQ!O!rTGIhycyG0iAGg@K zK}tpR`9bI{58RN2dE^DV4#otve!a%8mxw6v;iV9`+)bgt))}ObpDTa-xsZcz_tgRv zU}c{-V}z8BE-iw$0QNU${o)Z zeaA?IXP}fwcQ!=bMo;rmIV6(%;6|-HLCRFzA}lGsEcCGJ5A$7lHkH)1=(|=T2K{jZ zDuqqO&mJ>AS9qiIiuM{DDReFuwZhab0rh3^M)}*Tt81ZqtD+yWzZRJ7>Vc3<*tTbr#5r$!f(7}vur-Wx$;W4T31eqwd}Hn5lcHY2o(7`%B;|V_mfSp zV(BEyv*Z>YtRrJX#Blrz_9@esrdqpx%}naf{^C@WmPnW%!`iAJZ=h?~!62b>5{r-= z!Q|k2OX;?z?+Nx`G#id&qvg}V{O$+?;a;lFFY1c;^8*Sm?rX45jDyl5HJE=Ks^RJA z>ao*Hls59EN$Sf4zfzZ zUP)p*`T|OqE63C7z57(QePBqOSfMki7fstbw>#mu`g^P=Pg1EnUlg48}{PvoK&R0`|b6j=sj(BpC@!3 zJU6-Hvt{T6zShxS7>plM;C1SAy=KJc+3F$>ZI;*yV9iXHy`qpW+z{BnEc$yjc(%kN zz?W;rbbwV>n=p%PNqKA^&8D;!qyA;cg;BMWp5d9O7;9i(75e5CcFzNCjzCwa&$S++q3LCwp`d1YgM%T+`j{+xT~_k{koBQtFw&z))Q=6s1^`g@D@h@$F*&*u|LK78rD2y6-LR2OJ6N!x?G1}Hq;jMuFMHAUCmM}uo5!D8 zOKZfm1^4U@eLC8@bnD=EbmPGglD0cWI~sm}>1g{CZF;GZ25=F&H+{fX1iBCrs3(Du zM97XMAa)3-VJ;RfUv?|s$Fjbh$-X>R&la{lcz1l!a1JgmKhb<&5i37&E?==^zccv+ zsbN117vU_Ize0$Qyp_Kam(TfR|BIe4Rfhes@Rygk0<=86HLU{l^t}0pz4eC!)JOqp zlL2PVFLjjyuUOr*^bEA-(zr$nygn~xw-b0XU+{)fkdydJoac+%q@a;2K`uK%(UU>0 zO2Pg@!H+$INwGmD!ND(-1fC2B6Sz2hxIzLtJ;vrdjI2V!xPqUPLZWD$A;Hcsymmt3 zJx}^ug@$>CChLWyl0pf?p_!e*M6R%>N?~u5g5P?EJxmTOBn1@@hdJ$pm5K+ID}`UT z3jdfNNJ8H|C0H4hd+riqP_m=!6G!lOiq-NA!pIQ@A1(lp?>v{RcfG z&m>2VhWL#SM~d!5PQd+sDMj&GMa?Gr&L>B4kfN6J{UUdwqUNL4Itd$A(K1}oJDs6> zr0A^S=p*qkfIB8vDFzxEM)xeHC^?34Aq+7RQ??U>(hp}-j;*qa?~6Crx-RhQ>0@vaET>Q|qJU&%;BVz}eJDa9#-MxLWRiyKRhyRZ;>aU^bX zCl0G0rJ)=@XBDqg5T%zAze0*PVu+5-e`#{(mFa@7dCDuxl#r{tudZK9}H>;(wz$@n|mofrP&+chccd;^T!EkDeu+OHO)z$LGmNQs7n+L7DJE zIr+C(a!`S{b7;ujlw_fh=&Lg2HM>Dwu(`aQomeHEmh_&S5AvHP5a0Y8ZHr9U7eaglExI0M%L$QR!;XbO>Yl< z*_e_J4oUC5cCvpreR?%@K;qHoYZ(@98N(7BqtzM0dKo{SUHMMq&g27UPIm>)KFfTS zlDT*-WqBksxjLQN^>Ru%OH1A65TCWd5O_#IHsxh?CtW_=%>pjG054`0T_tLCX2Da5 zjH%u`DN;zr>_5uc%vRZ)d)%AXh`fwM{=zK5yIDdPvP2lOPK{=Y6=q62&y+IAl;+7i zyO<$clOZ3Lp=h0PUNS>@FI}ZOT{SiR(%p3R3+bAS>Dr@dx~XaUchd|nq!}}&nT)2I z7N(ltO|`s`dX+Kt+GvVRVT#@J6nle|8$2lvi^;cAlW#vyU<!#oDzzp~rc8rkP&ddF4|?F>NUqo_s&+n^8G=k7#!jLV3LJ6uu>l=3DRP zgGS#b8l)$u7Iah>q!*^gk0xhb$PcJ-bNTF+aG}tr+&Pvp`Q2#J`@*EM=SdX?NtHZF zRbj90?Y+z_EX*)108f>iPcNr~y#kneft-FrEXT*qwH_JR-DQVu|Y5i9>GuR^i0GIc{Pu!@ab+J}8g`6-4>~*ZJq_0jl1bgTLR|q7HeR>z_ljE^f zC8Z2Bk38uLH0K~drA$7o!0ZHfjwl@{=J_59Ku;lui2#x)8T+O>JC;wK6%0XfAOP^| zvGhk?S0GrJ=sxl!84^vQhv4bGsVBEf;b+OP)3i2vaTMT=;0tti9O-m}3Aaik$%k{NZgZ`h|p`!2_ni>_;Sw z09+vg5LZQ63~(j}3=qNU>TnPhq>BL#IScY)oa6J z>EYO`NIY0whz>%QLg7LAvPfvmr7{tAs+6M!E6B7CNmmL#!ZU%0$N@J{NiQ>`)N3D$ z0J*X(qk!EwB(#)nAJg%UdNLgaY@Gw>$ck{h#@O+f52Rx#MSjNsqtuh_SYW0UDU1Q~ zSCNb{uzFJ#2!`c|0Pv#Nx9|XQIj)e2kg3kVj{zW9hD=#thVXn1VD7b?jF zUIapHS7!woOdy4Dz%1_T1!;3S3b*uqke1~iw1!J5E~Xa5m_6q&Jx8`9o++3w`r^6W54aqPfuw}rvNIkM*Czi2T?Lz zmY!k4^G;0Nd1>|w%&Mx=>?k6XjHrfE2RBdl1R`aH+Z&zunn!82w~ zA{nXRa8|&f9x3SBKX@Ocu1+Uhj|9blGlf__8lJA@XUAcI6%_lkdL$>|r^p(3M;ZYF zPV43LclUaRe+GHC0 zjkZMk>jVH6gUD=Z+sE{qp_p?pfIWqmg9vot5pdM-ekmA2VWhZ%U@_>>j4ynbzYDzl zPD6tjaEMQ6FamY*WDIbhmI<(<`K>WP3zp@mln#WZAHdUt2#C)x;2{NZn%X6IQ1O_@ zH$0Yw4FEuBaM?OC>KGJk>EVZTH_!t#DhNb%*+;X$F#rsQ7`Q>lO!-XRCvj59H8+8j zM|}(gN)R9W9vTv}1glx2KUU%Rac3zjOG=mMWstDb&GuMwr2PrFXA3!`Si zic{05qwY_S9B`siToC(Ju>>kg>20zqN2?)6f9xoG^eSUHw_tQaZoMy$$$KS%^6N_x zhCLrPX#!Oa0~K;vYYHYO8Kpv`kx!+5Mt*F{P_@6g?8->SUlEJuyR7*kt&?Z|!p3b& z5PXGXh+T{L4Bw~}Ct#oYxHDoh1MICq%rREY7~nuhCUr_u^ofKp3h+$g;iP~(uRis- zDzRd>op^Jb1F7Mo4pYk5U?t_BM=nOC`u@ZK%#ZjPW4?A$+V*h>+i3V8n&Dz8GL*tp z9|MVKXE;lwH!4Tg;u%&bbh`Lf$rA%1_+|}XI1&R2nPAxjCZ0un z$HOderarRB@EC{-wcq^}d>aQ>CNLD0bM;_gSFp^PAVkarvoRVGiU)%T@J3nyf{b71 z5Z?(7TUT(Q|0T`7>N@cV3uHFYS)?OD==LsNU``EiE88(60x%T2`7u(;5(5H3gslWT ziV#rY&5RVlV*U7PK@4=_J6C-HPFBdG0)iq$W&}g>6}1R>gXVj*Qf3TAT?>eyZF$(< z00Z&fG!i=;gEeD-g9BGoV#seb-x_DA1@c%fS`=EoyPnYK>B7Zwc2psq3SW&##G?6t9mEAHGqV)f4WP$SZyL47%2eL4K zhf(E}uK7N5&sE?;tp8B+rXN@yQ$*W;ViMi5<0TYNmJjdK5@8glM^=E_5ecd^=V|~1 zZ_cj7Ek(a~{MeUqDY)U=y{n}+dx9b}?e@0{4CwT(Ja}{&6ztNl#Eb2kB%JKr=Fa!O z{4$aLC|}DpD_FKBh5(4E{)F7$ z!qTe2VCRQ|&jBuUzBudfZN>wh?wdfG9--%L?oqZ28T{Q}7=W@XO%Q?v9_uv+VPx?H z5NGVtDHfUp8R`SL_GL3k4%2JD&8Pk;aK^%gXaQG}_sdLmb6d)4_2_{ecNN01$}U~n)n*SHzsZir+rNy813BjFaM82v+~Wn}OHW6<+UnBn zdUpQsG;rbr>sx^HDEsD5?+x?*aL_9uU0SuVr5={Y6aIT41?2fs2w3By`xxr;;oAAM zujRvYry$9(r$OM}?mQ5@q)f*bp*P(Odb`0zNPf7bKIxZ>*BNh5Xqu6A>-emPUCrLw$`+;{1D+ISRn-MaU%GjR%2O`{~)??9CjeqWpOf@l#f0u*yv6lYxh zcTM*Ab}j|u9WMDZ;2n898=y~6G$~j*`?ZTo8f;f!ybe+~7^@)~Nd=TZ355|ldnL^e zrBs4K>x~_`WKDq!Z9(yiH&B5}tt>~l04=SXYzZN9A~$b`ngrZrzw=egP2bH%<-<+R z8#>z3){BB$o|)F7!`gBWg2Qh;wgA{c3H&T{Y(Ac0i1XSq%CBQ}td)DXSLSm-#jKJJ z@k~(uW)QnTh_|1@PiP*SfXk|Oj4FdD@Ak0B#g`PD2*@wd`)}Iwh?*?AgjVNicjRU9 zN#=QHxaestpyzzod@?5BA~ZX|{yhIE#Z&*!Ewgm_#T;`?o3A85ytI|4Kzaa_9tS@^Di#6aBS87M07fv{j|DLSF;q7{fxzZ^TloWQR$yZujVJ(vXMmys z6~Z6@wweTU-P0>$LE|8L_XLy1$V_x(NHvN8nd3_mxKWew_*@$x9%D$+DMQ|X;uZEM z$aFj!dO8dcU~fa07fg-_veGczAI3s<+yR-L99L%F4#24lDKCl@JSwFJElxz6vlCMG z;l6|eUw~afO8|oMy)?^8P*ZT^fp~VPjhiCR^gj-qRv;=L@?@lbG?7`P(76m+Wvh`z zl+Ovhp_xZ4qAXn>2>$ex+#D<$;lmp6Dki;1OtIT1`hNSHm>~!sO8H=w)^-n4oERjoAPI zPyl7wpWf5}`(RpFG5L)DS=(l308Q2A+=K!HuTtV)YX#}jU6oF#3o}|7OK-l=3ZPyw z0YOVh_vD+v8LqoRymHs7EuKgW9@0OLSe1k?I`Ccx$ohQ0m{p*}6G!5$fWl_9$V7+w znw5#|F1O82{oTf}_4`cry+1+k?-U)uM|sQv*=bzULu_D)=9^mN;yGxucc@h8DDB1x zh6qa;P^pHFH71$u-Gu!~QNEW)vIO}vu#%(F-!eDvF|+h@wZ}@%vG(<O6p&-&_4nWWUoYQMUX8H{vdPm2{Xf*3`h-QIU7lCb&az-GuNE@%s2d6@cTj?$8(D-M~@3l z7R*V zw}y?MS6Kh}JiRegcKt~s5uX$Fp5TEjs++i)s2~PeG0AYe_=_Gif)U_CEb# zn)-+H=dI;u19^yz{fQR~mOi@W;R3&kg1vJtXYCCS{ZOu`s$21}7a6amU7xF^fBE?N zC4QrGsyiJ|*;is44`#))c0WBO{fR_+FW%1GY&EGEDQY~-NBop(8&cbD`^5fdE@WX+ zkhar9OISXscDUGhv^_?9xhKYEHhigZf5F~+A8EHY|FaP&uA_aq1X3Uexi&z~)NeYZ z9GH_=9I#X=GW~cX^bK~pg3N?yKzt>)J1DU%W5*y(sEB%2(WYN3&IHyjt5)EAdgQZUjj$Udt<| z)u67@u(eh3ORI5u+2xJaLvS0;NJUCiyM?#Se51(1LOc0p+ZFb_s{w8LuiCDC$g%#= zCfD3%yZqX2x{V~?W^b!v&)zOB+h9bvzAXZF{3-n0vpx8Li{ zcKNEq^Q-;Ai|mI`T@JPmw=>!93LUH(9goil-*W7Tx9NDwNA!&Epk{YGAJ6n^?dbU2 z;cb-ua-&1qy@Q}2PY~^NV{7&Q(CTZUw=dTjG@ck7pl2A{8Tulg7WSc2r>QeyBQ|on zQ+}%D=YD6?T4(H=^Fa#w)>>Whb!`cb`gV`Il9t<&w4|dm7`^lY|)*Y-u3peK^mfKA>5#VujOp9!P|5Lpx3}bw7aCW{XMkj zK6_8uMtiwJkE>SC2hom7$DT)zd#WrtNbx;S0=jDu!o*fX=$oE;c69x?A-UDCso1bN z-mv9`VXLEIn~`C=f?)@rVJFnEYuTW?*Py4^pf|#x@3BF@t-&WP1IihL&l|egkKqI3 z`d?f1zZL5b#_JEg&>wcxA2HG&RnQ;f(;q+3`#!DrqgU_e2R+(Ey53}f-Y*xuDGR;n zi+VGndb0?tA&?>U1{W z=xjykY(Li7vDMkt(%Czsv(K(`aG-rSt$oz1P5Yn?WN3o|wZZqbA(q-uRc+WQZ8~Oc z`b{nPcP)lCEyj0RObJ>DZ!P9qS}ev|NJT9azZUDJCR>~4i40BlKuwPOnw*xJC#5yH zV4B?DHF)YZcr!HkJT&-KH3VQ9f-CCiZ|XwzO$kjbUp9KU<;*Iu1EL<;r@jZD_84II zGn2?LV=EkxQtVz(GLyD@eP(mu_C}%%v$-hviyZ%JdF?N>IzIE$c3%|ke-ZcoayP$#2ct3BBKkT@6YA}BHn?t0YgXLiI%|R!-D^`Jn_?5658CPy64Bneb zbo@3bI63%WCH5g~h=+B^O|{EKacJ6W@G(sPhPTBN%d32DaI?T6Y(%MGSzl~(fjAU+(WPKk= zg^gyP8hx!enxj4X#?m^5V>H)eG%s*8KVh`saO7?7Xi?i}@wd@;9@a%Oqwis3r5s~r z{MX)}8mrJA`(SC4t2kEaF;*2gM!GffF=4Exa;!GerlxJIerBxUn|1x>7@1?dN!prx zYP>~zyfyGzi{*H`$9Tt~ReRugSFUYq!gzPvcyHTS&$sdZP20+u@uovxLBQ{mv8}M) zIAz8L4fye6{WLpaiWon#BKY*MzeQ)DtrhGd9xOBrqK$I+O(^(tOvsV#( z9t*QA4Kz}^-k|8GNer|i!EDKaR+Jx_A=evJp;v*QS5ZG#IeuE@!!)_T(`~Wc^b<#0Lk9QlRVg{$d0Wm#3dfexNlKDmrf?q8DgQ34l3G&!LBhnq-FH8075#9fFmr-0ddD|1&=*GvG*g6A|~f2!UD6gL&cCcXRFQ+I(g6VHQ;1&#E_0=-3G>1=?^y7Q6$^F!-2L zf!6can{p?rzJo-Z?XTs-E|PqOxa@>nVYKrO( zo1)_2(_2%Y`)*#`8k2c4CQ6>LNw(+T!HeiQs0Z1I#spq|II<_Xd;RO zrhnzCeU`r?l%>mS3HGpFlMIaX#s zwYGdCRBu>ZaX`uVU#0q^lcxo#{#H2u(;vr-bilTQR(3~@@3FQbT>e)>0&(+xS5ME{ zU9l0F_nWhHiaGSv4+)eZ%+@40-R-x!*FL$aYRgBMG{OhkggLa{ ze3PAXk zv?M`3X1YAj92XS#6Ci?U=fwlhPPjBy-c}3=FjETD!$AbeKcBSQ@KStv3BTtPAIyIQ z)s~FKx7+ZemYP|>d_>Uvj|X4)9lJRn)~QZXW&V)ces2s~&pQ1Xqnp`2_i#6JZs+Zv z8jnBwv$xg;|5Wz8AM137eWfZev z>~JO4Q<;%A%-ht=6)I}Z8YSkI!M}Rqll6(Kt7*oooO#xq!EPzutK8An+*PYd?^gN# zSVQMlbHA?&nppFlbWdPj6Fxt>Kqj2Jy>|NPnpp6fc+#3g-kN09npDTynV~i5xiy*X zwX^i=n3Lk3!b6>qPfd%Au;cwH%JT{&<4Le;uT$NI&gb=A3bwe9sw z^c&cd8|q>k8s|4ObvLxGZfM`$(0RI{8@!>Hw4tB3VNkVU*s)4r_=v#7A=%seE4px3J+`kn_1Lv z_2~Qeo~rjh8~-wk8j(sTTS87qUH@0JXm$BaPqO^IAHCHTbDxNs;R41r9~Qp+Kg^;Z zSH?(>mVWfrR{i-&_Gc2jTt`}+>Wq`J@2{&~pQGd$W?inY*<2c~xc9Ta{x7p=OE^u? zq@iwief~?4{ilZd{cY-0PnJnz!{PqU`qIx&jg2%KKqo#yfO0xd_`*-;Pxv9u%}@BF zbi^kE*snNG268#&PX_TlnV$?s2Z{d*5lwXd6)OHV|5wS z{HdsmTk})VSUQR67%k2_)3JJ|3#MNgom-fW!|6!O#9LgsGm~KDR4|ih`($Az2_Gae zo9vi)XEw$8ZNY4+%g2S;G}m^Cx%9__cjhuYXA9;sUu-SRWfABk=ZVK=(fRC<(}nY| zBhD?(=fvnpF1(4qa(5v&*{N{hZTgeNg*;-A#CT3mWhrjuGOZRNbTT-JHIXt})i+|qIdMMrAo!`CbKRw{>`idH_3 zKUrF-nh28mO`1-;_q%%jZPD)?A< zJ(!L&>%Ft*u$aAW3C<2+vAUi?r(qhoO`$Zi|GhI6qbsvJ9e?$~?o9ISlHJ+#r@wdSh`};@^KX(K>@DQy zmFz7RSN+~wD(#TjU;Z%kV1I=)SF-=RZu|HCA2R*f18VEZhX<>jV($;ude8qkSf}Wo zJ>2+u_2J>>@a^}9TjNjv9BxkppFP@{PI`E>JD>OdXm7dd&(S`$<1Fo9W9T96aA)p4 z?dV|p&+!RF5CM8UGMI--fEy9PCp*b>7pT6d2qIKWuZhu`>c`bfq&wf)#B#119th43 z1%v+;lK-jFZ-f4_h1351N_P|d_if?Fm7cQpQ#lj+Zz}!Y*uww0(!Y2A-4?!;PcC=< zQfSxn@wn1mr~b(nUhBEO_>W5ezfkFU|A&>np*qF-PnEuWdj3=G(}pFJTEfs(xCBC0*xnHR!!EV^e_TiLI=thRC8E?#ZtTjC^WgIXzN z?jSLXQoU2ry%QahRS2T)!8k)jFPM6KS^W1%!$0W6{}4Lye|4k&LO3^2&VPc-{D;Ap zN2BAxmyd%le@8g&SfRfV&OFqq_hN>@F~TM6hS=FjcpP&XC~ctv!uVJ4Me|73{M=s% zCs=ao%ej*8wG6Q5ryPQ0el!wjzLDLW$6V%0&fYBvle51%Vx-tgc#pYE`keuytj95z zN%gz*4=(fHj>{~6T>4#0ZI}8}w=sC{PyNnp(VvEct-rVo{TV75deVj31Q#o&HlLuw zfLb;ZG)|O`qU<+b#R8 z`%R5YY`;7Uu0&Ff-k28(&zP#9n5;!?3>ckX+4zFf&A>p+uHIKHqO%eOztJ^UATt#m z`B$Vn%qg0UynKDQ0@&HFY(*W2uiP2W9XQ+gL71u*=5x;gxJInRHL2*=Y+ z#b1aZcADup3imljtSd(SpQCVz7yo6t`8(%X5qCXC1c&YHzj2-C$ivf?R-!FLWJNmci9CYf?y&H$JGZR=${ZoRIc?7xxm?Ej+H%PRa&t@m^v`k&~CcJ ztf|{f^`{2M?_>8Gy=Ir*KYfI7IYp)uE5@XtQT^k=OfV0C6lV&K0lsU)=t$ZoOImJzKB+6E^Q(v>Vv}xz{;= zbx7C$)Vwb)%kv*9niB4U7ye%qO?V&nZ}a}Yg_ytp(ZxS2nr#1kckvgypOJj}kGqTi zF?SdDOZNk$9;hE3#6?M_#l+$4SwneC)F(fRAWlufsnPXkc0~vcO9D_0`h({E2QPlt z7*f=P01UYqwJb&EOFVF(s^4p!a#e>R>poqgxyoVzCMlFj^{#Mpdp#IwM4{)~IYDh& zZa81o6ptWAHtb=j&GoF}LRgac$;W?y1++p*6Zo1Oa2E2}p8!>VAJ7cY(=NtzOI5ij z49YQ0SJvt(P=BjADG*r%5djq4i<6vR0@%6(YT<&A;m;jvNAvQAh#LX46Ax6~d*w?2 z#yZ!^OWjZ+OUJmUP>aO2OYvpFU8^+>0qnMH_&E!45OeoFCMSUX%S7Z;c{6c!Ba*iZ z3M=>{ps1f)7GLg0`sw@`s&K~U@KMvc@e9Qt;Q+Dk53j$29|##w?pNbS0NMyh-Gs>r zF@!6a5iEl^r;O&(Gjha`1$nJWT+CH8QOJ@uv5L(9&I4n#8fyI)5QUGL) zJ@$-fqRqLmOnLyIG7-rL!KyRS;rzVQi696DB!46u2`B)J5Y(7jIfwwRLj#}*f~_29 zMG5n7{An&SY&izGJz@w}TMs_Z2t@hph_FIXCjr`kP}wCEK>*?lz^HF!wi#Oa09<>6 z?X03_os8`+n#{gc775@r?3>Z#UmLfhBfVV(e{vBNn>T~O(++%)7#&inEbw62;jY?2 zaKF;WW0$igz~D@1g`z7}*->0E@YWlgXk zCRn+ZN!gA$D{#10aqae|jh?S2+_za06Zg zlkWCXoo*e*ETX^w>XtGcF~A#23I&?> zFhc{tNC$35&aD6fv^ooRG+WZ->sE?T78SQht|O7&%kF4COdh?O4!}M;z{G;hY8?;u z0|LT%(LK(977z`hIAo1p93Aq@D{l&IVsBX={)Bc7$kG-8hTtdp_;nOQIfyV~#pF

        3eS-+rn^)7D01^&!Sm?Q?vA-1+y}vuejeU4~ zL2s~j@_yVKo)bxz_$a-1la19 zz(HEe)cF<-U)oL%Hz)?cB!kqI0}P=keEY>tSpX%f$pmA+3Vgsv_>}qstX4s?s8V0= z5X~2f2iG7x7=+U_8fbtgA?PR!&H+S#I&l+4zxcKL`d~VZL;wYWnA!R80<;M%5SERA zY2h92aA7eATfx8^bsj%1g7j84BM_3!9ro_QeVcjXY36?KP0yxg7AnFmb}F`)T^B@$ z@_TmXzQYqZAV)KeM(rS(Cgtcs&2H~GW+4I9svTrBsGPabzTDx!MzDE zqc%#}7YlMU9=57Jj<4d)u<_W{z3w{*?_lQyE?Diu4uBxd5_qzgNR3x_VYI z_+qL9{pTU_3r|H~j*vdLA9ows%AF1OOS~<46$0g%7cM)vd}H#fG!{5~ceB29@P#`! zQCj#ODW2!s^K1|6K{rOc)$))H@0fn;^4%O;atbKsrrHJH_p1R9GmQy)?U(ydJ_;Hv za1d0Ov)Se1BS-c}#E^2PH5YFfni~w)0fH_HFe(uFAq?$6P<9OA)T6N42if--){v}F z^3z`*0Qe|hzuf+#H+R(}&sW>c`r|wW&6IZ9u#sn9rLa)W))Lx(epiTh+q(&;jch(5 zWgA?Q!WOjSpz0yA4?v>7cw#!6)YvA&?dD$yZVziAHh}1?gH535@7p{F~SS<>RQX=)MMnRp}I#O(^1ll`rFy$5|ISg&^mWArBX^t*Y=?e`C_a ztezM@j>5@Sd%b2}W3-O20SeG^(FEGz?b+KmB6O3d5QZT^`?gNe=2SFuFJh=7i{arT z(VO<6!`e#a0PG%nz)58*8{t7Am+2kNjI-hN4KuF8zECS*mx}=QTUL*0GC58)f~h{I zVRXmQQ4SOV4aI@!Fh98)d*~ThVgR-n2YxV?Ku@6slx{t!~pUp0%Gzt0#b?q#~kOrnb|}Tf6D{gF5oYioR--{D_saAEL0+|ySg4xz;sx- z8#rJK>zfCA$i-!~r-|Gf0CcHH5=~SaOb$BD#eW>f08Pnl3)36i@=A;MO2YWdx+=o( z^z*o|D*)&S17kzWTtNY9j;<;kGK|6JmjU1t&gsY%IfP=qL-9MpzU-O?>~w7jxW{qy zLBAYvRuf1*0xN`W&V6b2J1PB zmdc5tfp?u}SI}x=^DrO=<%aVD6X+};{)to>5Go9eMKVs|6hhpJxMZv_zpC)c?AowL0)djDe02VEDaCPZXF#0TrdlNWgmX6$=DFU_!%w$-zK`(1{KCGc@?6 zeJT@#@Q|PS>QV*69Cti);z5vee5x`^kP=mg0e)jpKX86unlhE~%uN#j9FL5H0fw&3 z_Bbr*Jdj9Lp}`gQL&2kH#OV#B87|FnH{-by(1l|OPXaSyn5opXt+i{$cxGu7Ky$!7 ztwtgN7>&rBTfn>=XN~s+`q0b_SYVIfbsWAP!ZS0(fO!3rf4#okN@eE!02&dehfqKx z6eeCp)H3$vXek4zRC`*NiS!zQ3R~ZJ}C2BPwx{z#R-Z`x6KTf<^#Z z7O(VIYMC8{^p8jK&;gcc{W0a+ldq1gdJJGPSP*}KJ_JZn1SHY=kZhL869DVF{K=S9 z5I%?k08k!+o&>N}ii5`}IZN`VJGtL^>kfT-+af+OibEke$SJJdDZu0Ii*}ib6y0RH zpmzbTmXA~>735z(Q9R@9#OL7T`sC@suQ+CPEy(J%2TJ_!&fi`fy!Y)1>g#C9{srg8 zb-6zs&YRG)I|fb+Wsy6nci+vT)K36zIOZ=2FQnX=cZOy5_ArdDY-3acGzKjF`re5q zm#DXF+Xlj7MJVoYchX?F%zinBw?a;(Lcylu94%asLyz^_ql$^xaw!{DiG7hho)0Cj zDlU3`kZeYJz5ejL`Gem62OMvunM$RFP30A@N~^R=>)J}&vC8ZFm3ZEdH&s45+I)2K z`skeY@ow!$m$8oz_CLDvR=KNGJ+`TO;#K9DR`tBL>cv>q%l#?>FUe1Z6ktON@*;(# zk-}<85o4sNeNqf>^(&R?c$?}(uj=Hq>eSlm^s(y9{c0j_&1;pKH#RkIy=wB)Y6@#> zipOe7_G?OcYs*z?KiJfM^r|JL)z;M3){WIR?AMZc>zY;ST5amuz3MvC>bh&|ddKSe z_vPKtq$H(e_?AK3RfcBM|F}u}hfnao!Y3%>ng~Y^Wg#N=CjoH2N1n{0hBJ%S{#O;YTI<23 z61|@;)ktNw2#YI;N2LUDIKhehrhfGS>0t{>7m?F|oLl(R1_|CYX{R@hxYh>qwMBJw z@2-DR9moALR+~LNUDoNxjO*0c`&g7%k71fHxd=jhNypGZF<1bG(Jb#1a1hm16#WE> zwpDzZ{z#8DtZt-?w{Q_ z##8k1yf{VBi96+hLcY8_#vle}IC^U~yf_HZ&Ld)c1qGNMF9!f_O7NaG+LR8cfmAml zDq%00_4{(MPqZP6Xc=H4+wBh%f&7Y&Zo_Ub~c7z=_gL#q*pAD;z zDDw1Lj96ZZc_9!r1--g9BV!{7P*4WSSV0Dmy|DhdBCs5VfD9{76;eDeUO4}*JeIRw z&XrY%WyIsJ8UQNyxGlm-Id!Znc~l&jjlP$_iiYN?FnhBeDPY$kp^R~T2Yl)Iu_PWA z1}>mj!(0iAf(Z+tAb%wjX7kj06j_GyS27@`!|8e=OQoT@c5}`_GLfGGjCfXW`fic0 zHNTV_YW0K^F~CeF*LNn44994x_Mwl#XNJ>a)-UR()|_*U{FDbB4cePlr6}^v%7DXi<*1smd(v$i!Qbm)c^#jWnd&D7e-6KSMU zF?-OU2rT%A4@F};DVP&JrI!)EU4SFjRdOCYHw4=i=@eXhiYAd`e4C}IVpHV^F4JDh zAe;xEylX(GVSB}AJn(iT0xrWC7gJtPpqgrq@5~DjA2^7qt+2&+zKjDLNgWK&ao%E| z=GKMmtlKV{avT<9@?QNN;E|i;Gj^ZvJV*kMKdk1z-ap-?f?*|F;i-qJ7wLnJb{BBy zhQWn>dG}y6(G$m#)a9V+KrsbaKmf*e*54t04VBXf+MAdFVVGNNX6o{khwX)6gyw+x zyx3BGpN|+k@feew-D`3;mzOMuVk8-Cae76XSB!tq14SS48<%e1-=dJ>E)mGT14q-% zBC%qed*Z1mS9#wet$`%7a5_`Hqt*^QEO;%^p014HCLdYioxebSjBF7#taez3B^HV) z93|?)_=>Q~V@@HQ5tlhItA3|m0=TI~ctE@>=JYv^pObf-vO(m^MCwtOr7`Wi9xMB` zZ{KoOkqd}aC#bIy_+hV>X)i{e?yd-FVY>sXh-xc(%Z2p|2i^vd8@KEE zQGhyUG6v9S8U3;zjBT+1U4o?pDaND(&ODF4eM|8Ak5QOu;hPkg&i^G6@Z{^x;y+}= z_py#V_3Np;lRwUHfcRP<({&W5-I*CeLX)PhrnJZErtk0OlnP_8pv8_IMoR2>_=yL! zBguMRpOeKH_y{iR{8Z{XBDaYIf7_w%uLyLCn_#%O^07SojEQV#^Ui6( z2?fLzi}2DTj#8m91Rcs93Vk!Jg(!Gc3(=Xwln}{I3MqALS~kV`X>V@i%5p{(TX zw`Nn`YlAAf!3ZJ(_+X45(-EBjb0nw7NDm|RGaSsZ?}Ii*8Z)~LKf)GCUHS)ejboZE zTsJ0dj7%m(CU3J#Qm*vd9)u<)m{5xhd{eEwN(>_Vl6E$mMwJ*ECMFXh(?NT~?FpV; zAC;3`kxlKE`o^Z>!o#U?-iFFD$q(d>o;ZjqxjANpCW|>h95PKGKM?a6;ao+cT@8=4 z8_g+%#U0WPrAl2Im%19Jc~;S=pj|4zR_b1=hD(-(R>47One@9xrrEh^fjP+vtCEOK z2gNmZ8fu(5|F@#iU>4Ds(*DU$QqUPHwEAgSHpi1~_xp2719BgALxx*uA~7XViFpvUw#~f>yW6qq^P3+qT+FOWD0LTK||p!Vj?nqVq7tP zO*ILZ2T^QKMr$aBON1lERT1#o6>+BlaZXka2N@PPrR7j`s3sqy5gi&>yA)KQ=CT0D zyMh)$>bXSEE~<-y3-XQ$c3T1s8uEaey*K+v=o-touyi31bFA|pBQf`&Xp1I}9@o6$2^LzBSc*^Y{v6-Mw_9{aJ-0$Iod$1D+%Ss$N`d@_?% zsKkiV5N{3`QiRHmBL0k{*r6;P9ynl$Q2Bl^j|>3=!VplSW;hKIKZYZ%Y}_i~AeuWj zbFgDtfCt1r?hM1liIq|%{n@x`F?%oiY3zB)FdA;9E7C#}$v#P$4lDfuu7-~ERASN? zo4MDp@l*<%ExGYMiB84$GSD>kX^dS)+C`fg0Q9&&z5NO=8)H%YitivA6U^uBe6ZT! zOJ|tE?PD%4^s)5SQvlZFy7()aJ?adaq62&vrK~f|XO%(Qwad>t13JVAyS2|?Xa=Kz z_+6KT<#Di0;-1xp9KOLyA@IVScgF;Pd{g8W@LBa~+Z;D!trn0GocrP|hmitqOvDfY zV<5{V;3^?f^)J`|bXnWMru+Dt_>Im?x3z}3fnr;@{@rUHg(*T@Nn z8PJws17!>u2+XY!zhN2hj1@khN%HB@mqKwDOvw*;_#bI$GraXLskT%)G*E#D0#Xz` zanpVL(_^N9cLr}KhGp-qr7p$>fOy)j99?*bO2}X&LHu8EL%7O2W?f?mVuyjh5M4@W zx`u0l_MY_ouoihq1Gav0*L{(sqgRR(4Al4#Ccx@Wkkh^wH=@iC3IhyT01tNxmgfW0 z$v($Ck7$88_ag!AI^0QuXr2UtSM_Zo%-^R$s-HVrbQqiwl9xK zj#fbP1g3HV==%q&22=2eZz^JRhByXtJPb^wU;reEz#HVk(Oz{70Pu@lOe76IE z#v~>Blc%&R0_r_?E~Th*AN?DymHtGjlNgp2%+Z2nnHf`^(D@q%il4GE z3-Ip^6qCyK+{M)2#^+S%;TO&a3am>Li@kj;Nr0W|qbFjVZ&X(^FoqIUF6&)jH}+^~{+3sX>w0|lOU zl3-L4;^SxL6yMPcqq8Hj#!5%+@zI-{hWQ7ObaU~aPL=^A8KAJvn0$ zSd0b8Kyw2IRg16uo9xM7>%ORMS0d1>c0!d zH9f^3c^D1M_z?<@@8Wa*2qBJ#)d9U`h;-+j>Yk%svS*YW8m*lkw|H!LZdN?LnS!7U zA>Vh9NkJG5{cCauPM#r-l>{vkS!LdByO#k=N$!ejzPA>*@J%NWaD-t|L9mLlG8>Iw z(@RC>_!@tXqU;HJNhA2iQOyGqj&imDW!><-z>1Y(h|uyk#od2#qPcH1*jPZuAP+Dr zC?}5jkkTZ-Qh^~e5{6)LwxKdoggBe~AmB51RoBvu<+mgtmgI6r#H&N*5C{xDTkg*ETOFD zbbsJOWvdMW5uomSJ>f+6wS}N$AWCHQ*hwc7>E05z?_%s4u#qecM3RYsY&}3=F~g#; z9}u#tIkF1@XSrS1*=`|hK!|&|X5gB%K8Y%n1yLKtF;v1KL0{%_lK33i1@p6k=mCRE zwyT6}TEsE$x1$F>VGPALwB88!ZDcM>z#b+#WC80%V2A~0sKC{Wz$g=IzX}?O_cCx@ zr%W#!7O^5Isd%H&FbB?f2#@Cm*9+nXjCLPV832gF6o(LwhYwFt(s;+RJ_UVe^#c~u zBEck*W}=Bw%)e0%F$WHxN;#N&9^yi8+Vs`xv&Y>H>*bS47^mURAk1M&-_%GVVmN*w;O%RH(_KGlUW|0n z__#&DxN_Y1d8v`jt43E8q})}MJ(@3-O_`G;d~I*3arUcwM|y>84iAOY|)0A(>^01&(18_k5~2m7WVwovUAR7e7|pMy|wO9 zvZ~)`#H-uFE$?d1_>KMYwsfx$ujW6_{7{{t?sC?DVq5P|Q%SXTlhL1F+}iM1WGcC1 z@J;D{g8KUDnBktM=UmRM|FL^?;LW2H^$jzzlivs4JwCTVxK9*nBqY#Kh@j0yF%(Cd z9Zn&bYe!H|q}hwjyU4YdFsPzAkj=Zf4isCgp`(qSDwgxPAQ9bw*4f!*lx7D0xDan*8%Ufo0|N1y0~ z+y&wggH4)t`{r4NPa;XxeLhcWsx+Q3ZbbL22FkQ#VzxJhe1)S~jI*wS?NeT2+?mazIk z_X>bHABnWeiJE^$|I*>MR+&#i<0OFXruW!v(Q>?FH*@;?ZE(;bX1w%Q!T-q~_uFU& zWp#|>i8dnHZuQ3?f0o zrM->xAx!u=cHgEt;o&LlkAzxOPuIlSzE!yvzq~M03)!-vw@4)McP>3z+od_fstBLf zC`)M3(i}gyln^7$JL2DITHnX1^u8Jw$&oj{M@UDBMQi(rqLWPwMd~hr7v^uQK+K0Tawm3cV0D6nvkE7Pu*_*M# zRW9y#d))@)@43db=rP1C*NVrsA^V;t98{@mtEc%mykHj29hsv#h-Es*Gl#Rph929@ zY2~ie(GFR#r~RJ1b7AWFVXIe)wU`E??3%Y#$Hw3LZEs1L7kHs2xyCT$vUNqKwPEuK zxYGsw%_HTk=3w@b^6!77T<_#n()~&vz1O$TYx%E|nLi1D!)uOxv>89-ZV*1hD>CpK z&6DTa&5%ydGZzjY{Ah$z@?QzzedCUm)z0B~rhoI^o_7pOSHa%387m!y_+ zq~pSQe>O95nJJE#r~9_udWC;O!x0LrC2@@%poku}ER`%}M6R;+1*e}$UUJHj7b7AH z7->f=uqWSSXHzlbdp44MkfX`Yn2Qd45XU(16`i7YqRtTem^`Gd+sa$9@`iA3lB>3; z3aIHIEE8u;Lwvq1)}Q9vv`DJ*d7Z+gh!v0L-2(BjSbElBqT0bIM=)2=_M|58MJ&{F zY#zb`UZO0A^=o2rra=>f4w7Hwe~j#~fo|?O-m_L}1M)R~39G`!)OOqO0QtwN5gWP% z_`$sHA0iU`q&JHLFaJiq?b+BBDD+wJs~jPw+L*3M(=a$ZNm&tp-)RaB60MM;!=p}9 z?K~W8m?;c!i8V4@UyryN$8Sm8N1da99SbtDIh+*t%gN4$;rMd1?d)ah9i0DO0Bq54 zUUFw`rP`z*1tncT`cho0H0KPZx_VrYK3-d;V>NVuo_<00ifi=(-=Q?`h70m{YpeBl z4;^HXaupxD))<`}N)PkMozqrZV|ITigPESI^3nCN)vKXHF%7wDW3`WMCWkUvq>EI- z(pvjD!|YU#i<$~`wa!+Tzko+PWuR_lJ*h(=X|TF0J={HJn}2a7lk>UH$sW;p05gWm?M8hQK)^Ikg^_jgHqf zgjkK7;HO_Uxw7=>Cf|{h?G2aB?$$m1W%tObPSO>N$4f=2W#>IVPSbx|{Qi0<_`l^R zenQ$=9muSQ)$inC^;B@J`kqKBsefy#O623T==<$#TiF?huVt44%5?zl!(u&1j!f;g zoc2;;Emjx5xeAE6#2%}Z{?*y$xa-iFTg-M#}@vP?;rR~jsi^{w1pHph~ zS9n;(>x(&d{=2$1yLmPX>i&LE_kSJgs3#Ksq=Wtm>b9PmYPlhQZl>F>_2INp%+@X6 zM;8is=1*SqL&9N8bTQWa4oPIF_9x#e!(YVQwfSXOr;d%KlkHlEZQjIuSZ*imA9*_e zd#r!HtsJS7?AVRaco<;KF9bc>G!!FR$my|}kY34ZK$HY_Wuvl;BvjLzy4D;b7WLQ& zyN$tI*TqLE&?h22pQuWt9@oSwaqW)FJ>)KHBh{^uZ^ z*T(L}jRu&jixHD;1I_mDF4@seTLVEM<-JU#F{+6r^I}Rfh356%3vceV1W7JfAdVyR zJ)Q_}f?e5|78?}o-N`d_5TQu{xI!#$#1SG6JR9mWG3FV6wvKMZXkztPC|Oq{76kfl zG3cdiLC}TQ6Z6HFz}iMYvx|eG){SJqn-Z+Ov!sLk{+B%iX#_QZd%9r@y+(3H{i8(l zQh0qoi|8n43v#aDX6oX^{-ZbX?K(zO(7n$;1yi;&`Dn^U9ST1E}Wcb`@j~-j~py+b+Ey4%|I8|Qx*#!xsTX#0; zl1|q87o0x&)cD2py9U=|4;M7bU>5V5TqWG2n?#;k#dc~#S)nbfBzT^`ot@`>#55Od@r1KQb!5-}9pPEZlZE+uR430xk60X?V_!!1p zW5h|=pGEQ!>pMLcQw-!17oE`tK|5UU5%WU=hovP@q7Lq%7f?H*1a`F&mXuKx@0FC*@- zl!feX%#~*emf7q3J6_+vonR^0zR~ICrP8sEEUwd}Mbs1PIia5@8h9cH!=u@g6(RAiQdunFwQ^j=!YfahbwI6a~TzsQ?K-aT#<8yGn}EBwIHZX~eh&&HvHndqOciEkI6_+M1R98)nTjALc86UB2_>6H)L9(VUC2Ty6nC^2J|Va3Rt!%#Jd&yQCd9iWi<#ct+S_5g@=H>%G&b{{g zBO(C)2Jn;dM}eRJ>8qKiASR-HOsQhmf$~?;QRkDmSw1Fzm-bC zJj~YM$ZUx2-|}cA{zc?U@p_`sO65Hr7Zwxh7JkGKGmdlsleUIeo@&`Qho4!G^h??9 zno%hR)4xrBnx#`_kMr+@DE?MDMK5yc=<0}qCHOWa9#E0s4e5{``{aXq5*4jw9#R2H zGZ&pgOQ%dQ=;EENUnm3(&coLj#tD*F=?4;>Qab03H0u5RGOyg$vF)CxFNRq8jTiO& zH4MY){#R^Au>87~m}gR`jqmHLBgm}M(wi_`B^oc<2B;^(#qWA9M*P`IpLFeOKM!!%Vw^GfyBI^8Qb3-hP@ zUlyJ<$QLD^nY4-6ia*Gh_~budaoX>@6e$n*?bFOGJ287*f5+?kx3d$Gzf5hq=vCu0 zS>$PR**n*hr?jX!ZOOX9Rq=pKL|JBP8;a`zhDHVADt<5P!OQN&age1;bUylu$bOp5 zqN02q43W)r6!rzhTVsA;P!+#t(qPH*TpG$p=8`f&YmR8YLr;ZOBMwD4NYNn07J@Q~ zD~Jw5ka;+0u1I)|nky&q;=roDk#~AQKkRr*rlu=#V8(HpE{^}PDt|E)U3iH=C3Z$y zV_Y2$`)9kT(IDlB6ZSYL%9wRuPD~b9Z2BPsDB2qiGywPXEDs=Ov3CWIz|dMQfqfWd zz6}F9r$>%$X+{B*dbrW4cRDCj0ke*^d@%a@_x$eIBag03?7ndB%H-AIBI~n*LM37K z-x^T(-(rbBhx+`*`p1obG&}L%@AR&JPGnW|{D%OO+0lNse*LL_wf)0J`+~UdgS#5% zPgz>$h(WBDg6uNIXr8lp)WlGg^$&>-rHVEEFX~*5MXZ2ChPCIOxP~`euV)NfH-UG| z@FF9NTyxO^g+mS5F1RBow?WrM6hTDTCCdEp3R*Oq`7s+N{D*`I|E+WX^vP1;#TQbg zK3@J5-A~@9SBRbya(nPVm&(G9k^EPbb^^pMdq09^g3qK*T#bBy9t2BW_2|LPLyGah z#%1+a+wCfR$3|~W8qR0tq88dDlOZxnb6=%8S4^qDGJg>!EV^7`N^jXK3?qpwPlF=1 z9ny!c?v>Ic@*hO|liJ$cK)`@dh5#_yjQSQ|^P{cc5$ULDwlHSkJ3%#OOOqI8wGG;V zAx6zDjkJ{EnOb-jH(K=_J#+yAY+9IQk|OBRW*pPFR1s&KHDM>ed^e@1u=uuZ&!z38+!Hre@w47StC7JTt}G=5CftB zvH$Y5;jjO~EN3zcVt&UV>~GxgNbAY^Xcb!s(azeu*#%WV)2*Ui5BK6B{eVOMD}Z?a zMB~}U&I6Hqrq}Nv!@DN^hFuoBi^7~v3>RJD@0KS2E;)*K|M@tR|28H5w7+yJ?>y@_ zBI#K|W%e%r9(Oq}KsatJIrqWUReYQNJE!PAQYRKav*@l3V(Wh{zR_B?U}$R4ZcwcX zB?_K@^t2KexoHAO6!W6|bvid6OcmaEGDld8<37UnR0=9EY?N(7{<1jIZJt6mg&HC2 z5y`{N2l4eI>zL>g%zPQ1K8#}=vfZ?_VXz)fl>$%Yv@SM+hvQuoGjVIWmyN?C|Jz{B zsp#8w8YFIkFWi{^4y-0p`L+rIf$Pt#q!e^aZx~kS;MNnwp>KvyZDx2vV;53dN2R{m z(VU0T1_Os=cm}eV=MCsEb{JOb^4>y{T}G`mfAErdI6;5)*CYTAA3A0ru z0pw~_xe_DS8d2tHMAr)-J=nXNeb=J@q*gNNGGhs1?uFWAG)$P%c}o^JL{T?Iot^Uw~!k`AdSK&{+N{GIr~(~79|s3E`* zm#Y(L2}%ThM*4XOniAmWyxf=$v4hk#1t)E14zu)vZ>nGvQ*03~bg!clSU>di(QS%@ zNGxgiy_RKSFJ%`Rq$E=U9;7Fm?kBO7dTV<`4zy;KWR3#v9y&F;!gjyND0)}Phx&(f zaQ;)S+<>AJ;M^@&KzZt9m0BCNA#1x}1#TdXB|R+_4|hLT=_n>Bk!Z+%>*iDIFt2Q2 zMuvaj^8ly>ZYjZpo|IW9PH9C zg`NsAyxvV@(BBTnH7nlRq5)~YahZdsyX3D(KQ%E2SiBT5bp4fpRM}baSqdXgTo#Ca zdDUrinG14ws_RGQ*$zaJ4TA^N5$;(4=!fD`&x3FDdYs}WlLLz~w#pWr^u{qu4&zv4 z1(or=zAR_os#E*-R;};(l)nGwijpad z-Y<@{hFwqMF19171hIG){cQ>fLx+u14dXyeLf{tD8e4foV1XoHuuSkkwxDRsc&;2d zt7a~YrtUR~E1vY7qcAK;5*>L(?6r5)OGw5lQl~`!b%4nZNXOE7;R_Yfg`9vmxHjS5 z?w-xzTP7)D+8o731j2lKPm$23Dyhy0Y)b$uz}iUU5}aVtPXob3h7^c#F!lgoq}4_L z6B_`S8o!g&t$v8en)KN8#5_^sw(>Lz;Bx&)Dg)qjYqT3V@36)ZLLlE)xuj6%z13MI zaEP^q1ZY4%XW63t-rj`1a^B<1tlT z$Vu5TTp>M(ZZ>R*CkAN3F$@PRR)?Lsqs2k08(?KwqY`r&@0|M z7j&<+@>y(|)XU(Zu*WvN>>anc<(u7Ks{`#}#ijmsEh~LnB#Wx$M$~ z43Ulx*I$9d@@Q-ZOrZj88p%9~vEgy_;Hs6n?e2?0DOpEZ z{qZ6EEDC`w^6HZaaE#U#P}=FivX!JwM2A;A{VD)>m7-7_Nrvh6d{fE@edRT6&v}Xo zJs&-+z(-Q)=C%h2O16Cy_N7&w?Felj&3V}}e%$EGb#!&>6H3-B= zz%A1?D!XF`BdjTg-&0@$AO0DWw1u}kwipih4(gr!S%6YAVq%)JX*HLk%miKzqIf)< zI?-!2J;9@m9LB_l(qseIF!zV0#$DZ37`dI1l3E{Xv>t?1q$FU@C%{ZM1_os7f>DN> z%q0{?aq&)u-iVhrFCAx|1T*}evAyXcuR=G2%3u zqZR1T;_P&|Ae~i0X+k$qnJ)YLwn?qcNXSw48;dt|-Tc}ciO4a)N@2>@5U^AQA#<;g zYm($Z7bPlrLk#i6o&SRx3WJrFHK>OwQYf!;@cDho+VTO6?0*efqZh~^9vXbTIa>6hEE{5MwplF7SB48C2 z9Oc+x;%rQnz!8qOe6TgbgI-}N3Q8ioew?XyX1=M(3=?ubusXAdq8M)G4~_xsx@Dr= zDY^r!fsyMxIPVVS6O}$iT{i?wJ`3EZSm{bpheu;F!=ODCdshsm zV%n)BNfxNMO@^7+HUUn;!3&~WpsNl{eISdBZC{FnLo~$J61hk;SudmqXRcm3p97i! z<@?8dqU@k8YsdzijqAb=uDs{}3IVG*mWX+XIqvie?XHbFI9-w80U*vdeZeMMQ+2?d76mt2cde|28XEy9p+t;8&G^u}CC_Z>VcZr8;Y6a3gZI}O!xXoOZ9Z2@4RDI{QH>CoPel-;J{9CQ!x7ttMdUgNS+;U2( z_`J81^WHzX)$N)@P zQ0BsmxmZ6geh-&;iYxwrOM1={_Y^3eDwy-2K;?CT+Ef8mxlnU) zp|)S4&YnWuQ-up26zaYH_o+z__7qv1DzbV|Wc|9xW~vBPF1BA>?C4kQyrV?u{hL1p`I=ngjJT(8uC`IIfa#n3`X6X2D(exi9-N~BpWZmMpW-YiK z?tJ-??U8J^Gj6vRINF3zeYU@hzR{L1_cZ5#_???Ci;U~o8VB#(dVN>3E>uD`pr^1`l?AJc6{7g(A&syIH4Upp-|-S8)R#Xj8S1LdTDala!+RsM zD?ES53eV5&_`b_G{>^Re>%(uYo4=Nh_ulwgHa+^~>mxwW6Y#JK5rXpM50^dzV%DzA ziv;iYh{o~Wt`iOl2Yn=+dLlXmIZAgY(<_oc$4SA5V5U^%MtF3np7vO8BvfP1{l=%- zjWz>+%j?&>z$bK*{~@31-**Eer1Ey?GEb^7&2u-TZft zSQrU4j}q?t%2b(!>l;c6x*oH&+|PR4E9|MyG2Z;P;a<_l**@{{Oib^!k7r{?KYcvM z!Y}CKB+75v`gAEL6SuZ+u6EEx*e~(4~LwjUYoEyTp{=B0L1(L;*0DVL%iD98txU%PCJF$}I4& z<({uhLA2af*KWN~eNfSOQ%7wFc!i#lTx~s1H*9|kOvuQz3PA@I$ZP*Ww zPShW0zT9|DbtkOqCVRnlS6|uQ5$C)!Wf$nVB7`UR-Z~VUwQ=t8{LmLaZ!TGEt50Qc z>*#>;uQwN08NN5CVPS{p=FW5|di8AQ8BB`MSg-o`zE_-Ov zb*57KWL@~fdr>7*YO2;nje{d!+8x9PO1>_$Guj(;MEGoZ*@%FHKk(w>>ax1S@(UStXJ6kB*l=c?~_$_ z^u14^ChLAk)y@w4a6tF+)emWUcltgYq}AwlrJJ;db!AxeUhO($J=)imiQ?yXvmNEb zyAQkSTg~Q?5#EDKIUPTS zA8&XsLU<)n+Sd9L-AC8%3kKQ0MR-=OK#^45R+OGM$rlNwCcoVHiSQPWB$Pb5qi}lh zz`qv46NM!B{;o^f;UUjRb@W#+}nvqug z92Us@#y3ss*Vu^*|79bM?Q48j_2)*aReb2zM*2M9!I57Z>Hj&|ON%Z)J!KK~`L`## zuPWF%Yr(oF#hdVD%UU)|mHcBNaQENSNV9gb96$<|vmy^Dw6*n9eFa36F{vZ0z_xldp z|GtOHF3}WKnxDh=Pso1zzaF;bFY)d$yPo`?9y&X0dxiHL^A5SzlkLCbQ_pcm^8DVM z;Oy|;6JeLH_5M*kRQPxF(39hyCEeM3_$9qRN!d*UUHT6MD|+kY@*|4%E;-hWJ`$(n0dmGtk2Xfe?c{iojl zLrn2M4AG}u3;ydN`Y(I`>8la{4%PnJ`$ac0^z2{WNL5_Cs=IuDS>aFm%g^ww?d*;G z7apP$2DAoCa1$e*R@Wo!m)nOfGs!E#A9#I;mYt}@y0=hFTi$*^9&1mSl6M@8{aWVE zx6uGJUIo&zkf)M89VD>ZT-C+p;l`#KZT(3=+3lrqiIjcnUgZh%pZK>iy5_QAJi?ZW2(v|P zdd2*&YE9tbR8AAiDwc-Ws}H66dC0iwY7J_}k{B-PQ{%afdWMNYsY4~-YYi#)gt~%w zRC=K?%W7;}R}$%ZM^vlT-fo9FiCyDSUg||*4oTAd;)ZnTl^&RU+h?xlv4*?G3hcn% z7_B_3&?;7)jr7-%4Ebf~$Z#9O(?k6!W2%SZYa@6)!Up_xUo^qm-PO$}JVicJp!O^AZngM!TK-v#PRUbkDpJQAeM zf$n9Y;_F-=j$h>`8NMbMdm#X*XsCZk<4IjEp=_pADqz9_0pAc2i{+_sy0L(ZH;59+ zWgMDMqv?iV7b!!6EO1eHe=Gy4)lV4s%n~1s#KK2&ReED;Kux)GWO$xj_thXBf;0$c z6{=w96*e$GJ+d@C;>TxSi8YE3r|fp7-YhIsgWq1iVDmu*_n$-!4OgL;d4V) z!0AgVC9et3hO>ot?Y*~T+uxY08fl40_CLpDBz^>C?{S3gh|y)p@I!|UKzF>eLgC-9^akIhLmk2fUV=lLyzUaBE>HCekzL14j^G880sGs)ybi)08h$QG6JYU zpiTl54bP$K0_zf@qvZm*LXSm#`ac373=uO&*Mes~QyvFo9hAgV!QgWmi!nVwfm{IaG6%QI+laeh8rKUhckSYftIP8qaUEc1oGMjq2#|En05dN3$a2S)8OvE~Vn*wp(|S0|NqF zCA7mGi`+F1>`1+c)BLo2o?}RCYw@-HEtRVhzP#8hUUVj~ruPAVQp3z|`?_yZ>N|2^ zMN#(V&F|YF(SuYPT%@xS{Zq}9q-h|?;u1qWMThyVj6wpm= zj}xo~lZq_Z=BwSo8a)V?V-FLl1@mdFcsU|UowkerdW@&k^~6O?lFgE4C#b?Gi!inV zf*AqT+ZAiU<-0J9<;^+iz=JMxSb$AYhG{$@!LifjP_jrML$d>ysrrjzEx=J)IR>V~ zt#T-Y%S!kzN`i$_HFmyf!%8u|Z65FL*71nN0qHBSx)%v!2LlvVVSu+Ts?fPJRmp%j5;YRQ82(ZSEa6)qQdpxLgfU|heDeGs(u{`MmUzsXlC{y z;D|^U!^6*TBrt4>eH5f4ptR9I_b8=~2A0H;AnNuh#JP(Kd=aqklI2S7nkgD3A=iG= zeEkgHa91g|5gekrxMnJMJGMr$No7i{)b?-u&i6p>H zb^688)(5vHLM~tp)dvs4u~dwZgQGA!#KwXsc>#CYoX@MPr<=AmL!Yn*s?LJ_kkKv~_ zUlr$hI}BUspU^cN&#|#@-fG&H$&>>dK2lh8w*4KL@F}e(TJk!ufzgA;4#1Ks`alM$ z3E;{loFwP)hT6lJRq53-;0%WX0WoYO1)`IgC0S9rVBvub%n8?QP4e}&CqZD2Ah7PgyIaob|y*F^t}Z^yy&fe&nI(-<%KL3h8kzabghfSK$qJEzGfXW02R=SJcUaY{uGj z3;nk!&}EY=8TM23qdAJ6Q^=t@w#V0aSR5q__?g%4QJ&F&JDt1;0WW=yt-VJP>2B6= z$PcLC!gg|fJLx$GV0oJ-_&|zDZean1dz3QQkSXT!Y9KkqfF;fJx6$^#WG&TX%GX_j zUvb4SR9xznGkaeifjfaXAeS-rzOzsjc9NyJv}J1p6Ch?1Z^Uh9kpe z#!>aN`%VCDeS`*z=(J>0k@VPxJW26$28J97f7i(Wuf6Y%YAWCN{p~aY1PDcX2~ALx zE>&RDK~y5PP!1Ey016{07DO0>AW{+%ssSu02q+d1RFoEak)|+A5XOmsh>FzE6<*HF zJ?GB3@7#I!zB_N-ckc1;?6tD9R`zdyKlQsE7>Q6ayBI()7AtHDMks(cFdfswFNN74 zH^^vS6vvB^YFjQMqYF;9Bd#Un^TF;=9)cbz`JQ0;j(t>y5%HV=dI1P^I`4E;L{XRb zC&Z1JD)`PyLVZWq9_mkvA0ae*gq_x{94JZLyhBYq6zyYqPyT>GtV)g8hvw5SXXZv3q?UTLhRgPzS;5o87<7O$t4)_6GFr6OoYTSl@AGPAp z{Y_>15T5UcUN7T86*lokLt!vdk57OoHU!^9F%Y`G4{*w*AC8K>_E5ohL5ZZNNI@~mz-SKXFd-BDHDIaJ-fR^2OC z^U}Pg-?L`mTn#(7=2cbA@KDX`wHl7GTd& zbzIN7#dCGbxpk{mbxFaf=#jc8UVw+A{97#j?^0_3Y~^Xyf;{tyEZE?eHX#zMAq>C3 z=ho6U)^U8|l2nqe4-Ee5z6L;@cR6oV#%}%F%NcL#FQFm%&zD^RNL=A6@6=2sJJRL( zyw#+CL+Ag_ZD0U~cPjwv2BfffMrhvlm^sY4`6JHZ2DBh%H!&bI4|u*DclVdlxeg~I zEIqs+egA(E%zwrDS*WnI@y>KK8nClnuXpDd$9h!UPA{hXmSF_EFTwC0S%B355Eh>o zN&qp-IK}?MGXxNi<{S4jA+qeE5n2Lmq||(C8n24_Uw``lQDplo9bs}@>ECMl|CWyU ztrWo%*_3Z7{~kfOc7X6VZk(?K;Xk6LANh#x2uXAAT@_s(-Ix0=iA%RaDJZ`M{Mn~c z-QP%7h-^YWVyIQ~wVxBMT3DUugOF%IOMBa|#i~55zm1|M8(peyDtb~**&t#dSNqEP zaxl-0b15p@N^Qtlze*)vey}CFtn-k0`mEMm$kqq`Q?~m1J?7)oCNje*<~@eEz1qm- z`5b|avs{}s)b?>pq?cQTx4_RuBGrl_-%@PY2au|!V(e4(SBxQ%CLI6T*8rL*E}UnxlWaWDe@O$*K+>T^E8 z{JR8RLBRh;;B8upQE*xOSoaHoXTI;+R|4-J*9CL$A#!<3{S&bdC)~gR?N~R+Aj4?h6nI%6U`0WLr6 zc)bLVrvehJ&RUG#wi){q2W<7N!&%`2?drxMFRf1F`-sgV7V^hgzV%m#I{|i{L5LbY z)D3*_60y+I@~ELTPLNa4DX~`GZYT2ZzZCPKb@|1s_!Ap0jBv zRoEnW0pMXf@nC+}3C!)SlbBTE@X$vPvx!I_1+JLTV+E$t)R*`%9czMAZk5Vm;LZzC@GT}ba_kp6=O_H6cCir4cMhfO zkcT7&=cSD9_M%Slv%(rDF6-joq{P7aJdoW2<3(do1Yd=U*;cTZ%sAa^3y`G^TrmzB z;uYecq=CprwJ1QMILM6|d!Qc{2Z~uIp-KRG^9nCW zyEo)f2^1+jO!+?A4+t?}fuv>nd3-ETAT|K`UY$+yFxVEv+dA>4;>>|Eeg~>U9fn2W z4JOiR2`c>D<8;Wb`I|ccu3Lwi;!=^|WuHATBOsw_aw=967NjugCDw3)5|+2gdxq|f z0|*x$LSFaTp$+m-T3A?M5o(AwR0Vb7yw;rF3wXd1UDdSS>I~plD1uN@xTkPyi>;C{ z9E6y0`1yl1Feiq{A<2BgF62jNab!tfepu^nR#imW=(YrDc*o-G23?3k@GeZy*JdAfg5G0tFGh4+JJ(9@PkGh(lYIy-{?R4WS!vQiQO zY;Q&+g-HvGLrfcgSD5mo&`$?%Ii4d?!xHW9Azw5Dz;S|51i|oI zhrL$#K}4ESi0_J4&D0HEZ4(8Gx1Vh4tY?3}Pb!5oF^bNrA_W!O0)7Qg@c0I?cP?D% zrqFfPdJL9^At(^x7)uN+422;QQsgP>d~VqD$_U^l&PNf_swv+)tyB$wMQ1PN{lTs< z2ul%rJxAxm5x~|%$ITy~%f%1~rGdAB`fxD1=u6|>@t<1dG!C(~r-H$0MySGTeafMe z`)cbJw8%VaM|7fb<4Db>QWAEUl=MDU?m4%`>Hsn3&M7}I(DvSVvjZK3odTiQdy3tY zqhT0M(R#5Xh@16?@T$*`?GH*`%fv{3Lt}OjD5GtuZ==I*(ju2tt%?FGrPwyWVucS~ z>B(sMsYMbZzJXy;@JS4yEBY@%ZMmcp(HGw&FEp|5SeJn~_oMU8H?pft7@%O~L7+KH zu0@iwy(hbjM}g=ruh2mS2`ygyN(n&}fh1tm^+g2Ps$}BY)qB2cSio1Pi$~`HHUi%Y zLi8RT*-gbAbYWE#uw=(DP7ucuT+_waubm1xUjqX=yG0H`4%1D3`VEASG4w8c48dnmYop^rsS+P zj(0NS5r(TNjSGSZsR$Qdl^Qi9g8(hzVL>dOrat6=|ESK|610U9HB<8#r+Y^)>ND+j zuJ$J+5g2!mOy*Df$pARGc`i{q#B~y_G=%2Ye%%L2Eh`0+bT*Kc^*!w^7QmZ5Y1yRQ z21%=)L4fbbw`2SZ1cd_MFjsfW4Pe!b3H5Ia1=N6D2S;a;3^^5|%6`yM=!$g|=k9?VPJ4gUa0PT1Pv8apx!15*r$_1yA5AR)rp6m(JJ9^N#SnV4g; z^^&G{3XZ%HQ=Gn4LACf#Kx-Cs^Bl}>(Wl3YPbejJfp$xMD$nOx0I zu3b)MNmCn4s7)klO9ZuzN$selcCxA6%hX;1 z#3W^mlrkQXGQmvwP?<8xPMKOxnUSW?nb5f;`eFoqnMq%*qlPVc=y_#Y|Hr+*2jbrb=h0%05k%A52wTNhQdnshFmzxunaUhj(ucLZ4oE8Ej%U90)9QWku$zL*-4?eR8Bd*eQesSRc z&(2u#9QcZV-+})w3#H}vi45_d7Uq;}_=i>REe9#YiU|60koCw?WLUYGIa+$IT4iT=c!Vy^zI zM*KNJ%AQeeBTB;xKb6#?@M~!2ZkpBNUVoiNWVZY*%f+!P^YG#;Rf@5u(pa~bkA>OvXEhawx^vDLc~F;yL`alQS$`t>P#`@)Rtf|W@GMaTT4mvt>w04|a%rT* z9QQ zc%eoadF$SqJ{%CqP&jbIMd1xcZqZW0gwboc`E#@+_%Jhk0iC}w+QYBJSe*S%39-lpkobqziIVrLp41D1Wg9Z1Z{mR z^i!aZHyU(g7_0;~qF8UK~c)%&=BdN4@SR=b}U_bJ!ip+O@CqOfY zT2(jXC+gn+2|W@A#F%TX?h#K4qN6yxR$xbr0D*FzgaBdEj#_|>zStXj zvX&H!z*4Bp6{Hwc>L`(I004V7B_UNs29p+Z8jq62=qgHd1%dBBjiSX!jlB&HKoMpf z|NKy<7DK`(Cfbt&_55?9-aXtKd1A|FY|d4ib`7`h=Q4_S-`aY(z2nfcxy(}Pt!;tM z&plqvWmR_G(mvDv+>cw5$K7>_V~A zo;z-rJNgUF7H$)1cMcTo`r(ep!W~lAokLGLez+gGP(l_eA+_!rc$l+rH)v0A2(?$^ z@mxFBdWQI0p80>ul>1d-`dZiXYhBOF|AGZQUTcbHLI0%}WQ}1p`KtZC)d!V{ebwBp zhM`x#E6o>^Tu9;ztxNkfufzJDM<&)^7NYzmH5x7;V7o*L90cb;da{2q|z#?4D= zRu?}$hza~s(hDt*n8N0Wa}KO)kjCUpBi?aaSr9rFl!jBifXB=Q>CQZiaa+Cc|HTHY%)bxKikzCaddwz~I&VroX=~PwoJ}U< z@}*myTJ&>fsX@E*Wq)jIF?u#j3!~=CzjJCedo`O9(V4Hf)YfXbI!mYE3J848Z8owz z7whf<6{+?%2eY|U2DLyWNTWz%6?tz!o zc3-VUyK=Lxp(a-7b;l(MKn{_>=m`*~WAyA^Ude#z%6@h_4jPVkueXF267elfP*`rG z_B&qm6*=cu)N=~aHUEdTzdZQw38W35nf|iGxumncJa#$sKXOdkU;audeQo;t;~Sj* zgOpPAiP34+!sBEed(4FGOoJNjxkeq%@s}Q$D_3elk7Uy=1OyS2wrya>Uj|6751)JCi7c2Ou!K+}^XklreIi}ryd)iP z6odhPK7=2Biph|V2Ri!=DchIC!s>(Y;7QMxcVqG`U<{UjVYv}UpcswF>%sh=yEc3! zYuCmMfZ7R{3ReWc!Ob9qY&vhXfu~>{togRHz(?;v7r;ercLnui|7qCG5G-U|GGKM> zfYb;J_G{D;dk9k;{_HpsnG%Sd0A7vjd;v4IbQ@mvq#zaQh7F z1TIART76mkPd~$aPAr7%3=s(Xy_EYKduYofEL0 zDpBuW5W3Q~eb-XGWuDM;-8{Bi;zN3I_YJ4y%@%hmw)7R5<~Mk4eH3u;%Kod~pZIqK zA1?8Jg19C7cpJN%^y0*(;Ee6=kNh6x>~T5s$*U@C=rwKak@h!FPR!RXlpGEtH^k1W zSl+Fi{ki6%)Y2*W>=Prc@fvdLdD(=BD8 zZ(MP8e&PLB_^UfQsXieCEo{@s&0rHz&K4_`F$qL$E31j;9w;-4vk zifx4RBCGE>aYBc%$`_?PG;hQU1WfP*_0!mq1eGi%CvpB_f^UqL3R5L1n5{z%&m#@4yz(Nt^MY&C}IK!Sg|-G{a@#x5K8x4R{LGHzwL2lT7& z`sUbsb$dUD1BJGMMj3^6z89Pea|0R@3$Gk~*&e`*s2v=?cDALx=vs95O40S00n_5V ei?8`7ZpP^+73arq?ocmCGCF$O_V--n=Kl*S?vsxI literal 30005 zcmeIbXIN9~y6-(w2_b|~q$8mh5kjv*=)Hr0qSBk_q^Y1F2_0!ckdAagL=8m*L<~JN zsRCl73*uBjKtLo1*V=QhefD|Jb-f?n_gv>%(|pYr$o<@7+~fKGe$Oy8Hc(M@bpZu~ zzk_6fqYn)L(Fs7H%n(*_D6c&X1cfo!!;WdgG_&Bmm*6Kt=&;^&GVydKrSuX`NUStc zm4I}3%)oYzK`9gk$Dx>1P#h8{VKo#!iwOoW(Xn9wBu2`T8G&b^H(|k`*e*QfWY*-g zz0XA_%&q3aW0u9MYJ40kecZc^pH7XRT|m&SUYL$mSWZRQBtkT>UyKeS#>^;ACnf<` zlRRI1LQ-0a33O7^;bioXO#GxGos_Zwzp|3DN(e%uLqxFN0VWjvAz--aG%ai?f3alf&a(M+~E*v9j~S&*w4l^MVQ&q?s-hPr5$) z?ncb>k+2VxQJmKJ9(kp+Z7(`sJkER3K1`v}+OJ6W{2|hNFSC#KePDI}Wun^4 z$N4WCD_Sx|9y<6CPxBm0p zPuhnxl@B`=vy-pq^9>eXb}Z8lKepdlY4BayIb5xAUY(+@&X0UroLd`x@VPDU&w=zm zX-~ft>3^Xuf4yh-TYX@)B4i=vMZ1euvbLr>n;-5R8 ze$s}2(!L%}CLS(S9j+D~Za+BO89dy1eR#NiNSmN-KcmqaX|ygH?E{UrOry~RXbcwm zcDB0OR{C<%I0)#d9R&8EFeCs1q<;0ruQmY?G=N6WYeX(?k4CUcI#bCdo$(kUlLDjK z((WWqdB3;R+Opm>tnMvdMMtf@X<&< zlZL9%GNTO1bNvnX$1APMObSh&RKI%QSnv0)|H*@?$1a_>_)HsXUf27KSDzbbeE8;R zz(Rka>C;E=o`rt<^lsqk;}0(g5QgJsP2{=G1lAMh2b*dadPzd2cg>pXmIiX7wlexE}F^WQ9qeg%p+Ls)baIot1?&JX~Utq{r^Nm~JF` zfAO}N(&}P{m4U=krrl}Zr8|yZ_m{GqudXg-yTnN>=XhlKF6a8(yT6?0-?+M*AJ8N5 zu^?p9_hVt`^8Jr@!*^Cc77^f*E5$MFek&yjqSY&<$x5GA%18#1tL2%e{Z=b-ysB64 z6XaP?pK&T% zYK^3!z$tiM{UjjEaPk_Zj)}`fyy1@*m~9~=`cx}9LzEEq87b{L!HWV zT$*9U?GgURKF;*y)NC0_Bq71=axedd`gQ6ZDGEq{?Mu$LjE=%0CGv}f?N(>Lufw4z>Tk=CNvedqV<69_5CYu z;jOUo4?v8jqfv_G?(mC0=vwiJ;|F0v=fn@e`bi@y0M3V(Qb6#wIZIOFTGZXZiK z=neW}@#IbjvvXOP+X~?i5{Lnkt`B$aL34az$Tkll46w=7r}zdy7gWme2ct+PPB3q% zog1G@qN0%zfj5_pQ>?z(I9w$#$0Y=!2)msc8XH^ywl>5}TFD2;#q*R}6)888q9p2O zxtE&YJuVxxwDTQ;{860kiZ25h{RfMY0!ck8ZQF1@WHM}E1TNXOPVk0Vm(a*?MucqI z$%$gF-D$Wgfk@CPc${1~;bo${#}qBd#?N^S4u;F7UUQBH-%O zs0E7eWTd=pH$34601(tH?4Y5C5x^2u2BR4v016DYjitay0V&Et|K@t&@{{~uY(thjoqxZUx0Zt0rd>{iOPz*$l zKL7!i)2vfHlN)_X`HYNmOB%*)hVIeRugY5RjCs;l z)_Ln6QvI$tDvYBSc?YccC$a=4h@=JHQE}J=x z$$g_Tn4*=QN#&9fqScc)%?^rKfE?gHWA zC1Oo4Z!-IZFYr#4q0WS~=)P#rv(&rw?z-8=)TGPvzSs^6pR} zF9X`W5BOO4ht~lC&L%C`zDx!!VL@%z#dZ7hYp#gNh2%>hAMHQPxDmw=#vdfW&m-uT zy?=;y4C6{xr)L40+-32sqr09j#ds0)ANfS=E^y>7GF#-dFI zvtji`>(SjSo=CIelab9YZk$W?yrS^&%I?Z3gALF|`b2pbUZNT#X%*Gd>GVal1~sAv zuqQ86`zYe))gE<*mD&SWtM;|-DLc8MV>U8>#fM*^%)Axx<1GLjDSo$bfVS(5e(*i^>F+*5@^f8tHnW@7z?nott)litHK(G!i`2#JT!=INZ@A3~l! z5u>WxB&EHF+@E&()GLadd;2M}pTAOEMsFH6BS^m~a6w~?_MH~UbOvyn2d};!KAck| z-)HYU9UQ0XQ-WZo=~7l`@%xEAbD_&$Sm~578(7yGth2qmA}$)+t%v!HgF2I;Fs$aC zVAb4j>g|w=s}r8e0iYAJVDnie238N<(;k`bsyXs#Hv=!P9i~Fj+ zw=47&WQ!m3S~ODZRg%7fhpvi8xF%IoZIS5#4G&mSV9EsD@5M&RdT9R~i=S}+!$#9D z_n_-a=sQhDDQp3dkEneL95V|GtA}qBg2CDe#S?~+4OlIegt$1Pc)YyhxLI6)9lRv0 zV3(<5MVj>oC$UG-9+?KKe^F7agx!J%!oM>JkY|kEs?9y`gYj@MjN3;Q;tos?{w{EI9hK zkG)YV2IAxiXsw?PRCGvQawNTq%dbl9n!Xt1;b7-Uhmmk7_!vf;Kyc##ZnEbtaL#fB zE>8-L5jjn=rSp7+wQUM-dWw5P!`=XcoLv(zwknvX-UL%bx`LibeFKuo7p07$@G^-;HzaKi&msbjx0CTEDxtFudpni+$_K5EdSS8m-n&) zxUz#(vqPM+uZCrZ=4M}S&JKT_eRD6Hz?BoFniJ!c6Bm|~kehR>IVbsbPU>C`i7WTE zYHp@eZdO=sPHt{qb8f-w+`D_Z#awx%s(Iy3dH2Hds&ezHoAYX3=RMlXBXi}~spdC0 z7Hv5d?SvKW z<`(TY7ahDVI@~J)xQoGR#n3aw@ax5hykcZaF>0n5y&3V*l#Sw z?jgKe&5kjvjC)vaYnuF_1hb%Fvn~5zQZcekTp(!4>O^7N;^Fgeu~ggn$mOf&erA8Q zjC0|WZ(Dn{yP@uxjj=D?Sr1+r<)(T5D6h&j2=5n{n0fN_>yt>bM9J0AH1<+EulHW} zPF$0Ib7w>D)Jl0a3d*BmG{oB3Z30uJ%{;-oLK5o3ywnnCzH`yMqj2h@Mj>Xp4~vm& z(=Jv)?oi)Ah_hZZv%s|0!T!cae$7_Wx*jVGH#IEGAs-d^aPuY+0;``mv%&{@LyM%d)ip2~I z-c!qtUZjd<6b*0c3S%@o1Aw@q zu?9jkhbhL-2iUd>>^L?N#7r$im)H{d+Yeb!-a+@>Cde1UN7Arr3H!s%t4JXN%f$IP zJ(c+K5#FXlUN_fP@9?t{kLCCFPmnv1dYR||HRv$EYK@&47*wtsEdYO3qN@v1x3lEL zk;XAvSIU2+X_2Uo($7AXhKowHdwl|YrEfD=4wMVPg3$3TimwA8Q+vlX+sHZ=8eI)I z1I?)9fFaengOV*RCR^P!HhU;}NTmsDg;4#9`(~-}xK-O1=q44%MlSEdk|#Bl^5k0n zs2mVrz}*SvQ5UugG}jo!(jIQ9PPxcOzu(oXXOTfriD{a0FP;VuU+mjj73Su2ApjO6 zuOUVNfiYAzyYe}+0IL))rH0( zx#Qj;FXh7SG@|7BL}JpEdYbNys;;o!+C^`+6{4X0Z`RNFPG>Vi(*@2Crq_VD1**oF?*vDQI-DtB?ybgVSIghDATd0Ny^Y-K9*K?}D&Mh|d>* z1G)feG&}}DIpsClnP9gp2ThEZ6J{ke{8`RRtksiWmrb!$(P2ALOLvl2oAd2fI?Ht_ z6eHS}!GsGgTcllnA}AVR9V!LP7{v-3hNL-TJ6K-s_Ns;l(i@UHgqrVnT{={tn#4d@ zM02{Ot}=J-t9B`*TE(8U@60=AS1sM5ej_Z$futZL2;$%pC5_bvc$%>2Sx%rS zCc8-7hX5v1%!w8wP=+pT2a1L}_p6dFK-`X=al74Oxg8Fkoe0*QH&J*XHzY=sawug< zIQ3~nHoV5oSz#NZ`Z=8r=ei*j7nC3&Ov)}i)me3=$xh=m@pwo$zzTis=SESDjYK6D z?znU!dYJ8bh_XU!vk=!ua;;Y;h_EFyF#9?)lQXB{y^iE+^Jc$RCfvLM!>&HC!VFc{ z^Rv;lXHdKpIFX!r!cE>Ny3|78ehVDWp5Ib!ShvsgBxsBy)u)@zX!La?t#|>b4T#71 zjg;PLQc^`HjJi`~iH;N77q6YnS+B9Ho;O)A2B-I;J_mG3mB^YX+OK(>Fg;f0KZTw- zo|fN1Iuedt-MbB%Y{aNO9}eI~AqukJ`(&8~WP|Dmh<`-&PqrODbxEV0$_)Z@xQ zPN<h_z)QvZ{`BpvA5^>=75A=9E1)*xr z(wW8g2p0&tHela)#ghVz8(tzQUUlS`nlft*! zhe|^jlPe6K1UfTH*gl9V>UF)~EQPJmjDtl!xrRP?w;-)|o^YZ=JDICkKwVy?Q-v}{ zUO4O=AvYPyzXj1Phq8mBr?=QC4YKUc?tIljaf+_^DQxoG!0S8A4buLtjGRQ4U~D@# z*hT#<7uI-IR_VG;>+LyJ557P`$Zsv51>dH)XJnIxK}Cwtv>B+>>eO3g42{+ z8$z>MHeRg3wS{hx-%Q#m)wBGuMPTlSOYCx5kh=0kgg3LQv!F`*?xk(MtrH1Q*W0pY zmms3Mp;*%bwxoQAfXKsfs=DT3s;Tti?KA9tNZBTP-n;~X!l2>ZggKaIgEm4cV1Mj} zL9%kfhBaaX&Oa8cec8X1@e(jLIi<;5mX^kQnF){oFFBtKpbUb6{@2;#ubhu}TIO~^ zG))dp-TkA?Af_|i>?r3G?(_=|#d8MLVtcbirkqN>$TQe9zH>JfR!1&KTOh9~EjrNA z8>H|CiYkZ@-|7_M!%PY#tLIkG0beKO}yM*&R8t?)>l~PkrsDoRq9Glg0OY`{mSQ?)^h@ZMIkGtwsE} zijI*KE(Z40iFysqY(FlLG0Do?yOBcO)CwQhY=2oW`c_P@wCCq|7IH_r;OljPO+9I$ zFP5o#wcE05>&>1rL$6p;^PgU=+~Ivg6TKe8E;tUFf8N-&-zaBt2O8vT*vI?;2%~vE z5V6_}svNhEpS}Q<+ZqJruuY&Dll?QZ)pT3}V5~24bO}=2-+D}!eFhk ziNzlqdic*63G5@(QXIqNul*~MBDjHWbCoQBglH42JxouDV|L2Mvm||35J@)^Boc(n z(aLb4#B$mmj313fY2jfwk~GfLzp$jAP^ac41IX;bLb*34W5u_tVtPOa( z3;JKe%`U%;Ioa~Me(oac$skEul6?npI%k=@XdzjMqc>`UEZyUoOHQ?pOwM z49(N*z`;tBzwjRt^lTHpGc~%*h4SwiQUL3ybF-!Jh+S=9Q5K@!weH(?!p?y9SvC>2 z(!quXhO};#0A~rhmu_Ydl%Zu}%HkxfbPfN)emZ^jIf!zp4-dm5>!+T30&d`fUUtWk zWFT{an+{sILUkbGyP~<&odBsXqo|90fzW`iVmM5$KFGr$MWjZTF)uL9IvlG_!Q%zi zwNYK&8~l41D0Vn7<#I?nmvg6~D4qlkYS4urH?q=1GlK>SgyetdI0_;0$VjO&>kcc5 z%#3Wbd~zp`DY=-NBQfm~Nl4~hPCMs3k-^v?jtfLx6s0TIw|=L~DtE*$z$sCIA-aee z1w1llQBpxkOz8b|loD*Vb65o98i50V+c~V)s>T5|GBZoiCe0i|pa5J{>}QYoB;ep1 zjEwDvDI5)wQ~{yCf;ErDV6NJuXbvd1#}dpT0{rxFuQE)sE_RI)twaY@+V`^pA2I}v z!HYrQf;pwmgmxt&&>vZDo6k6CszKPGh8x-4MF-q6Q00#Ii~7trssdL`YEI7R5Ecty zrYcqMXC-Gs@?a8PJoVf_HIh!?{5b<22sV37Wl7{CNz#n8oq7qo%;%!dZWFVawnhoW zeoTP>v0s*Q)=lwv6yw_I?Wk92t?pc5jQDf+S10<I z5}-_0E>H(l7oVFWh}FL{CDR4ZaIxYYhZR9R+9&&26?cN=&PX$P65R^!GZdb!j14FN z-~22RuXVm1!m)cB`+d5L_lz87yY74Ww})RN=xyFDT?Mg^I?Eg^I*`H!U14IOoyHKW z6sa13uJV{stW5Y!Xe&oskzTJ*yI|J)M~$2^Wa!C863A{D3pI;D2(gnG)KTgm_ zLpw}Qj?6Q>vl~H$qZaACt0BIGWKtsUVnj>{Lv|=iGYEvhhtGlR+l*!P@bR6`t+10- z<2-uS7%|;FS&P>}+1ienYvryq_NwV9MYM{=nQ+5acuw8M#g+SC^kR?Z*qiKn;=y2O?r*}$ z;4^l{TPELJV^cSHFYx(s6w}t3^Lcd-6It5=028 zOF4V2gbw%|ho!!Tfqlaeb5ip|F@0ZuHW3SWMqZAUs2GHQIb_t-julH#&?9|pNZZ8@ zPuo)_@t8s`;nTY${luT1h$L4tciwyr{Qwb6IGgZhV`!knxCQ0!5N#nGL55b`682bIgzF{UL^naaT!zCU+P_m7~t)~smd!%kI7IaeRR4?qF-5r z$8O?yr?4|lpu!zbD>isH!R$G~+cd>IiGkYLNPA%Qbd7it*BN_rm~|1#>}-IA66}?g z_rP>=8=c1SQMsG|?&*&=Yup3zq&8m`0A(F!E* zr**jDk&}zFCk$%S+DFoiaU2vt5DM~z3NV0{0`53o)Zb!2btQ(*C5EvAB~9?nAbq&D z9-}bka0GeW1%WhX{fsAe?s%@?@xdH6PO-*$<$7QcssnuU$0FL4BC|;&-WZyTkSWP{ z$C2tW#XBpe$5oPH%#wOTG44HQz#0pj(1?E~m#JX@`QnIiUlFxTyp8}}Srdfqxnoe} z3|u~X7!N-$Yh^QIDRn)6SczzK0IDYdH5kCa=y3ZaH6xewjokX6^W|xg%9mqPH znL;RjV;8Pk0Yb;>#1qOw<8;a>AovJq#);z)SFX>Ux7rNC27tPkj~Sbk8{E<0-fWhNbp7l1OW3{-I~XjF~nEE1B%>{_u$xjm>~8h$~{iXg)tncRS=`c z45DI~o{oSS^g%B@nNo1T2^slG4-6OX5B&ej8r2x(AjDaVbCyx_$Z=LzEFZ;I&Q4t^`kPyIdv^(Ap z(7JDU!eW^nXkhUp64g~VybF08wQiY*P#fP@*j*yK8(x%uFTTbKI;~+O0VbImc9MFt z8MKW#zo*@0Q`j|A#P3+Xh1%dQ?5k%A3cOI$0yn*}nMX6JE=IL=Z388m@@n83cU`@~ zI7#b@s}u3w6eI>t+8xM@5>;Zk*>&~cyXBkO%krN;3q{9%IgbnC88csDvIBekM5p-d zFy-HBB67{YS!Q4Y>(IZ8cn!>hr>Us%ZpsLZ{aoyBKi{*)b>5ZO=wtA|Q`Y^fe!~B# z-%+};#Xu1vuzG`7B%P};{IVy+lbcL-hYNF#nQ_0DBvG@u*cUi&pSi6{E(~M{Y);D)KN>5C_^;?x^dri$i8CZP(uj;^X3wH>XAas`1vd{jdCO zX6Jbp#(R=EAU07Dg~_WmZ&2zR>$iV6I0Usz%`}pm*9y*4Fv5QSTB3l=Q0sv#xj36LC7XOgS;-7CD4jT~l<5$YUXyz87VB$d ziOeY!mXPc8mh|ZikGOZB-k*WY$~vG*#rg%g5UQol-Wr(ozu0@-j)F2%%lfQW??boz z!*<>xUxx2}xKPlNR~ zU{P79;cW1J%BUEG8!2I3ds*Zl$^MD_Rxar2z$O~;H-cFHbz#mpD(R1@ujvJmzZ&~! z>#$j0!-_NT&iaw7!b?K=Q`6mRIkJ2%$r3;FKRb3l&qr^%*0Y;Pqwrz3zrIrpy?nYQ zg#OzFSy-dX=0J1cM~f@Q)d*e{yUNk5FO6g)l~f7qEK8o38D|vnuOiKpyw2rVjv)N> zAFA;^z!WCvyqQ0LmOJaDt_!dU<|OC~m_0Lqfd6KNK>nk*>;OnWekUY4%L~M^lMnTn ze88#7B6{#WjaSo_zRI|KclapWT@<#+6pbQLV#Qu4v zF~!L&4Tu8cj{t7d^pD`b+b{XgS)&nv2(z+M^a+9gT+#whRq3Bmkn3sF`9KBO%=gH8 zd8SZr1w#;VfM)mxHg`yllZi6FfLJI;uHWPqVjX$>6EZEgd|ICcKX6uAN!S?F4Q}jt2yRxH5bwy-BCpT zvFfXi=)qmXfcFI|;9rJP0Ji-`diAWSkrjVFh*4fic;$~w5Iv1;Ki{Lv>{yEUF_SVJ zeYpwi%%+)fuFZL7gF0tqfkO|vRZHI2YjDcD|3v})#=|J>FJdeuT-}}lSM4fWuzFt_ zm~GrJ6R~@TnIroZo%w-(OoCdqZlD*4CZfiP5M`Lo*h+(%CUM&`{V-j*UiC|-~fM&tE~vQkRzSVYcKeb zETkKrdtRl*qc6APy5|Au$M@kfQ{o}o-1W7Mz;nSkpSFUpz z*R0NfbS!QCj_r;SBDu_n>+nq$#=Pt=W*!IeBzCGu1WpsHOTDKj@#0Q^fu) z3-(J2q4j=C!9C5WGz!5NgCQj)5=;@nJfX*UzH zLqfj;>;w4_`o^+3LstzWL@|M4jSw@8I>e@MR$|`svsO3w?i2c|IwOzfbpdhA`9fY0 z^-l)*?&?lAhMR#AtY{lV5NIo1;^I};7rHoS$;=%hM$=ai^~!$t@p(?%b-Ep%C!ns_ z+tDZc^J};HJ0m})p0f>=t}`6~|2y9CZI8gPR^a&m0)|mZvkhL1M-ryWdXawgx7m!*awKLbOuvoMtbI*-q74f&F?@;M$3}HR}k;hegqJ5|5ztiXV3dy+r-mz8GSL2p(W4H< zu%$nJkWXcFof$$_*%Ds$)|{DImne%dVr!0!WxDXAGRH>5kA0}wUSd+rDon?P)Tw+a z8-F>Ix7Mavdizu4uLQQ7wXx1LL7E}_n!2(gF_YuM>D6HlLDQEjW2y(cg@H4Wp@<;6 z>ID85)2t>BF!9*a2&DiL?bFmsVh*DrHG;|V(|cirWlRpfXV@I#Q2+~r-?|8vxOoN3 zOia$Dv%~jHzPCj8&e#2(2A?(*KXwxTFmE*^_Ylyu~Ce8 z75OwSzJ$>zCN(G4PI@bX73jiim@4U11Pb4URlCw{1JE>%z_4>5u_ONLpe&Wm=NCJ+ z0Bl=&r-5Q$rU8PZTp8?r8Bq3JAoeH}4Gmpl3OjdQg}|cwRp}inpoTIqNe9VgDdXmYX_q#s4oQq3x9401}?q+6UniQf{Hn#}XRcaFfwt?S*EUY;BXht4beXJX*?yr78W_dPN!v4xZ z_d!Ji*+5O+nS)}JZBM_)|a#|b~SU*?tmCNT*$TEJImtdR= z+WOYd0xi%^#W5a~vRIyX5;g_D6#r3yRnxdpi~hd+Or~pU(v#UzY~==wgGgQ=o?DRf z{4xNl`b1IoaFHcRak=!oyzl5bw_N)ZOn16{pOJkPv4D{xX*~>eL8yE~pN&VG?L!iw zi;hyKd-_=(LNt31J&hO4```( z-cG{`IS0Q~oF25&cN^_G=;x`w)!iXCQ@q&?;aTN2&z>B?Q#H;`jG#2%kRT{GBm%EpeFqO>p@rFO)o+2Vv5$SjoCOFevSnh(1G0tnIy zm;#e;0Rj*>*x7R=*v)>>di@7~eAEnNmY={p>us$?0&u6`=bZWRxzTh$2cYS4dWe0K z!Awh`1O&lQuGMrp0u6Dp{V1V`g=cgi5RM?xwZP5|;6XFGcnClNsW}-6X;f+BRflE1 zCiKXr*5zM1kOY<-dma-u(H!SvLIx2TU!oebVjN>adYj@#Xhu(y+o7|(+Wra7;`J%K zJ8OJ$c73W@+7hDLqoELiUe!`!H|zC{Bo|Z}XRlF@T;4{qk69V_6tzdGWh2EqbHFxE zH1p|J#b2i0tr2SRh-g9i6|oluB4)a*W$K`k<2XF7LVqrp`1GL+?3uFPY^gv zM{~^*7|cds1h#$%$Zk%SInOFqI#WPo*X7iFdJoWW+mfKReV-OmuJxyrPU{6MnR8Ywu{=i$1`kZ!BsnG*Kj5nr@|ehY~P< z+{(C9ju%VHm2(rH@5DKTrB}5D75!)xbFb|0uRg@EfdULpuWd6$&vZPbt^4Ja69Kh` zY9{*PxbB?o=qF14#{S2Q_@ca0?Pw~c%=hoCT{#qB@JNh?p1}?M1ZSR<{~4}=@`)!2T%w7B9c!H3#ivQOR&_ng1>Z2Hod5vdcHt0aJNZ!w;m ze%&>N-KG8EKBAKi$gItBK6%m7 z&1QI)-jv>9supuk+D^#Vsd!6>wZeQ*L9av{iL&KB%ZSOtqtw{3^}Jw#jT|sD)53j^ zK~K@?Zshkg4qM$fYK$uAlkY|_Jrh8H1nRG-4z!4W- z&hip|%nMG!$;S!OByH%{hAE#$u|C+mjR#7&F+UC1@(udvpS_l7>{`Lne!D{$EgY9& z?Wx_Ut#8vo;<7(!h*o}We%WC|T2{j(_nwa)5o?`r&``=SC3jh^-+E@|vIuYe!lg9v zOCNx1=U=G*BZ8l$r~f-`7X90AaQ^-Wf6F?*Wu1S2S?713|L*hOeg1!>&wqPyzrDEM zUfgdl?zb2B+l%|{#r^i;{!e;wwntuEE5P)>Mlb(3{}Q&7B>ZvqMG{E*a3Fzs4#&?- zfBJ~K=pfyKDORJ50}4g_;13w*n`Au=vjl!F&6lrx>E66Ta_p)~_tLRtp`M)R%P4MO zS7fWW9@2Bqq)4Dhan~MqyqwM8;k-w48Y(A7pC5e8k6d-O2AVEu@3`|Be@!QR@L1@h z$tTIL9WMo(kM@4x72~P-s{hOhnE~8rb7q0 z1{1sdZN5box@|sRSOu*Y4t-6pT;~|N_8b!?cx_`_%&@e7KWFLtTe&;SeoHq`skhkN zh&>BArNdzT5!f(0OXL3Y3|EB-Sn*NWVuC%;OsjjvlH=H9vouK4R43ebQRhzf5dMEF z!o?Vz|9=$WbZ7sY2xlerON8tC4-u}zljD~N=lPcim&Wm*BHSb5?f(?vAekVppyKTR zD#9)9{#Ow$=tzW%{-+4HV!w2!d=_E?ez{9mOfbG*AI;AzaOaKItx{szsVItz0HhIG zY{B9ZN^5#$f1Y?{^b9mC%eb=Ww!7tV94VUN-lL!OSr>;x@d(X(R+!`mHfGEOl^QR* zY=c)Tpj^D$-EIpMI{E0tNZV;!L-KA-l!TQQCO!pub3~|{TaV}t5}-|Y_8^W9A3X|< zd}1<{&9PiZ2NPgf0VP2fn<;#jTeUBNhF$tpSt5ERT>&w|Y$6^ZjAwlEaQPcu?wOx; zHV?Vy)JUrLRmKviccZuoQggR-qu3YuE=qA3B@bj(sMcQ}?c|0zkK-2+!5tVf72={M zU%s&+K}VXG*YZ06ERTzzO6@eB1wmgzYmGYbQj)o2+N_2c<;#rx*<&5tOiVGRPoO_( zh8qOV3(yZ*9f;ztV+rcA=swVvPy)KH+L>+ODO_>HRwc9+I>bqblTzFj{?-k*P+5@I zh+MQ{I#%l?%y3Vb{}Q{o?@yr=aLbmqAy*(3! zxU&dXk2E8oG@Tpw=@Txr>tn+hy8hDN0NIqf95mwZwlJ@?DUhIecY*ueN|bz7T$&jH3tRMwM`?@{h4Tu6 zQ&j0Zrtds9U?Z>{IvNzmln^d7xWm0U|!+q`>U~2YwVl;GXQ_n@}L2?P6l` zgvS9a4i868HxJJV0;}O5DMAqF$Z-P&H5nZRS_?;sRxy&p^{swQAOslkIfekn@uh~~ z>-WW>3mB@}I(`sD>bw0G3VhQriUs))0PlbyoST&yR%(-fT-fVyk%h@+MV9|y@g5{o z$11vqi2W6L-Q)rsrG-jQ+&4Z0txG8?T@qZHKI-qp?vkB`s%CA3O*XL`sOeTUvF=m7 z+H%|ZxjRo}SiDWJK3ma2r|MZ=s%oh$&%TdtrcMgo+3YhD&4?#LUmbfKA?x;cQf*ttBXs>T>j4$6lT30f2qwQpIJ%YPDLLkZ_~mhoRMn8XOC;SB%m43 zBoiN&cXJ;g*M~Es19g6Sa%-Oiw3H#vKCktas@ib)jM4`#bQd(N=&OD%OeOS!9ocD@ z2D0RJaHX@NB$oY=58~((cuo@jOOe)@wA*Bi8Cy}S@WrV8=*-gk?s)BCzUbxU-nGcZ zu}dOn(o7~Jx66x1k!PzKn3B(DREWXMfZ&j?@Ah31q|}e~NidzN^dF6r-97ZwaNl|S zK^&R`)>v?%0AN+!3UhMBxmis`j+_8w8k55f2q#5sM153B*TSX?wr*ici2~@EvpxoVcnD4m&vli3RAQJm>D6jIDF&9hd6_i(BmN8I zUK);d9wOrU_6RB+nJ5DLaHAa`2&b7X2JgWZoyM6!+dj3 zxE1q3=|U(5v$^NrnW#MU*5-VUG(1k4tVg%5u1a|}ie#ii{GAH;4KM*OQ9AZ$V$Lv|tYGJQFr#k|R^E5y;Eq%m=`PkS<}V}Ql6 z!yAU?@6lz*4Sf-g;vy{P!3381mnZRnVd_2g!ra5CWVBM^91O5#Qxd!5~_RR@x@u)dO#TNX)3*xyaCLi}TWssGEv zfCjmDg8C?tpHGMS&IimsySV<=PFR^#)I;Q@h1Ki^EOw^yGndwgTP^m+(DRG_?XIZ* zG}7|_i!bp{HaT)P&b~dH{6QF7f4-YKM|SUwTvqTs8e=YWMAE2p@^=V%z1g5ov0?3T z<$dwuKlzZ_XfMNr!P7I&yGI_Pj%H*j%B6pK2sn}}jH@R+#&0V>gxw#@@aqf|r=5Gg zdbuy{_IbWIzI+Tv?726MvTJ!e!X}MspcNQ_fN5<(e!U$Nh9rfaDR}8I;JlGV4!i!}IAV-$F@;&}@>fL<* zj>z%i%cl0tY-*1wW&h{H0rjWP7n!0|GrFTgrV2xsu$raz{@U4m!S~ z4NJMDbzVmkp@9{v%Hw3d&`6(|LF!}XG#D#n_AD%#*GgDde!py6oIa^=>o%r&+`uSN z+nS3-IQw#3A+QF#n`>F@#s;}cupAg#B00@y>pvORL;i3kzRvl%ri=vLBL)+ZKa-do z00;Id0G4~?=yP$o0C`Zn|M88=|fjS-)n2kG2A;;Y*pPSiqetqjB?c zD(?H=mUVp*xO106zgi}$Uup{x=ccS_T|Le@$ICNo-ei7l^JZAFw{s;ho_BO+XMBfD z3(6s=dzC4Z*vq6MaDJt6wIjGU$NVtV))oK%i*WH9qyLT3|HkNlWAwi<`rjD+Z;bvo VM*sU&BfsA8_`jX>|N9r}{{vq?v19-M From a66f083d3e44a2687dccad897befdc04026262f1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 9 Jul 2020 10:58:48 +0200 Subject: [PATCH 315/494] docs(examples): add create-react-app example Related: https://github.com/socketio/socket.io-client/issues/1330 --- examples/create-react-app-example/.gitignore | 23 + examples/create-react-app-example/README.md | 72 + .../create-react-app-example/package.json | 37 + .../public/favicon.ico | Bin 0 -> 3150 bytes .../public/index.html | 43 + .../public/logo192.png | Bin 0 -> 5347 bytes .../public/logo512.png | Bin 0 -> 9664 bytes .../public/manifest.json | 25 + .../public/robots.txt | 3 + examples/create-react-app-example/server.js | 19 + examples/create-react-app-example/src/App.css | 38 + examples/create-react-app-example/src/App.js | 43 + .../create-react-app-example/src/App.test.js | 9 + .../create-react-app-example/src/index.css | 13 + .../create-react-app-example/src/index.js | 17 + .../create-react-app-example/src/logo.svg | 7 + .../src/serviceWorker.js | 141 + .../src/setupTests.js | 5 + examples/create-react-app-example/yarn.lock | 11106 ++++++++++++++++ 19 files changed, 11601 insertions(+) create mode 100644 examples/create-react-app-example/.gitignore create mode 100644 examples/create-react-app-example/README.md create mode 100644 examples/create-react-app-example/package.json create mode 100644 examples/create-react-app-example/public/favicon.ico create mode 100644 examples/create-react-app-example/public/index.html create mode 100644 examples/create-react-app-example/public/logo192.png create mode 100644 examples/create-react-app-example/public/logo512.png create mode 100644 examples/create-react-app-example/public/manifest.json create mode 100644 examples/create-react-app-example/public/robots.txt create mode 100644 examples/create-react-app-example/server.js create mode 100644 examples/create-react-app-example/src/App.css create mode 100644 examples/create-react-app-example/src/App.js create mode 100644 examples/create-react-app-example/src/App.test.js create mode 100644 examples/create-react-app-example/src/index.css create mode 100644 examples/create-react-app-example/src/index.js create mode 100644 examples/create-react-app-example/src/logo.svg create mode 100644 examples/create-react-app-example/src/serviceWorker.js create mode 100644 examples/create-react-app-example/src/setupTests.js create mode 100644 examples/create-react-app-example/yarn.lock diff --git a/examples/create-react-app-example/.gitignore b/examples/create-react-app-example/.gitignore new file mode 100644 index 0000000000..4d29575de8 --- /dev/null +++ b/examples/create-react-app-example/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/examples/create-react-app-example/README.md b/examples/create-react-app-example/README.md new file mode 100644 index 0000000000..b1a8dc6a67 --- /dev/null +++ b/examples/create-react-app-example/README.md @@ -0,0 +1,72 @@ +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `yarn start` + +Runs the app in the development mode.
        +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.
        +You will also see any lint errors in the console. + +### `yarn start-server` + +Starts the Socket.IO server. + +### `yarn test` + +Launches the test runner in the interactive watch mode.
        +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `yarn build` + +Builds the app for production to the `build` folder.
        +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
        +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `yarn eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting + +### Analyzing the Bundle Size + +This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size + +### Making a Progressive Web App + +This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app + +### Advanced Configuration + +This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration + +### Deployment + +This section has moved here: https://facebook.github.io/create-react-app/docs/deployment + +### `yarn build` fails to minify + +This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify diff --git a/examples/create-react-app-example/package.json b/examples/create-react-app-example/package.json new file mode 100644 index 0000000000..bb3502b95b --- /dev/null +++ b/examples/create-react-app-example/package.json @@ -0,0 +1,37 @@ +{ + "name": "create-react-app-example", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-scripts": "3.4.1", + "socket.io": "^2.3.0", + "socket.io-client": "^2.3.0" + }, + "scripts": { + "start": "react-scripts start", + "start-server": "node server.js", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/create-react-app-example/public/favicon.ico b/examples/create-react-app-example/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bcd5dfd67cd0361b78123e95c2dd96031f27f743 GIT binary patch literal 3150 zcmaKtc{Ei0AIGn;MZ^<@lHD*OV;K7~W1q3jSjJcqNywTkMOhP*k~Oj?GO|6{m(*C2 zC7JA+hN%%Bp7T4;J@?%2_x=5zbI<2~->=X60stMr0B~{wzpi9D0MG|# zyuANt7z6;uz%?PEfAnimLl^)6h5ARwGXemG2>?hqQv-I^Gpyh$JH}Ag92}3{$a#z& zd`il2Sb#$U&e&4#^4R|GTgk!Qs+x*PCL{2+`uB5mqtnqLaaw`*H2oqJ?XF(zUACc2 zSibBrdQzcidqv*TK}rpEv1ie&;Famq2IK5%4c}1Jt2b1x_{y1C!?EU)@`_F)yN*NK z)(u03@%g%uDawwXGAMm%EnP9FgoucUedioDwL~{6RVO@A-Q$+pwVRR%WYR>{K3E&Q zzqzT!EEZ$_NHGYM6&PK#CGUV$pTWsiI5#~m>htoJ!vbc0=gm3H8sz8KzIiVN5xdCT z%;}`UH2Pc8))1VS-unh?v4*H*NIy5On{MRKw7BTmOO9oE2UApwkCl9Z?^dod9M^#w z51tEZhf+#dpTo#GDDy#kuzoIjMjZ?%v*h$ z*vwUMOjGc?R0(FjLWkMD)kca4z6~H45FIzQ!Zzu&-yWyMdCBsDr2`l}Q{8fH$H@O< z$&snNzbqLk?(GIe?!PVh?F~2qk4z^rMcp$P^hw^rUPjyCyoNTRw%;hNOwrCoN?G0E z!wT^=4Loa9@O{t;Wk(Nj=?ms1Z?UN_;21m%sUm?uib=pg&x|u)8pP#l--$;B9l47n zUUnMV0sXLe*@Gvy>XWjRoqc2tOzgYn%?g@Lb8C&WsxV1Kjssh^ZBs*Ysr+E6%tsC_ zCo-)hkYY=Bn?wMB4sqm?WS>{kh<6*DO)vXnQpQ9`-_qF6!#b;3Nf@;#B>e2j$yokl6F|9p1<($2 z=WSr%)Z?^|r6njhgbuMrIN>8JE05u0x5t@_dEfbGn9r0hK4c2vp>(*$GXsjeLL_uz zWpyfUgdv!~-2N;llVzik#s2*XB*%7u8(^sJv&T3pzaR&<9({17Zs~UY>#ugZZkHBs zD+>0_an$?}utGp$dcXtyFHnTQZJ}SF=oZ}X07dz~K>^o(vjTzw8ZQc!Fw1W=&Z?9% zv63|~l}70sJbY?H8ON8j)w5=6OpXuaZ}YT03`2%u8{;B0Vafo_iY7&BiQTbRkdJBYL}?%ATfmc zLG$uXt$@3j#OIjALdT&Ut$=9F8cgV{w_f5eS)PjoVi z&oemp-SKJ~UuGuCP1|iY?J^S&P z)-IG?O-*=z6kfZrX5H*G=aQ{ZaqnOqP@&+_;nq@mA>EcjgxrYX8EK|Iq4&E&rxR?R z8N$QOdRwY zr{P`O)=87>YLHtFfGXW z6P)ucrhj~It_9w<^v5>T6N1U}+BkS))=WX*2JY=}^b2czGhH<`?`(}}qMcpPx_%>M zM|fs(+I1m&_h(zqp-HgP>re$2O^o$q)xu#fl0ivOJE({duU)a*OD(eYgSi^cdTn}pqcPM(;S)2%1By^Wh%-CaC%>d9hi`7J zaxL7@;nhA>PE%s99&;z{8>VFgf{u!(-B-x7Of6ueme+ScryL`h(^qKE)DtieWY>-7 zgB)VJESQS4*1LU(2&@pgLvSt{(((C?K_V(rQk``i&5}ZPG;G^FiPlZ$7|-vEmMWlU z5lQ%iK2nu=h2wd_7>gK@vX=*AG+u~rQP$NwPC`ZA?4nh{3tui1x@bT6-;Rk3yDQ>d z?3qRD#+PeV7#FAa>s`Xwxsx_oRFcN$StW2=CW`=qObsT?SD^#^jM1Yk}PSPxJ zG@-_mnNU_)vM|iLRSI>UMp|hatyS}17R{10IuL0TLlupt>9dRs_SPQbv7BLYyC#qv16E-y@XZ= z-!p7I%#r-BVi$nQq3&ssRc_IC%R6$tA&^s_l46880~Wst3@>(|EO<}T4~ci~#!=e; zD)B>o%1+$ksURD1p7I-<3ehlFyVkqrySf&gg>Bp0Z9?JaG|gyTZ{Cb8SdvAWVmFX7v2ohs!OCc!Udk zUITUpmZ33rKLI#(&lDj}cKA#dpL4Fil=$5pu_wi1XJR!llw` zSItPBDEdMHk2>c7#%lBxZHHvtVUOZ$}v?=?AT~9!Jcqa@IJGuMg(s^7r>pcTrd)pS`{5Cu8WPey` z9)!!OUUY@L%9Q+bZa*S5`3f_|lFCPN6kdp_M2>{le8;cn^XUsPa+TUk47qd6)IBR% zk*&Ip?!Ge_gmmdj)BX}P_5o@VI2*wbZ^>UhFju}0gQZh!pP%4XT9{@w;G#b3XK8sN zF(7i$Jv(IM$8Akys9dhP^^~H2(7BfJp}yDW1#@!CL-!mGcSCnJ599WK9MV@yo_u$v MDeX2GIKR{Qf5okjU;qFB literal 0 HcmV?d00001 diff --git a/examples/create-react-app-example/public/index.html b/examples/create-react-app-example/public/index.html new file mode 100644 index 0000000000..aa069f27cb --- /dev/null +++ b/examples/create-react-app-example/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +

        + + + diff --git a/examples/create-react-app-example/public/logo192.png b/examples/create-react-app-example/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/examples/create-react-app-example/public/manifest.json b/examples/create-react-app-example/public/manifest.json new file mode 100644 index 0000000000..080d6c77ac --- /dev/null +++ b/examples/create-react-app-example/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/create-react-app-example/public/robots.txt b/examples/create-react-app-example/public/robots.txt new file mode 100644 index 0000000000..e9e57dc4d4 --- /dev/null +++ b/examples/create-react-app-example/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/create-react-app-example/server.js b/examples/create-react-app-example/server.js new file mode 100644 index 0000000000..93f8be93ee --- /dev/null +++ b/examples/create-react-app-example/server.js @@ -0,0 +1,19 @@ +const io = require('socket.io')(); + +io.on('connection', socket => { + console.log(`connect: ${socket.id}`); + + socket.on('hello!', () => { + console.log(`hello from ${socket.id}`); + }); + + socket.on('disconnect', () => { + console.log(`disconnect: ${socket.id}`); + }); +}); + +io.listen(3001); + +setInterval(() => { + io.emit('message', new Date().toISOString()); +}, 1000); diff --git a/examples/create-react-app-example/src/App.css b/examples/create-react-app-example/src/App.css new file mode 100644 index 0000000000..74b5e05345 --- /dev/null +++ b/examples/create-react-app-example/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/examples/create-react-app-example/src/App.js b/examples/create-react-app-example/src/App.js new file mode 100644 index 0000000000..c77bcca2a7 --- /dev/null +++ b/examples/create-react-app-example/src/App.js @@ -0,0 +1,43 @@ +import React, { useState, useEffect } from 'react'; +import './App.css'; +import io from 'socket.io-client'; + +const socket = io('localhost:3001'); + +function App() { + const [isConnected, setIsConnected] = useState(socket.connected); + const [lastMessage, setLastMessage] = useState(null); + + useEffect(() => { + socket.on('connect', () => { + setIsConnected(true); + }); + socket.on('disconnect', () => { + setIsConnected(false); + }); + socket.on('message', data => { + setLastMessage(data); + }); + return () => { + socket.off('connect'); + socket.off('disconnect'); + socket.off('message'); + }; + }); + + const sendMessage = () => { + socket.emit('hello!'); + } + + return ( +
        +
        +

        Connected: { '' + isConnected }

        +

        Last message: { lastMessage || '-' }

        + +
        +
        + ); +} + +export default App; diff --git a/examples/create-react-app-example/src/App.test.js b/examples/create-react-app-example/src/App.test.js new file mode 100644 index 0000000000..4db7ebc25c --- /dev/null +++ b/examples/create-react-app-example/src/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + const { getByText } = render(); + const linkElement = getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/examples/create-react-app-example/src/index.css b/examples/create-react-app-example/src/index.css new file mode 100644 index 0000000000..ec2585e8c0 --- /dev/null +++ b/examples/create-react-app-example/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/examples/create-react-app-example/src/index.js b/examples/create-react-app-example/src/index.js new file mode 100644 index 0000000000..f5185c1ec7 --- /dev/null +++ b/examples/create-react-app-example/src/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import * as serviceWorker from './serviceWorker'; + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/examples/create-react-app-example/src/logo.svg b/examples/create-react-app-example/src/logo.svg new file mode 100644 index 0000000000..6b60c1042f --- /dev/null +++ b/examples/create-react-app-example/src/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/examples/create-react-app-example/src/serviceWorker.js b/examples/create-react-app-example/src/serviceWorker.js new file mode 100644 index 0000000000..b04b771a82 --- /dev/null +++ b/examples/create-react-app-example/src/serviceWorker.js @@ -0,0 +1,141 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.0/8 are considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl, { + headers: { 'Service-Worker': 'script' }, + }) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready + .then(registration => { + registration.unregister(); + }) + .catch(error => { + console.error(error.message); + }); + } +} diff --git a/examples/create-react-app-example/src/setupTests.js b/examples/create-react-app-example/src/setupTests.js new file mode 100644 index 0000000000..74b1a275a0 --- /dev/null +++ b/examples/create-react-app-example/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; diff --git a/examples/create-react-app-example/yarn.lock b/examples/create-react-app-example/yarn.lock new file mode 100644 index 0000000000..8e71cba940 --- /dev/null +++ b/examples/create-react-app-example/yarn.lock @@ -0,0 +1,11106 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" + integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== + dependencies: + "@babel/types" "^7.10.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.0.tgz#0f67adea4ec39dad6e63345f70eec33014d78c89" + integrity sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw== + dependencies: + "@babel/types" "^7.9.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" + integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-call-delegate@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" + integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.7" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355" + integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" + integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.0.tgz#ab2c1bc4821af766cab51d4868a5038874ea5a12" + integrity sha512-/9GvfYTCG1NWCNwDj9e+XlnSCmWW/r9T794Xi58vPF9WCcnZCAZ0kWLSn54oqP40SUvh1T2G6VwKmFO5AOlW3A== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.0.tgz#f821b32313f07ee570976d3f6238e8d2d66e0a8e" + integrity sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg== + +"@babel/parser@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" + integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-proposal-decorators@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" + integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.0.tgz#ab89c175ecf5b4c8911194aa8657966615324ce9" + integrity sha512-xt/0CuBRBsBkqfk95ILxf0ge3gnXjEhOHrNxIiS8fdzSWgecuf9Vq2ogLUfaozJgt3LDO49ThMVWiyezGkei7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" + integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" + integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + dependencies: + "@babel/helper-call-delegate" "^7.8.7" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-constant-elements@^7.0.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" + integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx@^7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" + integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== + dependencies: + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-runtime@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.4.tgz#8b01cb8d77f795422277cc3fcf45af72bc68ba78" + integrity sha512-3WpXIKDJl/MHoAN0fNkSr7iHdUMHZoppXjf2HJ9/ed5Xht5wNIsXllJXdityKOxeA3Z8heYRb1D3p2H5rfCdPw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@7.9.0", "@babel/preset-env@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.9.1", "@babel/preset-react@^7.0.0": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.1" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" + +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" + integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime-corejs3@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.0.tgz#0d4119c44ad05bfa0ca16f2f4f91cde430056c08" + integrity sha512-Fe3z3yVZNCUTaOFBAofwkEtFiYi7a7Gg2F5S1QX+mqP403i2iKJtyHJYEp/PV2ijUheT0PiKWbmXcqtwLhmBzg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.9.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.5.1": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" + integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" + integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" + integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.0.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" + integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== + +"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" + integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== + +"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" + integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" + integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" + integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== + +"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" + integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== + +"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" + integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== + +"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" + integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== + +"@svgr/babel-plugin-transform-svg-component@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" + integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== + +"@svgr/babel-preset@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" + integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" + "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" + "@svgr/babel-plugin-transform-svg-component" "^4.2.0" + +"@svgr/core@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" + integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w== + dependencies: + "@svgr/plugin-jsx" "^4.3.3" + camelcase "^5.3.1" + cosmiconfig "^5.2.1" + +"@svgr/hast-util-to-babel-ast@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" + integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg== + dependencies: + "@babel/types" "^7.4.4" + +"@svgr/plugin-jsx@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" + integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w== + dependencies: + "@babel/core" "^7.4.5" + "@svgr/babel-preset" "^4.3.3" + "@svgr/hast-util-to-babel-ast" "^4.3.2" + svg-parser "^2.0.0" + +"@svgr/plugin-svgo@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" + integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w== + dependencies: + cosmiconfig "^5.2.1" + merge-deep "^3.0.2" + svgo "^1.2.2" + +"@svgr/webpack@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" + integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg== + dependencies: + "@babel/core" "^7.4.5" + "@babel/plugin-transform-react-constant-elements" "^7.0.0" + "@babel/preset-env" "^7.4.5" + "@babel/preset-react" "^7.0.0" + "@svgr/core" "^4.3.3" + "@svgr/plugin-jsx" "^4.3.3" + "@svgr/plugin-svgo" "^4.3.1" + loader-utils "^1.2.3" + +"@testing-library/dom@*": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.20.0.tgz#2bab85e90f0221a56256c5d4741c2a36b7c45f4d" + integrity sha512-TywaC+qDGm/Ro34kRYkFQPdT+pxSF4UjZGLIqcGfFQH5IGR43Y7sGLPnkieIW/GNsu337oxNsLUAgpI0JWhXHw== + dependencies: + "@babel/runtime" "^7.10.3" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + dom-accessibility-api "^0.4.5" + pretty-format "^25.5.0" + +"@testing-library/dom@^6.15.0": + version "6.16.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.16.0.tgz#04ada27ed74ad4c0f0d984a1245bb29b1fd90ba9" + integrity sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA== + dependencies: + "@babel/runtime" "^7.8.4" + "@sheerun/mutationobserver-shim" "^0.3.2" + "@types/testing-library__dom" "^6.12.1" + aria-query "^4.0.2" + dom-accessibility-api "^0.3.0" + pretty-format "^25.1.0" + wait-for-expect "^3.0.2" + +"@testing-library/jest-dom@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" + integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== + dependencies: + "@babel/runtime" "^7.5.1" + chalk "^2.4.1" + css "^2.2.3" + css.escape "^1.5.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + lodash "^4.17.11" + pretty-format "^24.0.0" + redent "^3.0.0" + +"@testing-library/react@^9.3.2": + version "9.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" + integrity sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg== + dependencies: + "@babel/runtime" "^7.8.4" + "@testing-library/dom" "^6.15.0" + "@types/testing-library__react" "^9.1.2" + +"@testing-library/user-event@^7.1.2": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" + integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== + +"@types/aria-query@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" + integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== + +"@types/babel__core@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" + integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" + integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" + integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/react-dom@*": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "16.9.41" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.41.tgz#925137ee4d2ff406a0ecf29e8e9237390844002e" + integrity sha512-6cFei7F7L4wwuM+IND/Q2cV1koQUvJ8iSV+Gwn0c3kvABZ691g7sp3hfEQHOUBJtccl1gPi+EyNjMIl9nGA0ug== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/testing-library__dom@*": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz#e0a00dd766983b1d6e9d10d33e708005ce6ad13e" + integrity sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g== + dependencies: + "@testing-library/dom" "*" + +"@types/testing-library__dom@^6.12.1": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz#1aede831cb4ed4a398448df5a2c54b54a365644e" + integrity sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA== + dependencies: + pretty-format "^24.3.0" + +"@types/testing-library__react@^9.1.2": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" + integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== + dependencies: + "@types/react-dom" "*" + "@types/testing-library__dom" "*" + pretty-format "^25.1.0" + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" + integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68" + integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA== + dependencies: + "@typescript-eslint/experimental-utils" "2.24.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143" + integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8" + integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.24.0" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" + integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.1.0, acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +aria-query@^4.0.2, aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + dependencies: + browserslist "^4.8.3" + caniuse-lite "^1.0.30001020" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.26" + postcss-value-parser "^4.0.2" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +axobject-query@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" + integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" + integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-preset-react-app@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA== + dependencies: + "@babel/core" "7.9.0" + "@babel/plugin-proposal-class-properties" "7.8.3" + "@babel/plugin-proposal-decorators" "7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" + "@babel/plugin-proposal-numeric-separator" "7.8.3" + "@babel/plugin-proposal-optional-chaining" "7.9.0" + "@babel/plugin-transform-flow-strip-types" "7.9.0" + "@babel/plugin-transform-react-display-name" "7.8.3" + "@babel/plugin-transform-runtime" "7.9.0" + "@babel/preset-env" "7.9.0" + "@babel/preset-react" "7.9.1" + "@babel/preset-typescript" "7.9.0" + "@babel/runtime" "7.9.0" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + 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" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + 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" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.10.0, browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + 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" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.0.2, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + +core-js@^2.4.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-js@^3.5.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0, css@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0, cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +csstype@^2.2.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" + integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== + +dom-accessibility-api@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.4.5.tgz#d9c1cefa89f509d8cf132ab5d250004d755e76e3" + integrity sha512-HcPDilI95nKztbVikaN2vzwvmv0sE8Y2ZJFODy/m15n7mGXLeOKGiys9qWVbFbh+aq/KYj2lqMLybBOkYAEXqg== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.378: + version "1.3.379" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" + integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.3.tgz#192d09865403e3097e3575ebfeb3861c4d01a66c" + integrity sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~4.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c" + integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "0.3.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "^7.1.2" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.0, escodegen@^1.9.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== + dependencies: + confusing-browser-globals "^1.0.9" + +eslint-import-resolver-node@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-loader@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" + integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw== + dependencies: + fs-extra "^8.1.0" + loader-fs-cache "^1.0.2" + loader-utils "^1.2.3" + object-hash "^2.0.1" + schema-utils "^2.6.1" + +eslint-module-utils@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" + integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" + integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ== + dependencies: + lodash "^4.17.15" + +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-jsx-a11y@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-react-hooks@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" + integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== + +eslint-plugin-react@7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" + integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + 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" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + 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" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + 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-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" + integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + dependencies: + debug "^3.0.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@2.1.2, fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +html-minifier-terser@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz#e8cc02748acb983bd7912ea9660bd31c0702ec32" + integrity sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.0.0-beta.11: + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + 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" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.0.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom-fourteen@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^14.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@24.9.0, jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" + integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" + integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-deep@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" + integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^1.1.52: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== + dependencies: + semver "^6.3.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7, nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" + integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== + dependencies: + postcss "^7.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== + dependencies: + postcss "^7.0.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-app-polyfill@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== + dependencies: + core-js "^3.5.0" + object-assign "^4.1.1" + promise "^8.0.3" + raf "^3.4.1" + regenerator-runtime "^0.13.3" + whatwg-fetch "^3.0.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-error-overlay@^6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" + integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== + +react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-scripts@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" + integrity sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ== + dependencies: + "@babel/core" "7.9.0" + "@svgr/webpack" "4.3.3" + "@typescript-eslint/eslint-plugin" "^2.10.0" + "@typescript-eslint/parser" "^2.10.0" + babel-eslint "10.1.0" + babel-jest "^24.9.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.6" + babel-preset-react-app "^9.1.2" + camelcase "^5.3.1" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "3.4.2" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^6.6.0" + eslint-config-react-app "^5.2.1" + eslint-loader "3.0.3" + eslint-plugin-flowtype "4.6.0" + eslint-plugin-import "2.20.1" + eslint-plugin-jsx-a11y "6.2.3" + eslint-plugin-react "7.19.0" + eslint-plugin-react-hooks "^1.6.1" + file-loader "4.3.0" + fs-extra "^8.1.0" + html-webpack-plugin "4.0.0-beta.11" + identity-obj-proxy "3.0.0" + jest "24.9.0" + jest-environment-jsdom-fourteen "1.0.1" + jest-resolve "24.9.0" + jest-watch-typeahead "0.4.2" + mini-css-extract-plugin "0.9.0" + optimize-css-assets-webpack-plugin "5.0.3" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.1.0" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "4.0.1" + react-app-polyfill "^1.0.6" + react-dev-utils "^10.2.1" + resolve "1.15.0" + resolve-url-loader "3.1.1" + sass-loader "8.0.2" + semver "6.3.0" + style-loader "0.23.1" + terser-webpack-plugin "2.3.5" + ts-pnp "1.1.6" + url-loader "2.3.0" + webpack "4.42.0" + webpack-dev-server "3.10.3" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "4.3.1" + optionalDependencies: + fsevents "2.1.2" + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + 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" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + 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.3" + 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.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + 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" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + 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" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.3.0, socket.io-client@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~4.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" + integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== + dependencies: + debug "~4.1.0" + engine.io "~3.4.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.3.0" + socket.io-parser "~3.4.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" + integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + 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" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-pnp@1.1.6, ts-pnp@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +wait-for-expect@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" + integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== + +workbox-webpack-plugin@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== + dependencies: + workbox-core "^4.3.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.1.2: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.2.tgz#a29c03f578faafd57dcb27055f9a5d569cb0c3d9" + integrity sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg== + dependencies: + "@babel/runtime" "^7.8.7" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + 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@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + 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.2" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= From e0b35d054fa7a90103485aa97b331f2fc7ab6c32 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 1 Sep 2020 09:37:29 +0200 Subject: [PATCH 316/494] docs: points towards the website The website is now much more stable, so there's no need to keep two copies of the same content (which must be manually kept in sync). --- Readme.md | 4 +- docs/API.md | 880 ------------------------------------------------- docs/README.md | 15 +- docs/emit.md | 64 ---- 4 files changed, 4 insertions(+), 959 deletions(-) delete mode 100644 docs/API.md delete mode 100644 docs/emit.md diff --git a/Readme.md b/Readme.md index 88e8b3aa52..18f8be7ee0 100644 --- a/Readme.md +++ b/Readme.md @@ -140,7 +140,9 @@ server.listen(3000); ## Documentation -Please see the documentation [here](/docs/README.md). Contributions are welcome! +Please see the documentation [here](https://socket.io/docs/). + +The source code of the website can be found [here](https://github.com/socketio/socket.io-website). Contributions are welcome! ## Debug / logging diff --git a/docs/API.md b/docs/API.md deleted file mode 100644 index a7ee580fc9..0000000000 --- a/docs/API.md +++ /dev/null @@ -1,880 +0,0 @@ - -## Table of Contents - - - [Class: Server](#server) - - [new Server(httpServer[, options])](#new-serverhttpserver-options) - - [new Server(port[, options])](#new-serverport-options) - - [new Server(options)](#new-serveroptions) - - [server.sockets](#serversockets) - - [server.engine.generateId](#serverenginegenerateid) - - [server.serveClient([value])](#serverserveclientvalue) - - [server.path([value])](#serverpathvalue) - - [server.adapter([value])](#serveradaptervalue) - - [server.origins([value])](#serveroriginsvalue) - - [server.origins(fn)](#serveroriginsfn) - - [server.attach(httpServer[, options])](#serverattachhttpserver-options) - - [server.attach(port[, options])](#serverattachport-options) - - [server.listen(httpServer[, options])](#serverlistenhttpserver-options) - - [server.listen(port[, options])](#serverlistenport-options) - - [server.bind(engine)](#serverbindengine) - - [server.onconnection(socket)](#serveronconnectionsocket) - - [server.of(nsp)](#serverofnsp) - - [server.close([callback])](#serverclosecallback) - - [Class: Namespace](#namespace) - - [namespace.name](#namespacename) - - [namespace.connected](#namespaceconnected) - - [namespace.adapter](#namespaceadapter) - - [namespace.to(room)](#namespacetoroom) - - [namespace.in(room)](#namespaceinroom) - - [namespace.emit(eventName[, ...args])](#namespaceemiteventname-args) - - [namespace.clients(callback)](#namespaceclientscallback) - - [namespace.use(fn)](#namespaceusefn) - - [Event: 'connect'](#event-connect) - - [Event: 'connection'](#event-connect) - - [Flag: 'volatile'](#flag-volatile) - - [Flag: 'local'](#flag-local) - - [Flag: 'binary'](#flag-binary) - - [Class: Socket](#socket) - - [socket.id](#socketid) - - [socket.rooms](#socketrooms) - - [socket.client](#socketclient) - - [socket.conn](#socketconn) - - [socket.request](#socketrequest) - - [socket.handshake](#sockethandshake) - - [socket.use(fn)](#socketusefn) - - [socket.send([...args][, ack])](#socketsendargs-ack) - - [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack) - - [socket.on(eventName, callback)](#socketoneventname-callback) - - [socket.once(eventName, listener)](#socketonceeventname-listener) - - [socket.removeListener(eventName, listener)](#socketremovelistenereventname-listener) - - [socket.removeAllListeners([eventName])](#socketremovealllistenerseventname) - - [socket.eventNames()](#socketeventnames) - - [socket.join(room[, callback])](#socketjoinroom-callback) - - [socket.join(rooms[, callback])](#socketjoinrooms-callback) - - [socket.leave(room[, callback])](#socketleaveroom-callback) - - [socket.to(room)](#sockettoroom) - - [socket.in(room)](#socketinroom) - - [socket.compress(value)](#socketcompressvalue) - - [socket.disconnect(close)](#socketdisconnectclose) - - [Flag: 'broadcast'](#flag-broadcast) - - [Flag: 'volatile'](#flag-volatile-1) - - [Flag: 'binary'](#flag-binary-1) - - [Event: 'disconnect'](#event-disconnect) - - [Event: 'error'](#event-error) - - [Event: 'disconnecting'](#event-disconnecting) - - [Class: Client](#client) - - [client.conn](#clientconn) - - [client.request](#clientrequest) - - -### Server - -Exposed by `require('socket.io')`. - -#### new Server(httpServer[, options]) - - - `httpServer` _(http.Server)_ the server to bind to. - - `options` _(Object)_ - - `path` _(String)_: name of the path to capture (`/socket.io`) - - `serveClient` _(Boolean)_: whether to serve the client files (`true`) - - `adapter` _(Adapter)_: the adapter to use. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter) - - `origins` _(String)_: the allowed origins (`*:*`) - - `parser` _(Parser)_: the parser to use. Defaults to an instance of the `Parser` that ships with socket.io. See [socket.io-parser](https://github.com/socketio/socket.io-parser). - -Works with and without `new`: - -```js -const io = require('socket.io')(); -// or -const Server = require('socket.io'); -const io = new Server(); -``` - -The same options passed to socket.io are always passed to the `engine.io` `Server` that gets created. See engine.io [options](https://github.com/socketio/engine.io#methods-1) as reference. - -Among those options: - - - `pingTimeout` _(Number)_: how many ms without a pong packet to consider the connection closed (`60000`) - - `pingInterval` _(Number)_: how many ms before sending a new ping packet (`25000`). - -Those two parameters will impact the delay before a client knows the server is not available anymore. For example, if the underlying TCP connection is not closed properly due to a network issue, a client may have to wait up to `pingTimeout + pingInterval` ms before getting a `disconnect` event. - - - `transports` _(Array)_: transports to allow connections to (`['polling', 'websocket']`). - -**Note:** The order is important. By default, a long-polling connection is established first, and then upgraded to WebSocket if possible. Using `['websocket']` means there will be no fallback if a WebSocket connection cannot be opened. - -```js -const server = require('http').createServer(); - -const io = require('socket.io')(server, { - path: '/test', - serveClient: false, - // below are engine.IO options - pingInterval: 10000, - pingTimeout: 5000, - cookie: false -}); - -server.listen(3000); -``` - -#### new Server(port[, options]) - - - `port` _(Number)_ a port to listen to (a new `http.Server` will be created) - - `options` _(Object)_ - -See [above](#new-serverhttpserver-options) for available options. - -```js -const server = require('http').createServer(); - -const io = require('socket.io')(3000, { - path: '/test', - serveClient: false, - // below are engine.IO options - pingInterval: 10000, - pingTimeout: 5000, - cookie: false -}); -``` - -#### new Server(options) - - - `options` _(Object)_ - -See [above](#new-serverhttpserver-options) for available options. - -```js -const io = require('socket.io')({ - path: '/test', - serveClient: false, -}); - -// either -const server = require('http').createServer(); - -io.attach(server, { - pingInterval: 10000, - pingTimeout: 5000, - cookie: false -}); - -server.listen(3000); - -// or -io.attach(3000, { - pingInterval: 10000, - pingTimeout: 5000, - cookie: false -}); -``` - -#### server.sockets - - * _(Namespace)_ - -The default (`/`) namespace. - -#### server.serveClient([value]) - - - `value` _(Boolean)_ - - **Returns** `Server|Boolean` - -If `value` is `true` the attached server (see `Server#attach`) will serve the client files. Defaults to `true`. This method has no effect after `attach` is called. If no arguments are supplied this method returns the current value. - -```js -// pass a server and the `serveClient` option -const io = require('socket.io')(http, { serveClient: false }); - -// or pass no server and then you can call the method -const io = require('socket.io')(); -io.serveClient(false); -io.attach(http); -``` - -#### server.path([value]) - - - `value` _(String)_ - - **Returns** `Server|String` - -Sets the path `value` under which `engine.io` and the static files will be served. Defaults to `/socket.io`. If no arguments are supplied this method returns the current value. - -```js -const io = require('socket.io')(); -io.path('/myownpath'); - -// client-side -const socket = io({ - path: '/myownpath' -}); -``` - -#### server.adapter([value]) - - - `value` _(Adapter)_ - - **Returns** `Server|Adapter` - -Sets the adapter `value`. Defaults to an instance of the `Adapter` that ships with socket.io which is memory based. See [socket.io-adapter](https://github.com/socketio/socket.io-adapter). If no arguments are supplied this method returns the current value. - -```js -const io = require('socket.io')(3000); -const redis = require('socket.io-redis'); -io.adapter(redis({ host: 'localhost', port: 6379 })); -``` - -#### server.origins([value]) - - - `value` _(String|String[])_ - - **Returns** `Server|String` - -Sets the allowed origins `value`. Defaults to any origins being allowed. If no arguments are supplied this method returns the current value. - -```js -io.origins(['https://foo.example.com/']); -``` - -#### server.origins(fn) - - - `fn` _(Function)_ - - **Returns** `Server` - -Provides a function taking two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not. If `success` is set to `false`, `error` must be provided as a string value that will be appended to the server response, e.g. "Origin not allowed". - -__Potential drawbacks__: -* in some situations, when it is not possible to determine `origin` it may have value of `*` -* As this function will be executed for every request, it is advised to make this function work as fast as possible -* If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express you can use [cors](https://github.com/expressjs/cors). - -```js -io.origins((origin, callback) => { - if (origin !== 'https://foo.example.com/') { - return callback('origin not allowed', false); - } - callback(null, true); -}); -``` - -#### server.attach(httpServer[, options]) - - - `httpServer` _(http.Server)_ the server to attach to - - `options` _(Object)_ - -Attaches the `Server` to an engine.io instance on `httpServer` with the supplied `options` (optionally). - -#### server.attach(port[, options]) - - - `port` _(Number)_ the port to listen on - - `options` _(Object)_ - -Attaches the `Server` to an engine.io instance on a new http.Server with the supplied `options` (optionally). - -#### server.listen(httpServer[, options]) - -Synonym of [server.attach(httpServer[, options])](#serverattachhttpserver-options). - -#### server.listen(port[, options]) - -Synonym of [server.attach(port[, options])](#serverattachport-options). - -#### server.bind(engine) - - - `engine` _(engine.Server)_ - - **Returns** `Server` - -Advanced use only. Binds the server to a specific engine.io `Server` (or compatible API) instance. - -#### server.onconnection(socket) - - - `socket` _(engine.Socket)_ - - **Returns** `Server` - -Advanced use only. Creates a new `socket.io` client from the incoming engine.io (or compatible API) `Socket`. - -#### server.of(nsp) - - - `nsp` _(String|RegExp|Function)_ - - **Returns** `Namespace` - -Initializes and retrieves the given `Namespace` by its pathname identifier `nsp`. If the namespace was already initialized it returns it immediately. - -```js -const adminNamespace = io.of('/admin'); -``` - -A regex or a function can also be provided, in order to create namespace in a dynamic way: - -```js -const dynamicNsp = io.of(/^\/dynamic-\d+$/).on('connect', (socket) => { - const newNamespace = socket.nsp; // newNamespace.name === '/dynamic-101' - - // broadcast to all clients in the given sub-namespace - newNamespace.emit('hello'); -}); - -// client-side -const socket = io('/dynamic-101'); - -// broadcast to all clients in each sub-namespace -dynamicNsp.emit('hello'); - -// use a middleware for each sub-namespace -dynamicNsp.use((socket, next) => { /* ... */ }); -``` - -With a function: - -```js -io.of((name, query, next) => { - next(null, checkToken(query.token)); -}).on('connect', (socket) => { /* ... */ }); -``` - -#### server.close([callback]) - - - `callback` _(Function)_ - -Closes the socket.io server. The `callback` argument is optional and will be called when all connections are closed. - -```js -const Server = require('socket.io'); -const PORT = 3030; -const server = require('http').Server(); - -const io = Server(PORT); - -io.close(); // Close current server - -server.listen(PORT); // PORT is free to use - -io = Server(server); -``` - -#### server.engine.generateId - -Overwrites the default method to generate your custom socket id. - -The function is called with a node request object (`http.IncomingMessage`) as first parameter. - -```js -io.engine.generateId = (req) => { - return "custom:id:" + custom_id++; // custom id must be unique -} -``` - -### Namespace - -Represents a pool of sockets connected under a given scope identified -by a pathname (eg: `/chat`). - -A client always connects to `/` (the main namespace), then potentially connect to other namespaces (while using the same underlying connection). - -#### namespace.name - - * _(String)_ - -The namespace identifier property. - -#### namespace.connected - - * _(Object)_ - -The hash of `Socket` objects that are connected to this namespace, indexed by `id`. - -#### namespace.adapter - - * _(Adapter)_ - -The `Adapter` used for the namespace. Useful when using the `Adapter` based on [Redis](https://github.com/socketio/socket.io-redis), as it exposes methods to manage sockets and rooms accross your cluster. - -**Note:** the adapter of the main namespace can be accessed with `io.of('/').adapter`. - -#### namespace.to(room) - - - `room` _(String)_ - - **Returns** `Namespace` for chaining - -Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room`. - -To emit to multiple rooms, you can call `to` several times. - -```js -const io = require('socket.io')(); -const adminNamespace = io.of('/admin'); - -adminNamespace.to('level1').emit('an event', { some: 'data' }); -``` - -#### namespace.in(room) - -Synonym of [namespace.to(room)](#namespacetoroom). - -#### namespace.emit(eventName[, ...args]) - - - `eventName` _(String)_ - - `args` - -Emits an event to all connected clients. The following two are equivalent: - -```js -const io = require('socket.io')(); -io.emit('an event sent to all connected clients'); // main namespace - -const chat = io.of('/chat'); -chat.emit('an event sent to all connected clients in chat namespace'); -``` - -**Note:** acknowledgements are not supported when emitting from namespace. - -#### namespace.clients(callback) - - - `callback` _(Function)_ - -Gets a list of client IDs connected to this namespace (across all nodes if applicable). - -```js -const io = require('socket.io')(); -io.of('/chat').clients((error, clients) => { - if (error) throw error; - console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD] -}); -``` - -An example to get all clients in namespace's room: - -```js -io.of('/chat').in('general').clients((error, clients) => { - if (error) throw error; - console.log(clients); // => [Anw2LatarvGVVXEIAAAD] -}); -``` - -As with broadcasting, the default is all clients from the default namespace ('/'): - -```js -io.clients((error, clients) => { - if (error) throw error; - console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB] -}); -``` - -#### namespace.use(fn) - - - `fn` _(Function)_ - -Registers a middleware, which is a function that gets executed for every incoming `Socket`, and receives as parameters the socket and a function to optionally defer execution to the next registered middleware. - -Errors passed to middleware callbacks are sent as special `error` packets to clients. - -```js -io.use((socket, next) => { - if (socket.request.headers.cookie) return next(); - next(new Error('Authentication error')); -}); -``` - -#### Event: 'connect' - - - `socket` _(Socket)_ socket connection with client - -Fired upon a connection from client. - -```js -io.on('connect', (socket) => { - // ... -}); - -io.of('/admin').on('connect', (socket) => { - // ... -}); -``` - -#### Event: 'connection' - -Synonym of [Event: 'connect'](#event-connect). - -#### Flag: 'volatile' - -Sets a modifier for a subsequent event emission that the event data may be lost if the clients are not ready to receive messages (because of network slowness or other issues, or because they’re connected through long polling and is in the middle of a request-response cycle). - -```js -io.volatile.emit('an event', { some: 'data' }); // the clients may or may not receive it -``` - -#### Flag: 'binary' - -Specifies whether there is binary data in the emitted data. Increases performance when specified. Can be `true` or `false`. - -```js -io.binary(false).emit('an event', { some: 'data' }); -``` - -#### Flag: 'local' - -Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to the current node (when the [Redis adapter](https://github.com/socketio/socket.io-redis) is used). - -```js -io.local.emit('an event', { some: 'data' }); -``` - -### Socket - -A `Socket` is the fundamental class for interacting with browser clients. A `Socket` belongs to a certain `Namespace` (by default `/`) and uses an underlying `Client` to communicate. - -It should be noted the `Socket` doesn't relate directly to the actual underlying TCP/IP `socket` and it is only the name of the class. - -Within each `Namespace`, you can also define arbitrary channels (called `room`) that the `Socket` can join and leave. That provides a convenient way to broadcast to a group of `Socket`s (see `Socket#to` below). - -The `Socket` class inherits from [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter). The `Socket` class overrides the `emit` method, and does not modify any other `EventEmitter` method. All methods documented here which also appear as `EventEmitter` methods (apart from `emit`) are implemented by `EventEmitter`, and documentation for `EventEmitter` applies. - -#### socket.id - - * _(String)_ - -A unique identifier for the session, that comes from the underlying `Client`. - -#### socket.rooms - - * _(Object)_ - -A hash of strings identifying the rooms this client is in, indexed by room name. - -```js -io.on('connection', (socket) => { - socket.join('room 237', () => { - let rooms = Object.keys(socket.rooms); - console.log(rooms); // [ , 'room 237' ] - }); -}); -``` - -#### socket.client - - * _(Client)_ - -A reference to the underlying `Client` object. - -#### socket.conn - - * _(engine.Socket)_ - -A reference to the underlying `Client` transport connection (engine.io `Socket` object). This allows access to the IO transport layer, which still (mostly) abstracts the actual TCP/IP socket. - -#### socket.request - - * _(Request)_ - -A getter proxy that returns the reference to the `request` that originated the underlying engine.io `Client`. Useful for accessing request headers such as `Cookie` or `User-Agent`. - -#### socket.handshake - - * _(Object)_ - -The handshake details: - -```js -{ - headers: /* the headers sent as part of the handshake */, - time: /* the date of creation (as string) */, - address: /* the ip of the client */, - xdomain: /* whether the connection is cross-domain */, - secure: /* whether the connection is secure */, - issued: /* the date of creation (as unix timestamp) */, - url: /* the request URL string */, - query: /* the query object */ -} -``` - -Usage: - -```js -io.use((socket, next) => { - let handshake = socket.handshake; - // ... -}); - -io.on('connection', (socket) => { - let handshake = socket.handshake; - // ... -}); -``` - -#### socket.use(fn) - - - `fn` _(Function)_ - -Registers a middleware, which is a function that gets executed for every incoming `Packet` and receives as parameter the packet and a function to optionally defer execution to the next registered middleware. - -Errors passed to middleware callbacks are sent as special `error` packets to clients. - -```js -io.on('connection', (socket) => { - socket.use((packet, next) => { - if (packet.doge === true) return next(); - next(new Error('Not a doge error')); - }); -}); -``` - -#### socket.send([...args][, ack]) - - - `args` - - `ack` _(Function)_ - - **Returns** `Socket` - -Sends a `message` event. See [socket.emit(eventName[, ...args][, ack])](#socketemiteventname-args-ack). - -#### socket.emit(eventName[, ...args][, ack]) - -*(overrides `EventEmitter.emit`)* - - `eventName` _(String)_ - - `args` - - `ack` _(Function)_ - - **Returns** `Socket` - -Emits an event to the socket identified by the string name. Any other parameters can be included. All serializable datastructures are supported, including `Buffer`. - -```js -socket.emit('hello', 'world'); -socket.emit('with-binary', 1, '2', { 3: '4', 5: Buffer.alloc(6) }); -``` - -The `ack` argument is optional and will be called with the client's answer. - -```js -io.on('connection', (socket) => { - socket.emit('an event', { some: 'data' }); - - socket.emit('ferret', 'tobi', (data) => { - console.log(data); // data will be 'woot' - }); - - // the client code - // client.on('ferret', (name, fn) => { - // fn('woot'); - // }); - -}); -``` - -#### socket.on(eventName, callback) - -*(inherited from `EventEmitter`)* - - `eventName` _(String)_ - - `callback` _(Function)_ - - **Returns** `Socket` - -Register a new handler for the given event. - -```js -socket.on('news', (data) => { - console.log(data); -}); -// with several arguments -socket.on('news', (arg1, arg2, arg3) => { - // ... -}); -// or with acknowledgement -socket.on('news', (data, callback) => { - callback(0); -}); -``` - -#### socket.once(eventName, listener) -#### socket.removeListener(eventName, listener) -#### socket.removeAllListeners([eventName]) -#### socket.eventNames() - -Inherited from `EventEmitter` (along with other methods not mentioned here). See Node.js documentation for the `events` module. - -#### socket.join(room[, callback]) - - - `room` _(String)_ - - `callback` _(Function)_ - - **Returns** `Socket` for chaining - -Adds the client to the `room`, and fires optionally a callback with `err` signature (if any). - -```js -io.on('connection', (socket) => { - socket.join('room 237', () => { - let rooms = Object.keys(socket.rooms); - console.log(rooms); // [ , 'room 237' ] - io.to('room 237').emit('a new user has joined the room'); // broadcast to everyone in the room - }); -}); -``` - -The mechanics of joining rooms are handled by the `Adapter` that has been configured (see `Server#adapter` above), defaulting to [socket.io-adapter](https://github.com/socketio/socket.io-adapter). - -For your convenience, each socket automatically joins a room identified by its id (see `Socket#id`). This makes it easy to broadcast messages to other sockets: - -```js -io.on('connection', (socket) => { - socket.on('say to someone', (id, msg) => { - // send a private message to the socket with the given id - socket.to(id).emit('my message', msg); - }); -}); -``` - -#### socket.join(rooms[, callback]) - - - `rooms` _(Array)_ - - `callback` _(Function)_ - - **Returns** `Socket` for chaining - -Adds the client to the list of room, and fires optionally a callback with `err` signature (if any). - -#### socket.leave(room[, callback]) - - - `room` _(String)_ - - `callback` _(Function)_ - - **Returns** `Socket` for chaining - -Removes the client from `room`, and fires optionally a callback with `err` signature (if any). - -**Rooms are left automatically upon disconnection**. - -#### socket.to(room) - - - `room` _(String)_ - - **Returns** `Socket` for chaining - -Sets a modifier for a subsequent event emission that the event will only be _broadcasted_ to clients that have joined the given `room` (the socket itself being excluded). - -To emit to multiple rooms, you can call `to` several times. - -```js -io.on('connection', (socket) => { - // to one room - socket.to('others').emit('an event', { some: 'data' }); - // to multiple rooms - socket.to('room1').to('room2').emit('hello'); - // a private message to another socket - socket.to(/* another socket id */).emit('hey'); -}); -``` - -**Note:** acknowledgements are not supported when broadcasting. - -#### socket.in(room) - -Synonym of [socket.to(room)](#sockettoroom). - -#### socket.compress(value) - - - `value` _(Boolean)_ whether to following packet will be compressed - - **Returns** `Socket` for chaining - -Sets a modifier for a subsequent event emission that the event data will only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method. - -```js -io.on('connection', (socket) => { - socket.compress(false).emit('uncompressed', "that's rough"); -}); -``` - -#### socket.disconnect(close) - - - `close` _(Boolean)_ whether to close the underlying connection - - **Returns** `Socket` - -Disconnects this client. If value of close is `true`, closes the underlying connection. Otherwise, it just disconnects the namespace. - -```js -io.on('connection', (socket) => { - setTimeout(() => socket.disconnect(true), 5000); -}); -``` - -#### Flag: 'broadcast' - -Sets a modifier for a subsequent event emission that the event data will only be _broadcast_ to every sockets but the sender. - -```js -io.on('connection', (socket) => { - socket.broadcast.emit('an event', { some: 'data' }); // everyone gets it but the sender -}); -``` - -#### Flag: 'volatile' - -Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to receive messages (because of network slowness or other issues, or because they’re connected through long polling and is in the middle of a request-response cycle). - -```js -io.on('connection', (socket) => { - socket.volatile.emit('an event', { some: 'data' }); // the client may or may not receive it -}); -``` - -#### Flag: 'binary' - -Specifies whether there is binary data in the emitted data. Increases performance when specified. Can be `true` or `false`. - -```js -var io = require('socket.io')(); -io.on('connection', function(socket){ - socket.binary(false).emit('an event', { some: 'data' }); // The data to send has no binary data -}); -``` - -#### Event: 'disconnect' - - - `reason` _(String)_ the reason of the disconnection (either client or server-side) - -Fired upon disconnection. - -```js -io.on('connection', (socket) => { - socket.on('disconnect', (reason) => { - // ... - }); -}); -``` - -#### Event: 'error' - - - `error` _(Object)_ error object - -Fired when an error occurs. - -```js -io.on('connection', (socket) => { - socket.on('error', (error) => { - // ... - }); -}); -``` - -#### Event: 'disconnecting' - - - `reason` _(String)_ the reason of the disconnection (either client or server-side) - -Fired when the client is going to be disconnected (but hasn't left its `rooms` yet). - -```js -io.on('connection', (socket) => { - socket.on('disconnecting', (reason) => { - let rooms = Object.keys(socket.rooms); - // ... - }); -}); -``` - -These are reserved events (along with `connect`, `newListener` and `removeListener`) which cannot be used as event names. - -### Client - -The `Client` class represents an incoming transport (engine.io) connection. A `Client` can be associated with many multiplexed `Socket`s that belong to different `Namespace`s. - -#### client.conn - - * _(engine.Socket)_ - -A reference to the underlying `engine.io` `Socket` connection. - -#### client.request - - * _(Request)_ - -A getter proxy that returns the reference to the `request` that originated the engine.io connection. Useful for accessing request headers such as `Cookie` or `User-Agent`. diff --git a/docs/README.md b/docs/README.md index f379f87a28..4a4cef50fe 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,15 +1,2 @@ -## Table of Contents - -#### Getting started - - - [Write a chat application](http://socket.io/get-started/chat/) - -#### API Reference - - - [Server API](API.md) - - [Client API](https://github.com/socketio/socket.io-client/blob/master/docs/API.md) - -#### Advanced topics - - - [Emit cheatsheet](emit.md) +The documentation has been moved to the website [here](https://socket.io/docs/). diff --git a/docs/emit.md b/docs/emit.md deleted file mode 100644 index 1ff0195fe2..0000000000 --- a/docs/emit.md +++ /dev/null @@ -1,64 +0,0 @@ - -## Emit cheatsheet - -```js - -io.on('connect', onConnect); - -function onConnect(socket){ - - // sending to the client - socket.emit('hello', 'can you hear me?', 1, 2, 'abc'); - - // sending to all clients except sender - socket.broadcast.emit('broadcast', 'hello friends!'); - - // sending to all clients in 'game' room except sender - socket.to('game').emit('nice game', "let's play a game"); - - // sending to all clients in 'game1' and/or in 'game2' room, except sender - socket.to('game1').to('game2').emit('nice game', "let's play a game (too)"); - - // sending to all clients in 'game' room, including sender - io.in('game').emit('big-announcement', 'the game will start soon'); - - // sending to all clients in namespace 'myNamespace', including sender - io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon'); - - // sending to a specific room in a specific namespace, including sender - io.of('myNamespace').to('room').emit('event', 'message'); - - // sending to individual socketid (private message) - io.to().emit('hey', 'I just met you'); - - // sending with acknowledgement - socket.emit('question', 'do you think so?', function (answer) {}); - - // sending without compression - socket.compress(false).emit('uncompressed', "that's rough"); - - // sending a message that might be dropped if the client is not ready to receive messages - socket.volatile.emit('maybe', 'do you really need it?'); - - // specifying whether the data to send has binary data - socket.binary(false).emit('what', 'I have no binaries!'); - - // sending to all clients on this node (when using multiple nodes) - io.local.emit('hi', 'my lovely babies'); - - // sending to all connected clients - io.emit('an event sent to all connected clients'); - -}; - -``` - -**Note:** The following events are reserved and should not be used as event names by your application: -- `error` -- `connect` -- `disconnect` -- `disconnecting` -- `newListener` -- `removeListener` -- `ping` -- `pong` From 1238ddb9951d3dd4414d03d6f68f3d3ba24eec1a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Sep 2020 12:14:57 +0200 Subject: [PATCH 317/494] chore: add package-lock.json file --- package-lock.json | 6113 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 6113 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..534f4778c6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6113 @@ +{ + "name": "socket.io", + "version": "2.3.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "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" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "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 + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "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 + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "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 + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "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.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "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 + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "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" + } + }, + "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.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "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" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "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 + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.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": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "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" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nyc": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", + "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^1.0.0", + "convert-source-map": "^1.5.1", + "debug-log": "^1.0.1", + "default-require-extensions": "^1.0.0", + "find-cache-dir": "^0.1.1", + "find-up": "^2.1.0", + "foreground-child": "^1.5.3", + "glob": "^7.0.6", + "istanbul-lib-coverage": "^1.1.2", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.10.0", + "istanbul-lib-report": "^1.1.3", + "istanbul-lib-source-maps": "^1.2.3", + "istanbul-reports": "^1.4.0", + "md5-hex": "^1.2.0", + "merge-source-map": "^1.1.0", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.0", + "resolve-from": "^2.0.0", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.1", + "spawn-wrap": "^1.4.2", + "test-exclude": "^4.2.0", + "yargs": "11.1.0", + "yargs-parser": "^8.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "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-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "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-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "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" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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" + } + } + } + }, + "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 + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caching-transform": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "^1.2.0", + "mkdirp": "^0.5.1", + "write-file-atomic": "^1.1.4" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "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" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": 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 + }, + "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" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "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 + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "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.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "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" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "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 + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + } + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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 + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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 + } + } + }, + "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" + } + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.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" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "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" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "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 + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "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-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": 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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "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" + } + }, + "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-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" + } + }, + "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-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-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" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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-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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", + "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.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" + } + } + } + }, + "istanbul-reports": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.4.0.tgz", + "integrity": "sha512-OPzVo1fPZ2H+owr8q/LYKLD+vquv9Pj4F+dj808MdHbuQLD7S4ACRjcX+0Tne5Vxt2lxXvdZaL7v+FOOAV281w==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "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" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "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.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.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-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" + } + }, + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "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": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "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-odd": "^2.0.0", + "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" + }, + "dependencies": { + "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 + }, + "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 + }, + "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 + } + } + }, + "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-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" + } + }, + "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 + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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" + } + }, + "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-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "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-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "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 + }, + "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" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "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-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.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "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" + } + }, + "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" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "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" + } + }, + "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": "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 + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + }, + "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 + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "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" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "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" + } + } + } + }, + "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 + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + } + } + }, + "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" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "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 + }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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 + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "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-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-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" + } + }, + "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 + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + }, + "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" + } + } + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "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" + } + } + } + }, + "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 + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "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 + } + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "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 + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": 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": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "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, + "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, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^9.0.2" + }, + "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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "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" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.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 + }, + "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 + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "socket.io-adapter": { + "version": "1.1.2", + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "babel-eslint": { + "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "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==" + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.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==", + "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=" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.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==" + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "requires": { + "strip-bom": "^4.0.0" + } + }, + "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==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "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=" + }, + "eslint": { + "version": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", + "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-prettier": { + "version": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", + "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "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==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-callable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "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==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "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==" + }, + "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=" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", + "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.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==" + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "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=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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==" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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==" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "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==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==" + }, + "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==", + "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==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "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==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.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" + } + }, + "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" + } + } + } + }, + "supertest": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", + "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} From d9bfcaeedb83ae349452242264d3352ce08bee0a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Sep 2020 14:29:42 +0200 Subject: [PATCH 318/494] test: add Node.js 12 and 14 in the build matrix Node.js 8 is removed, as it is now EOL. Note: the node_modules folder is cached by default --- .travis.yml | 6 ++---- package.json | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d50f26c43b..0972861e8e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,10 @@ language: node_js sudo: false node_js: - - '8' - '10' + - '12' + - '14' notifications: irc: "irc.freenode.org#socket.io" git: depth: 1 -cache: - directories: - - node_modules diff --git a/package.json b/package.json index 3d648fec14..8d9e704165 100644 --- a/package.json +++ b/package.json @@ -55,5 +55,8 @@ "name": "Einar Otto Stangvik", "email": "einaros@gmail.com" } - ] + ], + "engines": { + "node": ">=10.0.0" + } } From 13cc07d6ad50a27d3b6e95ee4b8b49e1788f94c7 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Sep 2020 14:24:55 +0200 Subject: [PATCH 319/494] refactor: use prettier to format code --- .eslintrc.json | 4 + lib/client.js | 94 +- lib/index.js | 234 ++-- lib/namespace.js | 99 +- lib/parent-namespace.js | 15 +- lib/socket.js | 176 ++- package-lock.json | 961 ++++++++++++++++ package.json | 9 +- test/fixtures/server-close.js | 10 +- test/socket.io.js | 1953 +++++++++++++++++---------------- 10 files changed, 2305 insertions(+), 1250 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..082c0cb598 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": "prettier", + "parser": "babel-eslint" +} diff --git a/lib/client.js b/lib/client.js index 32d179f971..5e4a540bd9 100644 --- a/lib/client.js +++ b/lib/client.js @@ -1,11 +1,10 @@ - /** * Module dependencies. */ -var parser = require('socket.io-parser'); -var debug = require('debug')('socket.io:client'); -var url = require('url'); +var parser = require("socket.io-parser"); +var debug = require("debug")("socket.io:client"); +var url = require("url"); /** * Module exports. @@ -21,7 +20,7 @@ module.exports = Client; * @api private */ -function Client(server, conn){ +function Client(server, conn) { this.server = server; this.conn = conn; this.encoder = server.encoder; @@ -40,16 +39,16 @@ function Client(server, conn){ * @api private */ -Client.prototype.setup = function(){ +Client.prototype.setup = function() { this.onclose = this.onclose.bind(this); this.ondata = this.ondata.bind(this); this.onerror = this.onerror.bind(this); this.ondecoded = this.ondecoded.bind(this); - this.decoder.on('decoded', this.ondecoded); - this.conn.on('data', this.ondata); - this.conn.on('error', this.onerror); - this.conn.on('close', this.onclose); + this.decoder.on("decoded", this.ondecoded); + this.conn.on("data", this.ondata); + this.conn.on("error", this.onerror); + this.conn.on("close", this.onclose); }; /** @@ -60,19 +59,19 @@ Client.prototype.setup = function(){ * @api private */ -Client.prototype.connect = function(name, query){ +Client.prototype.connect = function(name, query) { if (this.server.nsps[name]) { - debug('connecting to namespace %s', name); + debug("connecting to namespace %s", name); return this.doConnect(name, query); } - this.server.checkNamespace(name, query, (dynamicNsp) => { + this.server.checkNamespace(name, query, dynamicNsp => { if (dynamicNsp) { - debug('dynamic namespace %s was created', dynamicNsp.name); + debug("dynamic namespace %s was created", dynamicNsp.name); this.doConnect(name, query); } else { - debug('creation of namespace %s was denied', name); - this.packet({ type: parser.ERROR, nsp: name, data: 'Invalid namespace' }); + debug("creation of namespace %s was denied", name); + this.packet({ type: parser.ERROR, nsp: name, data: "Invalid namespace" }); } }); }; @@ -85,20 +84,20 @@ Client.prototype.connect = function(name, query){ * @api private */ -Client.prototype.doConnect = function(name, query){ +Client.prototype.doConnect = function(name, query) { var nsp = this.server.of(name); - if ('/' != name && !this.nsps['/']) { + if ("/" != name && !this.nsps["/"]) { this.connectBuffer.push(name); return; } var self = this; - var socket = nsp.add(this, query, function(){ + var socket = nsp.add(this, query, function() { self.sockets[socket.id] = socket; self.nsps[nsp.name] = socket; - if ('/' == nsp.name && self.connectBuffer.length > 0) { + if ("/" == nsp.name && self.connectBuffer.length > 0) { self.connectBuffer.forEach(self.connect, self); self.connectBuffer = []; } @@ -111,7 +110,7 @@ Client.prototype.doConnect = function(name, query){ * @api private */ -Client.prototype.disconnect = function(){ +Client.prototype.disconnect = function() { for (var id in this.sockets) { if (this.sockets.hasOwnProperty(id)) { this.sockets[id].disconnect(); @@ -127,13 +126,13 @@ Client.prototype.disconnect = function(){ * @api private */ -Client.prototype.remove = function(socket){ +Client.prototype.remove = function(socket) { if (this.sockets.hasOwnProperty(socket.id)) { var nsp = this.sockets[socket.id].nsp.name; delete this.sockets[socket.id]; delete this.nsps[nsp]; } else { - debug('ignoring remove for %s', socket.id); + debug("ignoring remove for %s", socket.id); } }; @@ -143,11 +142,11 @@ Client.prototype.remove = function(socket){ * @api private */ -Client.prototype.close = function(){ - if ('open' == this.conn.readyState) { - debug('forcing transport close'); +Client.prototype.close = function() { + if ("open" == this.conn.readyState) { + debug("forcing transport close"); this.conn.close(); - this.onclose('forced server close'); + this.onclose("forced server close"); } }; @@ -159,7 +158,7 @@ Client.prototype.close = function(){ * @api private */ -Client.prototype.packet = function(packet, opts){ +Client.prototype.packet = function(packet, opts) { opts = opts || {}; var self = this; @@ -171,15 +170,17 @@ Client.prototype.packet = function(packet, opts){ } } - if ('open' == this.conn.readyState) { - debug('writing packet %j', packet); - if (!opts.preEncoded) { // not broadcasting, need to encode + if ("open" == this.conn.readyState) { + debug("writing packet %j", packet); + if (!opts.preEncoded) { + // not broadcasting, need to encode this.encoder.encode(packet, writeToEngine); // encode, then write results to engine - } else { // a broadcast pre-encodes a packet + } else { + // a broadcast pre-encodes a packet writeToEngine(packet); } } else { - debug('ignoring packet write %j', packet); + debug("ignoring packet write %j", packet); } }; @@ -189,11 +190,11 @@ Client.prototype.packet = function(packet, opts){ * @api private */ -Client.prototype.ondata = function(data){ +Client.prototype.ondata = function(data) { // try/catch is needed for protocol violations (GH-1880) try { this.decoder.add(data); - } catch(e) { + } catch (e) { this.onerror(e); } }; @@ -206,7 +207,10 @@ Client.prototype.ondata = function(data){ Client.prototype.ondecoded = function(packet) { if (parser.CONNECT == packet.type) { - this.connect(url.parse(packet.nsp).pathname, url.parse(packet.nsp, true).query); + this.connect( + url.parse(packet.nsp).pathname, + url.parse(packet.nsp, true).query + ); } else { var socket = this.nsps[packet.nsp]; if (socket) { @@ -214,7 +218,7 @@ Client.prototype.ondecoded = function(packet) { socket.onpacket(packet); }); } else { - debug('no socket for namespace %s', packet.nsp); + debug("no socket for namespace %s", packet.nsp); } } }; @@ -226,7 +230,7 @@ Client.prototype.ondecoded = function(packet) { * @api private */ -Client.prototype.onerror = function(err){ +Client.prototype.onerror = function(err) { for (var id in this.sockets) { if (this.sockets.hasOwnProperty(id)) { this.sockets[id].onerror(err); @@ -242,8 +246,8 @@ Client.prototype.onerror = function(err){ * @api private */ -Client.prototype.onclose = function(reason){ - debug('client close with reason %s', reason); +Client.prototype.onclose = function(reason) { + debug("client close with reason %s", reason); // ignore a potential subsequent `close` event this.destroy(); @@ -265,9 +269,9 @@ Client.prototype.onclose = function(reason){ * @api private */ -Client.prototype.destroy = function(){ - this.conn.removeListener('data', this.ondata); - this.conn.removeListener('error', this.onerror); - this.conn.removeListener('close', this.onclose); - this.decoder.removeListener('decoded', this.ondecoded); +Client.prototype.destroy = function() { + this.conn.removeListener("data", this.ondata); + this.conn.removeListener("error", this.onerror); + this.conn.removeListener("close", this.onclose); + this.decoder.removeListener("decoded", this.ondecoded); }; diff --git a/lib/index.js b/lib/index.js index 5287e4ead0..4ae2677cee 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,23 +1,23 @@ -'use strict'; +"use strict"; /** * Module dependencies. */ -var http = require('http'); -var read = require('fs').readFileSync; -var path = require('path'); -var exists = require('fs').existsSync; -var engine = require('engine.io'); -var clientVersion = require('socket.io-client/package.json').version; -var Client = require('./client'); -var Emitter = require('events').EventEmitter; -var Namespace = require('./namespace'); -var ParentNamespace = require('./parent-namespace'); -var Adapter = require('socket.io-adapter'); -var parser = require('socket.io-parser'); -var debug = require('debug')('socket.io:server'); -var url = require('url'); +var http = require("http"); +var read = require("fs").readFileSync; +var path = require("path"); +var exists = require("fs").existsSync; +var engine = require("engine.io"); +var clientVersion = require("socket.io-client/package.json").version; +var Client = require("./client"); +var Emitter = require("events").EventEmitter; +var Namespace = require("./namespace"); +var ParentNamespace = require("./parent-namespace"); +var Adapter = require("socket.io-adapter"); +var parser = require("socket.io-parser"); +var debug = require("debug")("socket.io:server"); +var url = require("url"); /** * Module exports. @@ -40,22 +40,22 @@ var clientSourceMap = undefined; * @api public */ -function Server(srv, opts){ +function Server(srv, opts) { if (!(this instanceof Server)) return new Server(srv, opts); - if ('object' == typeof srv && srv instanceof Object && !srv.listen) { + if ("object" == typeof srv && srv instanceof Object && !srv.listen) { opts = srv; srv = null; } opts = opts || {}; this.nsps = {}; this.parentNsps = new Map(); - this.path(opts.path || '/socket.io'); + this.path(opts.path || "/socket.io"); this.serveClient(false !== opts.serveClient); this.parser = opts.parser || parser; this.encoder = new this.parser.Encoder(); this.adapter(opts.adapter || Adapter); - this.origins(opts.origins || '*:*'); - this.sockets = this.of('/'); + this.origins(opts.origins || "*:*"); + this.sockets = this.of("/"); if (srv) this.attach(srv, opts); } @@ -70,26 +70,26 @@ Server.prototype.checkRequest = function(req, fn) { var origin = req.headers.origin || req.headers.referer; // file:// URLs produce a null Origin which can't be authorized via echo-back - if ('null' == origin || null == origin) origin = '*'; + if ("null" == origin || null == origin) origin = "*"; - if (!!origin && typeof(this._origins) == 'function') return this._origins(origin, fn); - if (this._origins.indexOf('*:*') !== -1) return fn(null, true); + if (!!origin && typeof this._origins == "function") + return this._origins(origin, fn); + if (this._origins.indexOf("*:*") !== -1) return fn(null, true); if (origin) { try { var parts = url.parse(origin); - var defaultPort = 'https:' == parts.protocol ? 443 : 80; - parts.port = parts.port != null - ? parts.port - : defaultPort; + var defaultPort = "https:" == parts.protocol ? 443 : 80; + parts.port = parts.port != null ? parts.port : defaultPort; var ok = - ~this._origins.indexOf(parts.protocol + '//' + parts.hostname + ':' + parts.port) || - ~this._origins.indexOf(parts.hostname + ':' + parts.port) || - ~this._origins.indexOf(parts.hostname + ':*') || - ~this._origins.indexOf('*:' + parts.port); - debug('origin %s is %svalid', origin, !!ok ? '' : 'not '); + ~this._origins.indexOf( + parts.protocol + "//" + parts.hostname + ":" + parts.port + ) || + ~this._origins.indexOf(parts.hostname + ":" + parts.port) || + ~this._origins.indexOf(parts.hostname + ":*") || + ~this._origins.indexOf("*:" + parts.port); + debug("origin %s is %svalid", origin, !!ok ? "" : "not "); return fn(null, !!ok); - } catch (ex) { - } + } catch (ex) {} } fn(null, false); }; @@ -102,22 +102,28 @@ Server.prototype.checkRequest = function(req, fn) { * @api public */ -Server.prototype.serveClient = function(v){ +Server.prototype.serveClient = function(v) { if (!arguments.length) return this._serveClient; this._serveClient = v; - var resolvePath = function(file){ - var filepath = path.resolve(__dirname, './../../', file); + var resolvePath = function(file) { + var filepath = path.resolve(__dirname, "./../../", file); if (exists(filepath)) { return filepath; } return require.resolve(file); }; if (v && !clientSource) { - clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.js'), 'utf-8'); + clientSource = read( + resolvePath("socket.io-client/dist/socket.io.js"), + "utf-8" + ); try { - clientSourceMap = read(resolvePath( 'socket.io-client/dist/socket.io.js.map'), 'utf-8'); - } catch(err) { - debug('could not load sourcemap file'); + clientSourceMap = read( + resolvePath("socket.io-client/dist/socket.io.js.map"), + "utf-8" + ); + } catch (err) { + debug("could not load sourcemap file"); } } return this; @@ -128,7 +134,7 @@ Server.prototype.serveClient = function(v){ */ var oldSettings = { - "transports": "transports", + transports: "transports", "heartbeat timeout": "pingTimeout", "heartbeat interval": "pingInterval", "destroy buffer size": "maxHttpBufferSize" @@ -140,23 +146,23 @@ var oldSettings = { * @api public */ -Server.prototype.set = function(key, val){ - if ('authorization' == key && val) { +Server.prototype.set = function(key, val) { + if ("authorization" == key && val) { this.use(function(socket, next) { val(socket.request, function(err, authorized) { if (err) return next(new Error(err)); - if (!authorized) return next(new Error('Not authorized')); + if (!authorized) return next(new Error("Not authorized")); next(); }); }); - } else if ('origins' == key && val) { + } else if ("origins" == key && val) { this.origins(val); - } else if ('resource' == key) { + } else if ("resource" == key) { this.path(val); } else if (oldSettings[key] && this.eio[oldSettings[key]]) { this.eio[oldSettings[key]] = val; } else { - console.error('Option %s is not valid. Please refer to the README.', key); + console.error("Option %s is not valid. Please refer to the README.", key); } return this; @@ -171,7 +177,7 @@ Server.prototype.set = function(key, val){ * @api private */ -Server.prototype.checkNamespace = function(name, query, fn){ +Server.prototype.checkNamespace = function(name, query, fn) { if (this.parentNsps.size === 0) return fn(false); const keysIterator = this.parentNsps.keys(); @@ -182,7 +188,7 @@ Server.prototype.checkNamespace = function(name, query, fn){ return fn(false); } nextFn.value(name, query, (err, allow) => { - if (err || !allow) { + if (err || !allow) { run(); } else { fn(this.parentNsps.get(nextFn.value).createChild(name)); @@ -201,9 +207,9 @@ Server.prototype.checkNamespace = function(name, query, fn){ * @api public */ -Server.prototype.path = function(v){ +Server.prototype.path = function(v) { if (!arguments.length) return this._path; - this._path = v.replace(/\/$/, ''); + this._path = v.replace(/\/$/, ""); return this; }; @@ -215,7 +221,7 @@ Server.prototype.path = function(v){ * @api public */ -Server.prototype.adapter = function(v){ +Server.prototype.adapter = function(v) { if (!arguments.length) return this._adapter; this._adapter = v; for (var i in this.nsps) { @@ -234,7 +240,7 @@ Server.prototype.adapter = function(v){ * @api public */ -Server.prototype.origins = function(v){ +Server.prototype.origins = function(v) { if (!arguments.length) return this._origins; this._origins = v; @@ -250,11 +256,11 @@ Server.prototype.origins = function(v){ * @api public */ -Server.prototype.listen = -Server.prototype.attach = function(srv, opts){ - if ('function' == typeof srv) { - var msg = 'You are trying to attach socket.io to an express ' + - 'request handler function. Please pass a http.Server instance.'; +Server.prototype.listen = Server.prototype.attach = function(srv, opts) { + if ("function" == typeof srv) { + var msg = + "You are trying to attach socket.io to an express " + + "request handler function. Please pass a http.Server instance."; throw new Error(msg); } @@ -263,15 +269,14 @@ Server.prototype.attach = function(srv, opts){ srv = Number(srv); } - if ('number' == typeof srv) { - debug('creating http server and binding to %d', srv); + if ("number" == typeof srv) { + debug("creating http server and binding to %d", srv); var port = srv; - srv = http.Server(function(req, res){ + srv = http.Server(function(req, res) { res.writeHead(404); res.end(); }); srv.listen(port); - } // set engine.io path to `/socket.io` @@ -286,8 +291,8 @@ Server.prototype.attach = function(srv, opts){ } var self = this; - var connectPacket = { type: parser.CONNECT, nsp: '/' }; - this.encoder.encode(connectPacket, function (encodedPacket){ + var connectPacket = { type: parser.CONNECT, nsp: "/" }; + this.encoder.encode(connectPacket, function(encodedPacket) { // the CONNECT packet will be merged with Engine.IO handshake, // to reduce the number of round trips opts.initialPacket = encodedPacket; @@ -304,9 +309,9 @@ Server.prototype.attach = function(srv, opts){ * @api private */ -Server.prototype.initEngine = function(srv, opts){ +Server.prototype.initEngine = function(srv, opts) { // initialize engine - debug('creating engine.io instance with opts %j', opts); + debug("creating engine.io instance with opts %j", opts); this.eio = engine.attach(srv, opts); // attach static file serving @@ -326,14 +331,14 @@ Server.prototype.initEngine = function(srv, opts){ * @api private */ -Server.prototype.attachServe = function(srv){ - debug('attaching client serving req handler'); - var url = this._path + '/socket.io.js'; - var urlMap = this._path + '/socket.io.js.map'; - var evs = srv.listeners('request').slice(0); +Server.prototype.attachServe = function(srv) { + debug("attaching client serving req handler"); + var url = this._path + "/socket.io.js"; + var urlMap = this._path + "/socket.io.js.map"; + var evs = srv.listeners("request").slice(0); var self = this; - srv.removeAllListeners('request'); - srv.on('request', function(req, res) { + srv.removeAllListeners("request"); + srv.on("request", function(req, res) { if (0 === req.url.indexOf(urlMap)) { self.serveMap(req, res); } else if (0 === req.url.indexOf(url)) { @@ -354,25 +359,25 @@ Server.prototype.attachServe = function(srv){ * @api private */ -Server.prototype.serve = function(req, res){ +Server.prototype.serve = function(req, res) { // Per the standard, ETags must be quoted: // https://tools.ietf.org/html/rfc7232#section-2.3 var expectedEtag = '"' + clientVersion + '"'; - var etag = req.headers['if-none-match']; + var etag = req.headers["if-none-match"]; if (etag) { if (expectedEtag == etag) { - debug('serve client 304'); + debug("serve client 304"); res.writeHead(304); res.end(); return; } } - debug('serve client source'); + debug("serve client source"); res.setHeader("Cache-Control", "public, max-age=0"); - res.setHeader('Content-Type', 'application/javascript'); - res.setHeader('ETag', expectedEtag); + res.setHeader("Content-Type", "application/javascript"); + res.setHeader("ETag", expectedEtag); res.writeHead(200); res.end(clientSource); }; @@ -385,24 +390,24 @@ Server.prototype.serve = function(req, res){ * @api private */ -Server.prototype.serveMap = function(req, res){ +Server.prototype.serveMap = function(req, res) { // Per the standard, ETags must be quoted: // https://tools.ietf.org/html/rfc7232#section-2.3 var expectedEtag = '"' + clientVersion + '"'; - var etag = req.headers['if-none-match']; + var etag = req.headers["if-none-match"]; if (etag) { if (expectedEtag == etag) { - debug('serve client 304'); + debug("serve client 304"); res.writeHead(304); res.end(); return; } } - debug('serve client sourcemap'); - res.setHeader('Content-Type', 'application/json'); - res.setHeader('ETag', expectedEtag); + debug("serve client sourcemap"); + res.setHeader("Content-Type", "application/json"); + res.setHeader("ETag", expectedEtag); res.writeHead(200); res.end(clientSourceMap); }; @@ -415,9 +420,9 @@ Server.prototype.serveMap = function(req, res){ * @api public */ -Server.prototype.bind = function(engine){ +Server.prototype.bind = function(engine) { this.engine = engine; - this.engine.on('connection', this.onconnection.bind(this)); + this.engine.on("connection", this.onconnection.bind(this)); return this; }; @@ -429,10 +434,10 @@ Server.prototype.bind = function(engine){ * @api public */ -Server.prototype.onconnection = function(conn){ - debug('incoming connection with id %s', conn.id); +Server.prototype.onconnection = function(conn) { + debug("incoming connection with id %s", conn.id); var client = new Client(this, conn); - client.connect('/'); + client.connect("/"); return this; }; @@ -444,28 +449,31 @@ Server.prototype.onconnection = function(conn){ * @api public */ -Server.prototype.of = function(name, fn){ - if (typeof name === 'function' || name instanceof RegExp) { +Server.prototype.of = function(name, fn) { + if (typeof name === "function" || name instanceof RegExp) { const parentNsp = new ParentNamespace(this); - debug('initializing parent namespace %s', parentNsp.name); - if (typeof name === 'function') { + debug("initializing parent namespace %s", parentNsp.name); + if (typeof name === "function") { this.parentNsps.set(name, parentNsp); } else { - this.parentNsps.set((nsp, conn, next) => next(null, name.test(nsp)), parentNsp); + this.parentNsps.set( + (nsp, conn, next) => next(null, name.test(nsp)), + parentNsp + ); } - if (fn) parentNsp.on('connect', fn); + if (fn) parentNsp.on("connect", fn); return parentNsp; } - if (String(name)[0] !== '/') name = '/' + name; + if (String(name)[0] !== "/") name = "/" + name; var nsp = this.nsps[name]; if (!nsp) { - debug('initializing namespace %s', name); + debug("initializing namespace %s", name); nsp = new Namespace(this, name); this.nsps[name] = nsp; } - if (fn) nsp.on('connect', fn); + if (fn) nsp.on("connect", fn); return nsp; }; @@ -476,10 +484,10 @@ Server.prototype.of = function(name, fn){ * @api public */ -Server.prototype.close = function(fn){ - for (var id in this.nsps['/'].sockets) { - if (this.nsps['/'].sockets.hasOwnProperty(id)) { - this.nsps['/'].sockets[id].onclose(); +Server.prototype.close = function(fn) { + for (var id in this.nsps["/"].sockets) { + if (this.nsps["/"].sockets.hasOwnProperty(id)) { + this.nsps["/"].sockets[id].onclose(); } } @@ -496,17 +504,19 @@ Server.prototype.close = function(fn){ * Expose main namespace (/). */ -var emitterMethods = Object.keys(Emitter.prototype).filter(function(key){ - return typeof Emitter.prototype[key] === 'function'; +var emitterMethods = Object.keys(Emitter.prototype).filter(function(key) { + return typeof Emitter.prototype[key] === "function"; }); -emitterMethods.concat(['to', 'in', 'use', 'send', 'write', 'clients', 'compress', 'binary']).forEach(function(fn){ - Server.prototype[fn] = function(){ - return this.sockets[fn].apply(this.sockets, arguments); - }; -}); +emitterMethods + .concat(["to", "in", "use", "send", "write", "clients", "compress", "binary"]) + .forEach(function(fn) { + Server.prototype[fn] = function() { + return this.sockets[fn].apply(this.sockets, arguments); + }; + }); -Namespace.flags.forEach(function(flag){ +Namespace.flags.forEach(function(flag) { Object.defineProperty(Server.prototype, flag, { get: function() { this.sockets.flags = this.sockets.flags || {}; diff --git a/lib/namespace.js b/lib/namespace.js index bca8a3e99f..9dd0fa4bb9 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -1,13 +1,12 @@ - /** * Module dependencies. */ -var Socket = require('./socket'); -var Emitter = require('events').EventEmitter; -var parser = require('socket.io-parser'); -var hasBin = require('has-binary2'); -var debug = require('debug')('socket.io:namespace'); +var Socket = require("./socket"); +var Emitter = require("events").EventEmitter; +var parser = require("socket.io-parser"); +var hasBin = require("has-binary2"); +var debug = require("debug")("socket.io:namespace"); /** * Module exports. @@ -20,20 +19,16 @@ module.exports = exports = Namespace; */ exports.events = [ - 'connect', // for symmetry with client - 'connection', - 'newListener' + "connect", // for symmetry with client + "connection", + "newListener" ]; /** * Flags. */ -exports.flags = [ - 'json', - 'volatile', - 'local' -]; +exports.flags = ["json", "volatile", "local"]; /** * `EventEmitter#emit` reference. @@ -49,7 +44,7 @@ var emit = Emitter.prototype.emit; * @api private */ -function Namespace(server, name){ +function Namespace(server, name) { this.name = name; this.server = server; this.sockets = {}; @@ -71,7 +66,7 @@ Namespace.prototype.__proto__ = Emitter.prototype; * Apply flags from `Socket`. */ -exports.flags.forEach(function(flag){ +exports.flags.forEach(function(flag) { Object.defineProperty(Namespace.prototype, flag, { get: function() { this.flags[flag] = true; @@ -88,7 +83,7 @@ exports.flags.forEach(function(flag){ * @api private */ -Namespace.prototype.initAdapter = function(){ +Namespace.prototype.initAdapter = function() { this.adapter = new (this.server.adapter())(this); }; @@ -99,9 +94,9 @@ Namespace.prototype.initAdapter = function(){ * @api public */ -Namespace.prototype.use = function(fn){ - if (this.server.eio && this.name === '/') { - debug('removing initial packet'); +Namespace.prototype.use = function(fn) { + if (this.server.eio && this.name === "/") { + debug("removing initial packet"); delete this.server.eio.initialPacket; } this.fns.push(fn); @@ -116,12 +111,12 @@ Namespace.prototype.use = function(fn){ * @api private */ -Namespace.prototype.run = function(socket, fn){ +Namespace.prototype.run = function(socket, fn) { var fns = this.fns.slice(0); if (!fns.length) return fn(null); - function run(i){ - fns[i](socket, function(err){ + function run(i) { + fns[i](socket, function(err) { // upon error, short-circuit if (err) return fn(err); @@ -144,8 +139,7 @@ Namespace.prototype.run = function(socket, fn){ * @api public */ -Namespace.prototype.to = -Namespace.prototype.in = function(name){ +Namespace.prototype.to = Namespace.prototype.in = function(name) { if (!~this.rooms.indexOf(name)) this.rooms.push(name); return this; }; @@ -157,13 +151,13 @@ Namespace.prototype.in = function(name){ * @api private */ -Namespace.prototype.add = function(client, query, fn){ - debug('adding socket to nsp %s', this.name); +Namespace.prototype.add = function(client, query, fn) { + debug("adding socket to nsp %s", this.name); var socket = new Socket(this, client, query); var self = this; - this.run(socket, function(err){ - process.nextTick(function(){ - if ('open' == client.conn.readyState) { + this.run(socket, function(err) { + process.nextTick(function() { + if ("open" == client.conn.readyState) { if (err) return socket.error(err.data || err.message); // track socket @@ -177,10 +171,10 @@ Namespace.prototype.add = function(client, query, fn){ if (fn) fn(); // fire user-set events - self.emit('connect', socket); - self.emit('connection', socket); + self.emit("connect", socket); + self.emit("connection", socket); } else { - debug('next called after client was closed - ignoring socket'); + debug("next called after client was closed - ignoring socket"); } }); }); @@ -193,11 +187,11 @@ Namespace.prototype.add = function(client, query, fn){ * @api private */ -Namespace.prototype.remove = function(socket){ +Namespace.prototype.remove = function(socket) { if (this.sockets.hasOwnProperty(socket.id)) { delete this.sockets[socket.id]; } else { - debug('ignoring remove for %s', socket.id); + debug("ignoring remove for %s", socket.id); } }; @@ -208,7 +202,7 @@ Namespace.prototype.remove = function(socket){ * @api public */ -Namespace.prototype.emit = function(ev){ +Namespace.prototype.emit = function(ev) { if (~exports.events.indexOf(ev)) { emit.apply(this, arguments); return this; @@ -216,12 +210,16 @@ Namespace.prototype.emit = function(ev){ // set up packet object var args = Array.prototype.slice.call(arguments); var packet = { - type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT, + type: (this.flags.binary !== undefined + ? this.flags.binary + : hasBin(args)) + ? parser.BINARY_EVENT + : parser.EVENT, data: args }; - if ('function' == typeof args[args.length - 1]) { - throw new Error('Callbacks are not supported when broadcasting'); + if ("function" == typeof args[args.length - 1]) { + throw new Error("Callbacks are not supported when broadcasting"); } var rooms = this.rooms.slice(0); @@ -246,10 +244,9 @@ Namespace.prototype.emit = function(ev){ * @api public */ -Namespace.prototype.send = -Namespace.prototype.write = function(){ +Namespace.prototype.send = Namespace.prototype.write = function() { var args = Array.prototype.slice.call(arguments); - args.unshift('message'); + args.unshift("message"); this.emit.apply(this, args); return this; }; @@ -261,9 +258,11 @@ Namespace.prototype.write = function(){ * @api public */ -Namespace.prototype.clients = function(fn){ - if(!this.adapter){ - throw new Error('No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?') +Namespace.prototype.clients = function(fn) { + if (!this.adapter) { + throw new Error( + "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" + ); } this.adapter.clients(this.rooms, fn); // reset rooms for scenario: @@ -280,7 +279,7 @@ Namespace.prototype.clients = function(fn){ * @api public */ -Namespace.prototype.compress = function(compress){ +Namespace.prototype.compress = function(compress) { this.flags.compress = compress; return this; }; @@ -293,7 +292,7 @@ Namespace.prototype.compress = function(compress){ * @api public */ - Namespace.prototype.binary = function (binary) { - this.flags.binary = binary; - return this; - }; +Namespace.prototype.binary = function(binary) { + this.flags.binary = binary; + return this; +}; diff --git a/lib/parent-namespace.js b/lib/parent-namespace.js index 5a2b4fa8e1..1343ed25a2 100644 --- a/lib/parent-namespace.js +++ b/lib/parent-namespace.js @@ -1,13 +1,12 @@ -'use strict'; +"use strict"; -const Namespace = require('./namespace'); +const Namespace = require("./namespace"); let count = 0; class ParentNamespace extends Namespace { - constructor(server) { - super(server, '/_' + (count++)); + super(server, "/_" + count++); this.children = new Set(); } @@ -28,8 +27,12 @@ class ParentNamespace extends Namespace { createChild(name) { const namespace = new Namespace(this.server, name); namespace.fns = this.fns.slice(0); - this.listeners('connect').forEach(listener => namespace.on('connect', listener)); - this.listeners('connection').forEach(listener => namespace.on('connection', listener)); + this.listeners("connect").forEach(listener => + namespace.on("connect", listener) + ); + this.listeners("connection").forEach(listener => + namespace.on("connection", listener) + ); this.children.add(namespace); this.server.nsps[name] = namespace; return namespace; diff --git a/lib/socket.js b/lib/socket.js index 9a96929728..6afd6ba7f6 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,13 +1,12 @@ - /** * Module dependencies. */ -var Emitter = require('events').EventEmitter; -var parser = require('socket.io-parser'); -var hasBin = require('has-binary2'); -var url = require('url'); -var debug = require('debug')('socket.io:socket'); +var Emitter = require("events").EventEmitter; +var parser = require("socket.io-parser"); +var hasBin = require("has-binary2"); +var url = require("url"); +var debug = require("debug")("socket.io:socket"); /** * Module exports. @@ -22,12 +21,12 @@ module.exports = exports = Socket; */ exports.events = [ - 'error', - 'connect', - 'disconnect', - 'disconnecting', - 'newListener', - 'removeListener' + "error", + "connect", + "disconnect", + "disconnecting", + "newListener", + "removeListener" ]; /** @@ -36,12 +35,7 @@ exports.events = [ * @api private */ -var flags = [ - 'json', - 'volatile', - 'broadcast', - 'local' -]; +var flags = ["json", "volatile", "broadcast", "local"]; /** * `EventEmitter#emit` reference. @@ -57,11 +51,11 @@ var emit = Emitter.prototype.emit; * @api public */ -function Socket(nsp, client, query){ +function Socket(nsp, client, query) { this.nsp = nsp; this.server = nsp.server; this.adapter = this.nsp.adapter; - this.id = nsp.name !== '/' ? nsp.name + '#' + client.id : client.id; + this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; this.client = client; this.conn = client.conn; this.rooms = {}; @@ -84,7 +78,7 @@ Socket.prototype.__proto__ = Emitter.prototype; * Apply flags from `Socket`. */ -flags.forEach(function(flag){ +flags.forEach(function(flag) { Object.defineProperty(Socket.prototype, flag, { get: function() { this.flags[flag] = true; @@ -99,7 +93,7 @@ flags.forEach(function(flag){ * @api public */ -Object.defineProperty(Socket.prototype, 'request', { +Object.defineProperty(Socket.prototype, "request", { get: function() { return this.conn.request; } @@ -111,20 +105,20 @@ Object.defineProperty(Socket.prototype, 'request', { * @api private */ -Socket.prototype.buildHandshake = function(query){ +Socket.prototype.buildHandshake = function(query) { var self = this; - function buildQuery(){ + function buildQuery() { var requestQuery = url.parse(self.request.url, true).query; //if socket-specific query exist, replace query strings in requestQuery return Object.assign({}, query, requestQuery); } return { headers: this.request.headers, - time: (new Date) + '', + time: new Date() + "", address: this.conn.remoteAddress, xdomain: !!this.request.headers.origin, secure: !!this.request.connection.encrypted, - issued: +(new Date), + issued: +new Date(), url: this.request.url, query: buildQuery() }; @@ -137,7 +131,7 @@ Socket.prototype.buildHandshake = function(query){ * @api public */ -Socket.prototype.emit = function(ev){ +Socket.prototype.emit = function(ev) { if (~exports.events.indexOf(ev)) { emit.apply(this, arguments); return this; @@ -145,17 +139,21 @@ Socket.prototype.emit = function(ev){ var args = Array.prototype.slice.call(arguments); var packet = { - type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT, + type: (this.flags.binary !== undefined + ? this.flags.binary + : hasBin(args)) + ? parser.BINARY_EVENT + : parser.EVENT, data: args }; // access last argument to see if it's an ACK callback - if (typeof args[args.length - 1] === 'function') { + if (typeof args[args.length - 1] === "function") { if (this._rooms.length || this.flags.broadcast) { - throw new Error('Callbacks are not supported when broadcasting'); + throw new Error("Callbacks are not supported when broadcasting"); } - debug('emitting packet with ack id %d', this.nsp.ids); + debug("emitting packet with ack id %d", this.nsp.ids); this.acks[this.nsp.ids] = args.pop(); packet.id = this.nsp.ids++; } @@ -188,8 +186,7 @@ Socket.prototype.emit = function(ev){ * @api public */ -Socket.prototype.to = -Socket.prototype.in = function(name){ +Socket.prototype.to = Socket.prototype.in = function(name) { if (!~this._rooms.indexOf(name)) this._rooms.push(name); return this; }; @@ -201,10 +198,9 @@ Socket.prototype.in = function(name){ * @api public */ -Socket.prototype.send = -Socket.prototype.write = function(){ +Socket.prototype.send = Socket.prototype.write = function() { var args = Array.prototype.slice.call(arguments); - args.unshift('message'); + args.unshift("message"); this.emit.apply(this, args); return this; }; @@ -217,7 +213,7 @@ Socket.prototype.write = function(){ * @api private */ -Socket.prototype.packet = function(packet, opts){ +Socket.prototype.packet = function(packet, opts) { packet.nsp = this.nsp.name; opts = opts || {}; opts.compress = false !== opts.compress; @@ -233,23 +229,23 @@ Socket.prototype.packet = function(packet, opts){ * @api private */ -Socket.prototype.join = function(rooms, fn){ - debug('joining room %s', rooms); +Socket.prototype.join = function(rooms, fn) { + debug("joining room %s", rooms); var self = this; if (!Array.isArray(rooms)) { rooms = [rooms]; } - rooms = rooms.filter(function (room) { + rooms = rooms.filter(function(room) { return !self.rooms.hasOwnProperty(room); }); if (!rooms.length) { fn && fn(null); return this; } - this.adapter.addAll(this.id, rooms, function(err){ + this.adapter.addAll(this.id, rooms, function(err) { if (err) return fn && fn(err); - debug('joined room %s', rooms); - rooms.forEach(function (room) { + debug("joined room %s", rooms); + rooms.forEach(function(room) { self.rooms[room] = room; }); fn && fn(null); @@ -266,12 +262,12 @@ Socket.prototype.join = function(rooms, fn){ * @api private */ -Socket.prototype.leave = function(room, fn){ - debug('leave room %s', room); +Socket.prototype.leave = function(room, fn) { + debug("leave room %s", room); var self = this; - this.adapter.del(this.id, room, function(err){ + this.adapter.del(this.id, room, function(err) { if (err) return fn && fn(err); - debug('left room %s', room); + debug("left room %s", room); delete self.rooms[room]; fn && fn(null); }); @@ -284,7 +280,7 @@ Socket.prototype.leave = function(room, fn){ * @api private */ -Socket.prototype.leaveAll = function(){ +Socket.prototype.leaveAll = function() { this.adapter.delAll(this.id); this.rooms = {}; }; @@ -298,13 +294,13 @@ Socket.prototype.leaveAll = function(){ * @api private */ -Socket.prototype.onconnect = function(){ - debug('socket connected - writing packet'); +Socket.prototype.onconnect = function() { + debug("socket connected - writing packet"); this.nsp.connected[this.id] = this; this.join(this.id); - var skip = this.nsp.name === '/' && this.nsp.fns.length === 0; + var skip = this.nsp.name === "/" && this.nsp.fns.length === 0; if (skip) { - debug('packet already sent in initial handshake'); + debug("packet already sent in initial handshake"); } else { this.packet({ type: parser.CONNECT }); } @@ -317,8 +313,8 @@ Socket.prototype.onconnect = function(){ * @api private */ -Socket.prototype.onpacket = function(packet){ - debug('got packet %j', packet); +Socket.prototype.onpacket = function(packet) { + debug("got packet %j", packet); switch (packet.type) { case parser.EVENT: this.onevent(packet); @@ -352,12 +348,12 @@ Socket.prototype.onpacket = function(packet){ * @api private */ -Socket.prototype.onevent = function(packet){ +Socket.prototype.onevent = function(packet) { var args = packet.data || []; - debug('emitting event %j', args); + debug("emitting event %j", args); if (null != packet.id) { - debug('attaching ack callback to event'); + debug("attaching ack callback to event"); args.push(this.ack(packet.id)); } @@ -371,14 +367,14 @@ Socket.prototype.onevent = function(packet){ * @api private */ -Socket.prototype.ack = function(id){ +Socket.prototype.ack = function(id) { var self = this; var sent = false; - return function(){ + return function() { // prevent double callbacks if (sent) return; var args = Array.prototype.slice.call(arguments); - debug('sending ack %j', args); + debug("sending ack %j", args); self.packet({ id: id, @@ -396,14 +392,14 @@ Socket.prototype.ack = function(id){ * @api private */ -Socket.prototype.onack = function(packet){ +Socket.prototype.onack = function(packet) { var ack = this.acks[packet.id]; - if ('function' == typeof ack) { - debug('calling ack %s with %j', packet.id, packet.data); + if ("function" == typeof ack) { + debug("calling ack %s with %j", packet.id, packet.data); ack.apply(this, packet.data); delete this.acks[packet.id]; } else { - debug('bad ack %s', packet.id); + debug("bad ack %s", packet.id); } }; @@ -413,9 +409,9 @@ Socket.prototype.onack = function(packet){ * @api private */ -Socket.prototype.ondisconnect = function(){ - debug('got disconnect packet'); - this.onclose('client namespace disconnect'); +Socket.prototype.ondisconnect = function() { + debug("got disconnect packet"); + this.onclose("client namespace disconnect"); }; /** @@ -424,11 +420,11 @@ Socket.prototype.ondisconnect = function(){ * @api private */ -Socket.prototype.onerror = function(err){ - if (this.listeners('error').length) { - this.emit('error', err); +Socket.prototype.onerror = function(err) { + if (this.listeners("error").length) { + this.emit("error", err); } else { - console.error('Missing error handler on `socket`.'); + console.error("Missing error handler on `socket`."); console.error(err.stack); } }; @@ -441,17 +437,17 @@ Socket.prototype.onerror = function(err){ * @api private */ -Socket.prototype.onclose = function(reason){ +Socket.prototype.onclose = function(reason) { if (!this.connected) return this; - debug('closing socket - reason %s', reason); - this.emit('disconnecting', reason); + debug("closing socket - reason %s", reason); + this.emit("disconnecting", reason); this.leaveAll(); this.nsp.remove(this); this.client.remove(this); this.connected = false; this.disconnected = true; delete this.nsp.connected[this.id]; - this.emit('disconnect', reason); + this.emit("disconnect", reason); }; /** @@ -461,7 +457,7 @@ Socket.prototype.onclose = function(reason){ * @api private */ -Socket.prototype.error = function(err){ +Socket.prototype.error = function(err) { this.packet({ type: parser.ERROR, data: err }); }; @@ -473,13 +469,13 @@ Socket.prototype.error = function(err){ * @api public */ -Socket.prototype.disconnect = function(close){ +Socket.prototype.disconnect = function(close) { if (!this.connected) return this; if (close) { this.client.disconnect(); } else { this.packet({ type: parser.DISCONNECT }); - this.onclose('server namespace disconnect'); + this.onclose("server namespace disconnect"); } return this; }; @@ -492,7 +488,7 @@ Socket.prototype.disconnect = function(close){ * @api public */ -Socket.prototype.compress = function(compress){ +Socket.prototype.compress = function(compress) { this.flags.compress = compress; return this; }; @@ -505,10 +501,10 @@ Socket.prototype.compress = function(compress){ * @api public */ - Socket.prototype.binary = function (binary) { - this.flags.binary = binary; - return this; - }; +Socket.prototype.binary = function(binary) { + this.flags.binary = binary; + return this; +}; /** * Dispatch incoming event to socket listeners. @@ -517,11 +513,11 @@ Socket.prototype.compress = function(compress){ * @api private */ -Socket.prototype.dispatch = function(event){ - debug('dispatching an event %j', event); +Socket.prototype.dispatch = function(event) { + debug("dispatching an event %j", event); var self = this; function dispatchSocket(err) { - process.nextTick(function(){ + process.nextTick(function() { if (err) { return self.error(err.data || err.message); } @@ -539,7 +535,7 @@ Socket.prototype.dispatch = function(event){ * @api public */ -Socket.prototype.use = function(fn){ +Socket.prototype.use = function(fn) { this.fns.push(fn); return this; }; @@ -551,12 +547,12 @@ Socket.prototype.use = function(fn){ * @param {Function} last fn call in the middleware * @api private */ -Socket.prototype.run = function(event, fn){ +Socket.prototype.run = function(event, fn) { var fns = this.fns.slice(0); if (!fns.length) return fn(null); - function run(i){ - fns[i](event, function(err){ + function run(i) { + fns[i](event, function(err) { // upon error, short-circuit if (err) return fn(err); diff --git a/package-lock.json b/package-lock.json index 534f4778c6..7747e8a647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,152 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + } + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -13,16 +159,76 @@ "negotiator": "0.6.2" } }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -34,6 +240,20 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -89,6 +309,55 @@ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "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" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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" + } + } + } + }, + "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 + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -145,6 +414,17 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -153,6 +433,12 @@ "ms": "^2.1.1" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -165,6 +451,21 @@ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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 + }, "engine.io": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", @@ -223,12 +524,224 @@ "has-binary2": "~1.0.2" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "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 }, + "eslint": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", + "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "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 + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "expect.js": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", @@ -241,6 +754,50 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -264,6 +821,18 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", @@ -278,6 +847,21 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -315,6 +899,28 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -336,17 +942,94 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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-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": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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 + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", @@ -506,6 +1189,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -3483,6 +4172,29 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -3505,12 +4217,48 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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 + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "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 }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "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 + }, "qs": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", @@ -3540,14 +4288,94 @@ } } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "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.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, "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": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "socket.io-adapter": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dependencies": { "@babel/code-frame": { "version": "7.10.4", @@ -6020,6 +6848,46 @@ "isarray": "2.0.1" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "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" + }, + "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 + }, + "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" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -6029,6 +6897,21 @@ "safe-buffer": "~5.1.0" } }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", @@ -6077,23 +6960,101 @@ "has-flag": "^1.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "ws": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", diff --git a/package.json b/package.json index 8d9e704165..2230afef7b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,10 @@ "url": "git://github.com/socketio/socket.io" }, "scripts": { - "test": "nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js" + "lint": "eslint lib/ test/", + "test": "npm run lint && npm run format:check && nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js", + "format:check": "prettier --check 'lib/**/*.js' 'test/**/*.js'", + "format:fix": "prettier --write 'lib/**/*.js' 'test/**/*.js'" }, "dependencies": { "debug": "~4.1.0", @@ -32,9 +35,13 @@ "socket.io-parser": "~3.4.0" }, "devDependencies": { + "babel-eslint": "^10.1.0", + "eslint": "^7.9.0", + "eslint-config-prettier": "^6.11.0", "expect.js": "0.3.1", "mocha": "^3.5.3", "nyc": "^11.2.1", + "prettier": "^1.19.1", "superagent": "^3.8.2", "supertest": "^3.0.0" }, diff --git a/test/fixtures/server-close.js b/test/fixtures/server-close.js index 68917462b2..e1963a885a 100644 --- a/test/fixtures/server-close.js +++ b/test/fixtures/server-close.js @@ -1,10 +1,10 @@ -var server = require('http').createServer(); -var ioc = require('socket.io-client'); -var io = require('../..')(server); +var server = require("http").createServer(); +var ioc = require("socket.io-client"); +var io = require("../..")(server); var srv = server.listen(function() { - var socket = ioc('ws://localhost:' + server.address().port); - socket.on('connect', function() { + var socket = ioc("ws://localhost:" + server.address().port); + socket.on("connect", function() { io.close(); socket.close(); }); diff --git a/test/socket.io.js b/test/socket.io.js index 337f2ebd4a..35378b3b02 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,142 +1,145 @@ -'use strict'; +"use strict"; -var http = require('http').Server; -var io = require('../lib'); -var fs = require('fs'); -var join = require('path').join; -var exec = require('child_process').exec; -var ioc = require('socket.io-client'); -var request = require('supertest'); -var expect = require('expect.js'); +var http = require("http").Server; +var io = require("../lib"); +var fs = require("fs"); +var join = require("path").join; +var exec = require("child_process").exec; +var ioc = require("socket.io-client"); +var request = require("supertest"); +var expect = require("expect.js"); // Creates a socket.io client for the given server -function client(srv, nsp, opts){ - if ('object' == typeof nsp) { +function client(srv, nsp, opts) { + if ("object" == typeof nsp) { opts = nsp; nsp = null; } var addr = srv.address(); if (!addr) addr = srv.listen().address(); - var url = 'ws://localhost:' + addr.port + (nsp || ''); + var url = "ws://localhost:" + addr.port + (nsp || ""); return ioc(url, opts); } -describe('socket.io', function(){ - - it.skip('should be the same version as client', function(){ - var version = require('../package').version; - expect(version).to.be(require('socket.io-client/package').version); +describe("socket.io", function() { + it.skip("should be the same version as client", function() { + var version = require("../package").version; + expect(version).to.be(require("socket.io-client/package").version); }); - describe('set', function() { - it('should be able to set ping timeout to engine.io', function() { + describe("set", function() { + it("should be able to set ping timeout to engine.io", function() { var srv = io(http()); - srv.set('heartbeat timeout', 10); + srv.set("heartbeat timeout", 10); expect(srv.eio.pingTimeout).to.be(10); }); - it('should be able to set ping interval to engine.io', function() { + it("should be able to set ping interval to engine.io", function() { var srv = io(http()); - srv.set('heartbeat interval', 10); + srv.set("heartbeat interval", 10); expect(srv.eio.pingInterval).to.be(10); }); - it('should be able to set transports to engine.io', function() { + it("should be able to set transports to engine.io", function() { var srv = io(http()); - srv.set('transports', ['polling']); - expect(srv.eio.transports).to.eql(['polling']); + srv.set("transports", ["polling"]); + expect(srv.eio.transports).to.eql(["polling"]); }); - it('should be able to set maxHttpBufferSize to engine.io', function() { + it("should be able to set maxHttpBufferSize to engine.io", function() { var srv = io(http()); - srv.set('destroy buffer size', 10); + srv.set("destroy buffer size", 10); expect(srv.eio.maxHttpBufferSize).to.eql(10); }); - it('should be able to set path with setting resource', function(done) { + it("should be able to set path with setting resource", function(done) { var eio = io(); var srv = http(); - eio.set('resource', '/random'); + eio.set("resource", "/random"); eio.attach(srv); // Check that the server is accessible through the specified path request(srv) - .get('/random/socket.io.js') - .buffer(true) - .end(function(err, res){ - if (err) return done(err); - done(); - }); + .get("/random/socket.io.js") + .buffer(true) + .end(function(err, res) { + if (err) return done(err); + done(); + }); }); - it('should be able to set origins to engine.io', function() { + it("should be able to set origins to engine.io", function() { var srv = io(http()); - srv.set('origins', 'http://hostname.com:*'); - expect(srv.origins()).to.be('http://hostname.com:*'); + srv.set("origins", "http://hostname.com:*"); + expect(srv.origins()).to.be("http://hostname.com:*"); }); - it('should be able to set authorization and send error packet', function(done) { + it("should be able to set authorization and send error packet", function(done) { var httpSrv = http(); var srv = io(httpSrv); - srv.set('authorization', function(o, f) { f(null, false); }); + srv.set("authorization", function(o, f) { + f(null, false); + }); var socket = client(httpSrv); - socket.on('connect', function(){ + socket.on("connect", function() { expect().fail(); }); - socket.on('error', function(err) { - expect(err).to.be('Not authorized'); + socket.on("error", function(err) { + expect(err).to.be("Not authorized"); done(); }); }); - it('should be able to set authorization and succeed', function(done) { + it("should be able to set authorization and succeed", function(done) { var httpSrv = http(); var srv = io(httpSrv); - srv.set('authorization', function(o, f) { f(null, true); }); + srv.set("authorization", function(o, f) { + f(null, true); + }); - srv.on('connection', function(s) { - s.on('yoyo', function(data) { - expect(data).to.be('data'); + srv.on("connection", function(s) { + s.on("yoyo", function(data) { + expect(data).to.be("data"); done(); }); }); var socket = client(httpSrv); - socket.on('connect', function(){ - socket.emit('yoyo', 'data'); + socket.on("connect", function() { + socket.emit("yoyo", "data"); }); - socket.on('error', function(err) { + socket.on("error", function(err) { expect().fail(); }); }); - it('should set the handshake BC object', function(done){ + it("should set the handshake BC object", function(done) { var httpSrv = http(); var srv = io(httpSrv); - srv.on('connection', function(s) { + srv.on("connection", function(s) { expect(s.handshake).to.not.be(undefined); // Headers set and has some valid properties - expect(s.handshake.headers).to.be.an('object'); - expect(s.handshake.headers['user-agent']).to.be('node-XMLHttpRequest'); + expect(s.handshake.headers).to.be.an("object"); + expect(s.handshake.headers["user-agent"]).to.be("node-XMLHttpRequest"); // Time set and is valid looking string - expect(s.handshake.time).to.be.a('string'); - expect(s.handshake.time.split(' ').length > 0); // Is "multipart" string representation + expect(s.handshake.time).to.be.a("string"); + expect(s.handshake.time.split(" ").length > 0); // Is "multipart" string representation // Address, xdomain, secure, issued and url set - expect(s.handshake.address).to.contain('127.0.0.1'); - expect(s.handshake.xdomain).to.be.a('boolean'); - expect(s.handshake.secure).to.be.a('boolean'); - expect(s.handshake.issued).to.be.a('number'); - expect(s.handshake.url).to.be.a('string'); + expect(s.handshake.address).to.contain("127.0.0.1"); + expect(s.handshake.xdomain).to.be.a("boolean"); + expect(s.handshake.secure).to.be.a("boolean"); + expect(s.handshake.issued).to.be.a("number"); + expect(s.handshake.url).to.be.a("string"); // Query set and has some right properties - expect(s.handshake.query).to.be.an('object'); + expect(s.handshake.query).to.be.an("object"); expect(s.handshake.query.EIO).to.not.be(undefined); expect(s.handshake.query.transport).to.not.be(undefined); expect(s.handshake.query.t).to.not.be(undefined); @@ -148,517 +151,541 @@ describe('socket.io', function(){ }); }); - describe('server attachment', function(){ - describe('http.Server', function(){ - var clientVersion = require('socket.io-client/package').version; + describe("server attachment", function() { + describe("http.Server", function() { + var clientVersion = require("socket.io-client/package").version; - it('should serve static files', function(done){ + it("should serve static files", function(done) { var srv = http(); io(srv); request(srv) - .get('/socket.io/socket.io.js') - .buffer(true) - .end(function(err, res){ - if (err) return done(err); - var ctype = res.headers['content-type']; - expect(ctype).to.be('application/javascript'); - expect(res.headers.etag).to.be('"' + clientVersion + '"'); - expect(res.text).to.match(/engine\.io/); - expect(res.status).to.be(200); - done(); - }); + .get("/socket.io/socket.io.js") + .buffer(true) + .end(function(err, res) { + if (err) return done(err); + var ctype = res.headers["content-type"]; + expect(ctype).to.be("application/javascript"); + expect(res.headers.etag).to.be('"' + clientVersion + '"'); + expect(res.text).to.match(/engine\.io/); + expect(res.status).to.be(200); + done(); + }); }); - it('should handle 304', function(done){ + it("should handle 304", function(done) { var srv = http(); io(srv); request(srv) - .get('/socket.io/socket.io.js') - .set('If-None-Match', '"' + clientVersion + '"') - .end(function(err, res){ - if (err) return done(err); - expect(res.statusCode).to.be(304); - done(); - }); + .get("/socket.io/socket.io.js") + .set("If-None-Match", '"' + clientVersion + '"') + .end(function(err, res) { + if (err) return done(err); + expect(res.statusCode).to.be(304); + done(); + }); }); - it('should not serve static files', function(done){ + it("should not serve static files", function(done) { var srv = http(); io(srv, { serveClient: false }); request(srv) - .get('/socket.io/socket.io.js') - .expect(400, done); + .get("/socket.io/socket.io.js") + .expect(400, done); }); - it('should work with #attach', function(done){ - var srv = http(function(req, res){ + it("should work with #attach", function(done) { + var srv = http(function(req, res) { res.writeHead(404); res.end(); }); var sockets = io(); sockets.attach(srv); request(srv) - .get('/socket.io/socket.io.js') - .end(function(err, res){ - if (err) return done(err); - expect(res.status).to.be(200); - done(); - }); + .get("/socket.io/socket.io.js") + .end(function(err, res) { + if (err) return done(err); + expect(res.status).to.be(200); + done(); + }); }); }); - describe('port', function(done){ - it('should be bound', function(done){ + describe("port", function(done) { + it("should be bound", function(done) { var sockets = io(54010); - request('http://localhost:54010/') - .get('/socket.io/socket.io.js') - .expect(200, done); + request("http://localhost:54010/") + .get("/socket.io/socket.io.js") + .expect(200, done); }); - it('should be bound as a string', function(done) { - var sockets = io('54020'); - request('http://localhost:54020/') - .get('/socket.io/socket.io.js') - .expect(200, done); + it("should be bound as a string", function(done) { + var sockets = io("54020"); + request("http://localhost:54020/") + .get("/socket.io/socket.io.js") + .expect(200, done); }); - it('with listen', function(done){ + it("with listen", function(done) { var sockets = io().listen(54011); - request('http://localhost:54011/') - .get('/socket.io/socket.io.js') - .expect(200, done); + request("http://localhost:54011/") + .get("/socket.io/socket.io.js") + .expect(200, done); }); - it('as a string', function(done){ - var sockets = io().listen('54012'); - request('http://localhost:54012/') - .get('/socket.io/socket.io.js') - .expect(200, done); + it("as a string", function(done) { + var sockets = io().listen("54012"); + request("http://localhost:54012/") + .get("/socket.io/socket.io.js") + .expect(200, done); }); }); }); - describe('handshake', function(){ - var request = require('superagent'); + describe("handshake", function() { + var request = require("superagent"); - it('should disallow request when origin defined and none specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54013'); - request.get('http://localhost:54013/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { + it("should disallow request when origin defined and none specified", function(done) { + var sockets = io({ origins: "http://foo.example:*" }).listen("54013"); + request + .get("http://localhost:54013/socket.io/default/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(403); done(); }); }); - it('should disallow request when origin defined and a different one specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54014'); - request.get('http://localhost:54014/socket.io/default/') - .query({ transport: 'polling' }) - .set('origin', 'http://herp.derp/') - .end(function (err, res) { + it("should disallow request when origin defined and a different one specified", function(done) { + var sockets = io({ origins: "http://foo.example:*" }).listen("54014"); + request + .get("http://localhost:54014/socket.io/default/") + .query({ transport: "polling" }) + .set("origin", "http://herp.derp/") + .end(function(err, res) { expect(res.status).to.be(403); done(); - }); + }); }); - it('should allow request when origin defined an the same is specified', function(done) { - var sockets = io({ origins: 'http://foo.example:*' }).listen('54015'); - request.get('http://localhost:54015/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { + it("should allow request when origin defined an the same is specified", function(done) { + var sockets = io({ origins: "http://foo.example:*" }).listen("54015"); + request + .get("http://localhost:54015/socket.io/default/") + .set("origin", "http://foo.example/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); - it('should allow request when origin defined as function and same is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == 'http://foo.example/') { - return callback(null, true); + it("should allow request when origin defined as function and same is supplied", function(done) { + var sockets = io({ + origins: function(origin, callback) { + if (origin == "http://foo.example/") { + return callback(null, true); + } + return callback(null, false); } - return callback(null, false); - } }).listen('54016'); - request.get('http://localhost:54016/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { + }).listen("54016"); + request + .get("http://localhost:54016/socket.io/default/") + .set("origin", "http://foo.example/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); - it('should allow request when origin defined as function and different is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == 'http://foo.example/') { - return callback(null, true); + it("should allow request when origin defined as function and different is supplied", function(done) { + var sockets = io({ + origins: function(origin, callback) { + if (origin == "http://foo.example/") { + return callback(null, true); + } + return callback(null, false); } - return callback(null, false); - } }).listen('54017'); - request.get('http://localhost:54017/socket.io/default/') - .set('origin', 'http://herp.derp/') - .query({ transport: 'polling' }) - .end(function (err, res) { + }).listen("54017"); + request + .get("http://localhost:54017/socket.io/default/") + .set("origin", "http://herp.derp/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(403); done(); }); }); - it('should allow request when origin defined as function and no origin is supplied', function(done) { - var sockets = io({ origins: function(origin,callback){ - if (origin == '*') { - return callback(null, true); + it("should allow request when origin defined as function and no origin is supplied", function(done) { + var sockets = io({ + origins: function(origin, callback) { + if (origin == "*") { + return callback(null, true); + } + return callback(null, false); } - return callback(null, false); - } }).listen('54021'); - request.get('http://localhost:54021/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { + }).listen("54021"); + request + .get("http://localhost:54021/socket.io/default/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); - it('should default to port 443 when protocol is https', function(done) { - var sockets = io({ origins: 'https://foo.example/' }).listen('54036'); - request.get('http://localhost:54036/socket.io/default/') - .set('origin', 'https://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { + it("should default to port 443 when protocol is https", function(done) { + var sockets = io({ origins: "https://foo.example/" }).listen("54036"); + request + .get("http://localhost:54036/socket.io/default/") + .set("origin", "https://foo.example/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); - it('should allow request if custom function in opts.allowRequest returns true', function(done){ - var sockets = io(http().listen(54022), { allowRequest: function (req, callback) { - return callback(null, true); - }, origins: 'http://foo.example:*' }); + it("should allow request if custom function in opts.allowRequest returns true", function(done) { + var sockets = io(http().listen(54022), { + allowRequest: function(req, callback) { + return callback(null, true); + }, + origins: "http://foo.example:*" + }); - request.get('http://localhost:54022/socket.io/default/') - .query({ transport: 'polling' }) - .end(function (err, res) { + request + .get("http://localhost:54022/socket.io/default/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); - it('should disallow request if custom function in opts.allowRequest returns false', function(done){ - var sockets = io(http().listen(54023), { allowRequest: function (req, callback) { - return callback(null, false); - } }); - request.get('http://localhost:54023/socket.io/default/') - .set('origin', 'http://foo.example/') - .query({ transport: 'polling' }) - .end(function (err, res) { + it("should disallow request if custom function in opts.allowRequest returns false", function(done) { + var sockets = io(http().listen(54023), { + allowRequest: function(req, callback) { + return callback(null, false); + } + }); + request + .get("http://localhost:54023/socket.io/default/") + .set("origin", "http://foo.example/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(403); done(); }); }); - it('should allow request when using an array of origins', function(done) { - io({ origins: [ 'http://foo.example:54024/' ] }).listen('54024'); - request.get('http://localhost:54024/socket.io/default/') - .set('origin', 'http://foo.example:54024/') - .query({ transport: 'polling' }) - .end(function (err, res) { + it("should allow request when using an array of origins", function(done) { + io({ origins: ["http://foo.example:54024/"] }).listen("54024"); + request + .get("http://localhost:54024/socket.io/default/") + .set("origin", "http://foo.example:54024/") + .query({ transport: "polling" }) + .end(function(err, res) { expect(res.status).to.be(200); done(); }); }); }); - describe('close', function(){ - - it('should be able to close sio sending a srv', function(){ - var PORT = 54018; - var srv = http().listen(PORT); - var sio = io(srv); - var net = require('net'); + describe("close", function() { + it("should be able to close sio sending a srv", function() { + var PORT = 54018; + var srv = http().listen(PORT); + var sio = io(srv); + var net = require("net"); var server = net.createServer(); var clientSocket = client(srv, { reconnection: false }); - clientSocket.on('disconnect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); + clientSocket.on("disconnect", function init() { + expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); - clientSocket.on('connect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); + clientSocket.on("connect", function init() { + expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); sio.close(); }); - server.once('listening', function() { + server.once("listening", function() { // PORT should be free - server.close(function(error){ + server.close(function(error) { expect(error).to.be(undefined); }); }); - }); - it('should be able to close sio sending a port', function(){ - var PORT = 54019; - var sio = io(PORT); - var net = require('net'); + it("should be able to close sio sending a port", function() { + var PORT = 54019; + var sio = io(PORT); + var net = require("net"); var server = net.createServer(); - var clientSocket = ioc('ws://0.0.0.0:' + PORT, { reconnection: false }); + var clientSocket = ioc("ws://0.0.0.0:" + PORT, { reconnection: false }); - clientSocket.on('disconnect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(0); + clientSocket.on("disconnect", function init() { + expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); - clientSocket.on('connect', function init() { - expect(Object.keys(sio.nsps['/'].sockets).length).to.equal(1); + clientSocket.on("connect", function init() { + expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); sio.close(); }); - server.once('listening', function() { + server.once("listening", function() { // PORT should be free - server.close(function(error){ + server.close(function(error) { expect(error).to.be(undefined); }); }); }); - describe('graceful close', function(){ + describe("graceful close", function() { function fixture(filename) { - return '"' + process.execPath + '" "' + - join(__dirname, 'fixtures', filename) + '"'; + return ( + '"' + + process.execPath + + '" "' + + join(__dirname, "fixtures", filename) + + '"' + ); } - it('should stop socket and timers', function(done){ - exec(fixture('server-close.js'), done); + it("should stop socket and timers", function(done) { + exec(fixture("server-close.js"), done); }); }); }); - describe('namespaces', function(){ - var Socket = require('../lib/socket'); - var Namespace = require('../lib/namespace'); + describe("namespaces", function() { + var Socket = require("../lib/socket"); + var Namespace = require("../lib/namespace"); - it('should be accessible through .sockets', function(){ + it("should be accessible through .sockets", function() { var sio = io(); expect(sio.sockets).to.be.a(Namespace); }); - it('should be aliased', function(){ + it("should be aliased", function() { var sio = io(); - expect(sio.use).to.be.a('function'); - expect(sio.to).to.be.a('function'); - expect(sio['in']).to.be.a('function'); - expect(sio.emit).to.be.a('function'); - expect(sio.send).to.be.a('function'); - expect(sio.write).to.be.a('function'); - expect(sio.clients).to.be.a('function'); - expect(sio.compress).to.be.a('function'); + expect(sio.use).to.be.a("function"); + expect(sio.to).to.be.a("function"); + expect(sio["in"]).to.be.a("function"); + expect(sio.emit).to.be.a("function"); + expect(sio.send).to.be.a("function"); + expect(sio.write).to.be.a("function"); + expect(sio.clients).to.be.a("function"); + expect(sio.compress).to.be.a("function"); expect(sio.json).to.be(sio); expect(sio.volatile).to.be(sio); expect(sio.sockets.flags).to.eql({ json: true, volatile: true }); delete sio.sockets.flags; }); - it('should automatically connect', function(done){ + it("should automatically connect", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('connect', function(){ + socket.on("connect", function() { done(); }); }); }); - it('should fire a `connection` event', function(done){ + it("should fire a `connection` event", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(socket){ + sio.on("connection", function(socket) { expect(socket).to.be.a(Socket); done(); }); }); }); - it('should fire a `connect` event', function(done){ + it("should fire a `connect` event", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connect', function(socket){ + sio.on("connect", function(socket) { expect(socket).to.be.a(Socket); done(); }); }); }); - it('should work with many sockets', function(done){ + it("should work with many sockets", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - sio.of('/chat'); - sio.of('/news'); - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); + srv.listen(function() { + sio.of("/chat"); + sio.of("/news"); + var chat = client(srv, "/chat"); + var news = client(srv, "/news"); var total = 2; - chat.on('connect', function(){ + chat.on("connect", function() { --total || done(); }); - news.on('connect', function(){ + news.on("connect", function() { --total || done(); }); }); }); - it('should be able to equivalently start with "" or "/" on server', function(done){ + it('should be able to equivalently start with "" or "/" on server', function(done) { var srv = http(); var sio = io(srv); var total = 2; - sio.of('').on('connection', function(){ + sio.of("").on("connection", function() { --total || done(); }); - sio.of('abc').on('connection', function(){ + sio.of("abc").on("connection", function() { --total || done(); }); - var c1 = client(srv, '/'); - var c2 = client(srv, '/abc'); + var c1 = client(srv, "/"); + var c2 = client(srv, "/abc"); }); - it('should be equivalent for "" and "/" on client', function(done){ + it('should be equivalent for "" and "/" on client', function(done) { var srv = http(); var sio = io(srv); - sio.of('/').on('connection', function(){ - done(); + sio.of("/").on("connection", function() { + done(); }); - var c1 = client(srv, ''); + var c1 = client(srv, ""); }); - it('should work with `of` and many sockets', function(done){ + it("should work with `of` and many sockets", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); + srv.listen(function() { + var chat = client(srv, "/chat"); + var news = client(srv, "/news"); var total = 2; - sio.of('/news').on('connection', function(socket){ + sio.of("/news").on("connection", function(socket) { expect(socket).to.be.a(Socket); --total || done(); }); - sio.of('/news').on('connection', function(socket){ + sio.of("/news").on("connection", function(socket) { expect(socket).to.be.a(Socket); --total || done(); }); }); }); - it('should work with `of` second param', function(done){ + it("should work with `of` second param", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); + srv.listen(function() { + var chat = client(srv, "/chat"); + var news = client(srv, "/news"); var total = 2; - sio.of('/news', function(socket){ + sio.of("/news", function(socket) { expect(socket).to.be.a(Socket); --total || done(); }); - sio.of('/news', function(socket){ + sio.of("/news", function(socket) { expect(socket).to.be.a(Socket); --total || done(); }); }); }); - it('should disconnect upon transport disconnection', function(done){ + it("should disconnect upon transport disconnection", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var chat = client(srv, '/chat'); - var news = client(srv, '/news'); + srv.listen(function() { + var chat = client(srv, "/chat"); + var news = client(srv, "/news"); var total = 2; var totald = 2; var s; - sio.of('/news', function(socket){ - socket.on('disconnect', function(reason){ + sio.of("/news", function(socket) { + socket.on("disconnect", function(reason) { --totald || done(); }); --total || close(); }); - sio.of('/chat', function(socket){ + sio.of("/chat", function(socket) { s = socket; - socket.on('disconnect', function(reason){ + socket.on("disconnect", function(reason) { --totald || done(); }); --total || close(); }); - function close(){ + function close() { s.disconnect(true); } }); }); - it('should disconnect both default and custom namespace upon disconnect', function(done){ + it("should disconnect both default and custom namespace upon disconnect", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var lolcats = client(srv, '/lolcats'); + srv.listen(function() { + var lolcats = client(srv, "/lolcats"); var total = 2; var totald = 2; var s; - sio.of('/', function(socket){ - socket.on('disconnect', function(reason){ + sio.of("/", function(socket) { + socket.on("disconnect", function(reason) { --totald || done(); }); --total || close(); }); - sio.of('/lolcats', function(socket){ + sio.of("/lolcats", function(socket) { s = socket; - socket.on('disconnect', function(reason){ + socket.on("disconnect", function(reason) { --totald || done(); }); --total || close(); }); - function close(){ + function close() { s.disconnect(true); } }); }); - it('should not crash while disconnecting socket', function(done){ + it("should not crash while disconnecting socket", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv,'/ns'); - sio.on('connection', function(socket){ + srv.listen(function() { + var socket = client(srv, "/ns"); + sio.on("connection", function(socket) { socket.disconnect(); done(); }); }); }); - it('should fire a `disconnecting` event just before leaving all rooms', function(done){ + it("should fire a `disconnecting` event just before leaving all rooms", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ + sio.on("connection", function(s) { + s.join("a", function() { s.disconnect(); }); var total = 2; - s.on('disconnecting', function(reason){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); + s.on("disconnecting", function(reason) { + expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); total--; }); - s.on('disconnect', function(reason){ + s.on("disconnect", function(reason) { expect(Object.keys(s.rooms)).to.eql([]); --total || done(); }); @@ -666,19 +693,19 @@ describe('socket.io', function(){ }); }); - it('should return error connecting to non-existent namespace', function(done){ + it("should return error connecting to non-existent namespace", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv,'/doesnotexist'); - socket.on('error', function(err) { - expect(err).to.be('Invalid namespace'); + srv.listen(function() { + var socket = client(srv, "/doesnotexist"); + socket.on("error", function(err) { + expect(err).to.be("Invalid namespace"); done(); }); }); }); - - it('should not reuse same-namespace connections', function(done){ + + it("should not reuse same-namespace connections", function(done) { var srv = http(); var sio = io(srv); var connections = 0; @@ -686,7 +713,7 @@ describe('socket.io', function(){ srv.listen(function() { var clientSocket1 = client(srv); var clientSocket2 = client(srv); - sio.on('connection', function() { + sio.on("connection", function() { connections++; if (connections === 2) { done(); @@ -695,27 +722,27 @@ describe('socket.io', function(){ }); }); - it('should find all clients in a namespace', function(done){ + it("should find all clients in a namespace", function(done) { var srv = http(); var sio = io(srv); var chatSids = []; var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); + srv.listen(function() { + var c1 = client(srv, "/chat"); + var c2 = client(srv, "/chat", { forceNew: true }); + var c3 = client(srv, "/other", { forceNew: true }); var total = 3; - sio.of('/chat').on('connection', function(socket){ + sio.of("/chat").on("connection", function(socket) { chatSids.push(socket.id); --total || getClients(); }); - sio.of('/other').on('connection', function(socket){ + sio.of("/other").on("connection", function(socket) { otherSid = socket.id; --total || getClients(); }); }); function getClients() { - sio.of('/chat').clients(function(error, sids) { + sio.of("/chat").clients(function(error, sids) { expect(error).to.not.be.ok(); expect(sids).to.contain(chatSids[0]); expect(sids).to.contain(chatSids[1]); @@ -725,83 +752,86 @@ describe('socket.io', function(){ } }); - it('should find all clients in a namespace room', function(done){ + it("should find all clients in a namespace room", function(done) { var srv = http(); var sio = io(srv); var chatFooSid = null; var chatBarSid = null; var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); + srv.listen(function() { + var c1 = client(srv, "/chat"); + var c2 = client(srv, "/chat", { forceNew: true }); + var c3 = client(srv, "/other", { forceNew: true }); var chatIndex = 0; var total = 3; - sio.of('/chat').on('connection', function(socket){ + sio.of("/chat").on("connection", function(socket) { if (chatIndex++) { - socket.join('foo', function() { + socket.join("foo", function() { chatFooSid = socket.id; --total || getClients(); }); } else { - socket.join('bar', function() { + socket.join("bar", function() { chatBarSid = socket.id; --total || getClients(); }); } }); - sio.of('/other').on('connection', function(socket){ - socket.join('foo', function() { + sio.of("/other").on("connection", function(socket) { + socket.join("foo", function() { otherSid = socket.id; --total || getClients(); }); }); }); function getClients() { - sio.of('/chat').in('foo').clients(function(error, sids) { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatFooSid); - expect(sids).to.not.contain(chatBarSid); - expect(sids).to.not.contain(otherSid); - done(); - }); + sio + .of("/chat") + .in("foo") + .clients(function(error, sids) { + expect(error).to.not.be.ok(); + expect(sids).to.contain(chatFooSid); + expect(sids).to.not.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); + }); } }); - it('should find all clients across namespace rooms', function(done){ + it("should find all clients across namespace rooms", function(done) { var srv = http(); var sio = io(srv); var chatFooSid = null; var chatBarSid = null; var otherSid = null; - srv.listen(function(){ - var c1 = client(srv, '/chat'); - var c2 = client(srv, '/chat', {forceNew: true}); - var c3 = client(srv, '/other', {forceNew: true}); + srv.listen(function() { + var c1 = client(srv, "/chat"); + var c2 = client(srv, "/chat", { forceNew: true }); + var c3 = client(srv, "/other", { forceNew: true }); var chatIndex = 0; var total = 3; - sio.of('/chat').on('connection', function(socket){ + sio.of("/chat").on("connection", function(socket) { if (chatIndex++) { - socket.join('foo', function() { + socket.join("foo", function() { chatFooSid = socket.id; --total || getClients(); }); } else { - socket.join('bar', function() { + socket.join("bar", function() { chatBarSid = socket.id; --total || getClients(); }); } }); - sio.of('/other').on('connection', function(socket){ - socket.join('foo', function() { + sio.of("/other").on("connection", function(socket) { + socket.join("foo", function() { otherSid = socket.id; --total || getClients(); }); }); }); function getClients() { - sio.of('/chat').clients(function(error, sids) { + sio.of("/chat").clients(function(error, sids) { expect(error).to.not.be.ok(); expect(sids).to.contain(chatFooSid); expect(sids).to.contain(chatBarSid); @@ -811,22 +841,22 @@ describe('socket.io', function(){ } }); - it('should not emit volatile event after regular event', function(done) { + it("should not emit volatile event after regular event", function(done) { var srv = http(); var sio = io(srv); var counter = 0; - srv.listen(function(){ - sio.of('/chat').on('connection', function(s){ + srv.listen(function() { + sio.of("/chat").on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - sio.of('/chat').emit('ev', 'data'); - sio.of('/chat').volatile.emit('ev', 'data'); + sio.of("/chat").emit("ev", "data"); + sio.of("/chat").volatile.emit("ev", "data"); }, 50); }); - var socket = client(srv, '/chat'); - socket.on('ev', function() { + var socket = client(srv, "/chat"); + socket.on("ev", function() { counter++; }); }); @@ -837,21 +867,21 @@ describe('socket.io', function(){ }, 500); }); - it('should emit volatile event', function(done) { + it("should emit volatile event", function(done) { var srv = http(); var sio = io(srv); var counter = 0; - srv.listen(function(){ - sio.of('/chat').on('connection', function(s){ + srv.listen(function() { + sio.of("/chat").on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - sio.of('/chat').volatile.emit('ev', 'data'); + sio.of("/chat").volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, '/chat'); - socket.on('ev', function() { + var socket = client(srv, "/chat"); + socket.on("ev", function() { counter++; }); }); @@ -862,85 +892,91 @@ describe('socket.io', function(){ }, 500); }); - it('should enable compression by default', function(done){ + it("should enable compression by default", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { + srv.listen(function() { + var socket = client(srv, "/chat"); + sio.of("/chat").on("connection", function(s) { + s.conn.once("packetCreate", function(packet) { expect(packet.options.compress).to.be(true); done(); }); - sio.of('/chat').emit('woot', 'hi'); + sio.of("/chat").emit("woot", "hi"); }); }); }); - it('should disable compression', function(done){ + it("should disable compression", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { + srv.listen(function() { + var socket = client(srv, "/chat"); + sio.of("/chat").on("connection", function(s) { + s.conn.once("packetCreate", function(packet) { expect(packet.options.compress).to.be(false); done(); }); - sio.of('/chat').compress(false).emit('woot', 'hi'); + sio + .of("/chat") + .compress(false) + .emit("woot", "hi"); }); }); }); - describe('dynamic namespaces', function () { - it('should allow connections to dynamic namespaces with a regex', function(done){ + describe("dynamic namespaces", function() { + it("should allow connections to dynamic namespaces with a regex", function(done) { const srv = http(); const sio = io(srv); let count = 0; - srv.listen(function(){ - const socket = client(srv, '/dynamic-101'); - let dynamicNsp = sio.of(/^\/dynamic-\d+$/).on('connect', (socket) => { - expect(socket.nsp.name).to.be('/dynamic-101'); - dynamicNsp.emit('hello', 1, '2', { 3: '4'}); - if (++count === 4) done(); - }).use((socket, next) => { - next(); - if (++count === 4) done(); - }); - socket.on('error', function(err) { + srv.listen(function() { + const socket = client(srv, "/dynamic-101"); + let dynamicNsp = sio + .of(/^\/dynamic-\d+$/) + .on("connect", socket => { + expect(socket.nsp.name).to.be("/dynamic-101"); + dynamicNsp.emit("hello", 1, "2", { 3: "4" }); + if (++count === 4) done(); + }) + .use((socket, next) => { + next(); + if (++count === 4) done(); + }); + socket.on("error", function(err) { expect().fail(); }); - socket.on('connect', () => { + socket.on("connect", () => { if (++count === 4) done(); }); - socket.on('hello', (a, b, c) => { + socket.on("hello", (a, b, c) => { expect(a).to.eql(1); - expect(b).to.eql('2'); - expect(c).to.eql({ 3: '4' }); + expect(b).to.eql("2"); + expect(c).to.eql({ 3: "4" }); if (++count === 4) done(); }); }); }); - it('should allow connections to dynamic namespaces with a function', function(done){ + it("should allow connections to dynamic namespaces with a function", function(done) { const srv = http(); const sio = io(srv); - srv.listen(function(){ - const socket = client(srv, '/dynamic-101'); - sio.of((name, query, next) => next(null, '/dynamic-101' === name)); - socket.on('connect', done); + srv.listen(function() { + const socket = client(srv, "/dynamic-101"); + sio.of((name, query, next) => next(null, "/dynamic-101" === name)); + socket.on("connect", done); }); }); - it('should disallow connections when no dynamic namespace matches', function(done){ + it("should disallow connections when no dynamic namespace matches", function(done) { const srv = http(); const sio = io(srv); - srv.listen(function(){ - const socket = client(srv, '/abc'); + srv.listen(function() { + const socket = client(srv, "/abc"); sio.of(/^\/dynamic-\d+$/); - sio.of((name, query, next) => next(null, '/dynamic-101' === name)); - socket.on('error', (err) => { - expect(err).to.be('Invalid namespace'); + sio.of((name, query, next) => next(null, "/dynamic-101" === name)); + socket.on("error", err => { + expect(err).to.be("Invalid namespace"); done(); }); }); @@ -948,64 +984,66 @@ describe('socket.io', function(){ }); }); - describe('socket', function(){ - - it('should not fire events more than once after manually reconnecting', function(done) { + describe("socket", function() { + it("should not fire events more than once after manually reconnecting", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var clientSocket = client(srv, { reconnection: false }); - clientSocket.on('connect', function init() { - clientSocket.removeListener('connect', init); + clientSocket.on("connect", function init() { + clientSocket.removeListener("connect", init); clientSocket.io.engine.close(); clientSocket.connect(); - clientSocket.on('connect', function() { + clientSocket.on("connect", function() { done(); }); }); }); }); - it('should not fire reconnect_failed event more than once when server closed', function(done) { + it("should not fire reconnect_failed event more than once when server closed", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var clientSocket = client(srv, { reconnectionAttempts: 3, reconnectionDelay: 10 }); - clientSocket.on('connect', function() { + srv.listen(function() { + var clientSocket = client(srv, { + reconnectionAttempts: 3, + reconnectionDelay: 10 + }); + clientSocket.on("connect", function() { srv.close(); }); - clientSocket.on('reconnect_failed', function() { + clientSocket.on("reconnect_failed", function() { done(); }); }); }); - it('should receive events', function(done){ + it("should receive events", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('random', function(a, b, c){ + sio.on("connection", function(s) { + s.on("random", function(a, b, c) { expect(a).to.be(1); - expect(b).to.be('2'); + expect(b).to.be("2"); expect(c).to.eql([3]); done(); }); - socket.emit('random', 1, '2', [3]); + socket.emit("random", 1, "2", [3]); }); }); }); - it('should receive message events through `send`', function(done){ + it("should receive message events through `send`", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('message', function(a){ + sio.on("connection", function(s) { + s.on("message", function(a) { expect(a).to.be(1337); done(); }); @@ -1014,13 +1052,13 @@ describe('socket.io', function(){ }); }); - it('should error with null messages', function(done){ + it("should error with null messages", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('message', function(a){ + sio.on("connection", function(s) { + s.on("message", function(a) { expect(a).to.be(null); done(); }); @@ -1029,16 +1067,16 @@ describe('socket.io', function(){ }); }); - it('should handle transport null messages', function(done){ + it("should handle transport null messages", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { reconnection: false }); - sio.on('connection', function(s){ - s.on('error', function(err){ + sio.on("connection", function(s) { + s.on("error", function(err) { expect(err).to.be.an(Error); - s.on('disconnect', function(reason){ - expect(reason).to.be('forced close'); + s.on("disconnect", function(reason) { + expect(reason).to.be("forced close"); done(); }); }); @@ -1047,147 +1085,160 @@ describe('socket.io', function(){ }); }); - it('should emit events', function(done){ + it("should emit events", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('woot', function(a){ - expect(a).to.be('tobi'); + socket.on("woot", function(a) { + expect(a).to.be("tobi"); done(); }); - sio.on('connection', function(s){ - s.emit('woot', 'tobi'); + sio.on("connection", function(s) { + s.emit("woot", "tobi"); }); }); }); - it('should emit events with utf8 multibyte character', function(done) { + it("should emit events with utf8 multibyte character", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); var i = 0; - socket.on('hoot', function(a){ - expect(a).to.be('utf8 — string'); + socket.on("hoot", function(a) { + expect(a).to.be("utf8 — string"); i++; if (3 == i) { done(); } }); - sio.on('connection', function(s){ - s.emit('hoot', 'utf8 — string'); - s.emit('hoot', 'utf8 — string'); - s.emit('hoot', 'utf8 — string'); + sio.on("connection", function(s) { + s.emit("hoot", "utf8 — string"); + s.emit("hoot", "utf8 — string"); + s.emit("hoot", "utf8 — string"); }); }); }); - it('should emit events with binary data', function(done){ + it("should emit events with binary data", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); var imageData; - socket.on('doge', function(a){ + socket.on("doge", function(a) { expect(Buffer.isBuffer(a)).to.be(true); expect(imageData.length).to.equal(a.length); expect(imageData[0]).to.equal(a[0]); expect(imageData[imageData.length - 1]).to.equal(a[a.length - 1]); done(); }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + sio.on("connection", function(s) { + fs.readFile(join(__dirname, "support", "doge.jpg"), function( + err, + data + ) { if (err) return done(err); imageData = data; - s.emit('doge', data); + s.emit("doge", data); }); }); }); }); - it('should emit events with several types of data (including binary)', function(done){ + it("should emit events with several types of data (including binary)", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('multiple', function(a, b, c, d, e, f){ + socket.on("multiple", function(a, b, c, d, e, f) { expect(a).to.be(1); expect(Buffer.isBuffer(b)).to.be(true); - expect(c).to.be('3'); + expect(c).to.be("3"); expect(d).to.eql([4]); expect(Buffer.isBuffer(e)).to.be(true); expect(Buffer.isBuffer(f[0])).to.be(true); - expect(f[1]).to.be('swag'); + expect(f[1]).to.be("swag"); expect(Buffer.isBuffer(f[2])).to.be(true); done(); }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + sio.on("connection", function(s) { + fs.readFile(join(__dirname, "support", "doge.jpg"), function( + err, + data + ) { if (err) return done(err); - var buf = Buffer.from('asdfasdf', 'utf8'); - s.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); + var buf = Buffer.from("asdfasdf", "utf8"); + s.emit("multiple", 1, data, "3", [4], buf, [data, "swag", buf]); }); }); }); }); - it('should receive events with binary data', function(done){ + it("should receive events with binary data", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('buff', function(a){ + sio.on("connection", function(s) { + s.on("buff", function(a) { expect(Buffer.isBuffer(a)).to.be(true); done(); }); - var buf = Buffer.from('abcdefg', 'utf8'); - socket.emit('buff', buf); + var buf = Buffer.from("abcdefg", "utf8"); + socket.emit("buff", buf); }); }); }); - it('should receive events with several types of data (including binary)', function(done){ + it("should receive events with several types of data (including binary)", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('multiple', function(a, b, c, d, e, f){ - expect(a).to.be(1); - expect(Buffer.isBuffer(b)).to.be(true); - expect(c).to.be('3'); - expect(d).to.eql([4]); - expect(Buffer.isBuffer(e)).to.be(true); - expect(Buffer.isBuffer(f[0])).to.be(true); - expect(f[1]).to.be('swag'); - expect(Buffer.isBuffer(f[2])).to.be(true); - done(); + sio.on("connection", function(s) { + s.on("multiple", function(a, b, c, d, e, f) { + expect(a).to.be(1); + expect(Buffer.isBuffer(b)).to.be(true); + expect(c).to.be("3"); + expect(d).to.eql([4]); + expect(Buffer.isBuffer(e)).to.be(true); + expect(Buffer.isBuffer(f[0])).to.be(true); + expect(f[1]).to.be("swag"); + expect(Buffer.isBuffer(f[2])).to.be(true); + done(); }); - fs.readFile(join(__dirname, 'support', 'doge.jpg'), function(err, data){ + fs.readFile(join(__dirname, "support", "doge.jpg"), function( + err, + data + ) { if (err) return done(err); - var buf = Buffer.from('asdfasdf', 'utf8'); - socket.emit('multiple', 1, data, '3', [4], buf, [data, 'swag', buf]); + var buf = Buffer.from("asdfasdf", "utf8"); + socket.emit("multiple", 1, data, "3", [4], buf, [ + data, + "swag", + buf + ]); }); }); }); }); - it('should not emit volatile event after regular event (polling)', function(done) { + it("should not emit volatile event after regular event (polling)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['polling'] }); + var sio = io(srv, { transports: ["polling"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); + srv.listen(function() { + sio.on("connection", function(s) { + s.emit("ev", "data"); + s.volatile.emit("ev", "data"); }); - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["polling"] }); + socket.on("ev", function() { counter++; }); }); @@ -1198,19 +1249,19 @@ describe('socket.io', function(){ }, 200); }); - it('should not emit volatile event after regular event (ws)', function(done) { + it("should not emit volatile event after regular event (ws)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); + var sio = io(srv, { transports: ["websocket"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); + srv.listen(function() { + sio.on("connection", function(s) { + s.emit("ev", "data"); + s.volatile.emit("ev", "data"); }); - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", function() { counter++; }); }); @@ -1221,21 +1272,21 @@ describe('socket.io', function(){ }, 200); }); - it('should emit volatile event (polling)', function(done) { + it("should emit volatile event (polling)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['polling'] }); + var sio = io(srv, { transports: ["polling"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.volatile.emit('ev', 'data'); + s.volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["polling"] }); + socket.on("ev", function() { counter++; }); }); @@ -1246,21 +1297,21 @@ describe('socket.io', function(){ }, 500); }); - it('should emit volatile event (ws)', function(done) { + it("should emit volatile event (ws)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); + var sio = io(srv, { transports: ["websocket"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.volatile.emit('ev', 'data'); + s.volatile.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", function() { counter++; }); }); @@ -1271,22 +1322,22 @@ describe('socket.io', function(){ }, 200); }); - it('should emit only one consecutive volatile event (polling)', function(done) { + it("should emit only one consecutive volatile event (polling)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['polling'] }); + var sio = io(srv, { transports: ["polling"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.volatile.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); + s.volatile.emit("ev", "data"); + s.volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["polling"] }); + socket.on("ev", function() { counter++; }); }); @@ -1297,22 +1348,22 @@ describe('socket.io', function(){ }, 500); }); - it('should emit only one consecutive volatile event (ws)', function(done) { + it("should emit only one consecutive volatile event (ws)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); + var sio = io(srv, { transports: ["websocket"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.volatile.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); + s.volatile.emit("ev", "data"); + s.volatile.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", function() { counter++; }); }); @@ -1323,23 +1374,23 @@ describe('socket.io', function(){ }, 200); }); - it('should emit regular events after trying a failed volatile event (polling)', function(done) { + it("should emit regular events after trying a failed volatile event (polling)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['polling'] }); + var sio = io(srv, { transports: ["polling"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - s.emit('ev', 'data'); + s.emit("ev", "data"); + s.volatile.emit("ev", "data"); + s.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ['polling'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["polling"] }); + socket.on("ev", function() { counter++; }); }); @@ -1350,23 +1401,23 @@ describe('socket.io', function(){ }, 200); }); - it('should emit regular events after trying a failed volatile event (ws)', function(done) { + it("should emit regular events after trying a failed volatile event (ws)", function(done) { var srv = http(); - var sio = io(srv, { transports: ['websocket'] }); + var sio = io(srv, { transports: ["websocket"] }); var counter = 0; - srv.listen(function(){ - sio.on('connection', function(s){ + srv.listen(function() { + sio.on("connection", function(s) { // Wait to make sure there are no packets being sent for opening the connection setTimeout(function() { - s.emit('ev', 'data'); - s.volatile.emit('ev', 'data'); - s.emit('ev', 'data'); + s.emit("ev", "data"); + s.volatile.emit("ev", "data"); + s.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ['websocket'] }); - socket.on('ev', function() { + var socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", function() { counter++; }); }); @@ -1377,31 +1428,31 @@ describe('socket.io', function(){ }, 200); }); - it('should emit message events through `send`', function(done){ + it("should emit message events through `send`", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('message', function(a){ - expect(a).to.be('a'); + socket.on("message", function(a) { + expect(a).to.be("a"); done(); }); - sio.on('connection', function(s){ - s.send('a'); + sio.on("connection", function(s) { + s.send("a"); }); }); }); - it('should receive event with callbacks', function(done){ + it("should receive event with callbacks", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(fn){ + sio.on("connection", function(s) { + s.on("woot", function(fn) { fn(1, 2); }); - socket.emit('woot', function(a, b){ + socket.emit("woot", function(a, b) { expect(a).to.be(1); expect(b).to.be(2); done(); @@ -1410,93 +1461,93 @@ describe('socket.io', function(){ }); }); - it('should receive all events emitted from namespaced client immediately and in order', function(done) { + it("should receive all events emitted from namespaced client immediately and in order", function(done) { var srv = http(); var sio = io(srv); var total = 0; - srv.listen(function(){ - sio.of('/chat', function(s){ - s.on('hi', function(letter){ + srv.listen(function() { + sio.of("/chat", function(s) { + s.on("hi", function(letter) { total++; - if (total == 2 && letter == 'b') { + if (total == 2 && letter == "b") { done(); - } else if (total == 1 && letter != 'a') { - throw new Error('events out of order'); + } else if (total == 1 && letter != "a") { + throw new Error("events out of order"); } }); }); - var chat = client(srv, '/chat'); - chat.emit('hi', 'a'); + var chat = client(srv, "/chat"); + chat.emit("hi", "a"); setTimeout(function() { - chat.emit('hi', 'b'); + chat.emit("hi", "b"); }, 50); }); }); - it('should emit events with callbacks', function(done){ + it("should emit events with callbacks", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(fn){ + sio.on("connection", function(s) { + socket.on("hi", function(fn) { fn(); }); - s.emit('hi', function(){ + s.emit("hi", function() { done(); }); }); }); }); - it('should receive events with args and callback', function(done){ + it("should receive events with args and callback", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(a, b, fn){ + sio.on("connection", function(s) { + s.on("woot", function(a, b, fn) { expect(a).to.be(1); expect(b).to.be(2); fn(); }); - socket.emit('woot', 1, 2, function(){ + socket.emit("woot", 1, 2, function() { done(); }); }); }); }); - it('should emit events with args and callback', function(done){ + it("should emit events with args and callback", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(a, b, fn){ + sio.on("connection", function(s) { + socket.on("hi", function(a, b, fn) { expect(a).to.be(1); expect(b).to.be(2); fn(); }); - s.emit('hi', 1, 2, function(){ + s.emit("hi", 1, 2, function() { done(); }); }); }); }); - it('should receive events with binary args and callbacks', function(done) { + it("should receive events with binary args and callbacks", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(buf, fn){ + sio.on("connection", function(s) { + s.on("woot", function(buf, fn) { expect(Buffer.isBuffer(buf)).to.be(true); fn(1, 2); }); - socket.emit('woot', Buffer.alloc(3), function(a, b){ + socket.emit("woot", Buffer.alloc(3), function(a, b) { expect(a).to.be(1); expect(b).to.be(2); done(); @@ -1505,33 +1556,33 @@ describe('socket.io', function(){ }); }); - it('should emit events with binary args and callback', function(done){ + it("should emit events with binary args and callback", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(a, fn){ + sio.on("connection", function(s) { + socket.on("hi", function(a, fn) { expect(Buffer.isBuffer(a)).to.be(true); fn(); }); - s.emit('hi', Buffer.alloc(4), function(){ + s.emit("hi", Buffer.alloc(4), function() { done(); }); }); }); }); - it('should emit events and receive binary data in a callback', function(done) { + it("should emit events and receive binary data in a callback", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - socket.on('hi', function(fn){ + sio.on("connection", function(s) { + socket.on("hi", function(fn) { fn(Buffer.alloc(1)); }); - s.emit('hi', function(a){ + s.emit("hi", function(a) { expect(Buffer.isBuffer(a)).to.be(true); done(); }); @@ -1539,16 +1590,16 @@ describe('socket.io', function(){ }); }); - it('should receive events and pass binary data in a callback', function(done) { + it("should receive events and pass binary data in a callback", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.on('woot', function(fn){ + sio.on("connection", function(s) { + s.on("woot", function(fn) { fn(Buffer.alloc(2)); }); - socket.emit('woot', function(a){ + socket.emit("woot", function(a) { expect(Buffer.isBuffer(a)).to.be(true); done(); }); @@ -1556,147 +1607,151 @@ describe('socket.io', function(){ }); }); - it('should have access to the client', function(done){ + it("should have access to the client", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client).to.be.an('object'); + sio.on("connection", function(s) { + expect(s.client).to.be.an("object"); done(); }); }); }); - it('should have access to the connection', function(done){ + it("should have access to the connection", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client.conn).to.be.an('object'); - expect(s.conn).to.be.an('object'); + sio.on("connection", function(s) { + expect(s.client.conn).to.be.an("object"); + expect(s.conn).to.be.an("object"); done(); }); }); }); - it('should have access to the request', function(done){ + it("should have access to the request", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - expect(s.client.request.headers).to.be.an('object'); - expect(s.request.headers).to.be.an('object'); + sio.on("connection", function(s) { + expect(s.client.request.headers).to.be.an("object"); + expect(s.request.headers).to.be.an("object"); done(); }); }); }); - it('should see query parameters in the request', function(done) { + it("should see query parameters in the request", function(done) { var srv = http(); var sio = io(srv); srv.listen(function() { - var socket = client(srv, {query: {key1: 1, key2: 2}}); - sio.on('connection', function(s) { - var parsed = require('url').parse(s.request.url); - var query = require('querystring').parse(parsed.query); - expect(query.key1).to.be('1'); - expect(query.key2).to.be('2'); + var socket = client(srv, { query: { key1: 1, key2: 2 } }); + sio.on("connection", function(s) { + var parsed = require("url").parse(s.request.url); + var query = require("querystring").parse(parsed.query); + expect(query.key1).to.be("1"); + expect(query.key2).to.be("2"); done(); }); }); }); - - it('should see query parameters sent from secondary namespace connections in handshake object', function(done){ + + it("should see query parameters sent from secondary namespace connections in handshake object", function(done) { var srv = http(); var sio = io(srv); var client1 = client(srv); - var client2 = client(srv, '/connection2', {query: {key1: 'aa', key2: '&=bb'}}); - sio.on('connection', function(s){ + var client2 = client(srv, "/connection2", { + query: { key1: "aa", key2: "&=bb" } }); - sio.of('/connection2').on('connection', function(s){ - expect(s.handshake.query.key1).to.be('aa'); - expect(s.handshake.query.key2).to.be('&=bb'); + sio.on("connection", function(s) {}); + sio.of("/connection2").on("connection", function(s) { + expect(s.handshake.query.key1).to.be("aa"); + expect(s.handshake.query.key2).to.be("&=bb"); done(); }); - - }); - it('should handle very large json', function(done){ + it("should handle very large json", function(done) { this.timeout(30000); var srv = http(); var sio = io(srv, { perMessageDeflate: false }); var received = 0; - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('big', function(a){ + socket.on("big", function(a) { expect(Buffer.isBuffer(a.json)).to.be(false); - if (++received == 3) - done(); - else - socket.emit('big', a); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'fixtures', 'big.json'), function(err, data){ + if (++received == 3) done(); + else socket.emit("big", a); + }); + sio.on("connection", function(s) { + fs.readFile(join(__dirname, "fixtures", "big.json"), function( + err, + data + ) { if (err) return done(err); data = JSON.parse(data); - s.emit('big', {hello: 'friend', json: data}); + s.emit("big", { hello: "friend", json: data }); }); - s.on('big', function(a){ - s.emit('big', a); + s.on("big", function(a) { + s.emit("big", a); }); }); }); }); - it('should handle very large binary data', function(done){ + it("should handle very large binary data", function(done) { this.timeout(30000); var srv = http(); var sio = io(srv, { perMessageDeflate: false }); var received = 0; - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('big', function(a){ + socket.on("big", function(a) { expect(Buffer.isBuffer(a.image)).to.be(true); - if (++received == 3) - done(); - else - socket.emit('big', a); - }); - sio.on('connection', function(s){ - fs.readFile(join(__dirname, 'fixtures', 'big.jpg'), function(err, data){ + if (++received == 3) done(); + else socket.emit("big", a); + }); + sio.on("connection", function(s) { + fs.readFile(join(__dirname, "fixtures", "big.jpg"), function( + err, + data + ) { if (err) return done(err); - s.emit('big', {hello: 'friend', image: data}); + s.emit("big", { hello: "friend", image: data }); }); - s.on('big', function(a){ + s.on("big", function(a) { expect(Buffer.isBuffer(a.image)).to.be(true); - s.emit('big', a); + s.emit("big", a); }); }); }); }); - it('should be able to emit after server close and restart', function(done){ + it("should be able to emit after server close and restart", function(done) { var srv = http(); var sio = io(srv); - sio.on('connection', function(socket){ - socket.on('ev', function(data){ - expect(data).to.be('payload'); + sio.on("connection", function(socket) { + socket.on("ev", function(data) { + expect(data).to.be("payload"); done(); }); }); - srv.listen(function(){ + srv.listen(function() { var port = srv.address().port; - var clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); - clientSocket.once('connect', function(){ - srv.close(function(){ - clientSocket.on('reconnect', function(){ - clientSocket.emit('ev', 'payload'); + var clientSocket = client(srv, { + reconnectionAttempts: 10, + reconnectionDelay: 100 + }); + clientSocket.once("connect", function() { + srv.close(function() { + clientSocket.on("reconnect", function() { + clientSocket.emit("ev", "payload"); }); sio.listen(port); }); @@ -1704,46 +1759,51 @@ describe('socket.io', function(){ }); }); - it('should enable compression by default', function(done){ + it("should enable compression by default", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { + srv.listen(function() { + var socket = client(srv, "/chat"); + sio.of("/chat").on("connection", function(s) { + s.conn.once("packetCreate", function(packet) { expect(packet.options.compress).to.be(true); done(); }); - sio.of('/chat').emit('woot', 'hi'); + sio.of("/chat").emit("woot", "hi"); }); }); }); - it('should disable compression', function(done){ + it("should disable compression", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ - var socket = client(srv, '/chat'); - sio.of('/chat').on('connection', function(s){ - s.conn.once('packetCreate', function(packet) { + srv.listen(function() { + var socket = client(srv, "/chat"); + sio.of("/chat").on("connection", function(s) { + s.conn.once("packetCreate", function(packet) { expect(packet.options.compress).to.be(false); done(); }); - sio.of('/chat').compress(false).emit('woot', 'hi'); + sio + .of("/chat") + .compress(false) + .emit("woot", "hi"); }); }); }); - it('should error with raw binary and warn', function(done){ + it("should error with raw binary and warn", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { reconnection: false }); - sio.on('connection', function(s){ - s.conn.on('upgrade', function(){ - console.log('\u001b[96mNote: warning expected and normal in test.\u001b[39m'); - socket.io.engine.write('5woooot'); - setTimeout(function(){ + sio.on("connection", function(s) { + s.conn.on("upgrade", function() { + console.log( + "\u001b[96mNote: warning expected and normal in test.\u001b[39m" + ); + socket.io.engine.write("5woooot"); + setTimeout(function() { done(); }, 100); }); @@ -1751,16 +1811,18 @@ describe('socket.io', function(){ }); }); - it('should not crash when receiving an error packet without handler', function(done){ + it("should not crash when receiving an error packet without handler", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { reconnection: false }); - sio.on('connection', function(s){ - s.conn.on('upgrade', function(){ - console.log('\u001b[96mNote: warning expected and normal in test.\u001b[39m'); + sio.on("connection", function(s) { + s.conn.on("upgrade", function() { + console.log( + "\u001b[96mNote: warning expected and normal in test.\u001b[39m" + ); socket.io.engine.write('44["handle me please"]'); - setTimeout(function(){ + setTimeout(function() { done(); }, 100); }); @@ -1768,344 +1830,353 @@ describe('socket.io', function(){ }); }); - it('should not crash with raw binary', function(done){ + it("should not crash with raw binary", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { reconnection: false }); - sio.on('connection', function(s){ - s.once('error', function(err){ + sio.on("connection", function(s) { + s.once("error", function(err) { expect(err.message).to.match(/Illegal attachments/); done(); }); - s.conn.on('upgrade', function(){ - socket.io.engine.write('5woooot'); + s.conn.on("upgrade", function() { + socket.io.engine.write("5woooot"); }); }); }); }); - it('should handle empty binary packet', function(done){ + it("should handle empty binary packet", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { reconnection: false }); - sio.on('connection', function(s){ - s.once('error', function(err){ + sio.on("connection", function(s) { + s.once("error", function(err) { expect(err.message).to.match(/Illegal attachments/); done(); }); - s.conn.on('upgrade', function(){ - socket.io.engine.write('5'); + s.conn.on("upgrade", function() { + socket.io.engine.write("5"); }); }); }); }); - it('should not crash when messing with Object prototype (and other globals)', function(done){ - Object.prototype.foo = 'bar'; - global.File = ''; + it("should not crash when messing with Object prototype (and other globals)", function(done) { + Object.prototype.foo = "bar"; + global.File = ""; global.Blob = []; var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ + sio.on("connection", function(s) { s.disconnect(true); sio.close(); - setTimeout(function(){ + setTimeout(function() { done(); }, 100); }); }); }); - it('should always trigger the callback (if provided) when joining a room', function(done){ + it("should always trigger the callback (if provided) when joining a room", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - s.join('a', done); + sio.on("connection", function(s) { + s.join("a", function() { + s.join("a", done); }); }); }); }); - }); - describe('messaging many', function(){ - it('emits to a namespace', function(done){ + describe("messaging many", function() { + it("emits to a namespace", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('a', function(a){ - expect(a).to.be('b'); + var socket3 = client(srv, "/test"); + socket1.on("a", function(a) { + expect(a).to.be("b"); --total || done(); }); - socket2.on('a', function(a){ - expect(a).to.be('b'); + socket2.on("a", function(a) { + expect(a).to.be("b"); --total || done(); }); - socket3.on('a', function(){ done(new Error('not')); }); + socket3.on("a", function() { + done(new Error("not")); + }); var sockets = 3; - sio.on('connection', function(socket){ + sio.on("connection", function(socket) { --sockets || emit(); }); - sio.of('/test', function(socket){ + sio.of("/test", function(socket) { --sockets || emit(); }); - function emit(){ - sio.emit('a', 'b'); + function emit() { + sio.emit("a", "b"); } }); }); - it('emits binary data to a namespace', function(done){ + it("emits binary data to a namespace", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('bin', function(a){ + var socket3 = client(srv, "/test"); + socket1.on("bin", function(a) { expect(Buffer.isBuffer(a)).to.be(true); --total || done(); }); - socket2.on('bin', function(a){ + socket2.on("bin", function(a) { expect(Buffer.isBuffer(a)).to.be(true); --total || done(); }); - socket3.on('bin', function(){ done(new Error('not')); }); + socket3.on("bin", function() { + done(new Error("not")); + }); var sockets = 3; - sio.on('connection', function(socket){ + sio.on("connection", function(socket) { --sockets || emit(); }); - sio.of('/test', function(socket){ + sio.of("/test", function(socket) { --sockets || emit(); }); - function emit(){ - sio.emit('bin', Buffer.alloc(10)); + function emit() { + sio.emit("bin", Buffer.alloc(10)); } }); }); - it('emits to the rest', function(done){ + it("emits to the rest", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, '/test'); - socket1.on('a', function(a){ - expect(a).to.be('b'); - socket1.emit('finish'); + var socket3 = client(srv, "/test"); + socket1.on("a", function(a) { + expect(a).to.be("b"); + socket1.emit("finish"); + }); + socket2.emit("broadcast"); + socket2.on("a", function() { + done(new Error("done")); + }); + socket3.on("a", function() { + done(new Error("not")); }); - socket2.emit('broadcast'); - socket2.on('a', function(){ done(new Error('done')); }); - socket3.on('a', function(){ done(new Error('not')); }); var sockets = 2; - sio.on('connection', function(socket){ - socket.on('broadcast', function(){ - socket.broadcast.emit('a', 'b'); + sio.on("connection", function(socket) { + socket.on("broadcast", function() { + socket.broadcast.emit("a", "b"); }); - socket.on('finish', function(){ + socket.on("finish", function() { done(); }); }); }); }); - it('emits to rooms', function(done){ + it("emits to rooms", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); - socket2.on('a', function(){ - done(new Error('not')); + socket2.on("a", function() { + done(new Error("not")); }); - socket1.on('a', function(){ + socket1.on("a", function() { done(); }); - socket1.emit('join', 'woot', function(){ - socket1.emit('emit', 'woot'); + socket1.emit("join", "woot", function() { + socket1.emit("emit", "woot"); }); - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ + sio.on("connection", function(socket) { + socket.on("join", function(room, fn) { socket.join(room, fn); }); - socket.on('emit', function(room){ - sio.in(room).emit('a'); + socket.on("emit", function(room) { + sio.in(room).emit("a"); }); }); }); }); - it('emits to rooms avoiding dupes', function(done){ + it("emits to rooms avoiding dupes", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); - socket2.on('a', function(){ - done(new Error('not')); + socket2.on("a", function() { + done(new Error("not")); }); - socket1.on('a', function(){ + socket1.on("a", function() { --total || done(); }); - socket2.on('b', function(){ + socket2.on("b", function() { --total || done(); }); - socket1.emit('join', 'woot'); - socket1.emit('join', 'test'); - socket2.emit('join', 'third', function(){ - socket2.emit('emit'); + socket1.emit("join", "woot"); + socket1.emit("join", "test"); + socket2.emit("join", "third", function() { + socket2.emit("emit"); }); - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ + sio.on("connection", function(socket) { + socket.on("join", function(room, fn) { socket.join(room, fn); }); - socket.on('emit', function(room){ - sio.in('woot').in('test').emit('a'); - sio.in('third').emit('b'); + socket.on("emit", function(room) { + sio + .in("woot") + .in("test") + .emit("a"); + sio.in("third").emit("b"); }); }); }); }); - it('broadcasts to rooms', function(done){ + it("broadcasts to rooms", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); var socket3 = client(srv, { multiplex: false }); - socket1.emit('join', 'woot'); - socket2.emit('join', 'test'); - socket3.emit('join', 'test', function(){ - socket3.emit('broadcast'); + socket1.emit("join", "woot"); + socket2.emit("join", "test"); + socket3.emit("join", "test", function() { + socket3.emit("broadcast"); }); - socket1.on('a', function(){ - done(new Error('not')); + socket1.on("a", function() { + done(new Error("not")); }); - socket2.on('a', function(){ + socket2.on("a", function() { --total || done(); }); - socket3.on('a', function(){ - done(new Error('not')); + socket3.on("a", function() { + done(new Error("not")); }); - socket3.on('b', function(){ + socket3.on("b", function() { --total || done(); }); - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ + sio.on("connection", function(socket) { + socket.on("join", function(room, fn) { socket.join(room, fn); }); - socket.on('broadcast', function(){ - socket.broadcast.to('test').emit('a'); - socket.emit('b'); + socket.on("broadcast", function() { + socket.broadcast.to("test").emit("a"); + socket.emit("b"); }); }); }); }); - it('broadcasts binary data to rooms', function(done){ + it("broadcasts binary data to rooms", function(done) { var srv = http(); var sio = io(srv); var total = 2; - srv.listen(function(){ + srv.listen(function() { var socket1 = client(srv, { multiplex: false }); var socket2 = client(srv, { multiplex: false }); var socket3 = client(srv, { multiplex: false }); - socket1.emit('join', 'woot'); - socket2.emit('join', 'test'); - socket3.emit('join', 'test', function(){ - socket3.emit('broadcast'); + socket1.emit("join", "woot"); + socket2.emit("join", "test"); + socket3.emit("join", "test", function() { + socket3.emit("broadcast"); }); - socket1.on('bin', function(data){ - throw new Error('got bin in socket1'); + socket1.on("bin", function(data) { + throw new Error("got bin in socket1"); }); - socket2.on('bin', function(data){ + socket2.on("bin", function(data) { expect(Buffer.isBuffer(data)).to.be(true); --total || done(); }); - socket2.on('bin2', function(data) { - throw new Error('socket2 got bin2'); + socket2.on("bin2", function(data) { + throw new Error("socket2 got bin2"); }); - socket3.on('bin', function(data) { - throw new Error('socket3 got bin'); + socket3.on("bin", function(data) { + throw new Error("socket3 got bin"); }); - socket3.on('bin2', function(data) { + socket3.on("bin2", function(data) { expect(Buffer.isBuffer(data)).to.be(true); --total || done(); }); - sio.on('connection', function(socket){ - socket.on('join', function(room, fn){ + sio.on("connection", function(socket) { + socket.on("join", function(room, fn) { socket.join(room, fn); }); - socket.on('broadcast', function(){ - socket.broadcast.to('test').emit('bin', Buffer.alloc(5)); - socket.emit('bin2', Buffer.alloc(5)); + socket.on("broadcast", function() { + socket.broadcast.to("test").emit("bin", Buffer.alloc(5)); + socket.emit("bin2", Buffer.alloc(5)); }); }); }); }); - - it('keeps track of rooms', function(done){ + it("keeps track of rooms", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); - s.join('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); - s.join( 'c', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); - s.leave('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'c']); + sio.on("connection", function(s) { + s.join("a", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + s.join("b", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + s.join("c", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); + s.leave("b", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "c"]); s.leaveAll(); expect(Object.keys(s.rooms)).to.eql([]); done(); @@ -2117,17 +2188,17 @@ describe('socket.io', function(){ }); }); - it('deletes empty rooms', function(done) { + it("deletes empty rooms", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(s.nsp.adapter.rooms).to.have.key('a'); - s.leave('a', function(){ - expect(s.nsp.adapter.rooms).to.not.have.key('a'); + sio.on("connection", function(s) { + s.join("a", function() { + expect(s.nsp.adapter.rooms).to.have.key("a"); + s.leave("a", function() { + expect(s.nsp.adapter.rooms).to.not.have.key("a"); done(); }); }); @@ -2135,19 +2206,19 @@ describe('socket.io', function(){ }); }); - it('should properly cleanup left rooms', function(done){ + it("should properly cleanup left rooms", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join('a', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a']); - s.join('b', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); - s.leave('unknown', function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b']); + sio.on("connection", function(s) { + s.join("a", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + s.join("b", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + s.leave("unknown", function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); s.leaveAll(); expect(Object.keys(s.rooms)).to.eql([]); done(); @@ -2158,15 +2229,15 @@ describe('socket.io', function(){ }); }); - it('allows to join several rooms at once', function(done) { + it("allows to join several rooms at once", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(s){ - s.join(['a', 'b', 'c'], function(){ - expect(Object.keys(s.rooms)).to.eql([s.id, 'a', 'b', 'c']); + sio.on("connection", function(s) { + s.join(["a", "b", "c"], function() { + expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); done(); }); }); @@ -2174,135 +2245,135 @@ describe('socket.io', function(){ }); }); - describe('middleware', function(done){ - var Socket = require('../lib/socket'); + describe("middleware", function(done) { + var Socket = require("../lib/socket"); - it('should call functions', function(done){ + it("should call functions", function(done) { var srv = http(); var sio = io(srv); var run = 0; - sio.use(function(socket, next){ + sio.use(function(socket, next) { expect(socket).to.be.a(Socket); run++; next(); }); - sio.use(function(socket, next){ + sio.use(function(socket, next) { expect(socket).to.be.a(Socket); run++; next(); }); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('connect', function(){ + socket.on("connect", function() { expect(run).to.be(2); done(); }); }); }); - it('should pass errors', function(done){ + it("should pass errors", function(done) { var srv = http(); var sio = io(srv); var run = 0; - sio.use(function(socket, next){ - next(new Error('Authentication error')); + sio.use(function(socket, next) { + next(new Error("Authentication error")); }); - sio.use(function(socket, next){ - done(new Error('nope')); + sio.use(function(socket, next) { + done(new Error("nope")); }); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); + socket.on("connect", function() { + done(new Error("nope")); }); - socket.on('error', function(err){ - expect(err).to.be('Authentication error'); + socket.on("error", function(err) { + expect(err).to.be("Authentication error"); done(); }); }); }); - it('should pass `data` of error object', function(done){ + it("should pass `data` of error object", function(done) { var srv = http(); var sio = io(srv); var run = 0; - sio.use(function(socket, next){ - var err = new Error('Authentication error'); - err.data = { a: 'b', c: 3 }; + sio.use(function(socket, next) { + var err = new Error("Authentication error"); + err.data = { a: "b", c: 3 }; next(err); }); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('connect', function(){ - done(new Error('nope')); + socket.on("connect", function() { + done(new Error("nope")); }); - socket.on('error', function(err){ - expect(err).to.eql({ a: 'b', c: 3 }); + socket.on("error", function(err) { + expect(err).to.eql({ a: "b", c: 3 }); done(); }); }); }); - it('should only call connection after fns', function(done){ + it("should only call connection after fns", function(done) { var srv = http(); var sio = io(srv); - sio.use(function(socket, next){ - socket.name = 'guillermo'; + sio.use(function(socket, next) { + socket.name = "guillermo"; next(); }); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - sio.on('connection', function(socket){ - expect(socket.name).to.be('guillermo'); + sio.on("connection", function(socket) { + expect(socket.name).to.be("guillermo"); done(); }); }); }); - it('should only call connection after (lengthy) fns', function(done){ + it("should only call connection after (lengthy) fns", function(done) { var srv = http(); var sio = io(srv); var authenticated = false; - sio.use(function(socket, next){ - setTimeout(function () { + sio.use(function(socket, next) { + setTimeout(function() { authenticated = true; next(); }, 300); }); - srv.listen(function(){ + srv.listen(function() { var socket = client(srv); - socket.on('connect', function(){ + socket.on("connect", function() { expect(authenticated).to.be(true); done(); }); }); }); - it('should be ignored if socket gets closed', function(done){ + it("should be ignored if socket gets closed", function(done) { var srv = http(); var sio = io(srv); var socket; - sio.use(function(s, next){ - socket.io.engine.on('open', function(){ + sio.use(function(s, next) { + socket.io.engine.on("open", function() { socket.io.engine.close(); - s.client.conn.on('close', function(){ + s.client.conn.on("close", function() { process.nextTick(next); - setTimeout(function(){ + setTimeout(function() { done(); }, 50); }); }); }); - srv.listen(function(){ + srv.listen(function() { socket = client(srv); - sio.on('connection', function(socket){ - done(new Error('should not fire')); + sio.on("connection", function(socket) { + done(new Error("should not fire")); }); }); }); - it('should call functions in expected order', function(done){ + it("should call functions in expected order", function(done) { var srv = http(); var sio = io(srv); var result = []; @@ -2315,83 +2386,83 @@ describe('socket.io', function(){ result.push(2); setTimeout(next, 50); }); - sio.of('/chat').use(function(socket, next) { + sio.of("/chat").use(function(socket, next) { result.push(3); setTimeout(next, 50); }); - sio.of('/chat').use(function(socket, next) { + sio.of("/chat").use(function(socket, next) { result.push(4); setTimeout(next, 50); }); srv.listen(function() { - var chat = client(srv, '/chat'); - chat.on('connect', function() { + var chat = client(srv, "/chat"); + chat.on("connect", function() { expect(result).to.eql([1, 2, 3, 4]); done(); }); }); }); - it('should disable the merge of handshake packets', function(done){ + it("should disable the merge of handshake packets", function(done) { var srv = http(); var sio = io(); - sio.use(function(socket, next){ + sio.use(function(socket, next) { next(); }); sio.listen(srv); var socket = client(srv); - socket.on('connect', function(){ + socket.on("connect", function() { done(); }); }); - it('should work with a custom namespace', (done) => { + it("should work with a custom namespace", done => { var srv = http(); var sio = io(); sio.listen(srv); - sio.of('/chat').use(function(socket, next){ + sio.of("/chat").use(function(socket, next) { next(); }); var count = 0; - client(srv, '/').on('connect', () => { + client(srv, "/").on("connect", () => { if (++count === 2) done(); }); - client(srv, '/chat').on('connect', () => { + client(srv, "/chat").on("connect", () => { if (++count === 2) done(); }); }); }); - describe('socket middleware', function(done){ - var Socket = require('../lib/socket'); + describe("socket middleware", function(done) { + var Socket = require("../lib/socket"); - it('should call functions', function(done){ + it("should call functions", function(done) { var srv = http(); var sio = io(srv); var run = 0; - srv.listen(function(){ + srv.listen(function() { var socket = client(srv, { multiplex: false }); - socket.emit('join', 'woot'); + socket.emit("join", "woot"); - sio.on('connection', function(socket){ - socket.use(function(event, next){ - expect(event).to.eql(['join', 'woot']); - event.unshift('wrap'); + sio.on("connection", function(socket) { + socket.use(function(event, next) { + expect(event).to.eql(["join", "woot"]); + event.unshift("wrap"); run++; next(); }); - socket.use(function(event, next){ - expect(event).to.eql(['wrap', 'join', 'woot']); + socket.use(function(event, next) { + expect(event).to.eql(["wrap", "join", "woot"]); run++; next(); }); - socket.on('wrap', function(data1, data2){ - expect(data1).to.be('join'); - expect(data2).to.be('woot'); + socket.on("wrap", function(data1, data2) { + expect(data1).to.be("join"); + expect(data2).to.be("woot"); expect(run).to.be(2); done(); }); @@ -2399,58 +2470,58 @@ describe('socket.io', function(){ }); }); - it('should pass errors', function(done){ + it("should pass errors", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var clientSocket = client(srv, { multiplex: false }); - clientSocket.emit('join', 'woot'); + clientSocket.emit("join", "woot"); - clientSocket.on('error', function(err){ - expect(err).to.be('Authentication error'); + clientSocket.on("error", function(err) { + expect(err).to.be("Authentication error"); done(); }); - sio.on('connection', function(socket){ - socket.use(function(event, next){ - next(new Error('Authentication error')); + sio.on("connection", function(socket) { + socket.use(function(event, next) { + next(new Error("Authentication error")); }); - socket.use(function(event, next){ - done(new Error('nope')); + socket.use(function(event, next) { + done(new Error("nope")); }); - socket.on('join', function(){ - done(new Error('nope')); + socket.on("join", function() { + done(new Error("nope")); }); }); }); }); - it('should pass `data` of error object', function(done){ + it("should pass `data` of error object", function(done) { var srv = http(); var sio = io(srv); - srv.listen(function(){ + srv.listen(function() { var clientSocket = client(srv, { multiplex: false }); - clientSocket.emit('join', 'woot'); + clientSocket.emit("join", "woot"); - clientSocket.on('error', function(err){ - expect(err).to.eql({ a: 'b', c: 3 }); + clientSocket.on("error", function(err) { + expect(err).to.eql({ a: "b", c: 3 }); done(); }); - sio.on('connection', function(socket){ - socket.use(function(event, next){ - var err = new Error('Authentication error'); - err.data = { a: 'b', c: 3 }; + sio.on("connection", function(socket) { + socket.use(function(event, next) { + var err = new Error("Authentication error"); + err.data = { a: "b", c: 3 }; next(err); }); - socket.on('join', function(){ - done(new Error('nope')); + socket.on("join", function() { + done(new Error("nope")); }); }); }); From 3d760b71d7ee480dfab4b9f336a5d90d970c6b3f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Sep 2020 14:35:59 +0200 Subject: [PATCH 320/494] refactor: use ES6 syntax --- lib/client.js | 467 ++++++++++---------- lib/index.js | 897 +++++++++++++++++++------------------- lib/namespace.js | 481 ++++++++++---------- lib/parent-namespace.js | 2 - lib/socket.js | 944 +++++++++++++++++++--------------------- 5 files changed, 1371 insertions(+), 1420 deletions(-) diff --git a/lib/client.js b/lib/client.js index 5e4a540bd9..069ad07f2a 100644 --- a/lib/client.js +++ b/lib/client.js @@ -1,277 +1,262 @@ -/** - * Module dependencies. - */ - -var parser = require("socket.io-parser"); -var debug = require("debug")("socket.io:client"); -var url = require("url"); - -/** - * Module exports. - */ - -module.exports = Client; - -/** - * Client constructor. - * - * @param {Server} server instance - * @param {Socket} conn - * @api private - */ - -function Client(server, conn) { - this.server = server; - this.conn = conn; - this.encoder = server.encoder; - this.decoder = new server.parser.Decoder(); - this.id = conn.id; - this.request = conn.request; - this.setup(); - this.sockets = {}; - this.nsps = {}; - this.connectBuffer = []; -} - -/** - * Sets up event listeners. - * - * @api private - */ - -Client.prototype.setup = function() { - this.onclose = this.onclose.bind(this); - this.ondata = this.ondata.bind(this); - this.onerror = this.onerror.bind(this); - this.ondecoded = this.ondecoded.bind(this); - - this.decoder.on("decoded", this.ondecoded); - this.conn.on("data", this.ondata); - this.conn.on("error", this.onerror); - this.conn.on("close", this.onclose); -}; - -/** - * Connects a client to a namespace. - * - * @param {String} name namespace - * @param {Object} query the query parameters - * @api private - */ +const parser = require("socket.io-parser"); +const debug = require("debug")("socket.io:client"); +const url = require("url"); + +class Client { + /** + * Client constructor. + * + * @param {Server} server instance + * @param {Socket} conn + * @api private + */ + constructor(server, conn) { + this.server = server; + this.conn = conn; + this.encoder = server.encoder; + this.decoder = new server.parser.Decoder(); + this.id = conn.id; + this.request = conn.request; + this.setup(); + this.sockets = {}; + this.nsps = {}; + this.connectBuffer = []; + } -Client.prototype.connect = function(name, query) { - if (this.server.nsps[name]) { - debug("connecting to namespace %s", name); - return this.doConnect(name, query); + /** + * Sets up event listeners. + * + * @api private + */ + setup() { + this.onclose = this.onclose.bind(this); + this.ondata = this.ondata.bind(this); + this.onerror = this.onerror.bind(this); + this.ondecoded = this.ondecoded.bind(this); + + this.decoder.on("decoded", this.ondecoded); + this.conn.on("data", this.ondata); + this.conn.on("error", this.onerror); + this.conn.on("close", this.onclose); } - this.server.checkNamespace(name, query, dynamicNsp => { - if (dynamicNsp) { - debug("dynamic namespace %s was created", dynamicNsp.name); - this.doConnect(name, query); - } else { - debug("creation of namespace %s was denied", name); - this.packet({ type: parser.ERROR, nsp: name, data: "Invalid namespace" }); + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {Object} query the query parameters + * @api private + */ + connect(name, query) { + if (this.server.nsps[name]) { + debug("connecting to namespace %s", name); + return this.doConnect(name, query); } - }); -}; - -/** - * Connects a client to a namespace. - * - * @param {String} name namespace - * @param {String} query the query parameters - * @api private - */ - -Client.prototype.doConnect = function(name, query) { - var nsp = this.server.of(name); - if ("/" != name && !this.nsps["/"]) { - this.connectBuffer.push(name); - return; + this.server.checkNamespace(name, query, dynamicNsp => { + if (dynamicNsp) { + debug("dynamic namespace %s was created", dynamicNsp.name); + this.doConnect(name, query); + } else { + debug("creation of namespace %s was denied", name); + this.packet({ + type: parser.ERROR, + nsp: name, + data: "Invalid namespace" + }); + } + }); } - var self = this; - var socket = nsp.add(this, query, function() { - self.sockets[socket.id] = socket; - self.nsps[nsp.name] = socket; - - if ("/" == nsp.name && self.connectBuffer.length > 0) { - self.connectBuffer.forEach(self.connect, self); - self.connectBuffer = []; + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {String} query the query parameters + * @api private + */ + doConnect(name, query) { + const nsp = this.server.of(name); + + if ("/" != name && !this.nsps["/"]) { + this.connectBuffer.push(name); + return; } - }); -}; -/** - * Disconnects from all namespaces and closes transport. - * - * @api private - */ + const self = this; + const socket = nsp.add(this, query, function() { + self.sockets[socket.id] = socket; + self.nsps[nsp.name] = socket; -Client.prototype.disconnect = function() { - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].disconnect(); - } + if ("/" == nsp.name && self.connectBuffer.length > 0) { + self.connectBuffer.forEach(self.connect, self); + self.connectBuffer = []; + } + }); } - this.sockets = {}; - this.close(); -}; - -/** - * Removes a socket. Called by each `Socket`. - * - * @api private - */ -Client.prototype.remove = function(socket) { - if (this.sockets.hasOwnProperty(socket.id)) { - var nsp = this.sockets[socket.id].nsp.name; - delete this.sockets[socket.id]; - delete this.nsps[nsp]; - } else { - debug("ignoring remove for %s", socket.id); + /** + * Disconnects from all namespaces and closes transport. + * + * @api private + */ + disconnect() { + for (const id in this.sockets) { + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].disconnect(); + } + } + this.sockets = {}; + this.close(); } -}; - -/** - * Closes the underlying connection. - * - * @api private - */ -Client.prototype.close = function() { - if ("open" == this.conn.readyState) { - debug("forcing transport close"); - this.conn.close(); - this.onclose("forced server close"); + /** + * Removes a socket. Called by each `Socket`. + * + * @api private + */ + remove(socket) { + if (this.sockets.hasOwnProperty(socket.id)) { + const nsp = this.sockets[socket.id].nsp.name; + delete this.sockets[socket.id]; + delete this.nsps[nsp]; + } else { + debug("ignoring remove for %s", socket.id); + } } -}; - -/** - * Writes a packet to the transport. - * - * @param {Object} packet object - * @param {Object} opts - * @api private - */ - -Client.prototype.packet = function(packet, opts) { - opts = opts || {}; - var self = this; - // this writes to the actual connection - function writeToEngine(encodedPackets) { - if (opts.volatile && !self.conn.transport.writable) return; - for (var i = 0; i < encodedPackets.length; i++) { - self.conn.write(encodedPackets[i], { compress: opts.compress }); + /** + * Closes the underlying connection. + * + * @api private + */ + close() { + if ("open" == this.conn.readyState) { + debug("forcing transport close"); + this.conn.close(); + this.onclose("forced server close"); } } - if ("open" == this.conn.readyState) { - debug("writing packet %j", packet); - if (!opts.preEncoded) { - // not broadcasting, need to encode - this.encoder.encode(packet, writeToEngine); // encode, then write results to engine + /** + * Writes a packet to the transport. + * + * @param {Object} packet object + * @param {Object} opts + * @api private + */ + packet(packet, opts) { + opts = opts || {}; + const self = this; + + // this writes to the actual connection + function writeToEngine(encodedPackets) { + if (opts.volatile && !self.conn.transport.writable) return; + for (let i = 0; i < encodedPackets.length; i++) { + self.conn.write(encodedPackets[i], { compress: opts.compress }); + } + } + + if ("open" == this.conn.readyState) { + debug("writing packet %j", packet); + if (!opts.preEncoded) { + // not broadcasting, need to encode + this.encoder.encode(packet, writeToEngine); // encode, then write results to engine + } else { + // a broadcast pre-encodes a packet + writeToEngine(packet); + } } else { - // a broadcast pre-encodes a packet - writeToEngine(packet); + debug("ignoring packet write %j", packet); } - } else { - debug("ignoring packet write %j", packet); } -}; - -/** - * Called with incoming transport data. - * - * @api private - */ -Client.prototype.ondata = function(data) { - // try/catch is needed for protocol violations (GH-1880) - try { - this.decoder.add(data); - } catch (e) { - this.onerror(e); + /** + * Called with incoming transport data. + * + * @api private + */ + ondata(data) { + // try/catch is needed for protocol violations (GH-1880) + try { + this.decoder.add(data); + } catch (e) { + this.onerror(e); + } } -}; - -/** - * Called when parser fully decodes a packet. - * - * @api private - */ -Client.prototype.ondecoded = function(packet) { - if (parser.CONNECT == packet.type) { - this.connect( - url.parse(packet.nsp).pathname, - url.parse(packet.nsp, true).query - ); - } else { - var socket = this.nsps[packet.nsp]; - if (socket) { - process.nextTick(function() { - socket.onpacket(packet); - }); + /** + * Called when parser fully decodes a packet. + * + * @api private + */ + ondecoded(packet) { + if (parser.CONNECT == packet.type) { + this.connect( + url.parse(packet.nsp).pathname, + url.parse(packet.nsp, true).query + ); } else { - debug("no socket for namespace %s", packet.nsp); + const socket = this.nsps[packet.nsp]; + if (socket) { + process.nextTick(function() { + socket.onpacket(packet); + }); + } else { + debug("no socket for namespace %s", packet.nsp); + } } } -}; -/** - * Handles an error. - * - * @param {Object} err object - * @api private - */ - -Client.prototype.onerror = function(err) { - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onerror(err); + /** + * Handles an error. + * + * @param {Object} err object + * @api private + */ + onerror(err) { + for (const id in this.sockets) { + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].onerror(err); + } } + this.conn.close(); } - this.conn.close(); -}; - -/** - * Called upon transport close. - * - * @param {String} reason - * @api private - */ - -Client.prototype.onclose = function(reason) { - debug("client close with reason %s", reason); - - // ignore a potential subsequent `close` event - this.destroy(); - // `nsps` and `sockets` are cleaned up seamlessly - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onclose(reason); + /** + * Called upon transport close. + * + * @param {String} reason + * @api private + */ + onclose(reason) { + debug("client close with reason %s", reason); + + // ignore a potential subsequent `close` event + this.destroy(); + + // `nsps` and `sockets` are cleaned up seamlessly + for (const id in this.sockets) { + if (this.sockets.hasOwnProperty(id)) { + this.sockets[id].onclose(reason); + } } - } - this.sockets = {}; + this.sockets = {}; - this.decoder.destroy(); // clean up decoder -}; + this.decoder.destroy(); // clean up decoder + } -/** - * Cleans up event listeners. - * - * @api private - */ + /** + * Cleans up event listeners. + * + * @api private + */ + destroy() { + this.conn.removeListener("data", this.ondata); + this.conn.removeListener("error", this.onerror); + this.conn.removeListener("close", this.onclose); + this.decoder.removeListener("decoded", this.ondecoded); + } +} -Client.prototype.destroy = function() { - this.conn.removeListener("data", this.ondata); - this.conn.removeListener("error", this.onerror); - this.conn.removeListener("close", this.onclose); - this.decoder.removeListener("decoded", this.ondecoded); -}; +module.exports = Client; diff --git a/lib/index.js b/lib/index.js index 4ae2677cee..af99c2cfa1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,511 +1,532 @@ -"use strict"; - -/** - * Module dependencies. - */ - -var http = require("http"); -var read = require("fs").readFileSync; -var path = require("path"); -var exists = require("fs").existsSync; -var engine = require("engine.io"); -var clientVersion = require("socket.io-client/package.json").version; -var Client = require("./client"); -var Emitter = require("events").EventEmitter; -var Namespace = require("./namespace"); -var ParentNamespace = require("./parent-namespace"); -var Adapter = require("socket.io-adapter"); -var parser = require("socket.io-parser"); -var debug = require("debug")("socket.io:server"); -var url = require("url"); - -/** - * Module exports. - */ - -module.exports = Server; +const http = require("http"); +const read = require("fs").readFileSync; +const path = require("path"); +const exists = require("fs").existsSync; +const engine = require("engine.io"); +const clientVersion = require("socket.io-client/package.json").version; +const Client = require("./client"); +const EventEmitter = require("events"); +const Namespace = require("./namespace"); +const ParentNamespace = require("./parent-namespace"); +const Adapter = require("socket.io-adapter"); +const parser = require("socket.io-parser"); +const debug = require("debug")("socket.io:server"); +const url = require("url"); /** * Socket.IO client source. */ -var clientSource = undefined; -var clientSourceMap = undefined; - -/** - * Server constructor. - * - * @param {http.Server|Number|Object} srv http server, port or options - * @param {Object} [opts] - * @api public - */ - -function Server(srv, opts) { - if (!(this instanceof Server)) return new Server(srv, opts); - if ("object" == typeof srv && srv instanceof Object && !srv.listen) { - opts = srv; - srv = null; +let clientSource = undefined; +let clientSourceMap = undefined; + +class Server extends EventEmitter { + /** + * Server constructor. + * + * @param {http.Server|Number|Object} srv http server, port or options + * @param {Object} [opts] + * @api public + */ + constructor(srv, opts) { + super(); + if ("object" == typeof srv && srv instanceof Object && !srv.listen) { + opts = srv; + srv = null; + } + opts = opts || {}; + this.nsps = {}; + this.parentNsps = new Map(); + this.path(opts.path || "/socket.io"); + this.serveClient(false !== opts.serveClient); + this.parser = opts.parser || parser; + this.encoder = new this.parser.Encoder(); + this.adapter(opts.adapter || Adapter); + this.origins(opts.origins || "*:*"); + this.sockets = this.of("/"); + if (srv) this.attach(srv, opts); } - opts = opts || {}; - this.nsps = {}; - this.parentNsps = new Map(); - this.path(opts.path || "/socket.io"); - this.serveClient(false !== opts.serveClient); - this.parser = opts.parser || parser; - this.encoder = new this.parser.Encoder(); - this.adapter(opts.adapter || Adapter); - this.origins(opts.origins || "*:*"); - this.sockets = this.of("/"); - if (srv) this.attach(srv, opts); -} - -/** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} req request - * @param {Function} fn callback to be called with the result: `fn(err, success)` - */ -Server.prototype.checkRequest = function(req, fn) { - var origin = req.headers.origin || req.headers.referer; - - // file:// URLs produce a null Origin which can't be authorized via echo-back - if ("null" == origin || null == origin) origin = "*"; - - if (!!origin && typeof this._origins == "function") - return this._origins(origin, fn); - if (this._origins.indexOf("*:*") !== -1) return fn(null, true); - if (origin) { - try { - var parts = url.parse(origin); - var defaultPort = "https:" == parts.protocol ? 443 : 80; - parts.port = parts.port != null ? parts.port : defaultPort; - var ok = - ~this._origins.indexOf( - parts.protocol + "//" + parts.hostname + ":" + parts.port - ) || - ~this._origins.indexOf(parts.hostname + ":" + parts.port) || - ~this._origins.indexOf(parts.hostname + ":*") || - ~this._origins.indexOf("*:" + parts.port); - debug("origin %s is %svalid", origin, !!ok ? "" : "not "); - return fn(null, !!ok); - } catch (ex) {} + /** + * Server request verification function, that checks for allowed origins + * + * @param {http.IncomingMessage} req request + * @param {Function} fn callback to be called with the result: `fn(err, success)` + */ + checkRequest(req, fn) { + let origin = req.headers.origin || req.headers.referer; + + // file:// URLs produce a null Origin which can't be authorized via echo-back + if ("null" == origin || null == origin) origin = "*"; + + if (!!origin && typeof this._origins == "function") + return this._origins(origin, fn); + if (this._origins.indexOf("*:*") !== -1) return fn(null, true); + if (origin) { + try { + const parts = url.parse(origin); + const defaultPort = "https:" == parts.protocol ? 443 : 80; + parts.port = parts.port != null ? parts.port : defaultPort; + const ok = + ~this._origins.indexOf( + parts.protocol + "//" + parts.hostname + ":" + parts.port + ) || + ~this._origins.indexOf(parts.hostname + ":" + parts.port) || + ~this._origins.indexOf(parts.hostname + ":*") || + ~this._origins.indexOf("*:" + parts.port); + debug("origin %s is %svalid", origin, !!ok ? "" : "not "); + return fn(null, !!ok); + } catch (ex) {} + } + fn(null, false); } - fn(null, false); -}; - -/** - * Sets/gets whether client code is being served. - * - * @param {Boolean} v whether to serve client code - * @return {Server|Boolean} self when setting or value when getting - * @api public - */ -Server.prototype.serveClient = function(v) { - if (!arguments.length) return this._serveClient; - this._serveClient = v; - var resolvePath = function(file) { - var filepath = path.resolve(__dirname, "./../../", file); - if (exists(filepath)) { - return filepath; - } - return require.resolve(file); - }; - if (v && !clientSource) { - clientSource = read( - resolvePath("socket.io-client/dist/socket.io.js"), - "utf-8" - ); - try { - clientSourceMap = read( - resolvePath("socket.io-client/dist/socket.io.js.map"), + /** + * Sets/gets whether client code is being served. + * + * @param {Boolean} v whether to serve client code + * @return {Server|Boolean} self when setting or value when getting + * @api public + */ + serveClient(v) { + if (!arguments.length) return this._serveClient; + this._serveClient = v; + const resolvePath = function(file) { + const filepath = path.resolve(__dirname, "./../../", file); + if (exists(filepath)) { + return filepath; + } + return require.resolve(file); + }; + if (v && !clientSource) { + clientSource = read( + resolvePath("socket.io-client/dist/socket.io.js"), "utf-8" ); - } catch (err) { - debug("could not load sourcemap file"); + try { + clientSourceMap = read( + resolvePath("socket.io-client/dist/socket.io.js.map"), + "utf-8" + ); + } catch (err) { + debug("could not load sourcemap file"); + } } + return this; } - return this; -}; - -/** - * Old settings for backwards compatibility - */ -var oldSettings = { - transports: "transports", - "heartbeat timeout": "pingTimeout", - "heartbeat interval": "pingInterval", - "destroy buffer size": "maxHttpBufferSize" -}; + /** + * Backwards compatibility. + * + * @api public + */ + set(key, val) { + if ("authorization" == key && val) { + this.use(function(socket, next) { + val(socket.request, function(err, authorized) { + if (err) return next(new Error(err)); + if (!authorized) return next(new Error("Not authorized")); + next(); + }); + }); + } else if ("origins" == key && val) { + this.origins(val); + } else if ("resource" == key) { + this.path(val); + } else if (oldSettings[key] && this.eio[oldSettings[key]]) { + this.eio[oldSettings[key]] = val; + } else { + console.error("Option %s is not valid. Please refer to the README.", key); + } -/** - * Backwards compatibility. - * - * @api public - */ + return this; + } -Server.prototype.set = function(key, val) { - if ("authorization" == key && val) { - this.use(function(socket, next) { - val(socket.request, function(err, authorized) { - if (err) return next(new Error(err)); - if (!authorized) return next(new Error("Not authorized")); - next(); + /** + * Executes the middleware for an incoming namespace not already created on the server. + * + * @param {String} name name of incoming namespace + * @param {Object} query the query parameters + * @param {Function} fn callback + * @api private + */ + checkNamespace(name, query, fn) { + if (this.parentNsps.size === 0) return fn(false); + + const keysIterator = this.parentNsps.keys(); + + const run = () => { + let nextFn = keysIterator.next(); + if (nextFn.done) { + return fn(false); + } + nextFn.value(name, query, (err, allow) => { + if (err || !allow) { + run(); + } else { + fn(this.parentNsps.get(nextFn.value).createChild(name)); + } }); - }); - } else if ("origins" == key && val) { - this.origins(val); - } else if ("resource" == key) { - this.path(val); - } else if (oldSettings[key] && this.eio[oldSettings[key]]) { - this.eio[oldSettings[key]] = val; - } else { - console.error("Option %s is not valid. Please refer to the README.", key); + }; + + run(); } - return this; -}; + /** + * Sets the client serving path. + * + * @param {String} v pathname + * @return {Server|String} self when setting or value when getting + * @api public + */ + path(v) { + if (!arguments.length) return this._path; + this._path = v.replace(/\/$/, ""); + return this; + } -/** - * Executes the middleware for an incoming namespace not already created on the server. - * - * @param {String} name name of incoming namespace - * @param {Object} query the query parameters - * @param {Function} fn callback - * @api private - */ + /** + * Sets the adapter for rooms. + * + * @param {Adapter} v pathname + * @return {Server|Adapter} self when setting or value when getting + * @api public + */ + adapter(v) { + if (!arguments.length) return this._adapter; + this._adapter = v; + for (const i in this.nsps) { + if (this.nsps.hasOwnProperty(i)) { + this.nsps[i].initAdapter(); + } + } + return this; + } -Server.prototype.checkNamespace = function(name, query, fn) { - if (this.parentNsps.size === 0) return fn(false); + /** + * Sets the allowed origins for requests. + * + * @param {String|String[]} v origins + * @return {Server|Adapter} self when setting or value when getting + * @api public + */ + origins(v) { + if (!arguments.length) return this._origins; + + this._origins = v; + return this; + } - const keysIterator = this.parentNsps.keys(); + /** + * Attaches socket.io to a server or port. + * + * @param {http.Server|Number} server or port + * @param {Object} options passed to engine.io + * @return {Server} self + * @api public + */ + listen(srv, opts) { + if ("function" == typeof srv) { + const msg = + "You are trying to attach socket.io to an express " + + "request handler function. Please pass a http.Server instance."; + throw new Error(msg); + } - const run = () => { - let nextFn = keysIterator.next(); - if (nextFn.done) { - return fn(false); + // handle a port as a string + if (Number(srv) == srv) { + srv = Number(srv); } - nextFn.value(name, query, (err, allow) => { - if (err || !allow) { - run(); - } else { - fn(this.parentNsps.get(nextFn.value).createChild(name)); - } - }); - }; - run(); -}; + if ("number" == typeof srv) { + debug("creating http server and binding to %d", srv); + const port = srv; + srv = http.Server(function(req, res) { + res.writeHead(404); + res.end(); + }); + srv.listen(port); + } -/** - * Sets the client serving path. - * - * @param {String} v pathname - * @return {Server|String} self when setting or value when getting - * @api public - */ + // set engine.io path to `/socket.io` + opts = opts || {}; + opts.path = opts.path || this.path(); + // set origins verification + opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); -Server.prototype.path = function(v) { - if (!arguments.length) return this._path; - this._path = v.replace(/\/$/, ""); - return this; -}; + if (this.sockets.fns.length > 0) { + this.initEngine(srv, opts); + return this; + } -/** - * Sets the adapter for rooms. - * - * @param {Adapter} v pathname - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ + const self = this; + const connectPacket = { type: parser.CONNECT, nsp: "/" }; + this.encoder.encode(connectPacket, function(encodedPacket) { + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = encodedPacket; -Server.prototype.adapter = function(v) { - if (!arguments.length) return this._adapter; - this._adapter = v; - for (var i in this.nsps) { - if (this.nsps.hasOwnProperty(i)) { - this.nsps[i].initAdapter(); - } + self.initEngine(srv, opts); + }); + return this; } - return this; -}; -/** - * Sets the allowed origins for requests. - * - * @param {String|String[]} v origins - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ + attach(srv, opts) { + if ("function" == typeof srv) { + const msg = + "You are trying to attach socket.io to an express " + + "request handler function. Please pass a http.Server instance."; + throw new Error(msg); + } -Server.prototype.origins = function(v) { - if (!arguments.length) return this._origins; + // handle a port as a string + if (Number(srv) == srv) { + srv = Number(srv); + } - this._origins = v; - return this; -}; + if ("number" == typeof srv) { + debug("creating http server and binding to %d", srv); + const port = srv; + srv = http.Server(function(req, res) { + res.writeHead(404); + res.end(); + }); + srv.listen(port); + } -/** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} server or port - * @param {Object} options passed to engine.io - * @return {Server} self - * @api public - */ + // set engine.io path to `/socket.io` + opts = opts || {}; + opts.path = opts.path || this.path(); + // set origins verification + opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); -Server.prototype.listen = Server.prototype.attach = function(srv, opts) { - if ("function" == typeof srv) { - var msg = - "You are trying to attach socket.io to an express " + - "request handler function. Please pass a http.Server instance."; - throw new Error(msg); - } + if (this.sockets.fns.length > 0) { + this.initEngine(srv, opts); + return this; + } - // handle a port as a string - if (Number(srv) == srv) { - srv = Number(srv); - } + const self = this; + const connectPacket = { type: parser.CONNECT, nsp: "/" }; + this.encoder.encode(connectPacket, function(encodedPacket) { + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = encodedPacket; - if ("number" == typeof srv) { - debug("creating http server and binding to %d", srv); - var port = srv; - srv = http.Server(function(req, res) { - res.writeHead(404); - res.end(); + self.initEngine(srv, opts); }); - srv.listen(port); - } - - // set engine.io path to `/socket.io` - opts = opts || {}; - opts.path = opts.path || this.path(); - // set origins verification - opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - - if (this.sockets.fns.length > 0) { - this.initEngine(srv, opts); return this; } - var self = this; - var connectPacket = { type: parser.CONNECT, nsp: "/" }; - this.encoder.encode(connectPacket, function(encodedPacket) { - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = encodedPacket; + /** + * Initialize engine + * + * @param {Object} options passed to engine.io + * @api private + */ + initEngine(srv, opts) { + // initialize engine + debug("creating engine.io instance with opts %j", opts); + this.eio = engine.attach(srv, opts); + + // attach static file serving + if (this._serveClient) this.attachServe(srv); + + // Export http server + this.httpServer = srv; + + // bind to engine events + this.bind(this.eio); + } - self.initEngine(srv, opts); - }); - return this; -}; + /** + * Attaches the static file serving. + * + * @param {Function|http.Server} srv http server + * @api private + */ + attachServe(srv) { + debug("attaching client serving req handler"); + const url = this._path + "/socket.io.js"; + const urlMap = this._path + "/socket.io.js.map"; + const evs = srv.listeners("request").slice(0); + const self = this; + srv.removeAllListeners("request"); + srv.on("request", function(req, res) { + if (0 === req.url.indexOf(urlMap)) { + self.serveMap(req, res); + } else if (0 === req.url.indexOf(url)) { + self.serve(req, res); + } else { + for (let i = 0; i < evs.length; i++) { + evs[i].call(srv, req, res); + } + } + }); + } -/** - * Initialize engine - * - * @param {Object} options passed to engine.io - * @api private - */ + /** + * Handles a request serving `/socket.io.js` + * + * @param {http.Request} req + * @param {http.Response} res + * @api private + */ + serve(req, res) { + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + const expectedEtag = '"' + clientVersion + '"'; + + const etag = req.headers["if-none-match"]; + if (etag) { + if (expectedEtag == etag) { + debug("serve client 304"); + res.writeHead(304); + res.end(); + return; + } + } -Server.prototype.initEngine = function(srv, opts) { - // initialize engine - debug("creating engine.io instance with opts %j", opts); - this.eio = engine.attach(srv, opts); + debug("serve client source"); + res.setHeader("Cache-Control", "public, max-age=0"); + res.setHeader("Content-Type", "application/javascript"); + res.setHeader("ETag", expectedEtag); + res.writeHead(200); + res.end(clientSource); + } - // attach static file serving - if (this._serveClient) this.attachServe(srv); + /** + * Handles a request serving `/socket.io.js.map` + * + * @param {http.Request} req + * @param {http.Response} res + * @api private + */ + serveMap(req, res) { + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + const expectedEtag = '"' + clientVersion + '"'; + + const etag = req.headers["if-none-match"]; + if (etag) { + if (expectedEtag == etag) { + debug("serve client 304"); + res.writeHead(304); + res.end(); + return; + } + } - // Export http server - this.httpServer = srv; + debug("serve client sourcemap"); + res.setHeader("Content-Type", "application/json"); + res.setHeader("ETag", expectedEtag); + res.writeHead(200); + res.end(clientSourceMap); + } - // bind to engine events - this.bind(this.eio); -}; + /** + * Binds socket.io to an engine.io instance. + * + * @param {engine.Server} engine engine.io (or compatible) server + * @return {Server} self + * @api public + */ + bind(engine) { + this.engine = engine; + this.engine.on("connection", this.onconnection.bind(this)); + return this; + } -/** - * Attaches the static file serving. - * - * @param {Function|http.Server} srv http server - * @api private - */ + /** + * Called with each incoming transport connection. + * + * @param {engine.Socket} conn + * @return {Server} self + * @api public + */ + onconnection(conn) { + debug("incoming connection with id %s", conn.id); + const client = new Client(this, conn); + client.connect("/"); + return this; + } -Server.prototype.attachServe = function(srv) { - debug("attaching client serving req handler"); - var url = this._path + "/socket.io.js"; - var urlMap = this._path + "/socket.io.js.map"; - var evs = srv.listeners("request").slice(0); - var self = this; - srv.removeAllListeners("request"); - srv.on("request", function(req, res) { - if (0 === req.url.indexOf(urlMap)) { - self.serveMap(req, res); - } else if (0 === req.url.indexOf(url)) { - self.serve(req, res); - } else { - for (var i = 0; i < evs.length; i++) { - evs[i].call(srv, req, res); + /** + * Looks up a namespace. + * + * @param {String|RegExp|Function} name nsp name + * @param {Function} [fn] optional, nsp `connection` ev handler + * @api public + */ + of(name, fn) { + if (typeof name === "function" || name instanceof RegExp) { + const parentNsp = new ParentNamespace(this); + debug("initializing parent namespace %s", parentNsp.name); + if (typeof name === "function") { + this.parentNsps.set(name, parentNsp); + } else { + this.parentNsps.set( + (nsp, conn, next) => next(null, name.test(nsp)), + parentNsp + ); } + if (fn) parentNsp.on("connect", fn); + return parentNsp; } - }); -}; -/** - * Handles a request serving `/socket.io.js` - * - * @param {http.Request} req - * @param {http.Response} res - * @api private - */ + if (String(name)[0] !== "/") name = "/" + name; -Server.prototype.serve = function(req, res) { - // Per the standard, ETags must be quoted: - // https://tools.ietf.org/html/rfc7232#section-2.3 - var expectedEtag = '"' + clientVersion + '"'; - - var etag = req.headers["if-none-match"]; - if (etag) { - if (expectedEtag == etag) { - debug("serve client 304"); - res.writeHead(304); - res.end(); - return; + let nsp = this.nsps[name]; + if (!nsp) { + debug("initializing namespace %s", name); + nsp = new Namespace(this, name); + this.nsps[name] = nsp; } + if (fn) nsp.on("connect", fn); + return nsp; } - debug("serve client source"); - res.setHeader("Cache-Control", "public, max-age=0"); - res.setHeader("Content-Type", "application/javascript"); - res.setHeader("ETag", expectedEtag); - res.writeHead(200); - res.end(clientSource); -}; - -/** - * Handles a request serving `/socket.io.js.map` - * - * @param {http.Request} req - * @param {http.Response} res - * @api private - */ - -Server.prototype.serveMap = function(req, res) { - // Per the standard, ETags must be quoted: - // https://tools.ietf.org/html/rfc7232#section-2.3 - var expectedEtag = '"' + clientVersion + '"'; - - var etag = req.headers["if-none-match"]; - if (etag) { - if (expectedEtag == etag) { - debug("serve client 304"); - res.writeHead(304); - res.end(); - return; + /** + * Closes server connection + * + * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed + * @api public + */ + close(fn) { + for (const id in this.nsps["/"].sockets) { + if (this.nsps["/"].sockets.hasOwnProperty(id)) { + this.nsps["/"].sockets[id].onclose(); + } } - } - - debug("serve client sourcemap"); - res.setHeader("Content-Type", "application/json"); - res.setHeader("ETag", expectedEtag); - res.writeHead(200); - res.end(clientSourceMap); -}; -/** - * Binds socket.io to an engine.io instance. - * - * @param {engine.Server} engine engine.io (or compatible) server - * @return {Server} self - * @api public - */ - -Server.prototype.bind = function(engine) { - this.engine = engine; - this.engine.on("connection", this.onconnection.bind(this)); - return this; -}; - -/** - * Called with each incoming transport connection. - * - * @param {engine.Socket} conn - * @return {Server} self - * @api public - */ + this.engine.close(); -Server.prototype.onconnection = function(conn) { - debug("incoming connection with id %s", conn.id); - var client = new Client(this, conn); - client.connect("/"); - return this; -}; - -/** - * Looks up a namespace. - * - * @param {String|RegExp|Function} name nsp name - * @param {Function} [fn] optional, nsp `connection` ev handler - * @api public - */ - -Server.prototype.of = function(name, fn) { - if (typeof name === "function" || name instanceof RegExp) { - const parentNsp = new ParentNamespace(this); - debug("initializing parent namespace %s", parentNsp.name); - if (typeof name === "function") { - this.parentNsps.set(name, parentNsp); + if (this.httpServer) { + this.httpServer.close(fn); } else { - this.parentNsps.set( - (nsp, conn, next) => next(null, name.test(nsp)), - parentNsp - ); + fn && fn(); } - if (fn) parentNsp.on("connect", fn); - return parentNsp; - } - - if (String(name)[0] !== "/") name = "/" + name; - - var nsp = this.nsps[name]; - if (!nsp) { - debug("initializing namespace %s", name); - nsp = new Namespace(this, name); - this.nsps[name] = nsp; } - if (fn) nsp.on("connect", fn); - return nsp; -}; +} /** - * Closes server connection - * - * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed - * @api public + * Old settings for backwards compatibility */ -Server.prototype.close = function(fn) { - for (var id in this.nsps["/"].sockets) { - if (this.nsps["/"].sockets.hasOwnProperty(id)) { - this.nsps["/"].sockets[id].onclose(); - } - } - - this.engine.close(); - - if (this.httpServer) { - this.httpServer.close(fn); - } else { - fn && fn(); - } +const oldSettings = { + transports: "transports", + "heartbeat timeout": "pingTimeout", + "heartbeat interval": "pingInterval", + "destroy buffer size": "maxHttpBufferSize" }; /** * Expose main namespace (/). */ -var emitterMethods = Object.keys(Emitter.prototype).filter(function(key) { - return typeof Emitter.prototype[key] === "function"; +const emitterMethods = Object.keys(EventEmitter.prototype).filter(function( + key +) { + return typeof EventEmitter.prototype[key] === "function"; }); emitterMethods @@ -516,7 +537,7 @@ emitterMethods }; }); -Namespace.flags.forEach(function(flag) { +["json", "volatile", "local"].forEach(function(flag) { Object.defineProperty(Server.prototype, flag, { get: function() { this.sockets.flags = this.sockets.flags || {}; @@ -531,3 +552,5 @@ Namespace.flags.forEach(function(flag) { */ Server.listen = Server; + +module.exports = (srv, opts) => new Server(srv, opts); diff --git a/lib/namespace.js b/lib/namespace.js index 9dd0fa4bb9..dbee7c540c 100644 --- a/lib/namespace.js +++ b/lib/namespace.js @@ -1,18 +1,8 @@ -/** - * Module dependencies. - */ - -var Socket = require("./socket"); -var Emitter = require("events").EventEmitter; -var parser = require("socket.io-parser"); -var hasBin = require("has-binary2"); -var debug = require("debug")("socket.io:namespace"); - -/** - * Module exports. - */ - -module.exports = exports = Namespace; +const Socket = require("./socket"); +const EventEmitter = require("events").EventEmitter; +const parser = require("socket.io-parser"); +const hasBin = require("has-binary2"); +const debug = require("debug")("socket.io:namespace"); /** * Blacklisted events. @@ -30,269 +20,262 @@ exports.events = [ exports.flags = ["json", "volatile", "local"]; -/** - * `EventEmitter#emit` reference. - */ - -var emit = Emitter.prototype.emit; - -/** - * Namespace constructor. - * - * @param {Server} server instance - * @param {Socket} name - * @api private - */ - -function Namespace(server, name) { - this.name = name; - this.server = server; - this.sockets = {}; - this.connected = {}; - this.fns = []; - this.ids = 0; - this.rooms = []; - this.flags = {}; - this.initAdapter(); -} - -/** - * Inherits from `EventEmitter`. - */ - -Namespace.prototype.__proto__ = Emitter.prototype; +class Namespace extends EventEmitter { + /** + * Namespace constructor. + * + * @param {Server} server instance + * @param {Socket} name + * @api private + */ + constructor(server, name) { + super(); + this.name = name; + this.server = server; + this.sockets = {}; + this.connected = {}; + this.fns = []; + this.ids = 0; + this.rooms = []; + this.flags = {}; + this.initAdapter(); + } -/** - * Apply flags from `Socket`. - */ + /** + * Initializes the `Adapter` for this nsp. + * Run upon changing adapter by `Server#adapter` + * in addition to the constructor. + * + * @api private + */ + initAdapter() { + this.adapter = new (this.server.adapter())(this); + } -exports.flags.forEach(function(flag) { - Object.defineProperty(Namespace.prototype, flag, { - get: function() { - this.flags[flag] = true; - return this; + /** + * Sets up namespace middleware. + * + * @return {Namespace} self + * @api public + */ + use(fn) { + if (this.server.eio && this.name === "/") { + debug("removing initial packet"); + delete this.server.eio.initialPacket; } - }); -}); - -/** - * Initializes the `Adapter` for this nsp. - * Run upon changing adapter by `Server#adapter` - * in addition to the constructor. - * - * @api private - */ - -Namespace.prototype.initAdapter = function() { - this.adapter = new (this.server.adapter())(this); -}; - -/** - * Sets up namespace middleware. - * - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.use = function(fn) { - if (this.server.eio && this.name === "/") { - debug("removing initial packet"); - delete this.server.eio.initialPacket; + this.fns.push(fn); + return this; } - this.fns.push(fn); - return this; -}; -/** - * Executes the middleware for an incoming client. - * - * @param {Socket} socket that will get added - * @param {Function} fn last fn call in the middleware - * @api private - */ + /** + * Executes the middleware for an incoming client. + * + * @param {Socket} socket that will get added + * @param {Function} fn last fn call in the middleware + * @api private + */ + run(socket, fn) { + const fns = this.fns.slice(0); + if (!fns.length) return fn(null); + + function run(i) { + fns[i](socket, function(err) { + // upon error, short-circuit + if (err) return fn(err); + + // if no middleware left, summon callback + if (!fns[i + 1]) return fn(null); + + // go on to next + run(i + 1); + }); + } -Namespace.prototype.run = function(socket, fn) { - var fns = this.fns.slice(0); - if (!fns.length) return fn(null); + run(0); + } - function run(i) { - fns[i](socket, function(err) { - // upon error, short-circuit - if (err) return fn(err); + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + * @api public + */ + to(name) { + if (!~this.rooms.indexOf(name)) this.rooms.push(name); + return this; + } - // if no middleware left, summon callback - if (!fns[i + 1]) return fn(null); + in(name) { + if (!~this.rooms.indexOf(name)) this.rooms.push(name); + return this; + } - // go on to next - run(i + 1); + /** + * Adds a new client. + * + * @return {Socket} + * @api private + */ + add(client, query, fn) { + debug("adding socket to nsp %s", this.name); + const socket = new Socket(this, client, query); + const self = this; + this.run(socket, function(err) { + process.nextTick(function() { + if ("open" == client.conn.readyState) { + if (err) return socket.error(err.data || err.message); + + // track socket + self.sockets[socket.id] = socket; + + // it's paramount that the internal `onconnect` logic + // fires before user-set events to prevent state order + // violations (such as a disconnection before the connection + // logic is complete) + socket.onconnect(); + if (fn) fn(); + + // fire user-set events + self.emit("connect", socket); + self.emit("connection", socket); + } else { + debug("next called after client was closed - ignoring socket"); + } + }); }); + return socket; } - run(0); -}; + /** + * Removes a client. Called by each `Socket`. + * + * @api private + */ + remove(socket) { + if (this.sockets.hasOwnProperty(socket.id)) { + delete this.sockets[socket.id]; + } else { + debug("ignoring remove for %s", socket.id); + } + } -/** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - * @api public - */ + /** + * Emits to all clients. + * + * @return {Namespace} self + * @api public + */ + emit(ev) { + if (~exports.events.indexOf(ev)) { + super.emit.apply(this, arguments); + return this; + } + // set up packet object + const args = Array.prototype.slice.call(arguments); + const packet = { + type: (this.flags.binary !== undefined + ? this.flags.binary + : hasBin(args)) + ? parser.BINARY_EVENT + : parser.EVENT, + data: args + }; + + if ("function" == typeof args[args.length - 1]) { + throw new Error("Callbacks are not supported when broadcasting"); + } -Namespace.prototype.to = Namespace.prototype.in = function(name) { - if (!~this.rooms.indexOf(name)) this.rooms.push(name); - return this; -}; + const rooms = this.rooms.slice(0); + const flags = Object.assign({}, this.flags); -/** - * Adds a new client. - * - * @return {Socket} - * @api private - */ + // reset flags + this.rooms = []; + this.flags = {}; -Namespace.prototype.add = function(client, query, fn) { - debug("adding socket to nsp %s", this.name); - var socket = new Socket(this, client, query); - var self = this; - this.run(socket, function(err) { - process.nextTick(function() { - if ("open" == client.conn.readyState) { - if (err) return socket.error(err.data || err.message); - - // track socket - self.sockets[socket.id] = socket; - - // it's paramount that the internal `onconnect` logic - // fires before user-set events to prevent state order - // violations (such as a disconnection before the connection - // logic is complete) - socket.onconnect(); - if (fn) fn(); - - // fire user-set events - self.emit("connect", socket); - self.emit("connection", socket); - } else { - debug("next called after client was closed - ignoring socket"); - } + this.adapter.broadcast(packet, { + rooms: rooms, + flags: flags }); - }); - return socket; -}; - -/** - * Removes a client. Called by each `Socket`. - * - * @api private - */ -Namespace.prototype.remove = function(socket) { - if (this.sockets.hasOwnProperty(socket.id)) { - delete this.sockets[socket.id]; - } else { - debug("ignoring remove for %s", socket.id); + return this; } -}; - -/** - * Emits to all clients. - * - * @return {Namespace} self - * @api public - */ -Namespace.prototype.emit = function(ev) { - if (~exports.events.indexOf(ev)) { - emit.apply(this, arguments); + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + * @api public + */ + send() { + const args = Array.prototype.slice.call(arguments); + args.unshift("message"); + this.emit.apply(this, args); return this; } - // set up packet object - var args = Array.prototype.slice.call(arguments); - var packet = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : hasBin(args)) - ? parser.BINARY_EVENT - : parser.EVENT, - data: args - }; - - if ("function" == typeof args[args.length - 1]) { - throw new Error("Callbacks are not supported when broadcasting"); - } - var rooms = this.rooms.slice(0); - var flags = Object.assign({}, this.flags); - - // reset flags - this.rooms = []; - this.flags = {}; - - this.adapter.broadcast(packet, { - rooms: rooms, - flags: flags - }); - - return this; -}; - -/** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - * @api public - */ + write() { + const args = Array.prototype.slice.call(arguments); + args.unshift("message"); + this.emit.apply(this, args); + return this; + } -Namespace.prototype.send = Namespace.prototype.write = function() { - var args = Array.prototype.slice.call(arguments); - args.unshift("message"); - this.emit.apply(this, args); - return this; -}; + /** + * Gets a list of clients. + * + * @return {Namespace} self + * @api public + */ + clients(fn) { + if (!this.adapter) { + throw new Error( + "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" + ); + } + this.adapter.clients(this.rooms, fn); + // reset rooms for scenario: + // .in('room').clients() (GH-1978) + this.rooms = []; + return this; + } -/** - * Gets a list of clients. - * - * @return {Namespace} self - * @api public - */ + /** + * Sets the compress flag. + * + * @param {Boolean} compress if `true`, compresses the sending data + * @return {Socket} self + * @api public + */ + compress(compress) { + this.flags.compress = compress; + return this; + } -Namespace.prototype.clients = function(fn) { - if (!this.adapter) { - throw new Error( - "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" - ); + /** + * Sets the binary flag + * + * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + * @api public + */ + binary(binary) { + this.flags.binary = binary; + return this; } - this.adapter.clients(this.rooms, fn); - // reset rooms for scenario: - // .in('room').clients() (GH-1978) - this.rooms = []; - return this; -}; +} /** - * Sets the compress flag. - * - * @param {Boolean} compress if `true`, compresses the sending data - * @return {Socket} self - * @api public + * Apply flags from `Socket`. */ -Namespace.prototype.compress = function(compress) { - this.flags.compress = compress; - return this; -}; - -/** - * Sets the binary flag - * - * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - * @api public - */ +exports.flags.forEach(function(flag) { + Object.defineProperty(Namespace.prototype, flag, { + get: function() { + this.flags[flag] = true; + return this; + } + }); +}); -Namespace.prototype.binary = function(binary) { - this.flags.binary = binary; - return this; -}; +module.exports = Namespace; diff --git a/lib/parent-namespace.js b/lib/parent-namespace.js index 1343ed25a2..d76480e5b7 100644 --- a/lib/parent-namespace.js +++ b/lib/parent-namespace.js @@ -1,5 +1,3 @@ -"use strict"; - const Namespace = require("./namespace"); let count = 0; diff --git a/lib/socket.js b/lib/socket.js index 6afd6ba7f6..1677ef4f14 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,18 +1,8 @@ -/** - * Module dependencies. - */ - -var Emitter = require("events").EventEmitter; -var parser = require("socket.io-parser"); -var hasBin = require("has-binary2"); -var url = require("url"); -var debug = require("debug")("socket.io:socket"); - -/** - * Module exports. - */ - -module.exports = exports = Socket; +const EventEmitter = require("events"); +const parser = require("socket.io-parser"); +const hasBin = require("has-binary2"); +const url = require("url"); +const debug = require("debug")("socket.io:socket"); /** * Blacklisted events. @@ -35,534 +25,506 @@ exports.events = [ * @api private */ -var flags = ["json", "volatile", "broadcast", "local"]; - -/** - * `EventEmitter#emit` reference. - */ - -var emit = Emitter.prototype.emit; - -/** - * Interface to a `Client` for a given `Namespace`. - * - * @param {Namespace} nsp - * @param {Client} client - * @api public - */ - -function Socket(nsp, client, query) { - this.nsp = nsp; - this.server = nsp.server; - this.adapter = this.nsp.adapter; - this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; - this.client = client; - this.conn = client.conn; - this.rooms = {}; - this.acks = {}; - this.connected = true; - this.disconnected = false; - this.handshake = this.buildHandshake(query); - this.fns = []; - this.flags = {}; - this._rooms = []; -} - -/** - * Inherits from `EventEmitter`. - */ - -Socket.prototype.__proto__ = Emitter.prototype; +const flags = ["json", "volatile", "broadcast", "local"]; + +class Socket extends EventEmitter { + /** + * Interface to a `Client` for a given `Namespace`. + * + * @param {Namespace} nsp + * @param {Client} client + * @api public + */ + constructor(nsp, client, query) { + super(); + this.nsp = nsp; + this.server = nsp.server; + this.adapter = this.nsp.adapter; + this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; + this.client = client; + this.conn = client.conn; + this.rooms = {}; + this.acks = {}; + this.connected = true; + this.disconnected = false; + this.handshake = this.buildHandshake(query); + this.fns = []; + this.flags = {}; + this._rooms = []; + } -/** - * Apply flags from `Socket`. - */ + /** + * Builds the `handshake` BC object + * + * @api private + */ + buildHandshake(query) { + const self = this; + function buildQuery() { + const requestQuery = url.parse(self.request.url, true).query; + //if socket-specific query exist, replace query strings in requestQuery + return Object.assign({}, query, requestQuery); + } + return { + headers: this.request.headers, + time: new Date() + "", + address: this.conn.remoteAddress, + xdomain: !!this.request.headers.origin, + secure: !!this.request.connection.encrypted, + issued: +new Date(), + url: this.request.url, + query: buildQuery() + }; + } -flags.forEach(function(flag) { - Object.defineProperty(Socket.prototype, flag, { - get: function() { - this.flags[flag] = true; + /** + * Emits to this client. + * + * @return {Socket} self + * @api public + */ + emit(ev) { + if (~exports.events.indexOf(ev)) { + super.emit.apply(this, arguments); return this; } - }); -}); -/** - * `request` engine.io shortcut. - * - * @api public - */ + const args = Array.prototype.slice.call(arguments); + const packet = { + type: (this.flags.binary !== undefined + ? this.flags.binary + : hasBin(args)) + ? parser.BINARY_EVENT + : parser.EVENT, + data: args + }; -Object.defineProperty(Socket.prototype, "request", { - get: function() { - return this.conn.request; - } -}); + // access last argument to see if it's an ACK callback + if (typeof args[args.length - 1] === "function") { + if (this._rooms.length || this.flags.broadcast) { + throw new Error("Callbacks are not supported when broadcasting"); + } -/** - * Builds the `handshake` BC object - * - * @api private - */ + debug("emitting packet with ack id %d", this.nsp.ids); + this.acks[this.nsp.ids] = args.pop(); + packet.id = this.nsp.ids++; + } -Socket.prototype.buildHandshake = function(query) { - var self = this; - function buildQuery() { - var requestQuery = url.parse(self.request.url, true).query; - //if socket-specific query exist, replace query strings in requestQuery - return Object.assign({}, query, requestQuery); + const rooms = this._rooms.slice(0); + const flags = Object.assign({}, this.flags); + + // reset flags + this._rooms = []; + this.flags = {}; + + if (rooms.length || flags.broadcast) { + this.adapter.broadcast(packet, { + except: [this.id], + rooms: rooms, + flags: flags + }); + } else { + // dispatch packet + this.packet(packet, flags); + } + return this; } - return { - headers: this.request.headers, - time: new Date() + "", - address: this.conn.remoteAddress, - xdomain: !!this.request.headers.origin, - secure: !!this.request.connection.encrypted, - issued: +new Date(), - url: this.request.url, - query: buildQuery() - }; -}; -/** - * Emits to this client. - * - * @return {Socket} self - * @api public - */ - -Socket.prototype.emit = function(ev) { - if (~exports.events.indexOf(ev)) { - emit.apply(this, arguments); + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + * @api public + */ + to(name) { + if (!~this._rooms.indexOf(name)) this._rooms.push(name); return this; } - var args = Array.prototype.slice.call(arguments); - var packet = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : hasBin(args)) - ? parser.BINARY_EVENT - : parser.EVENT, - data: args - }; - - // access last argument to see if it's an ACK callback - if (typeof args[args.length - 1] === "function") { - if (this._rooms.length || this.flags.broadcast) { - throw new Error("Callbacks are not supported when broadcasting"); - } + in(name) { + if (!~this._rooms.indexOf(name)) this._rooms.push(name); + return this; + } - debug("emitting packet with ack id %d", this.nsp.ids); - this.acks[this.nsp.ids] = args.pop(); - packet.id = this.nsp.ids++; + /** + * Sends a `message` event. + * + * @return {Socket} self + * @api public + */ + send() { + const args = Array.prototype.slice.call(arguments); + args.unshift("message"); + this.emit.apply(this, args); + return this; } - var rooms = this._rooms.slice(0); - var flags = Object.assign({}, this.flags); + write() { + const args = Array.prototype.slice.call(arguments); + args.unshift("message"); + this.emit.apply(this, args); + return this; + } - // reset flags - this._rooms = []; - this.flags = {}; + /** + * Writes a packet. + * + * @param {Object} packet object + * @param {Object} opts options + * @api private + */ + packet(packet, opts) { + packet.nsp = this.nsp.name; + opts = opts || {}; + opts.compress = false !== opts.compress; + this.client.packet(packet, opts); + } - if (rooms.length || flags.broadcast) { - this.adapter.broadcast(packet, { - except: [this.id], - rooms: rooms, - flags: flags + /** + * Joins a room. + * + * @param {String|Array} room or array of rooms + * @param {Function} fn optional, callback + * @return {Socket} self + * @api private + */ + join(rooms, fn) { + debug("joining room %s", rooms); + const self = this; + if (!Array.isArray(rooms)) { + rooms = [rooms]; + } + rooms = rooms.filter(function(room) { + return !self.rooms.hasOwnProperty(room); }); - } else { - // dispatch packet - this.packet(packet, flags); + if (!rooms.length) { + fn && fn(null); + return this; + } + this.adapter.addAll(this.id, rooms, function(err) { + if (err) return fn && fn(err); + debug("joined room %s", rooms); + rooms.forEach(function(room) { + self.rooms[room] = room; + }); + fn && fn(null); + }); + return this; } - return this; -}; - -/** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - * @api public - */ - -Socket.prototype.to = Socket.prototype.in = function(name) { - if (!~this._rooms.indexOf(name)) this._rooms.push(name); - return this; -}; - -/** - * Sends a `message` event. - * - * @return {Socket} self - * @api public - */ - -Socket.prototype.send = Socket.prototype.write = function() { - var args = Array.prototype.slice.call(arguments); - args.unshift("message"); - this.emit.apply(this, args); - return this; -}; - -/** - * Writes a packet. - * - * @param {Object} packet object - * @param {Object} opts options - * @api private - */ -Socket.prototype.packet = function(packet, opts) { - packet.nsp = this.nsp.name; - opts = opts || {}; - opts.compress = false !== opts.compress; - this.client.packet(packet, opts); -}; - -/** - * Joins a room. - * - * @param {String|Array} room or array of rooms - * @param {Function} fn optional, callback - * @return {Socket} self - * @api private - */ - -Socket.prototype.join = function(rooms, fn) { - debug("joining room %s", rooms); - var self = this; - if (!Array.isArray(rooms)) { - rooms = [rooms]; - } - rooms = rooms.filter(function(room) { - return !self.rooms.hasOwnProperty(room); - }); - if (!rooms.length) { - fn && fn(null); + /** + * Leaves a room. + * + * @param {String} room + * @param {Function} fn optional, callback + * @return {Socket} self + * @api private + */ + leave(room, fn) { + debug("leave room %s", room); + const self = this; + this.adapter.del(this.id, room, function(err) { + if (err) return fn && fn(err); + debug("left room %s", room); + delete self.rooms[room]; + fn && fn(null); + }); return this; } - this.adapter.addAll(this.id, rooms, function(err) { - if (err) return fn && fn(err); - debug("joined room %s", rooms); - rooms.forEach(function(room) { - self.rooms[room] = room; - }); - fn && fn(null); - }); - return this; -}; -/** - * Leaves a room. - * - * @param {String} room - * @param {Function} fn optional, callback - * @return {Socket} self - * @api private - */ - -Socket.prototype.leave = function(room, fn) { - debug("leave room %s", room); - var self = this; - this.adapter.del(this.id, room, function(err) { - if (err) return fn && fn(err); - debug("left room %s", room); - delete self.rooms[room]; - fn && fn(null); - }); - return this; -}; - -/** - * Leave all rooms. - * - * @api private - */ - -Socket.prototype.leaveAll = function() { - this.adapter.delAll(this.id); - this.rooms = {}; -}; - -/** - * Called by `Namespace` upon successful - * middleware execution (ie: authorization). - * Socket is added to namespace array before - * call to join, so adapters can access it. - * - * @api private - */ + /** + * Leave all rooms. + * + * @api private + */ + leaveAll() { + this.adapter.delAll(this.id); + this.rooms = {}; + } -Socket.prototype.onconnect = function() { - debug("socket connected - writing packet"); - this.nsp.connected[this.id] = this; - this.join(this.id); - var skip = this.nsp.name === "/" && this.nsp.fns.length === 0; - if (skip) { - debug("packet already sent in initial handshake"); - } else { - this.packet({ type: parser.CONNECT }); + /** + * Called by `Namespace` upon successful + * middleware execution (ie: authorization). + * Socket is added to namespace array before + * call to join, so adapters can access it. + * + * @api private + */ + onconnect() { + debug("socket connected - writing packet"); + this.nsp.connected[this.id] = this; + this.join(this.id); + const skip = this.nsp.name === "/" && this.nsp.fns.length === 0; + if (skip) { + debug("packet already sent in initial handshake"); + } else { + this.packet({ type: parser.CONNECT }); + } } -}; -/** - * Called with each packet. Called by `Client`. - * - * @param {Object} packet - * @api private - */ + /** + * Called with each packet. Called by `Client`. + * + * @param {Object} packet + * @api private + */ + onpacket(packet) { + debug("got packet %j", packet); + switch (packet.type) { + case parser.EVENT: + this.onevent(packet); + break; + + case parser.BINARY_EVENT: + this.onevent(packet); + break; + + case parser.ACK: + this.onack(packet); + break; + + case parser.BINARY_ACK: + this.onack(packet); + break; + + case parser.DISCONNECT: + this.ondisconnect(); + break; + + case parser.ERROR: + this.onerror(new Error(packet.data)); + } + } -Socket.prototype.onpacket = function(packet) { - debug("got packet %j", packet); - switch (packet.type) { - case parser.EVENT: - this.onevent(packet); - break; + /** + * Called upon event packet. + * + * @param {Object} packet object + * @api private + */ + onevent(packet) { + const args = packet.data || []; + debug("emitting event %j", args); + + if (null != packet.id) { + debug("attaching ack callback to event"); + args.push(this.ack(packet.id)); + } - case parser.BINARY_EVENT: - this.onevent(packet); - break; + this.dispatch(args); + } - case parser.ACK: - this.onack(packet); - break; + /** + * Produces an ack callback to emit with an event. + * + * @param {Number} id packet id + * @api private + */ + ack(id) { + const self = this; + let sent = false; + return function() { + // prevent double callbacks + if (sent) return; + const args = Array.prototype.slice.call(arguments); + debug("sending ack %j", args); + + self.packet({ + id: id, + type: hasBin(args) ? parser.BINARY_ACK : parser.ACK, + data: args + }); + + sent = true; + }; + } - case parser.BINARY_ACK: - this.onack(packet); - break; + /** + * Called upon ack packet. + * + * @api private + */ + onack(packet) { + const ack = this.acks[packet.id]; + if ("function" == typeof ack) { + debug("calling ack %s with %j", packet.id, packet.data); + ack.apply(this, packet.data); + delete this.acks[packet.id]; + } else { + debug("bad ack %s", packet.id); + } + } - case parser.DISCONNECT: - this.ondisconnect(); - break; + /** + * Called upon client disconnect packet. + * + * @api private + */ + ondisconnect() { + debug("got disconnect packet"); + this.onclose("client namespace disconnect"); + } - case parser.ERROR: - this.onerror(new Error(packet.data)); + /** + * Handles a client error. + * + * @api private + */ + onerror(err) { + if (this.listeners("error").length) { + this.emit("error", err); + } else { + console.error("Missing error handler on `socket`."); + console.error(err.stack); + } } -}; -/** - * Called upon event packet. - * - * @param {Object} packet object - * @api private - */ + /** + * Called upon closing. Called by `Client`. + * + * @param {String} reason + * @throw {Error} optional error object + * @api private + */ + onclose(reason) { + if (!this.connected) return this; + debug("closing socket - reason %s", reason); + this.emit("disconnecting", reason); + this.leaveAll(); + this.nsp.remove(this); + this.client.remove(this); + this.connected = false; + this.disconnected = true; + delete this.nsp.connected[this.id]; + this.emit("disconnect", reason); + } -Socket.prototype.onevent = function(packet) { - var args = packet.data || []; - debug("emitting event %j", args); + /** + * Produces an `error` packet. + * + * @param {Object} err error object + * @api private + */ + error(err) { + this.packet({ type: parser.ERROR, data: err }); + } - if (null != packet.id) { - debug("attaching ack callback to event"); - args.push(this.ack(packet.id)); + /** + * Disconnects this client. + * + * @param {Boolean} close if `true`, closes the underlying connection + * @return {Socket} self + * @api public + */ + disconnect(close) { + if (!this.connected) return this; + if (close) { + this.client.disconnect(); + } else { + this.packet({ type: parser.DISCONNECT }); + this.onclose("server namespace disconnect"); + } + return this; } - this.dispatch(args); -}; + /** + * Sets the compress flag. + * + * @param {Boolean} compress if `true`, compresses the sending data + * @return {Socket} self + * @api public + */ + compress(compress) { + this.flags.compress = compress; + return this; + } -/** - * Produces an ack callback to emit with an event. - * - * @param {Number} id packet id - * @api private - */ + /** + * Sets the binary flag + * + * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + * @api public + */ + binary(binary) { + this.flags.binary = binary; + return this; + } -Socket.prototype.ack = function(id) { - var self = this; - var sent = false; - return function() { - // prevent double callbacks - if (sent) return; - var args = Array.prototype.slice.call(arguments); - debug("sending ack %j", args); - - self.packet({ - id: id, - type: hasBin(args) ? parser.BINARY_ACK : parser.ACK, - data: args + /** + * Dispatch incoming event to socket listeners. + * + * @param {Array} event that will get emitted + * @api private + */ + dispatch(event) { + debug("dispatching an event %j", event); + this.run(event, err => { + process.nextTick(() => { + if (err) { + return this.error(err.data || err.message); + } + super.emit.apply(this, event); + }); }); - - sent = true; - }; -}; - -/** - * Called upon ack packet. - * - * @api private - */ - -Socket.prototype.onack = function(packet) { - var ack = this.acks[packet.id]; - if ("function" == typeof ack) { - debug("calling ack %s with %j", packet.id, packet.data); - ack.apply(this, packet.data); - delete this.acks[packet.id]; - } else { - debug("bad ack %s", packet.id); } -}; - -/** - * Called upon client disconnect packet. - * - * @api private - */ - -Socket.prototype.ondisconnect = function() { - debug("got disconnect packet"); - this.onclose("client namespace disconnect"); -}; - -/** - * Handles a client error. - * - * @api private - */ -Socket.prototype.onerror = function(err) { - if (this.listeners("error").length) { - this.emit("error", err); - } else { - console.error("Missing error handler on `socket`."); - console.error(err.stack); + /** + * Sets up socket middleware. + * + * @param {Function} middleware function (event, next) + * @return {Socket} self + * @api public + */ + use(fn) { + this.fns.push(fn); + return this; } -}; -/** - * Called upon closing. Called by `Client`. - * - * @param {String} reason - * @throw {Error} optional error object - * @api private - */ - -Socket.prototype.onclose = function(reason) { - if (!this.connected) return this; - debug("closing socket - reason %s", reason); - this.emit("disconnecting", reason); - this.leaveAll(); - this.nsp.remove(this); - this.client.remove(this); - this.connected = false; - this.disconnected = true; - delete this.nsp.connected[this.id]; - this.emit("disconnect", reason); -}; - -/** - * Produces an `error` packet. - * - * @param {Object} err error object - * @api private - */ - -Socket.prototype.error = function(err) { - this.packet({ type: parser.ERROR, data: err }); -}; - -/** - * Disconnects this client. - * - * @param {Boolean} close if `true`, closes the underlying connection - * @return {Socket} self - * @api public - */ + /** + * Executes the middleware for an incoming event. + * + * @param {Array} event that will get emitted + * @param {Function} last fn call in the middleware + * @api private + */ + run(event, fn) { + const fns = this.fns.slice(0); + if (!fns.length) return fn(null); + + function run(i) { + fns[i](event, function(err) { + // upon error, short-circuit + if (err) return fn(err); + + // if no middleware left, summon callback + if (!fns[i + 1]) return fn(null); + + // go on to next + run(i + 1); + }); + } -Socket.prototype.disconnect = function(close) { - if (!this.connected) return this; - if (close) { - this.client.disconnect(); - } else { - this.packet({ type: parser.DISCONNECT }); - this.onclose("server namespace disconnect"); + run(0); } - return this; -}; - -/** - * Sets the compress flag. - * - * @param {Boolean} compress if `true`, compresses the sending data - * @return {Socket} self - * @api public - */ - -Socket.prototype.compress = function(compress) { - this.flags.compress = compress; - return this; -}; - -/** - * Sets the binary flag - * - * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - * @api public - */ - -Socket.prototype.binary = function(binary) { - this.flags.binary = binary; - return this; -}; -/** - * Dispatch incoming event to socket listeners. - * - * @param {Array} event that will get emitted - * @api private - */ - -Socket.prototype.dispatch = function(event) { - debug("dispatching an event %j", event); - var self = this; - function dispatchSocket(err) { - process.nextTick(function() { - if (err) { - return self.error(err.data || err.message); - } - emit.apply(self, event); - }); + get request() { + return this.conn.request; } - this.run(event, dispatchSocket); -}; - -/** - * Sets up socket middleware. - * - * @param {Function} middleware function (event, next) - * @return {Socket} self - * @api public - */ - -Socket.prototype.use = function(fn) { - this.fns.push(fn); - return this; -}; +} /** - * Executes the middleware for an incoming event. - * - * @param {Array} event that will get emitted - * @param {Function} last fn call in the middleware - * @api private + * Apply flags from `Socket`. */ -Socket.prototype.run = function(event, fn) { - var fns = this.fns.slice(0); - if (!fns.length) return fn(null); - - function run(i) { - fns[i](event, function(err) { - // upon error, short-circuit - if (err) return fn(err); - // if no middleware left, summon callback - if (!fns[i + 1]) return fn(null); - - // go on to next - run(i + 1); - }); - } +flags.forEach(function(flag) { + Object.defineProperty(Socket.prototype, flag, { + get: function() { + this.flags[flag] = true; + return this; + } + }); +}); - run(0); -}; +module.exports = Socket; From af165ae1c2d998e69e97465923a1531a29285c4f Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Sat, 19 Sep 2020 03:01:19 +0200 Subject: [PATCH 321/494] docs: adjusting Sauce Labs name (#3578) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 18f8be7ee0..dd2dc4afb4 100644 --- a/Readme.md +++ b/Readme.md @@ -64,7 +64,7 @@ io.on('connection', socket => { #### Cross-browser -Browser support is tested in Saucelabs: +Browser support is tested in Sauce Labs: [![Sauce Test Status](https://saucelabs.com/browser-matrix/socket.svg)](https://saucelabs.com/u/socket) From a5581a978979ff2c2c53dacdc931e7025c5d6adb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 25 Sep 2020 01:20:09 +0200 Subject: [PATCH 322/494] refactor: migrate to TypeScript --- .eslintrc.json | 4 - lib/{client.js => client.ts} | 88 +++--- lib/{index.js => index.ts} | 175 ++++++----- lib/{namespace.js => namespace.ts} | 165 +++++----- ...arent-namespace.js => parent-namespace.ts} | 19 +- lib/{socket.js => socket.ts} | 293 +++++++++++------- package-lock.json | 12 + package.json | 16 +- test/socket.io.js | 59 +--- tsconfig.json | 13 + 10 files changed, 462 insertions(+), 382 deletions(-) delete mode 100644 .eslintrc.json rename lib/{client.js => client.ts} (81%) rename lib/{index.js => index.ts} (80%) rename lib/{namespace.js => namespace.ts} (58%) rename lib/{parent-namespace.js => parent-namespace.ts} (68%) rename lib/{socket.js => socket.ts} (63%) create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 082c0cb598..0000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "prettier", - "parser": "babel-eslint" -} diff --git a/lib/client.js b/lib/client.ts similarity index 81% rename from lib/client.js rename to lib/client.ts index 069ad07f2a..0bc4a52c23 100644 --- a/lib/client.js +++ b/lib/client.ts @@ -1,34 +1,51 @@ -const parser = require("socket.io-parser"); -const debug = require("debug")("socket.io:client"); -const url = require("url"); +import parser from "socket.io-parser"; +import url from "url"; +import debugModule = require("debug"); +import { IncomingMessage } from "http"; +import { Server } from "./index"; +import { Socket } from "./socket"; + +const debug = debugModule("socket.io:client"); + +export class Client { + public readonly conn; + /** @package */ + public readonly id: string; + + private readonly server; + private readonly encoder; + private readonly decoder; + private sockets: object = {}; + private nsps: object = {}; + private connectBuffer: Array = []; -class Client { /** * Client constructor. * * @param {Server} server instance * @param {Socket} conn - * @api private + * @package */ - constructor(server, conn) { + constructor(server: Server, conn) { this.server = server; this.conn = conn; this.encoder = server.encoder; this.decoder = new server.parser.Decoder(); this.id = conn.id; - this.request = conn.request; this.setup(); - this.sockets = {}; - this.nsps = {}; - this.connectBuffer = []; + } + + /** + * @return the reference to the request that originated the Engine.IO connection + */ + public get request(): IncomingMessage { + return this.conn.request; } /** * Sets up event listeners. - * - * @api private */ - setup() { + private setup() { this.onclose = this.onclose.bind(this); this.ondata = this.ondata.bind(this); this.onerror = this.onerror.bind(this); @@ -45,9 +62,9 @@ class Client { * * @param {String} name namespace * @param {Object} query the query parameters - * @api private + * @package */ - connect(name, query) { + public connect(name, query = {}) { if (this.server.nsps[name]) { debug("connecting to namespace %s", name); return this.doConnect(name, query); @@ -73,9 +90,8 @@ class Client { * * @param {String} name namespace * @param {String} query the query parameters - * @api private */ - doConnect(name, query) { + private doConnect(name, query) { const nsp = this.server.of(name); if ("/" != name && !this.nsps["/"]) { @@ -98,9 +114,9 @@ class Client { /** * Disconnects from all namespaces and closes transport. * - * @api private + * @package */ - disconnect() { + public disconnect() { for (const id in this.sockets) { if (this.sockets.hasOwnProperty(id)) { this.sockets[id].disconnect(); @@ -113,9 +129,9 @@ class Client { /** * Removes a socket. Called by each `Socket`. * - * @api private + * @package */ - remove(socket) { + public remove(socket: Socket) { if (this.sockets.hasOwnProperty(socket.id)) { const nsp = this.sockets[socket.id].nsp.name; delete this.sockets[socket.id]; @@ -127,10 +143,8 @@ class Client { /** * Closes the underlying connection. - * - * @api private */ - close() { + private close() { if ("open" == this.conn.readyState) { debug("forcing transport close"); this.conn.close(); @@ -143,9 +157,9 @@ class Client { * * @param {Object} packet object * @param {Object} opts - * @api private + * @package */ - packet(packet, opts) { + public packet(packet, opts?) { opts = opts || {}; const self = this; @@ -173,10 +187,8 @@ class Client { /** * Called with incoming transport data. - * - * @api private */ - ondata(data) { + private ondata(data) { // try/catch is needed for protocol violations (GH-1880) try { this.decoder.add(data); @@ -187,10 +199,8 @@ class Client { /** * Called when parser fully decodes a packet. - * - * @api private */ - ondecoded(packet) { + private ondecoded(packet) { if (parser.CONNECT == packet.type) { this.connect( url.parse(packet.nsp).pathname, @@ -212,9 +222,8 @@ class Client { * Handles an error. * * @param {Object} err object - * @api private */ - onerror(err) { + private onerror(err) { for (const id in this.sockets) { if (this.sockets.hasOwnProperty(id)) { this.sockets[id].onerror(err); @@ -226,10 +235,9 @@ class Client { /** * Called upon transport close. * - * @param {String} reason - * @api private + * @param reason */ - onclose(reason) { + private onclose(reason: string) { debug("client close with reason %s", reason); // ignore a potential subsequent `close` event @@ -248,15 +256,11 @@ class Client { /** * Cleans up event listeners. - * - * @api private */ - destroy() { + private destroy() { this.conn.removeListener("data", this.ondata); this.conn.removeListener("error", this.onerror); this.conn.removeListener("close", this.onclose); this.decoder.removeListener("decoded", this.ondecoded); } } - -module.exports = Client; diff --git a/lib/index.js b/lib/index.ts similarity index 80% rename from lib/index.js rename to lib/index.ts index af99c2cfa1..7c7d28101e 100644 --- a/lib/index.js +++ b/lib/index.ts @@ -1,17 +1,20 @@ -const http = require("http"); -const read = require("fs").readFileSync; -const path = require("path"); -const exists = require("fs").existsSync; -const engine = require("engine.io"); +import http from "http"; +import { readFileSync as read, existsSync as exists } from "fs"; +import path from "path"; +import engine from "engine.io"; +import { Client } from "./client"; +import { EventEmitter } from "events"; +import { Namespace } from "./namespace"; +import { ParentNamespace } from "./parent-namespace"; +import Adapter from "socket.io-adapter"; +import parser from "socket.io-parser"; +import url from "url"; +import debugModule from "debug"; +import { Socket } from "./socket"; + +const debug = debugModule("socket.io:server"); + const clientVersion = require("socket.io-client/package.json").version; -const Client = require("./client"); -const EventEmitter = require("events"); -const Namespace = require("./namespace"); -const ParentNamespace = require("./parent-namespace"); -const Adapter = require("socket.io-adapter"); -const parser = require("socket.io-parser"); -const debug = require("debug")("socket.io:server"); -const url = require("url"); /** * Socket.IO client source. @@ -21,22 +24,44 @@ let clientSource = undefined; let clientSourceMap = undefined; class Server extends EventEmitter { + public readonly sockets: Namespace; + + /** @package */ + public readonly parser; + /** @package */ + public readonly encoder; + + private nsps: object = {}; + private parentNsps: Map< + | string + | RegExp + | (( + name: string, + query: object, + fn: (err: Error, success: boolean) => void + ) => void), + ParentNamespace + > = new Map(); + private _adapter; + private _origins; + private _serveClient: boolean; + private eio; + private engine; + private _path: string; + private httpServer: http.Server; + /** * Server constructor. * * @param {http.Server|Number|Object} srv http server, port or options * @param {Object} [opts] - * @api public */ - constructor(srv, opts) { + constructor(srv, opts: any = {}) { super(); if ("object" == typeof srv && srv instanceof Object && !srv.listen) { opts = srv; srv = null; } - opts = opts || {}; - this.nsps = {}; - this.parentNsps = new Map(); this.path(opts.path || "/socket.io"); this.serveClient(false !== opts.serveClient); this.parser = opts.parser || parser; @@ -53,7 +78,10 @@ class Server extends EventEmitter { * @param {http.IncomingMessage} req request * @param {Function} fn callback to be called with the result: `fn(err, success)` */ - checkRequest(req, fn) { + private checkRequest( + req: http.IncomingMessage, + fn: (err: Error, success: boolean) => void + ) { let origin = req.headers.origin || req.headers.referer; // file:// URLs produce a null Origin which can't be authorized via echo-back @@ -64,7 +92,7 @@ class Server extends EventEmitter { if (this._origins.indexOf("*:*") !== -1) return fn(null, true); if (origin) { try { - const parts = url.parse(origin); + const parts: any = url.parse(origin); const defaultPort = "https:" == parts.protocol ? 443 : 80; parts.port = parts.port != null ? parts.port : defaultPort; const ok = @@ -84,11 +112,10 @@ class Server extends EventEmitter { /** * Sets/gets whether client code is being served. * - * @param {Boolean} v whether to serve client code + * @param {Boolean} v - whether to serve client code * @return {Server|Boolean} self when setting or value when getting - * @api public */ - serveClient(v) { + public serveClient(v?: boolean) { if (!arguments.length) return this._serveClient; this._serveClient = v; const resolvePath = function(file) { @@ -117,11 +144,10 @@ class Server extends EventEmitter { /** * Backwards compatibility. - * - * @api public */ - set(key, val) { + public set(key, val) { if ("authorization" == key && val) { + // @ts-ignore this.use(function(socket, next) { val(socket.request, function(err, authorized) { if (err) return next(new Error(err)); @@ -145,12 +171,17 @@ class Server extends EventEmitter { /** * Executes the middleware for an incoming namespace not already created on the server. * - * @param {String} name name of incoming namespace - * @param {Object} query the query parameters - * @param {Function} fn callback - * @api private + * @param {String} name - name of incoming namespace + * @param {Object} query - the query parameters + * @param {Function} fn - callback + * + * @package */ - checkNamespace(name, query, fn) { + public checkNamespace( + name: string, + query: object, + fn: (nsp: Namespace | boolean) => void + ) { if (this.parentNsps.size === 0) return fn(false); const keysIterator = this.parentNsps.keys(); @@ -177,9 +208,8 @@ class Server extends EventEmitter { * * @param {String} v pathname * @return {Server|String} self when setting or value when getting - * @api public */ - path(v) { + public path(v?: string) { if (!arguments.length) return this._path; this._path = v.replace(/\/$/, ""); return this; @@ -190,9 +220,8 @@ class Server extends EventEmitter { * * @param {Adapter} v pathname * @return {Server|Adapter} self when setting or value when getting - * @api public */ - adapter(v) { + public adapter(v) { if (!arguments.length) return this._adapter; this._adapter = v; for (const i in this.nsps) { @@ -208,9 +237,8 @@ class Server extends EventEmitter { * * @param {String|String[]} v origins * @return {Server|Adapter} self when setting or value when getting - * @api public */ - origins(v) { + public origins(v) { if (!arguments.length) return this._origins; this._origins = v; @@ -220,12 +248,11 @@ class Server extends EventEmitter { /** * Attaches socket.io to a server or port. * - * @param {http.Server|Number} server or port - * @param {Object} options passed to engine.io + * @param {http.Server|Number} srv - server or port + * @param {Object} opts - options passed to engine.io * @return {Server} self - * @api public */ - listen(srv, opts) { + public listen(srv: http.Server | number, opts: any = {}): Server { if ("function" == typeof srv) { const msg = "You are trying to attach socket.io to an express " + @@ -241,7 +268,7 @@ class Server extends EventEmitter { if ("number" == typeof srv) { debug("creating http server and binding to %d", srv); const port = srv; - srv = http.Server(function(req, res) { + srv = http.createServer((req, res) => { res.writeHead(404); res.end(); }); @@ -249,7 +276,6 @@ class Server extends EventEmitter { } // set engine.io path to `/socket.io` - opts = opts || {}; opts.path = opts.path || this.path(); // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); @@ -271,7 +297,7 @@ class Server extends EventEmitter { return this; } - attach(srv, opts) { + public attach(srv, opts) { if ("function" == typeof srv) { const msg = "You are trying to attach socket.io to an express " + @@ -287,7 +313,7 @@ class Server extends EventEmitter { if ("number" == typeof srv) { debug("creating http server and binding to %d", srv); const port = srv; - srv = http.Server(function(req, res) { + srv = http.createServer((req, res) => { res.writeHead(404); res.end(); }); @@ -321,9 +347,8 @@ class Server extends EventEmitter { * Initialize engine * * @param {Object} options passed to engine.io - * @api private */ - initEngine(srv, opts) { + private initEngine(srv, opts) { // initialize engine debug("creating engine.io instance with opts %j", opts); this.eio = engine.attach(srv, opts); @@ -342,9 +367,8 @@ class Server extends EventEmitter { * Attaches the static file serving. * * @param {Function|http.Server} srv http server - * @api private */ - attachServe(srv) { + private attachServe(srv) { debug("attaching client serving req handler"); const url = this._path + "/socket.io.js"; const urlMap = this._path + "/socket.io.js.map"; @@ -367,11 +391,10 @@ class Server extends EventEmitter { /** * Handles a request serving `/socket.io.js` * - * @param {http.Request} req - * @param {http.Response} res - * @api private + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res */ - serve(req, res) { + private serve(req: http.IncomingMessage, res: http.ServerResponse) { // Per the standard, ETags must be quoted: // https://tools.ietf.org/html/rfc7232#section-2.3 const expectedEtag = '"' + clientVersion + '"'; @@ -397,11 +420,10 @@ class Server extends EventEmitter { /** * Handles a request serving `/socket.io.js.map` * - * @param {http.Request} req - * @param {http.Response} res - * @api private + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res */ - serveMap(req, res) { + private serveMap(req: http.IncomingMessage, res: http.ServerResponse) { // Per the standard, ETags must be quoted: // https://tools.ietf.org/html/rfc7232#section-2.3 const expectedEtag = '"' + clientVersion + '"'; @@ -428,9 +450,8 @@ class Server extends EventEmitter { * * @param {engine.Server} engine engine.io (or compatible) server * @return {Server} self - * @api public */ - bind(engine) { + public bind(engine): Server { this.engine = engine; this.engine.on("connection", this.onconnection.bind(this)); return this; @@ -441,9 +462,8 @@ class Server extends EventEmitter { * * @param {engine.Socket} conn * @return {Server} self - * @api public */ - onconnection(conn) { + public onconnection(conn): Server { debug("incoming connection with id %s", conn.id); const client = new Client(this, conn); client.connect("/"); @@ -455,9 +475,18 @@ class Server extends EventEmitter { * * @param {String|RegExp|Function} name nsp name * @param {Function} [fn] optional, nsp `connection` ev handler - * @api public */ - of(name, fn) { + public of( + name: + | string + | RegExp + | (( + name: string, + query: object, + fn: (err: Error, success: boolean) => void + ) => void), + fn?: (socket: Socket) => void + ) { if (typeof name === "function" || name instanceof RegExp) { const parentNsp = new ParentNamespace(this); debug("initializing parent namespace %s", parentNsp.name); @@ -465,11 +494,14 @@ class Server extends EventEmitter { this.parentNsps.set(name, parentNsp); } else { this.parentNsps.set( - (nsp, conn, next) => next(null, name.test(nsp)), + (nsp, conn, next) => next(null, (name as RegExp).test(nsp)), parentNsp ); } - if (fn) parentNsp.on("connect", fn); + if (fn) { + // @ts-ignore + parentNsp.on("connect", fn); + } return parentNsp; } @@ -489,9 +521,8 @@ class Server extends EventEmitter { * Closes server connection * * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed - * @api public */ - close(fn) { + public close(fn: (err?: Error) => void): void { for (const id in this.nsps["/"].sockets) { if (this.nsps["/"].sockets.hasOwnProperty(id)) { this.nsps["/"].sockets[id].onclose(); @@ -547,10 +578,6 @@ emitterMethods }); }); -/** - * BC with `io.listen` - */ - -Server.listen = Server; - -module.exports = (srv, opts) => new Server(srv, opts); +export { Server, Namespace, ParentNamespace, Client }; +export * from "./socket"; +module.exports = (srv?, opts?) => new Server(srv, opts); diff --git a/lib/namespace.js b/lib/namespace.ts similarity index 58% rename from lib/namespace.js rename to lib/namespace.ts index dbee7c540c..665a7e99d4 100644 --- a/lib/namespace.js +++ b/lib/namespace.ts @@ -1,43 +1,52 @@ -const Socket = require("./socket"); -const EventEmitter = require("events").EventEmitter; -const parser = require("socket.io-parser"); -const hasBin = require("has-binary2"); -const debug = require("debug")("socket.io:namespace"); +import { Socket } from "./socket"; +import { Server } from "./index"; +import { Client } from "./client"; +import { EventEmitter } from "events"; +import parser from "socket.io-parser"; +import hasBin from "has-binary2"; +import debugModule from "debug"; + +const debug = debugModule("socket.io:namespace"); /** * Blacklisted events. */ -exports.events = [ +const events = [ "connect", // for symmetry with client "connection", "newListener" ]; -/** - * Flags. - */ +export class Namespace extends EventEmitter { + public readonly name: string; + public readonly connected: object = {}; -exports.flags = ["json", "volatile", "local"]; + public adapter; + + /** @package */ + public readonly server; + /** @package */ + public fns: Array<(socket: Socket, next: (err: Error) => void) => void> = []; + /** @package */ + public rooms: Array = []; + /** @package */ + public flags: any = {}; + /** @package */ + public ids: number = 0; + + private readonly sockets: object = {}; -class Namespace extends EventEmitter { /** * Namespace constructor. * * @param {Server} server instance - * @param {Socket} name - * @api private + * @param {string} name */ - constructor(server, name) { + constructor(server: Server, name: string) { super(); - this.name = name; this.server = server; - this.sockets = {}; - this.connected = {}; - this.fns = []; - this.ids = 0; - this.rooms = []; - this.flags = {}; + this.name = name; this.initAdapter(); } @@ -45,10 +54,8 @@ class Namespace extends EventEmitter { * Initializes the `Adapter` for this nsp. * Run upon changing adapter by `Server#adapter` * in addition to the constructor. - * - * @api private */ - initAdapter() { + private initAdapter(): void { this.adapter = new (this.server.adapter())(this); } @@ -56,9 +63,10 @@ class Namespace extends EventEmitter { * Sets up namespace middleware. * * @return {Namespace} self - * @api public */ - use(fn) { + public use( + fn: (socket: Socket, next: (err: Error) => void) => void + ): Namespace { if (this.server.eio && this.name === "/") { debug("removing initial packet"); delete this.server.eio.initialPacket; @@ -70,11 +78,10 @@ class Namespace extends EventEmitter { /** * Executes the middleware for an incoming client. * - * @param {Socket} socket that will get added - * @param {Function} fn last fn call in the middleware - * @api private + * @param {Socket} socket - the socket that will get added + * @param {Function} fn - last fn call in the middleware */ - run(socket, fn) { + private run(socket: Socket, fn: (err: Error) => void) { const fns = this.fns.slice(0); if (!fns.length) return fn(null); @@ -99,14 +106,19 @@ class Namespace extends EventEmitter { * * @param {String} name * @return {Namespace} self - * @api public */ - to(name) { + public to(name: string): Namespace { if (!~this.rooms.indexOf(name)) this.rooms.push(name); return this; } - in(name) { + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + */ + public in(name: string): Namespace { if (!~this.rooms.indexOf(name)) this.rooms.push(name); return this; } @@ -115,16 +127,15 @@ class Namespace extends EventEmitter { * Adds a new client. * * @return {Socket} - * @api private */ - add(client, query, fn) { + private add(client: Client, query, fn?: () => void): Socket { debug("adding socket to nsp %s", this.name); const socket = new Socket(this, client, query); const self = this; - this.run(socket, function(err) { - process.nextTick(function() { + this.run(socket, err => { + process.nextTick(() => { if ("open" == client.conn.readyState) { - if (err) return socket.error(err.data || err.message); + if (err) return socket.error(err.message); // track socket self.sockets[socket.id] = socket; @@ -137,8 +148,8 @@ class Namespace extends EventEmitter { if (fn) fn(); // fire user-set events - self.emit("connect", socket); - self.emit("connection", socket); + super.emit("connect", socket); + super.emit("connection", socket); } else { debug("next called after client was closed - ignoring socket"); } @@ -150,9 +161,9 @@ class Namespace extends EventEmitter { /** * Removes a client. Called by each `Socket`. * - * @api private + * @package */ - remove(socket) { + public remove(socket: Socket): void { if (this.sockets.hasOwnProperty(socket.id)) { delete this.sockets[socket.id]; } else { @@ -164,10 +175,10 @@ class Namespace extends EventEmitter { * Emits to all clients. * * @return {Namespace} self - * @api public */ - emit(ev) { - if (~exports.events.indexOf(ev)) { + // @ts-ignore + public emit(ev): Namespace { + if (~events.indexOf(ev)) { super.emit.apply(this, arguments); return this; } @@ -205,17 +216,19 @@ class Namespace extends EventEmitter { * Sends a `message` event to all clients. * * @return {Namespace} self - * @api public */ - send() { - const args = Array.prototype.slice.call(arguments); + public send(...args): Namespace { args.unshift("message"); this.emit.apply(this, args); return this; } - write() { - const args = Array.prototype.slice.call(arguments); + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + public write(...args): Namespace { args.unshift("message"); this.emit.apply(this, args); return this; @@ -225,9 +238,8 @@ class Namespace extends EventEmitter { * Gets a list of clients. * * @return {Namespace} self - * @api public */ - clients(fn) { + public clients(fn: (clients: Array) => void): Namespace { if (!this.adapter) { throw new Error( "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" @@ -243,11 +255,10 @@ class Namespace extends EventEmitter { /** * Sets the compress flag. * - * @param {Boolean} compress if `true`, compresses the sending data - * @return {Socket} self - * @api public + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Namespace} self */ - compress(compress) { + public compress(compress: boolean): Namespace { this.flags.compress = compress; return this; } @@ -255,27 +266,33 @@ class Namespace extends EventEmitter { /** * Sets the binary flag * - * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - * @api public + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Namespace} self */ - binary(binary) { + public binary(binary: boolean): Namespace { this.flags.binary = binary; return this; } -} -/** - * Apply flags from `Socket`. - */ - -exports.flags.forEach(function(flag) { - Object.defineProperty(Namespace.prototype, flag, { - get: function() { - this.flags[flag] = true; - return this; - } - }); -}); + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Namespace} self + */ + public get volatile(): Namespace { + this.flags.volatile = true; + return this; + } -module.exports = Namespace; + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Namespace} self + */ + public get local(): Namespace { + this.flags.local = true; + return this; + } +} diff --git a/lib/parent-namespace.js b/lib/parent-namespace.ts similarity index 68% rename from lib/parent-namespace.js rename to lib/parent-namespace.ts index d76480e5b7..376c70ebc4 100644 --- a/lib/parent-namespace.js +++ b/lib/parent-namespace.ts @@ -1,18 +1,17 @@ -const Namespace = require("./namespace"); +import { Namespace } from "./namespace"; -let count = 0; +export class ParentNamespace extends Namespace { + private static count: number = 0; + private children: Set = new Set(); -class ParentNamespace extends Namespace { constructor(server) { - super(server, "/_" + count++); - this.children = new Set(); + super(server, "/_" + ParentNamespace.count++); } initAdapter() {} - emit() { - const args = Array.prototype.slice.call(arguments); - + // @ts-ignore + public emit(...args) { this.children.forEach(nsp => { nsp.rooms = this.rooms; nsp.flags = this.flags; @@ -26,9 +25,11 @@ class ParentNamespace extends Namespace { const namespace = new Namespace(this.server, name); namespace.fns = this.fns.slice(0); this.listeners("connect").forEach(listener => + // @ts-ignore namespace.on("connect", listener) ); this.listeners("connection").forEach(listener => + // @ts-ignore namespace.on("connection", listener) ); this.children.add(namespace); @@ -36,5 +37,3 @@ class ParentNamespace extends Namespace { return namespace; } } - -module.exports = ParentNamespace; diff --git a/lib/socket.js b/lib/socket.ts similarity index 63% rename from lib/socket.js rename to lib/socket.ts index 1677ef4f14..e0e68c256c 100644 --- a/lib/socket.js +++ b/lib/socket.ts @@ -1,16 +1,18 @@ -const EventEmitter = require("events"); -const parser = require("socket.io-parser"); -const hasBin = require("has-binary2"); -const url = require("url"); -const debug = require("debug")("socket.io:socket"); +import { EventEmitter } from "events"; +import parser from "socket.io-parser"; +import hasBin from "has-binary2"; +import url from "url"; +import debugModule from "debug"; +import { Client, Namespace, Server } from "./index"; +import { IncomingMessage } from "http"; + +const debug = debugModule("socket.io:socket"); /** * Blacklisted events. - * - * @api public */ -exports.events = [ +const events = [ "error", "connect", "disconnect", @@ -20,56 +22,102 @@ exports.events = [ ]; /** - * Flags. - * - * @api private + * The handshake details */ +export interface Handshake { + /** + * The headers sent as part of the handshake + */ + headers: object; + + /** + * The date of creation (as string) + */ + time: string; + + /** + * The ip of the client + */ + address: string; + + /** + * Whether the connection is cross-domain + */ + xdomain: boolean; + + /** + * Whether the connection is secure + */ + secure: boolean; + + /** + * The date of creation (as unix timestamp) + */ + issued: number; + + /** + * The request URL string + */ + url: string; + + /** + * The query object + */ + query: object; +} -const flags = ["json", "volatile", "broadcast", "local"]; +export class Socket extends EventEmitter { + public readonly id: string; + public readonly handshake: Handshake; + + public rooms = {}; + public connected: boolean; + public disconnected: boolean; + + private readonly server: Server; + private readonly adapter; + private acks: object = {}; + private fns: Array< + (event: Array, next: (err: Error) => void) => void + > = []; + private flags: any = {}; + private _rooms: Array = []; -class Socket extends EventEmitter { /** * Interface to a `Client` for a given `Namespace`. * * @param {Namespace} nsp * @param {Client} client - * @api public + * @param {Object} query + * @package */ - constructor(nsp, client, query) { + constructor(readonly nsp: Namespace, readonly client: Client, query) { super(); - this.nsp = nsp; this.server = nsp.server; this.adapter = this.nsp.adapter; this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; - this.client = client; - this.conn = client.conn; - this.rooms = {}; - this.acks = {}; this.connected = true; this.disconnected = false; this.handshake = this.buildHandshake(query); - this.fns = []; - this.flags = {}; - this._rooms = []; } /** * Builds the `handshake` BC object - * - * @api private */ - buildHandshake(query) { + private buildHandshake(query): Handshake { const self = this; function buildQuery() { const requestQuery = url.parse(self.request.url, true).query; //if socket-specific query exist, replace query strings in requestQuery return Object.assign({}, query, requestQuery); } + return { headers: this.request.headers, time: new Date() + "", address: this.conn.remoteAddress, xdomain: !!this.request.headers.origin, + // @ts-ignore secure: !!this.request.connection.encrypted, issued: +new Date(), url: this.request.url, @@ -81,16 +129,16 @@ class Socket extends EventEmitter { * Emits to this client. * * @return {Socket} self - * @api public */ - emit(ev) { - if (~exports.events.indexOf(ev)) { + // @ts-ignore + public emit(ev) { + if (~events.indexOf(ev)) { super.emit.apply(this, arguments); return this; } const args = Array.prototype.slice.call(arguments); - const packet = { + const packet: any = { type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) @@ -135,14 +183,19 @@ class Socket extends EventEmitter { * * @param {String} name * @return {Socket} self - * @api public */ - to(name) { + public to(name: string) { if (!~this._rooms.indexOf(name)) this._rooms.push(name); return this; } - in(name) { + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + */ + public in(name: string): Socket { if (!~this._rooms.indexOf(name)) this._rooms.push(name); return this; } @@ -151,17 +204,19 @@ class Socket extends EventEmitter { * Sends a `message` event. * * @return {Socket} self - * @api public */ - send() { - const args = Array.prototype.slice.call(arguments); + public send(...args): Socket { args.unshift("message"); this.emit.apply(this, args); return this; } - write() { - const args = Array.prototype.slice.call(arguments); + /** + * Sends a `message` event. + * + * @return {Socket} self + */ + public write(...args): Socket { args.unshift("message"); this.emit.apply(this, args); return this; @@ -170,13 +225,11 @@ class Socket extends EventEmitter { /** * Writes a packet. * - * @param {Object} packet object - * @param {Object} opts options - * @api private + * @param {Object} packet - packet object + * @param {Object} opts - options */ - packet(packet, opts) { + private packet(packet, opts: any = {}) { packet.nsp = this.nsp.name; - opts = opts || {}; opts.compress = false !== opts.compress; this.client.packet(packet, opts); } @@ -184,12 +237,11 @@ class Socket extends EventEmitter { /** * Joins a room. * - * @param {String|Array} room or array of rooms - * @param {Function} fn optional, callback + * @param {String|Array} rooms - room or array of rooms + * @param {Function} fn - optional, callback * @return {Socket} self - * @api private */ - join(rooms, fn) { + public join(rooms, fn?: (err: Error) => void): Socket { debug("joining room %s", rooms); const self = this; if (!Array.isArray(rooms)) { @@ -217,11 +269,10 @@ class Socket extends EventEmitter { * Leaves a room. * * @param {String} room - * @param {Function} fn optional, callback + * @param {Function} fn - optional, callback * @return {Socket} self - * @api private */ - leave(room, fn) { + public leave(room: string, fn?: (err: Error) => void): Socket { debug("leave room %s", room); const self = this; this.adapter.del(this.id, room, function(err) { @@ -235,10 +286,8 @@ class Socket extends EventEmitter { /** * Leave all rooms. - * - * @api private */ - leaveAll() { + private leaveAll(): void { this.adapter.delAll(this.id); this.rooms = {}; } @@ -249,9 +298,9 @@ class Socket extends EventEmitter { * Socket is added to namespace array before * call to join, so adapters can access it. * - * @api private + * @package */ - onconnect() { + public onconnect(): void { debug("socket connected - writing packet"); this.nsp.connected[this.id] = this; this.join(this.id); @@ -267,9 +316,9 @@ class Socket extends EventEmitter { * Called with each packet. Called by `Client`. * * @param {Object} packet - * @api private + * @package */ - onpacket(packet) { + public onpacket(packet) { debug("got packet %j", packet); switch (packet.type) { case parser.EVENT: @@ -300,10 +349,9 @@ class Socket extends EventEmitter { /** * Called upon event packet. * - * @param {Object} packet object - * @api private + * @param {Object} packet - packet object */ - onevent(packet) { + private onevent(packet): void { const args = packet.data || []; debug("emitting event %j", args); @@ -318,10 +366,9 @@ class Socket extends EventEmitter { /** * Produces an ack callback to emit with an event. * - * @param {Number} id packet id - * @api private + * @param {Number} id - packet id */ - ack(id) { + private ack(id: number) { const self = this; let sent = false; return function() { @@ -342,10 +389,8 @@ class Socket extends EventEmitter { /** * Called upon ack packet. - * - * @api private */ - onack(packet) { + private onack(packet): void { const ack = this.acks[packet.id]; if ("function" == typeof ack) { debug("calling ack %s with %j", packet.id, packet.data); @@ -358,22 +403,18 @@ class Socket extends EventEmitter { /** * Called upon client disconnect packet. - * - * @api private */ - ondisconnect() { + private ondisconnect(): void { debug("got disconnect packet"); this.onclose("client namespace disconnect"); } /** * Handles a client error. - * - * @api private */ - onerror(err) { + private onerror(err): void { if (this.listeners("error").length) { - this.emit("error", err); + super.emit("error", err); } else { console.error("Missing error handler on `socket`."); console.error(err.stack); @@ -385,39 +426,38 @@ class Socket extends EventEmitter { * * @param {String} reason * @throw {Error} optional error object - * @api private */ - onclose(reason) { + private onclose(reason: string) { if (!this.connected) return this; debug("closing socket - reason %s", reason); - this.emit("disconnecting", reason); + super.emit("disconnecting", reason); this.leaveAll(); this.nsp.remove(this); this.client.remove(this); this.connected = false; this.disconnected = true; delete this.nsp.connected[this.id]; - this.emit("disconnect", reason); + super.emit("disconnect", reason); } /** * Produces an `error` packet. * - * @param {Object} err error object - * @api private + * @param {Object} err - error object + * + * @package */ - error(err) { + public error(err) { this.packet({ type: parser.ERROR, data: err }); } /** * Disconnects this client. * - * @param {Boolean} close if `true`, closes the underlying connection + * @param {Boolean} close - if `true`, closes the underlying connection * @return {Socket} self - * @api public */ - disconnect(close) { + public disconnect(close = false): Socket { if (!this.connected) return this; if (close) { this.client.disconnect(); @@ -431,11 +471,10 @@ class Socket extends EventEmitter { /** * Sets the compress flag. * - * @param {Boolean} compress if `true`, compresses the sending data + * @param {Boolean} compress - if `true`, compresses the sending data * @return {Socket} self - * @api public */ - compress(compress) { + public compress(compress: boolean): Socket { this.flags.compress = compress; return this; } @@ -443,27 +482,58 @@ class Socket extends EventEmitter { /** * Sets the binary flag * - * @param {Boolean} Encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` * @return {Socket} self - * @api public */ - binary(binary) { + public binary(binary: boolean): Socket { this.flags.binary = binary; return this; } + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Socket} self + */ + public get volatile(): Socket { + this.flags.volatile = true; + return this; + } + + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the + * sender. + * + * @return {Socket} self + */ + public get broadcast(): Socket { + this.flags.broadcast = true; + return this; + } + + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Socket} self + */ + public get local(): Socket { + this.flags.local = true; + return this; + } + /** * Dispatch incoming event to socket listeners. * - * @param {Array} event that will get emitted - * @api private + * @param {Array} event - event that will get emitted */ - dispatch(event) { + private dispatch(event: Array): void { debug("dispatching an event %j", event); this.run(event, err => { process.nextTick(() => { if (err) { - return this.error(err.data || err.message); + return this.error(err.message); } super.emit.apply(this, event); }); @@ -473,11 +543,12 @@ class Socket extends EventEmitter { /** * Sets up socket middleware. * - * @param {Function} middleware function (event, next) + * @param {Function} fn - middleware function (event, next) * @return {Socket} self - * @api public */ - use(fn) { + public use( + fn: (event: Array, next: (err: Error) => void) => void + ): Socket { this.fns.push(fn); return this; } @@ -485,11 +556,10 @@ class Socket extends EventEmitter { /** * Executes the middleware for an incoming event. * - * @param {Array} event that will get emitted - * @param {Function} last fn call in the middleware - * @api private + * @param {Array} event - event that will get emitted + * @param {Function} fn - last fn call in the middleware */ - run(event, fn) { + private run(event: Array, fn: (err: Error) => void) { const fns = this.fns.slice(0); if (!fns.length) return fn(null); @@ -509,22 +579,11 @@ class Socket extends EventEmitter { run(0); } - get request() { - return this.conn.request; + public get request(): IncomingMessage { + return this.client.request; } -} - -/** - * Apply flags from `Socket`. - */ -flags.forEach(function(flag) { - Object.defineProperty(Socket.prototype, flag, { - get: function() { - this.flags[flag] = true; - return this; - } - }); -}); - -module.exports = Socket; + public get conn() { + return this.client.conn; + } +} diff --git a/package-lock.json b/package-lock.json index 7747e8a647..e63147468d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,6 +150,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/node": { + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -7004,6 +7010,12 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typescript": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "dev": true + }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", diff --git a/package.json b/package.json index 2230afef7b..949111cc02 100644 --- a/package.json +++ b/package.json @@ -11,20 +11,20 @@ "socket", "io" ], - "main": "./lib/index", "files": [ - "lib/" + "dist/" ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "license": "MIT", "repository": { "type": "git", "url": "git://github.com/socketio/socket.io" }, "scripts": { - "lint": "eslint lib/ test/", - "test": "npm run lint && npm run format:check && nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js", - "format:check": "prettier --check 'lib/**/*.js' 'test/**/*.js'", - "format:fix": "prettier --write 'lib/**/*.js' 'test/**/*.js'" + "test": "npm run format:check && tsc && nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js", + "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.js'", + "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.js'" }, "dependencies": { "debug": "~4.1.0", @@ -35,6 +35,7 @@ "socket.io-parser": "~3.4.0" }, "devDependencies": { + "@types/node": "^14.11.2", "babel-eslint": "^10.1.0", "eslint": "^7.9.0", "eslint-config-prettier": "^6.11.0", @@ -43,7 +44,8 @@ "nyc": "^11.2.1", "prettier": "^1.19.1", "superagent": "^3.8.2", - "supertest": "^3.0.0" + "supertest": "^3.0.0", + "typescript": "^4.0.3" }, "contributors": [ { diff --git a/test/socket.io.js b/test/socket.io.js index 35378b3b02..b7107e7d5a 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,7 +1,7 @@ "use strict"; var http = require("http").Server; -var io = require("../lib"); +var io = require(".."); var fs = require("fs"); var join = require("path").join; var exec = require("child_process").exec; @@ -465,8 +465,8 @@ describe("socket.io", function() { }); describe("namespaces", function() { - var Socket = require("../lib/socket"); - var Namespace = require("../lib/namespace"); + const { Socket } = require("../dist/socket"); + const { Namespace } = require("../dist/namespace"); it("should be accessible through .sockets", function() { var sio = io(); @@ -2246,7 +2246,7 @@ describe("socket.io", function() { }); describe("middleware", function(done) { - var Socket = require("../lib/socket"); + const { Socket } = require("../dist/socket"); it("should call functions", function(done) { var srv = http(); @@ -2293,27 +2293,6 @@ describe("socket.io", function() { }); }); - it("should pass `data` of error object", function(done) { - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next) { - var err = new Error("Authentication error"); - err.data = { a: "b", c: 3 }; - next(err); - }); - srv.listen(function() { - var socket = client(srv); - socket.on("connect", function() { - done(new Error("nope")); - }); - socket.on("error", function(err) { - expect(err).to.eql({ a: "b", c: 3 }); - done(); - }); - }); - }); - it("should only call connection after fns", function(done) { var srv = http(); var sio = io(srv); @@ -2436,7 +2415,7 @@ describe("socket.io", function() { }); describe("socket middleware", function(done) { - var Socket = require("../lib/socket"); + const { Socket } = require("../dist/socket"); it("should call functions", function(done) { var srv = http(); @@ -2498,33 +2477,5 @@ describe("socket.io", function() { }); }); }); - - it("should pass `data` of error object", function(done) { - var srv = http(); - var sio = io(srv); - - srv.listen(function() { - var clientSocket = client(srv, { multiplex: false }); - - clientSocket.emit("join", "woot"); - - clientSocket.on("error", function(err) { - expect(err).to.eql({ a: "b", c: 3 }); - done(); - }); - - sio.on("connection", function(socket) { - socket.use(function(event, next) { - var err = new Error("Authentication error"); - err.data = { a: "b", c: 3 }; - next(err); - }); - - socket.on("join", function() { - done(new Error("nope")); - }); - }); - }); - }); }); }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..68e03b91c1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "allowJs": true, + "target": "es2017", + "module": "commonjs", + "declaration": true, + "esModuleInterop": true + }, + "include": [ + "./lib/**/*" + ] +} From 2464de7d2bb94833994ba5bbc97e1a51245f9cc6 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 25 Sep 2020 23:47:23 +0200 Subject: [PATCH 323/494] refactor: use prettier to format tests --- test/fixtures/server-close.js | 12 +- test/socket.io.js | 1907 ++++++++++++++++----------------- 2 files changed, 951 insertions(+), 968 deletions(-) diff --git a/test/fixtures/server-close.js b/test/fixtures/server-close.js index e1963a885a..498416f46d 100644 --- a/test/fixtures/server-close.js +++ b/test/fixtures/server-close.js @@ -1,10 +1,10 @@ -var server = require("http").createServer(); -var ioc = require("socket.io-client"); -var io = require("../..")(server); +const server = require("http").createServer(); +const ioc = require("socket.io-client"); +const io = require("../..")(server); -var srv = server.listen(function() { - var socket = ioc("ws://localhost:" + server.address().port); - socket.on("connect", function() { +const srv = server.listen(() => { + const socket = ioc("ws://localhost:" + server.address().port); + socket.on("connect", () => { io.close(); socket.close(); }); diff --git a/test/socket.io.js b/test/socket.io.js index b7107e7d5a..bdbd829a5a 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -1,13 +1,13 @@ "use strict"; -var http = require("http").Server; -var io = require(".."); -var fs = require("fs"); -var join = require("path").join; -var exec = require("child_process").exec; -var ioc = require("socket.io-client"); -var request = require("supertest"); -var expect = require("expect.js"); +const http = require("http").Server; +const io = require(".."); +const fs = require("fs"); +const join = require("path").join; +const exec = require("child_process").exec; +const ioc = require("socket.io-client"); +const request = require("supertest"); +const expect = require("expect.js"); // Creates a socket.io client for the given server function client(srv, nsp, opts) { @@ -15,46 +15,46 @@ function client(srv, nsp, opts) { opts = nsp; nsp = null; } - var addr = srv.address(); + let addr = srv.address(); if (!addr) addr = srv.listen().address(); - var url = "ws://localhost:" + addr.port + (nsp || ""); + const url = "ws://localhost:" + addr.port + (nsp || ""); return ioc(url, opts); } -describe("socket.io", function() { - it.skip("should be the same version as client", function() { - var version = require("../package").version; +describe("socket.io", () => { + it.skip("should be the same version as client", () => { + const version = require("../package").version; expect(version).to.be(require("socket.io-client/package").version); }); - describe("set", function() { - it("should be able to set ping timeout to engine.io", function() { - var srv = io(http()); + describe("set", () => { + it("should be able to set ping timeout to engine.io", () => { + const srv = io(http()); srv.set("heartbeat timeout", 10); expect(srv.eio.pingTimeout).to.be(10); }); - it("should be able to set ping interval to engine.io", function() { - var srv = io(http()); + it("should be able to set ping interval to engine.io", () => { + const srv = io(http()); srv.set("heartbeat interval", 10); expect(srv.eio.pingInterval).to.be(10); }); - it("should be able to set transports to engine.io", function() { - var srv = io(http()); + it("should be able to set transports to engine.io", () => { + const srv = io(http()); srv.set("transports", ["polling"]); expect(srv.eio.transports).to.eql(["polling"]); }); - it("should be able to set maxHttpBufferSize to engine.io", function() { - var srv = io(http()); + it("should be able to set maxHttpBufferSize to engine.io", () => { + const srv = io(http()); srv.set("destroy buffer size", 10); expect(srv.eio.maxHttpBufferSize).to.eql(10); }); - it("should be able to set path with setting resource", function(done) { - var eio = io(); - var srv = http(); + it("should be able to set path with setting resource", done => { + const eio = io(); + const srv = http(); eio.set("resource", "/random"); eio.attach(srv); @@ -63,64 +63,64 @@ describe("socket.io", function() { request(srv) .get("/random/socket.io.js") .buffer(true) - .end(function(err, res) { + .end((err, res) => { if (err) return done(err); done(); }); }); - it("should be able to set origins to engine.io", function() { - var srv = io(http()); + it("should be able to set origins to engine.io", () => { + const srv = io(http()); srv.set("origins", "http://hostname.com:*"); expect(srv.origins()).to.be("http://hostname.com:*"); }); - it("should be able to set authorization and send error packet", function(done) { - var httpSrv = http(); - var srv = io(httpSrv); - srv.set("authorization", function(o, f) { + it("should be able to set authorization and send error packet", done => { + const httpSrv = http(); + const srv = io(httpSrv); + srv.set("authorization", (o, f) => { f(null, false); }); - var socket = client(httpSrv); - socket.on("connect", function() { + const socket = client(httpSrv); + socket.on("connect", () => { expect().fail(); }); - socket.on("error", function(err) { + socket.on("error", err => { expect(err).to.be("Not authorized"); done(); }); }); - it("should be able to set authorization and succeed", function(done) { - var httpSrv = http(); - var srv = io(httpSrv); - srv.set("authorization", function(o, f) { + it("should be able to set authorization and succeed", done => { + const httpSrv = http(); + const srv = io(httpSrv); + srv.set("authorization", (o, f) => { f(null, true); }); - srv.on("connection", function(s) { - s.on("yoyo", function(data) { + srv.on("connection", s => { + s.on("yoyo", data => { expect(data).to.be("data"); done(); }); }); - var socket = client(httpSrv); - socket.on("connect", function() { + const socket = client(httpSrv); + socket.on("connect", () => { socket.emit("yoyo", "data"); }); - socket.on("error", function(err) { + socket.on("error", err => { expect().fail(); }); }); - it("should set the handshake BC object", function(done) { - var httpSrv = http(); - var srv = io(httpSrv); + it("should set the handshake BC object", done => { + const httpSrv = http(); + const srv = io(httpSrv); - srv.on("connection", function(s) { + srv.on("connection", s => { expect(s.handshake).to.not.be(undefined); // Headers set and has some valid properties @@ -147,23 +147,23 @@ describe("socket.io", function() { done(); }); - var socket = client(httpSrv); + const socket = client(httpSrv); }); }); - describe("server attachment", function() { - describe("http.Server", function() { - var clientVersion = require("socket.io-client/package").version; + describe("server attachment", () => { + describe("http.Server", () => { + const clientVersion = require("socket.io-client/package").version; - it("should serve static files", function(done) { - var srv = http(); + it("should serve static files", done => { + const srv = http(); io(srv); request(srv) .get("/socket.io/socket.io.js") .buffer(true) - .end(function(err, res) { + .end((err, res) => { if (err) return done(err); - var ctype = res.headers["content-type"]; + const ctype = res.headers["content-type"]; expect(ctype).to.be("application/javascript"); expect(res.headers.etag).to.be('"' + clientVersion + '"'); expect(res.text).to.match(/engine\.io/); @@ -172,37 +172,37 @@ describe("socket.io", function() { }); }); - it("should handle 304", function(done) { - var srv = http(); + it("should handle 304", done => { + const srv = http(); io(srv); request(srv) .get("/socket.io/socket.io.js") .set("If-None-Match", '"' + clientVersion + '"') - .end(function(err, res) { + .end((err, res) => { if (err) return done(err); expect(res.statusCode).to.be(304); done(); }); }); - it("should not serve static files", function(done) { - var srv = http(); + it("should not serve static files", done => { + const srv = http(); io(srv, { serveClient: false }); request(srv) .get("/socket.io/socket.io.js") .expect(400, done); }); - it("should work with #attach", function(done) { - var srv = http(function(req, res) { + it("should work with #attach", done => { + const srv = http((req, res) => { res.writeHead(404); res.end(); }); - var sockets = io(); + const sockets = io(); sockets.attach(srv); request(srv) .get("/socket.io/socket.io.js") - .end(function(err, res) { + .end((err, res) => { if (err) return done(err); expect(res.status).to.be(200); done(); @@ -210,30 +210,30 @@ describe("socket.io", function() { }); }); - describe("port", function(done) { - it("should be bound", function(done) { - var sockets = io(54010); + describe("port", done => { + it("should be bound", done => { + const sockets = io(54010); request("http://localhost:54010/") .get("/socket.io/socket.io.js") .expect(200, done); }); - it("should be bound as a string", function(done) { - var sockets = io("54020"); + it("should be bound as a string", done => { + const sockets = io("54020"); request("http://localhost:54020/") .get("/socket.io/socket.io.js") .expect(200, done); }); - it("with listen", function(done) { - var sockets = io().listen(54011); + it("with listen", done => { + const sockets = io().listen(54011); request("http://localhost:54011/") .get("/socket.io/socket.io.js") .expect(200, done); }); - it("as a string", function(done) { - var sockets = io().listen("54012"); + it("as a string", done => { + const sockets = io().listen("54012"); request("http://localhost:54012/") .get("/socket.io/socket.io.js") .expect(200, done); @@ -241,47 +241,47 @@ describe("socket.io", function() { }); }); - describe("handshake", function() { - var request = require("superagent"); + describe("handshake", () => { + const request = require("superagent"); - it("should disallow request when origin defined and none specified", function(done) { - var sockets = io({ origins: "http://foo.example:*" }).listen("54013"); + it("should disallow request when origin defined and none specified", done => { + const sockets = io({ origins: "http://foo.example:*" }).listen("54013"); request .get("http://localhost:54013/socket.io/default/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(403); done(); }); }); - it("should disallow request when origin defined and a different one specified", function(done) { - var sockets = io({ origins: "http://foo.example:*" }).listen("54014"); + it("should disallow request when origin defined and a different one specified", done => { + const sockets = io({ origins: "http://foo.example:*" }).listen("54014"); request .get("http://localhost:54014/socket.io/default/") .query({ transport: "polling" }) .set("origin", "http://herp.derp/") - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(403); done(); }); }); - it("should allow request when origin defined an the same is specified", function(done) { - var sockets = io({ origins: "http://foo.example:*" }).listen("54015"); + it("should allow request when origin defined an the same is specified", done => { + const sockets = io({ origins: "http://foo.example:*" }).listen("54015"); request .get("http://localhost:54015/socket.io/default/") .set("origin", "http://foo.example/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); - it("should allow request when origin defined as function and same is supplied", function(done) { - var sockets = io({ - origins: function(origin, callback) { + it("should allow request when origin defined as function and same is supplied", done => { + const sockets = io({ + origins: (origin, callback) => { if (origin == "http://foo.example/") { return callback(null, true); } @@ -292,15 +292,15 @@ describe("socket.io", function() { .get("http://localhost:54016/socket.io/default/") .set("origin", "http://foo.example/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); - it("should allow request when origin defined as function and different is supplied", function(done) { - var sockets = io({ - origins: function(origin, callback) { + it("should allow request when origin defined as function and different is supplied", done => { + const sockets = io({ + origins: (origin, callback) => { if (origin == "http://foo.example/") { return callback(null, true); } @@ -311,15 +311,15 @@ describe("socket.io", function() { .get("http://localhost:54017/socket.io/default/") .set("origin", "http://herp.derp/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(403); done(); }); }); - it("should allow request when origin defined as function and no origin is supplied", function(done) { - var sockets = io({ - origins: function(origin, callback) { + it("should allow request when origin defined as function and no origin is supplied", done => { + const sockets = io({ + origins: (origin, callback) => { if (origin == "*") { return callback(null, true); } @@ -329,125 +329,123 @@ describe("socket.io", function() { request .get("http://localhost:54021/socket.io/default/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); - it("should default to port 443 when protocol is https", function(done) { - var sockets = io({ origins: "https://foo.example/" }).listen("54036"); + it("should default to port 443 when protocol is https", done => { + const sockets = io({ origins: "https://foo.example/" }).listen( + "54036" + ); request .get("http://localhost:54036/socket.io/default/") .set("origin", "https://foo.example/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); - it("should allow request if custom function in opts.allowRequest returns true", function(done) { - var sockets = io(http().listen(54022), { - allowRequest: function(req, callback) { - return callback(null, true); - }, + it("should allow request if custom function in opts.allowRequest returns true", done => { + const sockets = io(http().listen(54022), { + allowRequest: (req, callback) => callback(null, true), origins: "http://foo.example:*" }); request .get("http://localhost:54022/socket.io/default/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); - it("should disallow request if custom function in opts.allowRequest returns false", function(done) { - var sockets = io(http().listen(54023), { - allowRequest: function(req, callback) { - return callback(null, false); - } + it("should disallow request if custom function in opts.allowRequest returns false", done => { + const sockets = io(http().listen(54023), { + allowRequest: (req, callback) => callback(null, false) }); request .get("http://localhost:54023/socket.io/default/") .set("origin", "http://foo.example/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(403); done(); }); }); - it("should allow request when using an array of origins", function(done) { + it("should allow request when using an array of origins", done => { io({ origins: ["http://foo.example:54024/"] }).listen("54024"); request .get("http://localhost:54024/socket.io/default/") .set("origin", "http://foo.example:54024/") .query({ transport: "polling" }) - .end(function(err, res) { + .end((err, res) => { expect(res.status).to.be(200); done(); }); }); }); - describe("close", function() { - it("should be able to close sio sending a srv", function() { - var PORT = 54018; - var srv = http().listen(PORT); - var sio = io(srv); - var net = require("net"); - var server = net.createServer(); + describe("close", () => { + it("should be able to close sio sending a srv", () => { + const PORT = 54018; + const srv = http().listen(PORT); + const sio = io(srv); + const net = require("net"); + const server = net.createServer(); - var clientSocket = client(srv, { reconnection: false }); + const clientSocket = client(srv, { reconnection: false }); - clientSocket.on("disconnect", function init() { + clientSocket.on("disconnect", () => { expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); - clientSocket.on("connect", function init() { + clientSocket.on("connect", () => { expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); sio.close(); }); - server.once("listening", function() { + server.once("listening", () => { // PORT should be free - server.close(function(error) { + server.close(error => { expect(error).to.be(undefined); }); }); }); - it("should be able to close sio sending a port", function() { - var PORT = 54019; - var sio = io(PORT); - var net = require("net"); - var server = net.createServer(); + it("should be able to close sio sending a port", () => { + const PORT = 54019; + const sio = io(PORT); + const net = require("net"); + const server = net.createServer(); - var clientSocket = ioc("ws://0.0.0.0:" + PORT, { reconnection: false }); + const clientSocket = ioc("ws://0.0.0.0:" + PORT, { reconnection: false }); - clientSocket.on("disconnect", function init() { + clientSocket.on("disconnect", () => { expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); - clientSocket.on("connect", function init() { + clientSocket.on("connect", () => { expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); sio.close(); }); - server.once("listening", function() { + server.once("listening", () => { // PORT should be free - server.close(function(error) { + server.close(error => { expect(error).to.be(undefined); }); }); }); - describe("graceful close", function() { + describe("graceful close", () => { function fixture(filename) { return ( '"' + @@ -458,23 +456,23 @@ describe("socket.io", function() { ); } - it("should stop socket and timers", function(done) { + it("should stop socket and timers", done => { exec(fixture("server-close.js"), done); }); }); }); - describe("namespaces", function() { + describe("namespaces", () => { const { Socket } = require("../dist/socket"); const { Namespace } = require("../dist/namespace"); - it("should be accessible through .sockets", function() { - var sio = io(); + it("should be accessible through .sockets", () => { + const sio = io(); expect(sio.sockets).to.be.a(Namespace); }); - it("should be aliased", function() { - var sio = io(); + it("should be aliased", () => { + const sio = io(); expect(sio.use).to.be.a("function"); expect(sio.to).to.be.a("function"); expect(sio["in"]).to.be.a("function"); @@ -489,136 +487,136 @@ describe("socket.io", function() { delete sio.sockets.flags; }); - it("should automatically connect", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - socket.on("connect", function() { + it("should automatically connect", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + socket.on("connect", () => { done(); }); }); }); - it("should fire a `connection` event", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(socket) { + it("should fire a `connection` event", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", socket => { expect(socket).to.be.a(Socket); done(); }); }); }); - it("should fire a `connect` event", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connect", function(socket) { + it("should fire a `connect` event", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connect", socket => { expect(socket).to.be.a(Socket); done(); }); }); }); - it("should work with many sockets", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { + it("should work with many sockets", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { sio.of("/chat"); sio.of("/news"); - var chat = client(srv, "/chat"); - var news = client(srv, "/news"); - var total = 2; - chat.on("connect", function() { + const chat = client(srv, "/chat"); + const news = client(srv, "/news"); + let total = 2; + chat.on("connect", () => { --total || done(); }); - news.on("connect", function() { + news.on("connect", () => { --total || done(); }); }); }); - it('should be able to equivalently start with "" or "/" on server', function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; - sio.of("").on("connection", function() { + it('should be able to equivalently start with "" or "/" on server', done => { + const srv = http(); + const sio = io(srv); + let total = 2; + sio.of("").on("connection", () => { --total || done(); }); - sio.of("abc").on("connection", function() { + sio.of("abc").on("connection", () => { --total || done(); }); - var c1 = client(srv, "/"); - var c2 = client(srv, "/abc"); + const c1 = client(srv, "/"); + const c2 = client(srv, "/abc"); }); - it('should be equivalent for "" and "/" on client', function(done) { - var srv = http(); - var sio = io(srv); - sio.of("/").on("connection", function() { + it('should be equivalent for "" and "/" on client', done => { + const srv = http(); + const sio = io(srv); + sio.of("/").on("connection", () => { done(); }); - var c1 = client(srv, ""); + const c1 = client(srv, ""); }); - it("should work with `of` and many sockets", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var chat = client(srv, "/chat"); - var news = client(srv, "/news"); - var total = 2; - sio.of("/news").on("connection", function(socket) { + it("should work with `of` and many sockets", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const chat = client(srv, "/chat"); + const news = client(srv, "/news"); + let total = 2; + sio.of("/news").on("connection", socket => { expect(socket).to.be.a(Socket); --total || done(); }); - sio.of("/news").on("connection", function(socket) { + sio.of("/news").on("connection", socket => { expect(socket).to.be.a(Socket); --total || done(); }); }); }); - it("should work with `of` second param", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var chat = client(srv, "/chat"); - var news = client(srv, "/news"); - var total = 2; - sio.of("/news", function(socket) { + it("should work with `of` second param", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const chat = client(srv, "/chat"); + const news = client(srv, "/news"); + let total = 2; + sio.of("/news", socket => { expect(socket).to.be.a(Socket); --total || done(); }); - sio.of("/news", function(socket) { + sio.of("/news", socket => { expect(socket).to.be.a(Socket); --total || done(); }); }); }); - it("should disconnect upon transport disconnection", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var chat = client(srv, "/chat"); - var news = client(srv, "/news"); - var total = 2; - var totald = 2; - var s; - sio.of("/news", function(socket) { - socket.on("disconnect", function(reason) { + it("should disconnect upon transport disconnection", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const chat = client(srv, "/chat"); + const news = client(srv, "/news"); + let total = 2; + let totald = 2; + let s; + sio.of("/news", socket => { + socket.on("disconnect", reason => { --totald || done(); }); --total || close(); }); - sio.of("/chat", function(socket) { + sio.of("/chat", socket => { s = socket; - socket.on("disconnect", function(reason) { + socket.on("disconnect", reason => { --totald || done(); }); --total || close(); @@ -629,23 +627,23 @@ describe("socket.io", function() { }); }); - it("should disconnect both default and custom namespace upon disconnect", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var lolcats = client(srv, "/lolcats"); - var total = 2; - var totald = 2; - var s; - sio.of("/", function(socket) { - socket.on("disconnect", function(reason) { + it("should disconnect both default and custom namespace upon disconnect", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const lolcats = client(srv, "/lolcats"); + let total = 2; + let totald = 2; + let s; + sio.of("/", socket => { + socket.on("disconnect", reason => { --totald || done(); }); --total || close(); }); - sio.of("/lolcats", function(socket) { + sio.of("/lolcats", socket => { s = socket; - socket.on("disconnect", function(reason) { + socket.on("disconnect", reason => { --totald || done(); }); --total || close(); @@ -656,36 +654,36 @@ describe("socket.io", function() { }); }); - it("should not crash while disconnecting socket", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/ns"); - sio.on("connection", function(socket) { + it("should not crash while disconnecting socket", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/ns"); + sio.on("connection", socket => { socket.disconnect(); done(); }); }); }); - it("should fire a `disconnecting` event just before leaving all rooms", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); + it("should fire a `disconnecting` event just before leaving all rooms", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); - sio.on("connection", function(s) { - s.join("a", function() { + sio.on("connection", s => { + s.join("a", () => { s.disconnect(); }); - var total = 2; - s.on("disconnecting", function(reason) { + let total = 2; + s.on("disconnecting", reason => { expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); total--; }); - s.on("disconnect", function(reason) { + s.on("disconnect", reason => { expect(Object.keys(s.rooms)).to.eql([]); --total || done(); }); @@ -693,27 +691,27 @@ describe("socket.io", function() { }); }); - it("should return error connecting to non-existent namespace", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/doesnotexist"); - socket.on("error", function(err) { + it("should return error connecting to non-existent namespace", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/doesnotexist"); + socket.on("error", err => { expect(err).to.be("Invalid namespace"); done(); }); }); }); - it("should not reuse same-namespace connections", function(done) { - var srv = http(); - var sio = io(srv); - var connections = 0; + it("should not reuse same-namespace connections", done => { + const srv = http(); + const sio = io(srv); + let connections = 0; - srv.listen(function() { - var clientSocket1 = client(srv); - var clientSocket2 = client(srv); - sio.on("connection", function() { + srv.listen(() => { + const clientSocket1 = client(srv); + const clientSocket2 = client(srv); + sio.on("connection", () => { connections++; if (connections === 2) { done(); @@ -722,27 +720,27 @@ describe("socket.io", function() { }); }); - it("should find all clients in a namespace", function(done) { - var srv = http(); - var sio = io(srv); - var chatSids = []; - var otherSid = null; - srv.listen(function() { - var c1 = client(srv, "/chat"); - var c2 = client(srv, "/chat", { forceNew: true }); - var c3 = client(srv, "/other", { forceNew: true }); - var total = 3; - sio.of("/chat").on("connection", function(socket) { + it("should find all clients in a namespace", done => { + const srv = http(); + const sio = io(srv); + const chatSids = []; + let otherSid = null; + srv.listen(() => { + const c1 = client(srv, "/chat"); + const c2 = client(srv, "/chat", { forceNew: true }); + const c3 = client(srv, "/other", { forceNew: true }); + let total = 3; + sio.of("/chat").on("connection", socket => { chatSids.push(socket.id); --total || getClients(); }); - sio.of("/other").on("connection", function(socket) { + sio.of("/other").on("connection", socket => { otherSid = socket.id; --total || getClients(); }); }); function getClients() { - sio.of("/chat").clients(function(error, sids) { + sio.of("/chat").clients((error, sids) => { expect(error).to.not.be.ok(); expect(sids).to.contain(chatSids[0]); expect(sids).to.contain(chatSids[1]); @@ -752,33 +750,33 @@ describe("socket.io", function() { } }); - it("should find all clients in a namespace room", function(done) { - var srv = http(); - var sio = io(srv); - var chatFooSid = null; - var chatBarSid = null; - var otherSid = null; - srv.listen(function() { - var c1 = client(srv, "/chat"); - var c2 = client(srv, "/chat", { forceNew: true }); - var c3 = client(srv, "/other", { forceNew: true }); - var chatIndex = 0; - var total = 3; - sio.of("/chat").on("connection", function(socket) { + it("should find all clients in a namespace room", done => { + const srv = http(); + const sio = io(srv); + let chatFooSid = null; + let chatBarSid = null; + let otherSid = null; + srv.listen(() => { + const c1 = client(srv, "/chat"); + const c2 = client(srv, "/chat", { forceNew: true }); + const c3 = client(srv, "/other", { forceNew: true }); + let chatIndex = 0; + let total = 3; + sio.of("/chat").on("connection", socket => { if (chatIndex++) { - socket.join("foo", function() { + socket.join("foo", () => { chatFooSid = socket.id; --total || getClients(); }); } else { - socket.join("bar", function() { + socket.join("bar", () => { chatBarSid = socket.id; --total || getClients(); }); } }); - sio.of("/other").on("connection", function(socket) { - socket.join("foo", function() { + sio.of("/other").on("connection", socket => { + socket.join("foo", () => { otherSid = socket.id; --total || getClients(); }); @@ -788,7 +786,7 @@ describe("socket.io", function() { sio .of("/chat") .in("foo") - .clients(function(error, sids) { + .clients((error, sids) => { expect(error).to.not.be.ok(); expect(sids).to.contain(chatFooSid); expect(sids).to.not.contain(chatBarSid); @@ -798,40 +796,40 @@ describe("socket.io", function() { } }); - it("should find all clients across namespace rooms", function(done) { - var srv = http(); - var sio = io(srv); - var chatFooSid = null; - var chatBarSid = null; - var otherSid = null; - srv.listen(function() { - var c1 = client(srv, "/chat"); - var c2 = client(srv, "/chat", { forceNew: true }); - var c3 = client(srv, "/other", { forceNew: true }); - var chatIndex = 0; - var total = 3; - sio.of("/chat").on("connection", function(socket) { + it("should find all clients across namespace rooms", done => { + const srv = http(); + const sio = io(srv); + let chatFooSid = null; + let chatBarSid = null; + let otherSid = null; + srv.listen(() => { + const c1 = client(srv, "/chat"); + const c2 = client(srv, "/chat", { forceNew: true }); + const c3 = client(srv, "/other", { forceNew: true }); + let chatIndex = 0; + let total = 3; + sio.of("/chat").on("connection", socket => { if (chatIndex++) { - socket.join("foo", function() { + socket.join("foo", () => { chatFooSid = socket.id; --total || getClients(); }); } else { - socket.join("bar", function() { + socket.join("bar", () => { chatBarSid = socket.id; --total || getClients(); }); } }); - sio.of("/other").on("connection", function(socket) { - socket.join("foo", function() { + sio.of("/other").on("connection", socket => { + socket.join("foo", () => { otherSid = socket.id; --total || getClients(); }); }); }); function getClients() { - sio.of("/chat").clients(function(error, sids) { + sio.of("/chat").clients((error, sids) => { expect(error).to.not.be.ok(); expect(sids).to.contain(chatFooSid); expect(sids).to.contain(chatBarSid); @@ -841,64 +839,64 @@ describe("socket.io", function() { } }); - it("should not emit volatile event after regular event", function(done) { - var srv = http(); - var sio = io(srv); + it("should not emit volatile event after regular event", done => { + const srv = http(); + const sio = io(srv); - var counter = 0; - srv.listen(function() { - sio.of("/chat").on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.of("/chat").on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { sio.of("/chat").emit("ev", "data"); sio.of("/chat").volatile.emit("ev", "data"); }, 50); }); - var socket = client(srv, "/chat"); - socket.on("ev", function() { + const socket = client(srv, "/chat"); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 500); }); - it("should emit volatile event", function(done) { - var srv = http(); - var sio = io(srv); + it("should emit volatile event", done => { + const srv = http(); + const sio = io(srv); - var counter = 0; - srv.listen(function() { - sio.of("/chat").on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.of("/chat").on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { sio.of("/chat").volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, "/chat"); - socket.on("ev", function() { + const socket = client(srv, "/chat"); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 500); }); - it("should enable compression by default", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/chat"); - sio.of("/chat").on("connection", function(s) { - s.conn.once("packetCreate", function(packet) { + it("should enable compression by default", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/chat"); + sio.of("/chat").on("connection", s => { + s.conn.once("packetCreate", packet => { expect(packet.options.compress).to.be(true); done(); }); @@ -907,13 +905,13 @@ describe("socket.io", function() { }); }); - it("should disable compression", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/chat"); - sio.of("/chat").on("connection", function(s) { - s.conn.once("packetCreate", function(packet) { + it("should disable compression", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/chat"); + sio.of("/chat").on("connection", s => { + s.conn.once("packetCreate", packet => { expect(packet.options.compress).to.be(false); done(); }); @@ -925,12 +923,12 @@ describe("socket.io", function() { }); }); - describe("dynamic namespaces", function() { - it("should allow connections to dynamic namespaces with a regex", function(done) { + describe("dynamic namespaces", () => { + it("should allow connections to dynamic namespaces with a regex", done => { const srv = http(); const sio = io(srv); let count = 0; - srv.listen(function() { + srv.listen(() => { const socket = client(srv, "/dynamic-101"); let dynamicNsp = sio .of(/^\/dynamic-\d+$/) @@ -943,7 +941,7 @@ describe("socket.io", function() { next(); if (++count === 4) done(); }); - socket.on("error", function(err) { + socket.on("error", err => { expect().fail(); }); socket.on("connect", () => { @@ -958,20 +956,20 @@ describe("socket.io", function() { }); }); - it("should allow connections to dynamic namespaces with a function", function(done) { + it("should allow connections to dynamic namespaces with a function", done => { const srv = http(); const sio = io(srv); - srv.listen(function() { + srv.listen(() => { const socket = client(srv, "/dynamic-101"); sio.of((name, query, next) => next(null, "/dynamic-101" === name)); socket.on("connect", done); }); }); - it("should disallow connections when no dynamic namespace matches", function(done) { + it("should disallow connections when no dynamic namespace matches", done => { const srv = http(); const sio = io(srv); - srv.listen(function() { + srv.listen(() => { const socket = client(srv, "/abc"); sio.of(/^\/dynamic-\d+$/); sio.of((name, query, next) => next(null, "/dynamic-101" === name)); @@ -984,49 +982,49 @@ describe("socket.io", function() { }); }); - describe("socket", function() { - it("should not fire events more than once after manually reconnecting", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var clientSocket = client(srv, { reconnection: false }); + describe("socket", () => { + it("should not fire events more than once after manually reconnecting", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const clientSocket = client(srv, { reconnection: false }); clientSocket.on("connect", function init() { clientSocket.removeListener("connect", init); clientSocket.io.engine.close(); clientSocket.connect(); - clientSocket.on("connect", function() { + clientSocket.on("connect", () => { done(); }); }); }); }); - it("should not fire reconnect_failed event more than once when server closed", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var clientSocket = client(srv, { + it("should not fire reconnect_failed event more than once when server closed", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const clientSocket = client(srv, { reconnectionAttempts: 3, reconnectionDelay: 10 }); - clientSocket.on("connect", function() { + clientSocket.on("connect", () => { srv.close(); }); - clientSocket.on("reconnect_failed", function() { + clientSocket.on("reconnect_failed", () => { done(); }); }); }); - it("should receive events", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("random", function(a, b, c) { + it("should receive events", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("random", (a, b, c) => { expect(a).to.be(1); expect(b).to.be("2"); expect(c).to.eql([3]); @@ -1037,13 +1035,13 @@ describe("socket.io", function() { }); }); - it("should receive message events through `send`", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("message", function(a) { + it("should receive message events through `send`", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("message", a => { expect(a).to.be(1337); done(); }); @@ -1052,13 +1050,13 @@ describe("socket.io", function() { }); }); - it("should error with null messages", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("message", function(a) { + it("should error with null messages", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("message", a => { expect(a).to.be(null); done(); }); @@ -1067,15 +1065,15 @@ describe("socket.io", function() { }); }); - it("should handle transport null messages", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { reconnection: false }); - sio.on("connection", function(s) { - s.on("error", function(err) { + it("should handle transport null messages", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { reconnection: false }); + sio.on("connection", s => { + s.on("error", err => { expect(err).to.be.an(Error); - s.on("disconnect", function(reason) { + s.on("disconnect", reason => { expect(reason).to.be("forced close"); done(); }); @@ -1085,28 +1083,28 @@ describe("socket.io", function() { }); }); - it("should emit events", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - socket.on("woot", function(a) { + it("should emit events", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + socket.on("woot", a => { expect(a).to.be("tobi"); done(); }); - sio.on("connection", function(s) { + sio.on("connection", s => { s.emit("woot", "tobi"); }); }); }); - it("should emit events with utf8 multibyte character", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - var i = 0; - socket.on("hoot", function(a) { + it("should emit events with utf8 multibyte character", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + let i = 0; + socket.on("hoot", a => { expect(a).to.be("utf8 — string"); i++; @@ -1114,7 +1112,7 @@ describe("socket.io", function() { done(); } }); - sio.on("connection", function(s) { + sio.on("connection", s => { s.emit("hoot", "utf8 — string"); s.emit("hoot", "utf8 — string"); s.emit("hoot", "utf8 — string"); @@ -1122,24 +1120,21 @@ describe("socket.io", function() { }); }); - it("should emit events with binary data", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - var imageData; - socket.on("doge", function(a) { + it("should emit events with binary data", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + let imageData; + socket.on("doge", a => { expect(Buffer.isBuffer(a)).to.be(true); expect(imageData.length).to.equal(a.length); expect(imageData[0]).to.equal(a[0]); expect(imageData[imageData.length - 1]).to.equal(a[a.length - 1]); done(); }); - sio.on("connection", function(s) { - fs.readFile(join(__dirname, "support", "doge.jpg"), function( - err, - data - ) { + sio.on("connection", s => { + fs.readFile(join(__dirname, "support", "doge.jpg"), (err, data) => { if (err) return done(err); imageData = data; s.emit("doge", data); @@ -1148,12 +1143,12 @@ describe("socket.io", function() { }); }); - it("should emit events with several types of data (including binary)", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - socket.on("multiple", function(a, b, c, d, e, f) { + it("should emit events with several types of data (including binary)", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + socket.on("multiple", (a, b, c, d, e, f) => { expect(a).to.be(1); expect(Buffer.isBuffer(b)).to.be(true); expect(c).to.be("3"); @@ -1164,42 +1159,39 @@ describe("socket.io", function() { expect(Buffer.isBuffer(f[2])).to.be(true); done(); }); - sio.on("connection", function(s) { - fs.readFile(join(__dirname, "support", "doge.jpg"), function( - err, - data - ) { + sio.on("connection", s => { + fs.readFile(join(__dirname, "support", "doge.jpg"), (err, data) => { if (err) return done(err); - var buf = Buffer.from("asdfasdf", "utf8"); + const buf = Buffer.from("asdfasdf", "utf8"); s.emit("multiple", 1, data, "3", [4], buf, [data, "swag", buf]); }); }); }); }); - it("should receive events with binary data", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("buff", function(a) { + it("should receive events with binary data", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("buff", a => { expect(Buffer.isBuffer(a)).to.be(true); done(); }); - var buf = Buffer.from("abcdefg", "utf8"); + const buf = Buffer.from("abcdefg", "utf8"); socket.emit("buff", buf); }); }); }); - it("should receive events with several types of data (including binary)", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("multiple", function(a, b, c, d, e, f) { + it("should receive events with several types of data (including binary)", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("multiple", (a, b, c, d, e, f) => { expect(a).to.be(1); expect(Buffer.isBuffer(b)).to.be(true); expect(c).to.be("3"); @@ -1210,12 +1202,9 @@ describe("socket.io", function() { expect(Buffer.isBuffer(f[2])).to.be(true); done(); }); - fs.readFile(join(__dirname, "support", "doge.jpg"), function( - err, - data - ) { + fs.readFile(join(__dirname, "support", "doge.jpg"), (err, data) => { if (err) return done(err); - var buf = Buffer.from("asdfasdf", "utf8"); + const buf = Buffer.from("asdfasdf", "utf8"); socket.emit("multiple", 1, data, "3", [4], buf, [ data, "swag", @@ -1226,233 +1215,233 @@ describe("socket.io", function() { }); }); - it("should not emit volatile event after regular event (polling)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["polling"] }); + it("should not emit volatile event after regular event (polling)", done => { + const srv = http(); + const sio = io(srv, { transports: ["polling"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { s.emit("ev", "data"); s.volatile.emit("ev", "data"); }); - var socket = client(srv, { transports: ["polling"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["polling"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 200); }); - it("should not emit volatile event after regular event (ws)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["websocket"] }); + it("should not emit volatile event after regular event (ws)", done => { + const srv = http(); + const sio = io(srv, { transports: ["websocket"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { s.emit("ev", "data"); s.volatile.emit("ev", "data"); }); - var socket = client(srv, { transports: ["websocket"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 200); }); - it("should emit volatile event (polling)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["polling"] }); + it("should emit volatile event (polling)", done => { + const srv = http(); + const sio = io(srv, { transports: ["polling"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, { transports: ["polling"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["polling"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 500); }); - it("should emit volatile event (ws)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["websocket"] }); + it("should emit volatile event (ws)", done => { + const srv = http(); + const sio = io(srv, { transports: ["websocket"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.volatile.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ["websocket"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 200); }); - it("should emit only one consecutive volatile event (polling)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["polling"] }); + it("should emit only one consecutive volatile event (polling)", done => { + const srv = http(); + const sio = io(srv, { transports: ["polling"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.volatile.emit("ev", "data"); s.volatile.emit("ev", "data"); }, 100); }); - var socket = client(srv, { transports: ["polling"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["polling"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 500); }); - it("should emit only one consecutive volatile event (ws)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["websocket"] }); + it("should emit only one consecutive volatile event (ws)", done => { + const srv = http(); + const sio = io(srv, { transports: ["websocket"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.volatile.emit("ev", "data"); s.volatile.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ["websocket"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(1); done(); }, 200); }); - it("should emit regular events after trying a failed volatile event (polling)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["polling"] }); + it("should emit regular events after trying a failed volatile event (polling)", done => { + const srv = http(); + const sio = io(srv, { transports: ["polling"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.emit("ev", "data"); s.volatile.emit("ev", "data"); s.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ["polling"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["polling"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(2); done(); }, 200); }); - it("should emit regular events after trying a failed volatile event (ws)", function(done) { - var srv = http(); - var sio = io(srv, { transports: ["websocket"] }); + it("should emit regular events after trying a failed volatile event (ws)", done => { + const srv = http(); + const sio = io(srv, { transports: ["websocket"] }); - var counter = 0; - srv.listen(function() { - sio.on("connection", function(s) { + let counter = 0; + srv.listen(() => { + sio.on("connection", s => { // Wait to make sure there are no packets being sent for opening the connection - setTimeout(function() { + setTimeout(() => { s.emit("ev", "data"); s.volatile.emit("ev", "data"); s.emit("ev", "data"); }, 20); }); - var socket = client(srv, { transports: ["websocket"] }); - socket.on("ev", function() { + const socket = client(srv, { transports: ["websocket"] }); + socket.on("ev", () => { counter++; }); }); - setTimeout(function() { + setTimeout(() => { expect(counter).to.be(2); done(); }, 200); }); - it("should emit message events through `send`", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - socket.on("message", function(a) { + it("should emit message events through `send`", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + socket.on("message", a => { expect(a).to.be("a"); done(); }); - sio.on("connection", function(s) { + sio.on("connection", s => { s.send("a"); }); }); }); - it("should receive event with callbacks", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("woot", function(fn) { + it("should receive event with callbacks", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("woot", fn => { fn(1, 2); }); - socket.emit("woot", function(a, b) { + socket.emit("woot", (a, b) => { expect(a).to.be(1); expect(b).to.be(2); done(); @@ -1461,13 +1450,13 @@ describe("socket.io", function() { }); }); - it("should receive all events emitted from namespaced client immediately and in order", function(done) { - var srv = http(); - var sio = io(srv); - var total = 0; - srv.listen(function() { - sio.of("/chat", function(s) { - s.on("hi", function(letter) { + it("should receive all events emitted from namespaced client immediately and in order", done => { + const srv = http(); + const sio = io(srv); + let total = 0; + srv.listen(() => { + sio.of("/chat", s => { + s.on("hi", letter => { total++; if (total == 2 && letter == "b") { done(); @@ -1477,77 +1466,77 @@ describe("socket.io", function() { }); }); - var chat = client(srv, "/chat"); + const chat = client(srv, "/chat"); chat.emit("hi", "a"); - setTimeout(function() { + setTimeout(() => { chat.emit("hi", "b"); }, 50); }); }); - it("should emit events with callbacks", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - socket.on("hi", function(fn) { + it("should emit events with callbacks", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + socket.on("hi", fn => { fn(); }); - s.emit("hi", function() { + s.emit("hi", () => { done(); }); }); }); }); - it("should receive events with args and callback", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("woot", function(a, b, fn) { + it("should receive events with args and callback", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("woot", (a, b, fn) => { expect(a).to.be(1); expect(b).to.be(2); fn(); }); - socket.emit("woot", 1, 2, function() { + socket.emit("woot", 1, 2, () => { done(); }); }); }); }); - it("should emit events with args and callback", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - socket.on("hi", function(a, b, fn) { + it("should emit events with args and callback", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + socket.on("hi", (a, b, fn) => { expect(a).to.be(1); expect(b).to.be(2); fn(); }); - s.emit("hi", 1, 2, function() { + s.emit("hi", 1, 2, () => { done(); }); }); }); }); - it("should receive events with binary args and callbacks", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("woot", function(buf, fn) { + it("should receive events with binary args and callbacks", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("woot", (buf, fn) => { expect(Buffer.isBuffer(buf)).to.be(true); fn(1, 2); }); - socket.emit("woot", Buffer.alloc(3), function(a, b) { + socket.emit("woot", Buffer.alloc(3), (a, b) => { expect(a).to.be(1); expect(b).to.be(2); done(); @@ -1556,33 +1545,33 @@ describe("socket.io", function() { }); }); - it("should emit events with binary args and callback", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - socket.on("hi", function(a, fn) { + it("should emit events with binary args and callback", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + socket.on("hi", (a, fn) => { expect(Buffer.isBuffer(a)).to.be(true); fn(); }); - s.emit("hi", Buffer.alloc(4), function() { + s.emit("hi", Buffer.alloc(4), () => { done(); }); }); }); }); - it("should emit events and receive binary data in a callback", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - socket.on("hi", function(fn) { + it("should emit events and receive binary data in a callback", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + socket.on("hi", fn => { fn(Buffer.alloc(1)); }); - s.emit("hi", function(a) { + s.emit("hi", a => { expect(Buffer.isBuffer(a)).to.be(true); done(); }); @@ -1590,16 +1579,16 @@ describe("socket.io", function() { }); }); - it("should receive events and pass binary data in a callback", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.on("woot", function(fn) { + it("should receive events and pass binary data in a callback", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.on("woot", fn => { fn(Buffer.alloc(2)); }); - socket.emit("woot", function(a) { + socket.emit("woot", a => { expect(Buffer.isBuffer(a)).to.be(true); done(); }); @@ -1607,24 +1596,24 @@ describe("socket.io", function() { }); }); - it("should have access to the client", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { + it("should have access to the client", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { expect(s.client).to.be.an("object"); done(); }); }); }); - it("should have access to the connection", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { + it("should have access to the connection", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { expect(s.client.conn).to.be.an("object"); expect(s.conn).to.be.an("object"); done(); @@ -1632,12 +1621,12 @@ describe("socket.io", function() { }); }); - it("should have access to the request", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { + it("should have access to the request", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { expect(s.client.request.headers).to.be.an("object"); expect(s.request.headers).to.be.an("object"); done(); @@ -1645,14 +1634,14 @@ describe("socket.io", function() { }); }); - it("should see query parameters in the request", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { query: { key1: 1, key2: 2 } }); - sio.on("connection", function(s) { - var parsed = require("url").parse(s.request.url); - var query = require("querystring").parse(parsed.query); + it("should see query parameters in the request", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { query: { key1: 1, key2: 2 } }); + sio.on("connection", s => { + const parsed = require("url").parse(s.request.url); + const query = require("querystring").parse(parsed.query); expect(query.key1).to.be("1"); expect(query.key2).to.be("2"); done(); @@ -1660,15 +1649,15 @@ describe("socket.io", function() { }); }); - it("should see query parameters sent from secondary namespace connections in handshake object", function(done) { - var srv = http(); - var sio = io(srv); - var client1 = client(srv); - var client2 = client(srv, "/connection2", { + it("should see query parameters sent from secondary namespace connections in handshake object", done => { + const srv = http(); + const sio = io(srv); + const client1 = client(srv); + const client2 = client(srv, "/connection2", { query: { key1: "aa", key2: "&=bb" } }); - sio.on("connection", function(s) {}); - sio.of("/connection2").on("connection", function(s) { + sio.on("connection", s => {}); + sio.of("/connection2").on("connection", s => { expect(s.handshake.query.key1).to.be("aa"); expect(s.handshake.query.key2).to.be("&=bb"); done(); @@ -1677,26 +1666,23 @@ describe("socket.io", function() { it("should handle very large json", function(done) { this.timeout(30000); - var srv = http(); - var sio = io(srv, { perMessageDeflate: false }); - var received = 0; - srv.listen(function() { - var socket = client(srv); - socket.on("big", function(a) { + const srv = http(); + const sio = io(srv, { perMessageDeflate: false }); + let received = 0; + srv.listen(() => { + const socket = client(srv); + socket.on("big", a => { expect(Buffer.isBuffer(a.json)).to.be(false); if (++received == 3) done(); else socket.emit("big", a); }); - sio.on("connection", function(s) { - fs.readFile(join(__dirname, "fixtures", "big.json"), function( - err, - data - ) { + sio.on("connection", s => { + fs.readFile(join(__dirname, "fixtures", "big.json"), (err, data) => { if (err) return done(err); data = JSON.parse(data); s.emit("big", { hello: "friend", json: data }); }); - s.on("big", function(a) { + s.on("big", a => { s.emit("big", a); }); }); @@ -1705,25 +1691,22 @@ describe("socket.io", function() { it("should handle very large binary data", function(done) { this.timeout(30000); - var srv = http(); - var sio = io(srv, { perMessageDeflate: false }); - var received = 0; - srv.listen(function() { - var socket = client(srv); - socket.on("big", function(a) { + const srv = http(); + const sio = io(srv, { perMessageDeflate: false }); + let received = 0; + srv.listen(() => { + const socket = client(srv); + socket.on("big", a => { expect(Buffer.isBuffer(a.image)).to.be(true); if (++received == 3) done(); else socket.emit("big", a); }); - sio.on("connection", function(s) { - fs.readFile(join(__dirname, "fixtures", "big.jpg"), function( - err, - data - ) { + sio.on("connection", s => { + fs.readFile(join(__dirname, "fixtures", "big.jpg"), (err, data) => { if (err) return done(err); s.emit("big", { hello: "friend", image: data }); }); - s.on("big", function(a) { + s.on("big", a => { expect(Buffer.isBuffer(a.image)).to.be(true); s.emit("big", a); }); @@ -1731,26 +1714,26 @@ describe("socket.io", function() { }); }); - it("should be able to emit after server close and restart", function(done) { - var srv = http(); - var sio = io(srv); + it("should be able to emit after server close and restart", done => { + const srv = http(); + const sio = io(srv); - sio.on("connection", function(socket) { - socket.on("ev", function(data) { + sio.on("connection", socket => { + socket.on("ev", data => { expect(data).to.be("payload"); done(); }); }); - srv.listen(function() { - var port = srv.address().port; - var clientSocket = client(srv, { + srv.listen(() => { + const port = srv.address().port; + const clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 }); - clientSocket.once("connect", function() { - srv.close(function() { - clientSocket.on("reconnect", function() { + clientSocket.once("connect", () => { + srv.close(() => { + clientSocket.on("reconnect", () => { clientSocket.emit("ev", "payload"); }); sio.listen(port); @@ -1759,13 +1742,13 @@ describe("socket.io", function() { }); }); - it("should enable compression by default", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/chat"); - sio.of("/chat").on("connection", function(s) { - s.conn.once("packetCreate", function(packet) { + it("should enable compression by default", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/chat"); + sio.of("/chat").on("connection", s => { + s.conn.once("packetCreate", packet => { expect(packet.options.compress).to.be(true); done(); }); @@ -1774,13 +1757,13 @@ describe("socket.io", function() { }); }); - it("should disable compression", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, "/chat"); - sio.of("/chat").on("connection", function(s) { - s.conn.once("packetCreate", function(packet) { + it("should disable compression", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, "/chat"); + sio.of("/chat").on("connection", s => { + s.conn.once("packetCreate", packet => { expect(packet.options.compress).to.be(false); done(); }); @@ -1792,18 +1775,18 @@ describe("socket.io", function() { }); }); - it("should error with raw binary and warn", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { reconnection: false }); - sio.on("connection", function(s) { - s.conn.on("upgrade", function() { + it("should error with raw binary and warn", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { reconnection: false }); + sio.on("connection", s => { + s.conn.on("upgrade", () => { console.log( "\u001b[96mNote: warning expected and normal in test.\u001b[39m" ); socket.io.engine.write("5woooot"); - setTimeout(function() { + setTimeout(() => { done(); }, 100); }); @@ -1811,18 +1794,18 @@ describe("socket.io", function() { }); }); - it("should not crash when receiving an error packet without handler", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { reconnection: false }); - sio.on("connection", function(s) { - s.conn.on("upgrade", function() { + it("should not crash when receiving an error packet without handler", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { reconnection: false }); + sio.on("connection", s => { + s.conn.on("upgrade", () => { console.log( "\u001b[96mNote: warning expected and normal in test.\u001b[39m" ); socket.io.engine.write('44["handle me please"]'); - setTimeout(function() { + setTimeout(() => { done(); }, 100); }); @@ -1830,67 +1813,67 @@ describe("socket.io", function() { }); }); - it("should not crash with raw binary", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { reconnection: false }); - sio.on("connection", function(s) { - s.once("error", function(err) { + it("should not crash with raw binary", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { reconnection: false }); + sio.on("connection", s => { + s.once("error", err => { expect(err.message).to.match(/Illegal attachments/); done(); }); - s.conn.on("upgrade", function() { + s.conn.on("upgrade", () => { socket.io.engine.write("5woooot"); }); }); }); }); - it("should handle empty binary packet", function(done) { - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv, { reconnection: false }); - sio.on("connection", function(s) { - s.once("error", function(err) { + it("should handle empty binary packet", done => { + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv, { reconnection: false }); + sio.on("connection", s => { + s.once("error", err => { expect(err.message).to.match(/Illegal attachments/); done(); }); - s.conn.on("upgrade", function() { + s.conn.on("upgrade", () => { socket.io.engine.write("5"); }); }); }); }); - it("should not crash when messing with Object prototype (and other globals)", function(done) { + it("should not crash when messing with Object prototype (and other globals)", done => { Object.prototype.foo = "bar"; global.File = ""; global.Blob = []; - var srv = http(); - var sio = io(srv); - srv.listen(function() { - var socket = client(srv); + const srv = http(); + const sio = io(srv); + srv.listen(() => { + const socket = client(srv); - sio.on("connection", function(s) { + sio.on("connection", s => { s.disconnect(true); sio.close(); - setTimeout(function() { + setTimeout(() => { done(); }, 100); }); }); }); - it("should always trigger the callback (if provided) when joining a room", function(done) { - var srv = http(); - var sio = io(srv); + it("should always trigger the callback (if provided) when joining a room", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.join("a", function() { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.join("a", () => { s.join("a", done); }); }); @@ -1898,33 +1881,33 @@ describe("socket.io", function() { }); }); - describe("messaging many", function() { - it("emits to a namespace", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; - - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, "/test"); - socket1.on("a", function(a) { + describe("messaging many", () => { + it("emits to a namespace", done => { + const srv = http(); + const sio = io(srv); + let total = 2; + + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); + const socket3 = client(srv, "/test"); + socket1.on("a", a => { expect(a).to.be("b"); --total || done(); }); - socket2.on("a", function(a) { + socket2.on("a", a => { expect(a).to.be("b"); --total || done(); }); - socket3.on("a", function() { + socket3.on("a", () => { done(new Error("not")); }); - var sockets = 3; - sio.on("connection", function(socket) { + let sockets = 3; + sio.on("connection", socket => { --sockets || emit(); }); - sio.of("/test", function(socket) { + sio.of("/test", socket => { --sockets || emit(); }); @@ -1934,32 +1917,32 @@ describe("socket.io", function() { }); }); - it("emits binary data to a namespace", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("emits binary data to a namespace", done => { + const srv = http(); + const sio = io(srv); + let total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, "/test"); - socket1.on("bin", function(a) { + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); + const socket3 = client(srv, "/test"); + socket1.on("bin", a => { expect(Buffer.isBuffer(a)).to.be(true); --total || done(); }); - socket2.on("bin", function(a) { + socket2.on("bin", a => { expect(Buffer.isBuffer(a)).to.be(true); --total || done(); }); - socket3.on("bin", function() { + socket3.on("bin", () => { done(new Error("not")); }); - var sockets = 3; - sio.on("connection", function(socket) { + let sockets = 3; + sio.on("connection", socket => { --sockets || emit(); }); - sio.of("/test", function(socket) { + sio.of("/test", socket => { --sockets || emit(); }); @@ -1969,101 +1952,101 @@ describe("socket.io", function() { }); }); - it("emits to the rest", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("emits to the rest", done => { + const srv = http(); + const sio = io(srv); + const total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, "/test"); - socket1.on("a", function(a) { + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); + const socket3 = client(srv, "/test"); + socket1.on("a", a => { expect(a).to.be("b"); socket1.emit("finish"); }); socket2.emit("broadcast"); - socket2.on("a", function() { + socket2.on("a", () => { done(new Error("done")); }); - socket3.on("a", function() { + socket3.on("a", () => { done(new Error("not")); }); - var sockets = 2; - sio.on("connection", function(socket) { - socket.on("broadcast", function() { + const sockets = 2; + sio.on("connection", socket => { + socket.on("broadcast", () => { socket.broadcast.emit("a", "b"); }); - socket.on("finish", function() { + socket.on("finish", () => { done(); }); }); }); }); - it("emits to rooms", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("emits to rooms", done => { + const srv = http(); + const sio = io(srv); + const total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); - socket2.on("a", function() { + socket2.on("a", () => { done(new Error("not")); }); - socket1.on("a", function() { + socket1.on("a", () => { done(); }); - socket1.emit("join", "woot", function() { + socket1.emit("join", "woot", () => { socket1.emit("emit", "woot"); }); - sio.on("connection", function(socket) { - socket.on("join", function(room, fn) { + sio.on("connection", socket => { + socket.on("join", (room, fn) => { socket.join(room, fn); }); - socket.on("emit", function(room) { + socket.on("emit", room => { sio.in(room).emit("a"); }); }); }); }); - it("emits to rooms avoiding dupes", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("emits to rooms avoiding dupes", done => { + const srv = http(); + const sio = io(srv); + let total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); - socket2.on("a", function() { + socket2.on("a", () => { done(new Error("not")); }); - socket1.on("a", function() { + socket1.on("a", () => { --total || done(); }); - socket2.on("b", function() { + socket2.on("b", () => { --total || done(); }); socket1.emit("join", "woot"); socket1.emit("join", "test"); - socket2.emit("join", "third", function() { + socket2.emit("join", "third", () => { socket2.emit("emit"); }); - sio.on("connection", function(socket) { - socket.on("join", function(room, fn) { + sio.on("connection", socket => { + socket.on("join", (room, fn) => { socket.join(room, fn); }); - socket.on("emit", function(room) { + socket.on("emit", room => { sio .in("woot") .in("test") @@ -2074,41 +2057,41 @@ describe("socket.io", function() { }); }); - it("broadcasts to rooms", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("broadcasts to rooms", done => { + const srv = http(); + const sio = io(srv); + let total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, { multiplex: false }); + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); + const socket3 = client(srv, { multiplex: false }); socket1.emit("join", "woot"); socket2.emit("join", "test"); - socket3.emit("join", "test", function() { + socket3.emit("join", "test", () => { socket3.emit("broadcast"); }); - socket1.on("a", function() { + socket1.on("a", () => { done(new Error("not")); }); - socket2.on("a", function() { + socket2.on("a", () => { --total || done(); }); - socket3.on("a", function() { + socket3.on("a", () => { done(new Error("not")); }); - socket3.on("b", function() { + socket3.on("b", () => { --total || done(); }); - sio.on("connection", function(socket) { - socket.on("join", function(room, fn) { + sio.on("connection", socket => { + socket.on("join", (room, fn) => { socket.join(room, fn); }); - socket.on("broadcast", function() { + socket.on("broadcast", () => { socket.broadcast.to("test").emit("a"); socket.emit("b"); }); @@ -2116,45 +2099,45 @@ describe("socket.io", function() { }); }); - it("broadcasts binary data to rooms", function(done) { - var srv = http(); - var sio = io(srv); - var total = 2; + it("broadcasts binary data to rooms", done => { + const srv = http(); + const sio = io(srv); + let total = 2; - srv.listen(function() { - var socket1 = client(srv, { multiplex: false }); - var socket2 = client(srv, { multiplex: false }); - var socket3 = client(srv, { multiplex: false }); + srv.listen(() => { + const socket1 = client(srv, { multiplex: false }); + const socket2 = client(srv, { multiplex: false }); + const socket3 = client(srv, { multiplex: false }); socket1.emit("join", "woot"); socket2.emit("join", "test"); - socket3.emit("join", "test", function() { + socket3.emit("join", "test", () => { socket3.emit("broadcast"); }); - socket1.on("bin", function(data) { + socket1.on("bin", data => { throw new Error("got bin in socket1"); }); - socket2.on("bin", function(data) { + socket2.on("bin", data => { expect(Buffer.isBuffer(data)).to.be(true); --total || done(); }); - socket2.on("bin2", function(data) { + socket2.on("bin2", data => { throw new Error("socket2 got bin2"); }); - socket3.on("bin", function(data) { + socket3.on("bin", data => { throw new Error("socket3 got bin"); }); - socket3.on("bin2", function(data) { + socket3.on("bin2", data => { expect(Buffer.isBuffer(data)).to.be(true); --total || done(); }); - sio.on("connection", function(socket) { - socket.on("join", function(room, fn) { + sio.on("connection", socket => { + socket.on("join", (room, fn) => { socket.join(room, fn); }); - socket.on("broadcast", function() { + socket.on("broadcast", () => { socket.broadcast.to("test").emit("bin", Buffer.alloc(5)); socket.emit("bin2", Buffer.alloc(5)); }); @@ -2162,20 +2145,20 @@ describe("socket.io", function() { }); }); - it("keeps track of rooms", function(done) { - var srv = http(); - var sio = io(srv); + it("keeps track of rooms", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.join("a", function() { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.join("a", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); - s.join("b", function() { + s.join("b", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); - s.join("c", function() { + s.join("c", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); - s.leave("b", function() { + s.leave("b", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "c"]); s.leaveAll(); expect(Object.keys(s.rooms)).to.eql([]); @@ -2188,16 +2171,16 @@ describe("socket.io", function() { }); }); - it("deletes empty rooms", function(done) { - var srv = http(); - var sio = io(srv); + it("deletes empty rooms", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.join("a", function() { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.join("a", () => { expect(s.nsp.adapter.rooms).to.have.key("a"); - s.leave("a", function() { + s.leave("a", () => { expect(s.nsp.adapter.rooms).to.not.have.key("a"); done(); }); @@ -2206,18 +2189,18 @@ describe("socket.io", function() { }); }); - it("should properly cleanup left rooms", function(done) { - var srv = http(); - var sio = io(srv); + it("should properly cleanup left rooms", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.join("a", function() { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.join("a", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); - s.join("b", function() { + s.join("b", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); - s.leave("unknown", function() { + s.leave("unknown", () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); s.leaveAll(); expect(Object.keys(s.rooms)).to.eql([]); @@ -2229,14 +2212,14 @@ describe("socket.io", function() { }); }); - it("allows to join several rooms at once", function(done) { - var srv = http(); - var sio = io(srv); + it("allows to join several rooms at once", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(s) { - s.join(["a", "b", "c"], function() { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + s.join(["a", "b", "c"], () => { expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); done(); }); @@ -2245,166 +2228,166 @@ describe("socket.io", function() { }); }); - describe("middleware", function(done) { + describe("middleware", done => { const { Socket } = require("../dist/socket"); - it("should call functions", function(done) { - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next) { + it("should call functions", done => { + const srv = http(); + const sio = io(srv); + let run = 0; + sio.use((socket, next) => { expect(socket).to.be.a(Socket); run++; next(); }); - sio.use(function(socket, next) { + sio.use((socket, next) => { expect(socket).to.be.a(Socket); run++; next(); }); - srv.listen(function() { - var socket = client(srv); - socket.on("connect", function() { + srv.listen(() => { + const socket = client(srv); + socket.on("connect", () => { expect(run).to.be(2); done(); }); }); }); - it("should pass errors", function(done) { - var srv = http(); - var sio = io(srv); - var run = 0; - sio.use(function(socket, next) { + it("should pass errors", done => { + const srv = http(); + const sio = io(srv); + const run = 0; + sio.use((socket, next) => { next(new Error("Authentication error")); }); - sio.use(function(socket, next) { + sio.use((socket, next) => { done(new Error("nope")); }); - srv.listen(function() { - var socket = client(srv); - socket.on("connect", function() { + srv.listen(() => { + const socket = client(srv); + socket.on("connect", () => { done(new Error("nope")); }); - socket.on("error", function(err) { + socket.on("error", err => { expect(err).to.be("Authentication error"); done(); }); }); }); - it("should only call connection after fns", function(done) { - var srv = http(); - var sio = io(srv); - sio.use(function(socket, next) { + it("should only call connection after fns", done => { + const srv = http(); + const sio = io(srv); + sio.use((socket, next) => { socket.name = "guillermo"; next(); }); - srv.listen(function() { - var socket = client(srv); - sio.on("connection", function(socket) { + srv.listen(() => { + const socket = client(srv); + sio.on("connection", socket => { expect(socket.name).to.be("guillermo"); done(); }); }); }); - it("should only call connection after (lengthy) fns", function(done) { - var srv = http(); - var sio = io(srv); - var authenticated = false; + it("should only call connection after (lengthy) fns", done => { + const srv = http(); + const sio = io(srv); + let authenticated = false; - sio.use(function(socket, next) { - setTimeout(function() { + sio.use((socket, next) => { + setTimeout(() => { authenticated = true; next(); }, 300); }); - srv.listen(function() { - var socket = client(srv); - socket.on("connect", function() { + srv.listen(() => { + const socket = client(srv); + socket.on("connect", () => { expect(authenticated).to.be(true); done(); }); }); }); - it("should be ignored if socket gets closed", function(done) { - var srv = http(); - var sio = io(srv); - var socket; - sio.use(function(s, next) { - socket.io.engine.on("open", function() { + it("should be ignored if socket gets closed", done => { + const srv = http(); + const sio = io(srv); + let socket; + sio.use((s, next) => { + socket.io.engine.on("open", () => { socket.io.engine.close(); - s.client.conn.on("close", function() { + s.client.conn.on("close", () => { process.nextTick(next); - setTimeout(function() { + setTimeout(() => { done(); }, 50); }); }); }); - srv.listen(function() { + srv.listen(() => { socket = client(srv); - sio.on("connection", function(socket) { + sio.on("connection", socket => { done(new Error("should not fire")); }); }); }); - it("should call functions in expected order", function(done) { - var srv = http(); - var sio = io(srv); - var result = []; + it("should call functions in expected order", done => { + const srv = http(); + const sio = io(srv); + const result = []; - sio.use(function(socket, next) { + sio.use((socket, next) => { result.push(1); setTimeout(next, 50); }); - sio.use(function(socket, next) { + sio.use((socket, next) => { result.push(2); setTimeout(next, 50); }); - sio.of("/chat").use(function(socket, next) { + sio.of("/chat").use((socket, next) => { result.push(3); setTimeout(next, 50); }); - sio.of("/chat").use(function(socket, next) { + sio.of("/chat").use((socket, next) => { result.push(4); setTimeout(next, 50); }); - srv.listen(function() { - var chat = client(srv, "/chat"); - chat.on("connect", function() { + srv.listen(() => { + const chat = client(srv, "/chat"); + chat.on("connect", () => { expect(result).to.eql([1, 2, 3, 4]); done(); }); }); }); - it("should disable the merge of handshake packets", function(done) { - var srv = http(); - var sio = io(); - sio.use(function(socket, next) { + it("should disable the merge of handshake packets", done => { + const srv = http(); + const sio = io(); + sio.use((socket, next) => { next(); }); sio.listen(srv); - var socket = client(srv); - socket.on("connect", function() { + const socket = client(srv); + socket.on("connect", () => { done(); }); }); it("should work with a custom namespace", done => { - var srv = http(); - var sio = io(); + const srv = http(); + const sio = io(); sio.listen(srv); - sio.of("/chat").use(function(socket, next) { + sio.of("/chat").use((socket, next) => { next(); }); - var count = 0; + let count = 0; client(srv, "/").on("connect", () => { if (++count === 2) done(); }); @@ -2414,32 +2397,32 @@ describe("socket.io", function() { }); }); - describe("socket middleware", function(done) { + describe("socket middleware", done => { const { Socket } = require("../dist/socket"); - it("should call functions", function(done) { - var srv = http(); - var sio = io(srv); - var run = 0; + it("should call functions", done => { + const srv = http(); + const sio = io(srv); + let run = 0; - srv.listen(function() { - var socket = client(srv, { multiplex: false }); + srv.listen(() => { + const socket = client(srv, { multiplex: false }); socket.emit("join", "woot"); - sio.on("connection", function(socket) { - socket.use(function(event, next) { + sio.on("connection", socket => { + socket.use((event, next) => { expect(event).to.eql(["join", "woot"]); event.unshift("wrap"); run++; next(); }); - socket.use(function(event, next) { + socket.use((event, next) => { expect(event).to.eql(["wrap", "join", "woot"]); run++; next(); }); - socket.on("wrap", function(data1, data2) { + socket.on("wrap", (data1, data2) => { expect(data1).to.be("join"); expect(data2).to.be("woot"); expect(run).to.be(2); @@ -2449,29 +2432,29 @@ describe("socket.io", function() { }); }); - it("should pass errors", function(done) { - var srv = http(); - var sio = io(srv); + it("should pass errors", done => { + const srv = http(); + const sio = io(srv); - srv.listen(function() { - var clientSocket = client(srv, { multiplex: false }); + srv.listen(() => { + const clientSocket = client(srv, { multiplex: false }); clientSocket.emit("join", "woot"); - clientSocket.on("error", function(err) { + clientSocket.on("error", err => { expect(err).to.be("Authentication error"); done(); }); - sio.on("connection", function(socket) { - socket.use(function(event, next) { + sio.on("connection", socket => { + socket.use((event, next) => { next(new Error("Authentication error")); }); - socket.use(function(event, next) { + socket.use((event, next) => { done(new Error("nope")); }); - socket.on("join", function() { + socket.on("join", () => { done(new Error("nope")); }); }); From 84437dc2a682add44bb57d03f703cfc955607352 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Sep 2020 00:20:16 +0200 Subject: [PATCH 324/494] chore: bump socket.io-adapter Breaking changes: - Namespace#connected is now a Map instead of an object. - Namespace#clients() is renamed to Namespace#allSockets() and now returns a Promise Diff: https://github.com/socketio/socket.io-adapter/compare/1.1.2...2.0.0 --- lib/index.ts | 2 +- lib/namespace.ts | 29 +- lib/parent-namespace.ts | 2 +- lib/socket.ts | 62 +- package-lock.json | 2419 +-------------------------------------- package.json | 2 +- test/socket.io.js | 69 +- test/support/util.js | 22 + 8 files changed, 105 insertions(+), 2502 deletions(-) create mode 100644 test/support/util.js diff --git a/lib/index.ts b/lib/index.ts index 7c7d28101e..b682707930 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -6,7 +6,7 @@ import { Client } from "./client"; import { EventEmitter } from "events"; import { Namespace } from "./namespace"; import { ParentNamespace } from "./parent-namespace"; -import Adapter from "socket.io-adapter"; +import { Adapter } from "socket.io-adapter"; import parser from "socket.io-parser"; import url from "url"; import debugModule from "debug"; diff --git a/lib/namespace.ts b/lib/namespace.ts index 665a7e99d4..ab37451d9f 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -5,6 +5,7 @@ import { EventEmitter } from "events"; import parser from "socket.io-parser"; import hasBin from "has-binary2"; import debugModule from "debug"; +import { Adapter, Room, SocketId } from "socket.io-adapter"; const debug = debugModule("socket.io:namespace"); @@ -20,16 +21,16 @@ const events = [ export class Namespace extends EventEmitter { public readonly name: string; - public readonly connected: object = {}; + public readonly connected: Map = new Map(); - public adapter; + public adapter: Adapter; /** @package */ public readonly server; /** @package */ public fns: Array<(socket: Socket, next: (err: Error) => void) => void> = []; /** @package */ - public rooms: Array = []; + public rooms: Set = new Set(); /** @package */ public flags: any = {}; /** @package */ @@ -107,8 +108,8 @@ export class Namespace extends EventEmitter { * @param {String} name * @return {Namespace} self */ - public to(name: string): Namespace { - if (!~this.rooms.indexOf(name)) this.rooms.push(name); + public to(name: Room): Namespace { + this.rooms.add(name); return this; } @@ -118,8 +119,8 @@ export class Namespace extends EventEmitter { * @param {String} name * @return {Namespace} self */ - public in(name: string): Namespace { - if (!~this.rooms.indexOf(name)) this.rooms.push(name); + public in(name: Room): Namespace { + this.rooms.add(name); return this; } @@ -197,11 +198,11 @@ export class Namespace extends EventEmitter { throw new Error("Callbacks are not supported when broadcasting"); } - const rooms = this.rooms.slice(0); + const rooms = new Set(this.rooms); const flags = Object.assign({}, this.flags); // reset flags - this.rooms = []; + this.rooms.clear(); this.flags = {}; this.adapter.broadcast(packet, { @@ -239,17 +240,15 @@ export class Namespace extends EventEmitter { * * @return {Namespace} self */ - public clients(fn: (clients: Array) => void): Namespace { + public allSockets(): Promise> { if (!this.adapter) { throw new Error( "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" ); } - this.adapter.clients(this.rooms, fn); - // reset rooms for scenario: - // .in('room').clients() (GH-1978) - this.rooms = []; - return this; + const rooms = new Set(this.rooms); + this.rooms.clear(); + return this.adapter.sockets(rooms); } /** diff --git a/lib/parent-namespace.ts b/lib/parent-namespace.ts index 376c70ebc4..df171e19bf 100644 --- a/lib/parent-namespace.ts +++ b/lib/parent-namespace.ts @@ -17,7 +17,7 @@ export class ParentNamespace extends Namespace { nsp.flags = this.flags; nsp.emit.apply(nsp, args); }); - this.rooms = []; + this.rooms.clear(); this.flags = {}; } diff --git a/lib/socket.ts b/lib/socket.ts index e0e68c256c..c14b9d4fc7 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -5,6 +5,7 @@ import url from "url"; import debugModule from "debug"; import { Client, Namespace, Server } from "./index"; import { IncomingMessage } from "http"; +import { Adapter, BroadcastFlags, Room, SocketId } from "socket.io-adapter"; const debug = debugModule("socket.io:socket"); @@ -67,7 +68,7 @@ export interface Handshake { } export class Socket extends EventEmitter { - public readonly id: string; + public readonly id: SocketId; public readonly handshake: Handshake; public rooms = {}; @@ -75,13 +76,13 @@ export class Socket extends EventEmitter { public disconnected: boolean; private readonly server: Server; - private readonly adapter; + private readonly adapter: Adapter; private acks: object = {}; private fns: Array< (event: Array, next: (err: Error) => void) => void > = []; - private flags: any = {}; - private _rooms: Array = []; + private flags: BroadcastFlags = {}; + private _rooms: Set = new Set(); /** * Interface to a `Client` for a given `Namespace`. @@ -149,7 +150,7 @@ export class Socket extends EventEmitter { // access last argument to see if it's an ACK callback if (typeof args[args.length - 1] === "function") { - if (this._rooms.length || this.flags.broadcast) { + if (this._rooms.size || this.flags.broadcast) { throw new Error("Callbacks are not supported when broadcasting"); } @@ -158,16 +159,16 @@ export class Socket extends EventEmitter { packet.id = this.nsp.ids++; } - const rooms = this._rooms.slice(0); + const rooms = new Set(this._rooms); const flags = Object.assign({}, this.flags); // reset flags - this._rooms = []; + this._rooms.clear(); this.flags = {}; - if (rooms.length || flags.broadcast) { + if (rooms.size || flags.broadcast) { this.adapter.broadcast(packet, { - except: [this.id], + except: new Set([this.id]), rooms: rooms, flags: flags }); @@ -184,8 +185,8 @@ export class Socket extends EventEmitter { * @param {String} name * @return {Socket} self */ - public to(name: string) { - if (!~this._rooms.indexOf(name)) this._rooms.push(name); + public to(name: Room) { + this._rooms.add(name); return this; } @@ -195,8 +196,8 @@ export class Socket extends EventEmitter { * @param {String} name * @return {Socket} self */ - public in(name: string): Socket { - if (!~this._rooms.indexOf(name)) this._rooms.push(name); + public in(name: Room): Socket { + this._rooms.add(name); return this; } @@ -243,25 +244,23 @@ export class Socket extends EventEmitter { */ public join(rooms, fn?: (err: Error) => void): Socket { debug("joining room %s", rooms); - const self = this; + if (!Array.isArray(rooms)) { rooms = [rooms]; } - rooms = rooms.filter(function(room) { - return !self.rooms.hasOwnProperty(room); + rooms = rooms.filter(room => { + return !this.rooms.hasOwnProperty(room); }); if (!rooms.length) { fn && fn(null); return this; } - this.adapter.addAll(this.id, rooms, function(err) { - if (err) return fn && fn(err); - debug("joined room %s", rooms); - rooms.forEach(function(room) { - self.rooms[room] = room; - }); - fn && fn(null); + this.adapter.addAll(this.id, rooms); + debug("joined room %s", rooms); + rooms.forEach(room => { + this.rooms[room] = room; }); + fn && fn(null); return this; } @@ -274,13 +273,12 @@ export class Socket extends EventEmitter { */ public leave(room: string, fn?: (err: Error) => void): Socket { debug("leave room %s", room); - const self = this; - this.adapter.del(this.id, room, function(err) { - if (err) return fn && fn(err); - debug("left room %s", room); - delete self.rooms[room]; - fn && fn(null); - }); + this.adapter.del(this.id, room); + + debug("left room %s", room); + delete this.rooms[room]; + fn && fn(null); + return this; } @@ -302,7 +300,7 @@ export class Socket extends EventEmitter { */ public onconnect(): void { debug("socket connected - writing packet"); - this.nsp.connected[this.id] = this; + this.nsp.connected.set(this.id, this); this.join(this.id); const skip = this.nsp.name === "/" && this.nsp.fns.length === 0; if (skip) { @@ -436,7 +434,7 @@ export class Socket extends EventEmitter { this.client.remove(this); this.connected = false; this.disconnected = true; - delete this.nsp.connected[this.id]; + this.nsp.connected.delete(this.id); super.emit("disconnect", reason); } diff --git a/package-lock.json b/package-lock.json index e63147468d..c9c3ac0190 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4379,2422 +4379,9 @@ } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array.prototype.map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", - "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.4" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "babel-eslint": { - "version": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "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==" - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "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==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.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==", - "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=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.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==" - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "requires": { - "strip-bom": "^4.0.0" - } - }, - "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==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "es-get-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", - "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", - "requires": { - "es-abstract": "^1.17.4", - "has-symbols": "^1.0.1", - "is-arguments": "^1.0.4", - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" - }, - "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=" - }, - "eslint": { - "version": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", - "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-config-prettier": { - "version": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", - "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "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==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "hasha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "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=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", - "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", - "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "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==" - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterate-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", - "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==" - }, - "iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "requires": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "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==" - }, - "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=" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "requires": { - "chalk": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", - "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.2", - "debug": "4.1.1", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "4.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.1" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.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==" - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "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=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prettier": { - "version": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise.allsettled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", - "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", - "requires": { - "array.prototype.map": "^1.0.1", - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "iterate-value": "^1.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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==" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "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==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-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==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "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=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "workerpool": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", - "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==" - }, - "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==", - "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==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "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=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "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==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "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==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", - "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", - "requires": { - "camelcase": "^5.3.1", - "decamelize": "^1.2.0", - "flat": "^4.1.0", - "is-plain-obj": "^1.1.0", - "yargs": "^14.2.3" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "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==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.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": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.0.tgz", + "integrity": "sha512-DDM5a+4FAzl7XGdek2SBGgKxKWnj6o4eapm1OqYB2F3AieEvptFLnSRqVdKjQy9FfPUsYdHVVKy+veL1xFuYPQ==" }, "socket.io-client": { "version": "2.3.0", diff --git a/package.json b/package.json index 949111cc02..cc1f7e3757 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "debug": "~4.1.0", "engine.io": "~3.4.0", "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", + "socket.io-adapter": "~2.0.0", "socket.io-client": "2.3.0", "socket.io-parser": "~3.4.0" }, diff --git a/test/socket.io.js b/test/socket.io.js index bdbd829a5a..216ae7bed3 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -9,6 +9,8 @@ const ioc = require("socket.io-client"); const request = require("supertest"); const expect = require("expect.js"); +require("./support/util"); + // Creates a socket.io client for the given server function client(srv, nsp, opts) { if ("object" == typeof nsp) { @@ -674,7 +676,8 @@ describe("socket.io", () => { sio.on("connection", s => { s.join("a", () => { - s.disconnect(); + // FIXME not sure why process.nextTick() is needed here + process.nextTick(() => s.disconnect()); }); let total = 2; @@ -732,21 +735,19 @@ describe("socket.io", () => { let total = 3; sio.of("/chat").on("connection", socket => { chatSids.push(socket.id); - --total || getClients(); + --total || getSockets(); }); sio.of("/other").on("connection", socket => { otherSid = socket.id; - --total || getClients(); + --total || getSockets(); }); }); - function getClients() { - sio.of("/chat").clients((error, sids) => { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatSids[0]); - expect(sids).to.contain(chatSids[1]); - expect(sids).to.not.contain(otherSid); - done(); - }); + async function getSockets() { + const sids = await sio.of("/chat").allSockets(); + + expect(sids).to.contain(chatSids[0], chatSids[1]); + expect(sids).to.not.contain(otherSid); + done(); } }); @@ -766,33 +767,32 @@ describe("socket.io", () => { if (chatIndex++) { socket.join("foo", () => { chatFooSid = socket.id; - --total || getClients(); + --total || getSockets(); }); } else { socket.join("bar", () => { chatBarSid = socket.id; - --total || getClients(); + --total || getSockets(); }); } }); sio.of("/other").on("connection", socket => { socket.join("foo", () => { otherSid = socket.id; - --total || getClients(); + --total || getSockets(); }); }); }); - function getClients() { - sio + async function getSockets() { + const sids = await sio .of("/chat") .in("foo") - .clients((error, sids) => { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatFooSid); - expect(sids).to.not.contain(chatBarSid); - expect(sids).to.not.contain(otherSid); - done(); - }); + .allSockets(); + + expect(sids).to.contain(chatFooSid); + expect(sids).to.not.contain(chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); } }); @@ -812,30 +812,27 @@ describe("socket.io", () => { if (chatIndex++) { socket.join("foo", () => { chatFooSid = socket.id; - --total || getClients(); + --total || getSockets(); }); } else { socket.join("bar", () => { chatBarSid = socket.id; - --total || getClients(); + --total || getSockets(); }); } }); sio.of("/other").on("connection", socket => { socket.join("foo", () => { otherSid = socket.id; - --total || getClients(); + --total || getSockets(); }); }); }); - function getClients() { - sio.of("/chat").clients((error, sids) => { - expect(error).to.not.be.ok(); - expect(sids).to.contain(chatFooSid); - expect(sids).to.contain(chatBarSid); - expect(sids).to.not.contain(otherSid); - done(); - }); + async function getSockets() { + const sids = await sio.of("/chat").allSockets(); + expect(sids).to.contain(chatFooSid, chatBarSid); + expect(sids).to.not.contain(otherSid); + done(); } }); @@ -2179,9 +2176,9 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join("a", () => { - expect(s.nsp.adapter.rooms).to.have.key("a"); + expect(s.nsp.adapter.rooms).to.contain("a"); s.leave("a", () => { - expect(s.nsp.adapter.rooms).to.not.have.key("a"); + expect(s.nsp.adapter.rooms).to.not.contain("a"); done(); }); }); diff --git a/test/support/util.js b/test/support/util.js new file mode 100644 index 0000000000..b89a92e651 --- /dev/null +++ b/test/support/util.js @@ -0,0 +1,22 @@ +const expect = require("expect.js"); +const i = expect.stringify; + +// add support for Set/Map +const contain = expect.Assertion.prototype.contain; +expect.Assertion.prototype.contain = function(...args) { + if (typeof this.obj === "object") { + args.forEach(obj => { + this.assert( + this.obj.has(obj), + function() { + return "expected " + i(this.obj) + " to contain " + i(obj); + }, + function() { + return "expected " + i(this.obj) + " to not contain " + i(obj); + } + ); + }); + return this; + } + return contain.apply(this, args); +}; From 1507b416d584381554d1ed23c9aaf3b650540071 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Sep 2020 00:42:13 +0200 Subject: [PATCH 325/494] feat: remove Socket#rooms object The value stored in the adapter will now be used, instead of duplicating it in the Socket class. Breaking change: Socket#rooms is now a Set instead of an object Closes https://github.com/socketio/socket.io/issues/2890 --- lib/socket.ts | 27 +++++++++------------------ test/socket.io.js | 24 ++++++++++++------------ 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/lib/socket.ts b/lib/socket.ts index c14b9d4fc7..541e15f58b 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -71,7 +71,6 @@ export class Socket extends EventEmitter { public readonly id: SocketId; public readonly handshake: Handshake; - public rooms = {}; public connected: boolean; public disconnected: boolean; @@ -242,24 +241,14 @@ export class Socket extends EventEmitter { * @param {Function} fn - optional, callback * @return {Socket} self */ - public join(rooms, fn?: (err: Error) => void): Socket { + public join(rooms: Room | Array, fn?: (err: Error) => void): Socket { debug("joining room %s", rooms); - if (!Array.isArray(rooms)) { - rooms = [rooms]; - } - rooms = rooms.filter(room => { - return !this.rooms.hasOwnProperty(room); - }); - if (!rooms.length) { - fn && fn(null); - return this; - } - this.adapter.addAll(this.id, rooms); + this.adapter.addAll( + this.id, + new Set(Array.isArray(rooms) ? rooms : [rooms]) + ); debug("joined room %s", rooms); - rooms.forEach(room => { - this.rooms[room] = room; - }); fn && fn(null); return this; } @@ -276,7 +265,6 @@ export class Socket extends EventEmitter { this.adapter.del(this.id, room); debug("left room %s", room); - delete this.rooms[room]; fn && fn(null); return this; @@ -287,7 +275,6 @@ export class Socket extends EventEmitter { */ private leaveAll(): void { this.adapter.delAll(this.id); - this.rooms = {}; } /** @@ -584,4 +571,8 @@ export class Socket extends EventEmitter { public get conn() { return this.client.conn; } + + public get rooms(): Set { + return this.adapter.socketRooms(this.id) || new Set(); + } } diff --git a/test/socket.io.js b/test/socket.io.js index 216ae7bed3..2edbdb40ed 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -682,12 +682,12 @@ describe("socket.io", () => { let total = 2; s.on("disconnecting", reason => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); total--; }); s.on("disconnect", reason => { - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); --total || done(); }); }); @@ -2150,15 +2150,15 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join("a", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); s.join("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.join("c", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); + expect(s.rooms).to.contain(s.id, "a", "b", "c"); s.leave("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "c"]); + expect(s.rooms).to.contain(s.id, "a", "c"); s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); done(); }); }); @@ -2194,13 +2194,13 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join("a", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a"]); + expect(s.rooms).to.contain(s.id, "a"); s.join("b", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.leave("unknown", () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b"]); + expect(s.rooms).to.contain(s.id, "a", "b"); s.leaveAll(); - expect(Object.keys(s.rooms)).to.eql([]); + expect(s.rooms.size).to.eql(0); done(); }); }); @@ -2217,7 +2217,7 @@ describe("socket.io", () => { const socket = client(srv); sio.on("connection", s => { s.join(["a", "b", "c"], () => { - expect(Object.keys(s.rooms)).to.eql([s.id, "a", "b", "c"]); + expect(s.rooms).to.contain(s.id, "a", "b", "c"); done(); }); }); From 424a473c227e6f23292f9e502f5bc53e11980b63 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Sep 2020 01:07:08 +0200 Subject: [PATCH 326/494] refactor: use ES6 Maps instead of plain objects These attributes were not part of the public API, so there's no breaking change. --- lib/client.ts | 54 ++++++++++++++++++----------------------- lib/index.ts | 18 ++++++-------- lib/namespace.ts | 15 ++++++------ lib/parent-namespace.ts | 7 +++--- lib/socket.ts | 16 +++++++----- 5 files changed, 53 insertions(+), 57 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index 0bc4a52c23..55e16b2d62 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -4,6 +4,7 @@ import debugModule = require("debug"); import { IncomingMessage } from "http"; import { Server } from "./index"; import { Socket } from "./socket"; +import { SocketId } from "socket.io-adapter"; const debug = debugModule("socket.io:client"); @@ -15,8 +16,8 @@ export class Client { private readonly server; private readonly encoder; private readonly decoder; - private sockets: object = {}; - private nsps: object = {}; + private sockets: Map = new Map(); + private nsps: Map = new Map(); private connectBuffer: Array = []; /** @@ -65,7 +66,7 @@ export class Client { * @package */ public connect(name, query = {}) { - if (this.server.nsps[name]) { + if (this.server.nsps.has(name)) { debug("connecting to namespace %s", name); return this.doConnect(name, query); } @@ -94,19 +95,18 @@ export class Client { private doConnect(name, query) { const nsp = this.server.of(name); - if ("/" != name && !this.nsps["/"]) { + if ("/" != name && !this.nsps.has("/")) { this.connectBuffer.push(name); return; } - const self = this; - const socket = nsp.add(this, query, function() { - self.sockets[socket.id] = socket; - self.nsps[nsp.name] = socket; + const socket = nsp.add(this, query, () => { + this.sockets.set(socket.id, socket); + this.nsps.set(nsp.name, socket); - if ("/" == nsp.name && self.connectBuffer.length > 0) { - self.connectBuffer.forEach(self.connect, self); - self.connectBuffer = []; + if ("/" == nsp.name && this.connectBuffer.length > 0) { + this.connectBuffer.forEach(this.connect, this); + this.connectBuffer = []; } }); } @@ -117,12 +117,10 @@ export class Client { * @package */ public disconnect() { - for (const id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].disconnect(); - } + for (const socket of this.sockets.values()) { + socket.disconnect(); } - this.sockets = {}; + this.sockets.clear(); this.close(); } @@ -132,10 +130,10 @@ export class Client { * @package */ public remove(socket: Socket) { - if (this.sockets.hasOwnProperty(socket.id)) { - const nsp = this.sockets[socket.id].nsp.name; - delete this.sockets[socket.id]; - delete this.nsps[nsp]; + if (this.sockets.has(socket.id)) { + const nsp = this.sockets.get(socket.id).nsp.name; + this.sockets.delete(socket.id); + this.nsps.delete(nsp); } else { debug("ignoring remove for %s", socket.id); } @@ -207,7 +205,7 @@ export class Client { url.parse(packet.nsp, true).query ); } else { - const socket = this.nsps[packet.nsp]; + const socket = this.nsps.get(packet.nsp); if (socket) { process.nextTick(function() { socket.onpacket(packet); @@ -224,10 +222,8 @@ export class Client { * @param {Object} err object */ private onerror(err) { - for (const id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onerror(err); - } + for (const socket of this.sockets.values()) { + socket.onerror(err); } this.conn.close(); } @@ -244,12 +240,10 @@ export class Client { this.destroy(); // `nsps` and `sockets` are cleaned up seamlessly - for (const id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onclose(reason); - } + for (const socket of this.sockets.values()) { + socket.onclose(reason); } - this.sockets = {}; + this.sockets.clear(); this.decoder.destroy(); // clean up decoder } diff --git a/lib/index.ts b/lib/index.ts index b682707930..06a7ba3710 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -31,7 +31,7 @@ class Server extends EventEmitter { /** @package */ public readonly encoder; - private nsps: object = {}; + private nsps: Map = new Map(); private parentNsps: Map< | string | RegExp @@ -224,10 +224,8 @@ class Server extends EventEmitter { public adapter(v) { if (!arguments.length) return this._adapter; this._adapter = v; - for (const i in this.nsps) { - if (this.nsps.hasOwnProperty(i)) { - this.nsps[i].initAdapter(); - } + for (const nsp of this.nsps.values()) { + nsp.initAdapter(); } return this; } @@ -507,11 +505,11 @@ class Server extends EventEmitter { if (String(name)[0] !== "/") name = "/" + name; - let nsp = this.nsps[name]; + let nsp = this.nsps.get(name); if (!nsp) { debug("initializing namespace %s", name); nsp = new Namespace(this, name); - this.nsps[name] = nsp; + this.nsps.set(name, nsp); } if (fn) nsp.on("connect", fn); return nsp; @@ -523,10 +521,8 @@ class Server extends EventEmitter { * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed */ public close(fn: (err?: Error) => void): void { - for (const id in this.nsps["/"].sockets) { - if (this.nsps["/"].sockets.hasOwnProperty(id)) { - this.nsps["/"].sockets[id].onclose(); - } + for (const socket of this.sockets.sockets.values()) { + socket.onclose("server shutting down"); } this.engine.close(); diff --git a/lib/namespace.ts b/lib/namespace.ts index ab37451d9f..d8da9e9aa3 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -35,8 +35,8 @@ export class Namespace extends EventEmitter { public flags: any = {}; /** @package */ public ids: number = 0; - - private readonly sockets: object = {}; + /** @package */ + public sockets: Map = new Map(); /** * Namespace constructor. @@ -55,8 +55,10 @@ export class Namespace extends EventEmitter { * Initializes the `Adapter` for this nsp. * Run upon changing adapter by `Server#adapter` * in addition to the constructor. + * + * @package */ - private initAdapter(): void { + public initAdapter(): void { this.adapter = new (this.server.adapter())(this); } @@ -132,14 +134,13 @@ export class Namespace extends EventEmitter { private add(client: Client, query, fn?: () => void): Socket { debug("adding socket to nsp %s", this.name); const socket = new Socket(this, client, query); - const self = this; this.run(socket, err => { process.nextTick(() => { if ("open" == client.conn.readyState) { if (err) return socket.error(err.message); // track socket - self.sockets[socket.id] = socket; + this.sockets.set(socket.id, socket); // it's paramount that the internal `onconnect` logic // fires before user-set events to prevent state order @@ -165,8 +166,8 @@ export class Namespace extends EventEmitter { * @package */ public remove(socket: Socket): void { - if (this.sockets.hasOwnProperty(socket.id)) { - delete this.sockets[socket.id]; + if (this.sockets.has(socket.id)) { + this.sockets.delete(socket.id); } else { debug("ignoring remove for %s", socket.id); } diff --git a/lib/parent-namespace.ts b/lib/parent-namespace.ts index df171e19bf..e6a0dfac64 100644 --- a/lib/parent-namespace.ts +++ b/lib/parent-namespace.ts @@ -10,8 +10,7 @@ export class ParentNamespace extends Namespace { initAdapter() {} - // @ts-ignore - public emit(...args) { + public emit(...args): Namespace { this.children.forEach(nsp => { nsp.rooms = this.rooms; nsp.flags = this.flags; @@ -19,6 +18,8 @@ export class ParentNamespace extends Namespace { }); this.rooms.clear(); this.flags = {}; + + return this; } createChild(name) { @@ -33,7 +34,7 @@ export class ParentNamespace extends Namespace { namespace.on("connection", listener) ); this.children.add(namespace); - this.server.nsps[name] = namespace; + this.server.nsps.set(name, namespace); return namespace; } } diff --git a/lib/socket.ts b/lib/socket.ts index 541e15f58b..8e3ec5275b 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -76,7 +76,7 @@ export class Socket extends EventEmitter { private readonly server: Server; private readonly adapter: Adapter; - private acks: object = {}; + private acks: Map void> = new Map(); private fns: Array< (event: Array, next: (err: Error) => void) => void > = []; @@ -154,7 +154,7 @@ export class Socket extends EventEmitter { } debug("emitting packet with ack id %d", this.nsp.ids); - this.acks[this.nsp.ids] = args.pop(); + this.acks.set(this.nsp.ids, args.pop()); packet.id = this.nsp.ids++; } @@ -376,11 +376,11 @@ export class Socket extends EventEmitter { * Called upon ack packet. */ private onack(packet): void { - const ack = this.acks[packet.id]; + const ack = this.acks.get(packet.id); if ("function" == typeof ack) { debug("calling ack %s with %j", packet.id, packet.data); ack.apply(this, packet.data); - delete this.acks[packet.id]; + this.acks.delete(packet.id); } else { debug("bad ack %s", packet.id); } @@ -396,8 +396,10 @@ export class Socket extends EventEmitter { /** * Handles a client error. + * + * @package */ - private onerror(err): void { + public onerror(err): void { if (this.listeners("error").length) { super.emit("error", err); } else { @@ -411,8 +413,10 @@ export class Socket extends EventEmitter { * * @param {String} reason * @throw {Error} optional error object + * + * @package */ - private onclose(reason: string) { + public onclose(reason: string) { if (!this.connected) return this; debug("closing socket - reason %s", reason); super.emit("disconnecting", reason); From 029f478992f59b1eb5226453db46363a570eea46 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Sep 2020 01:29:20 +0200 Subject: [PATCH 327/494] feat: remove Server#set() method This method was kept for backward-compatibility with pre-1.0 versions. --- lib/index.ts | 37 -------------- test/socket.io.js | 124 ---------------------------------------------- 2 files changed, 161 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 06a7ba3710..51e76cd00c 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -142,32 +142,6 @@ class Server extends EventEmitter { return this; } - /** - * Backwards compatibility. - */ - public set(key, val) { - if ("authorization" == key && val) { - // @ts-ignore - this.use(function(socket, next) { - val(socket.request, function(err, authorized) { - if (err) return next(new Error(err)); - if (!authorized) return next(new Error("Not authorized")); - next(); - }); - }); - } else if ("origins" == key && val) { - this.origins(val); - } else if ("resource" == key) { - this.path(val); - } else if (oldSettings[key] && this.eio[oldSettings[key]]) { - this.eio[oldSettings[key]] = val; - } else { - console.error("Option %s is not valid. Please refer to the README.", key); - } - - return this; - } - /** * Executes the middleware for an incoming namespace not already created on the server. * @@ -535,17 +509,6 @@ class Server extends EventEmitter { } } -/** - * Old settings for backwards compatibility - */ - -const oldSettings = { - transports: "transports", - "heartbeat timeout": "pingTimeout", - "heartbeat interval": "pingInterval", - "destroy buffer size": "maxHttpBufferSize" -}; - /** * Expose main namespace (/). */ diff --git a/test/socket.io.js b/test/socket.io.js index 2edbdb40ed..91dccf33b6 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -29,130 +29,6 @@ describe("socket.io", () => { expect(version).to.be(require("socket.io-client/package").version); }); - describe("set", () => { - it("should be able to set ping timeout to engine.io", () => { - const srv = io(http()); - srv.set("heartbeat timeout", 10); - expect(srv.eio.pingTimeout).to.be(10); - }); - - it("should be able to set ping interval to engine.io", () => { - const srv = io(http()); - srv.set("heartbeat interval", 10); - expect(srv.eio.pingInterval).to.be(10); - }); - - it("should be able to set transports to engine.io", () => { - const srv = io(http()); - srv.set("transports", ["polling"]); - expect(srv.eio.transports).to.eql(["polling"]); - }); - - it("should be able to set maxHttpBufferSize to engine.io", () => { - const srv = io(http()); - srv.set("destroy buffer size", 10); - expect(srv.eio.maxHttpBufferSize).to.eql(10); - }); - - it("should be able to set path with setting resource", done => { - const eio = io(); - const srv = http(); - - eio.set("resource", "/random"); - eio.attach(srv); - - // Check that the server is accessible through the specified path - request(srv) - .get("/random/socket.io.js") - .buffer(true) - .end((err, res) => { - if (err) return done(err); - done(); - }); - }); - - it("should be able to set origins to engine.io", () => { - const srv = io(http()); - srv.set("origins", "http://hostname.com:*"); - expect(srv.origins()).to.be("http://hostname.com:*"); - }); - - it("should be able to set authorization and send error packet", done => { - const httpSrv = http(); - const srv = io(httpSrv); - srv.set("authorization", (o, f) => { - f(null, false); - }); - - const socket = client(httpSrv); - socket.on("connect", () => { - expect().fail(); - }); - socket.on("error", err => { - expect(err).to.be("Not authorized"); - done(); - }); - }); - - it("should be able to set authorization and succeed", done => { - const httpSrv = http(); - const srv = io(httpSrv); - srv.set("authorization", (o, f) => { - f(null, true); - }); - - srv.on("connection", s => { - s.on("yoyo", data => { - expect(data).to.be("data"); - done(); - }); - }); - - const socket = client(httpSrv); - socket.on("connect", () => { - socket.emit("yoyo", "data"); - }); - - socket.on("error", err => { - expect().fail(); - }); - }); - - it("should set the handshake BC object", done => { - const httpSrv = http(); - const srv = io(httpSrv); - - srv.on("connection", s => { - expect(s.handshake).to.not.be(undefined); - - // Headers set and has some valid properties - expect(s.handshake.headers).to.be.an("object"); - expect(s.handshake.headers["user-agent"]).to.be("node-XMLHttpRequest"); - - // Time set and is valid looking string - expect(s.handshake.time).to.be.a("string"); - expect(s.handshake.time.split(" ").length > 0); // Is "multipart" string representation - - // Address, xdomain, secure, issued and url set - expect(s.handshake.address).to.contain("127.0.0.1"); - expect(s.handshake.xdomain).to.be.a("boolean"); - expect(s.handshake.secure).to.be.a("boolean"); - expect(s.handshake.issued).to.be.a("number"); - expect(s.handshake.url).to.be.a("string"); - - // Query set and has some right properties - expect(s.handshake.query).to.be.an("object"); - expect(s.handshake.query.EIO).to.not.be(undefined); - expect(s.handshake.query.transport).to.not.be(undefined); - expect(s.handshake.query.t).to.not.be(undefined); - - done(); - }); - - const socket = client(httpSrv); - }); - }); - describe("server attachment", () => { describe("http.Server", () => { const clientVersion = require("socket.io-client/package").version; From 1108ede1209d975ed511d37739ad050ab1b828d8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 26 Sep 2020 01:46:40 +0200 Subject: [PATCH 328/494] chore: bump socket.io-parser Breaking change: - the encode() method is now synchronous Please note that the exchange [protocol][1] is left untouched and thus stays in version 4. Diff: https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.0 [1] https://github.com/socketio/socket.io-protocol --- lib/client.ts | 14 ++++++++------ lib/index.ts | 35 ++++++++++++++++------------------- lib/namespace.ts | 6 +++--- lib/socket.ts | 26 +++++++++++++------------- package-lock.json | 28 ++++++++++++++++------------ package.json | 4 ++-- 6 files changed, 58 insertions(+), 55 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index 55e16b2d62..4d250a1f8f 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -1,4 +1,4 @@ -import parser from "socket.io-parser"; +import { Decoder, Encoder, PacketType } from "socket.io-parser"; import url from "url"; import debugModule = require("debug"); import { IncomingMessage } from "http"; @@ -14,8 +14,8 @@ export class Client { public readonly id: string; private readonly server; - private readonly encoder; - private readonly decoder; + private readonly encoder: Encoder; + private readonly decoder: Decoder; private sockets: Map = new Map(); private nsps: Map = new Map(); private connectBuffer: Array = []; @@ -52,6 +52,7 @@ export class Client { this.onerror = this.onerror.bind(this); this.ondecoded = this.ondecoded.bind(this); + // @ts-ignore this.decoder.on("decoded", this.ondecoded); this.conn.on("data", this.ondata); this.conn.on("error", this.onerror); @@ -78,7 +79,7 @@ export class Client { } else { debug("creation of namespace %s was denied", name); this.packet({ - type: parser.ERROR, + type: PacketType.ERROR, nsp: name, data: "Invalid namespace" }); @@ -173,7 +174,7 @@ export class Client { debug("writing packet %j", packet); if (!opts.preEncoded) { // not broadcasting, need to encode - this.encoder.encode(packet, writeToEngine); // encode, then write results to engine + writeToEngine(this.encoder.encode(packet)); // encode, then write results to engine } else { // a broadcast pre-encodes a packet writeToEngine(packet); @@ -199,7 +200,7 @@ export class Client { * Called when parser fully decodes a packet. */ private ondecoded(packet) { - if (parser.CONNECT == packet.type) { + if (PacketType.CONNECT == packet.type) { this.connect( url.parse(packet.nsp).pathname, url.parse(packet.nsp, true).query @@ -255,6 +256,7 @@ export class Client { this.conn.removeListener("data", this.ondata); this.conn.removeListener("error", this.onerror); this.conn.removeListener("close", this.onclose); + // @ts-ignore this.decoder.removeListener("decoded", this.ondecoded); } } diff --git a/lib/index.ts b/lib/index.ts index 51e76cd00c..ac2a8691e4 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,5 +1,5 @@ import http from "http"; -import { readFileSync as read, existsSync as exists } from "fs"; +import { existsSync as exists, readFileSync as read } from "fs"; import path from "path"; import engine from "engine.io"; import { Client } from "./client"; @@ -7,7 +7,8 @@ import { EventEmitter } from "events"; import { Namespace } from "./namespace"; import { ParentNamespace } from "./parent-namespace"; import { Adapter } from "socket.io-adapter"; -import parser from "socket.io-parser"; +import * as parser from "socket.io-parser"; +import { Encoder, PacketType } from "socket.io-parser"; import url from "url"; import debugModule from "debug"; import { Socket } from "./socket"; @@ -29,7 +30,7 @@ class Server extends EventEmitter { /** @package */ public readonly parser; /** @package */ - public readonly encoder; + public readonly encoder: Encoder; private nsps: Map = new Map(); private parentNsps: Map< @@ -257,15 +258,13 @@ class Server extends EventEmitter { return this; } - const self = this; - const connectPacket = { type: parser.CONNECT, nsp: "/" }; - this.encoder.encode(connectPacket, function(encodedPacket) { - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = encodedPacket; + const connectPacket = { type: PacketType.CONNECT, nsp: "/" }; + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = this.encoder.encode(connectPacket); + + this.initEngine(srv, opts); - self.initEngine(srv, opts); - }); return this; } @@ -303,15 +302,13 @@ class Server extends EventEmitter { return this; } - const self = this; - const connectPacket = { type: parser.CONNECT, nsp: "/" }; - this.encoder.encode(connectPacket, function(encodedPacket) { - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = encodedPacket; + const connectPacket = { type: PacketType.CONNECT, nsp: "/" }; + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = this.encoder.encode(connectPacket); + + this.initEngine(srv, opts); - self.initEngine(srv, opts); - }); return this; } diff --git a/lib/namespace.ts b/lib/namespace.ts index d8da9e9aa3..d364c5e27d 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -2,7 +2,7 @@ import { Socket } from "./socket"; import { Server } from "./index"; import { Client } from "./client"; import { EventEmitter } from "events"; -import parser from "socket.io-parser"; +import { PacketType } from "socket.io-parser"; import hasBin from "has-binary2"; import debugModule from "debug"; import { Adapter, Room, SocketId } from "socket.io-adapter"; @@ -190,8 +190,8 @@ export class Namespace extends EventEmitter { type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) - ? parser.BINARY_EVENT - : parser.EVENT, + ? PacketType.BINARY_EVENT + : PacketType.EVENT, data: args }; diff --git a/lib/socket.ts b/lib/socket.ts index 8e3ec5275b..c6fe4d649b 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -1,5 +1,5 @@ import { EventEmitter } from "events"; -import parser from "socket.io-parser"; +import { PacketType } from "socket.io-parser"; import hasBin from "has-binary2"; import url from "url"; import debugModule from "debug"; @@ -142,8 +142,8 @@ export class Socket extends EventEmitter { type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) - ? parser.BINARY_EVENT - : parser.EVENT, + ? PacketType.BINARY_EVENT + : PacketType.EVENT, data: args }; @@ -293,7 +293,7 @@ export class Socket extends EventEmitter { if (skip) { debug("packet already sent in initial handshake"); } else { - this.packet({ type: parser.CONNECT }); + this.packet({ type: PacketType.CONNECT }); } } @@ -306,27 +306,27 @@ export class Socket extends EventEmitter { public onpacket(packet) { debug("got packet %j", packet); switch (packet.type) { - case parser.EVENT: + case PacketType.EVENT: this.onevent(packet); break; - case parser.BINARY_EVENT: + case PacketType.BINARY_EVENT: this.onevent(packet); break; - case parser.ACK: + case PacketType.ACK: this.onack(packet); break; - case parser.BINARY_ACK: + case PacketType.BINARY_ACK: this.onack(packet); break; - case parser.DISCONNECT: + case PacketType.DISCONNECT: this.ondisconnect(); break; - case parser.ERROR: + case PacketType.ERROR: this.onerror(new Error(packet.data)); } } @@ -364,7 +364,7 @@ export class Socket extends EventEmitter { self.packet({ id: id, - type: hasBin(args) ? parser.BINARY_ACK : parser.ACK, + type: hasBin(args) ? PacketType.BINARY_ACK : PacketType.ACK, data: args }); @@ -437,7 +437,7 @@ export class Socket extends EventEmitter { * @package */ public error(err) { - this.packet({ type: parser.ERROR, data: err }); + this.packet({ type: PacketType.ERROR, data: err }); } /** @@ -451,7 +451,7 @@ export class Socket extends EventEmitter { if (close) { this.client.disconnect(); } else { - this.packet({ type: parser.DISCONNECT }); + this.packet({ type: PacketType.DISCONNECT }); this.onclose("server namespace disconnect"); } return this; diff --git a/package-lock.json b/package-lock.json index c9c3ac0190..5bd481edb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1246,7 +1246,6 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -2580,8 +2579,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "loose-envify": { "version": "1.3.1", @@ -4379,9 +4377,9 @@ } }, "socket.io-adapter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.0.tgz", - "integrity": "sha512-DDM5a+4FAzl7XGdek2SBGgKxKWnj6o4eapm1OqYB2F3AieEvptFLnSRqVdKjQy9FfPUsYdHVVKy+veL1xFuYPQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.1.tgz", + "integrity": "sha512-Q5Xakktk8mbwzAXD1Q8EnLDfnBflU1vKbNmz0aWihqv7Mpddbaf71QkXqb6wk0w1ofJLfIsc4IFPLcf8/MZiSA==" }, "socket.io-client": { "version": "2.3.0", @@ -4432,13 +4430,19 @@ } }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.0.tgz", + "integrity": "sha512-uH2Pfy9AeKCokfhMRQ74aZ2/dXv14AJ83Fzzz7zbq9rRpM+1NGHWI8iGcrP4E0MxKEvh7LochViCEX8cU+5DWg==", "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "component-emitter": "~1.3.0", + "debug": "~4.1.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + } } }, "source-map": { diff --git a/package.json b/package.json index cc1f7e3757..955c1989ab 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,9 @@ "debug": "~4.1.0", "engine.io": "~3.4.0", "has-binary2": "~1.0.2", - "socket.io-adapter": "~2.0.0", + "socket.io-adapter": "~2.0.1", "socket.io-client": "2.3.0", - "socket.io-parser": "~3.4.0" + "socket.io-parser": "~4.0.0" }, "devDependencies": { "@types/node": "^14.11.2", From 0540c365108083e14acda3c7c9c78c157d2915b9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 29 Sep 2020 01:10:31 +0200 Subject: [PATCH 329/494] refactor(typings): add server options Greatly inspired from: - https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/engine.io - https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/socket.io --- lib/index.ts | 179 +++++++++++++++++++++++++++++++++------------- package-lock.json | 89 ++++++++++++++++++++++- package.json | 2 + 3 files changed, 221 insertions(+), 49 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index ac2a8691e4..3e1f8aeaac 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -12,6 +12,8 @@ import { Encoder, PacketType } from "socket.io-parser"; import url from "url"; import debugModule from "debug"; import { Socket } from "./socket"; +import { CookieSerializeOptions } from "cookie"; +import { CorsOptions } from "cors"; const debug = debugModule("socket.io:server"); @@ -24,6 +26,112 @@ const clientVersion = require("socket.io-client/package.json").version; let clientSource = undefined; let clientSourceMap = undefined; +type Transport = "polling" | "websocket"; + +interface EngineOptions { + /** + * how many ms without a pong packet to consider the connection closed (5000) + */ + pingTimeout: number; + /** + * how many ms before sending a new ping packet (25000) + */ + pingInterval: number; + /** + * how many ms before an uncompleted transport upgrade is cancelled (10000) + */ + upgradeTimeout: number; + /** + * how many bytes or characters a message can be, before closing the session (to avoid DoS). Default value is 1E5. + */ + maxHttpBufferSize: number; + /** + * A function that receives a given handshake or upgrade request as its first parameter, + * and can decide whether to continue or not. The second argument is a function that needs + * to be called with the decided information: fn(err, success), where success is a boolean + * value where false means that the request is rejected, and err is an error code. + */ + allowRequest: ( + req: http.IncomingMessage, + fn: (err: string | null | undefined, success: boolean) => void + ) => void; + /** + * to allow connections to (['polling', 'websocket']) + */ + transports: Transport[]; + /** + * whether to allow transport upgrades (true) + */ + allowUpgrades: boolean; + /** + * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. (false) + */ + perMessageDeflate: boolean | object; + /** + * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. (true) + */ + httpCompression: boolean | object; + /** + * what WebSocket server implementation to use. Specified module must + * conform to the ws interface (see ws module api docs). Default value is ws. + * An alternative c++ addon is also available by installing uws module. + */ + wsEngine: string; + /** + * an optional packet which will be concatenated to the handshake packet emitted by Engine.IO. + */ + initialPacket: any; + /** + * configuration of the cookie that contains the client sid to send as part of handshake response headers. This cookie + * might be used for sticky-session. Defaults to not sending any cookie (false) + */ + cookie: CookieSerializeOptions | boolean; + /** + * the options that will be forwarded to the cors module + */ + cors: CorsOptions; +} + +interface AttachOptions { + /** + * name of the path to capture (/engine.io). + */ + path: string; + /** + * destroy unhandled upgrade requests (true) + */ + destroyUpgrade: boolean; + /** + * milliseconds after which unhandled requests are ended (1000) + */ + destroyUpgradeTimeout: number; +} + +interface EngineAttachOptions extends EngineOptions, AttachOptions {} + +export interface ServerOptions extends EngineAttachOptions { + /** + * name of the path to capture (/socket.io) + */ + path: string; + /** + * whether to serve the client files (true) + */ + serveClient: boolean; + /** + * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. + */ + adapter: any; + /** + * the allowed origins (*:*) + */ + origins: string | string[]; + /** + * the parser to use. Defaults to an instance of the Parser that ships with socket.io. + */ + parser: any; +} + class Server extends EventEmitter { public readonly sockets: Namespace; @@ -57,7 +165,10 @@ class Server extends EventEmitter { * @param {http.Server|Number|Object} srv http server, port or options * @param {Object} [opts] */ - constructor(srv, opts: any = {}) { + constructor(opts?: Partial); + constructor(srv: http.Server, opts?: Partial); + constructor(srv: number, opts?: Partial); + constructor(srv?: any, opts: Partial = {}) { super(); if ("object" == typeof srv && srv instanceof Object && !srv.listen) { opts = srv; @@ -225,50 +336,22 @@ class Server extends EventEmitter { * @param {Object} opts - options passed to engine.io * @return {Server} self */ - public listen(srv: http.Server | number, opts: any = {}): Server { - if ("function" == typeof srv) { - const msg = - "You are trying to attach socket.io to an express " + - "request handler function. Please pass a http.Server instance."; - throw new Error(msg); - } - - // handle a port as a string - if (Number(srv) == srv) { - srv = Number(srv); - } - - if ("number" == typeof srv) { - debug("creating http server and binding to %d", srv); - const port = srv; - srv = http.createServer((req, res) => { - res.writeHead(404); - res.end(); - }); - srv.listen(port); - } - - // set engine.io path to `/socket.io` - opts.path = opts.path || this.path(); - // set origins verification - opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - - if (this.sockets.fns.length > 0) { - this.initEngine(srv, opts); - return this; - } - - const connectPacket = { type: PacketType.CONNECT, nsp: "/" }; - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = this.encoder.encode(connectPacket); - - this.initEngine(srv, opts); - - return this; + public listen(srv: http.Server, opts?: Partial): Server; + public listen(srv: number, opts?: Partial): Server; + public listen(srv: any, opts: Partial = {}): Server { + return this.attach(srv, opts); } - public attach(srv, opts) { + /** + * Attaches socket.io to a server or port. + * + * @param {http.Server|Number} srv - server or port + * @param {Object} opts - options passed to engine.io + * @return {Server} self + */ + public attach(srv: http.Server, opts?: Partial): Server; + public attach(port: number, opts?: Partial): Server; + public attach(srv: any, opts: Partial = {}): Server { if ("function" == typeof srv) { const msg = "You are trying to attach socket.io to an express " + @@ -292,8 +375,7 @@ class Server extends EventEmitter { } // set engine.io path to `/socket.io` - opts = opts || {}; - opts.path = opts.path || this.path(); + opts.path = opts.path || this._path; // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); @@ -315,9 +397,10 @@ class Server extends EventEmitter { /** * Initialize engine * - * @param {Object} options passed to engine.io + * @param srv - the server to attach to + * @param opts - options passed to engine.io */ - private initEngine(srv, opts) { + private initEngine(srv: http.Server, opts: Partial) { // initialize engine debug("creating engine.io instance with opts %j", opts); this.eio = engine.attach(srv, opts); @@ -432,7 +515,7 @@ class Server extends EventEmitter { * @param {engine.Socket} conn * @return {Server} self */ - public onconnection(conn): Server { + private onconnection(conn): Server { debug("incoming connection with id %s", conn.id); const client = new Client(this, conn); client.connect("/"); diff --git a/package-lock.json b/package-lock.json index 5bd481edb9..56bf5afbe5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,18 +144,103 @@ } } }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.7.tgz", + "integrity": "sha512-sOdDRU3oRS7LBNTIqwDkPJyq0lpHYcbMTt0TrjzsXbk/e37hcLTH6eZX7CdbDeN0yJJvzw9hFBZkbtCSbk/jAQ==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/express": { + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", + "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", + "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "dev": true + }, "@types/node": { "version": "14.11.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", "dev": true }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", + "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1246,6 +1331,7 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -2579,7 +2665,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", diff --git a/package.json b/package.json index 955c1989ab..e485ee9239 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "socket.io-parser": "~4.0.0" }, "devDependencies": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.7", "@types/node": "^14.11.2", "babel-eslint": "^10.1.0", "eslint": "^7.9.0", From bb43ff2988a3eed196d7bb1a740b9c4764af757a Mon Sep 17 00:00:00 2001 From: Alessandro Magionami Date: Sun, 4 Oct 2020 23:20:05 +0200 Subject: [PATCH 330/494] docs: add example with fastify (#3654) See https://github.com/alemagio/fastify-socket.io --- Readme.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Readme.md b/Readme.md index dd2dc4afb4..211a41d4cf 100644 --- a/Readme.md +++ b/Readme.md @@ -138,6 +138,19 @@ io.on('connection', () => { /* … */ }); server.listen(3000); ``` +### In conjunction with Fastify + +To integrate Socket.io in your Fastify application you just need to +register `fastify-socket.io` plugin. It will create a `decorator` +called `io`. + +```js +const app = require('fastify')(); +app.register(require('fastify-socket.io')); +app.io.on('connection', () => { /* … */ }); +app.listen(3000); +``` + ## Documentation Please see the documentation [here](https://socket.io/docs/). From 4396bd0b3d6537f027a317d3e2642216ed7389bb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 6 Oct 2020 22:38:33 +0200 Subject: [PATCH 331/494] chore: point towards the develop branch of the client The package-lock.json file is temporarily removed in order to include the latest commits to the client and make the tests pass. --- .gitignore | 3 +- dist/client.d.ts | 94 + dist/client.js | 237 ++ dist/index.d.ts | 253 ++ dist/index.js | 429 ++++ dist/namespace.d.ts | 128 + dist/namespace.js | 267 ++ dist/parent-namespace.d.ts | 9 + dist/parent-namespace.js | 36 + dist/socket.d.ts | 252 ++ dist/socket.js | 480 ++++ package-lock.json | 4764 ------------------------------------ package.json | 2 +- 13 files changed, 2187 insertions(+), 4767 deletions(-) create mode 100644 dist/client.d.ts create mode 100644 dist/client.js create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/namespace.d.ts create mode 100644 dist/namespace.js create mode 100644 dist/parent-namespace.d.ts create mode 100644 dist/parent-namespace.js create mode 100644 dist/socket.d.ts create mode 100644 dist/socket.js delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 7e78cb2147..9b8b77d61a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,4 @@ benchmarks/*.png node_modules coverage .idea -dist -.nyc_output \ No newline at end of file +.nyc_output diff --git a/dist/client.d.ts b/dist/client.d.ts new file mode 100644 index 0000000000..44c0542f35 --- /dev/null +++ b/dist/client.d.ts @@ -0,0 +1,94 @@ +/// +import { IncomingMessage } from "http"; +import { Server } from "./index"; +import { Socket } from "./socket"; +export declare class Client { + readonly conn: any; + /** @package */ + readonly id: string; + private readonly server; + private readonly encoder; + private readonly decoder; + private sockets; + private nsps; + private connectBuffer; + /** + * Client constructor. + * + * @param {Server} server instance + * @param {Socket} conn + * @package + */ + constructor(server: Server, conn: any); + /** + * @return the reference to the request that originated the Engine.IO connection + */ + get request(): IncomingMessage; + /** + * Sets up event listeners. + */ + private setup; + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {Object} query the query parameters + * @package + */ + connect(name: any, query?: {}): void; + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {String} query the query parameters + */ + private doConnect; + /** + * Disconnects from all namespaces and closes transport. + * + * @package + */ + disconnect(): void; + /** + * Removes a socket. Called by each `Socket`. + * + * @package + */ + remove(socket: Socket): void; + /** + * Closes the underlying connection. + */ + private close; + /** + * Writes a packet to the transport. + * + * @param {Object} packet object + * @param {Object} opts + * @package + */ + packet(packet: any, opts?: any): void; + /** + * Called with incoming transport data. + */ + private ondata; + /** + * Called when parser fully decodes a packet. + */ + private ondecoded; + /** + * Handles an error. + * + * @param {Object} err object + */ + private onerror; + /** + * Called upon transport close. + * + * @param reason + */ + private onclose; + /** + * Cleans up event listeners. + */ + private destroy; +} diff --git a/dist/client.js b/dist/client.js new file mode 100644 index 0000000000..c2293f716e --- /dev/null +++ b/dist/client.js @@ -0,0 +1,237 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Client = void 0; +const socket_io_parser_1 = require("socket.io-parser"); +const url_1 = __importDefault(require("url")); +const debugModule = require("debug"); +const debug = debugModule("socket.io:client"); +class Client { + /** + * Client constructor. + * + * @param {Server} server instance + * @param {Socket} conn + * @package + */ + constructor(server, conn) { + this.sockets = new Map(); + this.nsps = new Map(); + this.connectBuffer = []; + this.server = server; + this.conn = conn; + this.encoder = server.encoder; + this.decoder = new server.parser.Decoder(); + this.id = conn.id; + this.setup(); + } + /** + * @return the reference to the request that originated the Engine.IO connection + */ + get request() { + return this.conn.request; + } + /** + * Sets up event listeners. + */ + setup() { + this.onclose = this.onclose.bind(this); + this.ondata = this.ondata.bind(this); + this.onerror = this.onerror.bind(this); + this.ondecoded = this.ondecoded.bind(this); + // @ts-ignore + this.decoder.on("decoded", this.ondecoded); + this.conn.on("data", this.ondata); + this.conn.on("error", this.onerror); + this.conn.on("close", this.onclose); + } + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {Object} query the query parameters + * @package + */ + connect(name, query = {}) { + if (this.server.nsps.has(name)) { + debug("connecting to namespace %s", name); + return this.doConnect(name, query); + } + this.server.checkNamespace(name, query, dynamicNsp => { + if (dynamicNsp) { + debug("dynamic namespace %s was created", dynamicNsp.name); + this.doConnect(name, query); + } + else { + debug("creation of namespace %s was denied", name); + this.packet({ + type: socket_io_parser_1.PacketType.ERROR, + nsp: name, + data: "Invalid namespace" + }); + } + }); + } + /** + * Connects a client to a namespace. + * + * @param {String} name namespace + * @param {String} query the query parameters + */ + doConnect(name, query) { + const nsp = this.server.of(name); + if ("/" != name && !this.nsps.has("/")) { + this.connectBuffer.push(name); + return; + } + const socket = nsp.add(this, query, () => { + this.sockets.set(socket.id, socket); + this.nsps.set(nsp.name, socket); + if ("/" == nsp.name && this.connectBuffer.length > 0) { + this.connectBuffer.forEach(this.connect, this); + this.connectBuffer = []; + } + }); + } + /** + * Disconnects from all namespaces and closes transport. + * + * @package + */ + disconnect() { + for (const socket of this.sockets.values()) { + socket.disconnect(); + } + this.sockets.clear(); + this.close(); + } + /** + * Removes a socket. Called by each `Socket`. + * + * @package + */ + remove(socket) { + if (this.sockets.has(socket.id)) { + const nsp = this.sockets.get(socket.id).nsp.name; + this.sockets.delete(socket.id); + this.nsps.delete(nsp); + } + else { + debug("ignoring remove for %s", socket.id); + } + } + /** + * Closes the underlying connection. + */ + close() { + if ("open" == this.conn.readyState) { + debug("forcing transport close"); + this.conn.close(); + this.onclose("forced server close"); + } + } + /** + * Writes a packet to the transport. + * + * @param {Object} packet object + * @param {Object} opts + * @package + */ + packet(packet, opts) { + opts = opts || {}; + const self = this; + // this writes to the actual connection + function writeToEngine(encodedPackets) { + if (opts.volatile && !self.conn.transport.writable) + return; + for (let i = 0; i < encodedPackets.length; i++) { + self.conn.write(encodedPackets[i], { compress: opts.compress }); + } + } + if ("open" == this.conn.readyState) { + debug("writing packet %j", packet); + if (!opts.preEncoded) { + // not broadcasting, need to encode + writeToEngine(this.encoder.encode(packet)); // encode, then write results to engine + } + else { + // a broadcast pre-encodes a packet + writeToEngine(packet); + } + } + else { + debug("ignoring packet write %j", packet); + } + } + /** + * Called with incoming transport data. + */ + ondata(data) { + // try/catch is needed for protocol violations (GH-1880) + try { + this.decoder.add(data); + } + catch (e) { + this.onerror(e); + } + } + /** + * Called when parser fully decodes a packet. + */ + ondecoded(packet) { + if (socket_io_parser_1.PacketType.CONNECT == packet.type) { + this.connect(url_1.default.parse(packet.nsp).pathname, url_1.default.parse(packet.nsp, true).query); + } + else { + const socket = this.nsps.get(packet.nsp); + if (socket) { + process.nextTick(function () { + socket.onpacket(packet); + }); + } + else { + debug("no socket for namespace %s", packet.nsp); + } + } + } + /** + * Handles an error. + * + * @param {Object} err object + */ + onerror(err) { + for (const socket of this.sockets.values()) { + socket.onerror(err); + } + this.conn.close(); + } + /** + * Called upon transport close. + * + * @param reason + */ + onclose(reason) { + debug("client close with reason %s", reason); + // ignore a potential subsequent `close` event + this.destroy(); + // `nsps` and `sockets` are cleaned up seamlessly + for (const socket of this.sockets.values()) { + socket.onclose(reason); + } + this.sockets.clear(); + this.decoder.destroy(); // clean up decoder + } + /** + * Cleans up event listeners. + */ + destroy() { + this.conn.removeListener("data", this.ondata); + this.conn.removeListener("error", this.onerror); + this.conn.removeListener("close", this.onclose); + // @ts-ignore + this.decoder.removeListener("decoded", this.ondecoded); + } +} +exports.Client = Client; diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000000..7d6f439af0 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,253 @@ +/// +import http from "http"; +import { Client } from "./client"; +import { EventEmitter } from "events"; +import { Namespace } from "./namespace"; +import { ParentNamespace } from "./parent-namespace"; +import { Encoder } from "socket.io-parser"; +import { Socket } from "./socket"; +import { CookieSerializeOptions } from "cookie"; +import { CorsOptions } from "cors"; +declare type Transport = "polling" | "websocket"; +interface EngineOptions { + /** + * how many ms without a pong packet to consider the connection closed (5000) + */ + pingTimeout: number; + /** + * how many ms before sending a new ping packet (25000) + */ + pingInterval: number; + /** + * how many ms before an uncompleted transport upgrade is cancelled (10000) + */ + upgradeTimeout: number; + /** + * how many bytes or characters a message can be, before closing the session (to avoid DoS). Default value is 1E5. + */ + maxHttpBufferSize: number; + /** + * A function that receives a given handshake or upgrade request as its first parameter, + * and can decide whether to continue or not. The second argument is a function that needs + * to be called with the decided information: fn(err, success), where success is a boolean + * value where false means that the request is rejected, and err is an error code. + */ + allowRequest: (req: http.IncomingMessage, fn: (err: string | null | undefined, success: boolean) => void) => void; + /** + * to allow connections to (['polling', 'websocket']) + */ + transports: Transport[]; + /** + * whether to allow transport upgrades (true) + */ + allowUpgrades: boolean; + /** + * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. (false) + */ + perMessageDeflate: boolean | object; + /** + * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. (true) + */ + httpCompression: boolean | object; + /** + * what WebSocket server implementation to use. Specified module must + * conform to the ws interface (see ws module api docs). Default value is ws. + * An alternative c++ addon is also available by installing uws module. + */ + wsEngine: string; + /** + * an optional packet which will be concatenated to the handshake packet emitted by Engine.IO. + */ + initialPacket: any; + /** + * configuration of the cookie that contains the client sid to send as part of handshake response headers. This cookie + * might be used for sticky-session. Defaults to not sending any cookie (false) + */ + cookie: CookieSerializeOptions | boolean; + /** + * the options that will be forwarded to the cors module + */ + cors: CorsOptions; +} +interface AttachOptions { + /** + * name of the path to capture (/engine.io). + */ + path: string; + /** + * destroy unhandled upgrade requests (true) + */ + destroyUpgrade: boolean; + /** + * milliseconds after which unhandled requests are ended (1000) + */ + destroyUpgradeTimeout: number; +} +interface EngineAttachOptions extends EngineOptions, AttachOptions { +} +export interface ServerOptions extends EngineAttachOptions { + /** + * name of the path to capture (/socket.io) + */ + path: string; + /** + * whether to serve the client files (true) + */ + serveClient: boolean; + /** + * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. + */ + adapter: any; + /** + * the allowed origins (*:*) + */ + origins: string | string[]; + /** + * the parser to use. Defaults to an instance of the Parser that ships with socket.io. + */ + parser: any; +} +declare class Server extends EventEmitter { + readonly sockets: Namespace; + /** @package */ + readonly parser: any; + /** @package */ + readonly encoder: Encoder; + private nsps; + private parentNsps; + private _adapter; + private _origins; + private _serveClient; + private eio; + private engine; + private _path; + private httpServer; + /** + * Server constructor. + * + * @param {http.Server|Number|Object} srv http server, port or options + * @param {Object} [opts] + */ + constructor(opts?: Partial); + constructor(srv: http.Server, opts?: Partial); + constructor(srv: number, opts?: Partial); + /** + * Server request verification function, that checks for allowed origins + * + * @param {http.IncomingMessage} req request + * @param {Function} fn callback to be called with the result: `fn(err, success)` + */ + private checkRequest; + /** + * Sets/gets whether client code is being served. + * + * @param {Boolean} v - whether to serve client code + * @return {Server|Boolean} self when setting or value when getting + */ + serveClient(v?: boolean): boolean | this; + /** + * Executes the middleware for an incoming namespace not already created on the server. + * + * @param {String} name - name of incoming namespace + * @param {Object} query - the query parameters + * @param {Function} fn - callback + * + * @package + */ + checkNamespace(name: string, query: object, fn: (nsp: Namespace | boolean) => void): void; + /** + * Sets the client serving path. + * + * @param {String} v pathname + * @return {Server|String} self when setting or value when getting + */ + path(v?: string): string | this; + /** + * Sets the adapter for rooms. + * + * @param {Adapter} v pathname + * @return {Server|Adapter} self when setting or value when getting + */ + adapter(v: any): any; + /** + * Sets the allowed origins for requests. + * + * @param {String|String[]} v origins + * @return {Server|Adapter} self when setting or value when getting + */ + origins(v: any): any; + /** + * Attaches socket.io to a server or port. + * + * @param {http.Server|Number} srv - server or port + * @param {Object} opts - options passed to engine.io + * @return {Server} self + */ + listen(srv: http.Server, opts?: Partial): Server; + listen(srv: number, opts?: Partial): Server; + /** + * Attaches socket.io to a server or port. + * + * @param {http.Server|Number} srv - server or port + * @param {Object} opts - options passed to engine.io + * @return {Server} self + */ + attach(srv: http.Server, opts?: Partial): Server; + attach(port: number, opts?: Partial): Server; + /** + * Initialize engine + * + * @param srv - the server to attach to + * @param opts - options passed to engine.io + */ + private initEngine; + /** + * Attaches the static file serving. + * + * @param {Function|http.Server} srv http server + */ + private attachServe; + /** + * Handles a request serving `/socket.io.js` + * + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + */ + private serve; + /** + * Handles a request serving `/socket.io.js.map` + * + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + */ + private serveMap; + /** + * Binds socket.io to an engine.io instance. + * + * @param {engine.Server} engine engine.io (or compatible) server + * @return {Server} self + */ + bind(engine: any): Server; + /** + * Called with each incoming transport connection. + * + * @param {engine.Socket} conn + * @return {Server} self + */ + private onconnection; + /** + * Looks up a namespace. + * + * @param {String|RegExp|Function} name nsp name + * @param {Function} [fn] optional, nsp `connection` ev handler + */ + of(name: string | RegExp | ((name: string, query: object, fn: (err: Error, success: boolean) => void) => void), fn?: (socket: Socket) => void): Namespace | ParentNamespace; + /** + * Closes server connection + * + * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed + */ + close(fn: (err?: Error) => void): void; +} +export { Server, Namespace, ParentNamespace, Client }; +export * from "./socket"; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000000..b50eaae1bb --- /dev/null +++ b/dist/index.js @@ -0,0 +1,429 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Client = exports.ParentNamespace = exports.Namespace = exports.Server = void 0; +const http_1 = __importDefault(require("http")); +const fs_1 = require("fs"); +const path_1 = __importDefault(require("path")); +const engine_io_1 = __importDefault(require("engine.io")); +const client_1 = require("./client"); +Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } }); +const events_1 = require("events"); +const namespace_1 = require("./namespace"); +Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return namespace_1.Namespace; } }); +const parent_namespace_1 = require("./parent-namespace"); +Object.defineProperty(exports, "ParentNamespace", { enumerable: true, get: function () { return parent_namespace_1.ParentNamespace; } }); +const socket_io_adapter_1 = require("socket.io-adapter"); +const parser = __importStar(require("socket.io-parser")); +const socket_io_parser_1 = require("socket.io-parser"); +const url_1 = __importDefault(require("url")); +const debug_1 = __importDefault(require("debug")); +const debug = debug_1.default("socket.io:server"); +const clientVersion = require("socket.io-client/package.json").version; +/** + * Socket.IO client source. + */ +let clientSource = undefined; +let clientSourceMap = undefined; +class Server extends events_1.EventEmitter { + constructor(srv, opts = {}) { + super(); + this.nsps = new Map(); + this.parentNsps = new Map(); + if ("object" == typeof srv && srv instanceof Object && !srv.listen) { + opts = srv; + srv = null; + } + this.path(opts.path || "/socket.io"); + this.serveClient(false !== opts.serveClient); + this.parser = opts.parser || parser; + this.encoder = new this.parser.Encoder(); + this.adapter(opts.adapter || socket_io_adapter_1.Adapter); + this.origins(opts.origins || "*:*"); + this.sockets = this.of("/"); + if (srv) + this.attach(srv, opts); + } + /** + * Server request verification function, that checks for allowed origins + * + * @param {http.IncomingMessage} req request + * @param {Function} fn callback to be called with the result: `fn(err, success)` + */ + checkRequest(req, fn) { + let origin = req.headers.origin || req.headers.referer; + // file:// URLs produce a null Origin which can't be authorized via echo-back + if ("null" == origin || null == origin) + origin = "*"; + if (!!origin && typeof this._origins == "function") + return this._origins(origin, fn); + if (this._origins.indexOf("*:*") !== -1) + return fn(null, true); + if (origin) { + try { + const parts = url_1.default.parse(origin); + const defaultPort = "https:" == parts.protocol ? 443 : 80; + parts.port = parts.port != null ? parts.port : defaultPort; + const ok = ~this._origins.indexOf(parts.protocol + "//" + parts.hostname + ":" + parts.port) || + ~this._origins.indexOf(parts.hostname + ":" + parts.port) || + ~this._origins.indexOf(parts.hostname + ":*") || + ~this._origins.indexOf("*:" + parts.port); + debug("origin %s is %svalid", origin, !!ok ? "" : "not "); + return fn(null, !!ok); + } + catch (ex) { } + } + fn(null, false); + } + /** + * Sets/gets whether client code is being served. + * + * @param {Boolean} v - whether to serve client code + * @return {Server|Boolean} self when setting or value when getting + */ + serveClient(v) { + if (!arguments.length) + return this._serveClient; + this._serveClient = v; + const resolvePath = function (file) { + const filepath = path_1.default.resolve(__dirname, "./../../", file); + if (fs_1.existsSync(filepath)) { + return filepath; + } + return require.resolve(file); + }; + if (v && !clientSource) { + clientSource = fs_1.readFileSync(resolvePath("socket.io-client/dist/socket.io.js"), "utf-8"); + try { + clientSourceMap = fs_1.readFileSync(resolvePath("socket.io-client/dist/socket.io.js.map"), "utf-8"); + } + catch (err) { + debug("could not load sourcemap file"); + } + } + return this; + } + /** + * Executes the middleware for an incoming namespace not already created on the server. + * + * @param {String} name - name of incoming namespace + * @param {Object} query - the query parameters + * @param {Function} fn - callback + * + * @package + */ + checkNamespace(name, query, fn) { + if (this.parentNsps.size === 0) + return fn(false); + const keysIterator = this.parentNsps.keys(); + const run = () => { + let nextFn = keysIterator.next(); + if (nextFn.done) { + return fn(false); + } + nextFn.value(name, query, (err, allow) => { + if (err || !allow) { + run(); + } + else { + fn(this.parentNsps.get(nextFn.value).createChild(name)); + } + }); + }; + run(); + } + /** + * Sets the client serving path. + * + * @param {String} v pathname + * @return {Server|String} self when setting or value when getting + */ + path(v) { + if (!arguments.length) + return this._path; + this._path = v.replace(/\/$/, ""); + return this; + } + /** + * Sets the adapter for rooms. + * + * @param {Adapter} v pathname + * @return {Server|Adapter} self when setting or value when getting + */ + adapter(v) { + if (!arguments.length) + return this._adapter; + this._adapter = v; + for (const nsp of this.nsps.values()) { + nsp.initAdapter(); + } + return this; + } + /** + * Sets the allowed origins for requests. + * + * @param {String|String[]} v origins + * @return {Server|Adapter} self when setting or value when getting + */ + origins(v) { + if (!arguments.length) + return this._origins; + this._origins = v; + return this; + } + listen(srv, opts = {}) { + return this.attach(srv, opts); + } + attach(srv, opts = {}) { + if ("function" == typeof srv) { + const msg = "You are trying to attach socket.io to an express " + + "request handler function. Please pass a http.Server instance."; + throw new Error(msg); + } + // handle a port as a string + if (Number(srv) == srv) { + srv = Number(srv); + } + if ("number" == typeof srv) { + debug("creating http server and binding to %d", srv); + const port = srv; + srv = http_1.default.createServer((req, res) => { + res.writeHead(404); + res.end(); + }); + srv.listen(port); + } + // set engine.io path to `/socket.io` + opts.path = opts.path || this._path; + // set origins verification + opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); + if (this.sockets.fns.length > 0) { + this.initEngine(srv, opts); + return this; + } + const connectPacket = { type: socket_io_parser_1.PacketType.CONNECT, nsp: "/" }; + // the CONNECT packet will be merged with Engine.IO handshake, + // to reduce the number of round trips + opts.initialPacket = this.encoder.encode(connectPacket); + this.initEngine(srv, opts); + return this; + } + /** + * Initialize engine + * + * @param srv - the server to attach to + * @param opts - options passed to engine.io + */ + initEngine(srv, opts) { + // initialize engine + debug("creating engine.io instance with opts %j", opts); + this.eio = engine_io_1.default.attach(srv, opts); + // attach static file serving + if (this._serveClient) + this.attachServe(srv); + // Export http server + this.httpServer = srv; + // bind to engine events + this.bind(this.eio); + } + /** + * Attaches the static file serving. + * + * @param {Function|http.Server} srv http server + */ + attachServe(srv) { + debug("attaching client serving req handler"); + const url = this._path + "/socket.io.js"; + const urlMap = this._path + "/socket.io.js.map"; + const evs = srv.listeners("request").slice(0); + const self = this; + srv.removeAllListeners("request"); + srv.on("request", function (req, res) { + if (0 === req.url.indexOf(urlMap)) { + self.serveMap(req, res); + } + else if (0 === req.url.indexOf(url)) { + self.serve(req, res); + } + else { + for (let i = 0; i < evs.length; i++) { + evs[i].call(srv, req, res); + } + } + }); + } + /** + * Handles a request serving `/socket.io.js` + * + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + */ + serve(req, res) { + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + const expectedEtag = '"' + clientVersion + '"'; + const etag = req.headers["if-none-match"]; + if (etag) { + if (expectedEtag == etag) { + debug("serve client 304"); + res.writeHead(304); + res.end(); + return; + } + } + debug("serve client source"); + res.setHeader("Cache-Control", "public, max-age=0"); + res.setHeader("Content-Type", "application/javascript"); + res.setHeader("ETag", expectedEtag); + res.writeHead(200); + res.end(clientSource); + } + /** + * Handles a request serving `/socket.io.js.map` + * + * @param {http.IncomingMessage} req + * @param {http.ServerResponse} res + */ + serveMap(req, res) { + // Per the standard, ETags must be quoted: + // https://tools.ietf.org/html/rfc7232#section-2.3 + const expectedEtag = '"' + clientVersion + '"'; + const etag = req.headers["if-none-match"]; + if (etag) { + if (expectedEtag == etag) { + debug("serve client 304"); + res.writeHead(304); + res.end(); + return; + } + } + debug("serve client sourcemap"); + res.setHeader("Content-Type", "application/json"); + res.setHeader("ETag", expectedEtag); + res.writeHead(200); + res.end(clientSourceMap); + } + /** + * Binds socket.io to an engine.io instance. + * + * @param {engine.Server} engine engine.io (or compatible) server + * @return {Server} self + */ + bind(engine) { + this.engine = engine; + this.engine.on("connection", this.onconnection.bind(this)); + return this; + } + /** + * Called with each incoming transport connection. + * + * @param {engine.Socket} conn + * @return {Server} self + */ + onconnection(conn) { + debug("incoming connection with id %s", conn.id); + const client = new client_1.Client(this, conn); + client.connect("/"); + return this; + } + /** + * Looks up a namespace. + * + * @param {String|RegExp|Function} name nsp name + * @param {Function} [fn] optional, nsp `connection` ev handler + */ + of(name, fn) { + if (typeof name === "function" || name instanceof RegExp) { + const parentNsp = new parent_namespace_1.ParentNamespace(this); + debug("initializing parent namespace %s", parentNsp.name); + if (typeof name === "function") { + this.parentNsps.set(name, parentNsp); + } + else { + this.parentNsps.set((nsp, conn, next) => next(null, name.test(nsp)), parentNsp); + } + if (fn) { + // @ts-ignore + parentNsp.on("connect", fn); + } + return parentNsp; + } + if (String(name)[0] !== "/") + name = "/" + name; + let nsp = this.nsps.get(name); + if (!nsp) { + debug("initializing namespace %s", name); + nsp = new namespace_1.Namespace(this, name); + this.nsps.set(name, nsp); + } + if (fn) + nsp.on("connect", fn); + return nsp; + } + /** + * Closes server connection + * + * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed + */ + close(fn) { + for (const socket of this.sockets.sockets.values()) { + socket.onclose("server shutting down"); + } + this.engine.close(); + if (this.httpServer) { + this.httpServer.close(fn); + } + else { + fn && fn(); + } + } +} +exports.Server = Server; +/** + * Expose main namespace (/). + */ +const emitterMethods = Object.keys(events_1.EventEmitter.prototype).filter(function (key) { + return typeof events_1.EventEmitter.prototype[key] === "function"; +}); +emitterMethods + .concat(["to", "in", "use", "send", "write", "clients", "compress", "binary"]) + .forEach(function (fn) { + Server.prototype[fn] = function () { + return this.sockets[fn].apply(this.sockets, arguments); + }; +}); +["json", "volatile", "local"].forEach(function (flag) { + Object.defineProperty(Server.prototype, flag, { + get: function () { + this.sockets.flags = this.sockets.flags || {}; + this.sockets.flags[flag] = true; + return this; + } + }); +}); +__exportStar(require("./socket"), exports); +module.exports = (srv, opts) => new Server(srv, opts); diff --git a/dist/namespace.d.ts b/dist/namespace.d.ts new file mode 100644 index 0000000000..67d646f64b --- /dev/null +++ b/dist/namespace.d.ts @@ -0,0 +1,128 @@ +/// +import { Socket } from "./socket"; +import { Server } from "./index"; +import { EventEmitter } from "events"; +import { Adapter, Room, SocketId } from "socket.io-adapter"; +export declare class Namespace extends EventEmitter { + readonly name: string; + readonly connected: Map; + adapter: Adapter; + /** @package */ + readonly server: any; + /** @package */ + fns: Array<(socket: Socket, next: (err: Error) => void) => void>; + /** @package */ + rooms: Set; + /** @package */ + flags: any; + /** @package */ + ids: number; + /** @package */ + sockets: Map; + /** + * Namespace constructor. + * + * @param {Server} server instance + * @param {string} name + */ + constructor(server: Server, name: string); + /** + * Initializes the `Adapter` for this nsp. + * Run upon changing adapter by `Server#adapter` + * in addition to the constructor. + * + * @package + */ + initAdapter(): void; + /** + * Sets up namespace middleware. + * + * @return {Namespace} self + */ + use(fn: (socket: Socket, next: (err: Error) => void) => void): Namespace; + /** + * Executes the middleware for an incoming client. + * + * @param {Socket} socket - the socket that will get added + * @param {Function} fn - last fn call in the middleware + */ + private run; + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + */ + to(name: Room): Namespace; + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + */ + in(name: Room): Namespace; + /** + * Adds a new client. + * + * @return {Socket} + */ + private add; + /** + * Removes a client. Called by each `Socket`. + * + * @package + */ + remove(socket: Socket): void; + /** + * Emits to all clients. + * + * @return {Namespace} self + */ + emit(ev: any): Namespace; + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + send(...args: any[]): Namespace; + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + write(...args: any[]): Namespace; + /** + * Gets a list of clients. + * + * @return {Namespace} self + */ + allSockets(): Promise>; + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Namespace} self + */ + compress(compress: boolean): Namespace; + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Namespace} self + */ + binary(binary: boolean): Namespace; + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Namespace} self + */ + get volatile(): Namespace; + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Namespace} self + */ + get local(): Namespace; +} diff --git a/dist/namespace.js b/dist/namespace.js new file mode 100644 index 0000000000..9033585383 --- /dev/null +++ b/dist/namespace.js @@ -0,0 +1,267 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Namespace = void 0; +const socket_1 = require("./socket"); +const events_1 = require("events"); +const socket_io_parser_1 = require("socket.io-parser"); +const has_binary2_1 = __importDefault(require("has-binary2")); +const debug_1 = __importDefault(require("debug")); +const debug = debug_1.default("socket.io:namespace"); +/** + * Blacklisted events. + */ +const events = [ + "connect", + "connection", + "newListener" +]; +class Namespace extends events_1.EventEmitter { + /** + * Namespace constructor. + * + * @param {Server} server instance + * @param {string} name + */ + constructor(server, name) { + super(); + this.connected = new Map(); + /** @package */ + this.fns = []; + /** @package */ + this.rooms = new Set(); + /** @package */ + this.flags = {}; + /** @package */ + this.ids = 0; + /** @package */ + this.sockets = new Map(); + this.server = server; + this.name = name; + this.initAdapter(); + } + /** + * Initializes the `Adapter` for this nsp. + * Run upon changing adapter by `Server#adapter` + * in addition to the constructor. + * + * @package + */ + initAdapter() { + this.adapter = new (this.server.adapter())(this); + } + /** + * Sets up namespace middleware. + * + * @return {Namespace} self + */ + use(fn) { + if (this.server.eio && this.name === "/") { + debug("removing initial packet"); + delete this.server.eio.initialPacket; + } + this.fns.push(fn); + return this; + } + /** + * Executes the middleware for an incoming client. + * + * @param {Socket} socket - the socket that will get added + * @param {Function} fn - last fn call in the middleware + */ + run(socket, fn) { + const fns = this.fns.slice(0); + if (!fns.length) + return fn(null); + function run(i) { + fns[i](socket, function (err) { + // upon error, short-circuit + if (err) + return fn(err); + // if no middleware left, summon callback + if (!fns[i + 1]) + return fn(null); + // go on to next + run(i + 1); + }); + } + run(0); + } + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + */ + to(name) { + this.rooms.add(name); + return this; + } + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Namespace} self + */ + in(name) { + this.rooms.add(name); + return this; + } + /** + * Adds a new client. + * + * @return {Socket} + */ + add(client, query, fn) { + debug("adding socket to nsp %s", this.name); + const socket = new socket_1.Socket(this, client, query); + this.run(socket, err => { + process.nextTick(() => { + if ("open" == client.conn.readyState) { + if (err) + return socket.error(err.message); + // track socket + this.sockets.set(socket.id, socket); + // it's paramount that the internal `onconnect` logic + // fires before user-set events to prevent state order + // violations (such as a disconnection before the connection + // logic is complete) + socket.onconnect(); + if (fn) + fn(); + // fire user-set events + super.emit("connect", socket); + super.emit("connection", socket); + } + else { + debug("next called after client was closed - ignoring socket"); + } + }); + }); + return socket; + } + /** + * Removes a client. Called by each `Socket`. + * + * @package + */ + remove(socket) { + if (this.sockets.has(socket.id)) { + this.sockets.delete(socket.id); + } + else { + debug("ignoring remove for %s", socket.id); + } + } + /** + * Emits to all clients. + * + * @return {Namespace} self + */ + // @ts-ignore + emit(ev) { + if (~events.indexOf(ev)) { + super.emit.apply(this, arguments); + return this; + } + // set up packet object + const args = Array.prototype.slice.call(arguments); + const packet = { + type: (this.flags.binary !== undefined + ? this.flags.binary + : has_binary2_1.default(args)) + ? socket_io_parser_1.PacketType.BINARY_EVENT + : socket_io_parser_1.PacketType.EVENT, + data: args + }; + if ("function" == typeof args[args.length - 1]) { + throw new Error("Callbacks are not supported when broadcasting"); + } + const rooms = new Set(this.rooms); + const flags = Object.assign({}, this.flags); + // reset flags + this.rooms.clear(); + this.flags = {}; + this.adapter.broadcast(packet, { + rooms: rooms, + flags: flags + }); + return this; + } + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + send(...args) { + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + write(...args) { + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Gets a list of clients. + * + * @return {Namespace} self + */ + allSockets() { + if (!this.adapter) { + throw new Error("No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?"); + } + const rooms = new Set(this.rooms); + this.rooms.clear(); + return this.adapter.sockets(rooms); + } + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Namespace} self + */ + compress(compress) { + this.flags.compress = compress; + return this; + } + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Namespace} self + */ + binary(binary) { + this.flags.binary = binary; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Namespace} self + */ + get volatile() { + this.flags.volatile = true; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Namespace} self + */ + get local() { + this.flags.local = true; + return this; + } +} +exports.Namespace = Namespace; diff --git a/dist/parent-namespace.d.ts b/dist/parent-namespace.d.ts new file mode 100644 index 0000000000..65f817f6bc --- /dev/null +++ b/dist/parent-namespace.d.ts @@ -0,0 +1,9 @@ +import { Namespace } from "./namespace"; +export declare class ParentNamespace extends Namespace { + private static count; + private children; + constructor(server: any); + initAdapter(): void; + emit(...args: any[]): Namespace; + createChild(name: any): Namespace; +} diff --git a/dist/parent-namespace.js b/dist/parent-namespace.js new file mode 100644 index 0000000000..79e22348bb --- /dev/null +++ b/dist/parent-namespace.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ParentNamespace = void 0; +const namespace_1 = require("./namespace"); +class ParentNamespace extends namespace_1.Namespace { + constructor(server) { + super(server, "/_" + ParentNamespace.count++); + this.children = new Set(); + } + initAdapter() { } + emit(...args) { + this.children.forEach(nsp => { + nsp.rooms = this.rooms; + nsp.flags = this.flags; + nsp.emit.apply(nsp, args); + }); + this.rooms.clear(); + this.flags = {}; + return this; + } + createChild(name) { + const namespace = new namespace_1.Namespace(this.server, name); + namespace.fns = this.fns.slice(0); + this.listeners("connect").forEach(listener => + // @ts-ignore + namespace.on("connect", listener)); + this.listeners("connection").forEach(listener => + // @ts-ignore + namespace.on("connection", listener)); + this.children.add(namespace); + this.server.nsps.set(name, namespace); + return namespace; + } +} +exports.ParentNamespace = ParentNamespace; +ParentNamespace.count = 0; diff --git a/dist/socket.d.ts b/dist/socket.d.ts new file mode 100644 index 0000000000..45fd9c94ce --- /dev/null +++ b/dist/socket.d.ts @@ -0,0 +1,252 @@ +/// +import { EventEmitter } from "events"; +import { Client, Namespace } from "./index"; +import { IncomingMessage } from "http"; +import { Room, SocketId } from "socket.io-adapter"; +/** + * The handshake details + */ +export interface Handshake { + /** + * The headers sent as part of the handshake + */ + headers: object; + /** + * The date of creation (as string) + */ + time: string; + /** + * The ip of the client + */ + address: string; + /** + * Whether the connection is cross-domain + */ + xdomain: boolean; + /** + * Whether the connection is secure + */ + secure: boolean; + /** + * The date of creation (as unix timestamp) + */ + issued: number; + /** + * The request URL string + */ + url: string; + /** + * The query object + */ + query: object; +} +export declare class Socket extends EventEmitter { + readonly nsp: Namespace; + readonly client: Client; + readonly id: SocketId; + readonly handshake: Handshake; + connected: boolean; + disconnected: boolean; + private readonly server; + private readonly adapter; + private acks; + private fns; + private flags; + private _rooms; + /** + * Interface to a `Client` for a given `Namespace`. + * + * @param {Namespace} nsp + * @param {Client} client + * @param {Object} query + * @package + */ + constructor(nsp: Namespace, client: Client, query: any); + /** + * Builds the `handshake` BC object + */ + private buildHandshake; + /** + * Emits to this client. + * + * @return {Socket} self + */ + emit(ev: any): this; + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + */ + to(name: Room): this; + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + */ + in(name: Room): Socket; + /** + * Sends a `message` event. + * + * @return {Socket} self + */ + send(...args: any[]): Socket; + /** + * Sends a `message` event. + * + * @return {Socket} self + */ + write(...args: any[]): Socket; + /** + * Writes a packet. + * + * @param {Object} packet - packet object + * @param {Object} opts - options + */ + private packet; + /** + * Joins a room. + * + * @param {String|Array} rooms - room or array of rooms + * @param {Function} fn - optional, callback + * @return {Socket} self + */ + join(rooms: Room | Array, fn?: (err: Error) => void): Socket; + /** + * Leaves a room. + * + * @param {String} room + * @param {Function} fn - optional, callback + * @return {Socket} self + */ + leave(room: string, fn?: (err: Error) => void): Socket; + /** + * Leave all rooms. + */ + private leaveAll; + /** + * Called by `Namespace` upon successful + * middleware execution (ie: authorization). + * Socket is added to namespace array before + * call to join, so adapters can access it. + * + * @package + */ + onconnect(): void; + /** + * Called with each packet. Called by `Client`. + * + * @param {Object} packet + * @package + */ + onpacket(packet: any): void; + /** + * Called upon event packet. + * + * @param {Object} packet - packet object + */ + private onevent; + /** + * Produces an ack callback to emit with an event. + * + * @param {Number} id - packet id + */ + private ack; + /** + * Called upon ack packet. + */ + private onack; + /** + * Called upon client disconnect packet. + */ + private ondisconnect; + /** + * Handles a client error. + * + * @package + */ + onerror(err: any): void; + /** + * Called upon closing. Called by `Client`. + * + * @param {String} reason + * @throw {Error} optional error object + * + * @package + */ + onclose(reason: string): this; + /** + * Produces an `error` packet. + * + * @param {Object} err - error object + * + * @package + */ + error(err: any): void; + /** + * Disconnects this client. + * + * @param {Boolean} close - if `true`, closes the underlying connection + * @return {Socket} self + */ + disconnect(close?: boolean): Socket; + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Socket} self + */ + compress(compress: boolean): Socket; + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + */ + binary(binary: boolean): Socket; + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Socket} self + */ + get volatile(): Socket; + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the + * sender. + * + * @return {Socket} self + */ + get broadcast(): Socket; + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Socket} self + */ + get local(): Socket; + /** + * Dispatch incoming event to socket listeners. + * + * @param {Array} event - event that will get emitted + */ + private dispatch; + /** + * Sets up socket middleware. + * + * @param {Function} fn - middleware function (event, next) + * @return {Socket} self + */ + use(fn: (event: Array, next: (err: Error) => void) => void): Socket; + /** + * Executes the middleware for an incoming event. + * + * @param {Array} event - event that will get emitted + * @param {Function} fn - last fn call in the middleware + */ + private run; + get request(): IncomingMessage; + get conn(): any; + get rooms(): Set; +} diff --git a/dist/socket.js b/dist/socket.js new file mode 100644 index 0000000000..dac931a3b6 --- /dev/null +++ b/dist/socket.js @@ -0,0 +1,480 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Socket = void 0; +const events_1 = require("events"); +const socket_io_parser_1 = require("socket.io-parser"); +const has_binary2_1 = __importDefault(require("has-binary2")); +const url_1 = __importDefault(require("url")); +const debug_1 = __importDefault(require("debug")); +const debug = debug_1.default("socket.io:socket"); +/** + * Blacklisted events. + */ +const events = [ + "error", + "connect", + "disconnect", + "disconnecting", + "newListener", + "removeListener" +]; +class Socket extends events_1.EventEmitter { + /** + * Interface to a `Client` for a given `Namespace`. + * + * @param {Namespace} nsp + * @param {Client} client + * @param {Object} query + * @package + */ + constructor(nsp, client, query) { + super(); + this.nsp = nsp; + this.client = client; + this.acks = new Map(); + this.fns = []; + this.flags = {}; + this._rooms = new Set(); + this.server = nsp.server; + this.adapter = this.nsp.adapter; + this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; + this.connected = true; + this.disconnected = false; + this.handshake = this.buildHandshake(query); + } + /** + * Builds the `handshake` BC object + */ + buildHandshake(query) { + const self = this; + function buildQuery() { + const requestQuery = url_1.default.parse(self.request.url, true).query; + //if socket-specific query exist, replace query strings in requestQuery + return Object.assign({}, query, requestQuery); + } + return { + headers: this.request.headers, + time: new Date() + "", + address: this.conn.remoteAddress, + xdomain: !!this.request.headers.origin, + // @ts-ignore + secure: !!this.request.connection.encrypted, + issued: +new Date(), + url: this.request.url, + query: buildQuery() + }; + } + /** + * Emits to this client. + * + * @return {Socket} self + */ + // @ts-ignore + emit(ev) { + if (~events.indexOf(ev)) { + super.emit.apply(this, arguments); + return this; + } + const args = Array.prototype.slice.call(arguments); + const packet = { + type: (this.flags.binary !== undefined + ? this.flags.binary + : has_binary2_1.default(args)) + ? socket_io_parser_1.PacketType.BINARY_EVENT + : socket_io_parser_1.PacketType.EVENT, + data: args + }; + // access last argument to see if it's an ACK callback + if (typeof args[args.length - 1] === "function") { + if (this._rooms.size || this.flags.broadcast) { + throw new Error("Callbacks are not supported when broadcasting"); + } + debug("emitting packet with ack id %d", this.nsp.ids); + this.acks.set(this.nsp.ids, args.pop()); + packet.id = this.nsp.ids++; + } + const rooms = new Set(this._rooms); + const flags = Object.assign({}, this.flags); + // reset flags + this._rooms.clear(); + this.flags = {}; + if (rooms.size || flags.broadcast) { + this.adapter.broadcast(packet, { + except: new Set([this.id]), + rooms: rooms, + flags: flags + }); + } + else { + // dispatch packet + this.packet(packet, flags); + } + return this; + } + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + */ + to(name) { + this._rooms.add(name); + return this; + } + /** + * Targets a room when broadcasting. + * + * @param {String} name + * @return {Socket} self + */ + in(name) { + this._rooms.add(name); + return this; + } + /** + * Sends a `message` event. + * + * @return {Socket} self + */ + send(...args) { + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Sends a `message` event. + * + * @return {Socket} self + */ + write(...args) { + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Writes a packet. + * + * @param {Object} packet - packet object + * @param {Object} opts - options + */ + packet(packet, opts = {}) { + packet.nsp = this.nsp.name; + opts.compress = false !== opts.compress; + this.client.packet(packet, opts); + } + /** + * Joins a room. + * + * @param {String|Array} rooms - room or array of rooms + * @param {Function} fn - optional, callback + * @return {Socket} self + */ + join(rooms, fn) { + debug("joining room %s", rooms); + this.adapter.addAll(this.id, new Set(Array.isArray(rooms) ? rooms : [rooms])); + debug("joined room %s", rooms); + fn && fn(null); + return this; + } + /** + * Leaves a room. + * + * @param {String} room + * @param {Function} fn - optional, callback + * @return {Socket} self + */ + leave(room, fn) { + debug("leave room %s", room); + this.adapter.del(this.id, room); + debug("left room %s", room); + fn && fn(null); + return this; + } + /** + * Leave all rooms. + */ + leaveAll() { + this.adapter.delAll(this.id); + } + /** + * Called by `Namespace` upon successful + * middleware execution (ie: authorization). + * Socket is added to namespace array before + * call to join, so adapters can access it. + * + * @package + */ + onconnect() { + debug("socket connected - writing packet"); + this.nsp.connected.set(this.id, this); + this.join(this.id); + const skip = this.nsp.name === "/" && this.nsp.fns.length === 0; + if (skip) { + debug("packet already sent in initial handshake"); + } + else { + this.packet({ type: socket_io_parser_1.PacketType.CONNECT }); + } + } + /** + * Called with each packet. Called by `Client`. + * + * @param {Object} packet + * @package + */ + onpacket(packet) { + debug("got packet %j", packet); + switch (packet.type) { + case socket_io_parser_1.PacketType.EVENT: + this.onevent(packet); + break; + case socket_io_parser_1.PacketType.BINARY_EVENT: + this.onevent(packet); + break; + case socket_io_parser_1.PacketType.ACK: + this.onack(packet); + break; + case socket_io_parser_1.PacketType.BINARY_ACK: + this.onack(packet); + break; + case socket_io_parser_1.PacketType.DISCONNECT: + this.ondisconnect(); + break; + case socket_io_parser_1.PacketType.ERROR: + this.onerror(new Error(packet.data)); + } + } + /** + * Called upon event packet. + * + * @param {Object} packet - packet object + */ + onevent(packet) { + const args = packet.data || []; + debug("emitting event %j", args); + if (null != packet.id) { + debug("attaching ack callback to event"); + args.push(this.ack(packet.id)); + } + this.dispatch(args); + } + /** + * Produces an ack callback to emit with an event. + * + * @param {Number} id - packet id + */ + ack(id) { + const self = this; + let sent = false; + return function () { + // prevent double callbacks + if (sent) + return; + const args = Array.prototype.slice.call(arguments); + debug("sending ack %j", args); + self.packet({ + id: id, + type: has_binary2_1.default(args) ? socket_io_parser_1.PacketType.BINARY_ACK : socket_io_parser_1.PacketType.ACK, + data: args + }); + sent = true; + }; + } + /** + * Called upon ack packet. + */ + onack(packet) { + const ack = this.acks.get(packet.id); + if ("function" == typeof ack) { + debug("calling ack %s with %j", packet.id, packet.data); + ack.apply(this, packet.data); + this.acks.delete(packet.id); + } + else { + debug("bad ack %s", packet.id); + } + } + /** + * Called upon client disconnect packet. + */ + ondisconnect() { + debug("got disconnect packet"); + this.onclose("client namespace disconnect"); + } + /** + * Handles a client error. + * + * @package + */ + onerror(err) { + if (this.listeners("error").length) { + super.emit("error", err); + } + else { + console.error("Missing error handler on `socket`."); + console.error(err.stack); + } + } + /** + * Called upon closing. Called by `Client`. + * + * @param {String} reason + * @throw {Error} optional error object + * + * @package + */ + onclose(reason) { + if (!this.connected) + return this; + debug("closing socket - reason %s", reason); + super.emit("disconnecting", reason); + this.leaveAll(); + this.nsp.remove(this); + this.client.remove(this); + this.connected = false; + this.disconnected = true; + this.nsp.connected.delete(this.id); + super.emit("disconnect", reason); + } + /** + * Produces an `error` packet. + * + * @param {Object} err - error object + * + * @package + */ + error(err) { + this.packet({ type: socket_io_parser_1.PacketType.ERROR, data: err }); + } + /** + * Disconnects this client. + * + * @param {Boolean} close - if `true`, closes the underlying connection + * @return {Socket} self + */ + disconnect(close = false) { + if (!this.connected) + return this; + if (close) { + this.client.disconnect(); + } + else { + this.packet({ type: socket_io_parser_1.PacketType.DISCONNECT }); + this.onclose("server namespace disconnect"); + } + return this; + } + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Socket} self + */ + compress(compress) { + this.flags.compress = compress; + return this; + } + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Socket} self + */ + binary(binary) { + this.flags.binary = binary; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Socket} self + */ + get volatile() { + this.flags.volatile = true; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the + * sender. + * + * @return {Socket} self + */ + get broadcast() { + this.flags.broadcast = true; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Socket} self + */ + get local() { + this.flags.local = true; + return this; + } + /** + * Dispatch incoming event to socket listeners. + * + * @param {Array} event - event that will get emitted + */ + dispatch(event) { + debug("dispatching an event %j", event); + this.run(event, err => { + process.nextTick(() => { + if (err) { + return this.error(err.message); + } + super.emit.apply(this, event); + }); + }); + } + /** + * Sets up socket middleware. + * + * @param {Function} fn - middleware function (event, next) + * @return {Socket} self + */ + use(fn) { + this.fns.push(fn); + return this; + } + /** + * Executes the middleware for an incoming event. + * + * @param {Array} event - event that will get emitted + * @param {Function} fn - last fn call in the middleware + */ + run(event, fn) { + const fns = this.fns.slice(0); + if (!fns.length) + return fn(null); + function run(i) { + fns[i](event, function (err) { + // upon error, short-circuit + if (err) + return fn(err); + // if no middleware left, summon callback + if (!fns[i + 1]) + return fn(null); + // go on to next + run(i + 1); + }); + } + run(0); + } + get request() { + return this.client.request; + } + get conn() { + return this.client.conn; + } + get rooms() { + return this.adapter.socketRooms(this.id) || new Set(); + } +} +exports.Socket = Socket; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 56bf5afbe5..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,4764 +0,0 @@ -{ - "name": "socket.io", - "version": "2.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", - "dev": true - }, - "@types/cors": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.7.tgz", - "integrity": "sha512-sOdDRU3oRS7LBNTIqwDkPJyq0lpHYcbMTt0TrjzsXbk/e37hcLTH6eZX7CdbDeN0yJJvzw9hFBZkbtCSbk/jAQ==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/express": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", - "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", - "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", - "dev": true - }, - "@types/node": { - "version": "14.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", - "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", - "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "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" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "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" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "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" - } - } - } - }, - "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 - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "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" - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "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 - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "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 - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "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 - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "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 - }, - "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - } - }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "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 - }, - "eslint": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", - "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - } - }, - "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 - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "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 - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "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" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "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.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "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" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "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-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": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "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 - }, - "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 - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "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 - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.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": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "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" - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "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==" - }, - "nyc": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", - "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.10.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.4.0", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", - "yargs": "11.1.0", - "yargs-parser": "^8.0.0" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "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-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "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-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "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": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "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" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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 - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "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" - } - } - } - }, - "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 - }, - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "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" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": 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 - }, - "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" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "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 - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "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.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "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" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "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 - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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 - } - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "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 - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "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" - } - } - } - }, - "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" - } - }, - "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 - } - } - }, - "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" - } - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.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" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "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" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "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 - }, - "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" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "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-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": 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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "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": { - "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" - } - } - } - }, - "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" - } - } - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "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" - } - }, - "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-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" - } - }, - "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-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-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" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "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-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": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "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 - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", - "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.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" - } - } - } - }, - "istanbul-reports": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.4.0.tgz", - "integrity": "sha512-OPzVo1fPZ2H+owr8q/LYKLD+vquv9Pj4F+dj808MdHbuQLD7S4ACRjcX+0Tne5Vxt2lxXvdZaL7v+FOOAV281w==", - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "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" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "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.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.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-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" - } - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "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": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "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-odd": "^2.0.0", - "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" - }, - "dependencies": { - "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 - }, - "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 - }, - "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 - } - } - }, - "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-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" - } - }, - "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 - }, - "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" - } - } - } - }, - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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" - } - }, - "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-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "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-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "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 - }, - "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" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "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-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.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "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" - } - }, - "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" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "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 - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "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" - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "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" - } - }, - "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": "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 - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "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 - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "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" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "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" - } - } - } - }, - "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 - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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 - } - } - }, - "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" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "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 - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "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" - } - } - } - }, - "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-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "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 - }, - "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "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 - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "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-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-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" - } - }, - "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 - } - } - }, - "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" - } - } - } - }, - "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" - } - } - } - }, - "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" - } - }, - "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" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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 - }, - "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" - } - } - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "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" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "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" - } - } - } - }, - "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 - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "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 - } - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "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 - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": 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": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "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, - "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, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.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", - "yargs-parser": "^9.0.2" - }, - "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 - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "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" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.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-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "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 - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "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 - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "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 - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "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.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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" - } - } - } - }, - "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": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "socket.io-adapter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.1.tgz", - "integrity": "sha512-Q5Xakktk8mbwzAXD1Q8EnLDfnBflU1vKbNmz0aWihqv7Mpddbaf71QkXqb6wk0w1ofJLfIsc4IFPLcf8/MZiSA==" - }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - } - } - }, - "socket.io-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.0.tgz", - "integrity": "sha512-uH2Pfy9AeKCokfhMRQ74aZ2/dXv14AJ83Fzzz7zbq9rRpM+1NGHWI8iGcrP4E0MxKEvh7LochViCEX8cU+5DWg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~4.1.0" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "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" - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "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" - } - } - } - }, - "supertest": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", - "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^3.8.3" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/package.json b/package.json index e485ee9239..b7ffda4a6f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~2.0.1", - "socket.io-client": "2.3.0", + "socket.io-client": "github:socketio/socket.io-client#develop", "socket.io-parser": "~4.0.0" }, "devDependencies": { From 64bd9fb01a396432fe9e1a0d4d1523e99d8c8617 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 6 Oct 2020 22:47:28 +0200 Subject: [PATCH 332/494] chore: include Engine.IO v4 Release notes: https://github.com/socketio/engine.io/releases/tag/4.0.0 --- dist/namespace.js | 2 +- lib/namespace.ts | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/namespace.js b/dist/namespace.js index 9033585383..92aba536a8 100644 --- a/dist/namespace.js +++ b/dist/namespace.js @@ -60,7 +60,7 @@ class Namespace extends events_1.EventEmitter { use(fn) { if (this.server.eio && this.name === "/") { debug("removing initial packet"); - delete this.server.eio.initialPacket; + delete this.server.eio.opts.initialPacket; } this.fns.push(fn); return this; diff --git a/lib/namespace.ts b/lib/namespace.ts index d364c5e27d..feb87d6fad 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -72,7 +72,7 @@ export class Namespace extends EventEmitter { ): Namespace { if (this.server.eio && this.name === "/") { debug("removing initial packet"); - delete this.server.eio.initialPacket; + delete this.server.eio.opts.initialPacket; } this.fns.push(fn); return this; diff --git a/package.json b/package.json index b7ffda4a6f..a663510f2a 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "debug": "~4.1.0", - "engine.io": "~3.4.0", + "engine.io": "~4.0.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~2.0.1", "socket.io-client": "github:socketio/socket.io-client#develop", From 7a51c76413dfa887b2aaa3981bc27ae75717f654 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 6 Oct 2020 23:25:49 +0200 Subject: [PATCH 333/494] refactor: migrate tests to TypeScript --- package.json | 4 +++- .../{server-close.js => server-close.ts} | 0 test/{socket.io.js => socket.io.ts} | 17 +++++++++++------ test/support/{util.js => util.ts} | 0 4 files changed, 14 insertions(+), 7 deletions(-) rename test/fixtures/{server-close.js => server-close.ts} (100%) rename test/{socket.io.js => socket.io.ts} (99%) rename test/support/{util.js => util.ts} (100%) diff --git a/package.json b/package.json index a663510f2a..2c8f5ff55f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "url": "git://github.com/socketio/socket.io" }, "scripts": { - "test": "npm run format:check && tsc && nyc mocha --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.js", + "test": "npm run format:check && tsc && nyc mocha --require ts-node/register --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.ts", "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.js'", "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.js'" }, @@ -37,6 +37,7 @@ "devDependencies": { "@types/cookie": "^0.4.0", "@types/cors": "^2.8.7", + "@types/mocha": "^8.0.3", "@types/node": "^14.11.2", "babel-eslint": "^10.1.0", "eslint": "^7.9.0", @@ -47,6 +48,7 @@ "prettier": "^1.19.1", "superagent": "^3.8.2", "supertest": "^3.0.0", + "ts-node": "^9.0.0", "typescript": "^4.0.3" }, "contributors": [ diff --git a/test/fixtures/server-close.js b/test/fixtures/server-close.ts similarity index 100% rename from test/fixtures/server-close.js rename to test/fixtures/server-close.ts diff --git a/test/socket.io.js b/test/socket.io.ts similarity index 99% rename from test/socket.io.js rename to test/socket.io.ts index 91dccf33b6..c8245b1a03 100644 --- a/test/socket.io.js +++ b/test/socket.io.ts @@ -1,5 +1,7 @@ "use strict"; +import { Server } from ".."; + const http = require("http").Server; const io = require(".."); const fs = require("fs"); @@ -12,7 +14,7 @@ const expect = require("expect.js"); require("./support/util"); // Creates a socket.io client for the given server -function client(srv, nsp, opts) { +function client(srv, nsp?: string | object, opts?: object) { if ("object" == typeof nsp) { opts = nsp; nsp = null; @@ -88,7 +90,7 @@ describe("socket.io", () => { }); }); - describe("port", done => { + describe("port", () => { it("should be bound", done => { const sockets = io(54010); request("http://localhost:54010/") @@ -335,7 +337,7 @@ describe("socket.io", () => { } it("should stop socket and timers", done => { - exec(fixture("server-close.js"), done); + exec(fixture("server-close.ts"), done); }); }); }); @@ -345,7 +347,7 @@ describe("socket.io", () => { const { Namespace } = require("../dist/namespace"); it("should be accessible through .sockets", () => { - const sio = io(); + const sio: Server = io(); expect(sio.sockets).to.be.a(Namespace); }); @@ -1721,8 +1723,11 @@ describe("socket.io", () => { }); it("should not crash when messing with Object prototype (and other globals)", done => { + // @ts-ignore Object.prototype.foo = "bar"; + // @ts-ignore global.File = ""; + // @ts-ignore global.Blob = []; const srv = http(); const sio = io(srv); @@ -2101,7 +2106,7 @@ describe("socket.io", () => { }); }); - describe("middleware", done => { + describe("middleware", () => { const { Socket } = require("../dist/socket"); it("should call functions", done => { @@ -2270,7 +2275,7 @@ describe("socket.io", () => { }); }); - describe("socket middleware", done => { + describe("socket middleware", () => { const { Socket } = require("../dist/socket"); it("should call functions", done => { diff --git a/test/support/util.js b/test/support/util.ts similarity index 100% rename from test/support/util.js rename to test/support/util.ts From 3289f7ec376e9ec88c2f90e2735c8ca8d01c0e97 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Oct 2020 15:54:34 +0200 Subject: [PATCH 334/494] feat: remove the implicit connection to the default namespace In previous versions, a client was always connected to the default namespace, even if it requested access to another namespace. This meant that the middlewares registered for the default namespace were triggered in any case, which is a surprising behavior for end users. This also meant that the query option of the Socket on the client-side was not sent in the Socket.IO CONNECT packet for the default namespace: ```js // default namespace: query sent in the query params const socket = io({ query: { abc: "def" } }); // another namespace: query sent in the query params + the CONNECT packet const socket = io("/admin", { query: { abc: "def" } }); ``` The client will now send a CONNECT packet in any case, and the query option of the Socket is renamed to "auth", in order to make a clear distinction with the query option of the Manager (included in the query parameters of the HTTP requests). ```js // server-side io.use((socket, next) => { // not triggered anymore }); io.of("/admin").use((socket, next => { // triggered console.log(socket.handshake.query.abc); // "def" console.log(socket.handshake.auth.abc); // "123" }); // client-side const socket = io("/admin", { query: { abc: "def" }, auth: { abc: "123" } }); ``` --- dist/client.d.ts | 11 ++++--- dist/client.js | 35 +++++++--------------- dist/index.d.ts | 4 +-- dist/index.js | 18 +++--------- dist/namespace.js | 4 --- dist/socket.d.ts | 8 +++-- dist/socket.js | 25 +++++----------- lib/client.ts | 41 +++++++++----------------- lib/index.ts | 21 ++++---------- lib/namespace.ts | 4 --- lib/socket.ts | 30 ++++++++----------- package.json | 6 ++-- test/socket.io.ts | 74 +++++++++++------------------------------------ 13 files changed, 85 insertions(+), 196 deletions(-) diff --git a/dist/client.d.ts b/dist/client.d.ts index 44c0542f35..2a42798592 100644 --- a/dist/client.d.ts +++ b/dist/client.d.ts @@ -11,7 +11,6 @@ export declare class Client { private readonly decoder; private sockets; private nsps; - private connectBuffer; /** * Client constructor. * @@ -31,16 +30,16 @@ export declare class Client { /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {Object} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters * @package */ - connect(name: any, query?: {}): void; + connect(name: string, auth?: object): void; /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {String} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters */ private doConnect; /** diff --git a/dist/client.js b/dist/client.js index c2293f716e..a37aebb0ca 100644 --- a/dist/client.js +++ b/dist/client.js @@ -1,11 +1,7 @@ "use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", { value: true }); exports.Client = void 0; const socket_io_parser_1 = require("socket.io-parser"); -const url_1 = __importDefault(require("url")); const debugModule = require("debug"); const debug = debugModule("socket.io:client"); class Client { @@ -19,7 +15,6 @@ class Client { constructor(server, conn) { this.sockets = new Map(); this.nsps = new Map(); - this.connectBuffer = []; this.server = server; this.conn = conn; this.encoder = server.encoder; @@ -50,19 +45,19 @@ class Client { /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {Object} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters * @package */ - connect(name, query = {}) { + connect(name, auth = {}) { if (this.server.nsps.has(name)) { debug("connecting to namespace %s", name); - return this.doConnect(name, query); + return this.doConnect(name, auth); } - this.server.checkNamespace(name, query, dynamicNsp => { + this.server.checkNamespace(name, auth, dynamicNsp => { if (dynamicNsp) { debug("dynamic namespace %s was created", dynamicNsp.name); - this.doConnect(name, query); + this.doConnect(name, auth); } else { debug("creation of namespace %s was denied", name); @@ -77,22 +72,14 @@ class Client { /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {String} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters */ - doConnect(name, query) { + doConnect(name, auth) { const nsp = this.server.of(name); - if ("/" != name && !this.nsps.has("/")) { - this.connectBuffer.push(name); - return; - } - const socket = nsp.add(this, query, () => { + const socket = nsp.add(this, auth, () => { this.sockets.set(socket.id, socket); this.nsps.set(nsp.name, socket); - if ("/" == nsp.name && this.connectBuffer.length > 0) { - this.connectBuffer.forEach(this.connect, this); - this.connectBuffer = []; - } }); } /** @@ -182,7 +169,7 @@ class Client { */ ondecoded(packet) { if (socket_io_parser_1.PacketType.CONNECT == packet.type) { - this.connect(url_1.default.parse(packet.nsp).pathname, url_1.default.parse(packet.nsp, true).query); + this.connect(packet.nsp, packet.data); } else { const socket = this.nsps.get(packet.nsp); diff --git a/dist/index.d.ts b/dist/index.d.ts index 7d6f439af0..e6b3f42660 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -149,12 +149,12 @@ declare class Server extends EventEmitter { * Executes the middleware for an incoming namespace not already created on the server. * * @param {String} name - name of incoming namespace - * @param {Object} query - the query parameters + * @param {Object} auth - the auth parameters * @param {Function} fn - callback * * @package */ - checkNamespace(name: string, query: object, fn: (nsp: Namespace | boolean) => void): void; + checkNamespace(name: string, auth: object, fn: (nsp: Namespace | boolean) => void): void; /** * Sets the client serving path. * diff --git a/dist/index.js b/dist/index.js index b50eaae1bb..a4c69b2ac6 100644 --- a/dist/index.js +++ b/dist/index.js @@ -39,7 +39,6 @@ const parent_namespace_1 = require("./parent-namespace"); Object.defineProperty(exports, "ParentNamespace", { enumerable: true, get: function () { return parent_namespace_1.ParentNamespace; } }); const socket_io_adapter_1 = require("socket.io-adapter"); const parser = __importStar(require("socket.io-parser")); -const socket_io_parser_1 = require("socket.io-parser"); const url_1 = __importDefault(require("url")); const debug_1 = __importDefault(require("debug")); const debug = debug_1.default("socket.io:server"); @@ -131,12 +130,12 @@ class Server extends events_1.EventEmitter { * Executes the middleware for an incoming namespace not already created on the server. * * @param {String} name - name of incoming namespace - * @param {Object} query - the query parameters + * @param {Object} auth - the auth parameters * @param {Function} fn - callback * * @package */ - checkNamespace(name, query, fn) { + checkNamespace(name, auth, fn) { if (this.parentNsps.size === 0) return fn(false); const keysIterator = this.parentNsps.keys(); @@ -145,7 +144,7 @@ class Server extends events_1.EventEmitter { if (nextFn.done) { return fn(false); } - nextFn.value(name, query, (err, allow) => { + nextFn.value(name, auth, (err, allow) => { if (err || !allow) { run(); } @@ -221,14 +220,6 @@ class Server extends events_1.EventEmitter { opts.path = opts.path || this._path; // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - if (this.sockets.fns.length > 0) { - this.initEngine(srv, opts); - return this; - } - const connectPacket = { type: socket_io_parser_1.PacketType.CONNECT, nsp: "/" }; - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = this.encoder.encode(connectPacket); this.initEngine(srv, opts); return this; } @@ -346,8 +337,7 @@ class Server extends events_1.EventEmitter { */ onconnection(conn) { debug("incoming connection with id %s", conn.id); - const client = new client_1.Client(this, conn); - client.connect("/"); + new client_1.Client(this, conn); return this; } /** diff --git a/dist/namespace.js b/dist/namespace.js index 92aba536a8..4cfc3de015 100644 --- a/dist/namespace.js +++ b/dist/namespace.js @@ -58,10 +58,6 @@ class Namespace extends events_1.EventEmitter { * @return {Namespace} self */ use(fn) { - if (this.server.eio && this.name === "/") { - debug("removing initial packet"); - delete this.server.eio.opts.initialPacket; - } this.fns.push(fn); return this; } diff --git a/dist/socket.d.ts b/dist/socket.d.ts index 45fd9c94ce..858951ec54 100644 --- a/dist/socket.d.ts +++ b/dist/socket.d.ts @@ -39,6 +39,10 @@ export interface Handshake { * The query object */ query: object; + /** + * The auth object + */ + auth: object; } export declare class Socket extends EventEmitter { readonly nsp: Namespace; @@ -58,10 +62,10 @@ export declare class Socket extends EventEmitter { * * @param {Namespace} nsp * @param {Client} client - * @param {Object} query + * @param {Object} auth * @package */ - constructor(nsp: Namespace, client: Client, query: any); + constructor(nsp: Namespace, client: Client, auth: object); /** * Builds the `handshake` BC object */ diff --git a/dist/socket.js b/dist/socket.js index dac931a3b6..3ce0ab7201 100644 --- a/dist/socket.js +++ b/dist/socket.js @@ -27,10 +27,10 @@ class Socket extends events_1.EventEmitter { * * @param {Namespace} nsp * @param {Client} client - * @param {Object} query + * @param {Object} auth * @package */ - constructor(nsp, client, query) { + constructor(nsp, client, auth) { super(); this.nsp = nsp; this.client = client; @@ -43,18 +43,12 @@ class Socket extends events_1.EventEmitter { this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; this.connected = true; this.disconnected = false; - this.handshake = this.buildHandshake(query); + this.handshake = this.buildHandshake(auth); } /** * Builds the `handshake` BC object */ - buildHandshake(query) { - const self = this; - function buildQuery() { - const requestQuery = url_1.default.parse(self.request.url, true).query; - //if socket-specific query exist, replace query strings in requestQuery - return Object.assign({}, query, requestQuery); - } + buildHandshake(auth) { return { headers: this.request.headers, time: new Date() + "", @@ -64,7 +58,8 @@ class Socket extends events_1.EventEmitter { secure: !!this.request.connection.encrypted, issued: +new Date(), url: this.request.url, - query: buildQuery() + query: url_1.default.parse(this.request.url, true).query, + auth }; } /** @@ -211,13 +206,7 @@ class Socket extends events_1.EventEmitter { debug("socket connected - writing packet"); this.nsp.connected.set(this.id, this); this.join(this.id); - const skip = this.nsp.name === "/" && this.nsp.fns.length === 0; - if (skip) { - debug("packet already sent in initial handshake"); - } - else { - this.packet({ type: socket_io_parser_1.PacketType.CONNECT }); - } + this.packet({ type: socket_io_parser_1.PacketType.CONNECT }); } /** * Called with each packet. Called by `Client`. diff --git a/lib/client.ts b/lib/client.ts index 4d250a1f8f..6157559d94 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -1,5 +1,4 @@ -import { Decoder, Encoder, PacketType } from "socket.io-parser"; -import url from "url"; +import { Decoder, Encoder, Packet, PacketType } from "socket.io-parser"; import debugModule = require("debug"); import { IncomingMessage } from "http"; import { Server } from "./index"; @@ -18,7 +17,6 @@ export class Client { private readonly decoder: Decoder; private sockets: Map = new Map(); private nsps: Map = new Map(); - private connectBuffer: Array = []; /** * Client constructor. @@ -62,20 +60,20 @@ export class Client { /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {Object} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters * @package */ - public connect(name, query = {}) { + public connect(name: string, auth: object = {}) { if (this.server.nsps.has(name)) { debug("connecting to namespace %s", name); - return this.doConnect(name, query); + return this.doConnect(name, auth); } - this.server.checkNamespace(name, query, dynamicNsp => { + this.server.checkNamespace(name, auth, dynamicNsp => { if (dynamicNsp) { debug("dynamic namespace %s was created", dynamicNsp.name); - this.doConnect(name, query); + this.doConnect(name, auth); } else { debug("creation of namespace %s was denied", name); this.packet({ @@ -90,25 +88,15 @@ export class Client { /** * Connects a client to a namespace. * - * @param {String} name namespace - * @param {String} query the query parameters + * @param {String} name - the namespace + * @param {Object} auth - the auth parameters */ - private doConnect(name, query) { + private doConnect(name: string, auth: object) { const nsp = this.server.of(name); - if ("/" != name && !this.nsps.has("/")) { - this.connectBuffer.push(name); - return; - } - - const socket = nsp.add(this, query, () => { + const socket = nsp.add(this, auth, () => { this.sockets.set(socket.id, socket); this.nsps.set(nsp.name, socket); - - if ("/" == nsp.name && this.connectBuffer.length > 0) { - this.connectBuffer.forEach(this.connect, this); - this.connectBuffer = []; - } }); } @@ -199,12 +187,9 @@ export class Client { /** * Called when parser fully decodes a packet. */ - private ondecoded(packet) { + private ondecoded(packet: Packet) { if (PacketType.CONNECT == packet.type) { - this.connect( - url.parse(packet.nsp).pathname, - url.parse(packet.nsp, true).query - ); + this.connect(packet.nsp, packet.data); } else { const socket = this.nsps.get(packet.nsp); if (socket) { diff --git a/lib/index.ts b/lib/index.ts index 3e1f8aeaac..c5065fb872 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -8,7 +8,7 @@ import { Namespace } from "./namespace"; import { ParentNamespace } from "./parent-namespace"; import { Adapter } from "socket.io-adapter"; import * as parser from "socket.io-parser"; -import { Encoder, PacketType } from "socket.io-parser"; +import { Encoder } from "socket.io-parser"; import url from "url"; import debugModule from "debug"; import { Socket } from "./socket"; @@ -258,14 +258,14 @@ class Server extends EventEmitter { * Executes the middleware for an incoming namespace not already created on the server. * * @param {String} name - name of incoming namespace - * @param {Object} query - the query parameters + * @param {Object} auth - the auth parameters * @param {Function} fn - callback * * @package */ public checkNamespace( name: string, - query: object, + auth: object, fn: (nsp: Namespace | boolean) => void ) { if (this.parentNsps.size === 0) return fn(false); @@ -277,7 +277,7 @@ class Server extends EventEmitter { if (nextFn.done) { return fn(false); } - nextFn.value(name, query, (err, allow) => { + nextFn.value(name, auth, (err, allow) => { if (err || !allow) { run(); } else { @@ -379,16 +379,6 @@ class Server extends EventEmitter { // set origins verification opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - if (this.sockets.fns.length > 0) { - this.initEngine(srv, opts); - return this; - } - - const connectPacket = { type: PacketType.CONNECT, nsp: "/" }; - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts.initialPacket = this.encoder.encode(connectPacket); - this.initEngine(srv, opts); return this; @@ -517,8 +507,7 @@ class Server extends EventEmitter { */ private onconnection(conn): Server { debug("incoming connection with id %s", conn.id); - const client = new Client(this, conn); - client.connect("/"); + new Client(this, conn); return this; } diff --git a/lib/namespace.ts b/lib/namespace.ts index feb87d6fad..6b1870ad36 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -70,10 +70,6 @@ export class Namespace extends EventEmitter { public use( fn: (socket: Socket, next: (err: Error) => void) => void ): Namespace { - if (this.server.eio && this.name === "/") { - debug("removing initial packet"); - delete this.server.eio.opts.initialPacket; - } this.fns.push(fn); return this; } diff --git a/lib/socket.ts b/lib/socket.ts index c6fe4d649b..3735deebcf 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -65,6 +65,11 @@ export interface Handshake { * The query object */ query: object; + + /** + * The auth object + */ + auth: object; } export class Socket extends EventEmitter { @@ -88,30 +93,23 @@ export class Socket extends EventEmitter { * * @param {Namespace} nsp * @param {Client} client - * @param {Object} query + * @param {Object} auth * @package */ - constructor(readonly nsp: Namespace, readonly client: Client, query) { + constructor(readonly nsp: Namespace, readonly client: Client, auth: object) { super(); this.server = nsp.server; this.adapter = this.nsp.adapter; this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; this.connected = true; this.disconnected = false; - this.handshake = this.buildHandshake(query); + this.handshake = this.buildHandshake(auth); } /** * Builds the `handshake` BC object */ - private buildHandshake(query): Handshake { - const self = this; - function buildQuery() { - const requestQuery = url.parse(self.request.url, true).query; - //if socket-specific query exist, replace query strings in requestQuery - return Object.assign({}, query, requestQuery); - } - + private buildHandshake(auth: object): Handshake { return { headers: this.request.headers, time: new Date() + "", @@ -121,7 +119,8 @@ export class Socket extends EventEmitter { secure: !!this.request.connection.encrypted, issued: +new Date(), url: this.request.url, - query: buildQuery() + query: url.parse(this.request.url, true).query, + auth }; } @@ -289,12 +288,7 @@ export class Socket extends EventEmitter { debug("socket connected - writing packet"); this.nsp.connected.set(this.id, this); this.join(this.id); - const skip = this.nsp.name === "/" && this.nsp.fns.length === 0; - if (skip) { - debug("packet already sent in initial handshake"); - } else { - this.packet({ type: PacketType.CONNECT }); - } + this.packet({ type: PacketType.CONNECT }); } /** diff --git a/package.json b/package.json index 2c8f5ff55f..cb86b9b2ae 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ }, "scripts": { "test": "npm run format:check && tsc && nyc mocha --require ts-node/register --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.ts", - "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.js'", - "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.js'" + "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.ts'", + "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'" }, "dependencies": { "debug": "~4.1.0", @@ -32,7 +32,7 @@ "has-binary2": "~1.0.2", "socket.io-adapter": "~2.0.1", "socket.io-client": "github:socketio/socket.io-client#develop", - "socket.io-parser": "~4.0.0" + "socket.io-parser": "github:socketio/socket.io-parser#develop" }, "devDependencies": { "@types/cookie": "^0.4.0", diff --git a/test/socket.io.ts b/test/socket.io.ts index c8245b1a03..9353653e1f 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -507,45 +507,6 @@ describe("socket.io", () => { }); }); - it("should disconnect both default and custom namespace upon disconnect", done => { - const srv = http(); - const sio = io(srv); - srv.listen(() => { - const lolcats = client(srv, "/lolcats"); - let total = 2; - let totald = 2; - let s; - sio.of("/", socket => { - socket.on("disconnect", reason => { - --totald || done(); - }); - --total || close(); - }); - sio.of("/lolcats", socket => { - s = socket; - socket.on("disconnect", reason => { - --totald || done(); - }); - --total || close(); - }); - function close() { - s.disconnect(true); - } - }); - }); - - it("should not crash while disconnecting socket", done => { - const srv = http(); - const sio = io(srv); - srv.listen(() => { - const socket = client(srv, "/ns"); - sio.on("connection", socket => { - socket.disconnect(); - done(); - }); - }); - }); - it("should fire a `disconnecting` event just before leaving all rooms", done => { const srv = http(); const sio = io(srv); @@ -1529,12 +1490,14 @@ describe("socket.io", () => { const sio = io(srv); const client1 = client(srv); const client2 = client(srv, "/connection2", { - query: { key1: "aa", key2: "&=bb" } + auth: { key1: "aa", key2: "&=bb" } }); sio.on("connection", s => {}); sio.of("/connection2").on("connection", s => { - expect(s.handshake.query.key1).to.be("aa"); - expect(s.handshake.query.key2).to.be("&=bb"); + expect(s.handshake.query.key1).to.be(undefined); + expect(s.handshake.query.EIO).to.be("4"); + expect(s.handshake.auth.key1).to.be("aa"); + expect(s.handshake.auth.key2).to.be("&=bb"); done(); }); }); @@ -2195,14 +2158,12 @@ describe("socket.io", () => { const sio = io(srv); let socket; sio.use((s, next) => { - socket.io.engine.on("open", () => { - socket.io.engine.close(); - s.client.conn.on("close", () => { - process.nextTick(next); - setTimeout(() => { - done(); - }, 50); - }); + socket.io.engine.close(); + s.client.conn.on("close", () => { + process.nextTick(next); + setTimeout(() => { + done(); + }, 50); }); }); srv.listen(() => { @@ -2218,11 +2179,14 @@ describe("socket.io", () => { const sio = io(srv); const result = []; - sio.use((socket, next) => { + sio.use(() => { + done(new Error("should not fire")); + }); + sio.of("/chat").use((socket, next) => { result.push(1); setTimeout(next, 50); }); - sio.use((socket, next) => { + sio.of("/chat").use((socket, next) => { result.push(2); setTimeout(next, 50); }); @@ -2230,15 +2194,11 @@ describe("socket.io", () => { result.push(3); setTimeout(next, 50); }); - sio.of("/chat").use((socket, next) => { - result.push(4); - setTimeout(next, 50); - }); srv.listen(() => { const chat = client(srv, "/chat"); chat.on("connect", () => { - expect(result).to.eql([1, 2, 3, 4]); + expect(result).to.eql([1, 2, 3]); done(); }); }); From 2875d2cfdfa463e64cb520099749f543bbc4eb15 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 8 Oct 2020 02:51:25 +0200 Subject: [PATCH 335/494] feat: do not reuse the Engine.IO id In previous versions, the Socket#id attribute was equal (or derived, for a non-default namespace) to the underlying Engine.IO id, which is used as a mean to authenticate the user throughout the Engine.IO session and thus is sensitive information that should be kept secret. The problem with reusing the Engine.IO id is that users could be tempted to transmit this id to other clients, in order to implement private messaging for example. So we'll now generate a new random id for each new socket. Please note that this id will now be different from the one found in the query parameters of the HTTP requests. --- dist/socket.js | 5 +++-- lib/socket.ts | 5 +++-- package.json | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dist/socket.js b/dist/socket.js index 3ce0ab7201..a4ef75cac7 100644 --- a/dist/socket.js +++ b/dist/socket.js @@ -9,6 +9,7 @@ const socket_io_parser_1 = require("socket.io-parser"); const has_binary2_1 = __importDefault(require("has-binary2")); const url_1 = __importDefault(require("url")); const debug_1 = __importDefault(require("debug")); +const base64id_1 = __importDefault(require("base64id")); const debug = debug_1.default("socket.io:socket"); /** * Blacklisted events. @@ -40,7 +41,7 @@ class Socket extends events_1.EventEmitter { this._rooms = new Set(); this.server = nsp.server; this.adapter = this.nsp.adapter; - this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; + this.id = base64id_1.default.generateId(); // don't reuse the Engine.IO id because it's sensitive information this.connected = true; this.disconnected = false; this.handshake = this.buildHandshake(auth); @@ -206,7 +207,7 @@ class Socket extends events_1.EventEmitter { debug("socket connected - writing packet"); this.nsp.connected.set(this.id, this); this.join(this.id); - this.packet({ type: socket_io_parser_1.PacketType.CONNECT }); + this.packet({ type: socket_io_parser_1.PacketType.CONNECT, data: { sid: this.id } }); } /** * Called with each packet. Called by `Client`. diff --git a/lib/socket.ts b/lib/socket.ts index 3735deebcf..fcfc456bb7 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -6,6 +6,7 @@ import debugModule from "debug"; import { Client, Namespace, Server } from "./index"; import { IncomingMessage } from "http"; import { Adapter, BroadcastFlags, Room, SocketId } from "socket.io-adapter"; +import base64id from "base64id"; const debug = debugModule("socket.io:socket"); @@ -100,7 +101,7 @@ export class Socket extends EventEmitter { super(); this.server = nsp.server; this.adapter = this.nsp.adapter; - this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id; + this.id = base64id.generateId(); // don't reuse the Engine.IO id because it's sensitive information this.connected = true; this.disconnected = false; this.handshake = this.buildHandshake(auth); @@ -288,7 +289,7 @@ export class Socket extends EventEmitter { debug("socket connected - writing packet"); this.nsp.connected.set(this.id, this); this.join(this.id); - this.packet({ type: PacketType.CONNECT }); + this.packet({ type: PacketType.CONNECT, data: { sid: this.id } }); } /** diff --git a/package.json b/package.json index cb86b9b2ae..6b14335bfa 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'" }, "dependencies": { + "base64id": "~2.0.0", "debug": "~4.1.0", "engine.io": "~4.0.0", "has-binary2": "~1.0.2", From 83a2356648ed00dbe7c4e3cca40bc1d2e1e5e1fa Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 9 Oct 2020 02:12:17 +0200 Subject: [PATCH 336/494] refactor: properly delegate to the main namespace --- dist/index.d.ts | 85 +++++++- dist/index.js | 121 ++++++++++-- dist/namespace.d.ts | 4 +- dist/namespace.js | 4 +- dist/socket.d.ts | 3 +- lib/index.ts | 148 +++++++++++--- lib/namespace.ts | 6 +- lib/socket.ts | 4 +- test/socket.io.ts | 463 ++++++++++++++++++++++---------------------- 9 files changed, 548 insertions(+), 290 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index e6b3f42660..3d7d5ec22a 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,9 +1,8 @@ /// import http from "http"; -import { Client } from "./client"; import { EventEmitter } from "events"; import { Namespace } from "./namespace"; -import { ParentNamespace } from "./parent-namespace"; +import { Room, SocketId } from "socket.io-adapter"; import { Encoder } from "socket.io-parser"; import { Socket } from "./socket"; import { CookieSerializeOptions } from "cookie"; @@ -85,7 +84,7 @@ interface AttachOptions { } interface EngineAttachOptions extends EngineOptions, AttachOptions { } -export interface ServerOptions extends EngineAttachOptions { +interface ServerOptions extends EngineAttachOptions { /** * name of the path to capture (/socket.io) */ @@ -101,19 +100,19 @@ export interface ServerOptions extends EngineAttachOptions { /** * the allowed origins (*:*) */ - origins: string | string[]; + origins: string | string[] | ((origin: string, cb: (err: Error, allow: boolean) => void) => void); /** * the parser to use. Defaults to an instance of the Parser that ships with socket.io. */ parser: any; } -declare class Server extends EventEmitter { +export declare class Server extends EventEmitter { readonly sockets: Namespace; /** @package */ readonly parser: any; /** @package */ readonly encoder: Encoder; - private nsps; + nsps: Map; private parentNsps; private _adapter; private _origins; @@ -241,13 +240,79 @@ declare class Server extends EventEmitter { * @param {String|RegExp|Function} name nsp name * @param {Function} [fn] optional, nsp `connection` ev handler */ - of(name: string | RegExp | ((name: string, query: object, fn: (err: Error, success: boolean) => void) => void), fn?: (socket: Socket) => void): Namespace | ParentNamespace; + of(name: string | RegExp | ((name: string, query: object, fn: (err: Error, success: boolean) => void) => void), fn?: (socket: Socket) => void): Namespace; /** * Closes server connection * * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed */ - close(fn: (err?: Error) => void): void; + close(fn?: (err?: Error) => void): void; + /** + * Sets up namespace middleware. + * + * @return {Server} self + * @public + */ + use(fn: (socket: Socket, next: (err?: Error) => void) => void): Server; + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + to(name: Room): Server; + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + in(name: Room): Server; + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + send(...args: any[]): Server; + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + write(...args: any[]): Server; + /** + * Gets a list of socket ids. + */ + allSockets(): Promise>; + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Server} self + */ + compress(compress: boolean): Server; + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Server} self + */ + binary(binary: boolean): Server; + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Server} self + */ + get volatile(): Server; + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Server} self + */ + get local(): Server; } -export { Server, Namespace, ParentNamespace, Client }; -export * from "./socket"; +export {}; diff --git a/dist/index.js b/dist/index.js index a4c69b2ac6..478df9f3dd 100644 --- a/dist/index.js +++ b/dist/index.js @@ -18,25 +18,19 @@ var __importStar = (this && this.__importStar) || function (mod) { __setModuleDefault(result, mod); return result; }; -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.Client = exports.ParentNamespace = exports.Namespace = exports.Server = void 0; +exports.Server = void 0; const http_1 = __importDefault(require("http")); const fs_1 = require("fs"); const path_1 = __importDefault(require("path")); const engine_io_1 = __importDefault(require("engine.io")); const client_1 = require("./client"); -Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } }); const events_1 = require("events"); const namespace_1 = require("./namespace"); -Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return namespace_1.Namespace; } }); const parent_namespace_1 = require("./parent-namespace"); -Object.defineProperty(exports, "ParentNamespace", { enumerable: true, get: function () { return parent_namespace_1.ParentNamespace; } }); const socket_io_adapter_1 = require("socket.io-adapter"); const parser = __importStar(require("socket.io-parser")); const url_1 = __importDefault(require("url")); @@ -391,6 +385,104 @@ class Server extends events_1.EventEmitter { fn && fn(); } } + /** + * Sets up namespace middleware. + * + * @return {Server} self + * @public + */ + use(fn) { + this.sockets.use(fn); + return this; + } + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + to(name) { + this.sockets.to(name); + return this; + } + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + in(name) { + this.sockets.in(name); + return this; + } + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + send(...args) { + args.unshift("message"); + this.sockets.emit.apply(this.sockets, args); + return this; + } + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + write(...args) { + args.unshift("message"); + this.sockets.emit.apply(this.sockets, args); + return this; + } + /** + * Gets a list of socket ids. + */ + allSockets() { + return this.sockets.allSockets(); + } + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Server} self + */ + compress(compress) { + this.sockets.compress(compress); + return this; + } + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Server} self + */ + binary(binary) { + this.sockets.binary(binary); + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Server} self + */ + get volatile() { + this.sockets.volatile; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Server} self + */ + get local() { + this.sockets.local; + return this; + } } exports.Server = Server; /** @@ -399,21 +491,10 @@ exports.Server = Server; const emitterMethods = Object.keys(events_1.EventEmitter.prototype).filter(function (key) { return typeof events_1.EventEmitter.prototype[key] === "function"; }); -emitterMethods - .concat(["to", "in", "use", "send", "write", "clients", "compress", "binary"]) - .forEach(function (fn) { +emitterMethods.forEach(function (fn) { Server.prototype[fn] = function () { return this.sockets[fn].apply(this.sockets, arguments); }; }); -["json", "volatile", "local"].forEach(function (flag) { - Object.defineProperty(Server.prototype, flag, { - get: function () { - this.sockets.flags = this.sockets.flags || {}; - this.sockets.flags[flag] = true; - return this; - } - }); -}); -__exportStar(require("./socket"), exports); module.exports = (srv, opts) => new Server(srv, opts); +module.exports.Server = Server; diff --git a/dist/namespace.d.ts b/dist/namespace.d.ts index 67d646f64b..35561c808b 100644 --- a/dist/namespace.d.ts +++ b/dist/namespace.d.ts @@ -39,7 +39,7 @@ export declare class Namespace extends EventEmitter { * * @return {Namespace} self */ - use(fn: (socket: Socket, next: (err: Error) => void) => void): Namespace; + use(fn: (socket: Socket, next: (err?: Error) => void) => void): Namespace; /** * Executes the middleware for an incoming client. * @@ -78,7 +78,7 @@ export declare class Namespace extends EventEmitter { * * @return {Namespace} self */ - emit(ev: any): Namespace; + emit(ev: string, ...args: any[]): Namespace; /** * Sends a `message` event to all clients. * diff --git a/dist/namespace.js b/dist/namespace.js index 4cfc3de015..f547362aed 100644 --- a/dist/namespace.js +++ b/dist/namespace.js @@ -157,13 +157,13 @@ class Namespace extends events_1.EventEmitter { * @return {Namespace} self */ // @ts-ignore - emit(ev) { + emit(ev, ...args) { if (~events.indexOf(ev)) { super.emit.apply(this, arguments); return this; } // set up packet object - const args = Array.prototype.slice.call(arguments); + args.unshift(ev); const packet = { type: (this.flags.binary !== undefined ? this.flags.binary diff --git a/dist/socket.d.ts b/dist/socket.d.ts index 858951ec54..f263f21ebe 100644 --- a/dist/socket.d.ts +++ b/dist/socket.d.ts @@ -1,6 +1,7 @@ /// import { EventEmitter } from "events"; -import { Client, Namespace } from "./index"; +import { Client } from "./client"; +import { Namespace } from "./namespace"; import { IncomingMessage } from "http"; import { Room, SocketId } from "socket.io-adapter"; /** diff --git a/lib/index.ts b/lib/index.ts index c5065fb872..ca902f21d1 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -6,7 +6,7 @@ import { Client } from "./client"; import { EventEmitter } from "events"; import { Namespace } from "./namespace"; import { ParentNamespace } from "./parent-namespace"; -import { Adapter } from "socket.io-adapter"; +import { Adapter, Room, SocketId } from "socket.io-adapter"; import * as parser from "socket.io-parser"; import { Encoder } from "socket.io-parser"; import url from "url"; @@ -109,7 +109,7 @@ interface AttachOptions { interface EngineAttachOptions extends EngineOptions, AttachOptions {} -export interface ServerOptions extends EngineAttachOptions { +interface ServerOptions extends EngineAttachOptions { /** * name of the path to capture (/socket.io) */ @@ -125,14 +125,17 @@ export interface ServerOptions extends EngineAttachOptions { /** * the allowed origins (*:*) */ - origins: string | string[]; + origins: + | string + | string[] + | ((origin: string, cb: (err: Error, allow: boolean) => void) => void); /** * the parser to use. Defaults to an instance of the Parser that ships with socket.io. */ parser: any; } -class Server extends EventEmitter { +export class Server extends EventEmitter { public readonly sockets: Namespace; /** @package */ @@ -140,7 +143,7 @@ class Server extends EventEmitter { /** @package */ public readonly encoder: Encoder; - private nsps: Map = new Map(); + public nsps: Map = new Map(); private parentNsps: Map< | string | RegExp @@ -563,7 +566,7 @@ class Server extends EventEmitter { * * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed */ - public close(fn: (err?: Error) => void): void { + public close(fn?: (err?: Error) => void): void { for (const socket of this.sockets.sockets.values()) { socket.onclose("server shutting down"); } @@ -576,6 +579,116 @@ class Server extends EventEmitter { fn && fn(); } } + + /** + * Sets up namespace middleware. + * + * @return {Server} self + * @public + */ + public use( + fn: (socket: Socket, next: (err?: Error) => void) => void + ): Server { + this.sockets.use(fn); + return this; + } + + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + public to(name: Room): Server { + this.sockets.to(name); + return this; + } + + /** + * Targets a room when emitting. + * + * @param {String} name + * @return {Server} self + * @public + */ + public in(name: Room): Server { + this.sockets.in(name); + return this; + } + + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + public send(...args): Server { + args.unshift("message"); + this.sockets.emit.apply(this.sockets, args); + return this; + } + + /** + * Sends a `message` event to all clients. + * + * @return {Namespace} self + */ + public write(...args): Server { + args.unshift("message"); + this.sockets.emit.apply(this.sockets, args); + return this; + } + + /** + * Gets a list of socket ids. + */ + public allSockets(): Promise> { + return this.sockets.allSockets(); + } + + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Server} self + */ + public compress(compress: boolean): Server { + this.sockets.compress(compress); + return this; + } + + /** + * Sets the binary flag + * + * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` + * @return {Server} self + */ + public binary(binary: boolean): Server { + this.sockets.binary(binary); + return this; + } + + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return {Server} self + */ + public get volatile(): Server { + this.sockets.volatile; + return this; + } + + /** + * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. + * + * @return {Server} self + */ + public get local(): Server { + this.sockets.local; + return this; + } } /** @@ -588,24 +701,11 @@ const emitterMethods = Object.keys(EventEmitter.prototype).filter(function( return typeof EventEmitter.prototype[key] === "function"; }); -emitterMethods - .concat(["to", "in", "use", "send", "write", "clients", "compress", "binary"]) - .forEach(function(fn) { - Server.prototype[fn] = function() { - return this.sockets[fn].apply(this.sockets, arguments); - }; - }); - -["json", "volatile", "local"].forEach(function(flag) { - Object.defineProperty(Server.prototype, flag, { - get: function() { - this.sockets.flags = this.sockets.flags || {}; - this.sockets.flags[flag] = true; - return this; - } - }); +emitterMethods.forEach(function(fn) { + Server.prototype[fn] = function() { + return this.sockets[fn].apply(this.sockets, arguments); + }; }); -export { Server, Namespace, ParentNamespace, Client }; -export * from "./socket"; module.exports = (srv?, opts?) => new Server(srv, opts); +module.exports.Server = Server; diff --git a/lib/namespace.ts b/lib/namespace.ts index 6b1870ad36..0fb65bbe20 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -68,7 +68,7 @@ export class Namespace extends EventEmitter { * @return {Namespace} self */ public use( - fn: (socket: Socket, next: (err: Error) => void) => void + fn: (socket: Socket, next: (err?: Error) => void) => void ): Namespace { this.fns.push(fn); return this; @@ -175,13 +175,13 @@ export class Namespace extends EventEmitter { * @return {Namespace} self */ // @ts-ignore - public emit(ev): Namespace { + public emit(ev: string, ...args: any[]): Namespace { if (~events.indexOf(ev)) { super.emit.apply(this, arguments); return this; } // set up packet object - const args = Array.prototype.slice.call(arguments); + args.unshift(ev); const packet = { type: (this.flags.binary !== undefined ? this.flags.binary diff --git a/lib/socket.ts b/lib/socket.ts index fcfc456bb7..a9347a367f 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -3,7 +3,9 @@ import { PacketType } from "socket.io-parser"; import hasBin from "has-binary2"; import url from "url"; import debugModule from "debug"; -import { Client, Namespace, Server } from "./index"; +import { Server } from "./index"; +import { Client } from "./client"; +import { Namespace } from "./namespace"; import { IncomingMessage } from "http"; import { Adapter, BroadcastFlags, Room, SocketId } from "socket.io-adapter"; import base64id from "base64id"; diff --git a/test/socket.io.ts b/test/socket.io.ts index 9353653e1f..7c1abf5c36 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -1,17 +1,17 @@ "use strict"; import { Server } from ".."; +import { createServer } from "http"; +import fs = require("fs"); +import { join } from "path"; +import { exec } from "child_process"; +import request from "supertest"; +import expect from "expect.js"; +import { AddressInfo } from "net"; -const http = require("http").Server; -const io = require(".."); -const fs = require("fs"); -const join = require("path").join; -const exec = require("child_process").exec; const ioc = require("socket.io-client"); -const request = require("supertest"); -const expect = require("expect.js"); -require("./support/util"); +import "./support/util"; // Creates a socket.io client for the given server function client(srv, nsp?: string | object, opts?: object) { @@ -36,8 +36,8 @@ describe("socket.io", () => { const clientVersion = require("socket.io-client/package").version; it("should serve static files", done => { - const srv = http(); - io(srv); + const srv = createServer(); + new Server(srv); request(srv) .get("/socket.io/socket.io.js") .buffer(true) @@ -53,8 +53,8 @@ describe("socket.io", () => { }); it("should handle 304", done => { - const srv = http(); - io(srv); + const srv = createServer(); + new Server(srv); request(srv) .get("/socket.io/socket.io.js") .set("If-None-Match", '"' + clientVersion + '"') @@ -66,19 +66,19 @@ describe("socket.io", () => { }); it("should not serve static files", done => { - const srv = http(); - io(srv, { serveClient: false }); + const srv = createServer(); + new Server(srv, { serveClient: false }); request(srv) .get("/socket.io/socket.io.js") .expect(400, done); }); it("should work with #attach", done => { - const srv = http((req, res) => { + const srv = createServer((req, res) => { res.writeHead(404); res.end(); }); - const sockets = io(); + const sockets = new Server(); sockets.attach(srv); request(srv) .get("/socket.io/socket.io.js") @@ -92,28 +92,28 @@ describe("socket.io", () => { describe("port", () => { it("should be bound", done => { - const sockets = io(54010); + const sockets = new Server(54010); request("http://localhost:54010/") .get("/socket.io/socket.io.js") .expect(200, done); }); it("should be bound as a string", done => { - const sockets = io("54020"); + const sockets = new Server(54020); request("http://localhost:54020/") .get("/socket.io/socket.io.js") .expect(200, done); }); it("with listen", done => { - const sockets = io().listen(54011); + const sockets = new Server().listen(54011); request("http://localhost:54011/") .get("/socket.io/socket.io.js") .expect(200, done); }); it("as a string", done => { - const sockets = io().listen("54012"); + const sockets = new Server().listen(54012); request("http://localhost:54012/") .get("/socket.io/socket.io.js") .expect(200, done); @@ -125,7 +125,9 @@ describe("socket.io", () => { const request = require("superagent"); it("should disallow request when origin defined and none specified", done => { - const sockets = io({ origins: "http://foo.example:*" }).listen("54013"); + const sockets = new Server({ origins: "http://foo.example:*" }).listen( + 54013 + ); request .get("http://localhost:54013/socket.io/default/") .query({ transport: "polling" }) @@ -136,7 +138,9 @@ describe("socket.io", () => { }); it("should disallow request when origin defined and a different one specified", done => { - const sockets = io({ origins: "http://foo.example:*" }).listen("54014"); + const sockets = new Server({ origins: "http://foo.example:*" }).listen( + 54014 + ); request .get("http://localhost:54014/socket.io/default/") .query({ transport: "polling" }) @@ -148,7 +152,9 @@ describe("socket.io", () => { }); it("should allow request when origin defined an the same is specified", done => { - const sockets = io({ origins: "http://foo.example:*" }).listen("54015"); + const sockets = new Server({ origins: "http://foo.example:*" }).listen( + 54015 + ); request .get("http://localhost:54015/socket.io/default/") .set("origin", "http://foo.example/") @@ -160,14 +166,14 @@ describe("socket.io", () => { }); it("should allow request when origin defined as function and same is supplied", done => { - const sockets = io({ + const sockets = new Server({ origins: (origin, callback) => { if (origin == "http://foo.example/") { return callback(null, true); } return callback(null, false); } - }).listen("54016"); + }).listen(54016); request .get("http://localhost:54016/socket.io/default/") .set("origin", "http://foo.example/") @@ -179,14 +185,14 @@ describe("socket.io", () => { }); it("should allow request when origin defined as function and different is supplied", done => { - const sockets = io({ + const sockets = new Server({ origins: (origin, callback) => { if (origin == "http://foo.example/") { return callback(null, true); } return callback(null, false); } - }).listen("54017"); + }).listen(54017); request .get("http://localhost:54017/socket.io/default/") .set("origin", "http://herp.derp/") @@ -198,14 +204,14 @@ describe("socket.io", () => { }); it("should allow request when origin defined as function and no origin is supplied", done => { - const sockets = io({ + const sockets = new Server({ origins: (origin, callback) => { if (origin == "*") { return callback(null, true); } return callback(null, false); } - }).listen("54021"); + }).listen(54021); request .get("http://localhost:54021/socket.io/default/") .query({ transport: "polling" }) @@ -216,8 +222,8 @@ describe("socket.io", () => { }); it("should default to port 443 when protocol is https", done => { - const sockets = io({ origins: "https://foo.example/" }).listen( - "54036" + const sockets = new Server({ origins: "https://foo.example/" }).listen( + 54036 ); request .get("http://localhost:54036/socket.io/default/") @@ -230,7 +236,7 @@ describe("socket.io", () => { }); it("should allow request if custom function in opts.allowRequest returns true", done => { - const sockets = io(http().listen(54022), { + const sockets = new Server(createServer().listen(54022), { allowRequest: (req, callback) => callback(null, true), origins: "http://foo.example:*" }); @@ -245,7 +251,7 @@ describe("socket.io", () => { }); it("should disallow request if custom function in opts.allowRequest returns false", done => { - const sockets = io(http().listen(54023), { + const sockets = new Server(createServer().listen(54023), { allowRequest: (req, callback) => callback(null, false) }); request @@ -259,7 +265,7 @@ describe("socket.io", () => { }); it("should allow request when using an array of origins", done => { - io({ origins: ["http://foo.example:54024/"] }).listen("54024"); + new Server({ origins: ["http://foo.example:54024/"] }).listen(54024); request .get("http://localhost:54024/socket.io/default/") .set("origin", "http://foo.example:54024/") @@ -274,8 +280,8 @@ describe("socket.io", () => { describe("close", () => { it("should be able to close sio sending a srv", () => { const PORT = 54018; - const srv = http().listen(PORT); - const sio = io(srv); + const srv = createServer().listen(PORT); + const sio = new Server(srv); const net = require("net"); const server = net.createServer(); @@ -301,7 +307,7 @@ describe("socket.io", () => { it("should be able to close sio sending a port", () => { const PORT = 54019; - const sio = io(PORT); + const sio = new Server(PORT); const net = require("net"); const server = net.createServer(); @@ -347,29 +353,29 @@ describe("socket.io", () => { const { Namespace } = require("../dist/namespace"); it("should be accessible through .sockets", () => { - const sio: Server = io(); + const sio = new Server(); expect(sio.sockets).to.be.a(Namespace); }); it("should be aliased", () => { - const sio = io(); + const sio = new Server(); expect(sio.use).to.be.a("function"); expect(sio.to).to.be.a("function"); expect(sio["in"]).to.be.a("function"); expect(sio.emit).to.be.a("function"); expect(sio.send).to.be.a("function"); expect(sio.write).to.be.a("function"); - expect(sio.clients).to.be.a("function"); + expect(sio.allSockets).to.be.a("function"); expect(sio.compress).to.be.a("function"); - expect(sio.json).to.be(sio); expect(sio.volatile).to.be(sio); - expect(sio.sockets.flags).to.eql({ json: true, volatile: true }); + expect(sio.local).to.be(sio); + expect(sio.sockets.flags).to.eql({ volatile: true, local: true }); delete sio.sockets.flags; }); it("should automatically connect", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); socket.on("connect", () => { @@ -379,8 +385,8 @@ describe("socket.io", () => { }); it("should fire a `connection` event", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", socket => { @@ -391,8 +397,8 @@ describe("socket.io", () => { }); it("should fire a `connect` event", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connect", socket => { @@ -403,8 +409,8 @@ describe("socket.io", () => { }); it("should work with many sockets", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { sio.of("/chat"); sio.of("/news"); @@ -421,8 +427,8 @@ describe("socket.io", () => { }); it('should be able to equivalently start with "" or "/" on server', done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; sio.of("").on("connection", () => { --total || done(); @@ -435,8 +441,8 @@ describe("socket.io", () => { }); it('should be equivalent for "" and "/" on client', done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); sio.of("/").on("connection", () => { done(); }); @@ -444,8 +450,8 @@ describe("socket.io", () => { }); it("should work with `of` and many sockets", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const chat = client(srv, "/chat"); const news = client(srv, "/news"); @@ -462,8 +468,8 @@ describe("socket.io", () => { }); it("should work with `of` second param", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const chat = client(srv, "/chat"); const news = client(srv, "/news"); @@ -480,8 +486,8 @@ describe("socket.io", () => { }); it("should disconnect upon transport disconnection", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const chat = client(srv, "/chat"); const news = client(srv, "/news"); @@ -508,8 +514,8 @@ describe("socket.io", () => { }); it("should fire a `disconnecting` event just before leaving all rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -534,8 +540,8 @@ describe("socket.io", () => { }); it("should return error connecting to non-existent namespace", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/doesnotexist"); socket.on("error", err => { @@ -546,8 +552,8 @@ describe("socket.io", () => { }); it("should not reuse same-namespace connections", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let connections = 0; srv.listen(() => { @@ -563,8 +569,8 @@ describe("socket.io", () => { }); it("should find all clients in a namespace", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const chatSids = []; let otherSid = null; srv.listen(() => { @@ -591,8 +597,8 @@ describe("socket.io", () => { }); it("should find all clients in a namespace room", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let chatFooSid = null; let chatBarSid = null; let otherSid = null; @@ -636,8 +642,8 @@ describe("socket.io", () => { }); it("should find all clients across namespace rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let chatFooSid = null; let chatBarSid = null; let otherSid = null; @@ -676,8 +682,8 @@ describe("socket.io", () => { }); it("should not emit volatile event after regular event", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let counter = 0; srv.listen(() => { @@ -702,8 +708,8 @@ describe("socket.io", () => { }); it("should emit volatile event", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let counter = 0; srv.listen(() => { @@ -727,8 +733,8 @@ describe("socket.io", () => { }); it("should enable compression by default", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/chat"); sio.of("/chat").on("connection", s => { @@ -742,8 +748,8 @@ describe("socket.io", () => { }); it("should disable compression", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/chat"); sio.of("/chat").on("connection", s => { @@ -761,8 +767,8 @@ describe("socket.io", () => { describe("dynamic namespaces", () => { it("should allow connections to dynamic namespaces with a regex", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let count = 0; srv.listen(() => { const socket = client(srv, "/dynamic-101"); @@ -793,8 +799,8 @@ describe("socket.io", () => { }); it("should allow connections to dynamic namespaces with a function", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/dynamic-101"); sio.of((name, query, next) => next(null, "/dynamic-101" === name)); @@ -803,8 +809,8 @@ describe("socket.io", () => { }); it("should disallow connections when no dynamic namespace matches", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/abc"); sio.of(/^\/dynamic-\d+$/); @@ -820,8 +826,8 @@ describe("socket.io", () => { describe("socket", () => { it("should not fire events more than once after manually reconnecting", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const clientSocket = client(srv, { reconnection: false }); clientSocket.on("connect", function init() { @@ -837,8 +843,8 @@ describe("socket.io", () => { }); it("should not fire reconnect_failed event more than once when server closed", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const clientSocket = client(srv, { reconnectionAttempts: 3, @@ -855,8 +861,8 @@ describe("socket.io", () => { }); it("should receive events", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -872,8 +878,8 @@ describe("socket.io", () => { }); it("should receive message events through `send`", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -887,8 +893,8 @@ describe("socket.io", () => { }); it("should error with null messages", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -902,8 +908,8 @@ describe("socket.io", () => { }); it("should handle transport null messages", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { reconnection: false }); sio.on("connection", s => { @@ -920,8 +926,8 @@ describe("socket.io", () => { }); it("should emit events", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); socket.on("woot", a => { @@ -935,8 +941,8 @@ describe("socket.io", () => { }); it("should emit events with utf8 multibyte character", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); let i = 0; @@ -957,8 +963,8 @@ describe("socket.io", () => { }); it("should emit events with binary data", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); let imageData; @@ -980,8 +986,8 @@ describe("socket.io", () => { }); it("should emit events with several types of data (including binary)", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); socket.on("multiple", (a, b, c, d, e, f) => { @@ -1006,8 +1012,8 @@ describe("socket.io", () => { }); it("should receive events with binary data", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1022,8 +1028,8 @@ describe("socket.io", () => { }); it("should receive events with several types of data (including binary)", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1052,8 +1058,8 @@ describe("socket.io", () => { }); it("should not emit volatile event after regular event (polling)", done => { - const srv = http(); - const sio = io(srv, { transports: ["polling"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["polling"] }); let counter = 0; srv.listen(() => { @@ -1075,8 +1081,8 @@ describe("socket.io", () => { }); it("should not emit volatile event after regular event (ws)", done => { - const srv = http(); - const sio = io(srv, { transports: ["websocket"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["websocket"] }); let counter = 0; srv.listen(() => { @@ -1098,8 +1104,8 @@ describe("socket.io", () => { }); it("should emit volatile event (polling)", done => { - const srv = http(); - const sio = io(srv, { transports: ["polling"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["polling"] }); let counter = 0; srv.listen(() => { @@ -1123,8 +1129,8 @@ describe("socket.io", () => { }); it("should emit volatile event (ws)", done => { - const srv = http(); - const sio = io(srv, { transports: ["websocket"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["websocket"] }); let counter = 0; srv.listen(() => { @@ -1148,8 +1154,8 @@ describe("socket.io", () => { }); it("should emit only one consecutive volatile event (polling)", done => { - const srv = http(); - const sio = io(srv, { transports: ["polling"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["polling"] }); let counter = 0; srv.listen(() => { @@ -1174,8 +1180,8 @@ describe("socket.io", () => { }); it("should emit only one consecutive volatile event (ws)", done => { - const srv = http(); - const sio = io(srv, { transports: ["websocket"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["websocket"] }); let counter = 0; srv.listen(() => { @@ -1200,8 +1206,8 @@ describe("socket.io", () => { }); it("should emit regular events after trying a failed volatile event (polling)", done => { - const srv = http(); - const sio = io(srv, { transports: ["polling"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["polling"] }); let counter = 0; srv.listen(() => { @@ -1227,8 +1233,8 @@ describe("socket.io", () => { }); it("should emit regular events after trying a failed volatile event (ws)", done => { - const srv = http(); - const sio = io(srv, { transports: ["websocket"] }); + const srv = createServer(); + const sio = new Server(srv, { transports: ["websocket"] }); let counter = 0; srv.listen(() => { @@ -1254,8 +1260,8 @@ describe("socket.io", () => { }); it("should emit message events through `send`", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); socket.on("message", a => { @@ -1269,8 +1275,8 @@ describe("socket.io", () => { }); it("should receive event with callbacks", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1287,8 +1293,8 @@ describe("socket.io", () => { }); it("should receive all events emitted from namespaced client immediately and in order", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 0; srv.listen(() => { sio.of("/chat", s => { @@ -1311,8 +1317,8 @@ describe("socket.io", () => { }); it("should emit events with callbacks", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1327,8 +1333,8 @@ describe("socket.io", () => { }); it("should receive events with args and callback", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1345,8 +1351,8 @@ describe("socket.io", () => { }); it("should emit events with args and callback", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1363,8 +1369,8 @@ describe("socket.io", () => { }); it("should receive events with binary args and callbacks", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1382,8 +1388,8 @@ describe("socket.io", () => { }); it("should emit events with binary args and callback", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1399,8 +1405,8 @@ describe("socket.io", () => { }); it("should emit events and receive binary data in a callback", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1416,8 +1422,8 @@ describe("socket.io", () => { }); it("should receive events and pass binary data in a callback", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1433,8 +1439,8 @@ describe("socket.io", () => { }); it("should have access to the client", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1445,8 +1451,8 @@ describe("socket.io", () => { }); it("should have access to the connection", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1458,8 +1464,8 @@ describe("socket.io", () => { }); it("should have access to the request", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); sio.on("connection", s => { @@ -1471,8 +1477,8 @@ describe("socket.io", () => { }); it("should see query parameters in the request", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { query: { key1: 1, key2: 2 } }); sio.on("connection", s => { @@ -1486,8 +1492,8 @@ describe("socket.io", () => { }); it("should see query parameters sent from secondary namespace connections in handshake object", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const client1 = client(srv); const client2 = client(srv, "/connection2", { auth: { key1: "aa", key2: "&=bb" } @@ -1504,8 +1510,8 @@ describe("socket.io", () => { it("should handle very large json", function(done) { this.timeout(30000); - const srv = http(); - const sio = io(srv, { perMessageDeflate: false }); + const srv = createServer(); + const sio = new Server(srv, { perMessageDeflate: false }); let received = 0; srv.listen(() => { const socket = client(srv); @@ -1515,11 +1521,14 @@ describe("socket.io", () => { else socket.emit("big", a); }); sio.on("connection", s => { - fs.readFile(join(__dirname, "fixtures", "big.json"), (err, data) => { - if (err) return done(err); - data = JSON.parse(data); - s.emit("big", { hello: "friend", json: data }); - }); + fs.readFile( + join(__dirname, "fixtures", "big.json"), + (err, data: any) => { + if (err) return done(err); + data = JSON.parse(data); + s.emit("big", { hello: "friend", json: data }); + } + ); s.on("big", a => { s.emit("big", a); }); @@ -1529,8 +1538,8 @@ describe("socket.io", () => { it("should handle very large binary data", function(done) { this.timeout(30000); - const srv = http(); - const sio = io(srv, { perMessageDeflate: false }); + const srv = createServer(); + const sio = new Server(srv, { perMessageDeflate: false }); let received = 0; srv.listen(() => { const socket = client(srv); @@ -1553,8 +1562,8 @@ describe("socket.io", () => { }); it("should be able to emit after server close and restart", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); sio.on("connection", socket => { socket.on("ev", data => { @@ -1564,7 +1573,7 @@ describe("socket.io", () => { }); srv.listen(() => { - const port = srv.address().port; + const { port } = srv.address() as AddressInfo; const clientSocket = client(srv, { reconnectionAttempts: 10, reconnectionDelay: 100 @@ -1581,8 +1590,8 @@ describe("socket.io", () => { }); it("should enable compression by default", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/chat"); sio.of("/chat").on("connection", s => { @@ -1596,8 +1605,8 @@ describe("socket.io", () => { }); it("should disable compression", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, "/chat"); sio.of("/chat").on("connection", s => { @@ -1614,8 +1623,8 @@ describe("socket.io", () => { }); it("should error with raw binary and warn", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { reconnection: false }); sio.on("connection", s => { @@ -1633,8 +1642,8 @@ describe("socket.io", () => { }); it("should not crash when receiving an error packet without handler", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { reconnection: false }); sio.on("connection", s => { @@ -1652,8 +1661,8 @@ describe("socket.io", () => { }); it("should not crash with raw binary", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { reconnection: false }); sio.on("connection", s => { @@ -1669,8 +1678,8 @@ describe("socket.io", () => { }); it("should handle empty binary packet", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv, { reconnection: false }); sio.on("connection", s => { @@ -1692,8 +1701,8 @@ describe("socket.io", () => { global.File = ""; // @ts-ignore global.Blob = []; - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -1708,8 +1717,8 @@ describe("socket.io", () => { }); it("should always trigger the callback (if provided) when joining a room", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -1724,8 +1733,8 @@ describe("socket.io", () => { describe("messaging many", () => { it("emits to a namespace", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; srv.listen(() => { @@ -1759,8 +1768,8 @@ describe("socket.io", () => { }); it("emits binary data to a namespace", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; srv.listen(() => { @@ -1794,8 +1803,8 @@ describe("socket.io", () => { }); it("emits to the rest", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const total = 2; srv.listen(() => { @@ -1827,8 +1836,8 @@ describe("socket.io", () => { }); it("emits to rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const total = 2; srv.listen(() => { @@ -1858,8 +1867,8 @@ describe("socket.io", () => { }); it("emits to rooms avoiding dupes", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; srv.listen(() => { @@ -1899,8 +1908,8 @@ describe("socket.io", () => { }); it("broadcasts to rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; srv.listen(() => { @@ -1941,8 +1950,8 @@ describe("socket.io", () => { }); it("broadcasts binary data to rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let total = 2; srv.listen(() => { @@ -1987,8 +1996,8 @@ describe("socket.io", () => { }); it("keeps track of rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -2013,8 +2022,8 @@ describe("socket.io", () => { }); it("deletes empty rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -2031,8 +2040,8 @@ describe("socket.io", () => { }); it("should properly cleanup left rooms", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -2054,8 +2063,8 @@ describe("socket.io", () => { }); it("allows to join several rooms at once", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const socket = client(srv); @@ -2073,8 +2082,8 @@ describe("socket.io", () => { const { Socket } = require("../dist/socket"); it("should call functions", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let run = 0; sio.use((socket, next) => { expect(socket).to.be.a(Socket); @@ -2096,8 +2105,8 @@ describe("socket.io", () => { }); it("should pass errors", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const run = 0; sio.use((socket, next) => { next(new Error("Authentication error")); @@ -2118,9 +2127,9 @@ describe("socket.io", () => { }); it("should only call connection after fns", done => { - const srv = http(); - const sio = io(srv); - sio.use((socket, next) => { + const srv = createServer(); + const sio = new Server(srv); + sio.use((socket: any, next) => { socket.name = "guillermo"; next(); }); @@ -2134,8 +2143,8 @@ describe("socket.io", () => { }); it("should only call connection after (lengthy) fns", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let authenticated = false; sio.use((socket, next) => { @@ -2154,8 +2163,8 @@ describe("socket.io", () => { }); it("should be ignored if socket gets closed", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let socket; sio.use((s, next) => { socket.io.engine.close(); @@ -2175,8 +2184,8 @@ describe("socket.io", () => { }); it("should call functions in expected order", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); const result = []; sio.use(() => { @@ -2205,8 +2214,8 @@ describe("socket.io", () => { }); it("should disable the merge of handshake packets", done => { - const srv = http(); - const sio = io(); + const srv = createServer(); + const sio = new Server(); sio.use((socket, next) => { next(); }); @@ -2218,8 +2227,8 @@ describe("socket.io", () => { }); it("should work with a custom namespace", done => { - const srv = http(); - const sio = io(); + const srv = createServer(); + const sio = new Server(); sio.listen(srv); sio.of("/chat").use((socket, next) => { next(); @@ -2239,8 +2248,8 @@ describe("socket.io", () => { const { Socket } = require("../dist/socket"); it("should call functions", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); let run = 0; srv.listen(() => { @@ -2271,8 +2280,8 @@ describe("socket.io", () => { }); it("should pass errors", done => { - const srv = http(); - const sio = io(srv); + const srv = createServer(); + const sio = new Server(srv); srv.listen(() => { const clientSocket = client(srv, { multiplex: false }); From 8b6b100c284ccce7d85e55659e3397f533916847 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 9 Oct 2020 02:13:03 +0200 Subject: [PATCH 337/494] feat: add ES6 module export Both CommonJS and ES6 import are now supported: - with `{ "type": "commonjs" }` in the package.json file ```js const io = require("socket.io")(8080); // or const { Server } = require("socket.io"); const io = new Server(8080); ``` - with `{ "type": "module" }` ```js import { Server } from "socket.io"; const io = new Server(8080); ``` Related: https://nodejs.org/api/packages.html#packages_dual_commonjs_es_module_packages --- package.json | 5 +++++ wrapper.mjs | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 wrapper.mjs diff --git a/package.json b/package.json index 6b14335bfa..957d432886 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,12 @@ "files": [ "dist/" ], + "type": "commonjs", "main": "./dist/index.js", + "exports": { + "import": "./wrapper.mjs", + "require": "./dist/index.js" + }, "types": "./dist/index.d.ts", "license": "MIT", "repository": { diff --git a/wrapper.mjs b/wrapper.mjs new file mode 100644 index 0000000000..441cd78dc1 --- /dev/null +++ b/wrapper.mjs @@ -0,0 +1,3 @@ +import io from "./dist/index.js"; + +export const Server = io.Server; From a8c06006098b512ba1b8b8df82777349db486f41 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 11:01:54 +0200 Subject: [PATCH 338/494] feat: remove the 'origins' option The underlying Engine.IO server now supports a 'cors' option, which will be forwarded to the cors module. Breaking change: the 'origins' option is removed Before: ```js new Server(3000, { origins: ["https://example.com/"] }); ``` The 'origins' option was used in the allowRequest method, in order to determine whether the request should pass or not. And the Engine.IO server would implicitly add the necessary Access-Control-Allow-xxx headers. After: ```js new Server(3000, { cors: { origin: "https://example.com/", methods: ["GET", "POST"], allowedHeaders: ["content-type"] } }); ``` The already existing 'allowRequest' option can be used for validation: ```js new Server(3000, { allowRequest: (req, callback) => { callback(null, req.headers.referer.startsWith("https://example.com/")); } }); ``` --- dist/index.d.ts | 19 ------- dist/index.js | 47 ---------------- lib/index.ts | 62 -------------------- test/socket.io.ts | 140 +++++++++++----------------------------------- 4 files changed, 34 insertions(+), 234 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 3d7d5ec22a..a050869a63 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -97,10 +97,6 @@ interface ServerOptions extends EngineAttachOptions { * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. */ adapter: any; - /** - * the allowed origins (*:*) - */ - origins: string | string[] | ((origin: string, cb: (err: Error, allow: boolean) => void) => void); /** * the parser to use. Defaults to an instance of the Parser that ships with socket.io. */ @@ -115,7 +111,6 @@ export declare class Server extends EventEmitter { nsps: Map; private parentNsps; private _adapter; - private _origins; private _serveClient; private eio; private engine; @@ -130,13 +125,6 @@ export declare class Server extends EventEmitter { constructor(opts?: Partial); constructor(srv: http.Server, opts?: Partial); constructor(srv: number, opts?: Partial); - /** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} req request - * @param {Function} fn callback to be called with the result: `fn(err, success)` - */ - private checkRequest; /** * Sets/gets whether client code is being served. * @@ -168,13 +156,6 @@ export declare class Server extends EventEmitter { * @return {Server|Adapter} self when setting or value when getting */ adapter(v: any): any; - /** - * Sets the allowed origins for requests. - * - * @param {String|String[]} v origins - * @return {Server|Adapter} self when setting or value when getting - */ - origins(v: any): any; /** * Attaches socket.io to a server or port. * diff --git a/dist/index.js b/dist/index.js index 478df9f3dd..d4c8d4cf02 100644 --- a/dist/index.js +++ b/dist/index.js @@ -33,7 +33,6 @@ const namespace_1 = require("./namespace"); const parent_namespace_1 = require("./parent-namespace"); const socket_io_adapter_1 = require("socket.io-adapter"); const parser = __importStar(require("socket.io-parser")); -const url_1 = __importDefault(require("url")); const debug_1 = __importDefault(require("debug")); const debug = debug_1.default("socket.io:server"); const clientVersion = require("socket.io-client/package.json").version; @@ -56,42 +55,10 @@ class Server extends events_1.EventEmitter { this.parser = opts.parser || parser; this.encoder = new this.parser.Encoder(); this.adapter(opts.adapter || socket_io_adapter_1.Adapter); - this.origins(opts.origins || "*:*"); this.sockets = this.of("/"); if (srv) this.attach(srv, opts); } - /** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} req request - * @param {Function} fn callback to be called with the result: `fn(err, success)` - */ - checkRequest(req, fn) { - let origin = req.headers.origin || req.headers.referer; - // file:// URLs produce a null Origin which can't be authorized via echo-back - if ("null" == origin || null == origin) - origin = "*"; - if (!!origin && typeof this._origins == "function") - return this._origins(origin, fn); - if (this._origins.indexOf("*:*") !== -1) - return fn(null, true); - if (origin) { - try { - const parts = url_1.default.parse(origin); - const defaultPort = "https:" == parts.protocol ? 443 : 80; - parts.port = parts.port != null ? parts.port : defaultPort; - const ok = ~this._origins.indexOf(parts.protocol + "//" + parts.hostname + ":" + parts.port) || - ~this._origins.indexOf(parts.hostname + ":" + parts.port) || - ~this._origins.indexOf(parts.hostname + ":*") || - ~this._origins.indexOf("*:" + parts.port); - debug("origin %s is %svalid", origin, !!ok ? "" : "not "); - return fn(null, !!ok); - } - catch (ex) { } - } - fn(null, false); - } /** * Sets/gets whether client code is being served. * @@ -176,18 +143,6 @@ class Server extends events_1.EventEmitter { } return this; } - /** - * Sets the allowed origins for requests. - * - * @param {String|String[]} v origins - * @return {Server|Adapter} self when setting or value when getting - */ - origins(v) { - if (!arguments.length) - return this._origins; - this._origins = v; - return this; - } listen(srv, opts = {}) { return this.attach(srv, opts); } @@ -212,8 +167,6 @@ class Server extends events_1.EventEmitter { } // set engine.io path to `/socket.io` opts.path = opts.path || this._path; - // set origins verification - opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); this.initEngine(srv, opts); return this; } diff --git a/lib/index.ts b/lib/index.ts index ca902f21d1..10905a8dfb 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -9,7 +9,6 @@ import { ParentNamespace } from "./parent-namespace"; import { Adapter, Room, SocketId } from "socket.io-adapter"; import * as parser from "socket.io-parser"; import { Encoder } from "socket.io-parser"; -import url from "url"; import debugModule from "debug"; import { Socket } from "./socket"; import { CookieSerializeOptions } from "cookie"; @@ -122,13 +121,6 @@ interface ServerOptions extends EngineAttachOptions { * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. */ adapter: any; - /** - * the allowed origins (*:*) - */ - origins: - | string - | string[] - | ((origin: string, cb: (err: Error, allow: boolean) => void) => void); /** * the parser to use. Defaults to an instance of the Parser that ships with socket.io. */ @@ -155,7 +147,6 @@ export class Server extends EventEmitter { ParentNamespace > = new Map(); private _adapter; - private _origins; private _serveClient: boolean; private eio; private engine; @@ -182,48 +173,10 @@ export class Server extends EventEmitter { this.parser = opts.parser || parser; this.encoder = new this.parser.Encoder(); this.adapter(opts.adapter || Adapter); - this.origins(opts.origins || "*:*"); this.sockets = this.of("/"); if (srv) this.attach(srv, opts); } - /** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} req request - * @param {Function} fn callback to be called with the result: `fn(err, success)` - */ - private checkRequest( - req: http.IncomingMessage, - fn: (err: Error, success: boolean) => void - ) { - let origin = req.headers.origin || req.headers.referer; - - // file:// URLs produce a null Origin which can't be authorized via echo-back - if ("null" == origin || null == origin) origin = "*"; - - if (!!origin && typeof this._origins == "function") - return this._origins(origin, fn); - if (this._origins.indexOf("*:*") !== -1) return fn(null, true); - if (origin) { - try { - const parts: any = url.parse(origin); - const defaultPort = "https:" == parts.protocol ? 443 : 80; - parts.port = parts.port != null ? parts.port : defaultPort; - const ok = - ~this._origins.indexOf( - parts.protocol + "//" + parts.hostname + ":" + parts.port - ) || - ~this._origins.indexOf(parts.hostname + ":" + parts.port) || - ~this._origins.indexOf(parts.hostname + ":*") || - ~this._origins.indexOf("*:" + parts.port); - debug("origin %s is %svalid", origin, !!ok ? "" : "not "); - return fn(null, !!ok); - } catch (ex) {} - } - fn(null, false); - } - /** * Sets/gets whether client code is being served. * @@ -319,19 +272,6 @@ export class Server extends EventEmitter { return this; } - /** - * Sets the allowed origins for requests. - * - * @param {String|String[]} v origins - * @return {Server|Adapter} self when setting or value when getting - */ - public origins(v) { - if (!arguments.length) return this._origins; - - this._origins = v; - return this; - } - /** * Attaches socket.io to a server or port. * @@ -379,8 +319,6 @@ export class Server extends EventEmitter { // set engine.io path to `/socket.io` opts.path = opts.path || this._path; - // set origins verification - opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); this.initEngine(srv, opts); diff --git a/test/socket.io.ts b/test/socket.io.ts index 7c1abf5c36..4bdae1e69e 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -124,121 +124,61 @@ describe("socket.io", () => { describe("handshake", () => { const request = require("superagent"); - it("should disallow request when origin defined and none specified", done => { - const sockets = new Server({ origins: "http://foo.example:*" }).listen( - 54013 - ); - request - .get("http://localhost:54013/socket.io/default/") - .query({ transport: "polling" }) - .end((err, res) => { - expect(res.status).to.be(403); - done(); - }); - }); - - it("should disallow request when origin defined and a different one specified", done => { - const sockets = new Server({ origins: "http://foo.example:*" }).listen( - 54014 - ); - request - .get("http://localhost:54014/socket.io/default/") - .query({ transport: "polling" }) - .set("origin", "http://herp.derp/") - .end((err, res) => { - expect(res.status).to.be(403); - done(); - }); - }); - - it("should allow request when origin defined an the same is specified", done => { - const sockets = new Server({ origins: "http://foo.example:*" }).listen( - 54015 - ); - request - .get("http://localhost:54015/socket.io/default/") - .set("origin", "http://foo.example/") - .query({ transport: "polling" }) - .end((err, res) => { - expect(res.status).to.be(200); - done(); - }); - }); - - it("should allow request when origin defined as function and same is supplied", done => { - const sockets = new Server({ - origins: (origin, callback) => { - if (origin == "http://foo.example/") { - return callback(null, true); - } - return callback(null, false); + it("should send the Access-Control-Allow-xxx headers on OPTIONS request", done => { + const sockets = new Server(54013, { + cors: { + origin: "http://localhost:54023/", + methods: ["GET", "POST"], + allowedHeaders: ["content-type"], + credentials: true } - }).listen(54016); + }); request - .get("http://localhost:54016/socket.io/default/") - .set("origin", "http://foo.example/") + .options("http://localhost:54013/socket.io/default/") .query({ transport: "polling" }) + .set("Origin", "http://localhost:54023/") .end((err, res) => { - expect(res.status).to.be(200); - done(); - }); - }); + expect(res.status).to.be(204); - it("should allow request when origin defined as function and different is supplied", done => { - const sockets = new Server({ - origins: (origin, callback) => { - if (origin == "http://foo.example/") { - return callback(null, true); - } - return callback(null, false); - } - }).listen(54017); - request - .get("http://localhost:54017/socket.io/default/") - .set("origin", "http://herp.derp/") - .query({ transport: "polling" }) - .end((err, res) => { - expect(res.status).to.be(403); + expect(res.headers["access-control-allow-origin"]).to.be( + "http://localhost:54023/" + ); + expect(res.headers["access-control-allow-methods"]).to.be("GET,POST"); + expect(res.headers["access-control-allow-headers"]).to.be( + "content-type" + ); + expect(res.headers["access-control-allow-credentials"]).to.be("true"); done(); }); }); - it("should allow request when origin defined as function and no origin is supplied", done => { - const sockets = new Server({ - origins: (origin, callback) => { - if (origin == "*") { - return callback(null, true); - } - return callback(null, false); + it("should send the Access-Control-Allow-xxx headers on GET request", done => { + const sockets = new Server(54014, { + cors: { + origin: "http://localhost:54024/", + methods: ["GET", "POST"], + allowedHeaders: ["content-type"], + credentials: true } - }).listen(54021); + }); request - .get("http://localhost:54021/socket.io/default/") + .get("http://localhost:54014/socket.io/default/") .query({ transport: "polling" }) + .set("Origin", "http://localhost:54024/") .end((err, res) => { expect(res.status).to.be(200); - done(); - }); - }); - it("should default to port 443 when protocol is https", done => { - const sockets = new Server({ origins: "https://foo.example/" }).listen( - 54036 - ); - request - .get("http://localhost:54036/socket.io/default/") - .set("origin", "https://foo.example/") - .query({ transport: "polling" }) - .end((err, res) => { - expect(res.status).to.be(200); + expect(res.headers["access-control-allow-origin"]).to.be( + "http://localhost:54024/" + ); + expect(res.headers["access-control-allow-credentials"]).to.be("true"); done(); }); }); it("should allow request if custom function in opts.allowRequest returns true", done => { const sockets = new Server(createServer().listen(54022), { - allowRequest: (req, callback) => callback(null, true), - origins: "http://foo.example:*" + allowRequest: (req, callback) => callback(null, true) }); request @@ -263,18 +203,6 @@ describe("socket.io", () => { done(); }); }); - - it("should allow request when using an array of origins", done => { - new Server({ origins: ["http://foo.example:54024/"] }).listen(54024); - request - .get("http://localhost:54024/socket.io/default/") - .set("origin", "http://foo.example:54024/") - .query({ transport: "polling" }) - .end((err, res) => { - expect(res.status).to.be(200); - done(); - }); - }); }); describe("close", () => { From 4bd5b2339a66a5a675e20f689fff2e70ff12d236 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 11:42:43 +0200 Subject: [PATCH 339/494] feat: throw upon reserved event names These events cannot be used by the end users, because they are part of the Socket.IO public API, so using them will now throw an error explicitly. --- dist/namespace.js | 13 ++----------- dist/socket.d.ts | 3 ++- dist/socket.js | 19 ++++++++----------- lib/namespace.ts | 17 +++-------------- lib/socket.ts | 19 +++++++------------ test/socket.io.ts | 24 ++++++++++++++++++++++++ 6 files changed, 46 insertions(+), 49 deletions(-) diff --git a/dist/namespace.js b/dist/namespace.js index f547362aed..7185862f7d 100644 --- a/dist/namespace.js +++ b/dist/namespace.js @@ -10,14 +10,6 @@ const socket_io_parser_1 = require("socket.io-parser"); const has_binary2_1 = __importDefault(require("has-binary2")); const debug_1 = __importDefault(require("debug")); const debug = debug_1.default("socket.io:namespace"); -/** - * Blacklisted events. - */ -const events = [ - "connect", - "connection", - "newListener" -]; class Namespace extends events_1.EventEmitter { /** * Namespace constructor. @@ -158,9 +150,8 @@ class Namespace extends events_1.EventEmitter { */ // @ts-ignore emit(ev, ...args) { - if (~events.indexOf(ev)) { - super.emit.apply(this, arguments); - return this; + if (socket_1.RESERVED_EVENTS.has(ev)) { + throw new Error(`"${ev}" is a reserved event name`); } // set up packet object args.unshift(ev); diff --git a/dist/socket.d.ts b/dist/socket.d.ts index f263f21ebe..b138833f9f 100644 --- a/dist/socket.d.ts +++ b/dist/socket.d.ts @@ -4,6 +4,7 @@ import { Client } from "./client"; import { Namespace } from "./namespace"; import { IncomingMessage } from "http"; import { Room, SocketId } from "socket.io-adapter"; +export declare const RESERVED_EVENTS: Set; /** * The handshake details */ @@ -76,7 +77,7 @@ export declare class Socket extends EventEmitter { * * @return {Socket} self */ - emit(ev: any): this; + emit(ev: string, ...args: any[]): this; /** * Targets a room when broadcasting. * diff --git a/dist/socket.js b/dist/socket.js index a4ef75cac7..a484cc55d6 100644 --- a/dist/socket.js +++ b/dist/socket.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.Socket = void 0; +exports.Socket = exports.RESERVED_EVENTS = void 0; const events_1 = require("events"); const socket_io_parser_1 = require("socket.io-parser"); const has_binary2_1 = __importDefault(require("has-binary2")); @@ -11,17 +11,15 @@ const url_1 = __importDefault(require("url")); const debug_1 = __importDefault(require("debug")); const base64id_1 = __importDefault(require("base64id")); const debug = debug_1.default("socket.io:socket"); -/** - * Blacklisted events. - */ -const events = [ +exports.RESERVED_EVENTS = new Set([ "error", "connect", "disconnect", "disconnecting", + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener "newListener", "removeListener" -]; +]); class Socket extends events_1.EventEmitter { /** * Interface to a `Client` for a given `Namespace`. @@ -69,12 +67,11 @@ class Socket extends events_1.EventEmitter { * @return {Socket} self */ // @ts-ignore - emit(ev) { - if (~events.indexOf(ev)) { - super.emit.apply(this, arguments); - return this; + emit(ev, ...args) { + if (exports.RESERVED_EVENTS.has(ev)) { + throw new Error(`"${ev}" is a reserved event name`); } - const args = Array.prototype.slice.call(arguments); + args.unshift(ev); const packet = { type: (this.flags.binary !== undefined ? this.flags.binary diff --git a/lib/namespace.ts b/lib/namespace.ts index 0fb65bbe20..8b099a000b 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -1,4 +1,4 @@ -import { Socket } from "./socket"; +import { Socket, RESERVED_EVENTS } from "./socket"; import { Server } from "./index"; import { Client } from "./client"; import { EventEmitter } from "events"; @@ -9,16 +9,6 @@ import { Adapter, Room, SocketId } from "socket.io-adapter"; const debug = debugModule("socket.io:namespace"); -/** - * Blacklisted events. - */ - -const events = [ - "connect", // for symmetry with client - "connection", - "newListener" -]; - export class Namespace extends EventEmitter { public readonly name: string; public readonly connected: Map = new Map(); @@ -176,9 +166,8 @@ export class Namespace extends EventEmitter { */ // @ts-ignore public emit(ev: string, ...args: any[]): Namespace { - if (~events.indexOf(ev)) { - super.emit.apply(this, arguments); - return this; + if (RESERVED_EVENTS.has(ev)) { + throw new Error(`"${ev}" is a reserved event name`); } // set up packet object args.unshift(ev); diff --git a/lib/socket.ts b/lib/socket.ts index a9347a367f..0ddbd9eff6 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -12,18 +12,15 @@ import base64id from "base64id"; const debug = debugModule("socket.io:socket"); -/** - * Blacklisted events. - */ - -const events = [ +export const RESERVED_EVENTS = new Set([ "error", "connect", "disconnect", "disconnecting", + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener "newListener", "removeListener" -]; +]); /** * The handshake details @@ -133,13 +130,11 @@ export class Socket extends EventEmitter { * @return {Socket} self */ // @ts-ignore - public emit(ev) { - if (~events.indexOf(ev)) { - super.emit.apply(this, arguments); - return this; + public emit(ev: string, ...args: any[]) { + if (RESERVED_EVENTS.has(ev)) { + throw new Error(`"${ev}" is a reserved event name`); } - - const args = Array.prototype.slice.call(arguments); + args.unshift(ev); const packet: any = { type: (this.flags.binary !== undefined ? this.flags.binary diff --git a/test/socket.io.ts b/test/socket.io.ts index 4bdae1e69e..db32b20efa 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -693,6 +693,14 @@ describe("socket.io", () => { }); }); + it("should throw on reserved event", () => { + const sio = new Server(); + + expect(() => sio.emit("connect")).to.throwException( + /"connect" is a reserved event name/ + ); + }); + describe("dynamic namespaces", () => { it("should allow connections to dynamic namespaces with a regex", done => { const srv = createServer(); @@ -1657,6 +1665,22 @@ describe("socket.io", () => { }); }); }); + + it("should throw on reserved event", done => { + const srv = createServer(); + const sio = new Server(srv); + + srv.listen(() => { + const socket = client(srv); + sio.on("connection", s => { + expect(() => s.emit("error")).to.throwException( + /"error" is a reserved event name/ + ); + socket.close(); + done(); + }); + }); + }); }); describe("messaging many", () => { From 9c7a48d86652831c7de024a9da55594d86b14b62 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 16:12:02 +0200 Subject: [PATCH 340/494] test: use the complete export name Following https://github.com/socketio/socket.io-client/commit/fa7d41f55d31f0504d99b737896b3d15909d9897 Ref: https://nodejs.org/dist/latest-v14.x/docs/api/packages.html#packages_subpath_exports --- test/socket.io.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/socket.io.ts b/test/socket.io.ts index db32b20efa..41428c6955 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -28,12 +28,12 @@ function client(srv, nsp?: string | object, opts?: object) { describe("socket.io", () => { it.skip("should be the same version as client", () => { const version = require("../package").version; - expect(version).to.be(require("socket.io-client/package").version); + expect(version).to.be(require("socket.io-client/package.json").version); }); describe("server attachment", () => { describe("http.Server", () => { - const clientVersion = require("socket.io-client/package").version; + const clientVersion = require("socket.io-client/package.json").version; it("should serve static files", done => { const srv = createServer(); From c0d171f7287152cc874adc4ea3411e1134e8a7a0 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 16:13:28 +0200 Subject: [PATCH 341/494] test: use the reconnect event of the Manager Following https://github.com/socketio/socket.io-client/commit/132f8ec918a596eec872aee0c61d4ce63714c400 --- test/socket.io.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/socket.io.ts b/test/socket.io.ts index 41428c6955..8c74b2fb02 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -790,7 +790,7 @@ describe("socket.io", () => { srv.close(); }); - clientSocket.on("reconnect_failed", () => { + clientSocket.io.on("reconnect_failed", () => { done(); }); }); @@ -1516,7 +1516,7 @@ describe("socket.io", () => { }); clientSocket.once("connect", () => { srv.close(() => { - clientSocket.on("reconnect", () => { + clientSocket.io.on("reconnect", () => { clientSocket.emit("ev", "payload"); }); sio.listen(port); From ebb0575fa82af8a94d371f09fea62c3a521c3b8e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 13 Oct 2020 23:36:21 +0200 Subject: [PATCH 342/494] chore(release): 3.0.0-rc1 Diff: https://github.com/socketio/socket.io/compare/2.3.0...3.0.0-rc1 --- .gitignore | 1 + CHANGELOG.md | 81 +++++++ dist/client.d.ts | 93 -------- dist/client.js | 224 ------------------ dist/index.d.ts | 299 ------------------------ dist/index.js | 453 ----------------------------------- dist/namespace.d.ts | 128 ---------- dist/namespace.js | 254 -------------------- dist/parent-namespace.d.ts | 9 - dist/parent-namespace.js | 36 --- dist/socket.d.ts | 258 -------------------- dist/socket.js | 467 ------------------------------------- package.json | 9 +- 13 files changed, 87 insertions(+), 2225 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 dist/client.d.ts delete mode 100644 dist/client.js delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/namespace.d.ts delete mode 100644 dist/namespace.js delete mode 100644 dist/parent-namespace.d.ts delete mode 100644 dist/parent-namespace.js delete mode 100644 dist/socket.d.ts delete mode 100644 dist/socket.js diff --git a/.gitignore b/.gitignore index 9b8b77d61a..339440ff84 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ node_modules coverage .idea .nyc_output +dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..7b42f3a7fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,81 @@ +# [3.0.0-rc1](https://github.com/socketio/socket.io/compare/2.3.0...3.0.0-rc1) (2020-10-13) + + +### Features + +* add ES6 module export ([8b6b100](https://github.com/socketio/socket.io/commit/8b6b100c284ccce7d85e55659e3397f533916847)) +* do not reuse the Engine.IO id ([2875d2c](https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15)) +* remove Server#set() method ([029f478](https://github.com/socketio/socket.io/commit/029f478992f59b1eb5226453db46363a570eea46)) +* remove Socket#rooms object ([1507b41](https://github.com/socketio/socket.io/commit/1507b416d584381554d1ed23c9aaf3b650540071)) +* remove the 'origins' option ([a8c0600](https://github.com/socketio/socket.io/commit/a8c06006098b512ba1b8b8df82777349db486f41)) +* remove the implicit connection to the default namespace ([3289f7e](https://github.com/socketio/socket.io/commit/3289f7ec376e9ec88c2f90e2735c8ca8d01c0e97)) +* throw upon reserved event names ([4bd5b23](https://github.com/socketio/socket.io/commit/4bd5b2339a66a5a675e20f689fff2e70ff12d236)) + + +### BREAKING CHANGES + +* the 'origins' option is removed + +Before: + +```js +new Server(3000, { + origins: ["https://example.com/"] +}); +``` + +The 'origins' option was used in the allowRequest method, in order to +determine whether the request should pass or not. And the Engine.IO +server would implicitly add the necessary Access-Control-Allow-xxx +headers. + +After: + +```js +new Server(3000, { + cors: { + origin: "https://example.com/", + methods: ["GET", "POST"], + allowedHeaders: ["content-type"] + } +}); +``` + +The already existing 'allowRequest' option can be used for validation: + +```js +new Server(3000, { + allowRequest: (req, callback) => { + callback(null, req.headers.referer.startsWith("https://example.com/")); + } +}); +``` + +* Socket#rooms is now a Set instead of an object + +* Namespace#connected is now a Map instead of an object + +* there is no more implicit connection to the default namespace: + +```js +// client-side +const socket = io("/admin"); + +// server-side +io.on("connect", socket => { + // not triggered anymore +}) + +io.use((socket, next) => { + // not triggered anymore +}); + +io.of("/admin").use((socket, next) => { + // triggered +}); +``` + +* the Server#set() method was removed + +This method was kept for backward-compatibility with pre-1.0 versions. + diff --git a/dist/client.d.ts b/dist/client.d.ts deleted file mode 100644 index 2a42798592..0000000000 --- a/dist/client.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -/// -import { IncomingMessage } from "http"; -import { Server } from "./index"; -import { Socket } from "./socket"; -export declare class Client { - readonly conn: any; - /** @package */ - readonly id: string; - private readonly server; - private readonly encoder; - private readonly decoder; - private sockets; - private nsps; - /** - * Client constructor. - * - * @param {Server} server instance - * @param {Socket} conn - * @package - */ - constructor(server: Server, conn: any); - /** - * @return the reference to the request that originated the Engine.IO connection - */ - get request(): IncomingMessage; - /** - * Sets up event listeners. - */ - private setup; - /** - * Connects a client to a namespace. - * - * @param {String} name - the namespace - * @param {Object} auth - the auth parameters - * @package - */ - connect(name: string, auth?: object): void; - /** - * Connects a client to a namespace. - * - * @param {String} name - the namespace - * @param {Object} auth - the auth parameters - */ - private doConnect; - /** - * Disconnects from all namespaces and closes transport. - * - * @package - */ - disconnect(): void; - /** - * Removes a socket. Called by each `Socket`. - * - * @package - */ - remove(socket: Socket): void; - /** - * Closes the underlying connection. - */ - private close; - /** - * Writes a packet to the transport. - * - * @param {Object} packet object - * @param {Object} opts - * @package - */ - packet(packet: any, opts?: any): void; - /** - * Called with incoming transport data. - */ - private ondata; - /** - * Called when parser fully decodes a packet. - */ - private ondecoded; - /** - * Handles an error. - * - * @param {Object} err object - */ - private onerror; - /** - * Called upon transport close. - * - * @param reason - */ - private onclose; - /** - * Cleans up event listeners. - */ - private destroy; -} diff --git a/dist/client.js b/dist/client.js deleted file mode 100644 index a37aebb0ca..0000000000 --- a/dist/client.js +++ /dev/null @@ -1,224 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Client = void 0; -const socket_io_parser_1 = require("socket.io-parser"); -const debugModule = require("debug"); -const debug = debugModule("socket.io:client"); -class Client { - /** - * Client constructor. - * - * @param {Server} server instance - * @param {Socket} conn - * @package - */ - constructor(server, conn) { - this.sockets = new Map(); - this.nsps = new Map(); - this.server = server; - this.conn = conn; - this.encoder = server.encoder; - this.decoder = new server.parser.Decoder(); - this.id = conn.id; - this.setup(); - } - /** - * @return the reference to the request that originated the Engine.IO connection - */ - get request() { - return this.conn.request; - } - /** - * Sets up event listeners. - */ - setup() { - this.onclose = this.onclose.bind(this); - this.ondata = this.ondata.bind(this); - this.onerror = this.onerror.bind(this); - this.ondecoded = this.ondecoded.bind(this); - // @ts-ignore - this.decoder.on("decoded", this.ondecoded); - this.conn.on("data", this.ondata); - this.conn.on("error", this.onerror); - this.conn.on("close", this.onclose); - } - /** - * Connects a client to a namespace. - * - * @param {String} name - the namespace - * @param {Object} auth - the auth parameters - * @package - */ - connect(name, auth = {}) { - if (this.server.nsps.has(name)) { - debug("connecting to namespace %s", name); - return this.doConnect(name, auth); - } - this.server.checkNamespace(name, auth, dynamicNsp => { - if (dynamicNsp) { - debug("dynamic namespace %s was created", dynamicNsp.name); - this.doConnect(name, auth); - } - else { - debug("creation of namespace %s was denied", name); - this.packet({ - type: socket_io_parser_1.PacketType.ERROR, - nsp: name, - data: "Invalid namespace" - }); - } - }); - } - /** - * Connects a client to a namespace. - * - * @param {String} name - the namespace - * @param {Object} auth - the auth parameters - */ - doConnect(name, auth) { - const nsp = this.server.of(name); - const socket = nsp.add(this, auth, () => { - this.sockets.set(socket.id, socket); - this.nsps.set(nsp.name, socket); - }); - } - /** - * Disconnects from all namespaces and closes transport. - * - * @package - */ - disconnect() { - for (const socket of this.sockets.values()) { - socket.disconnect(); - } - this.sockets.clear(); - this.close(); - } - /** - * Removes a socket. Called by each `Socket`. - * - * @package - */ - remove(socket) { - if (this.sockets.has(socket.id)) { - const nsp = this.sockets.get(socket.id).nsp.name; - this.sockets.delete(socket.id); - this.nsps.delete(nsp); - } - else { - debug("ignoring remove for %s", socket.id); - } - } - /** - * Closes the underlying connection. - */ - close() { - if ("open" == this.conn.readyState) { - debug("forcing transport close"); - this.conn.close(); - this.onclose("forced server close"); - } - } - /** - * Writes a packet to the transport. - * - * @param {Object} packet object - * @param {Object} opts - * @package - */ - packet(packet, opts) { - opts = opts || {}; - const self = this; - // this writes to the actual connection - function writeToEngine(encodedPackets) { - if (opts.volatile && !self.conn.transport.writable) - return; - for (let i = 0; i < encodedPackets.length; i++) { - self.conn.write(encodedPackets[i], { compress: opts.compress }); - } - } - if ("open" == this.conn.readyState) { - debug("writing packet %j", packet); - if (!opts.preEncoded) { - // not broadcasting, need to encode - writeToEngine(this.encoder.encode(packet)); // encode, then write results to engine - } - else { - // a broadcast pre-encodes a packet - writeToEngine(packet); - } - } - else { - debug("ignoring packet write %j", packet); - } - } - /** - * Called with incoming transport data. - */ - ondata(data) { - // try/catch is needed for protocol violations (GH-1880) - try { - this.decoder.add(data); - } - catch (e) { - this.onerror(e); - } - } - /** - * Called when parser fully decodes a packet. - */ - ondecoded(packet) { - if (socket_io_parser_1.PacketType.CONNECT == packet.type) { - this.connect(packet.nsp, packet.data); - } - else { - const socket = this.nsps.get(packet.nsp); - if (socket) { - process.nextTick(function () { - socket.onpacket(packet); - }); - } - else { - debug("no socket for namespace %s", packet.nsp); - } - } - } - /** - * Handles an error. - * - * @param {Object} err object - */ - onerror(err) { - for (const socket of this.sockets.values()) { - socket.onerror(err); - } - this.conn.close(); - } - /** - * Called upon transport close. - * - * @param reason - */ - onclose(reason) { - debug("client close with reason %s", reason); - // ignore a potential subsequent `close` event - this.destroy(); - // `nsps` and `sockets` are cleaned up seamlessly - for (const socket of this.sockets.values()) { - socket.onclose(reason); - } - this.sockets.clear(); - this.decoder.destroy(); // clean up decoder - } - /** - * Cleans up event listeners. - */ - destroy() { - this.conn.removeListener("data", this.ondata); - this.conn.removeListener("error", this.onerror); - this.conn.removeListener("close", this.onclose); - // @ts-ignore - this.decoder.removeListener("decoded", this.ondecoded); - } -} -exports.Client = Client; diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index a050869a63..0000000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,299 +0,0 @@ -/// -import http from "http"; -import { EventEmitter } from "events"; -import { Namespace } from "./namespace"; -import { Room, SocketId } from "socket.io-adapter"; -import { Encoder } from "socket.io-parser"; -import { Socket } from "./socket"; -import { CookieSerializeOptions } from "cookie"; -import { CorsOptions } from "cors"; -declare type Transport = "polling" | "websocket"; -interface EngineOptions { - /** - * how many ms without a pong packet to consider the connection closed (5000) - */ - pingTimeout: number; - /** - * how many ms before sending a new ping packet (25000) - */ - pingInterval: number; - /** - * how many ms before an uncompleted transport upgrade is cancelled (10000) - */ - upgradeTimeout: number; - /** - * how many bytes or characters a message can be, before closing the session (to avoid DoS). Default value is 1E5. - */ - maxHttpBufferSize: number; - /** - * A function that receives a given handshake or upgrade request as its first parameter, - * and can decide whether to continue or not. The second argument is a function that needs - * to be called with the decided information: fn(err, success), where success is a boolean - * value where false means that the request is rejected, and err is an error code. - */ - allowRequest: (req: http.IncomingMessage, fn: (err: string | null | undefined, success: boolean) => void) => void; - /** - * to allow connections to (['polling', 'websocket']) - */ - transports: Transport[]; - /** - * whether to allow transport upgrades (true) - */ - allowUpgrades: boolean; - /** - * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. (false) - */ - perMessageDeflate: boolean | object; - /** - * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. (true) - */ - httpCompression: boolean | object; - /** - * what WebSocket server implementation to use. Specified module must - * conform to the ws interface (see ws module api docs). Default value is ws. - * An alternative c++ addon is also available by installing uws module. - */ - wsEngine: string; - /** - * an optional packet which will be concatenated to the handshake packet emitted by Engine.IO. - */ - initialPacket: any; - /** - * configuration of the cookie that contains the client sid to send as part of handshake response headers. This cookie - * might be used for sticky-session. Defaults to not sending any cookie (false) - */ - cookie: CookieSerializeOptions | boolean; - /** - * the options that will be forwarded to the cors module - */ - cors: CorsOptions; -} -interface AttachOptions { - /** - * name of the path to capture (/engine.io). - */ - path: string; - /** - * destroy unhandled upgrade requests (true) - */ - destroyUpgrade: boolean; - /** - * milliseconds after which unhandled requests are ended (1000) - */ - destroyUpgradeTimeout: number; -} -interface EngineAttachOptions extends EngineOptions, AttachOptions { -} -interface ServerOptions extends EngineAttachOptions { - /** - * name of the path to capture (/socket.io) - */ - path: string; - /** - * whether to serve the client files (true) - */ - serveClient: boolean; - /** - * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. - */ - adapter: any; - /** - * the parser to use. Defaults to an instance of the Parser that ships with socket.io. - */ - parser: any; -} -export declare class Server extends EventEmitter { - readonly sockets: Namespace; - /** @package */ - readonly parser: any; - /** @package */ - readonly encoder: Encoder; - nsps: Map; - private parentNsps; - private _adapter; - private _serveClient; - private eio; - private engine; - private _path; - private httpServer; - /** - * Server constructor. - * - * @param {http.Server|Number|Object} srv http server, port or options - * @param {Object} [opts] - */ - constructor(opts?: Partial); - constructor(srv: http.Server, opts?: Partial); - constructor(srv: number, opts?: Partial); - /** - * Sets/gets whether client code is being served. - * - * @param {Boolean} v - whether to serve client code - * @return {Server|Boolean} self when setting or value when getting - */ - serveClient(v?: boolean): boolean | this; - /** - * Executes the middleware for an incoming namespace not already created on the server. - * - * @param {String} name - name of incoming namespace - * @param {Object} auth - the auth parameters - * @param {Function} fn - callback - * - * @package - */ - checkNamespace(name: string, auth: object, fn: (nsp: Namespace | boolean) => void): void; - /** - * Sets the client serving path. - * - * @param {String} v pathname - * @return {Server|String} self when setting or value when getting - */ - path(v?: string): string | this; - /** - * Sets the adapter for rooms. - * - * @param {Adapter} v pathname - * @return {Server|Adapter} self when setting or value when getting - */ - adapter(v: any): any; - /** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} srv - server or port - * @param {Object} opts - options passed to engine.io - * @return {Server} self - */ - listen(srv: http.Server, opts?: Partial): Server; - listen(srv: number, opts?: Partial): Server; - /** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} srv - server or port - * @param {Object} opts - options passed to engine.io - * @return {Server} self - */ - attach(srv: http.Server, opts?: Partial): Server; - attach(port: number, opts?: Partial): Server; - /** - * Initialize engine - * - * @param srv - the server to attach to - * @param opts - options passed to engine.io - */ - private initEngine; - /** - * Attaches the static file serving. - * - * @param {Function|http.Server} srv http server - */ - private attachServe; - /** - * Handles a request serving `/socket.io.js` - * - * @param {http.IncomingMessage} req - * @param {http.ServerResponse} res - */ - private serve; - /** - * Handles a request serving `/socket.io.js.map` - * - * @param {http.IncomingMessage} req - * @param {http.ServerResponse} res - */ - private serveMap; - /** - * Binds socket.io to an engine.io instance. - * - * @param {engine.Server} engine engine.io (or compatible) server - * @return {Server} self - */ - bind(engine: any): Server; - /** - * Called with each incoming transport connection. - * - * @param {engine.Socket} conn - * @return {Server} self - */ - private onconnection; - /** - * Looks up a namespace. - * - * @param {String|RegExp|Function} name nsp name - * @param {Function} [fn] optional, nsp `connection` ev handler - */ - of(name: string | RegExp | ((name: string, query: object, fn: (err: Error, success: boolean) => void) => void), fn?: (socket: Socket) => void): Namespace; - /** - * Closes server connection - * - * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed - */ - close(fn?: (err?: Error) => void): void; - /** - * Sets up namespace middleware. - * - * @return {Server} self - * @public - */ - use(fn: (socket: Socket, next: (err?: Error) => void) => void): Server; - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Server} self - * @public - */ - to(name: Room): Server; - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Server} self - * @public - */ - in(name: Room): Server; - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - send(...args: any[]): Server; - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - write(...args: any[]): Server; - /** - * Gets a list of socket ids. - */ - allSockets(): Promise>; - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Server} self - */ - compress(compress: boolean): Server; - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Server} self - */ - binary(binary: boolean): Server; - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Server} self - */ - get volatile(): Server; - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Server} self - */ - get local(): Server; -} -export {}; diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d4c8d4cf02..0000000000 --- a/dist/index.js +++ /dev/null @@ -1,453 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Server = void 0; -const http_1 = __importDefault(require("http")); -const fs_1 = require("fs"); -const path_1 = __importDefault(require("path")); -const engine_io_1 = __importDefault(require("engine.io")); -const client_1 = require("./client"); -const events_1 = require("events"); -const namespace_1 = require("./namespace"); -const parent_namespace_1 = require("./parent-namespace"); -const socket_io_adapter_1 = require("socket.io-adapter"); -const parser = __importStar(require("socket.io-parser")); -const debug_1 = __importDefault(require("debug")); -const debug = debug_1.default("socket.io:server"); -const clientVersion = require("socket.io-client/package.json").version; -/** - * Socket.IO client source. - */ -let clientSource = undefined; -let clientSourceMap = undefined; -class Server extends events_1.EventEmitter { - constructor(srv, opts = {}) { - super(); - this.nsps = new Map(); - this.parentNsps = new Map(); - if ("object" == typeof srv && srv instanceof Object && !srv.listen) { - opts = srv; - srv = null; - } - this.path(opts.path || "/socket.io"); - this.serveClient(false !== opts.serveClient); - this.parser = opts.parser || parser; - this.encoder = new this.parser.Encoder(); - this.adapter(opts.adapter || socket_io_adapter_1.Adapter); - this.sockets = this.of("/"); - if (srv) - this.attach(srv, opts); - } - /** - * Sets/gets whether client code is being served. - * - * @param {Boolean} v - whether to serve client code - * @return {Server|Boolean} self when setting or value when getting - */ - serveClient(v) { - if (!arguments.length) - return this._serveClient; - this._serveClient = v; - const resolvePath = function (file) { - const filepath = path_1.default.resolve(__dirname, "./../../", file); - if (fs_1.existsSync(filepath)) { - return filepath; - } - return require.resolve(file); - }; - if (v && !clientSource) { - clientSource = fs_1.readFileSync(resolvePath("socket.io-client/dist/socket.io.js"), "utf-8"); - try { - clientSourceMap = fs_1.readFileSync(resolvePath("socket.io-client/dist/socket.io.js.map"), "utf-8"); - } - catch (err) { - debug("could not load sourcemap file"); - } - } - return this; - } - /** - * Executes the middleware for an incoming namespace not already created on the server. - * - * @param {String} name - name of incoming namespace - * @param {Object} auth - the auth parameters - * @param {Function} fn - callback - * - * @package - */ - checkNamespace(name, auth, fn) { - if (this.parentNsps.size === 0) - return fn(false); - const keysIterator = this.parentNsps.keys(); - const run = () => { - let nextFn = keysIterator.next(); - if (nextFn.done) { - return fn(false); - } - nextFn.value(name, auth, (err, allow) => { - if (err || !allow) { - run(); - } - else { - fn(this.parentNsps.get(nextFn.value).createChild(name)); - } - }); - }; - run(); - } - /** - * Sets the client serving path. - * - * @param {String} v pathname - * @return {Server|String} self when setting or value when getting - */ - path(v) { - if (!arguments.length) - return this._path; - this._path = v.replace(/\/$/, ""); - return this; - } - /** - * Sets the adapter for rooms. - * - * @param {Adapter} v pathname - * @return {Server|Adapter} self when setting or value when getting - */ - adapter(v) { - if (!arguments.length) - return this._adapter; - this._adapter = v; - for (const nsp of this.nsps.values()) { - nsp.initAdapter(); - } - return this; - } - listen(srv, opts = {}) { - return this.attach(srv, opts); - } - attach(srv, opts = {}) { - if ("function" == typeof srv) { - const msg = "You are trying to attach socket.io to an express " + - "request handler function. Please pass a http.Server instance."; - throw new Error(msg); - } - // handle a port as a string - if (Number(srv) == srv) { - srv = Number(srv); - } - if ("number" == typeof srv) { - debug("creating http server and binding to %d", srv); - const port = srv; - srv = http_1.default.createServer((req, res) => { - res.writeHead(404); - res.end(); - }); - srv.listen(port); - } - // set engine.io path to `/socket.io` - opts.path = opts.path || this._path; - this.initEngine(srv, opts); - return this; - } - /** - * Initialize engine - * - * @param srv - the server to attach to - * @param opts - options passed to engine.io - */ - initEngine(srv, opts) { - // initialize engine - debug("creating engine.io instance with opts %j", opts); - this.eio = engine_io_1.default.attach(srv, opts); - // attach static file serving - if (this._serveClient) - this.attachServe(srv); - // Export http server - this.httpServer = srv; - // bind to engine events - this.bind(this.eio); - } - /** - * Attaches the static file serving. - * - * @param {Function|http.Server} srv http server - */ - attachServe(srv) { - debug("attaching client serving req handler"); - const url = this._path + "/socket.io.js"; - const urlMap = this._path + "/socket.io.js.map"; - const evs = srv.listeners("request").slice(0); - const self = this; - srv.removeAllListeners("request"); - srv.on("request", function (req, res) { - if (0 === req.url.indexOf(urlMap)) { - self.serveMap(req, res); - } - else if (0 === req.url.indexOf(url)) { - self.serve(req, res); - } - else { - for (let i = 0; i < evs.length; i++) { - evs[i].call(srv, req, res); - } - } - }); - } - /** - * Handles a request serving `/socket.io.js` - * - * @param {http.IncomingMessage} req - * @param {http.ServerResponse} res - */ - serve(req, res) { - // Per the standard, ETags must be quoted: - // https://tools.ietf.org/html/rfc7232#section-2.3 - const expectedEtag = '"' + clientVersion + '"'; - const etag = req.headers["if-none-match"]; - if (etag) { - if (expectedEtag == etag) { - debug("serve client 304"); - res.writeHead(304); - res.end(); - return; - } - } - debug("serve client source"); - res.setHeader("Cache-Control", "public, max-age=0"); - res.setHeader("Content-Type", "application/javascript"); - res.setHeader("ETag", expectedEtag); - res.writeHead(200); - res.end(clientSource); - } - /** - * Handles a request serving `/socket.io.js.map` - * - * @param {http.IncomingMessage} req - * @param {http.ServerResponse} res - */ - serveMap(req, res) { - // Per the standard, ETags must be quoted: - // https://tools.ietf.org/html/rfc7232#section-2.3 - const expectedEtag = '"' + clientVersion + '"'; - const etag = req.headers["if-none-match"]; - if (etag) { - if (expectedEtag == etag) { - debug("serve client 304"); - res.writeHead(304); - res.end(); - return; - } - } - debug("serve client sourcemap"); - res.setHeader("Content-Type", "application/json"); - res.setHeader("ETag", expectedEtag); - res.writeHead(200); - res.end(clientSourceMap); - } - /** - * Binds socket.io to an engine.io instance. - * - * @param {engine.Server} engine engine.io (or compatible) server - * @return {Server} self - */ - bind(engine) { - this.engine = engine; - this.engine.on("connection", this.onconnection.bind(this)); - return this; - } - /** - * Called with each incoming transport connection. - * - * @param {engine.Socket} conn - * @return {Server} self - */ - onconnection(conn) { - debug("incoming connection with id %s", conn.id); - new client_1.Client(this, conn); - return this; - } - /** - * Looks up a namespace. - * - * @param {String|RegExp|Function} name nsp name - * @param {Function} [fn] optional, nsp `connection` ev handler - */ - of(name, fn) { - if (typeof name === "function" || name instanceof RegExp) { - const parentNsp = new parent_namespace_1.ParentNamespace(this); - debug("initializing parent namespace %s", parentNsp.name); - if (typeof name === "function") { - this.parentNsps.set(name, parentNsp); - } - else { - this.parentNsps.set((nsp, conn, next) => next(null, name.test(nsp)), parentNsp); - } - if (fn) { - // @ts-ignore - parentNsp.on("connect", fn); - } - return parentNsp; - } - if (String(name)[0] !== "/") - name = "/" + name; - let nsp = this.nsps.get(name); - if (!nsp) { - debug("initializing namespace %s", name); - nsp = new namespace_1.Namespace(this, name); - this.nsps.set(name, nsp); - } - if (fn) - nsp.on("connect", fn); - return nsp; - } - /** - * Closes server connection - * - * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed - */ - close(fn) { - for (const socket of this.sockets.sockets.values()) { - socket.onclose("server shutting down"); - } - this.engine.close(); - if (this.httpServer) { - this.httpServer.close(fn); - } - else { - fn && fn(); - } - } - /** - * Sets up namespace middleware. - * - * @return {Server} self - * @public - */ - use(fn) { - this.sockets.use(fn); - return this; - } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Server} self - * @public - */ - to(name) { - this.sockets.to(name); - return this; - } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Server} self - * @public - */ - in(name) { - this.sockets.in(name); - return this; - } - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - send(...args) { - args.unshift("message"); - this.sockets.emit.apply(this.sockets, args); - return this; - } - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - write(...args) { - args.unshift("message"); - this.sockets.emit.apply(this.sockets, args); - return this; - } - /** - * Gets a list of socket ids. - */ - allSockets() { - return this.sockets.allSockets(); - } - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Server} self - */ - compress(compress) { - this.sockets.compress(compress); - return this; - } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Server} self - */ - binary(binary) { - this.sockets.binary(binary); - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Server} self - */ - get volatile() { - this.sockets.volatile; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Server} self - */ - get local() { - this.sockets.local; - return this; - } -} -exports.Server = Server; -/** - * Expose main namespace (/). - */ -const emitterMethods = Object.keys(events_1.EventEmitter.prototype).filter(function (key) { - return typeof events_1.EventEmitter.prototype[key] === "function"; -}); -emitterMethods.forEach(function (fn) { - Server.prototype[fn] = function () { - return this.sockets[fn].apply(this.sockets, arguments); - }; -}); -module.exports = (srv, opts) => new Server(srv, opts); -module.exports.Server = Server; diff --git a/dist/namespace.d.ts b/dist/namespace.d.ts deleted file mode 100644 index 35561c808b..0000000000 --- a/dist/namespace.d.ts +++ /dev/null @@ -1,128 +0,0 @@ -/// -import { Socket } from "./socket"; -import { Server } from "./index"; -import { EventEmitter } from "events"; -import { Adapter, Room, SocketId } from "socket.io-adapter"; -export declare class Namespace extends EventEmitter { - readonly name: string; - readonly connected: Map; - adapter: Adapter; - /** @package */ - readonly server: any; - /** @package */ - fns: Array<(socket: Socket, next: (err: Error) => void) => void>; - /** @package */ - rooms: Set; - /** @package */ - flags: any; - /** @package */ - ids: number; - /** @package */ - sockets: Map; - /** - * Namespace constructor. - * - * @param {Server} server instance - * @param {string} name - */ - constructor(server: Server, name: string); - /** - * Initializes the `Adapter` for this nsp. - * Run upon changing adapter by `Server#adapter` - * in addition to the constructor. - * - * @package - */ - initAdapter(): void; - /** - * Sets up namespace middleware. - * - * @return {Namespace} self - */ - use(fn: (socket: Socket, next: (err?: Error) => void) => void): Namespace; - /** - * Executes the middleware for an incoming client. - * - * @param {Socket} socket - the socket that will get added - * @param {Function} fn - last fn call in the middleware - */ - private run; - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - */ - to(name: Room): Namespace; - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - */ - in(name: Room): Namespace; - /** - * Adds a new client. - * - * @return {Socket} - */ - private add; - /** - * Removes a client. Called by each `Socket`. - * - * @package - */ - remove(socket: Socket): void; - /** - * Emits to all clients. - * - * @return {Namespace} self - */ - emit(ev: string, ...args: any[]): Namespace; - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - send(...args: any[]): Namespace; - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - write(...args: any[]): Namespace; - /** - * Gets a list of clients. - * - * @return {Namespace} self - */ - allSockets(): Promise>; - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Namespace} self - */ - compress(compress: boolean): Namespace; - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Namespace} self - */ - binary(binary: boolean): Namespace; - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Namespace} self - */ - get volatile(): Namespace; - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Namespace} self - */ - get local(): Namespace; -} diff --git a/dist/namespace.js b/dist/namespace.js deleted file mode 100644 index 7185862f7d..0000000000 --- a/dist/namespace.js +++ /dev/null @@ -1,254 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Namespace = void 0; -const socket_1 = require("./socket"); -const events_1 = require("events"); -const socket_io_parser_1 = require("socket.io-parser"); -const has_binary2_1 = __importDefault(require("has-binary2")); -const debug_1 = __importDefault(require("debug")); -const debug = debug_1.default("socket.io:namespace"); -class Namespace extends events_1.EventEmitter { - /** - * Namespace constructor. - * - * @param {Server} server instance - * @param {string} name - */ - constructor(server, name) { - super(); - this.connected = new Map(); - /** @package */ - this.fns = []; - /** @package */ - this.rooms = new Set(); - /** @package */ - this.flags = {}; - /** @package */ - this.ids = 0; - /** @package */ - this.sockets = new Map(); - this.server = server; - this.name = name; - this.initAdapter(); - } - /** - * Initializes the `Adapter` for this nsp. - * Run upon changing adapter by `Server#adapter` - * in addition to the constructor. - * - * @package - */ - initAdapter() { - this.adapter = new (this.server.adapter())(this); - } - /** - * Sets up namespace middleware. - * - * @return {Namespace} self - */ - use(fn) { - this.fns.push(fn); - return this; - } - /** - * Executes the middleware for an incoming client. - * - * @param {Socket} socket - the socket that will get added - * @param {Function} fn - last fn call in the middleware - */ - run(socket, fn) { - const fns = this.fns.slice(0); - if (!fns.length) - return fn(null); - function run(i) { - fns[i](socket, function (err) { - // upon error, short-circuit - if (err) - return fn(err); - // if no middleware left, summon callback - if (!fns[i + 1]) - return fn(null); - // go on to next - run(i + 1); - }); - } - run(0); - } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - */ - to(name) { - this.rooms.add(name); - return this; - } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - */ - in(name) { - this.rooms.add(name); - return this; - } - /** - * Adds a new client. - * - * @return {Socket} - */ - add(client, query, fn) { - debug("adding socket to nsp %s", this.name); - const socket = new socket_1.Socket(this, client, query); - this.run(socket, err => { - process.nextTick(() => { - if ("open" == client.conn.readyState) { - if (err) - return socket.error(err.message); - // track socket - this.sockets.set(socket.id, socket); - // it's paramount that the internal `onconnect` logic - // fires before user-set events to prevent state order - // violations (such as a disconnection before the connection - // logic is complete) - socket.onconnect(); - if (fn) - fn(); - // fire user-set events - super.emit("connect", socket); - super.emit("connection", socket); - } - else { - debug("next called after client was closed - ignoring socket"); - } - }); - }); - return socket; - } - /** - * Removes a client. Called by each `Socket`. - * - * @package - */ - remove(socket) { - if (this.sockets.has(socket.id)) { - this.sockets.delete(socket.id); - } - else { - debug("ignoring remove for %s", socket.id); - } - } - /** - * Emits to all clients. - * - * @return {Namespace} self - */ - // @ts-ignore - emit(ev, ...args) { - if (socket_1.RESERVED_EVENTS.has(ev)) { - throw new Error(`"${ev}" is a reserved event name`); - } - // set up packet object - args.unshift(ev); - const packet = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : has_binary2_1.default(args)) - ? socket_io_parser_1.PacketType.BINARY_EVENT - : socket_io_parser_1.PacketType.EVENT, - data: args - }; - if ("function" == typeof args[args.length - 1]) { - throw new Error("Callbacks are not supported when broadcasting"); - } - const rooms = new Set(this.rooms); - const flags = Object.assign({}, this.flags); - // reset flags - this.rooms.clear(); - this.flags = {}; - this.adapter.broadcast(packet, { - rooms: rooms, - flags: flags - }); - return this; - } - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - send(...args) { - args.unshift("message"); - this.emit.apply(this, args); - return this; - } - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - */ - write(...args) { - args.unshift("message"); - this.emit.apply(this, args); - return this; - } - /** - * Gets a list of clients. - * - * @return {Namespace} self - */ - allSockets() { - if (!this.adapter) { - throw new Error("No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?"); - } - const rooms = new Set(this.rooms); - this.rooms.clear(); - return this.adapter.sockets(rooms); - } - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Namespace} self - */ - compress(compress) { - this.flags.compress = compress; - return this; - } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Namespace} self - */ - binary(binary) { - this.flags.binary = binary; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Namespace} self - */ - get volatile() { - this.flags.volatile = true; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Namespace} self - */ - get local() { - this.flags.local = true; - return this; - } -} -exports.Namespace = Namespace; diff --git a/dist/parent-namespace.d.ts b/dist/parent-namespace.d.ts deleted file mode 100644 index 65f817f6bc..0000000000 --- a/dist/parent-namespace.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Namespace } from "./namespace"; -export declare class ParentNamespace extends Namespace { - private static count; - private children; - constructor(server: any); - initAdapter(): void; - emit(...args: any[]): Namespace; - createChild(name: any): Namespace; -} diff --git a/dist/parent-namespace.js b/dist/parent-namespace.js deleted file mode 100644 index 79e22348bb..0000000000 --- a/dist/parent-namespace.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ParentNamespace = void 0; -const namespace_1 = require("./namespace"); -class ParentNamespace extends namespace_1.Namespace { - constructor(server) { - super(server, "/_" + ParentNamespace.count++); - this.children = new Set(); - } - initAdapter() { } - emit(...args) { - this.children.forEach(nsp => { - nsp.rooms = this.rooms; - nsp.flags = this.flags; - nsp.emit.apply(nsp, args); - }); - this.rooms.clear(); - this.flags = {}; - return this; - } - createChild(name) { - const namespace = new namespace_1.Namespace(this.server, name); - namespace.fns = this.fns.slice(0); - this.listeners("connect").forEach(listener => - // @ts-ignore - namespace.on("connect", listener)); - this.listeners("connection").forEach(listener => - // @ts-ignore - namespace.on("connection", listener)); - this.children.add(namespace); - this.server.nsps.set(name, namespace); - return namespace; - } -} -exports.ParentNamespace = ParentNamespace; -ParentNamespace.count = 0; diff --git a/dist/socket.d.ts b/dist/socket.d.ts deleted file mode 100644 index b138833f9f..0000000000 --- a/dist/socket.d.ts +++ /dev/null @@ -1,258 +0,0 @@ -/// -import { EventEmitter } from "events"; -import { Client } from "./client"; -import { Namespace } from "./namespace"; -import { IncomingMessage } from "http"; -import { Room, SocketId } from "socket.io-adapter"; -export declare const RESERVED_EVENTS: Set; -/** - * The handshake details - */ -export interface Handshake { - /** - * The headers sent as part of the handshake - */ - headers: object; - /** - * The date of creation (as string) - */ - time: string; - /** - * The ip of the client - */ - address: string; - /** - * Whether the connection is cross-domain - */ - xdomain: boolean; - /** - * Whether the connection is secure - */ - secure: boolean; - /** - * The date of creation (as unix timestamp) - */ - issued: number; - /** - * The request URL string - */ - url: string; - /** - * The query object - */ - query: object; - /** - * The auth object - */ - auth: object; -} -export declare class Socket extends EventEmitter { - readonly nsp: Namespace; - readonly client: Client; - readonly id: SocketId; - readonly handshake: Handshake; - connected: boolean; - disconnected: boolean; - private readonly server; - private readonly adapter; - private acks; - private fns; - private flags; - private _rooms; - /** - * Interface to a `Client` for a given `Namespace`. - * - * @param {Namespace} nsp - * @param {Client} client - * @param {Object} auth - * @package - */ - constructor(nsp: Namespace, client: Client, auth: object); - /** - * Builds the `handshake` BC object - */ - private buildHandshake; - /** - * Emits to this client. - * - * @return {Socket} self - */ - emit(ev: string, ...args: any[]): this; - /** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - */ - to(name: Room): this; - /** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - */ - in(name: Room): Socket; - /** - * Sends a `message` event. - * - * @return {Socket} self - */ - send(...args: any[]): Socket; - /** - * Sends a `message` event. - * - * @return {Socket} self - */ - write(...args: any[]): Socket; - /** - * Writes a packet. - * - * @param {Object} packet - packet object - * @param {Object} opts - options - */ - private packet; - /** - * Joins a room. - * - * @param {String|Array} rooms - room or array of rooms - * @param {Function} fn - optional, callback - * @return {Socket} self - */ - join(rooms: Room | Array, fn?: (err: Error) => void): Socket; - /** - * Leaves a room. - * - * @param {String} room - * @param {Function} fn - optional, callback - * @return {Socket} self - */ - leave(room: string, fn?: (err: Error) => void): Socket; - /** - * Leave all rooms. - */ - private leaveAll; - /** - * Called by `Namespace` upon successful - * middleware execution (ie: authorization). - * Socket is added to namespace array before - * call to join, so adapters can access it. - * - * @package - */ - onconnect(): void; - /** - * Called with each packet. Called by `Client`. - * - * @param {Object} packet - * @package - */ - onpacket(packet: any): void; - /** - * Called upon event packet. - * - * @param {Object} packet - packet object - */ - private onevent; - /** - * Produces an ack callback to emit with an event. - * - * @param {Number} id - packet id - */ - private ack; - /** - * Called upon ack packet. - */ - private onack; - /** - * Called upon client disconnect packet. - */ - private ondisconnect; - /** - * Handles a client error. - * - * @package - */ - onerror(err: any): void; - /** - * Called upon closing. Called by `Client`. - * - * @param {String} reason - * @throw {Error} optional error object - * - * @package - */ - onclose(reason: string): this; - /** - * Produces an `error` packet. - * - * @param {Object} err - error object - * - * @package - */ - error(err: any): void; - /** - * Disconnects this client. - * - * @param {Boolean} close - if `true`, closes the underlying connection - * @return {Socket} self - */ - disconnect(close?: boolean): Socket; - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Socket} self - */ - compress(compress: boolean): Socket; - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - */ - binary(binary: boolean): Socket; - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Socket} self - */ - get volatile(): Socket; - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the - * sender. - * - * @return {Socket} self - */ - get broadcast(): Socket; - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Socket} self - */ - get local(): Socket; - /** - * Dispatch incoming event to socket listeners. - * - * @param {Array} event - event that will get emitted - */ - private dispatch; - /** - * Sets up socket middleware. - * - * @param {Function} fn - middleware function (event, next) - * @return {Socket} self - */ - use(fn: (event: Array, next: (err: Error) => void) => void): Socket; - /** - * Executes the middleware for an incoming event. - * - * @param {Array} event - event that will get emitted - * @param {Function} fn - last fn call in the middleware - */ - private run; - get request(): IncomingMessage; - get conn(): any; - get rooms(): Set; -} diff --git a/dist/socket.js b/dist/socket.js deleted file mode 100644 index a484cc55d6..0000000000 --- a/dist/socket.js +++ /dev/null @@ -1,467 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Socket = exports.RESERVED_EVENTS = void 0; -const events_1 = require("events"); -const socket_io_parser_1 = require("socket.io-parser"); -const has_binary2_1 = __importDefault(require("has-binary2")); -const url_1 = __importDefault(require("url")); -const debug_1 = __importDefault(require("debug")); -const base64id_1 = __importDefault(require("base64id")); -const debug = debug_1.default("socket.io:socket"); -exports.RESERVED_EVENTS = new Set([ - "error", - "connect", - "disconnect", - "disconnecting", - // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener - "newListener", - "removeListener" -]); -class Socket extends events_1.EventEmitter { - /** - * Interface to a `Client` for a given `Namespace`. - * - * @param {Namespace} nsp - * @param {Client} client - * @param {Object} auth - * @package - */ - constructor(nsp, client, auth) { - super(); - this.nsp = nsp; - this.client = client; - this.acks = new Map(); - this.fns = []; - this.flags = {}; - this._rooms = new Set(); - this.server = nsp.server; - this.adapter = this.nsp.adapter; - this.id = base64id_1.default.generateId(); // don't reuse the Engine.IO id because it's sensitive information - this.connected = true; - this.disconnected = false; - this.handshake = this.buildHandshake(auth); - } - /** - * Builds the `handshake` BC object - */ - buildHandshake(auth) { - return { - headers: this.request.headers, - time: new Date() + "", - address: this.conn.remoteAddress, - xdomain: !!this.request.headers.origin, - // @ts-ignore - secure: !!this.request.connection.encrypted, - issued: +new Date(), - url: this.request.url, - query: url_1.default.parse(this.request.url, true).query, - auth - }; - } - /** - * Emits to this client. - * - * @return {Socket} self - */ - // @ts-ignore - emit(ev, ...args) { - if (exports.RESERVED_EVENTS.has(ev)) { - throw new Error(`"${ev}" is a reserved event name`); - } - args.unshift(ev); - const packet = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : has_binary2_1.default(args)) - ? socket_io_parser_1.PacketType.BINARY_EVENT - : socket_io_parser_1.PacketType.EVENT, - data: args - }; - // access last argument to see if it's an ACK callback - if (typeof args[args.length - 1] === "function") { - if (this._rooms.size || this.flags.broadcast) { - throw new Error("Callbacks are not supported when broadcasting"); - } - debug("emitting packet with ack id %d", this.nsp.ids); - this.acks.set(this.nsp.ids, args.pop()); - packet.id = this.nsp.ids++; - } - const rooms = new Set(this._rooms); - const flags = Object.assign({}, this.flags); - // reset flags - this._rooms.clear(); - this.flags = {}; - if (rooms.size || flags.broadcast) { - this.adapter.broadcast(packet, { - except: new Set([this.id]), - rooms: rooms, - flags: flags - }); - } - else { - // dispatch packet - this.packet(packet, flags); - } - return this; - } - /** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - */ - to(name) { - this._rooms.add(name); - return this; - } - /** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - */ - in(name) { - this._rooms.add(name); - return this; - } - /** - * Sends a `message` event. - * - * @return {Socket} self - */ - send(...args) { - args.unshift("message"); - this.emit.apply(this, args); - return this; - } - /** - * Sends a `message` event. - * - * @return {Socket} self - */ - write(...args) { - args.unshift("message"); - this.emit.apply(this, args); - return this; - } - /** - * Writes a packet. - * - * @param {Object} packet - packet object - * @param {Object} opts - options - */ - packet(packet, opts = {}) { - packet.nsp = this.nsp.name; - opts.compress = false !== opts.compress; - this.client.packet(packet, opts); - } - /** - * Joins a room. - * - * @param {String|Array} rooms - room or array of rooms - * @param {Function} fn - optional, callback - * @return {Socket} self - */ - join(rooms, fn) { - debug("joining room %s", rooms); - this.adapter.addAll(this.id, new Set(Array.isArray(rooms) ? rooms : [rooms])); - debug("joined room %s", rooms); - fn && fn(null); - return this; - } - /** - * Leaves a room. - * - * @param {String} room - * @param {Function} fn - optional, callback - * @return {Socket} self - */ - leave(room, fn) { - debug("leave room %s", room); - this.adapter.del(this.id, room); - debug("left room %s", room); - fn && fn(null); - return this; - } - /** - * Leave all rooms. - */ - leaveAll() { - this.adapter.delAll(this.id); - } - /** - * Called by `Namespace` upon successful - * middleware execution (ie: authorization). - * Socket is added to namespace array before - * call to join, so adapters can access it. - * - * @package - */ - onconnect() { - debug("socket connected - writing packet"); - this.nsp.connected.set(this.id, this); - this.join(this.id); - this.packet({ type: socket_io_parser_1.PacketType.CONNECT, data: { sid: this.id } }); - } - /** - * Called with each packet. Called by `Client`. - * - * @param {Object} packet - * @package - */ - onpacket(packet) { - debug("got packet %j", packet); - switch (packet.type) { - case socket_io_parser_1.PacketType.EVENT: - this.onevent(packet); - break; - case socket_io_parser_1.PacketType.BINARY_EVENT: - this.onevent(packet); - break; - case socket_io_parser_1.PacketType.ACK: - this.onack(packet); - break; - case socket_io_parser_1.PacketType.BINARY_ACK: - this.onack(packet); - break; - case socket_io_parser_1.PacketType.DISCONNECT: - this.ondisconnect(); - break; - case socket_io_parser_1.PacketType.ERROR: - this.onerror(new Error(packet.data)); - } - } - /** - * Called upon event packet. - * - * @param {Object} packet - packet object - */ - onevent(packet) { - const args = packet.data || []; - debug("emitting event %j", args); - if (null != packet.id) { - debug("attaching ack callback to event"); - args.push(this.ack(packet.id)); - } - this.dispatch(args); - } - /** - * Produces an ack callback to emit with an event. - * - * @param {Number} id - packet id - */ - ack(id) { - const self = this; - let sent = false; - return function () { - // prevent double callbacks - if (sent) - return; - const args = Array.prototype.slice.call(arguments); - debug("sending ack %j", args); - self.packet({ - id: id, - type: has_binary2_1.default(args) ? socket_io_parser_1.PacketType.BINARY_ACK : socket_io_parser_1.PacketType.ACK, - data: args - }); - sent = true; - }; - } - /** - * Called upon ack packet. - */ - onack(packet) { - const ack = this.acks.get(packet.id); - if ("function" == typeof ack) { - debug("calling ack %s with %j", packet.id, packet.data); - ack.apply(this, packet.data); - this.acks.delete(packet.id); - } - else { - debug("bad ack %s", packet.id); - } - } - /** - * Called upon client disconnect packet. - */ - ondisconnect() { - debug("got disconnect packet"); - this.onclose("client namespace disconnect"); - } - /** - * Handles a client error. - * - * @package - */ - onerror(err) { - if (this.listeners("error").length) { - super.emit("error", err); - } - else { - console.error("Missing error handler on `socket`."); - console.error(err.stack); - } - } - /** - * Called upon closing. Called by `Client`. - * - * @param {String} reason - * @throw {Error} optional error object - * - * @package - */ - onclose(reason) { - if (!this.connected) - return this; - debug("closing socket - reason %s", reason); - super.emit("disconnecting", reason); - this.leaveAll(); - this.nsp.remove(this); - this.client.remove(this); - this.connected = false; - this.disconnected = true; - this.nsp.connected.delete(this.id); - super.emit("disconnect", reason); - } - /** - * Produces an `error` packet. - * - * @param {Object} err - error object - * - * @package - */ - error(err) { - this.packet({ type: socket_io_parser_1.PacketType.ERROR, data: err }); - } - /** - * Disconnects this client. - * - * @param {Boolean} close - if `true`, closes the underlying connection - * @return {Socket} self - */ - disconnect(close = false) { - if (!this.connected) - return this; - if (close) { - this.client.disconnect(); - } - else { - this.packet({ type: socket_io_parser_1.PacketType.DISCONNECT }); - this.onclose("server namespace disconnect"); - } - return this; - } - /** - * Sets the compress flag. - * - * @param {Boolean} compress - if `true`, compresses the sending data - * @return {Socket} self - */ - compress(compress) { - this.flags.compress = compress; - return this; - } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - */ - binary(binary) { - this.flags.binary = binary; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to - * receive messages (because of network slowness or other issues, or because they’re connected through long polling - * and is in the middle of a request-response cycle). - * - * @return {Socket} self - */ - get volatile() { - this.flags.volatile = true; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the - * sender. - * - * @return {Socket} self - */ - get broadcast() { - this.flags.broadcast = true; - return this; - } - /** - * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. - * - * @return {Socket} self - */ - get local() { - this.flags.local = true; - return this; - } - /** - * Dispatch incoming event to socket listeners. - * - * @param {Array} event - event that will get emitted - */ - dispatch(event) { - debug("dispatching an event %j", event); - this.run(event, err => { - process.nextTick(() => { - if (err) { - return this.error(err.message); - } - super.emit.apply(this, event); - }); - }); - } - /** - * Sets up socket middleware. - * - * @param {Function} fn - middleware function (event, next) - * @return {Socket} self - */ - use(fn) { - this.fns.push(fn); - return this; - } - /** - * Executes the middleware for an incoming event. - * - * @param {Array} event - event that will get emitted - * @param {Function} fn - last fn call in the middleware - */ - run(event, fn) { - const fns = this.fns.slice(0); - if (!fns.length) - return fn(null); - function run(i) { - fns[i](event, function (err) { - // upon error, short-circuit - if (err) - return fn(err); - // if no middleware left, summon callback - if (!fns[i + 1]) - return fn(null); - // go on to next - run(i + 1); - }); - } - run(0); - } - get request() { - return this.client.request; - } - get conn() { - return this.client.conn; - } - get rooms() { - return this.adapter.socketRooms(this.id) || new Set(); - } -} -exports.Socket = Socket; diff --git a/package.json b/package.json index 957d432886..d937a6891e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "2.3.0", + "version": "3.0.0-rc1", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -29,7 +29,8 @@ "scripts": { "test": "npm run format:check && tsc && nyc mocha --require ts-node/register --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.ts", "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.ts'", - "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'" + "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'", + "prepack": "tsc" }, "dependencies": { "base64id": "~2.0.0", @@ -37,8 +38,8 @@ "engine.io": "~4.0.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~2.0.1", - "socket.io-client": "github:socketio/socket.io-client#develop", - "socket.io-parser": "github:socketio/socket.io-parser#develop" + "socket.io-client": "3.0.0-rc1", + "socket.io-parser": "4.0.1-rc1" }, "devDependencies": { "@types/cookie": "^0.4.0", From 2d2a31e5c0cf640ea8eaf0022cc31f900b85afbb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 14 Oct 2020 01:53:37 +0200 Subject: [PATCH 343/494] chore: publish the wrapper.mjs file --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d937a6891e..16ffd70b3d 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "io" ], "files": [ - "dist/" + "dist/", + "./wrapper.mjs" ], "type": "commonjs", "main": "./dist/index.js", From 669592d120409a5cf00f128070dee6d22259ba4f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 10:45:56 +0200 Subject: [PATCH 344/494] feat: move binary detection back to the parser See https://github.com/socketio/socket.io-parser/commit/285e7cd0d837adfc911c999e7294788681226ae1 Breaking change: the Socket#binary() method is removed, as this use case is now covered by the ability to provide your own parser. --- lib/index.ts | 11 ----------- lib/namespace.ts | 18 +----------------- lib/socket.ts | 20 ++------------------ package.json | 3 +-- 4 files changed, 4 insertions(+), 48 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 10905a8dfb..bd101d211d 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -595,17 +595,6 @@ export class Server extends EventEmitter { return this; } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Server} self - */ - public binary(binary: boolean): Server { - this.sockets.binary(binary); - return this; - } - /** * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to * receive messages (because of network slowness or other issues, or because they’re connected through long polling diff --git a/lib/namespace.ts b/lib/namespace.ts index 8b099a000b..0512f8ba0b 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -3,7 +3,6 @@ import { Server } from "./index"; import { Client } from "./client"; import { EventEmitter } from "events"; import { PacketType } from "socket.io-parser"; -import hasBin from "has-binary2"; import debugModule from "debug"; import { Adapter, Room, SocketId } from "socket.io-adapter"; @@ -172,11 +171,7 @@ export class Namespace extends EventEmitter { // set up packet object args.unshift(ev); const packet = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : hasBin(args)) - ? PacketType.BINARY_EVENT - : PacketType.EVENT, + type: PacketType.EVENT, data: args }; @@ -248,17 +243,6 @@ export class Namespace extends EventEmitter { return this; } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Namespace} self - */ - public binary(binary: boolean): Namespace { - this.flags.binary = binary; - return this; - } - /** * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to * receive messages (because of network slowness or other issues, or because they’re connected through long polling diff --git a/lib/socket.ts b/lib/socket.ts index 0ddbd9eff6..092f12336f 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -1,6 +1,5 @@ import { EventEmitter } from "events"; import { PacketType } from "socket.io-parser"; -import hasBin from "has-binary2"; import url from "url"; import debugModule from "debug"; import { Server } from "./index"; @@ -136,11 +135,7 @@ export class Socket extends EventEmitter { } args.unshift(ev); const packet: any = { - type: (this.flags.binary !== undefined - ? this.flags.binary - : hasBin(args)) - ? PacketType.BINARY_EVENT - : PacketType.EVENT, + type: PacketType.EVENT, data: args }; @@ -356,7 +351,7 @@ export class Socket extends EventEmitter { self.packet({ id: id, - type: hasBin(args) ? PacketType.BINARY_ACK : PacketType.ACK, + type: PacketType.ACK, data: args }); @@ -460,17 +455,6 @@ export class Socket extends EventEmitter { return this; } - /** - * Sets the binary flag - * - * @param {Boolean} binary - encode as if it has binary data if `true`, Encode as if it doesnt have binary data if `false` - * @return {Socket} self - */ - public binary(binary: boolean): Socket { - this.flags.binary = binary; - return this; - } - /** * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to * receive messages (because of network slowness or other issues, or because they’re connected through long polling diff --git a/package.json b/package.json index 16ffd70b3d..9c377f5ad0 100644 --- a/package.json +++ b/package.json @@ -37,10 +37,9 @@ "base64id": "~2.0.0", "debug": "~4.1.0", "engine.io": "~4.0.0", - "has-binary2": "~1.0.2", "socket.io-adapter": "~2.0.1", "socket.io-client": "3.0.0-rc1", - "socket.io-parser": "4.0.1-rc1" + "socket.io-parser": "4.0.1-rc2" }, "devDependencies": { "@types/cookie": "^0.4.0", From 58b66f8089379632443b9968ff758d8bc40498b8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 11:12:21 +0200 Subject: [PATCH 345/494] refactor: hide internal methods and properties There is no concept of package-private methods in TypeScript, so we'll just prefix them with "_" and mark them as private in the JSDoc. --- lib/client.ts | 48 +++++++++++++++-------- lib/index.ts | 58 +++++++++++++++++++-------- lib/namespace.ts | 87 ++++++++++++++++++++++++----------------- lib/parent-namespace.ts | 14 +++---- lib/socket.ts | 82 ++++++++++++++++++++++++++++---------- test/socket.io.ts | 12 +++--- 6 files changed, 198 insertions(+), 103 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index 6157559d94..fe69aa2ec1 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -9,9 +9,8 @@ const debug = debugModule("socket.io:client"); export class Client { public readonly conn; - /** @package */ - public readonly id: string; + private readonly id: string; private readonly server; private readonly encoder: Encoder; private readonly decoder: Decoder; @@ -29,13 +28,15 @@ export class Client { this.server = server; this.conn = conn; this.encoder = server.encoder; - this.decoder = new server.parser.Decoder(); + this.decoder = new server._parser.Decoder(); this.id = conn.id; this.setup(); } /** * @return the reference to the request that originated the Engine.IO connection + * + * @public */ public get request(): IncomingMessage { return this.conn.request; @@ -43,6 +44,8 @@ export class Client { /** * Sets up event listeners. + * + * @private */ private setup() { this.onclose = this.onclose.bind(this); @@ -62,21 +65,21 @@ export class Client { * * @param {String} name - the namespace * @param {Object} auth - the auth parameters - * @package + * @private */ - public connect(name: string, auth: object = {}) { - if (this.server.nsps.has(name)) { + private connect(name: string, auth: object = {}) { + if (this.server._nsps.has(name)) { debug("connecting to namespace %s", name); return this.doConnect(name, auth); } - this.server.checkNamespace(name, auth, dynamicNsp => { + this.server._checkNamespace(name, auth, dynamicNsp => { if (dynamicNsp) { debug("dynamic namespace %s was created", dynamicNsp.name); this.doConnect(name, auth); } else { debug("creation of namespace %s was denied", name); - this.packet({ + this._packet({ type: PacketType.ERROR, nsp: name, data: "Invalid namespace" @@ -90,6 +93,8 @@ export class Client { * * @param {String} name - the namespace * @param {Object} auth - the auth parameters + * + * @private */ private doConnect(name: string, auth: object) { const nsp = this.server.of(name); @@ -103,9 +108,9 @@ export class Client { /** * Disconnects from all namespaces and closes transport. * - * @package + * @private */ - public disconnect() { + _disconnect() { for (const socket of this.sockets.values()) { socket.disconnect(); } @@ -116,9 +121,9 @@ export class Client { /** * Removes a socket. Called by each `Socket`. * - * @package + * @private */ - public remove(socket: Socket) { + _remove(socket: Socket) { if (this.sockets.has(socket.id)) { const nsp = this.sockets.get(socket.id).nsp.name; this.sockets.delete(socket.id); @@ -130,6 +135,8 @@ export class Client { /** * Closes the underlying connection. + * + * @private */ private close() { if ("open" == this.conn.readyState) { @@ -144,9 +151,9 @@ export class Client { * * @param {Object} packet object * @param {Object} opts - * @package + * @private */ - public packet(packet, opts?) { + _packet(packet, opts?) { opts = opts || {}; const self = this; @@ -174,6 +181,8 @@ export class Client { /** * Called with incoming transport data. + * + * @private */ private ondata(data) { // try/catch is needed for protocol violations (GH-1880) @@ -186,6 +195,8 @@ export class Client { /** * Called when parser fully decodes a packet. + * + * @private */ private ondecoded(packet: Packet) { if (PacketType.CONNECT == packet.type) { @@ -194,7 +205,7 @@ export class Client { const socket = this.nsps.get(packet.nsp); if (socket) { process.nextTick(function() { - socket.onpacket(packet); + socket._onpacket(packet); }); } else { debug("no socket for namespace %s", packet.nsp); @@ -206,10 +217,11 @@ export class Client { * Handles an error. * * @param {Object} err object + * @private */ private onerror(err) { for (const socket of this.sockets.values()) { - socket.onerror(err); + socket._onerror(err); } this.conn.close(); } @@ -218,6 +230,7 @@ export class Client { * Called upon transport close. * * @param reason + * @private */ private onclose(reason: string) { debug("client close with reason %s", reason); @@ -227,7 +240,7 @@ export class Client { // `nsps` and `sockets` are cleaned up seamlessly for (const socket of this.sockets.values()) { - socket.onclose(reason); + socket._onclose(reason); } this.sockets.clear(); @@ -236,6 +249,7 @@ export class Client { /** * Cleans up event listeners. + * @private */ private destroy() { this.conn.removeListener("data", this.ondata); diff --git a/lib/index.ts b/lib/index.ts index bd101d211d..1c8e30d6d5 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -130,12 +130,15 @@ interface ServerOptions extends EngineAttachOptions { export class Server extends EventEmitter { public readonly sockets: Namespace; - /** @package */ - public readonly parser; - /** @package */ - public readonly encoder: Encoder; + /** @private */ + readonly _parser; + /** @private */ + readonly encoder: Encoder; - public nsps: Map = new Map(); + /** + * @private + */ + _nsps: Map = new Map(); private parentNsps: Map< | string | RegExp @@ -158,6 +161,7 @@ export class Server extends EventEmitter { * * @param {http.Server|Number|Object} srv http server, port or options * @param {Object} [opts] + * @public */ constructor(opts?: Partial); constructor(srv: http.Server, opts?: Partial); @@ -170,8 +174,8 @@ export class Server extends EventEmitter { } this.path(opts.path || "/socket.io"); this.serveClient(false !== opts.serveClient); - this.parser = opts.parser || parser; - this.encoder = new this.parser.Encoder(); + this._parser = opts.parser || parser; + this.encoder = new this._parser.Encoder(); this.adapter(opts.adapter || Adapter); this.sockets = this.of("/"); if (srv) this.attach(srv, opts); @@ -182,6 +186,7 @@ export class Server extends EventEmitter { * * @param {Boolean} v - whether to serve client code * @return {Server|Boolean} self when setting or value when getting + * @public */ public serveClient(v?: boolean) { if (!arguments.length) return this._serveClient; @@ -217,9 +222,9 @@ export class Server extends EventEmitter { * @param {Object} auth - the auth parameters * @param {Function} fn - callback * - * @package + * @private */ - public checkNamespace( + _checkNamespace( name: string, auth: object, fn: (nsp: Namespace | boolean) => void @@ -250,6 +255,7 @@ export class Server extends EventEmitter { * * @param {String} v pathname * @return {Server|String} self when setting or value when getting + * @public */ public path(v?: string) { if (!arguments.length) return this._path; @@ -262,12 +268,13 @@ export class Server extends EventEmitter { * * @param {Adapter} v pathname * @return {Server|Adapter} self when setting or value when getting + * @public */ public adapter(v) { if (!arguments.length) return this._adapter; this._adapter = v; - for (const nsp of this.nsps.values()) { - nsp.initAdapter(); + for (const nsp of this._nsps.values()) { + nsp._initAdapter(); } return this; } @@ -278,6 +285,7 @@ export class Server extends EventEmitter { * @param {http.Server|Number} srv - server or port * @param {Object} opts - options passed to engine.io * @return {Server} self + * @public */ public listen(srv: http.Server, opts?: Partial): Server; public listen(srv: number, opts?: Partial): Server; @@ -291,6 +299,7 @@ export class Server extends EventEmitter { * @param {http.Server|Number} srv - server or port * @param {Object} opts - options passed to engine.io * @return {Server} self + * @public */ public attach(srv: http.Server, opts?: Partial): Server; public attach(port: number, opts?: Partial): Server; @@ -330,6 +339,7 @@ export class Server extends EventEmitter { * * @param srv - the server to attach to * @param opts - options passed to engine.io + * @private */ private initEngine(srv: http.Server, opts: Partial) { // initialize engine @@ -350,6 +360,7 @@ export class Server extends EventEmitter { * Attaches the static file serving. * * @param {Function|http.Server} srv http server + * @private */ private attachServe(srv) { debug("attaching client serving req handler"); @@ -376,6 +387,7 @@ export class Server extends EventEmitter { * * @param {http.IncomingMessage} req * @param {http.ServerResponse} res + * @private */ private serve(req: http.IncomingMessage, res: http.ServerResponse) { // Per the standard, ETags must be quoted: @@ -405,6 +417,7 @@ export class Server extends EventEmitter { * * @param {http.IncomingMessage} req * @param {http.ServerResponse} res + * @private */ private serveMap(req: http.IncomingMessage, res: http.ServerResponse) { // Per the standard, ETags must be quoted: @@ -433,6 +446,7 @@ export class Server extends EventEmitter { * * @param {engine.Server} engine engine.io (or compatible) server * @return {Server} self + * @public */ public bind(engine): Server { this.engine = engine; @@ -445,6 +459,7 @@ export class Server extends EventEmitter { * * @param {engine.Socket} conn * @return {Server} self + * @private */ private onconnection(conn): Server { debug("incoming connection with id %s", conn.id); @@ -457,6 +472,7 @@ export class Server extends EventEmitter { * * @param {String|RegExp|Function} name nsp name * @param {Function} [fn] optional, nsp `connection` ev handler + * @public */ public of( name: @@ -489,11 +505,11 @@ export class Server extends EventEmitter { if (String(name)[0] !== "/") name = "/" + name; - let nsp = this.nsps.get(name); + let nsp = this._nsps.get(name); if (!nsp) { debug("initializing namespace %s", name); nsp = new Namespace(this, name); - this.nsps.set(name, nsp); + this._nsps.set(name, nsp); } if (fn) nsp.on("connect", fn); return nsp; @@ -503,10 +519,11 @@ export class Server extends EventEmitter { * Closes server connection * * @param {Function} [fn] optional, called as `fn([err])` on error OR all conns closed + * @public */ public close(fn?: (err?: Error) => void): void { - for (const socket of this.sockets.sockets.values()) { - socket.onclose("server shutting down"); + for (const socket of this.sockets._sockets.values()) { + socket._onclose("server shutting down"); } this.engine.close(); @@ -558,7 +575,8 @@ export class Server extends EventEmitter { /** * Sends a `message` event to all clients. * - * @return {Namespace} self + * @return {Server} self + * @public */ public send(...args): Server { args.unshift("message"); @@ -569,7 +587,8 @@ export class Server extends EventEmitter { /** * Sends a `message` event to all clients. * - * @return {Namespace} self + * @return {Server} self + * @public */ public write(...args): Server { args.unshift("message"); @@ -579,6 +598,8 @@ export class Server extends EventEmitter { /** * Gets a list of socket ids. + * + * @public */ public allSockets(): Promise> { return this.sockets.allSockets(); @@ -589,6 +610,7 @@ export class Server extends EventEmitter { * * @param {Boolean} compress - if `true`, compresses the sending data * @return {Server} self + * @public */ public compress(compress: boolean): Server { this.sockets.compress(compress); @@ -601,6 +623,7 @@ export class Server extends EventEmitter { * and is in the middle of a request-response cycle). * * @return {Server} self + * @public */ public get volatile(): Server { this.sockets.volatile; @@ -611,6 +634,7 @@ export class Server extends EventEmitter { * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. * * @return {Server} self + * @public */ public get local(): Server { this.sockets.local; diff --git a/lib/namespace.ts b/lib/namespace.ts index 0512f8ba0b..5290e53917 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -14,18 +14,23 @@ export class Namespace extends EventEmitter { public adapter: Adapter; - /** @package */ - public readonly server; - /** @package */ - public fns: Array<(socket: Socket, next: (err: Error) => void) => void> = []; - /** @package */ - public rooms: Set = new Set(); - /** @package */ - public flags: any = {}; - /** @package */ - public ids: number = 0; - /** @package */ - public sockets: Map = new Map(); + /** @private */ + readonly server; + + /** @private */ + _fns: Array<(socket: Socket, next: (err: Error) => void) => void> = []; + + /** @private */ + _rooms: Set = new Set(); + + /** @private */ + _flags: any = {}; + + /** @private */ + _ids: number = 0; + + /** @private */ + _sockets: Map = new Map(); /** * Namespace constructor. @@ -37,7 +42,7 @@ export class Namespace extends EventEmitter { super(); this.server = server; this.name = name; - this.initAdapter(); + this._initAdapter(); } /** @@ -45,9 +50,9 @@ export class Namespace extends EventEmitter { * Run upon changing adapter by `Server#adapter` * in addition to the constructor. * - * @package + * @private */ - public initAdapter(): void { + _initAdapter(): void { this.adapter = new (this.server.adapter())(this); } @@ -55,11 +60,12 @@ export class Namespace extends EventEmitter { * Sets up namespace middleware. * * @return {Namespace} self + * @public */ public use( fn: (socket: Socket, next: (err?: Error) => void) => void ): Namespace { - this.fns.push(fn); + this._fns.push(fn); return this; } @@ -68,9 +74,10 @@ export class Namespace extends EventEmitter { * * @param {Socket} socket - the socket that will get added * @param {Function} fn - last fn call in the middleware + * @private */ private run(socket: Socket, fn: (err: Error) => void) { - const fns = this.fns.slice(0); + const fns = this._fns.slice(0); if (!fns.length) return fn(null); function run(i) { @@ -94,9 +101,10 @@ export class Namespace extends EventEmitter { * * @param {String} name * @return {Namespace} self + * @public */ public to(name: Room): Namespace { - this.rooms.add(name); + this._rooms.add(name); return this; } @@ -105,9 +113,10 @@ export class Namespace extends EventEmitter { * * @param {String} name * @return {Namespace} self + * @public */ public in(name: Room): Namespace { - this.rooms.add(name); + this._rooms.add(name); return this; } @@ -115,6 +124,7 @@ export class Namespace extends EventEmitter { * Adds a new client. * * @return {Socket} + * @private */ private add(client: Client, query, fn?: () => void): Socket { debug("adding socket to nsp %s", this.name); @@ -122,16 +132,16 @@ export class Namespace extends EventEmitter { this.run(socket, err => { process.nextTick(() => { if ("open" == client.conn.readyState) { - if (err) return socket.error(err.message); + if (err) return socket._error(err.message); // track socket - this.sockets.set(socket.id, socket); + this._sockets.set(socket.id, socket); // it's paramount that the internal `onconnect` logic // fires before user-set events to prevent state order // violations (such as a disconnection before the connection // logic is complete) - socket.onconnect(); + socket._onconnect(); if (fn) fn(); // fire user-set events @@ -148,11 +158,11 @@ export class Namespace extends EventEmitter { /** * Removes a client. Called by each `Socket`. * - * @package + * @private */ - public remove(socket: Socket): void { - if (this.sockets.has(socket.id)) { - this.sockets.delete(socket.id); + _remove(socket: Socket): void { + if (this._sockets.has(socket.id)) { + this._sockets.delete(socket.id); } else { debug("ignoring remove for %s", socket.id); } @@ -162,6 +172,7 @@ export class Namespace extends EventEmitter { * Emits to all clients. * * @return {Namespace} self + * @public */ // @ts-ignore public emit(ev: string, ...args: any[]): Namespace { @@ -179,12 +190,12 @@ export class Namespace extends EventEmitter { throw new Error("Callbacks are not supported when broadcasting"); } - const rooms = new Set(this.rooms); - const flags = Object.assign({}, this.flags); + const rooms = new Set(this._rooms); + const flags = Object.assign({}, this._flags); // reset flags - this.rooms.clear(); - this.flags = {}; + this._rooms.clear(); + this._flags = {}; this.adapter.broadcast(packet, { rooms: rooms, @@ -198,6 +209,7 @@ export class Namespace extends EventEmitter { * Sends a `message` event to all clients. * * @return {Namespace} self + * @public */ public send(...args): Namespace { args.unshift("message"); @@ -209,6 +221,7 @@ export class Namespace extends EventEmitter { * Sends a `message` event to all clients. * * @return {Namespace} self + * @public */ public write(...args): Namespace { args.unshift("message"); @@ -220,6 +233,7 @@ export class Namespace extends EventEmitter { * Gets a list of clients. * * @return {Namespace} self + * @public */ public allSockets(): Promise> { if (!this.adapter) { @@ -227,8 +241,8 @@ export class Namespace extends EventEmitter { "No adapter for this namespace, are you trying to get the list of clients of a dynamic namespace?" ); } - const rooms = new Set(this.rooms); - this.rooms.clear(); + const rooms = new Set(this._rooms); + this._rooms.clear(); return this.adapter.sockets(rooms); } @@ -237,9 +251,10 @@ export class Namespace extends EventEmitter { * * @param {Boolean} compress - if `true`, compresses the sending data * @return {Namespace} self + * @public */ public compress(compress: boolean): Namespace { - this.flags.compress = compress; + this._flags.compress = compress; return this; } @@ -249,9 +264,10 @@ export class Namespace extends EventEmitter { * and is in the middle of a request-response cycle). * * @return {Namespace} self + * @public */ public get volatile(): Namespace { - this.flags.volatile = true; + this._flags.volatile = true; return this; } @@ -259,9 +275,10 @@ export class Namespace extends EventEmitter { * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. * * @return {Namespace} self + * @public */ public get local(): Namespace { - this.flags.local = true; + this._flags.local = true; return this; } } diff --git a/lib/parent-namespace.ts b/lib/parent-namespace.ts index e6a0dfac64..b447b934eb 100644 --- a/lib/parent-namespace.ts +++ b/lib/parent-namespace.ts @@ -8,23 +8,23 @@ export class ParentNamespace extends Namespace { super(server, "/_" + ParentNamespace.count++); } - initAdapter() {} + _initAdapter() {} public emit(...args): Namespace { this.children.forEach(nsp => { - nsp.rooms = this.rooms; - nsp.flags = this.flags; + nsp._rooms = this._rooms; + nsp._flags = this._flags; nsp.emit.apply(nsp, args); }); - this.rooms.clear(); - this.flags = {}; + this._rooms.clear(); + this._flags = {}; return this; } createChild(name) { const namespace = new Namespace(this.server, name); - namespace.fns = this.fns.slice(0); + namespace._fns = this._fns.slice(0); this.listeners("connect").forEach(listener => // @ts-ignore namespace.on("connect", listener) @@ -34,7 +34,7 @@ export class ParentNamespace extends Namespace { namespace.on("connection", listener) ); this.children.add(namespace); - this.server.nsps.set(name, namespace); + this.server._nsps.set(name, namespace); return namespace; } } diff --git a/lib/socket.ts b/lib/socket.ts index 092f12336f..b9d98557d7 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -107,6 +107,8 @@ export class Socket extends EventEmitter { /** * Builds the `handshake` BC object + * + * @private */ private buildHandshake(auth: object): Handshake { return { @@ -127,6 +129,7 @@ export class Socket extends EventEmitter { * Emits to this client. * * @return {Socket} self + * @public */ // @ts-ignore public emit(ev: string, ...args: any[]) { @@ -145,9 +148,9 @@ export class Socket extends EventEmitter { throw new Error("Callbacks are not supported when broadcasting"); } - debug("emitting packet with ack id %d", this.nsp.ids); - this.acks.set(this.nsp.ids, args.pop()); - packet.id = this.nsp.ids++; + debug("emitting packet with ack id %d", this.nsp._ids); + this.acks.set(this.nsp._ids, args.pop()); + packet.id = this.nsp._ids++; } const rooms = new Set(this._rooms); @@ -175,6 +178,7 @@ export class Socket extends EventEmitter { * * @param {String} name * @return {Socket} self + * @public */ public to(name: Room) { this._rooms.add(name); @@ -186,6 +190,7 @@ export class Socket extends EventEmitter { * * @param {String} name * @return {Socket} self + * @public */ public in(name: Room): Socket { this._rooms.add(name); @@ -196,6 +201,7 @@ export class Socket extends EventEmitter { * Sends a `message` event. * * @return {Socket} self + * @public */ public send(...args): Socket { args.unshift("message"); @@ -207,6 +213,7 @@ export class Socket extends EventEmitter { * Sends a `message` event. * * @return {Socket} self + * @public */ public write(...args): Socket { args.unshift("message"); @@ -219,11 +226,12 @@ export class Socket extends EventEmitter { * * @param {Object} packet - packet object * @param {Object} opts - options + * @private */ private packet(packet, opts: any = {}) { packet.nsp = this.nsp.name; opts.compress = false !== opts.compress; - this.client.packet(packet, opts); + this.client._packet(packet, opts); } /** @@ -232,6 +240,7 @@ export class Socket extends EventEmitter { * @param {String|Array} rooms - room or array of rooms * @param {Function} fn - optional, callback * @return {Socket} self + * @public */ public join(rooms: Room | Array, fn?: (err: Error) => void): Socket { debug("joining room %s", rooms); @@ -251,6 +260,7 @@ export class Socket extends EventEmitter { * @param {String} room * @param {Function} fn - optional, callback * @return {Socket} self + * @public */ public leave(room: string, fn?: (err: Error) => void): Socket { debug("leave room %s", room); @@ -264,6 +274,8 @@ export class Socket extends EventEmitter { /** * Leave all rooms. + * + * @private */ private leaveAll(): void { this.adapter.delAll(this.id); @@ -275,9 +287,9 @@ export class Socket extends EventEmitter { * Socket is added to namespace array before * call to join, so adapters can access it. * - * @package + * @private */ - public onconnect(): void { + _onconnect(): void { debug("socket connected - writing packet"); this.nsp.connected.set(this.id, this); this.join(this.id); @@ -288,9 +300,9 @@ export class Socket extends EventEmitter { * Called with each packet. Called by `Client`. * * @param {Object} packet - * @package + * @private */ - public onpacket(packet) { + _onpacket(packet) { debug("got packet %j", packet); switch (packet.type) { case PacketType.EVENT: @@ -314,7 +326,7 @@ export class Socket extends EventEmitter { break; case PacketType.ERROR: - this.onerror(new Error(packet.data)); + this._onerror(new Error(packet.data)); } } @@ -322,6 +334,7 @@ export class Socket extends EventEmitter { * Called upon event packet. * * @param {Object} packet - packet object + * @private */ private onevent(packet): void { const args = packet.data || []; @@ -339,6 +352,7 @@ export class Socket extends EventEmitter { * Produces an ack callback to emit with an event. * * @param {Number} id - packet id + * @private */ private ack(id: number) { const self = this; @@ -361,6 +375,8 @@ export class Socket extends EventEmitter { /** * Called upon ack packet. + * + * @private */ private onack(packet): void { const ack = this.acks.get(packet.id); @@ -375,18 +391,20 @@ export class Socket extends EventEmitter { /** * Called upon client disconnect packet. + * + * @private */ private ondisconnect(): void { debug("got disconnect packet"); - this.onclose("client namespace disconnect"); + this._onclose("client namespace disconnect"); } /** * Handles a client error. * - * @package + * @private */ - public onerror(err): void { + _onerror(err): void { if (this.listeners("error").length) { super.emit("error", err); } else { @@ -401,15 +419,15 @@ export class Socket extends EventEmitter { * @param {String} reason * @throw {Error} optional error object * - * @package + * @private */ - public onclose(reason: string) { + _onclose(reason: string) { if (!this.connected) return this; debug("closing socket - reason %s", reason); super.emit("disconnecting", reason); this.leaveAll(); - this.nsp.remove(this); - this.client.remove(this); + this.nsp._remove(this); + this.client._remove(this); this.connected = false; this.disconnected = true; this.nsp.connected.delete(this.id); @@ -421,9 +439,9 @@ export class Socket extends EventEmitter { * * @param {Object} err - error object * - * @package + * @private */ - public error(err) { + _error(err) { this.packet({ type: PacketType.ERROR, data: err }); } @@ -432,14 +450,16 @@ export class Socket extends EventEmitter { * * @param {Boolean} close - if `true`, closes the underlying connection * @return {Socket} self + * + * @public */ public disconnect(close = false): Socket { if (!this.connected) return this; if (close) { - this.client.disconnect(); + this.client._disconnect(); } else { this.packet({ type: PacketType.DISCONNECT }); - this.onclose("server namespace disconnect"); + this._onclose("server namespace disconnect"); } return this; } @@ -449,6 +469,7 @@ export class Socket extends EventEmitter { * * @param {Boolean} compress - if `true`, compresses the sending data * @return {Socket} self + * @public */ public compress(compress: boolean): Socket { this.flags.compress = compress; @@ -461,6 +482,7 @@ export class Socket extends EventEmitter { * and is in the middle of a request-response cycle). * * @return {Socket} self + * @public */ public get volatile(): Socket { this.flags.volatile = true; @@ -472,6 +494,7 @@ export class Socket extends EventEmitter { * sender. * * @return {Socket} self + * @public */ public get broadcast(): Socket { this.flags.broadcast = true; @@ -482,6 +505,7 @@ export class Socket extends EventEmitter { * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node. * * @return {Socket} self + * @public */ public get local(): Socket { this.flags.local = true; @@ -492,13 +516,14 @@ export class Socket extends EventEmitter { * Dispatch incoming event to socket listeners. * * @param {Array} event - event that will get emitted + * @private */ private dispatch(event: Array): void { debug("dispatching an event %j", event); this.run(event, err => { process.nextTick(() => { if (err) { - return this.error(err.message); + return this._error(err.message); } super.emit.apply(this, event); }); @@ -510,6 +535,7 @@ export class Socket extends EventEmitter { * * @param {Function} fn - middleware function (event, next) * @return {Socket} self + * @public */ public use( fn: (event: Array, next: (err: Error) => void) => void @@ -523,6 +549,7 @@ export class Socket extends EventEmitter { * * @param {Array} event - event that will get emitted * @param {Function} fn - last fn call in the middleware + * @private */ private run(event: Array, fn: (err: Error) => void) { const fns = this.fns.slice(0); @@ -544,14 +571,27 @@ export class Socket extends EventEmitter { run(0); } + /** + * A reference to the request that originated the underlying Engine.IO Socket. + * + * @public + */ public get request(): IncomingMessage { return this.client.request; } + /** + * A reference to the underlying Client transport connection (Engine.IO Socket object). + * + * @public + */ public get conn() { return this.client.conn; } + /** + * @public + */ public get rooms(): Set { return this.adapter.socketRooms(this.id) || new Set(); } diff --git a/test/socket.io.ts b/test/socket.io.ts index 8c74b2fb02..9a75772ef0 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -216,12 +216,12 @@ describe("socket.io", () => { const clientSocket = client(srv, { reconnection: false }); clientSocket.on("disconnect", () => { - expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); + expect(Object.keys(sio._nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); clientSocket.on("connect", () => { - expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); + expect(Object.keys(sio._nsps["/"].sockets).length).to.equal(1); sio.close(); }); @@ -242,12 +242,12 @@ describe("socket.io", () => { const clientSocket = ioc("ws://0.0.0.0:" + PORT, { reconnection: false }); clientSocket.on("disconnect", () => { - expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(0); + expect(Object.keys(sio._nsps["/"].sockets).length).to.equal(0); server.listen(PORT); }); clientSocket.on("connect", () => { - expect(Object.keys(sio.nsps["/"].sockets).length).to.equal(1); + expect(Object.keys(sio._nsps["/"].sockets).length).to.equal(1); sio.close(); }); @@ -297,8 +297,8 @@ describe("socket.io", () => { expect(sio.compress).to.be.a("function"); expect(sio.volatile).to.be(sio); expect(sio.local).to.be(sio); - expect(sio.sockets.flags).to.eql({ volatile: true, local: true }); - delete sio.sockets.flags; + expect(sio.sockets._flags).to.eql({ volatile: true, local: true }); + delete sio.sockets._flags; }); it("should automatically connect", done => { From 91cd255ba76ff6a780c62740f9f5cd3a76f5d7c7 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 11:42:06 +0200 Subject: [PATCH 346/494] fix: close clients with no namespace After a given timeout, a client that did not join any namespace will be closed in order to prevent malicious clients from using the server resources. The timeout defaults to 45 seconds, in order not to interfere with the Engine.IO heartbeat mechanism (30 seconds). --- lib/client.ts | 14 ++++++++++ lib/index.ts | 68 ++++++++++++++++++++++++++++++++++++----------- test/socket.io.ts | 19 +++++++++++++ 3 files changed, 85 insertions(+), 16 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index fe69aa2ec1..712d9f0013 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -16,6 +16,7 @@ export class Client { private readonly decoder: Decoder; private sockets: Map = new Map(); private nsps: Map = new Map(); + private connectTimeout: NodeJS.Timeout; /** * Client constructor. @@ -58,6 +59,15 @@ export class Client { this.conn.on("data", this.ondata); this.conn.on("error", this.onerror); this.conn.on("close", this.onclose); + + this.connectTimeout = setTimeout(() => { + if (this.nsps.size === 0) { + debug("no namespace joined yet, close the client"); + this.close(); + } else { + debug("the client has already joined a namespace, nothing to do"); + } + }, this.server._connectTimeout); } /** @@ -97,6 +107,10 @@ export class Client { * @private */ private doConnect(name: string, auth: object) { + if (this.connectTimeout) { + clearTimeout(this.connectTimeout); + this.connectTimeout = null; + } const nsp = this.server.of(name); const socket = nsp.add(this, auth, () => { diff --git a/lib/index.ts b/lib/index.ts index 1c8e30d6d5..91fc2ad03a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -29,19 +29,23 @@ type Transport = "polling" | "websocket"; interface EngineOptions { /** - * how many ms without a pong packet to consider the connection closed (5000) + * how many ms without a pong packet to consider the connection closed + * @default 5000 */ pingTimeout: number; /** - * how many ms before sending a new ping packet (25000) + * how many ms before sending a new ping packet + * @default 25000 */ pingInterval: number; /** - * how many ms before an uncompleted transport upgrade is cancelled (10000) + * how many ms before an uncompleted transport upgrade is cancelled + * @default 10000 */ upgradeTimeout: number; /** - * how many bytes or characters a message can be, before closing the session (to avoid DoS). Default value is 1E5. + * how many bytes or characters a message can be, before closing the session (to avoid DoS). + * @default 1e5 (100 KB) */ maxHttpBufferSize: number; /** @@ -55,19 +59,23 @@ interface EngineOptions { fn: (err: string | null | undefined, success: boolean) => void ) => void; /** - * to allow connections to (['polling', 'websocket']) + * the low-level transports that are enabled + * @default ["polling", "websocket"] */ transports: Transport[]; /** - * whether to allow transport upgrades (true) + * whether to allow transport upgrades + * @default true */ allowUpgrades: boolean; /** - * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. (false) + * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. + * @default false */ perMessageDeflate: boolean | object; /** - * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. (true) + * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. + * @default true */ httpCompression: boolean | object; /** @@ -82,7 +90,8 @@ interface EngineOptions { initialPacket: any; /** * configuration of the cookie that contains the client sid to send as part of handshake response headers. This cookie - * might be used for sticky-session. Defaults to not sending any cookie (false) + * might be used for sticky-session. Defaults to not sending any cookie. + * @default false */ cookie: CookieSerializeOptions | boolean; /** @@ -93,15 +102,18 @@ interface EngineOptions { interface AttachOptions { /** - * name of the path to capture (/engine.io). + * name of the path to capture + * @default "/engine.io" */ path: string; /** - * destroy unhandled upgrade requests (true) + * destroy unhandled upgrade requests + * @default true */ destroyUpgrade: boolean; /** - * milliseconds after which unhandled requests are ended (1000) + * milliseconds after which unhandled requests are ended + * @default 1000 */ destroyUpgradeTimeout: number; } @@ -110,21 +122,30 @@ interface EngineAttachOptions extends EngineOptions, AttachOptions {} interface ServerOptions extends EngineAttachOptions { /** - * name of the path to capture (/socket.io) + * name of the path to capture + * @default "/socket.io" */ path: string; /** - * whether to serve the client files (true) + * whether to serve the client files + * @default true */ serveClient: boolean; /** - * the adapter to use. Defaults to an instance of the Adapter that ships with socket.io which is memory based. + * the adapter to use + * @default the in-memory adapter (https://github.com/socketio/socket.io-adapter) */ adapter: any; /** - * the parser to use. Defaults to an instance of the Parser that ships with socket.io. + * the parser to use + * @default the default parser (https://github.com/socketio/socket.io-parser) */ parser: any; + /** + * how many ms before a client without namespace is closed + * @default 45000 + */ + connectTimeout: number; } export class Server extends EventEmitter { @@ -154,6 +175,7 @@ export class Server extends EventEmitter { private eio; private engine; private _path: string; + private _connectTimeout: number; private httpServer: http.Server; /** @@ -173,6 +195,7 @@ export class Server extends EventEmitter { srv = null; } this.path(opts.path || "/socket.io"); + this.connectTimeout(opts.connectTimeout || 45000); this.serveClient(false !== opts.serveClient); this._parser = opts.parser || parser; this.encoder = new this._parser.Encoder(); @@ -263,6 +286,19 @@ export class Server extends EventEmitter { return this; } + /** + * Set the delay after which a client without namespace is closed + * @param v + * @public + */ + public connectTimeout(v: number): Server; + public connectTimeout(): number; + public connectTimeout(v?: number): Server | number { + if (v === undefined) return this._connectTimeout; + this._connectTimeout = v; + return this; + } + /** * Sets the adapter for rooms. * diff --git a/test/socket.io.ts b/test/socket.io.ts index 9a75772ef0..8e330d1a58 100644 --- a/test/socket.io.ts +++ b/test/socket.io.ts @@ -701,6 +701,25 @@ describe("socket.io", () => { ); }); + it("should close a client without namespace", done => { + const srv = createServer(); + const sio = new Server(srv, { + connectTimeout: 10 + }); + + srv.listen(() => { + const socket = client(srv); + + socket.io.engine.write = () => {}; // prevent the client from sending a CONNECT packet + + socket.on("disconnect", () => { + socket.close(); + sio.close(); + done(); + }); + }); + }); + describe("dynamic namespaces", () => { it("should allow connections to dynamic namespaces with a regex", done => { const srv = createServer(); From 2a05042e2c70eb2d562b8aa3b2d2a2c58899b5c7 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 12:04:03 +0200 Subject: [PATCH 347/494] refactor: add additional typings --- lib/client.ts | 7 ++++--- lib/index.ts | 20 +++++++++++++++----- lib/namespace.ts | 4 ++-- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index 712d9f0013..75c1350b88 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -4,6 +4,7 @@ import { IncomingMessage } from "http"; import { Server } from "./index"; import { Socket } from "./socket"; import { SocketId } from "socket.io-adapter"; +import { ParentNamespace } from "./parent-namespace"; const debug = debugModule("socket.io:client"); @@ -11,7 +12,7 @@ export class Client { public readonly conn; private readonly id: string; - private readonly server; + private readonly server: Server; private readonly encoder: Encoder; private readonly decoder: Decoder; private sockets: Map = new Map(); @@ -83,7 +84,7 @@ export class Client { return this.doConnect(name, auth); } - this.server._checkNamespace(name, auth, dynamicNsp => { + this.server._checkNamespace(name, auth, (dynamicNsp: ParentNamespace) => { if (dynamicNsp) { debug("dynamic namespace %s was created", dynamicNsp.name); this.doConnect(name, auth); @@ -113,7 +114,7 @@ export class Client { } const nsp = this.server.of(name); - const socket = nsp.add(this, auth, () => { + const socket = nsp._add(this, auth, () => { this.sockets.set(socket.id, socket); this.nsps.set(nsp.name, socket); }); diff --git a/lib/index.ts b/lib/index.ts index 91fc2ad03a..9a42ee5341 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -170,12 +170,16 @@ export class Server extends EventEmitter { ) => void), ParentNamespace > = new Map(); - private _adapter; + private _adapter: any; private _serveClient: boolean; private eio; private engine; private _path: string; - private _connectTimeout: number; + + /** + * @private + */ + _connectTimeout: number; private httpServer: http.Server; /** @@ -211,7 +215,9 @@ export class Server extends EventEmitter { * @return {Server|Boolean} self when setting or value when getting * @public */ - public serveClient(v?: boolean) { + public serveClient(v: boolean): Server; + public serveClient(): boolean; + public serveClient(v?: boolean): Server | boolean { if (!arguments.length) return this._serveClient; this._serveClient = v; const resolvePath = function(file) { @@ -280,7 +286,9 @@ export class Server extends EventEmitter { * @return {Server|String} self when setting or value when getting * @public */ - public path(v?: string) { + public path(v: string): Server; + public path(): string; + public path(v?: string): Server | string { if (!arguments.length) return this._path; this._path = v.replace(/\/$/, ""); return this; @@ -306,7 +314,9 @@ export class Server extends EventEmitter { * @return {Server|Adapter} self when setting or value when getting * @public */ - public adapter(v) { + public adapter(): any; + public adapter(v: any); + public adapter(v?): Server | any { if (!arguments.length) return this._adapter; this._adapter = v; for (const nsp of this._nsps.values()) { diff --git a/lib/namespace.ts b/lib/namespace.ts index 5290e53917..61b3f510e3 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -15,7 +15,7 @@ export class Namespace extends EventEmitter { public adapter: Adapter; /** @private */ - readonly server; + readonly server: Server; /** @private */ _fns: Array<(socket: Socket, next: (err: Error) => void) => void> = []; @@ -126,7 +126,7 @@ export class Namespace extends EventEmitter { * @return {Socket} * @private */ - private add(client: Client, query, fn?: () => void): Socket { + _add(client: Client, query, fn?: () => void): Socket { debug("adding socket to nsp %s", this.name); const socket = new Socket(this, client, query); this.run(socket, err => { From 8a5db7fa36a075da75cde43cd4fb6382b7659953 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 12:22:50 +0200 Subject: [PATCH 348/494] refactor: remove duplicate _sockets map Both the "connected" and the "_sockets" maps were used to track the Socket instances in the namespace. Let's merge them into "sockets". It's a breaking change, but: - the "sockets" object did already exist in Socket.IO v2 (and appears in some examples/tutorials) - "sockets" makes more sense than "connected" in my opinion - there was already a breaking change regarding the "connected" property (from object to Map) Breaking change: the "connected" map is renamed to "sockets" --- lib/index.ts | 2 +- lib/namespace.ts | 11 ++++------- lib/socket.ts | 2 -- package.json | 2 +- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 9a42ee5341..8f317a2870 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -568,7 +568,7 @@ export class Server extends EventEmitter { * @public */ public close(fn?: (err?: Error) => void): void { - for (const socket of this.sockets._sockets.values()) { + for (const socket of this.sockets.sockets.values()) { socket._onclose("server shutting down"); } diff --git a/lib/namespace.ts b/lib/namespace.ts index 61b3f510e3..feeaa15c33 100644 --- a/lib/namespace.ts +++ b/lib/namespace.ts @@ -10,7 +10,7 @@ const debug = debugModule("socket.io:namespace"); export class Namespace extends EventEmitter { public readonly name: string; - public readonly connected: Map = new Map(); + public readonly sockets: Map = new Map(); public adapter: Adapter; @@ -29,9 +29,6 @@ export class Namespace extends EventEmitter { /** @private */ _ids: number = 0; - /** @private */ - _sockets: Map = new Map(); - /** * Namespace constructor. * @@ -135,7 +132,7 @@ export class Namespace extends EventEmitter { if (err) return socket._error(err.message); // track socket - this._sockets.set(socket.id, socket); + this.sockets.set(socket.id, socket); // it's paramount that the internal `onconnect` logic // fires before user-set events to prevent state order @@ -161,8 +158,8 @@ export class Namespace extends EventEmitter { * @private */ _remove(socket: Socket): void { - if (this._sockets.has(socket.id)) { - this._sockets.delete(socket.id); + if (this.sockets.has(socket.id)) { + this.sockets.delete(socket.id); } else { debug("ignoring remove for %s", socket.id); } diff --git a/lib/socket.ts b/lib/socket.ts index b9d98557d7..d0d394f78b 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -291,7 +291,6 @@ export class Socket extends EventEmitter { */ _onconnect(): void { debug("socket connected - writing packet"); - this.nsp.connected.set(this.id, this); this.join(this.id); this.packet({ type: PacketType.CONNECT, data: { sid: this.id } }); } @@ -430,7 +429,6 @@ export class Socket extends EventEmitter { this.client._remove(this); this.connected = false; this.disconnected = true; - this.nsp.connected.delete(this.id); super.emit("disconnect", reason); } diff --git a/package.json b/package.json index 9c377f5ad0..b3ec23bfb0 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "base64id": "~2.0.0", "debug": "~4.1.0", "engine.io": "~4.0.0", - "socket.io-adapter": "~2.0.1", + "socket.io-adapter": "2.0.3-rc1", "socket.io-client": "3.0.0-rc1", "socket.io-parser": "4.0.1-rc2" }, From 0ce5b4ca6873517a648b1ded9471d43eb5459c99 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 12:58:22 +0200 Subject: [PATCH 349/494] chore(release): 3.0.0-rc2 Diff: https://github.com/socketio/socket.io/compare/3.0.0-rc1...3.0.0-rc2 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ package.json | 6 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b42f3a7fd..43fe970913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +# [3.0.0-rc2](https://github.com/socketio/socket.io/compare/3.0.0-rc1...3.0.0-rc2) (2020-10-15) + + +### Bug Fixes + +* close clients with no namespace ([91cd255](https://github.com/socketio/socket.io/commit/91cd255ba76ff6a780c62740f9f5cd3a76f5d7c7)) + + +### Code Refactoring + +* remove duplicate _sockets map ([8a5db7f](https://github.com/socketio/socket.io/commit/8a5db7fa36a075da75cde43cd4fb6382b7659953)) + + +### Features + +* move binary detection back to the parser ([669592d](https://github.com/socketio/socket.io/commit/669592d120409a5cf00f128070dee6d22259ba4f)) + + +### BREAKING CHANGES + +* the "connected" map is renamed to "sockets" +* the Socket#binary() method is removed, as this use case is now covered by the ability to provide your own parser. + + + # [3.0.0-rc1](https://github.com/socketio/socket.io/compare/2.3.0...3.0.0-rc1) (2020-10-13) diff --git a/package.json b/package.json index b3ec23bfb0..6bb75ddfee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io", - "version": "3.0.0-rc1", + "version": "3.0.0-rc2", "description": "node.js realtime framework server", "keywords": [ "realtime", @@ -13,7 +13,7 @@ ], "files": [ "dist/", - "./wrapper.mjs" + "wrapper.mjs" ], "type": "commonjs", "main": "./dist/index.js", @@ -38,7 +38,7 @@ "debug": "~4.1.0", "engine.io": "~4.0.0", "socket.io-adapter": "2.0.3-rc1", - "socket.io-client": "3.0.0-rc1", + "socket.io-client": "3.0.0-rc2", "socket.io-parser": "4.0.1-rc2" }, "devDependencies": { From 20ea6bd2773c7eea0d08c9cf6750fa83fd67f624 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 13:24:42 +0200 Subject: [PATCH 350/494] docs(examples): add example with ES modules --- examples/es-modules/README.md | 17 ++ examples/es-modules/client.js | 18 ++ examples/es-modules/package-lock.json | 238 ++++++++++++++++++++++++++ examples/es-modules/package.json | 15 ++ examples/es-modules/server.js | 16 ++ 5 files changed, 304 insertions(+) create mode 100644 examples/es-modules/README.md create mode 100644 examples/es-modules/client.js create mode 100644 examples/es-modules/package-lock.json create mode 100644 examples/es-modules/package.json create mode 100644 examples/es-modules/server.js diff --git a/examples/es-modules/README.md b/examples/es-modules/README.md new file mode 100644 index 0000000000..2bed289507 --- /dev/null +++ b/examples/es-modules/README.md @@ -0,0 +1,17 @@ + +# Example with [ES modules](https://nodejs.org/api/esm.html) + +## How to use + +``` +# install the dependencies +$ npm ci + +# start the server +$ node server.js + +# start the client +$ node client.js +``` + +You need Node.js `>=12.17.0`. diff --git a/examples/es-modules/client.js b/examples/es-modules/client.js new file mode 100644 index 0000000000..23dcbf4b73 --- /dev/null +++ b/examples/es-modules/client.js @@ -0,0 +1,18 @@ +import { Manager } from "socket.io-client"; + +const manager = new Manager("ws://localhost:8080"); +const socket = manager.socket("/"); + +socket.on("connect", () => { + console.log(`connect ${socket.id}`); +}); + +socket.on("disconnect", () => { + console.log(`disconnect`); +}); + +setInterval(() => { + socket.emit("ping", () => { + console.log("pong"); + }); +}, 1000); diff --git a/examples/es-modules/package-lock.json b/examples/es-modules/package-lock.json new file mode 100644 index 0000000000..9b1409d2e5 --- /dev/null +++ b/examples/es-modules/package-lock.json @@ -0,0 +1,238 @@ +{ + "name": "es-modules", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "engine.io": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.0.tgz", + "integrity": "sha512-WyTa1NJR8rRmPXGXNSSgA+XhzfYLVcRBjRoFx7gI3cARnEsyuMpg0PS/PMDnPMMQtkjmVZsi2/ETrpq4mhoYSw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.0", + "ws": "^7.1.2" + } + }, + "engine.io-client": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.0.0.tgz", + "integrity": "sha512-dmydBrbZW0AYX4+u7aRzslPw/MSZy3HwwqHx3Es5OPj9q0tnyPeFZZU/UE5aLjba6xIwZTXkB+OdqF5wmR21IA==", + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.5", + "ws": "~7.2.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" + } + } + }, + "engine.io-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.1.tgz", + "integrity": "sha512-v5aZK1hlckcJDGmHz3W8xvI3NUHYc9t8QtTbqdR5OaH3S9iJZilPubauOm+vLWOMMWzpE3hiq92l9lTAHamRCg==" + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "socket.io": { + "version": "3.0.0-rc2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.0-rc2.tgz", + "integrity": "sha512-viH824jjAF+tCN6zfFgZR9wsgXWZ6zuVZ46ZQDsThyXdkv6+RihAZ/xz6LqsP8vFK83MVtRztMAIc56eyeKX0g==", + "requires": { + "base64id": "~2.0.0", + "debug": "~4.1.0", + "engine.io": "~4.0.0", + "socket.io-adapter": "2.0.3-rc1", + "socket.io-client": "3.0.0-rc2", + "socket.io-parser": "4.0.1-rc2" + } + }, + "socket.io-adapter": { + "version": "2.0.3-rc1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3-rc1.tgz", + "integrity": "sha512-/+irxVkiriDRMt2hcYYlDOl2LUU3wkjPQ1917t/hb617/W+bnlDaqEGqtQpFE/tWys5FI1+q2JnjdwNeRHxyNw==" + }, + "socket.io-client": { + "version": "3.0.0-rc2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.0.0-rc2.tgz", + "integrity": "sha512-ZIVzV1ANogp5ZqkIn504UhD4NwZkCWLoq9/rHiNSI0RIsvsfGxyOzhNvr0fWPppfr8+hNt5Qbij6ucV5ijIJDg==", + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-client": "~4.0.0", + "parseuri": "0.0.6", + "socket.io-parser": "4.0.1-rc2" + } + }, + "socket.io-parser": { + "version": "4.0.1-rc2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.1-rc2.tgz", + "integrity": "sha512-aI20UWITf5vKgwA1HjCanYlM8cr2VDmOBiM3+1MM1MautnHAngiceuN0gUOtQs4MmWatuD2Td8g00EwHf3qthQ==", + "requires": { + "component-emitter": "~1.3.0", + "debug": "~4.1.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/examples/es-modules/package.json b/examples/es-modules/package.json new file mode 100644 index 0000000000..b2db8765ca --- /dev/null +++ b/examples/es-modules/package.json @@ -0,0 +1,15 @@ +{ + "name": "es-modules", + "version": "1.0.0", + "description": "An example with ES modules (https://nodejs.org/api/esm.html)", + "type": "module", + "author": "Damien Arrachequesne", + "license": "MIT", + "engines": { + "node": ">=12.17.0" + }, + "dependencies": { + "socket.io": "beta", + "socket.io-client": "beta" + } +} diff --git a/examples/es-modules/server.js b/examples/es-modules/server.js new file mode 100644 index 0000000000..3fffbee484 --- /dev/null +++ b/examples/es-modules/server.js @@ -0,0 +1,16 @@ +import { Server } from "socket.io"; + +const io = new Server(8080); + +io.on("connect", (socket) => { + console.log(`connect ${socket.id}`); + + socket.on("ping", (cb) => { + console.log("ping"); + cb(); + }); + + socket.on("disconnect", () => { + console.log(`disconnect ${socket.id}`); + }); +}); From a81b9f31cf735e1814b11fd9ccf78e8d411b9a06 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 13:38:04 +0200 Subject: [PATCH 351/494] docs(examples): add example with TypeScript There are two issues with the typings: - on the client-side, the Emitter class is not properly imported (hence the @ts-ignore) - on the server-side, the Socket class is not exported (in order to cast it in the "connect" event) --- examples/typescript/client.ts | 21 ++ examples/typescript/package-lock.json | 289 ++++++++++++++++++++++++++ examples/typescript/package.json | 17 ++ examples/typescript/server.ts | 16 ++ 4 files changed, 343 insertions(+) create mode 100644 examples/typescript/client.ts create mode 100644 examples/typescript/package-lock.json create mode 100644 examples/typescript/package.json create mode 100644 examples/typescript/server.ts diff --git a/examples/typescript/client.ts b/examples/typescript/client.ts new file mode 100644 index 0000000000..0cea8fb7f8 --- /dev/null +++ b/examples/typescript/client.ts @@ -0,0 +1,21 @@ +import { Manager } from "socket.io-client"; + +const manager = new Manager("ws://localhost:8080", {}); +const socket = manager.socket("/"); + +// @ts-ignore +socket.on("connect", () => { + console.log(`connect ${socket.id}`); +}); + +// @ts-ignore +socket.on("disconnect", () => { + console.log(`disconnect`); +}); + +setInterval(() => { + const start = Date.now(); + socket.emit("ping", () => { + console.log(`pong (latency: ${Date.now() - start} ms)`); + }); +}, 1000); diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json new file mode 100644 index 0000000000..e4022e0daf --- /dev/null +++ b/examples/typescript/package-lock.json @@ -0,0 +1,289 @@ +{ + "name": "typescript", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "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==" + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "engine.io": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.0.tgz", + "integrity": "sha512-WyTa1NJR8rRmPXGXNSSgA+XhzfYLVcRBjRoFx7gI3cARnEsyuMpg0PS/PMDnPMMQtkjmVZsi2/ETrpq4mhoYSw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.0", + "ws": "^7.1.2" + } + }, + "engine.io-client": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.0.0.tgz", + "integrity": "sha512-dmydBrbZW0AYX4+u7aRzslPw/MSZy3HwwqHx3Es5OPj9q0tnyPeFZZU/UE5aLjba6xIwZTXkB+OdqF5wmR21IA==", + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.5", + "ws": "~7.2.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" + } + } + }, + "engine.io-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.1.tgz", + "integrity": "sha512-v5aZK1hlckcJDGmHz3W8xvI3NUHYc9t8QtTbqdR5OaH3S9iJZilPubauOm+vLWOMMWzpE3hiq92l9lTAHamRCg==" + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "socket.io": { + "version": "3.0.0-rc2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.0-rc2.tgz", + "integrity": "sha512-viH824jjAF+tCN6zfFgZR9wsgXWZ6zuVZ46ZQDsThyXdkv6+RihAZ/xz6LqsP8vFK83MVtRztMAIc56eyeKX0g==", + "requires": { + "base64id": "~2.0.0", + "debug": "~4.1.0", + "engine.io": "~4.0.0", + "socket.io-adapter": "2.0.3-rc1", + "socket.io-client": "3.0.0-rc2", + "socket.io-parser": "4.0.1-rc2" + } + }, + "socket.io-adapter": { + "version": "2.0.3-rc1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3-rc1.tgz", + "integrity": "sha512-/+irxVkiriDRMt2hcYYlDOl2LUU3wkjPQ1917t/hb617/W+bnlDaqEGqtQpFE/tWys5FI1+q2JnjdwNeRHxyNw==" + }, + "socket.io-client": { + "version": "3.0.0-rc2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.0.0-rc2.tgz", + "integrity": "sha512-ZIVzV1ANogp5ZqkIn504UhD4NwZkCWLoq9/rHiNSI0RIsvsfGxyOzhNvr0fWPppfr8+hNt5Qbij6ucV5ijIJDg==", + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-client": "~4.0.0", + "parseuri": "0.0.6", + "socket.io-parser": "4.0.1-rc2" + } + }, + "socket.io-parser": { + "version": "4.0.1-rc2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.1-rc2.tgz", + "integrity": "sha512-aI20UWITf5vKgwA1HjCanYlM8cr2VDmOBiM3+1MM1MautnHAngiceuN0gUOtQs4MmWatuD2Td8g00EwHf3qthQ==", + "requires": { + "component-emitter": "~1.3.0", + "debug": "~4.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/examples/typescript/package.json b/examples/typescript/package.json new file mode 100644 index 0000000000..2ae9ceb3b6 --- /dev/null +++ b/examples/typescript/package.json @@ -0,0 +1,17 @@ +{ + "name": "typescript", + "version": "1.0.0", + "description": "An example with TypeScript", + "private": true, + "scripts": { + "start:server": "ts-node server.ts", + "start:client": "ts-node client.ts" + }, + "author": "Damien Arrachequesne", + "license": "MIT", + "dependencies": { + "socket.io": "beta", + "socket.io-client": "beta", + "ts-node": "^9.0.0" + } +} diff --git a/examples/typescript/server.ts b/examples/typescript/server.ts new file mode 100644 index 0000000000..5f968c1ab5 --- /dev/null +++ b/examples/typescript/server.ts @@ -0,0 +1,16 @@ +import { Server } from "socket.io"; + +const io = new Server(8080); + +io.on("connect", (socket) => { + console.log(`connect ${socket.id}`); + + socket.on("ping", (cb) => { + console.log("ping"); + cb(); + }); + + socket.on("disconnect", () => { + console.log(`disconnect ${socket.id}`); + }); +}); From 7603da71a535481e3fc60e38b013abf78516d322 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 17 Oct 2020 01:56:17 +0200 Subject: [PATCH 352/494] feat: remove prod dependency to socket.io-client The client bundles are included in the repository in order to remove socket.io-client from the list of production dependencies and thus to reduce the total number of dependencies when installing the server. This means the release of the client and the server must now be in sync (which is almost always the case actually). The minified build is now served: - //socket.io.js - //socket.io.js.map - //socket.io.min.js - //socket.io.min.js.map The content will now be compressed as well. --- client-dist/socket.io.js | 6084 ++++++++++++++++++++++++++++++ client-dist/socket.io.js.map | 1 + client-dist/socket.io.min.js | 7 + client-dist/socket.io.min.js.map | 1 + lib/index.ts | 131 +- package.json | 3 +- test/socket.io.ts | 48 +- 7 files changed, 6206 insertions(+), 69 deletions(-) create mode 100644 client-dist/socket.io.js create mode 100644 client-dist/socket.io.js.map create mode 100644 client-dist/socket.io.min.js create mode 100644 client-dist/socket.io.min.js.map diff --git a/client-dist/socket.io.js b/client-dist/socket.io.js new file mode 100644 index 0000000000..4b64aa7cb6 --- /dev/null +++ b/client-dist/socket.io.js @@ -0,0 +1,6084 @@ +/*! + * Socket.IO v3.0.0-rc2 + * (c) 2014-2020 Guillermo Rauch + * Released under the MIT License. + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["io"] = factory(); + else + root["io"] = factory(); +})((() => { + if (typeof self !== 'undefined') { + return self; + } else if (typeof window !== 'undefined') { + return window; + } else if (typeof global !== 'undefined') { + return global; + } else { + return Function('return this')(); + } + })(), function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./build/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./build/index.js": +/*!************************!*\ + !*** ./build/index.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.io = exports.Manager = exports.protocol = void 0; + +var url_1 = __webpack_require__(/*! ./url */ "./build/url.js"); + +var manager_1 = __webpack_require__(/*! ./manager */ "./build/manager.js"); + +var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client"); +/** + * Module exports. + */ + + +module.exports = exports = lookup; +/** + * Managers cache. + */ + +var cache = exports.managers = {}; + +function lookup(uri, opts) { + if (_typeof(uri) === "object") { + opts = uri; + uri = undefined; + } + + opts = opts || {}; + var parsed = url_1.url(http://github.com/uri); + var source = parsed.source; + var id = parsed.id; + var path = parsed.path; + var sameNamespace = cache[id] && path in cache[id].nsps; + var newConnection = opts.forceNew || opts["force new connection"] || false === opts.multiplex || sameNamespace; + var io; + + if (newConnection) { + debug("ignoring socket cache for %s", source); + io = new manager_1.Manager(source, opts); + } else { + if (!cache[id]) { + debug("new io instance for %s", source); + cache[id] = new manager_1.Manager(source, opts); + } + + io = cache[id]; + } + + if (parsed.query && !opts.query) { + opts.query = parsed.query; + } + + return io.socket(parsed.path, opts); +} + +exports.io = lookup; +/** + * Protocol version. + * + * @public + */ + +var socket_io_parser_1 = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); + +Object.defineProperty(exports, "protocol", { + enumerable: true, + get: function get() { + return socket_io_parser_1.protocol; + } +}); +/** + * `connect`. + * + * @param {String} uri + * @public + */ + +exports.connect = lookup; +/** + * Expose constructors for standalone build. + * + * @public + */ + +var manager_2 = __webpack_require__(/*! ./manager */ "./build/manager.js"); + +Object.defineProperty(exports, "Manager", { + enumerable: true, + get: function get() { + return manager_2.Manager; + } +}); + +/***/ }), + +/***/ "./build/manager.js": +/*!**************************!*\ + !*** ./build/manager.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Manager = void 0; + +var eio = __webpack_require__(/*! engine.io-client */ "./node_modules/engine.io-client/lib/index.js"); + +var socket_1 = __webpack_require__(/*! ./socket */ "./build/socket.js"); + +var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); + +var parser = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); + +var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); + +var bind = __webpack_require__(/*! component-bind */ "./node_modules/component-bind/index.js"); + +var Backoff = __webpack_require__(/*! backo2 */ "./node_modules/backo2/index.js"); + +var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:manager"); + +var Manager = /*#__PURE__*/function (_Emitter) { + _inherits(Manager, _Emitter); + + var _super = _createSuper(Manager); + + function Manager(uri, opts) { + var _this; + + _classCallCheck(this, Manager); + + _this = _super.call(this); + _this.nsps = {}; + _this.subs = []; + _this.connecting = []; + + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = undefined; + } + + opts = opts || {}; + opts.path = opts.path || "/socket.io"; + _this.opts = opts; + + _this.reconnection(opts.reconnection !== false); + + _this.reconnectionAttempts(opts.reconnectionAttempts || Infinity); + + _this.reconnectionDelay(opts.reconnectionDelay || 1000); + + _this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000); + + _this.randomizationFactor(opts.randomizationFactor || 0.5); + + _this.backoff = new Backoff({ + min: _this.reconnectionDelay(), + max: _this.reconnectionDelayMax(), + jitter: _this.randomizationFactor() + }); + + _this.timeout(null == opts.timeout ? 20000 : opts.timeout); + + _this._readyState = "closed"; + _this.uri = uri; + + var _parser = opts.parser || parser; + + _this.encoder = new _parser.Encoder(); + _this.decoder = new _parser.Decoder(); + _this._autoConnect = opts.autoConnect !== false; + if (_this._autoConnect) _this.open(); + return _this; + } + + _createClass(Manager, [{ + key: "reconnection", + value: function reconnection(v) { + if (!arguments.length) return this._reconnection; + this._reconnection = !!v; + return this; + } + }, { + key: "reconnectionAttempts", + value: function reconnectionAttempts(v) { + if (v === undefined) return this._reconnectionAttempts; + this._reconnectionAttempts = v; + return this; + } + }, { + key: "reconnectionDelay", + value: function reconnectionDelay(v) { + if (v === undefined) return this._reconnectionDelay; + this._reconnectionDelay = v; + this.backoff && this.backoff.setMin(v); + return this; + } + }, { + key: "randomizationFactor", + value: function randomizationFactor(v) { + if (v === undefined) return this._randomizationFactor; + this._randomizationFactor = v; + this.backoff && this.backoff.setJitter(v); + return this; + } + }, { + key: "reconnectionDelayMax", + value: function reconnectionDelayMax(v) { + if (v === undefined) return this._reconnectionDelayMax; + this._reconnectionDelayMax = v; + this.backoff && this.backoff.setMax(v); + return this; + } + }, { + key: "timeout", + value: function timeout(v) { + if (!arguments.length) return this._timeout; + this._timeout = v; + return this; + } + /** + * Starts trying to reconnect if reconnection is enabled and we have not + * started reconnecting yet + * + * @private + */ + + }, { + key: "maybeReconnectOnOpen", + value: function maybeReconnectOnOpen() { + // Only try to reconnect if it's the first time we're connecting + if (!this._reconnecting && this._reconnection && this.backoff.attempts === 0) { + // keeps reconnection from firing twice for the same reconnection loop + this.reconnect(); + } + } + /** + * Sets the current transport `socket`. + * + * @param {Function} fn - optional, callback + * @return {Manager} self + * @public + */ + + }, { + key: "open", + value: function open(fn) { + var _this2 = this; + + debug("readyState %s", this._readyState); + if (~this._readyState.indexOf("open")) return this; + debug("opening %s", this.uri); + this.engine = eio(this.uri, this.opts); + var socket = this.engine; + var self = this; + this._readyState = "opening"; + this.skipReconnect = false; // emit `open` + + var openSub = on_1.on(socket, "open", function () { + self.onopen(); + fn && fn(); + }); // emit `connect_error` + + var errorSub = on_1.on(socket, "error", function (err) { + debug("connect_error"); + self.cleanup(); + self._readyState = "closed"; + + _get(_getPrototypeOf(Manager.prototype), "emit", _this2).call(_this2, "connect_error", err); + + if (fn) { + fn(err); + } else { + // Only do this if there is no fn to handle the error + self.maybeReconnectOnOpen(); + } + }); // emit `connect_timeout` + + if (false !== this._timeout) { + var timeout = this._timeout; + debug("connect attempt will timeout after %d", timeout); + + if (timeout === 0) { + openSub.destroy(); // prevents a race condition with the 'open' event + } // set timer + + + var timer = setTimeout(function () { + debug("connect attempt timed out after %d", timeout); + openSub.destroy(); + socket.close(); + socket.emit("error", "timeout"); + + _get(_getPrototypeOf(Manager.prototype), "emit", _this2).call(_this2, "connect_error", new Error("timeout")); + }, timeout); + this.subs.push({ + destroy: function destroy() { + clearTimeout(timer); + } + }); + } + + this.subs.push(openSub); + this.subs.push(errorSub); + return this; + } + /** + * Alias for open() + * + * @return {Manager} self + * @public + */ + + }, { + key: "connect", + value: function connect(fn) { + return this.open(fn); + } + /** + * Called upon transport open. + * + * @private + */ + + }, { + key: "onopen", + value: function onopen() { + debug("open"); // clear old subs + + this.cleanup(); // mark as open + + this._readyState = "open"; + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "open"); // add new subs + + + var socket = this.engine; + this.subs.push(on_1.on(socket, "data", bind(this, "ondata"))); + this.subs.push(on_1.on(socket, "ping", bind(this, "onping"))); + this.subs.push(on_1.on(socket, "error", bind(this, "onerror"))); + this.subs.push(on_1.on(socket, "close", bind(this, "onclose"))); + this.subs.push(on_1.on(this.decoder, "decoded", bind(this, "ondecoded"))); + } + /** + * Called upon a ping. + * + * @private + */ + + }, { + key: "onping", + value: function onping() { + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "ping"); + } + /** + * Called with data. + * + * @private + */ + + }, { + key: "ondata", + value: function ondata(data) { + this.decoder.add(data); + } + /** + * Called when parser fully decodes a packet. + * + * @private + */ + + }, { + key: "ondecoded", + value: function ondecoded(packet) { + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "packet", packet); + } + /** + * Called upon socket error. + * + * @private + */ + + }, { + key: "onerror", + value: function onerror(err) { + debug("error", err); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "error", err); + } + /** + * Creates a new socket for the given `nsp`. + * + * @return {Socket} + * @public + */ + + }, { + key: "socket", + value: function socket(nsp, opts) { + var socket = this.nsps[nsp]; + + if (!socket) { + socket = new socket_1.Socket(this, nsp, opts); + this.nsps[nsp] = socket; + var self = this; + socket.on("connecting", onConnecting); + + if (this._autoConnect) { + // manually call here since connecting event is fired before listening + onConnecting(); + } + } + + function onConnecting() { + if (!~self.connecting.indexOf(socket)) { + self.connecting.push(socket); + } + } + + return socket; + } + /** + * Called upon a socket close. + * + * @param {Socket} socket + * @private + */ + + }, { + key: "_destroy", + value: function _destroy(socket) { + var index = this.connecting.indexOf(socket); + if (~index) this.connecting.splice(index, 1); + if (this.connecting.length) return; + + this._close(); + } + /** + * Writes a packet. + * + * @param {Object} packet + * @private + */ + + }, { + key: "_packet", + value: function _packet(packet) { + debug("writing packet %j", packet); + if (packet.query && packet.type === 0) packet.nsp += "?" + packet.query; + var encodedPackets = this.encoder.encode(packet); + + for (var i = 0; i < encodedPackets.length; i++) { + this.engine.write(encodedPackets[i], packet.options); + } + } + /** + * Clean up transport subscriptions and packet buffer. + * + * @private + */ + + }, { + key: "cleanup", + value: function cleanup() { + debug("cleanup"); + var subsLength = this.subs.length; + + for (var i = 0; i < subsLength; i++) { + var sub = this.subs.shift(); + sub.destroy(); + } + + this.decoder.destroy(); + } + /** + * Close the current socket. + * + * @private + */ + + }, { + key: "_close", + value: function _close() { + debug("disconnect"); + this.skipReconnect = true; + this._reconnecting = false; + + if ("opening" === this._readyState) { + // `onclose` will not fire because + // an open event never happened + this.cleanup(); + } + + this.backoff.reset(); + this._readyState = "closed"; + if (this.engine) this.engine.close(); + } + /** + * Alias for close() + * + * @private + */ + + }, { + key: "disconnect", + value: function disconnect() { + return this._close(); + } + /** + * Called upon engine close. + * + * @private + */ + + }, { + key: "onclose", + value: function onclose(reason) { + debug("onclose"); + this.cleanup(); + this.backoff.reset(); + this._readyState = "closed"; + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "close", reason); + + if (this._reconnection && !this.skipReconnect) { + this.reconnect(); + } + } + /** + * Attempt a reconnection. + * + * @private + */ + + }, { + key: "reconnect", + value: function reconnect() { + var _this3 = this; + + if (this._reconnecting || this.skipReconnect) return this; + var self = this; + + if (this.backoff.attempts >= this._reconnectionAttempts) { + debug("reconnect failed"); + this.backoff.reset(); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "reconnect_failed"); + + this._reconnecting = false; + } else { + var delay = this.backoff.duration(); + debug("will wait %dms before reconnect attempt", delay); + this._reconnecting = true; + var timer = setTimeout(function () { + if (self.skipReconnect) return; + debug("attempting reconnect"); + + _get(_getPrototypeOf(Manager.prototype), "emit", _this3).call(_this3, "reconnect_attempt", self.backoff.attempts); + + _get(_getPrototypeOf(Manager.prototype), "emit", _this3).call(_this3, "reconnecting", self.backoff.attempts); // check again for the case socket closed in above events + + + if (self.skipReconnect) return; + self.open(function (err) { + if (err) { + debug("reconnect attempt error"); + self._reconnecting = false; + self.reconnect(); + + _get(_getPrototypeOf(Manager.prototype), "emit", _this3).call(_this3, "reconnect_error", err); + } else { + debug("reconnect success"); + self.onreconnect(); + } + }); + }, delay); + this.subs.push({ + destroy: function destroy() { + clearTimeout(timer); + } + }); + } + } + /** + * Called upon successful reconnect. + * + * @private + */ + + }, { + key: "onreconnect", + value: function onreconnect() { + var attempt = this.backoff.attempts; + this._reconnecting = false; + this.backoff.reset(); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call(this, "reconnect", attempt); + } + }]); + + return Manager; +}(Emitter); + +exports.Manager = Manager; + +/***/ }), + +/***/ "./build/on.js": +/*!*********************!*\ + !*** ./build/on.js ***! + \*********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.on = void 0; + +function on(obj, ev, fn) { + obj.on(ev, fn); + return { + destroy: function destroy() { + obj.removeListener(ev, fn); + } + }; +} + +exports.on = on; + +/***/ }), + +/***/ "./build/socket.js": +/*!*************************!*\ + !*** ./build/socket.js ***! + \*************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Socket = void 0; + +var socket_io_parser_1 = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); + +var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); + +var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); + +var bind = __webpack_require__(/*! component-bind */ "./node_modules/component-bind/index.js"); + +var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:socket"); +/** + * Internal events. + * These events can't be emitted by the user. + */ + + +var RESERVED_EVENTS = { + connect: 1, + disconnect: 1, + disconnecting: 1, + error: 1, + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener + newListener: 1, + removeListener: 1 +}; + +var Socket = /*#__PURE__*/function (_Emitter) { + _inherits(Socket, _Emitter); + + var _super = _createSuper(Socket); + + /** + * `Socket` constructor. + * + * @public + */ + function Socket(io, nsp, opts) { + var _this; + + _classCallCheck(this, Socket); + + _this = _super.call(this); + _this.ids = 0; + _this.acks = {}; + _this.receiveBuffer = []; + _this.sendBuffer = []; + _this.flags = {}; + _this.io = io; + _this.nsp = nsp; + _this.ids = 0; + _this.acks = {}; + _this.receiveBuffer = []; + _this.sendBuffer = []; + _this.connected = false; + _this.disconnected = true; + _this.flags = {}; + + if (opts && opts.auth) { + _this.auth = opts.auth; + } + + if (_this.io._autoConnect) _this.open(); + return _this; + } + /** + * Subscribe to open, close and packet events + * + * @private + */ + + + _createClass(Socket, [{ + key: "subEvents", + value: function subEvents() { + if (this.subs) return; + var io = this.io; + this.subs = [on_1.on(io, "open", bind(this, "onopen")), on_1.on(io, "packet", bind(this, "onpacket")), on_1.on(io, "close", bind(this, "onclose"))]; + } + /** + * "Opens" the socket. + * + * @public + */ + + }, { + key: "connect", + value: function connect() { + if (this.connected) return this; + this.subEvents(); + if (!this.io._reconnecting) this.io.open(); // ensure open + + if ("open" === this.io._readyState) this.onopen(); + return this; + } + /** + * Alias for connect() + */ + + }, { + key: "open", + value: function open() { + return this.connect(); + } + /** + * Sends a `message` event. + * + * @return {Socket} self + * @public + */ + + }, { + key: "send", + value: function send() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Override `emit`. + * If the event is in `events`, it's emitted normally. + * + * @param {String} ev - event name + * @return {Socket} self + * @public + */ + + }, { + key: "emit", + value: function emit(ev) { + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev + '" is a reserved event name'); + } + + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + args.unshift(ev); + var packet = { + type: socket_io_parser_1.PacketType.EVENT, + data: args + }; + packet.options = {}; + packet.options.compress = !this.flags || false !== this.flags.compress; // event ack callback + + if ("function" === typeof args[args.length - 1]) { + debug("emitting packet with ack id %d", this.ids); + this.acks[this.ids] = args.pop(); + packet.id = this.ids++; + } + + if (this.connected) { + this.packet(packet); + } else { + this.sendBuffer.push(packet); + } + + this.flags = {}; + return this; + } + /** + * Sends a packet. + * + * @param {Object} packet + * @private + */ + + }, { + key: "packet", + value: function packet(_packet) { + _packet.nsp = this.nsp; + + this.io._packet(_packet); + } + /** + * Called upon engine `open`. + * + * @private + */ + + }, { + key: "onopen", + value: function onopen() { + var _this2 = this; + + debug("transport is open - connecting"); + + if (typeof this.auth == "function") { + this.auth(function (data) { + _this2.packet({ + type: socket_io_parser_1.PacketType.CONNECT, + data: data + }); + }); + } else { + this.packet({ + type: socket_io_parser_1.PacketType.CONNECT, + data: this.auth + }); + } + } + /** + * Called upon engine `close`. + * + * @param {String} reason + * @private + */ + + }, { + key: "onclose", + value: function onclose(reason) { + debug("close (%s)", reason); + this.connected = false; + this.disconnected = true; + delete this.id; + + _get(_getPrototypeOf(Socket.prototype), "emit", this).call(this, "disconnect", reason); + } + /** + * Called with socket packet. + * + * @param {Object} packet + * @private + */ + + }, { + key: "onpacket", + value: function onpacket(packet) { + var sameNamespace = packet.nsp === this.nsp; + var rootNamespaceError = packet.type === socket_io_parser_1.PacketType.ERROR && packet.nsp === "/"; + if (!sameNamespace && !rootNamespaceError) return; + + switch (packet.type) { + case socket_io_parser_1.PacketType.CONNECT: + var id = packet.data.sid; + this.onconnect(id); + break; + + case socket_io_parser_1.PacketType.EVENT: + this.onevent(packet); + break; + + case socket_io_parser_1.PacketType.BINARY_EVENT: + this.onevent(packet); + break; + + case socket_io_parser_1.PacketType.ACK: + this.onack(packet); + break; + + case socket_io_parser_1.PacketType.BINARY_ACK: + this.onack(packet); + break; + + case socket_io_parser_1.PacketType.DISCONNECT: + this.ondisconnect(); + break; + + case socket_io_parser_1.PacketType.ERROR: + _get(_getPrototypeOf(Socket.prototype), "emit", this).call(this, "error", packet.data); + + break; + } + } + /** + * Called upon a server event. + * + * @param {Object} packet + * @private + */ + + }, { + key: "onevent", + value: function onevent(packet) { + var args = packet.data || []; + debug("emitting event %j", args); + + if (null != packet.id) { + debug("attaching ack callback to event"); + args.push(this.ack(packet.id)); + } + + if (this.connected) { + _get(_getPrototypeOf(Socket.prototype), "emit", this).apply(this, args); + } else { + this.receiveBuffer.push(args); + } + } + /** + * Produces an ack callback to emit with an event. + * + * @private + */ + + }, { + key: "ack", + value: function ack(id) { + var self = this; + var sent = false; + return function () { + // prevent double callbacks + if (sent) return; + sent = true; + + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + debug("sending ack %j", args); + self.packet({ + type: socket_io_parser_1.PacketType.ACK, + id: id, + data: args + }); + }; + } + /** + * Called upon a server acknowlegement. + * + * @param {Object} packet + * @private + */ + + }, { + key: "onack", + value: function onack(packet) { + var ack = this.acks[packet.id]; + + if ("function" === typeof ack) { + debug("calling ack %s with %j", packet.id, packet.data); + ack.apply(this, packet.data); + delete this.acks[packet.id]; + } else { + debug("bad ack %s", packet.id); + } + } + /** + * Called upon server connect. + * + * @private + */ + + }, { + key: "onconnect", + value: function onconnect(id) { + this.id = id; + this.connected = true; + this.disconnected = false; + + _get(_getPrototypeOf(Socket.prototype), "emit", this).call(this, "connect"); + + this.emitBuffered(); + } + /** + * Emit buffered events (received and emitted). + * + * @private + */ + + }, { + key: "emitBuffered", + value: function emitBuffered() { + for (var i = 0; i < this.receiveBuffer.length; i++) { + _get(_getPrototypeOf(Socket.prototype), "emit", this).apply(this, this.receiveBuffer[i]); + } + + this.receiveBuffer = []; + + for (var _i = 0; _i < this.sendBuffer.length; _i++) { + this.packet(this.sendBuffer[_i]); + } + + this.sendBuffer = []; + } + /** + * Called upon server disconnect. + * + * @private + */ + + }, { + key: "ondisconnect", + value: function ondisconnect() { + debug("server disconnect (%s)", this.nsp); + this.destroy(); + this.onclose("io server disconnect"); + } + /** + * Called upon forced client/server side disconnections, + * this method ensures the manager stops tracking us and + * that reconnections don't get triggered for this. + * + * @private + */ + + }, { + key: "destroy", + value: function destroy() { + if (this.subs) { + // clean subscriptions to avoid reconnections + for (var i = 0; i < this.subs.length; i++) { + this.subs[i].destroy(); + } + + this.subs = null; + } + + this.io._destroy(this); + } + /** + * Disconnects the socket manually. + * + * @return {Socket} self + * @public + */ + + }, { + key: "disconnect", + value: function disconnect() { + if (this.connected) { + debug("performing disconnect (%s)", this.nsp); + this.packet({ + type: socket_io_parser_1.PacketType.DISCONNECT + }); + } // remove socket from pool + + + this.destroy(); + + if (this.connected) { + // fire events + this.onclose("io client disconnect"); + } + + return this; + } + /** + * Alias for disconnect() + * + * @return {Socket} self + * @public + */ + + }, { + key: "close", + value: function close() { + return this.disconnect(); + } + /** + * Sets the compress flag. + * + * @param {Boolean} compress - if `true`, compresses the sending data + * @return {Socket} self + * @public + */ + + }, { + key: "compress", + value: function compress(_compress) { + this.flags.compress = _compress; + return this; + } + }]); + + return Socket; +}(Emitter); + +exports.Socket = Socket; + +/***/ }), + +/***/ "./build/url.js": +/*!**********************!*\ + !*** ./build/url.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.url = void 0; + +var parseuri = __webpack_require__(/*! parseuri */ "./node_modules/parseuri/index.js"); + +var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:url"); +/** + * URL parser. + * + * @param {String} uri - url + * @param {Object} loc - An object meant to mimic window.location. + * Defaults to window.location. + * @public + */ + + +function url(http://github.com/uri,%20loc) { + var obj = uri; // default to window.location + + loc = loc || typeof location !== "undefined" && location; + if (null == uri) uri = loc.protocol + "//" + loc.host; // relative path support + + if ("string" === typeof uri) { + if ("/" === uri.charAt(0)) { + if ("/" === uri.charAt(1)) { + uri = loc.protocol + uri; + } else { + uri = loc.host + uri; + } + } + + if (!/^(https?|wss?):\/\//.test(uri)) { + debug("protocol-less url %s", uri); + + if ("undefined" !== typeof loc) { + uri = loc.protocol + "//" + uri; + } else { + uri = "https://" + uri; + } + } // parse + + + debug("parse %s", uri); + obj = parseuri(uri); + } // make sure we treat `localhost:80` and `localhost` equally + + + if (!obj.port) { + if (/^(http|ws)$/.test(obj.protocol)) { + obj.port = "80"; + } else if (/^(http|ws)s$/.test(obj.protocol)) { + obj.port = "443"; + } + } + + obj.path = obj.path || "/"; + var ipv6 = obj.host.indexOf(":") !== -1; + var host = ipv6 ? "[" + obj.host + "]" : obj.host; // define unique id + + obj.id = obj.protocol + "://" + host + ":" + obj.port; // define href + + obj.href = obj.protocol + "://" + host + (loc && loc.port === obj.port ? "" : ":" + obj.port); + return obj; +} + +exports.url = url; + +/***/ }), + +/***/ "./node_modules/backo2/index.js": +/*!**************************************!*\ + !*** ./node_modules/backo2/index.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/** + * Expose `Backoff`. + */ +module.exports = Backoff; +/** + * Initialize backoff timer with `opts`. + * + * - `min` initial timeout in milliseconds [100] + * - `max` max timeout [10000] + * - `jitter` [0] + * - `factor` [2] + * + * @param {Object} opts + * @api public + */ + +function Backoff(opts) { + opts = opts || {}; + this.ms = opts.min || 100; + this.max = opts.max || 10000; + this.factor = opts.factor || 2; + this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0; + this.attempts = 0; +} +/** + * Return the backoff duration. + * + * @return {Number} + * @api public + */ + + +Backoff.prototype.duration = function () { + var ms = this.ms * Math.pow(this.factor, this.attempts++); + + if (this.jitter) { + var rand = Math.random(); + var deviation = Math.floor(rand * this.jitter * ms); + ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation; + } + + return Math.min(ms, this.max) | 0; +}; +/** + * Reset the number of attempts. + * + * @api public + */ + + +Backoff.prototype.reset = function () { + this.attempts = 0; +}; +/** + * Set the minimum duration + * + * @api public + */ + + +Backoff.prototype.setMin = function (min) { + this.ms = min; +}; +/** + * Set the maximum duration + * + * @api public + */ + + +Backoff.prototype.setMax = function (max) { + this.max = max; +}; +/** + * Set the jitter + * + * @api public + */ + + +Backoff.prototype.setJitter = function (jitter) { + this.jitter = jitter; +}; + +/***/ }), + +/***/ "./node_modules/base64-arraybuffer/lib/base64-arraybuffer.js": +/*!*******************************************************************!*\ + !*** ./node_modules/base64-arraybuffer/lib/base64-arraybuffer.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + */ +(function () { + "use strict"; + + var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. + + var lookup = new Uint8Array(256); + + for (var i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; + } + + exports.encode = function (arraybuffer) { + var bytes = new Uint8Array(arraybuffer), + i, + len = bytes.length, + base64 = ""; + + for (i = 0; i < len; i += 3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; + base64 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; + base64 += chars[bytes[i + 2] & 63]; + } + + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + "="; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + "=="; + } + + return base64; + }; + + exports.decode = function (base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + + if (base64[base64.length - 1] === "=") { + bufferLength--; + + if (base64[base64.length - 2] === "=") { + bufferLength--; + } + } + + var arraybuffer = new ArrayBuffer(bufferLength), + bytes = new Uint8Array(arraybuffer); + + for (i = 0; i < len; i += 4) { + encoded1 = lookup[base64.charCodeAt(i)]; + encoded2 = lookup[base64.charCodeAt(i + 1)]; + encoded3 = lookup[base64.charCodeAt(i + 2)]; + encoded4 = lookup[base64.charCodeAt(i + 3)]; + bytes[p++] = encoded1 << 2 | encoded2 >> 4; + bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; + bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; + } + + return arraybuffer; + }; +})(); + +/***/ }), + +/***/ "./node_modules/component-bind/index.js": +/*!**********************************************!*\ + !*** ./node_modules/component-bind/index.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/** + * Slice reference. + */ +var slice = [].slice; +/** + * Bind `obj` to `fn`. + * + * @param {Object} obj + * @param {Function|String} fn or string + * @return {Function} + * @api public + */ + +module.exports = function (obj, fn) { + if ('string' == typeof fn) fn = obj[fn]; + if ('function' != typeof fn) throw new Error('bind() requires a function'); + var args = slice.call(arguments, 2); + return function () { + return fn.apply(obj, args.concat(slice.call(arguments))); + }; +}; + +/***/ }), + +/***/ "./node_modules/component-emitter/index.js": +/*!*************************************************!*\ + !*** ./node_modules/component-emitter/index.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Expose `Emitter`. + */ +if (true) { + module.exports = Emitter; +} +/** + * Initialize a new `Emitter`. + * + * @api public + */ + + +function Emitter(obj) { + if (obj) return mixin(obj); +} + +; +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + + return obj; +} +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + +Emitter.prototype.on = Emitter.prototype.addEventListener = function (event, fn) { + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []).push(fn); + return this; +}; +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + +Emitter.prototype.once = function (event, fn) { + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + +Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function (event, fn) { + this._callbacks = this._callbacks || {}; // all + + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } // specific event + + + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; // remove all handlers + + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } // remove specific handler + + + var cb; + + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } // Remove event specific arrays for event types that no + // one is subscribed for to avoid memory leak. + + + if (callbacks.length === 0) { + delete this._callbacks['$' + event]; + } + + return this; +}; +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + + +Emitter.prototype.emit = function (event) { + this._callbacks = this._callbacks || {}; + var args = new Array(arguments.length - 1), + callbacks = this._callbacks['$' + event]; + + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + + if (callbacks) { + callbacks = callbacks.slice(0); + + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + + +Emitter.prototype.listeners = function (event) { + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + + +Emitter.prototype.hasListeners = function (event) { + return !!this.listeners(event).length; +}; + +/***/ }), + +/***/ "./node_modules/debug/src/browser.js": +/*!*******************************************!*\ + !*** ./node_modules/debug/src/browser.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(process) {function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +/** + * Colors. + */ + +exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33']; +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ +// eslint-disable-next-line complexity + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } // Internet Explorer and Edge do not support colors. + + + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + + + return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); +} +/** + * Colorize log arguments if enabled. + * + * @api public + */ + + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function (match) { + if (match === '%%') { + return; + } + + index++; + + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + args.splice(lastC, 0, c); +} +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + + +function log() { + var _console; + + // This hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments); +} +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + + +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) {// Swallow + // XXX (@Qix-) should we be logging these? + } +} +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + + +function load() { + var r; + + try { + r = exports.storage.getItem('debug'); + } catch (error) {// Swallow + // XXX (@Qix-) should we be logging these? + } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + + + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) {// Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = __webpack_require__(/*! ./common */ "./node_modules/debug/src/common.js")(exports); +var formatters = module.exports.formatters; +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"))) + +/***/ }), + +/***/ "./node_modules/debug/src/common.js": +/*!******************************************!*\ + !*** ./node_modules/debug/src/common.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ +function setup(env) { + createDebug.debug = createDebug; + createDebug["default"] = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = __webpack_require__(/*! ms */ "./node_modules/ms/index.js"); + Object.keys(env).forEach(function (key) { + createDebug[key] = env[key]; + }); + /** + * Active `debug` instances. + */ + + createDebug.instances = []; + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + + createDebug.formatters = {}; + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + + function selectColor(namespace) { + var hash = 0; + + for (var i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + + createDebug.selectColor = selectColor; + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + + function createDebug(namespace) { + var prevTime; + + function debug() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + // Disabled? + if (!debug.enabled) { + return; + } + + var self = debug; // Set `diff` timestamp + + var curr = Number(new Date()); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } // Apply any `formatters` transformations + + + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return match; + } + + index++; + var formatter = createDebug.formatters[format]; + + if (typeof formatter === 'function') { + var val = args[index]; + match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` + + args.splice(index, 1); + index--; + } + + return match; + }); // Apply env-specific formatting (colors, etc.) + + createDebug.formatArgs.call(self, args); + var logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = createDebug.enabled(namespace); + debug.useColors = createDebug.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; + debug.extend = extend; // Debug.formatArgs = formatArgs; + // debug.rawLog = rawLog; + // env-specific initialization logic for debug instances + + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + createDebug.instances.push(debug); + return debug; + } + + function destroy() { + var index = createDebug.instances.indexOf(this); + + if (index !== -1) { + createDebug.instances.splice(index, 1); + return true; + } + + return false; + } + + function extend(namespace, delimiter) { + var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + + + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.names = []; + createDebug.skips = []; + var i; + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + + for (i = 0; i < createDebug.instances.length; i++) { + var instance = createDebug.instances[i]; + instance.enabled = createDebug.enabled(instance.namespace); + } + } + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + + + function disable() { + var namespaces = [].concat(_toConsumableArray(createDebug.names.map(toNamespace)), _toConsumableArray(createDebug.skips.map(toNamespace).map(function (namespace) { + return '-' + namespace; + }))).join(','); + createDebug.enable(''); + return namespaces; + } + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + + + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + var i; + var len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + + + function toNamespace(regexp) { + return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*'); + } + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + + + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + + return val; + } + + createDebug.enable(createDebug.load()); + return createDebug; +} + +module.exports = setup; + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/globalThis.browser.js": +/*!*****************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/globalThis.browser.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function () { + if (typeof self !== "undefined") { + return self; + } else if (typeof window !== "undefined") { + return window; + } else { + return Function("return this")(); + } +}(); + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/index.js": +/*!****************************************************!*\ + !*** ./node_modules/engine.io-client/lib/index.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var Socket = __webpack_require__(/*! ./socket */ "./node_modules/engine.io-client/lib/socket.js"); + +module.exports = function (uri, opts) { + return new Socket(uri, opts); +}; +/** + * Expose deps for legacy compatibility + * and standalone browser access. + */ + + +module.exports.Socket = Socket; +module.exports.protocol = Socket.protocol; // this is an int + +module.exports.Transport = __webpack_require__(/*! ./transport */ "./node_modules/engine.io-client/lib/transport.js"); +module.exports.transports = __webpack_require__(/*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js"); +module.exports.parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/socket.js": +/*!*****************************************************!*\ + !*** ./node_modules/engine.io-client/lib/socket.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +var transports = __webpack_require__(/*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js"); + +var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); + +var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("engine.io-client:socket"); + +var parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); + +var parseuri = __webpack_require__(/*! parseuri */ "./node_modules/engine.io-client/node_modules/parseuri/index.js"); + +var parseqs = __webpack_require__(/*! parseqs */ "./node_modules/parseqs/index.js"); + +var Socket = /*#__PURE__*/function (_Emitter) { + _inherits(Socket, _Emitter); + + var _super = _createSuper(Socket); + + /** + * Socket constructor. + * + * @param {String|Object} uri or options + * @param {Object} options + * @api public + */ + function Socket(uri) { + var _this; + + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Socket); + + _this = _super.call(this); + + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = null; + } + + if (uri) { + uri = parseuri(uri); + opts.hostname = uri.host; + opts.secure = uri.protocol === "https" || uri.protocol === "wss"; + opts.port = uri.port; + if (uri.query) opts.query = uri.query; + } else if (opts.host) { + opts.hostname = parseuri(opts.host).host; + } + + _this.secure = null != opts.secure ? opts.secure : typeof location !== "undefined" && "https:" === location.protocol; + + if (opts.hostname && !opts.port) { + // if no port is specified manually, use the protocol default + opts.port = _this.secure ? "443" : "80"; + } + + _this.hostname = opts.hostname || (typeof location !== "undefined" ? location.hostname : "localhost"); + _this.port = opts.port || (typeof location !== "undefined" && location.port ? location.port : _this.secure ? 443 : 80); + _this.transports = opts.transports || ["polling", "websocket"]; + _this.readyState = ""; + _this.writeBuffer = []; + _this.prevBufferLen = 0; + _this.opts = _extends({ + path: "/engine.io", + agent: false, + upgrade: true, + jsonp: true, + timestampParam: "t", + policyPort: 843, + rememberUpgrade: false, + rejectUnauthorized: true, + perMessageDeflate: { + threshold: 1024 + }, + transportOptions: {} + }, opts); + _this.opts.path = _this.opts.path.replace(/\/$/, "") + "/"; + + if (typeof _this.opts.query === "string") { + _this.opts.query = parseqs.decode(_this.opts.query); + } // set on handshake + + + _this.id = null; + _this.upgrades = null; + _this.pingInterval = null; + _this.pingTimeout = null; // set on heartbeat + + _this.pingTimeoutTimer = null; + + _this.open(); + + return _this; + } + /** + * Creates transport of the given type. + * + * @param {String} transport name + * @return {Transport} + * @api private + */ + + + _createClass(Socket, [{ + key: "createTransport", + value: function createTransport(name) { + debug('creating transport "%s"', name); + var query = clone(this.opts.query); // append engine.io protocol identifier + + query.EIO = parser.protocol; // transport name + + query.transport = name; // session id if we already have one + + if (this.id) query.sid = this.id; + + var opts = _extends({}, this.opts.transportOptions[name], this.opts, { + query: query, + socket: this, + hostname: this.hostname, + secure: this.secure, + port: this.port + }); + + debug("options: %j", opts); + return new transports[name](opts); + } + /** + * Initializes transport to use and starts probe. + * + * @api private + */ + + }, { + key: "open", + value: function open() { + var transport; + + if (this.opts.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf("websocket") !== -1) { + transport = "websocket"; + } else if (0 === this.transports.length) { + // Emit error on next tick so it can be listened to + var self = this; + setTimeout(function () { + self.emit("error", "No transports available"); + }, 0); + return; + } else { + transport = this.transports[0]; + } + + this.readyState = "opening"; // Retry with the next transport if the transport is disabled (jsonp: false) + + try { + transport = this.createTransport(transport); + } catch (e) { + debug("error while creating transport: %s", e); + this.transports.shift(); + this.open(); + return; + } + + transport.open(); + this.setTransport(transport); + } + /** + * Sets the current transport. Disables the existing one (if any). + * + * @api private + */ + + }, { + key: "setTransport", + value: function setTransport(transport) { + debug("setting transport %s", transport.name); + var self = this; + + if (this.transport) { + debug("clearing existing transport %s", this.transport.name); + this.transport.removeAllListeners(); + } // set up transport + + + this.transport = transport; // set up transport listeners + + transport.on("drain", function () { + self.onDrain(); + }).on("packet", function (packet) { + self.onPacket(packet); + }).on("error", function (e) { + self.onError(e); + }).on("close", function () { + self.onClose("transport close"); + }); + } + /** + * Probes a transport. + * + * @param {String} transport name + * @api private + */ + + }, { + key: "probe", + value: function probe(name) { + debug('probing transport "%s"', name); + var transport = this.createTransport(name, { + probe: 1 + }); + var failed = false; + var self = this; + Socket.priorWebsocketSuccess = false; + + function onTransportOpen() { + if (self.onlyBinaryUpgrades) { + var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; + failed = failed || upgradeLosesBinary; + } + + if (failed) return; + debug('probe transport "%s" opened', name); + transport.send([{ + type: "ping", + data: "probe" + }]); + transport.once("packet", function (msg) { + if (failed) return; + + if ("pong" === msg.type && "probe" === msg.data) { + debug('probe transport "%s" pong', name); + self.upgrading = true; + self.emit("upgrading", transport); + if (!transport) return; + Socket.priorWebsocketSuccess = "websocket" === transport.name; + debug('pausing current transport "%s"', self.transport.name); + self.transport.pause(function () { + if (failed) return; + if ("closed" === self.readyState) return; + debug("changing transport and sending upgrade packet"); + cleanup(); + self.setTransport(transport); + transport.send([{ + type: "upgrade" + }]); + self.emit("upgrade", transport); + transport = null; + self.upgrading = false; + self.flush(); + }); + } else { + debug('probe transport "%s" failed', name); + var err = new Error("probe error"); + err.transport = transport.name; + self.emit("upgradeError", err); + } + }); + } + + function freezeTransport() { + if (failed) return; // Any callback called by transport should be ignored since now + + failed = true; + cleanup(); + transport.close(); + transport = null; + } // Handle any error that happens while probing + + + function onerror(err) { + var error = new Error("probe error: " + err); + error.transport = transport.name; + freezeTransport(); + debug('probe transport "%s" failed because of error: %s', name, err); + self.emit("upgradeError", error); + } + + function onTransportClose() { + onerror("transport closed"); + } // When the socket is closed while we're probing + + + function onclose() { + onerror("socket closed"); + } // When the socket is upgraded while we're probing + + + function onupgrade(to) { + if (transport && to.name !== transport.name) { + debug('"%s" works - aborting "%s"', to.name, transport.name); + freezeTransport(); + } + } // Remove all listeners on the transport and on self + + + function cleanup() { + transport.removeListener("open", onTransportOpen); + transport.removeListener("error", onerror); + transport.removeListener("close", onTransportClose); + self.removeListener("close", onclose); + self.removeListener("upgrading", onupgrade); + } + + transport.once("open", onTransportOpen); + transport.once("error", onerror); + transport.once("close", onTransportClose); + this.once("close", onclose); + this.once("upgrading", onupgrade); + transport.open(); + } + /** + * Called when connection is deemed open. + * + * @api public + */ + + }, { + key: "onOpen", + value: function onOpen() { + debug("socket open"); + this.readyState = "open"; + Socket.priorWebsocketSuccess = "websocket" === this.transport.name; + this.emit("open"); + this.flush(); // we check for `readyState` in case an `open` + // listener already closed the socket + + if ("open" === this.readyState && this.opts.upgrade && this.transport.pause) { + debug("starting upgrade probes"); + var i = 0; + var l = this.upgrades.length; + + for (; i < l; i++) { + this.probe(this.upgrades[i]); + } + } + } + /** + * Handles a packet. + * + * @api private + */ + + }, { + key: "onPacket", + value: function onPacket(packet) { + if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) { + debug('socket receive: type "%s", data "%s"', packet.type, packet.data); + this.emit("packet", packet); // Socket is live - any packet counts + + this.emit("heartbeat"); + + switch (packet.type) { + case "open": + this.onHandshake(JSON.parse(packet.data)); + break; + + case "ping": + this.resetPingTimeout(); + this.sendPacket("pong"); + this.emit("pong"); + break; + + case "error": + var err = new Error("server error"); + err.code = packet.data; + this.onError(err); + break; + + case "message": + this.emit("data", packet.data); + this.emit("message", packet.data); + break; + } + } else { + debug('packet received with socket readyState "%s"', this.readyState); + } + } + /** + * Called upon handshake completion. + * + * @param {Object} handshake obj + * @api private + */ + + }, { + key: "onHandshake", + value: function onHandshake(data) { + this.emit("handshake", data); + this.id = data.sid; + this.transport.query.sid = data.sid; + this.upgrades = this.filterUpgrades(data.upgrades); + this.pingInterval = data.pingInterval; + this.pingTimeout = data.pingTimeout; + this.onOpen(); // In case open handler closes socket + + if ("closed" === this.readyState) return; + this.resetPingTimeout(); + } + /** + * Sets and resets ping timeout timer based on server pings. + * + * @api private + */ + + }, { + key: "resetPingTimeout", + value: function resetPingTimeout() { + var _this2 = this; + + clearTimeout(this.pingTimeoutTimer); + this.pingTimeoutTimer = setTimeout(function () { + _this2.onClose("ping timeout"); + }, this.pingInterval + this.pingTimeout); + } + /** + * Called on `drain` event + * + * @api private + */ + + }, { + key: "onDrain", + value: function onDrain() { + this.writeBuffer.splice(0, this.prevBufferLen); // setting prevBufferLen = 0 is very important + // for example, when upgrading, upgrade packet is sent over, + // and a nonzero prevBufferLen could cause problems on `drain` + + this.prevBufferLen = 0; + + if (0 === this.writeBuffer.length) { + this.emit("drain"); + } else { + this.flush(); + } + } + /** + * Flush write buffers. + * + * @api private + */ + + }, { + key: "flush", + value: function flush() { + if ("closed" !== this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) { + debug("flushing %d packets in socket", this.writeBuffer.length); + this.transport.send(this.writeBuffer); // keep track of current length of writeBuffer + // splice writeBuffer and callbackBuffer on `drain` + + this.prevBufferLen = this.writeBuffer.length; + this.emit("flush"); + } + } + /** + * Sends a message. + * + * @param {String} message. + * @param {Function} callback function. + * @param {Object} options. + * @return {Socket} for chaining. + * @api public + */ + + }, { + key: "write", + value: function write(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + } + }, { + key: "send", + value: function send(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + } + /** + * Sends a packet. + * + * @param {String} packet type. + * @param {String} data. + * @param {Object} options. + * @param {Function} callback function. + * @api private + */ + + }, { + key: "sendPacket", + value: function sendPacket(type, data, options, fn) { + if ("function" === typeof data) { + fn = data; + data = undefined; + } + + if ("function" === typeof options) { + fn = options; + options = null; + } + + if ("closing" === this.readyState || "closed" === this.readyState) { + return; + } + + options = options || {}; + options.compress = false !== options.compress; + var packet = { + type: type, + data: data, + options: options + }; + this.emit("packetCreate", packet); + this.writeBuffer.push(packet); + if (fn) this.once("flush", fn); + this.flush(); + } + /** + * Closes the connection. + * + * @api private + */ + + }, { + key: "close", + value: function close() { + var self = this; + + if ("opening" === this.readyState || "open" === this.readyState) { + this.readyState = "closing"; + + if (this.writeBuffer.length) { + this.once("drain", function () { + if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + }); + } else if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + } + + function close() { + self.onClose("forced close"); + debug("socket closing - telling transport to close"); + self.transport.close(); + } + + function cleanupAndClose() { + self.removeListener("upgrade", cleanupAndClose); + self.removeListener("upgradeError", cleanupAndClose); + close(); + } + + function waitForUpgrade() { + // wait for upgrade to finish since we can't send packets while pausing a transport + self.once("upgrade", cleanupAndClose); + self.once("upgradeError", cleanupAndClose); + } + + return this; + } + /** + * Called upon transport error + * + * @api private + */ + + }, { + key: "onError", + value: function onError(err) { + debug("socket error %j", err); + Socket.priorWebsocketSuccess = false; + this.emit("error", err); + this.onClose("transport error", err); + } + /** + * Called upon transport close. + * + * @api private + */ + + }, { + key: "onClose", + value: function onClose(reason, desc) { + if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) { + debug('socket close with reason: "%s"', reason); + var self = this; // clear timers + + clearTimeout(this.pingIntervalTimer); + clearTimeout(this.pingTimeoutTimer); // stop event from firing again for transport + + this.transport.removeAllListeners("close"); // ensure transport won't stay open + + this.transport.close(); // ignore further transport communication + + this.transport.removeAllListeners(); // set ready state + + this.readyState = "closed"; // clear session id + + this.id = null; // emit close event + + this.emit("close", reason, desc); // clean buffers after, so users can still + // grab the buffers on `close` event + + self.writeBuffer = []; + self.prevBufferLen = 0; + } + } + /** + * Filters upgrades, returning only those matching client transports. + * + * @param {Array} server upgrades + * @api private + * + */ + + }, { + key: "filterUpgrades", + value: function filterUpgrades(upgrades) { + var filteredUpgrades = []; + var i = 0; + var j = upgrades.length; + + for (; i < j; i++) { + if (~this.transports.indexOf(upgrades[i])) filteredUpgrades.push(upgrades[i]); + } + + return filteredUpgrades; + } + }]); + + return Socket; +}(Emitter); + +Socket.priorWebsocketSuccess = false; +/** + * Protocol version. + * + * @api public + */ + +Socket.protocol = parser.protocol; // this is an int + +function clone(obj) { + var o = {}; + + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + o[i] = obj[i]; + } + } + + return o; +} + +module.exports = Socket; + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/transport.js": +/*!********************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transport.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +var parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); + +var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); + +var Transport = /*#__PURE__*/function (_Emitter) { + _inherits(Transport, _Emitter); + + var _super = _createSuper(Transport); + + /** + * Transport abstract constructor. + * + * @param {Object} options. + * @api private + */ + function Transport(opts) { + var _this; + + _classCallCheck(this, Transport); + + _this = _super.call(this); + _this.opts = opts; + _this.query = opts.query; + _this.readyState = ""; + _this.socket = opts.socket; + return _this; + } + /** + * Emits an error. + * + * @param {String} str + * @return {Transport} for chaining + * @api public + */ + + + _createClass(Transport, [{ + key: "onError", + value: function onError(msg, desc) { + var err = new Error(msg); + err.type = "TransportError"; + err.description = desc; + this.emit("error", err); + return this; + } + /** + * Opens the transport. + * + * @api public + */ + + }, { + key: "open", + value: function open() { + if ("closed" === this.readyState || "" === this.readyState) { + this.readyState = "opening"; + this.doOpen(); + } + + return this; + } + /** + * Closes the transport. + * + * @api private + */ + + }, { + key: "close", + value: function close() { + if ("opening" === this.readyState || "open" === this.readyState) { + this.doClose(); + this.onClose(); + } + + return this; + } + /** + * Sends multiple packets. + * + * @param {Array} packets + * @api private + */ + + }, { + key: "send", + value: function send(packets) { + if ("open" === this.readyState) { + this.write(packets); + } else { + throw new Error("Transport not open"); + } + } + /** + * Called upon open + * + * @api private + */ + + }, { + key: "onOpen", + value: function onOpen() { + this.readyState = "open"; + this.writable = true; + this.emit("open"); + } + /** + * Called with data. + * + * @param {String} data + * @api private + */ + + }, { + key: "onData", + value: function onData(data) { + var packet = parser.decodePacket(data, this.socket.binaryType); + this.onPacket(packet); + } + /** + * Called with a decoded packet. + */ + + }, { + key: "onPacket", + value: function onPacket(packet) { + this.emit("packet", packet); + } + /** + * Called upon close. + * + * @api private + */ + + }, { + key: "onClose", + value: function onClose() { + this.readyState = "closed"; + this.emit("close"); + } + }]); + + return Transport; +}(Emitter); + +module.exports = Transport; + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/transports/index.js": +/*!***************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transports/index.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ "./node_modules/engine.io-client/lib/xmlhttprequest.js"); + +var XHR = __webpack_require__(/*! ./polling-xhr */ "./node_modules/engine.io-client/lib/transports/polling-xhr.js"); + +var JSONP = __webpack_require__(/*! ./polling-jsonp */ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js"); + +var websocket = __webpack_require__(/*! ./websocket */ "./node_modules/engine.io-client/lib/transports/websocket.js"); + +exports.polling = polling; +exports.websocket = websocket; +/** + * Polling transport polymorphic constructor. + * Decides on xhr vs jsonp based on feature detection. + * + * @api private + */ + +function polling(opts) { + var xhr; + var xd = false; + var xs = false; + var jsonp = false !== opts.jsonp; + + if (typeof location !== "undefined") { + var isSSL = "https:" === location.protocol; + var port = location.port; // some user agents have empty `location.port` + + if (!port) { + port = isSSL ? 443 : 80; + } + + xd = opts.hostname !== location.hostname || port !== opts.port; + xs = opts.secure !== isSSL; + } + + opts.xdomain = xd; + opts.xscheme = xs; + xhr = new XMLHttpRequest(opts); + + if ("open" in xhr && !opts.forceJSONP) { + return new XHR(opts); + } else { + if (!jsonp) throw new Error("JSONP disabled"); + return new JSONP(opts); + } +} + +/***/ }), + +/***/ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js": +/*!***********************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transports/polling-jsonp.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +var Polling = __webpack_require__(/*! ./polling */ "./node_modules/engine.io-client/lib/transports/polling.js"); + +var globalThis = __webpack_require__(/*! ../globalThis */ "./node_modules/engine.io-client/lib/globalThis.browser.js"); + +var rNewline = /\n/g; +var rEscapedNewline = /\\n/g; +/** + * Global JSONP callbacks. + */ + +var callbacks; +/** + * Noop. + */ + +function empty() {} + +var JSONPPolling = /*#__PURE__*/function (_Polling) { + _inherits(JSONPPolling, _Polling); + + var _super = _createSuper(JSONPPolling); + + /** + * JSONP Polling constructor. + * + * @param {Object} opts. + * @api public + */ + function JSONPPolling(opts) { + var _this; + + _classCallCheck(this, JSONPPolling); + + _this = _super.call(this, opts); + _this.query = _this.query || {}; // define global callbacks array if not present + // we do this here (lazily) to avoid unneeded global pollution + + if (!callbacks) { + // we need to consider multiple engines in the same page + callbacks = globalThis.___eio = globalThis.___eio || []; + } // callback identifier + + + _this.index = callbacks.length; // add callback to jsonp global + + var self = _assertThisInitialized(_this); + + callbacks.push(function (msg) { + self.onData(msg); + }); // append to query string + + _this.query.j = _this.index; // prevent spurious errors from being emitted when the window is unloaded + + if (typeof addEventListener === "function") { + addEventListener("beforeunload", function () { + if (self.script) self.script.onerror = empty; + }, false); + } + + return _this; + } + /** + * JSONP only supports binary as base64 encoded strings + */ + + + _createClass(JSONPPolling, [{ + key: "doClose", + + /** + * Closes the socket. + * + * @api private + */ + value: function doClose() { + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + if (this.form) { + this.form.parentNode.removeChild(this.form); + this.form = null; + this.iframe = null; + } + + _get(_getPrototypeOf(JSONPPolling.prototype), "doClose", this).call(this); + } + /** + * Starts a poll cycle. + * + * @api private + */ + + }, { + key: "doPoll", + value: function doPoll() { + var self = this; + var script = document.createElement("script"); + + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + script.async = true; + script.src = this.uri(); + + script.onerror = function (e) { + self.onError("jsonp poll error", e); + }; + + var insertAt = document.getElementsByTagName("script")[0]; + + if (insertAt) { + insertAt.parentNode.insertBefore(script, insertAt); + } else { + (document.head || document.body).appendChild(script); + } + + this.script = script; + var isUAgecko = "undefined" !== typeof navigator && /gecko/i.test(navigator.userAgent); + + if (isUAgecko) { + setTimeout(function () { + var iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } + } + /** + * Writes with a hidden iframe. + * + * @param {String} data to send + * @param {Function} called upon flush. + * @api private + */ + + }, { + key: "doWrite", + value: function doWrite(data, fn) { + var self = this; + var iframe; + + if (!this.form) { + var form = document.createElement("form"); + var area = document.createElement("textarea"); + var id = this.iframeId = "eio_iframe_" + this.index; + form.className = "socketio"; + form.style.position = "absolute"; + form.style.top = "-1000px"; + form.style.left = "-1000px"; + form.target = id; + form.method = "POST"; + form.setAttribute("accept-charset", "utf-8"); + area.name = "d"; + form.appendChild(area); + document.body.appendChild(form); + this.form = form; + this.area = area; + } + + this.form.action = this.uri(); + + function complete() { + initIframe(); + fn(); + } + + function initIframe() { + if (self.iframe) { + try { + self.form.removeChild(self.iframe); + } catch (e) { + self.onError("jsonp polling iframe removal error", e); + } + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + var html = '