diff --git a/functions/index.js b/functions/index.js index 0208601..8bc0b65 100644 --- a/functions/index.js +++ b/functions/index.js @@ -4,95 +4,221 @@ const secret = require('./FirebaseSecret.json'); const express = require('express'); const cors = require('cors'); -const authenticator = (req,res,next) => { +const authenticator = (req, res, next) => { if (req.method === 'OPTIONS') { res.status(200).send(); return next(); } - + const token = req.headers.authorization.split(' ')[1]; const reqToken = token.split(':')[0]; const reqUid = token.split(':')[1]; - admin.auth().verifyIdToken(reqToken).then( user => { - if (user.uid === reqUid) { - console.log('Verified Token - UID - ', reqUid); - if (req.method === 'POST') { - const bodydata = JSON.parse(req.body); - bodydata.uid = user.uid; - req.body = JSON.stringify(bodydata); + admin + .auth() + .verifyIdToken(reqToken) + .then((user) => { + if (user.uid === reqUid) { + console.log('Verified Token - UID - ', reqUid); + if (req.method === 'POST') { + const bodydata = JSON.parse(req.body); + bodydata.uid = user.uid; + req.body = JSON.stringify(bodydata); + } + if (req.method === 'GET' || req.method === 'DELETE') { + req.body = JSON.stringify({ uid: user.uid }); + } + return next(); + } else { + return res.status(401).send('Unauthorized'); } - if (req.method === 'GET') { - req.body = JSON.stringify({uid: user.uid}); - } - return next(); - } else { - return res.status(401).send('Unauthorized'); - } - }).catch(err => { - console.log('Failed Auth - ', req.headers.authorization, '\n', err); - return res.status(500).send(err); - }); + }) + .catch((err) => { + console.log('Failed Auth - ', req.headers.authorization, '\n', err); + return res.status(500).send(err); + }); return null; }; -const createRoom = async (req,res) => { +const createRoom = async (req, res) => { const bodydata = JSON.parse(req.body); console.log('Requested Create - UID - ', bodydata.uid); if (!bodydata.userName) res.status(400).send('Missing user name'); - const roomId = await admin.firestore().collection('rooms').add({ - name: bodydata.roomName, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }).then(ref => ref.id) - .catch(err => { - console.error(err); - }); - await admin.firestore().collection('rooms').doc(roomId).collection('messages').add({ - uid: '', - name: '', - text: `${bodydata.userName} started the party.`, - time: new Date().toISOString(), - }); - await admin.firestore().collection('rooms').doc(roomId).collection('users').doc(bodydata.uid).set({ - admin: true, - name: bodydata.userName, - }); + const roomId = await admin + .firestore() + .collection('rooms') + .add({ + name: bodydata.roomName, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }) + .then((ref) => ref.id) + .catch((err) => { + console.error(err); + }); + await admin + .firestore() + .collection('rooms') + .doc(roomId) + .collection('messages') + .add({ + uid: '', + name: '', + text: `${bodydata.userName} started the party.`, + time: new Date().toISOString(), + }); + await admin + .firestore() + .collection('rooms') + .doc(roomId) + .collection('users') + .doc(bodydata.uid) + .set({ + admin: true, + name: bodydata.userName, + }); res.status(201).send({ roomId }); -} +}; const joinRoom = async (req, res) => { const bodydata = JSON.parse(req.body); - console.log('Requested Create - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.roomId); - const exists = await admin.firestore().collection('rooms').doc(bodydata.roomId).get().then(roomSnap => roomSnap.exists); - const userExists = await admin.firestore().collection('rooms').doc(bodydata.roomId).collection('users').doc(bodydata.uid).get().then(userSnap => userSnap.exists); - if (userExists) return res.status(200).send({roomId: bodydata.roomId}); + console.log('Requested Join - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.roomId); + const exists = await admin + .firestore() + .collection('rooms') + .doc(bodydata.roomId) + .get() + .then((roomSnap) => roomSnap.exists); + const userExists = await admin + .firestore() + .collection('rooms') + .doc(bodydata.roomId) + .collection('users') + .doc(bodydata.uid) + .get() + .then((userSnap) => userSnap.exists); + if (userExists) return res.status(200).send({ roomId: bodydata.roomId }); if (exists && bodydata.roomId && bodydata.userName) { - await admin.firestore().collection('rooms').doc(bodydata.roomId).collection('messages').add({ - uid: '', - name: '', - text: `${bodydata.userName} joined the party.`, - time: new Date().toISOString(), + await admin + .firestore() + .collection('rooms') + .doc(bodydata.roomId) + .collection('messages') + .add({ + uid: '', + name: '', + text: `${bodydata.userName} joined the party.`, + time: new Date().toISOString(), + }); + await admin + .firestore() + .collection('rooms') + .doc(bodydata.roomId) + .collection('users') + .doc(bodydata.uid) + .set({ + admin: false, + name: bodydata.userName, + }); + await admin.firestore().collection('rooms').doc(bodydata.roomId).update({ + updatedAt: new Date().toISOString(), }); - await admin.firestore().collection('rooms').doc(bodydata.roomId).collection('users').doc(bodydata.uid).set({ - admin: false, - name: bodydata.userName, - }); - res.status(200).send({roomId: bodydata.roomId}); + res.status(200).send({ roomId: bodydata.roomId }); } if (!bodydata.userName) res.status(400).send('Missing user name'); else res.status(404).send('Party Not Found'); -} +}; + +const sendMessage = async (req, res) => { + const { name, text, time, uid, roomId } = JSON.parse(req.body); + await admin + .firestore() + .collection('rooms') + .doc(roomId) + .collection('messages') + .add({ + name, + text, + time, + uid, + }) + .catch((messageErr) => res.status(500).send(messageErr)); + await admin.firestore().collection('rooms').doc(bodydata.roomId).update({ + updatedAt: new Date().toISOString(), + }); +}; + +const leaveRoom = async (req, res) => { + console.log('Requested Leave - UID - ', req.params.uid, '\n\tRoom - ', req.params.rid); + await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .collection('users') + .doc(req.params.uid) + .delete() + .catch((err) => res.status(500).send(err)); + res.status(200).send(); +}; + +const deleteRoom = async (req, res) => { + console.log('Requested Delete - Room - ', req.params.rid); + console.log(req.body); + const isAdmin = await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .collection('users') + .doc(JSON.parse(req.body).uid) + .get() + .then((v) => { + if (v.exists) { + return v.data().admin; + } + return false; + }); + if (!isAdmin) { + console.log('[UNAUTHORIZED] Requested Delete - Room - ', req.params.rid); + res.status(401).send(); + return; + } + await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .collection('messages') + .listDocuments() + .then((messages) => messages.forEach((message) => message.delete())) + .catch((err) => res.status(500).send(err)); + await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .collection('users') + .listDocuments() + .then((users) => users.forEach((user) => user.delete())) + .catch((err) => res.status(500).send(err)); + await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .delete() + .catch((err) => res.status(500).send(err)); + res.status(200).send(); +}; const app = express(); -app.use(cors({origin: true})); +app.use(cors({ origin: true })); app.use(authenticator); admin.initializeApp({ credential: admin.credential.cert(secret), - databaseURL: "https://watch-party-crx.firebaseio.com" + databaseURL: 'https://watch-party-crx.firebaseio.com', }); app.post('/create', createRoom); app.post('/join', joinRoom); +app.post('/message', sendMessage); +app.delete('/leave/:rid/users/:uid', leaveRoom); +app.delete('/delete/:rid', deleteRoom); -exports.widgets = functions.https.onRequest(app); \ No newline at end of file +exports.widgets = functions.https.onRequest(app); diff --git a/package-lock.json b/package-lock.json index b2bc7c1..bdb2a2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,42 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@ant-design/colors": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz", - "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==", - "requires": { - "tinycolor2": "^1.4.1" - } - }, - "@ant-design/icons": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.0.4.tgz", - "integrity": "sha512-ahfgVvTsZtRTdS90KQPOoEd+PDBLyJJKfoLqt+W/kWab86xiJUyW5yboxmvg8DSmjJup1b7OM24Qmxguv5vrIA==", - "requires": { - "@ant-design/colors": "^3.1.0", - "@ant-design/icons-svg": "^4.0.0", - "classnames": "^2.2.6", - "insert-css": "^2.0.0", - "rc-util": "^4.9.0" - } - }, - "@ant-design/icons-svg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.0.0.tgz", - "integrity": "sha512-Nai+cd3XUrv/z50gSk1FI08j6rENZ1e93rhKeLTBGwa5WrmHvhn2vowa5+voZW2qkXJn1btS6tdvTEDB90M0Pw==" - }, - "@ant-design/react-slick": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.25.5.tgz", - "integrity": "sha512-fusHR9LkarCARvYTN6cG3yz2/Ogf+HTaJ2XEihIjsjgm6uE1aSXycRFEVDpOFP1Aib51Z2Iz3tgg/gL+WbK8rQ==", - "requires": { - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "lodash": "^4.17.15", - "resize-observer-polyfill": "^1.5.0" - } - }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -1205,91 +1169,38 @@ } } }, - "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, "@firebase/analytics": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.2.18.tgz", - "integrity": "sha512-sw8TO7YYRnrcqQGYWjWHw6PTNpwWPSZzMaFgLp5oJKsKM7CoOz5K/fxEIfZIF36Zzf0Xky3oU8msek/Zjc5Phg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.3.2.tgz", + "integrity": "sha512-z4mYytlmnNipXQrGB6bN0tzWa9GzCtK0M2HD86C9OFYpwBeDQGc3UQPAM6kbfkv50Mnl4vlS5Ta2qEw/CvWwug==", "requires": { - "@firebase/analytics-types": "0.2.8", - "@firebase/component": "0.1.8", - "@firebase/installations": "0.4.6", - "@firebase/logger": "0.2.0", - "@firebase/util": "0.2.43", + "@firebase/analytics-types": "0.3.0", + "@firebase/component": "0.1.9", + "@firebase/installations": "0.4.7", + "@firebase/logger": "0.2.1", + "@firebase/util": "0.2.44", "tslib": "1.11.1" } }, "@firebase/analytics-types": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.2.8.tgz", - "integrity": "sha512-7djG+mVLubSFy5ZEf8Gyn7XzrsLvpXCRj+vj6ta3KtwF2iCsOG4HvGv1TiU+sNwR017cAm2F0qmaAMac90Qq0g==" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.3.0.tgz", + "integrity": "sha512-0AJ6xn53Qn0D/YOVHHvlWFfnzzRSdd98Lr8Oqe1PJ2HPIN+o7qf03YmOG7fLpR1uplcWd+7vGKmxUrN3jKUBwg==" }, "@firebase/app": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.0.tgz", - "integrity": "sha512-utFL07aO64ZVs9g79cv1KHomtLdKkkAeKN5e8G9NlXXuO6dZXhcHLbOmKY1AfwrkAvUzPEKkFFY3dytOIt+nlg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.1.tgz", + "integrity": "sha512-KSzSFQfiJgxi+7Ff/EZQcdvCnqKj2db9xa7I8z1UoRIRez9e0Q6+GpW3mrSVmmSCrBbKYsOO/SJh5NaFot0evg==", "requires": { "@firebase/app-types": "0.6.0", - "@firebase/component": "0.1.8", - "@firebase/logger": "0.2.0", - "@firebase/util": "0.2.43", + "@firebase/component": "0.1.9", + "@firebase/logger": "0.2.1", + "@firebase/util": "0.2.44", "dom-storage": "2.1.0", "tslib": "1.11.1", "xmlhttprequest": "1.8.0" @@ -1301,9 +1212,9 @@ "integrity": "sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA==" }, "@firebase/auth": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.1.tgz", - "integrity": "sha512-LE+QED10cjp28jJ7wwIY58HQBXoJioEWiQy7iQS8Fo2UxHGY5BvGjwnxX4yyszQPbcZZRLDSlBIUaYfog+rdEA==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.2.tgz", + "integrity": "sha512-5HaEGne2JbcVvzK9FeOEGi8NNQwq00thmL88uduqI8LTXHSOWaC8Y4El9DesVu6aFEOXELpf7W4I34CG9WwjlA==", "requires": { "@firebase/auth-types": "0.10.0" } @@ -1319,48 +1230,48 @@ "integrity": "sha512-VuW7c+RAk3AYPU0Hxmun3RzXn7fbJDdjQbxvvpRMnQ9zrhk8mH42cY466M0n4e/UGQ+0smlx5BqZII8aYQ5XPg==" }, "@firebase/component": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.8.tgz", - "integrity": "sha512-kzuCF+NVympQk3gcsHldOmDRVPVndECi6O9Wvd47HTEQYO9HsZWfOM1fHUvvHAijSzNi16p4NSM7UziuBQBL4w==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.9.tgz", + "integrity": "sha512-i58GsVpxBGnKn1rx2RCAH0rk1Ldp6WterfBNDHyxmuyRO6BaZAgvxrZ3Ku1/lqiI7XMbmmRpP3emmwrStbFt9Q==", "requires": { - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "tslib": "1.11.1" } }, "@firebase/database": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.24.tgz", - "integrity": "sha512-9whAQzU8cxDUKGBWCT/aHVmqfyzCP2RkGhbZi2oHpMrmvht7cuBtXtUbDD5R8WomniCOUP8rtQfmCFI7V9ehYw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.0.tgz", + "integrity": "sha512-b1wt4BpzFOXxAaUtkFqfoeZzmZIQ3sLiznqOYaAROnK2JMxpFF41Nh9wZ2tCze6rOkpN+3Kx33hsPCsrQcn0WQ==", "requires": { "@firebase/auth-interop-types": "0.1.4", - "@firebase/component": "0.1.8", - "@firebase/database-types": "0.4.14", - "@firebase/logger": "0.2.0", - "@firebase/util": "0.2.43", + "@firebase/component": "0.1.9", + "@firebase/database-types": "0.5.0", + "@firebase/logger": "0.2.1", + "@firebase/util": "0.2.44", "faye-websocket": "0.11.3", "tslib": "1.11.1" } }, "@firebase/database-types": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.4.14.tgz", - "integrity": "sha512-+D41HWac0HcvwMi+0dezEdSOZHpVjPKPNmpQiW2GDuS5kk27/v1jxc9v7F4ALLtpxbVcn16UZl5PqEkcS9H2Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.0.tgz", + "integrity": "sha512-6/W3frFznYOALtw2nrWVPK2ytgdl89CzTqVBHCCGf22wT6uKU63iDBo+Nw+7olFGpD15O0zwYalFIcMZ27tkew==", "requires": { "@firebase/app-types": "0.6.0" } }, "@firebase/firestore": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.12.2.tgz", - "integrity": "sha512-Obv+jqyAvYEBZHXSQs5EI0q5R8wylVz/GHHMWtkxAWpXvZjpTYZuKcvxJ9Ugi9SwhgvxbdmmnrI/4FwjQjYi7Q==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.14.0.tgz", + "integrity": "sha512-JpwP6LWtNRjCtRbRvzhdtJ1tHL6r0MjCvmMr2Nv7bKmcjqoN8FiP+fZ9KkiZiqsSUhNsFFajyvx9n7R6vC+d2w==", "requires": { - "@firebase/component": "0.1.8", + "@firebase/component": "0.1.9", "@firebase/firestore-types": "1.10.1", - "@firebase/logger": "0.2.0", - "@firebase/util": "0.2.43", + "@firebase/logger": "0.2.1", + "@firebase/util": "0.2.44", "@firebase/webchannel-wrapper": "0.2.38", + "@grpc/grpc-js": "0.7.5", "@grpc/proto-loader": "^0.5.0", - "grpc": "1.24.2", "tslib": "1.11.1" } }, @@ -1370,11 +1281,11 @@ "integrity": "sha512-vyKdm+AYUFT8XeUX62IOqaqPFCs/mAMoSEsqIz9HnSVsqCw/IocNjtjSa+3M80kRw4V8fI7JI+Xz6Wg5VJXLqA==" }, "@firebase/functions": { - "version": "0.4.38", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.38.tgz", - "integrity": "sha512-t5QkJg251FmIEEi2mh3Xrf7Q3yonSLRaUW/vhgze7A3Xy3uTIUT3BVNWuKaRmg1n0PgKQaBHCjlDoLJAdSpujg==", + "version": "0.4.40", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.40.tgz", + "integrity": "sha512-Yd0P+/xLt2Lc7AJpi1zff6xjVcJXpT7coTCBjb+58RQhECkoEh1ESx46VzoUGy+4ldoh/ZFFU7p0d/lG/+wDvg==", "requires": { - "@firebase/component": "0.1.8", + "@firebase/component": "0.1.9", "@firebase/functions-types": "0.3.16", "@firebase/messaging-types": "0.4.4", "isomorphic-fetch": "2.2.1", @@ -1387,13 +1298,13 @@ "integrity": "sha512-kHhBvSYiY2prY4vNQCALYs1+OruTdylvGemHG6G6Bs/rj3qw7ui3WysBsDU/rInJitHIcsZ35qrtanoJeQUIXQ==" }, "@firebase/installations": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.6.tgz", - "integrity": "sha512-ey8cE2ldRO4pYqg0lCWQ+XFLETHZWha3Hw1CnYJjLivk4FMM8u/es3Oa257wwtYXAUfr0UsPDfHFgYME9E9EhA==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.7.tgz", + "integrity": "sha512-Fz9B/H58xfkAnDGVTW1V/73Jd5LAN9o5dpz1K3+u2W+zp0iU6HoRTwm9Bgk+aV6/0FYjqmtYEDjK8T0OYPoIQA==", "requires": { - "@firebase/component": "0.1.8", + "@firebase/component": "0.1.9", "@firebase/installations-types": "0.3.3", - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "idb": "3.0.2", "tslib": "1.11.1" } @@ -1404,19 +1315,19 @@ "integrity": "sha512-XvWhPPAGeZlc+CfCA8jTt2pv19Jovi/nUV73u30QbjBbk5xci9bp5I29aBZukHsR6YNBjFCLSkLPbno4m/bLUg==" }, "@firebase/logger": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.0.tgz", - "integrity": "sha512-qOMnAh1JY9NkYUEy3iFviiFq0dCvk6qN2DsRy2Y7eAhHR6RqwA47l1kI+0MIXmSzlJ9akXjWAXxV5ijzr68Big==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.1.tgz", + "integrity": "sha512-H4nttTqUzEw3TA/JYl8ma6oMSNKHcdpEWV2L2qA+ZEcpM2OLAzagi//DrYBFR5xpPb17IGagpzSxFgx937Sq/A==" }, "@firebase/messaging": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.10.tgz", - "integrity": "sha512-WYnKEffG6m0EMHzib8KCWVUGno1cuBC13RrOfGWOCv/whdy9QCIZgMxH/NsY3BrYst8FnjuXEU16fi5AEf4qbg==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.12.tgz", + "integrity": "sha512-U5piZd/0JFI4/2ZqTiIGYPcQBeTit6fTUbozGn2RSKcQw6WuNb9QJDbTZCzo1BzrHf1zoIqyakggL2AvIq48vA==", "requires": { - "@firebase/component": "0.1.8", - "@firebase/installations": "0.4.6", + "@firebase/component": "0.1.9", + "@firebase/installations": "0.4.7", "@firebase/messaging-types": "0.4.4", - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "idb": "3.0.2", "tslib": "1.11.1" } @@ -1427,15 +1338,15 @@ "integrity": "sha512-JGtkr+1A1Dw7+yCqQigqBfGKtq0gTCruFScBD4MVjqZHiqGIYpnQisWnpGbkzPR6aOt6iQxgwxUhHG1ulUQGeg==" }, "@firebase/performance": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.2.36.tgz", - "integrity": "sha512-nMx3gT+ZD86MV5n460XFA1o75YYMGcs2MXrJa462rfUQtqOrtOOvdUvVtmE6cLrHsL4Y83B+VBWKHzACIPghPw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.3.0.tgz", + "integrity": "sha512-206klc2wzajagbHlR7T2GWvFHsfoRMMWLa2K3GIe6ikDGlPYa/F2byXYzv6e3mSOw6aKLSbTVcIaLBBourpOTA==", "requires": { - "@firebase/component": "0.1.8", - "@firebase/installations": "0.4.6", - "@firebase/logger": "0.2.0", + "@firebase/component": "0.1.9", + "@firebase/installations": "0.4.7", + "@firebase/logger": "0.2.1", "@firebase/performance-types": "0.0.12", - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "tslib": "1.11.1" } }, @@ -1467,15 +1378,15 @@ } }, "@firebase/remote-config": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.17.tgz", - "integrity": "sha512-jIRHXih0krVTNGYMewFVIaX8WPE1iS06fV4oMMHCCSSforGodv535uVZZ41Il29Q+22zOcyJvahoc990V0cFoA==", + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.18.tgz", + "integrity": "sha512-ufbhnP3O6bRYs74jFIyYZ0dPsv/PsMSmGs669Os5SkEdfjEWX8hnhssfuZCg5VfJQiCrqoSQD/KfPGACmeBcbQ==", "requires": { - "@firebase/component": "0.1.8", - "@firebase/installations": "0.4.6", - "@firebase/logger": "0.2.0", + "@firebase/component": "0.1.9", + "@firebase/installations": "0.4.7", + "@firebase/logger": "0.2.1", "@firebase/remote-config-types": "0.1.8", - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "tslib": "1.11.1" } }, @@ -1485,13 +1396,13 @@ "integrity": "sha512-K12IBHO7OD4gCW0FEqZL9zMqVAfS4+joC4YIn3bHezZfu3RL+Bw1wCb0cAD7RfDPcQxWJjxOHpce4YhuqSxPFA==" }, "@firebase/storage": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.30.tgz", - "integrity": "sha512-wapt4+NiEqTiLKPpsy+XbdLTN99pkqjf46Z7zqeS+vh+61cJsUT8M7YBfBb0ZN+dY6gnI5QNzviiKpykhJQbVA==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.31.tgz", + "integrity": "sha512-b5rwcMa89mFnKDlhFmGRC0QFpOgqGoNVn4klJDvSnpRGmwOcByQXoos8w1IWP0DW+EWhHcafy7DvUHFlr70onw==", "requires": { - "@firebase/component": "0.1.8", + "@firebase/component": "0.1.9", "@firebase/storage-types": "0.3.11", - "@firebase/util": "0.2.43", + "@firebase/util": "0.2.44", "tslib": "1.11.1" } }, @@ -1501,9 +1412,9 @@ "integrity": "sha512-EMOo5aeiJIa8eQ/VqjIa/DYlDcEJX1V84FOxmLfNWZIlmCSvcqx9E9mcNlOnoUB4iePqQjTMQRtKlIBvvEVhVg==" }, "@firebase/util": { - "version": "0.2.43", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.43.tgz", - "integrity": "sha512-4gGlvcoOJ48xO6PH59UOHLjvImdYXANF/1d0ao60fbiJDIKxJqMksXw3UF2zsUrRkyCOqIDLeiVuF18vffXP+g==", + "version": "0.2.44", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.44.tgz", + "integrity": "sha512-yWnFdeuz7P0QC4oC77JyPdAQ/rTGPDfhHcR5WsoMsKBBHTyqEhaKWL9HeRird+p3AL9M4++ep0FYFNd1UKU3Wg==", "requires": { "tslib": "1.11.1" } @@ -1513,104 +1424,105 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.38.tgz", "integrity": "sha512-mp1XmAJsuqaSWm5WQYo7R0zfZWe9EmwMCxsxkKr+ubLOumyNy4NG5aV45hEpFTosQv4myXpiCiS4GFE9mNqLZQ==" }, - "@giphy/js-analytics": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@giphy/js-analytics/-/js-analytics-1.5.2.tgz", - "integrity": "sha512-6/1Ji810Fb6NguzXgKHVEKvcXSQwcW6979kHMkTlgNtEODbigFy//t3Luhq9RKGlfhi44/Zn401n9+qaROR6aw==", + "@grpc/grpc-js": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.7.5.tgz", + "integrity": "sha512-hhWT+vHPtG4tn0zZJw4ndfv730pBPb+lhJfvQhc7ANBvqixtlNOaXm9VNI98wYF/em0PnrskXnOr8rHh96zjlg==", "requires": { - "@giphy/js-types": "^2.0.1", - "@giphy/js-util": "^1.8.0", - "@types/uuid": "^7.0.0", - "append-query": "^2.1.0", - "cookie": "0.4.0", - "dompurify": "^1.0.10", - "throttle-debounce": "^2.1.0", - "uuid": "^7.0.1" + "semver": "^6.2.0" }, "dependencies": { - "dompurify": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-1.0.11.tgz", - "integrity": "sha512-XywCTXZtc/qCX3iprD1pIklRVk/uhl8BKpkTxr+ZyMVUzSUg7wkQXRBp/euJ5J5moa1QvfpvaPQVP71z1O59dQ==" - }, - "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "@giphy/js-brand": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@giphy/js-brand/-/js-brand-1.1.7.tgz", - "integrity": "sha512-7EN66ckZRr598gdO4sUBNONvbgC5CXdu6mJU+3kdO9hFhV4Ue7m7y/8jcKjnk1+KJ0uDx2pHRrdvq0emMzr90w==", - "requires": { - "emotion": "10.0.9" - } - }, - "@giphy/js-fetch-api": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@giphy/js-fetch-api/-/js-fetch-api-1.5.2.tgz", - "integrity": "sha512-l3pNV23sR4z155oiCP6nLeIu+Xx0RP9WdrX5Bp9Tt7BJgzL+hkdFzEYRFq7yOf2CZ3blIsEZsjMMnmyjop0uRg==", - "requires": { - "@giphy/js-types": "^2.0.1", - "@giphy/js-util": "^1.8.0", - "cookie": "0.4.0", - "qs": "^6.7.0" - }, - "dependencies": { - "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==" - } - } - }, - "@giphy/js-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@giphy/js-types/-/js-types-2.0.1.tgz", - "integrity": "sha512-P+aLgNScCK5Pr6FoiqfV0UYqkz8W+dCHA7Pm93oVXlJhL3AHV1FD0YGxAPDp87F5XBmhhPTA2Ibu4L6meA1nXA==" - }, - "@giphy/js-util": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@giphy/js-util/-/js-util-1.8.0.tgz", - "integrity": "sha512-EHeYqshhOq8OUgBsUwgR2Z8koJ7tMCZ3SXppZC5zbadOQpMHADml5rFQupI3/tAyXEmtMp0+wpvzmZ6EtscEvQ==", - "requires": { - "@giphy/js-types": "^2.0.1", - "dompurify": "^2.0.8" - } - }, - "@giphy/moat-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@giphy/moat-loader/-/moat-loader-1.3.0.tgz", - "integrity": "sha512-76PGwwB2z+rzlVJ3fceUGoVTvu9z5uNyuergMNSR2N7QvqLq8UUJx+VCwwKk9ts9xkt50XFrU5+lnKMgSQ04Fw==" - }, - "@giphy/react-components": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@giphy/react-components/-/react-components-0.7.1.tgz", - "integrity": "sha512-GgxgQpHEQYuQTWZKTY4unHGKurUkvBOUZkd7gL7G5WxyqdsAr/EuQvEs6j4zqOf9pfMAh2L25q+FWT6mTOiMLw==", - "requires": { - "@giphy/js-analytics": "^1.5.2", - "@giphy/js-brand": "^1.1.7", - "@giphy/js-fetch-api": "^1.5.2", - "@giphy/js-types": "^2.0.1", - "@giphy/js-util": "^1.8.0", - "@giphy/moat-loader": "1.3.0", - "bricks.js": "^1.8.0", - "emotion": "10.0.9", - "intersection-observer": "^0.7.0", - "throttle-debounce": "^2.1.0" - } - }, "@grpc/proto-loader": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.3.tgz", - "integrity": "sha512-8qvUtGg77G2ZT2HqdqYoM/OY97gQd/0crSG34xNmZ4ZOsv3aQT/FQV9QfZPazTGna6MIoyUd+u6AxsoZjJ/VMQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz", + "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==", "requires": { "lodash.camelcase": "^4.3.0", "protobufjs": "^6.8.6" } }, + "@material-ui/core": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.10.tgz", + "integrity": "sha512-CQuZU9Y10RkwSdxjn785kw2EPcXhv5GKauuVQufR9LlD37kjfn21Im1yvr6wsUzn81oLhEvVPz727UWC0gbqxg==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.9.10", + "@material-ui/system": "^4.9.10", + "@material-ui/types": "^5.0.1", + "@material-ui/utils": "^4.9.6", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "^1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0", + "react-transition-group": "^4.3.0" + } + }, + "@material-ui/icons": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", + "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/styles": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.10.tgz", + "integrity": "sha512-EXIXlqVyFDnjXF6tj72y6ZxiSy+mHtrsCo3Srkm3XUeu3Z01aftDBy7ZSr3TQ02gXHTvDSBvegp3Le6p/tl7eA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.0.1", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.2", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.0.3", + "jss-plugin-camel-case": "^10.0.3", + "jss-plugin-default-unit": "^10.0.3", + "jss-plugin-global": "^10.0.3", + "jss-plugin-nested": "^10.0.3", + "jss-plugin-props-sort": "^10.0.3", + "jss-plugin-rule-value-function": "^10.0.3", + "jss-plugin-vendor-prefixer": "^10.0.3", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.10.tgz", + "integrity": "sha512-E+t0baX2TBZk6ALm8twG6objpsxLdMM4MDm1++LMt2m7CetCAEc3aIAfDaprk4+tm5hFT1Cah5dRWk8EeIFQYw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.9.6", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.1.tgz", + "integrity": "sha512-wURPSY7/3+MAtng3i26g+WKwwNE3HEeqa/trDBR5+zWKmcjO+u9t7Npu/J1r+3dmIa/OeziN9D/18IrBKvKffw==" + }, + "@material-ui/utils": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.9.6.tgz", + "integrity": "sha512-gqlBn0JPPTUZeAktn1rgMcy9Iczrr74ecx31tyZLVGdBGGzsxzM6PP6zeS7FuoLS6vG4hoZP7hWnOoHtkR0Kvw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1679,15 +1591,6 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, - "@types/bytebuffer": { - "version": "5.0.40", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.40.tgz", - "integrity": "sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==", - "requires": { - "@types/long": "*", - "@types/node": "*" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1714,25 +1617,6 @@ "@types/node": "*" } }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - } - } - }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -1765,32 +1649,22 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/react": { - "version": "16.9.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.26.tgz", - "integrity": "sha512-dGuSM+B0Pq1MKXYUMlUQWeS6Jj9IhSAUf9v8Ikaimj+YhkBcQrihWBkmyEhK/1fzkJTwZQkhZp5YhmWa2CH+Rw==", + "version": "16.9.34", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.34.tgz", + "integrity": "sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, - "@types/react-lifecycles-compat": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/react-lifecycles-compat/-/react-lifecycles-compat-3.0.1.tgz", - "integrity": "sha512-4KiU5s1Go4xRbf7t6VxUUpBeN5PGjpjpBv9VvET4uiPHC500VNYBclU13f8ehHkHoZL39b2cfwHu6RzbV3b44A==", + "@types/react-transition-group": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.4.tgz", + "integrity": "sha512-8DMUaDqh0S70TjkqU0DxOu80tFUiiaS9rxkWip/nb7gtvAsbqOXm02UCmR8zdcjWujgeYPiPNTVpVpKzUDotwA==", "requires": { "@types/react": "*" } }, - "@types/shallowequal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz", - "integrity": "sha512-Lhni3aX80zbpdxRuWhnuYPm8j8UQaa571lHP/xI4W+7BAFhSIhRReXnqjEgT/XzPoXZTJkCqstFMJ8CZTK6IlQ==" - }, - "@types/uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-8Ly3zIPTnT0/8RCU6Kg/G3uTICf9sRwYOpUzSIM3503tLIKcnJPRuinHhXngJUy2MntrEf6dlpOHXJju90Qh5w==" - }, "@typescript-eslint/eslint-plugin": { "version": "2.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz", @@ -2125,14 +1999,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, - "add-dom-event-listener": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", - "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", - "requires": { - "object-assign": "4.x" - } - }, "address": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", @@ -2239,67 +2105,6 @@ "color-convert": "^1.9.0" } }, - "antd": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/antd/-/antd-4.0.4.tgz", - "integrity": "sha512-wPcUzQBDDEFrA2L7b1HOHcVhXZk11nl773XQHb6wtQR6NANY11T8xNJ3GRZ/yB3sfzsWqXYCBGBui/12Dmu3nQ==", - "requires": { - "@ant-design/icons": "^4.0.0", - "@ant-design/react-slick": "~0.25.5", - "array-tree-filter": "^2.1.0", - "classnames": "~2.2.6", - "copy-to-clipboard": "^3.2.0", - "css-animation": "^1.5.0", - "lodash": "^4.17.13", - "moment": "^2.24.0", - "omit.js": "^1.0.2", - "prop-types": "^15.7.2", - "raf": "^3.4.1", - "rc-animate": "~2.10.2", - "rc-cascader": "~1.0.0", - "rc-checkbox": "~2.1.6", - "rc-collapse": "~1.11.3", - "rc-dialog": "~7.6.0", - "rc-drawer": "~3.1.1", - "rc-dropdown": "~3.0.0", - "rc-field-form": "~1.0.0", - "rc-input-number": "~4.5.4", - "rc-mentions": "~1.0.0", - "rc-menu": "~8.0.1", - "rc-notification": "~4.0.0", - "rc-pagination": "~2.0.1", - "rc-picker": "~1.1.0", - "rc-progress": "~2.5.0", - "rc-rate": "~2.5.1", - "rc-resize-observer": "^0.1.0", - "rc-select": "~10.0.0", - "rc-slider": "~9.2.3", - "rc-steps": "~3.5.0", - "rc-switch": "~1.9.0", - "rc-table": "~7.3.0", - "rc-tabs": "~10.0.0", - "rc-tooltip": "~4.0.2", - "rc-tree": "~3.0.0", - "rc-tree-select": "~3.0.0", - "rc-trigger": "~4.0.0", - "rc-upload": "~3.0.0", - "rc-util": "^4.20.0", - "rc-virtual-list": "~1.0.0", - "resize-observer-polyfill": "^1.5.1", - "scroll-into-view-if-needed": "^2.2.20", - "warning": "~4.0.3" - }, - "dependencies": { - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - } - } - }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", @@ -2309,21 +2114,6 @@ "normalize-path": "^2.0.0" } }, - "append-query": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/append-query/-/append-query-2.1.0.tgz", - "integrity": "sha512-v9YXX6No91QkRA31IvTjl+1kFU+A0DaOzZpCNR7Q/ZoPSXlo5a4W2eS0qos6AKvCKL4MnNna78xgqIG8NRvQwg==", - "requires": { - "extend": "^2.0.0" - }, - "dependencies": { - "extend": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.2.tgz", - "integrity": "sha512-AgFD4VU+lVLP6vjnlNfF7OeInLTyeyckCNPEsuxz1vi786UuK/nk6ynPuhn/h+Ju9++TQyr5EpLRI14fc1QtTQ==" - } - } - }, "append-transform": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", @@ -2398,11 +2188,6 @@ "is-string": "^1.0.5" } }, - "array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -2440,15 +2225,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -2533,11 +2309,6 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, - "async-validator": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.2.4.tgz", - "integrity": "sha512-mTgzMJixkrh+5t2gbYoua8MLy11GHkQqFE6tbhY5Aqc4jEDGsR4BWP+sVQiYDHtzTMB8WIwI/ypObTVPcTZInw==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2793,30 +2564,6 @@ "object.assign": "^4.1.0" } }, - "babel-plugin-emotion": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz", - "integrity": "sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, "babel-plugin-istanbul": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", @@ -2853,11 +2600,6 @@ } } }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", @@ -3204,14 +2946,6 @@ "repeat-element": "^1.1.2" } }, - "bricks.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bricks.js/-/bricks.js-1.8.0.tgz", - "integrity": "sha1-j96zwCJq8lH01XJ6fff5rACStLI=", - "requires": { - "knot.js": "^1.1.5" - } - }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -3359,14 +3093,6 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "requires": { - "long": "~3" - } - }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -3946,11 +3672,6 @@ } } }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, "clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -4012,6 +3733,11 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4085,11 +3811,6 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4108,24 +3829,11 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "component-classes": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "requires": { - "component-indexof": "0.0.3" - } - }, "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-indexof": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4148,11 +3856,6 @@ "vary": "~1.1.2" } }, - "compute-scroll-into-view": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.13.tgz", - "integrity": "sha512-o+w9w7A98aAFi/GjK8cxSV+CdASuPa2rR5UWs3+yHkJzWqaKoBEufFNWYaXInCSmUfDCVhesG+v9MTWqOjsxFg==" - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4291,14 +3994,6 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, - "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", @@ -4381,17 +4076,6 @@ "elliptic": "^6.0.0" } }, - "create-emotion": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-10.0.27.tgz", - "integrity": "sha512-fIK73w82HPPn/RsAij7+Zt8eCE8SptcJ3WoRMfxMtjteYxud8GDTKKld7MYwAX2TVhrw29uR1N/bVGxeStHILg==", - "requires": { - "@emotion/cache": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -4463,15 +4147,6 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, - "css-animation": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", - "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==", - "requires": { - "babel-runtime": "6.x", - "component-classes": "^1.2.5" - } - }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -4550,6 +4225,15 @@ "regexpu-core": "^4.6.0" } }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -4682,9 +4366,9 @@ } }, "csstype": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", - "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", + "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==" }, "currently-unhandled": { "version": "0.4.1", @@ -5011,11 +4695,6 @@ "esutils": "^2.0.2" } }, - "dom-align": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.11.1.tgz", - "integrity": "sha512-hN42DmUgtweBx0iBjDLO4WtKOMcK8yBmPx/fgdsgQadLuzPu/8co3oLdK5yMmeM/vnUd3yDyV6qV8/NzxBexQg==" - }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5024,6 +4703,15 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^2.6.7" + } + }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -5072,11 +4760,6 @@ "domelementtype": "1" } }, - "dompurify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.8.tgz", - "integrity": "sha512-vIOSyOXkMx81ghEalh4MLBtDHMx1bhKlaqHDMqM2yeitJ996SLOk5mGdDpI9ifJAgokred8Rmu219fX4OltqXw==" - }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -5205,15 +4888,6 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, - "emotion": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/emotion/-/emotion-10.0.9.tgz", - "integrity": "sha512-IMFwwWlU2TDt7eh4v6dm58E8VHAYOitqRbVoazQdxIu9/0CAH4a3UrTMnZSlWQAo09MrRRlKfgQFHswnj40meQ==", - "requires": { - "babel-plugin-emotion": "^10.0.9", - "create-emotion": "^10.0.9" - } - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -6391,11 +6065,6 @@ "pkg-dir": "^1.0.0" } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -6405,24 +6074,24 @@ } }, "firebase": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.12.0.tgz", - "integrity": "sha512-OXOOYE1RATpkBPEbiwW4qlz/raXkpAEqtxXeRKDIqJcSuzK2oyBVj5zrME1sqk77e0gjIlpbvpV0Vm36cFgpYg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.14.0.tgz", + "integrity": "sha512-4QjP8WxVwVh6lvP8I96Wg11coJQ8si093xxUmafdOL7hWzG8u80EdlJOClK9zG8R37OjJRNsmXdslqFiJoGK5g==", "requires": { - "@firebase/analytics": "0.2.18", - "@firebase/app": "0.6.0", + "@firebase/analytics": "0.3.2", + "@firebase/app": "0.6.1", "@firebase/app-types": "0.6.0", - "@firebase/auth": "0.14.1", - "@firebase/database": "0.5.24", - "@firebase/firestore": "1.12.2", - "@firebase/functions": "0.4.38", - "@firebase/installations": "0.4.6", - "@firebase/messaging": "0.6.10", - "@firebase/performance": "0.2.36", + "@firebase/auth": "0.14.2", + "@firebase/database": "0.6.0", + "@firebase/firestore": "1.14.0", + "@firebase/functions": "0.4.40", + "@firebase/installations": "0.4.7", + "@firebase/messaging": "0.6.12", + "@firebase/performance": "0.3.0", "@firebase/polyfill": "0.3.33", - "@firebase/remote-config": "0.1.17", - "@firebase/storage": "0.3.30", - "@firebase/util": "0.2.43" + "@firebase/remote-config": "0.1.18", + "@firebase/storage": "0.3.31", + "@firebase/util": "0.2.44" } }, "flat-cache": { @@ -7574,454 +7243,6 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, - "grpc": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.2.tgz", - "integrity": "sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==", - "requires": { - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "node-pre-gyp": "^0.14.0", - "protobufjs": "^5.0.3" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "chownr": { - "version": "1.1.3", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.4", - "bundled": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "ms": { - "version": "2.1.2", - "bundled": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true - }, - "npm-packlist": { - "version": "1.4.6", - "bundled": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": 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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true - }, - "sax": { - "version": "1.2.4", - "bundled": true - }, - "semver": { - "version": "5.7.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, "gzip-size": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", @@ -8038,25 +7259,28 @@ } } }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" - }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } } }, "har-schema": { @@ -8190,9 +7414,12 @@ } }, "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } }, "home-or-tmp": { "version": "2.0.0", @@ -8644,6 +7871,11 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "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", @@ -8885,11 +8117,6 @@ } } }, - "insert-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", - "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" - }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -8915,11 +8142,6 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "intersection-observer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", - "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==" - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -9081,6 +8303,11 @@ "is-extglob": "^1.0.0" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", @@ -9760,14 +8987,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", - "requires": { - "string-convert": "^0.2.0" - } - }, "json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -9802,6 +9021,83 @@ "verror": "1.10.0" } }, + "jss": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.1.1.tgz", + "integrity": "sha512-Xz3qgRUFlxbWk1czCZibUJqhVPObrZHxY3FPsjCXhDld4NOj1BgM14Ir5hVm+Qr6OLqVljjGvoMcCdXNOAbdkQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^2.6.5", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.1.1.tgz", + "integrity": "sha512-MDIaw8FeD5uFz1seQBKz4pnvDLnj5vIKV5hXSVdMaAVq13xR6SVTVWkIV/keyTs5txxTvzGJ9hXoxgd1WTUlBw==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.1.1" + } + }, + "jss-plugin-default-unit": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz", + "integrity": "sha512-UkeVCA/b3QEA4k0nIKS4uWXDCNmV73WLHdh2oDGZZc3GsQtlOCuiH3EkB/qI60v2MiCq356/SYWsDXt21yjwdg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-global": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz", + "integrity": "sha512-VBG3wRyi3Z8S4kMhm8rZV6caYBegsk+QnQZSVmrWw6GVOT/Z4FA7eyMu5SdkorDlG/HVpHh91oFN56O4R9m2VA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-nested": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.1.1.tgz", + "integrity": "sha512-ozEu7ZBSVrMYxSDplPX3H82XHNQk2DQEJ9TEyo7OVTPJ1hEieqjDFiOQOxXEj9z3PMqkylnUbvWIZRDKCFYw5Q==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.1.1.tgz", + "integrity": "sha512-g/joK3eTDZB4pkqpZB38257yD4LXB0X15jxtZAGbUzcKAVUHPl9Jb47Y7lYmiGsShiV4YmQRqG1p2DHMYoK91g==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.1.1.tgz", + "integrity": "sha512-ClV1lvJ3laU9la1CUzaDugEcwnpjPTuJ0yGy2YtcU+gG/w9HMInD5vEv7xKAz53Bk4WiJm5uLOElSEshHyhKNw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz", + "integrity": "sha512-09MZpQ6onQrhaVSF6GHC4iYifQ7+4YC/tAP6D4ZWeZotvCMq1mHLqNKRIaqQ2lkgANjlEot2JnVi1ktu4+L4pw==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.7", + "jss": "10.1.1" + } + }, "jsx-ast-utils": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", @@ -9824,11 +9120,6 @@ "is-buffer": "^1.1.5" } }, - "knot.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/knot.js/-/knot.js-1.1.5.tgz", - "integrity": "sha1-KOclIvcD9Q/piBL94iTdcnKP710=" - }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", @@ -9943,11 +9234,6 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -9986,9 +9272,9 @@ "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" }, "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "loose-envify": { "version": "1.4.0", @@ -10267,21 +9553,6 @@ } } }, - "mini-store": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.1.tgz", - "integrity": "sha512-6cQjjfUoL53+E0oUd5gQs9/rMicXG7lbK3dgzAMv2qPOnA+cR3yIB/CcAN3YKsFVt01/hOO0lf0M+a+6/lQRdg==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react-lifecycles-compat": "^3.0.1", - "@types/shallowequal": "^1.1.1", - "hoist-non-react-statics": "^2.3.1", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.0.2", - "typescript": "^3.8.3" - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10351,11 +9622,6 @@ "minimist": "^1.2.5" } }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -10397,7 +9663,8 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true }, "nanomatch": { "version": "1.2.13", @@ -10797,14 +10064,6 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, - "omit.js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz", - "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==", - "requires": { - "babel-runtime": "^6.23.0" - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -10850,22 +10109,6 @@ "is-wsl": "^1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - } - } - }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -10879,11 +10122,6 @@ "word-wrap": "~1.2.3" } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" - }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -11265,6 +10503,11 @@ } } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", @@ -12627,14 +11870,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", - "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "10.17.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", + "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==" } } }, @@ -12838,438 +12076,6 @@ } } }, - "rc-align": { - "version": "3.0.0-rc.1", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-3.0.0-rc.1.tgz", - "integrity": "sha512-GbofumhCUb7SxP410j/fbtR2M9Zml+eoZSdaliZh6R3NhfEj5zP4jcO3HG3S9C9KIcXQQtd/cwVHkb9Y0KU7Hg==", - "requires": { - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^4.12.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-animate": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.10.3.tgz", - "integrity": "sha512-A9qQ5Y8BLlM7EhuCO3fWb/dChndlbWtY/P5QvPqBU7h4r5Q2QsvsbpTGgdYZATRDZbTRnJXXfVk9UtlyS7MBLg==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.6", - "css-animation": "^1.3.2", - "prop-types": "15.x", - "raf": "^3.4.0", - "rc-util": "^4.15.3", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-cascader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.0.1.tgz", - "integrity": "sha512-3mk33+YKJBP1XSrTYbdVLuCC73rUDq5STNALhvua5i8vyIgIxtb5fSl96JdWWq1Oj8tIBoHnCgoEoOYnIXkthQ==", - "requires": { - "array-tree-filter": "^2.1.0", - "rc-trigger": "^4.0.0", - "rc-util": "^4.0.4", - "warning": "^4.0.1" - } - }, - "rc-checkbox": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.1.8.tgz", - "integrity": "sha512-6qOgh0/by0nVNASx6LZnhRTy17Etcgav+IrI7kL9V9kcDZ/g7K14JFlqrtJ3NjDq/Kyn+BPI1st1XvbkhfaJeg==", - "requires": { - "babel-runtime": "^6.23.0", - "classnames": "2.x", - "prop-types": "15.x", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-collapse": { - "version": "1.11.8", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-1.11.8.tgz", - "integrity": "sha512-8EhfPyScTYljkbRuIoHniSwZagD5UPpZ3CToYgoNYWC85L2qCbPYF7+OaC713FOrIkp6NbfNqXsITNxmDAmxog==", - "requires": { - "classnames": "2.x", - "css-animation": "1.x", - "prop-types": "^15.5.6", - "rc-animate": "2.x", - "react-is": "^16.7.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "rc-dialog": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-7.6.1.tgz", - "integrity": "sha512-KUKf+2eZ4YL+lnXMG3hR4ZtIhC9glfH27NtTVz3gcoDIPAf3uUvaXVRNoDCiSi+OGKLyIb/b6EoidFh6nQC5Wg==", - "requires": { - "babel-runtime": "6.x", - "rc-animate": "2.x", - "rc-util": "^4.16.1" - } - }, - "rc-drawer": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-3.1.3.tgz", - "integrity": "sha512-2z+RdxmzXyZde/1OhVMfDR1e/GBswFeWSZ7FS3Fdd0qhgVdpV1wSzILzzxRaT481ItB5hOV+e8pZT07vdJE8kg==", - "requires": { - "classnames": "^2.2.6", - "rc-util": "^4.16.1", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-dropdown": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.0.2.tgz", - "integrity": "sha512-T3XP4qL6xmkxn8z52YF2SEPoMHPpBiLf0Kty3mjNdRSyKnlu+0F+3bhDHf6gO1msmqrjURaz8sMNAFDcoFHHnw==", - "requires": { - "babel-runtime": "^6.26.0", - "classnames": "^2.2.6", - "rc-trigger": "^4.0.0" - } - }, - "rc-field-form": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.0.1.tgz", - "integrity": "sha512-0m9ydH+XQtEwdTOrUgGqv0q6WCDQKNqwHiUB4fKZUdpLze/7i7gGIDVAc6CUNiTMb2Y5+V+wPtYhF4rBPhsX3g==", - "requires": { - "@babel/runtime": "^7.8.4", - "async-validator": "^3.0.3", - "rc-util": "^4.17.0", - "warning": "^4.0.3" - } - }, - "rc-hammerjs": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/rc-hammerjs/-/rc-hammerjs-0.6.9.tgz", - "integrity": "sha512-4llgWO3RgLyVbEqUdGsDfzUDqklRlQW5VEhE3x35IvhV+w//VPRG34SBavK3D2mD/UaLKaohgU41V4agiftC8g==", - "requires": { - "babel-runtime": "6.x", - "hammerjs": "^2.0.8", - "prop-types": "^15.5.9" - } - }, - "rc-input-number": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-4.5.6.tgz", - "integrity": "sha512-AXbL4gtQ1mSQnu6v/JtMv3UbGRCzLvQznmf0a7U/SAtZ8+dCEAqD4JpJhkjv73Wog53eRYhw4l7ApdXflc9ymg==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.0", - "prop-types": "^15.5.7", - "rc-util": "^4.5.1", - "rmc-feedback": "^2.0.0" - } - }, - "rc-mentions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.0.1.tgz", - "integrity": "sha512-EgXFYsNHk44ifwDcbtd3zX7rJc3lHplfVEVEf8oxZeeyyIzFD0GLs0Z0LWHNs6Gm4wTAHvcR0j4Pd5M7fLtBoA==", - "requires": { - "classnames": "^2.2.6", - "rc-menu": "^8.0.1", - "rc-trigger": "^4.0.0", - "rc-util": "^4.6.0" - } - }, - "rc-menu": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.0.3.tgz", - "integrity": "sha512-a37l9MfzjXt8/q5en6ukjD2PoVsHCzWeRPdFK9eWi6hF5/9M3mfxgUt1LruQvaJKMQUxDyN5+4M8FsYULXJALw==", - "requires": { - "classnames": "2.x", - "mini-store": "^3.0.1", - "rc-animate": "^2.10.1", - "rc-trigger": "^4.0.0", - "rc-util": "^4.13.0", - "resize-observer-polyfill": "^1.5.0", - "scroll-into-view-if-needed": "^2.2.20", - "shallowequal": "^1.1.0" - } - }, - "rc-notification": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.0.0.tgz", - "integrity": "sha512-In9FimkJY+JSIq3/eopPfBpQQr2Zugq5i9Aw9vdiNCGCsAsSO9bGq2dPsn8bamOydNrhc3djljGfmxUUMbcZnA==", - "requires": { - "classnames": "2.x", - "rc-animate": "2.x", - "rc-util": "^4.0.4" - } - }, - "rc-pagination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-2.0.1.tgz", - "integrity": "sha512-jvLb05p1OEBUxRobWFjnrj6vRyvhG8XHouK6qh+eepCHPo7HDzUHHztvUUAWr5f+WnKldAXqdPcGgbM4rCH1OA==", - "requires": { - "classnames": "^2.2.1" - } - }, - "rc-picker": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-1.1.5.tgz", - "integrity": "sha512-4Ea42Yg/0J95typselVZj4kDu+eNKT1s31tFwAbLNnzCg3l6VUe9jtSLNMkl1rHWICg+RNmeuM0Ua1NAHpXR7Q==", - "requires": { - "classnames": "^2.2.1", - "moment": "^2.24.0", - "rc-trigger": "^4.0.0", - "rc-util": "^4.17.0", - "shallowequal": "^1.1.0" - } - }, - "rc-progress": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-2.5.2.tgz", - "integrity": "sha512-ajI+MJkbBz9zYDuE9GQsY5gsyqPF7HFioZEDZ9Fmc+ebNZoiSeSJsTJImPFCg0dW/5WiRGUy2F69SX1aPtSJgA==", - "requires": { - "babel-runtime": "6.x", - "prop-types": "^15.5.8" - } - }, - "rc-rate": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.5.1.tgz", - "integrity": "sha512-3iJkNJT8xlHklPCdeZtUZmJmRVUbr6AHRlfSsztfYTXVlHrv2TcPn3XkHsH+12j812WVB7gvilS2j3+ffjUHXg==", - "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.5.8", - "rc-util": "^4.3.0", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-resize-observer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-0.1.3.tgz", - "integrity": "sha512-uzOQEwx83xdQSFOkOAM7x7GHIQKYnrDV4dWxtCxyG1BS1pkfJ4EvDeMfsvAJHSYkQXVBu+sgRHGbRtLG3qiuUg==", - "requires": { - "classnames": "^2.2.1", - "rc-util": "^4.13.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-select": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-10.0.4.tgz", - "integrity": "sha512-yYua9bsg23GKrsp99kenqbzxt/Snvg2rIusUs+APhgOV3IBlZhfznOOnqQxFHHZa1sdc5hYt6qsWxjtFm8grtQ==", - "requires": { - "classnames": "2.x", - "rc-animate": "^2.10.0", - "rc-trigger": "^4.0.0", - "rc-util": "^4.20.0", - "rc-virtual-list": "^1.0.0", - "warning": "^4.0.3" - } - }, - "rc-slider": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.4.tgz", - "integrity": "sha512-wSr7vz+WtzzGqsGU2rTQ4mmLz9fkuIDMPYMYm8ygYFvxQ2Rh4uRhOWHYI0R8krNK5k1bGycckYxmQqUIvLAh3w==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5", - "rc-tooltip": "^4.0.0", - "rc-util": "^4.0.4", - "shallowequal": "^1.1.0", - "warning": "^4.0.3" - } - }, - "rc-steps": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-3.5.0.tgz", - "integrity": "sha512-2Vkkrpa7PZbg7qPsqTNzVDov4u78cmxofjjnIHiGB9+9rqKS8oTLPzbW2uiWDr3Lk+yGwh8rbpGO1E6VAgBCOg==", - "requires": { - "babel-runtime": "^6.23.0", - "classnames": "^2.2.3", - "lodash": "^4.17.5", - "prop-types": "^15.5.7" - } - }, - "rc-switch": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-1.9.0.tgz", - "integrity": "sha512-Isas+egaK6qSk64jaEw4GgPStY4umYDbT7ZY93bZF1Af+b/JEsKsJdNOU2qG3WI0Z6tXo2DDq0kJCv8Yhu0zww==", - "requires": { - "classnames": "^2.2.1", - "prop-types": "^15.5.6", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-table": { - "version": "7.3.14", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.3.14.tgz", - "integrity": "sha512-ivfV+hiFU4IeLEERs1KVfEHysi0o9T4RGLwoPBpCa/vq/racaYcjSEQnocUeKVu7Rpbr98QSRdgYbZt0oD6baw==", - "requires": { - "classnames": "^2.2.5", - "component-classes": "^1.2.6", - "lodash": "^4.17.5", - "mini-store": "^2.0.0", - "prop-types": "^15.5.8", - "raf": "^3.4.1", - "rc-resize-observer": "^0.2.0", - "rc-util": "^4.20.1", - "react-lifecycles-compat": "^3.0.2", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "mini-store": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-2.0.0.tgz", - "integrity": "sha512-EG0CuwpQmX+XL4QVS0kxNwHW5ftSbhygu1qxQH0pipugjnPkbvkalCdQbEihMwtQY6d3MTN+MS0q+aurs+RfLQ==", - "requires": { - "hoist-non-react-statics": "^2.3.1", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.0.2" - } - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "rc-resize-observer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-0.2.1.tgz", - "integrity": "sha512-GENTRkL3lq05ilrjTxPpHUPrKTC9D7XqUGesSXgi/GyO4j/jKIjLPn7zuZOcJ5QmN5QGRe24IaVWPZHQPE6vLw==", - "requires": { - "classnames": "^2.2.1", - "rc-util": "^4.14.0", - "resize-observer-polyfill": "^1.5.1" - } - } - } - }, - "rc-tabs": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-10.0.0.tgz", - "integrity": "sha512-kpYho3S8GqHVKuFvsYyShN4GSM+f3RMfgwxmR4lpXA79lzPmIlaLamCGtTnMAOXOVTS3JEltWQCWC8LYY4ITIg==", - "requires": { - "babel-runtime": "6.x", - "classnames": "2.x", - "lodash": "^4.17.5", - "prop-types": "15.x", - "raf": "^3.4.1", - "rc-hammerjs": "~0.6.0", - "rc-util": "^4.0.4", - "resize-observer-polyfill": "^1.5.1", - "warning": "^4.0.3" - }, - "dependencies": { - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - } - } - }, - "rc-tooltip": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.0.3.tgz", - "integrity": "sha512-HNyBh9/fPdds0DXja8JQX0XTIHmZapB3lLzbdn74aNSxXG1KUkt+GK4X1aOTRY5X9mqm4uUKdeFrn7j273H8gw==", - "requires": { - "rc-trigger": "^4.0.0" - } - }, - "rc-tree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-3.0.2.tgz", - "integrity": "sha512-5MJgIuP3R2QOuv+xuvttv0BVC6BJVz4PIqgZzk9oaGCN5WryPI30SrVCB3t0QO58gdf6tTQszI5aGEgN9PLQtQ==", - "requires": { - "classnames": "2.x", - "prop-types": "^15.5.8", - "rc-animate": "^2.9.2", - "rc-util": "^4.11.0", - "rc-virtual-list": "^1.0.0", - "react-lifecycles-compat": "^3.0.4" - } - }, - "rc-tree-select": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-3.0.5.tgz", - "integrity": "sha512-C/3fZywOoHz/XvRUvfvH+Xd3gnOD24P1FDitNx+1E8E9kT3n+MUUfLWIaSnlU1b9djaMMJojGI1ODUjGlk/RAw==", - "requires": { - "classnames": "2.x", - "rc-select": "~10.0.0", - "rc-tree": "~3.0.0", - "rc-util": "^4.17.0" - } - }, - "rc-trigger": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.0.2.tgz", - "integrity": "sha512-to5S1NhK10rWHIgQpoQdwIhuDc2Ok4R4/dh5NLrDt6C+gqkohsdBCYiPk97Z+NwGhRU8N+dbf251bivX8DkzQg==", - "requires": { - "classnames": "^2.2.6", - "prop-types": "15.x", - "raf": "^3.4.1", - "rc-align": "^3.0.0-rc.0", - "rc-animate": "^2.10.2", - "rc-util": "^4.20.0" - }, - "dependencies": { - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - } - } - }, - "rc-upload": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-3.0.0.tgz", - "integrity": "sha512-GTmLJ2Habrgon26xwtF8nx1FBxu8KUjRC6QW/7a+NVZ6qXIo+s7HnjqwseuG42kz6xGCoSLNpHgIoHW55EwpxA==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5" - } - }, - "rc-util": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.20.2.tgz", - "integrity": "sha512-HfwAfl818hfqn41i1WK0Edt2tNk/BSl8yBz7/rUHOcEqMdWc5ASA3swJDAqJNa1ISzCHrpf2PONukkuHr3tIkA==", - "requires": { - "@babel/runtime": "^7.9.2", - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "rc-virtual-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-1.0.1.tgz", - "integrity": "sha512-lqee1WuBXz6wUGr77g5bB1BHO9JQH+R1DX1oU0JbTLQs7bJl5JWk0xlX6UbB7VMtUss15+XiV7cyvlXVq6xzjg==", - "requires": { - "classnames": "^2.2.6", - "rc-util": "^4.8.0" - } - }, "react": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", @@ -13599,10 +12405,16 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } }, "read-pkg": { "version": "1.1.0", @@ -14171,11 +12983,6 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, "resolve": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", @@ -14246,14 +13053,10 @@ "inherits": "^2.0.1" } }, - "rmc-feedback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz", - "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5" - } + "route-lite": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/route-lite/-/route-lite-0.3.0.tgz", + "integrity": "sha512-5A5Mh7gbQfk1P7u0jh0O87vu+/zAyS1xx16YO6ds+4oeLR6cuVtncEA8/d4qevSBv4hijvLloI+IKybtZMUB9g==" }, "run-async": { "version": "2.4.0", @@ -14353,14 +13156,6 @@ "ajv-keywords": "^3.4.1" } }, - "scroll-into-view-if-needed": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.24.tgz", - "integrity": "sha512-vsC6SzyIZUyJG8o4nbUDCiIwsPdH6W/FVmjT2avR2hp/yzS53JjGmg/bKD20TkoNajbu5dAQN4xR7yes4qhwtQ==", - "requires": { - "compute-scroll-into-view": "^1.0.13" - } - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14520,11 +13315,6 @@ "safe-buffer": "^5.0.1" } }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -15024,11 +13814,6 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" - }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", @@ -15483,11 +14268,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" }, - "throttle-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==" - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -15548,10 +14328,10 @@ "setimmediate": "^1.0.4" } }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tmp": { "version": "0.0.33", @@ -15615,11 +14395,6 @@ } } }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" - }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -15710,11 +14485,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" - }, "uglify-js": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", @@ -16077,14 +14847,6 @@ "makeerror": "1.0.x" } }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "watch": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", @@ -17268,21 +16030,11 @@ } } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, "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==" }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index 6fce397..33e7fb9 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@ant-design/icons": "^4.0.4", - "@giphy/js-fetch-api": "^1.5.2", - "@giphy/react-components": "^0.7.1", - "antd": "^4.0.4", + "@material-ui/core": "^4.9.10", + "@material-ui/icons": "^4.9.1", "autoprefixer": "7.1.6", "babel-core": "6.26.3", "babel-eslint": "10.x", @@ -26,7 +24,7 @@ "eslint-plugin-jsx-a11y": "6.x", "eslint-plugin-react": "7.x", "file-loader": "4.2.0", - "firebase": "^7.12.0", + "firebase": "^7.14.0", "fs-extra": "3.0.1", "html-webpack-plugin": "^4.0.0-beta.8", "jest": "20.0.4", @@ -42,6 +40,7 @@ "react-dom": "^16.4.1", "react-frame-component": "^4.0.0", "resolve": "1.6.0", + "route-lite": "^0.3.0", "style-loader": "0.19.0", "sw-precache-webpack-plugin": "^0.11.5", "url-loader": "0.6.2", diff --git a/public/manifest.json b/public/manifest.json index 2f7f4b0..157ea8b 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -9,7 +9,7 @@ "browser_action": { "default_popup": "popup.html" }, - "permissions": ["https://*.hulu.com/*", "https://*.netflix.com/*"], + "permissions": ["https://*.hulu.com/*", "https://*.netflix.com/*", "https://*.amazon.com/*"], "content_scripts": [ { "matches": ["https://*.hulu.com/*"], @@ -22,8 +22,15 @@ "run_at": "document_idle", "js": ["/static/js/content.js"], "css": ["/static/css/app.css"] + }, + { + "matches": ["https://*.amazon.com/*"], + "run_at": "document_idle", + "js": ["/static/js/content.js"], + "css": ["/static/css/app.css"] } ], + "web_accessible_resources": ["logo192.png"], "icons": { "16": "favicon.ico", "32": "favicon.ico", diff --git a/scripts/start.js b/scripts/start.js index 39d105b..4a6ddff 100644 --- a/scripts/start.js +++ b/scripts/start.js @@ -7,7 +7,7 @@ process.env.NODE_ENV = 'development'; // Makes the script crash on unhandled rejections instead of silently // ignoring them. In the future, promise rejections that are not handled will // terminate the Node.js process with a non-zero exit code. -process.on('unhandledRejection', err => { +process.on('unhandledRejection', (err) => { throw err; }); @@ -51,9 +51,7 @@ if (process.env.HOST) { )}` ) ); - console.log( - `If this was unintentional, check that you haven't mistakenly set it in your shell.` - ); + console.log(`If this was unintentional, check that you haven't mistakenly set it in your shell.`); console.log(`Learn more here: ${chalk.yellow('http://bit.ly/2mwWSwH')}`); console.log(); } @@ -61,7 +59,7 @@ if (process.env.HOST) { // We attempt to use the default port but if it is busy, we offer the user to // run on a different port. `choosePort()` Promise resolves to the next free port. choosePort(HOST, DEFAULT_PORT) - .then(port => { + .then((port) => { if (port == null) { // We have not found a port. return; @@ -70,18 +68,15 @@ choosePort(HOST, DEFAULT_PORT) const appName = require(paths.appPackageJson).name; const urls = prepareUrls(protocol, HOST, port); // Create a webpack compiler that is configured with custom messages. - const compiler = createCompiler({webpack, config, appName, urls, useYarn}); + const compiler = createCompiler({ webpack, config, appName, urls, useYarn }); // Load proxy config const proxySetting = require(paths.appPackageJson).proxy; const proxyConfig = prepareProxy(proxySetting, paths.appPublic); // Serve webpack assets generated by the compiler over a web sever. - const serverConfig = createDevServerConfig( - proxyConfig, - urls.lanUrlForConfig - ); + const serverConfig = createDevServerConfig(proxyConfig, urls.lanUrlForConfig); const devServer = new WebpackDevServer(compiler, serverConfig); // Launch WebpackDevServer. - devServer.listen(port, HOST, err => { + devServer.listen(port, HOST, (err) => { if (err) { return console.log(err); } @@ -92,14 +87,14 @@ choosePort(HOST, DEFAULT_PORT) openBrowser(urls.localUrlForBrowser); }); - ['SIGINT', 'SIGTERM'].forEach(function(sig) { - process.on(sig, function() { + ['SIGINT', 'SIGTERM'].forEach(function (sig) { + process.on(sig, function () { devServer.close(); process.exit(); }); }); }) - .catch(err => { + .catch((err) => { if (err && err.message) { console.log(err.message); } diff --git a/src/Api.js b/src/Api.js new file mode 100644 index 0000000..b891ab8 --- /dev/null +++ b/src/Api.js @@ -0,0 +1,64 @@ +import firebase from 'firebase/app'; +import 'firebase/auth'; + +const API_HOST = window.location.href.startsWith('http://localhost') + ? 'http://localhost:5001/watch-party-crx/us-central1/widgets' + : 'https://us-central1-watch-party-crx.cloudfunctions.net/widgets'; + +export const isAuthed = () => true && firebase.auth().currentUser; + +export const doAuth = () => firebase.auth().signInAnonymously(); + +export const fetcher = async ({ ENDPOINT, METHOD, ...args }) => { + const idToken = await firebase.auth().currentUser.getIdToken(); + return fetch(`${API_HOST}/${ENDPOINT}`, { + method: METHOD, + headers: { + Authorization: `Token ${idToken}:${firebase.auth().currentUser.uid}`, + }, + ...args, + }); +}; + +export const CreateRoomApi = async (data) => { + if (!isAuthed()) await doAuth(); + return fetcher({ + ENDPOINT: 'create', + METHOD: 'POST', + body: JSON.stringify(data), + }); +}; + +export const JoinRoomApi = async (data) => { + if (!isAuthed()) await doAuth(); + return fetcher({ + ENDPOINT: 'join', + METHOD: 'POST', + body: JSON.stringify(data), + }); +}; + +export const SendMessageApi = async (data) => { + if (!isAuthed()) await doAuth(); + return fetcher({ + ENDPOINT: 'message', + METHOD: 'post', + body: JSON.stringify(data), + }); +}; + +export const LeaveRoomApi = async (data) => { + if (!isAuthed()) await doAuth(); + return fetcher({ + ENDPOINT: `leave/${data.roomId}/users/${data.uid}`, + METHOD: 'DELETE', + }); +}; + +export const DeleteRoomApi = async (data) => { + if (!isAuthed()) await doAuth(); + return fetcher({ + ENDPOINT: `delete/${data.roomId}`, + METHOD: 'DELETE', + }); +}; diff --git a/src/App.js b/src/App.js index 7756388..1de1870 100644 --- a/src/App.js +++ b/src/App.js @@ -1,65 +1,45 @@ -import React, { Component } from 'react'; -import firebase from 'firebase/app'; -import Chat from './Chat'; +import React, { useState } from 'react'; +import Router from 'route-lite'; +import { Fab, createMuiTheme, ThemeProvider } from '@material-ui/core'; import Create from './Create'; -import Loading from './Loading'; -export default class App extends Component { - constructor(props) { - super(props); - this.state = { - loading: false, - loggedIn: false, - page: 'create', - }; - this.updateLoading = this.updateLoading.bind(this); - this.changePage = this.changePage.bind(this); +const darkTheme = createMuiTheme({ + palette: { + type: 'dark', + primary: { + main: '#a6d4fa', + }, + }, +}); + +const Routes = (props) => ( + + + +); + +const App = () => { + const [visible, setVisible] = useState(false); + const PartyRoutesWrapper = document.getElementById('party-routes-wrapper'); + if (visible) { + document.body.classList.add('visible'); + PartyRoutesWrapper && PartyRoutesWrapper.classList.add('visible'); + } else { + document.body.classList.remove('visible'); + PartyRoutesWrapper && PartyRoutesWrapper.classList.remove('visible'); } - componentDidMount() { - firebase.auth().onAuthStateChanged(user => { - const roomId = window.localStorage.getItem('roomId'); - if (user) { - this.setState({ - loggedIn: true, - }); - if (roomId) - this.setState({ - page: 'chat', - }); - } else { - if (roomId) { - window.localStorage.removeItem('roomId'); - window.localStorage.removeItem('watchPartyUserName'); - window.localStorage.removeItem('watchPartyUser'); - } - } - }); - } - changePage(page) { - this.setState({ - page, - }); - } - updateLoading(loading) { - this.setState({ - loading, - }); - } - render() { - const { loading, loggedIn, page } = this.state; - return ( + return ( +
- {loading && } - {page === 'chat' ? ( - - ) : page === 'create' ? ( - - ) : null} +
+ +
+ setVisible(!visible)} className="watch-party-fab"> + +
- ); - } -} +
+ ); +}; + +export default App; diff --git a/src/Chat.js b/src/Chat.js index a11ad36..35081f0 100644 --- a/src/Chat.js +++ b/src/Chat.js @@ -1,61 +1,170 @@ import React, { Component } from 'react'; -import { Typography, Input, message } from 'antd'; +import { + Typography, + TextField, + InputAdornment, + IconButton, + ButtonGroup, + Button, +} from '@material-ui/core'; import firebase from 'firebase/app'; import 'firebase/firestore'; -import { RightCircleFilled } from '@ant-design/icons'; +import 'firebase/auth'; import Thread from './Thread'; +import Send from '@material-ui/icons/SendRounded'; +import Sync from '@material-ui/icons/SyncOutlined'; +import Exit from '@material-ui/icons/ExitToAppRounded'; +import Share from '@material-ui/icons/ShareRounded'; +import Delete from '@material-ui/icons/Delete'; +import { SendMessageApi, LeaveRoomApi, DeleteRoomApi } from './Api'; +import { goTo } from 'route-lite'; +import Create from './Create'; export default class Chat extends Component { - constructor (props) { + constructor(props) { super(props); this.state = { - messages: [] + name: '', + messages: [], + newMessage: '', + admin: false, }; + this.sendMessage = this.sendMessage.bind(this); } componentDidMount() { - firebase.firestore() - .collection('rooms') - .doc(window.localStorage.getItem('roomId')) - .onSnapshot(snap => { - this.setState(snap.data()); - }, err => { - this.props.updateLoading(true); - if (err.code === 'permission-denied') { - message.error('Couldn\'t join old party'); - this.props.changePage('create'); - this.props.updateLoading(false); + window.addEventListener('keyup', (ev) => { + if (ev.code === 'Enter') { + if (ev.target === document.getElementById('chat-message-box-input')) { + if (ev.shiftKey === false) { + const trim = this.state.newMessage.replace(/^\s+|\s+$/g, ''); + if (trim !== '') this.sendMessage(trim); + this.setState({ newMessage: '' }); + } + } + } + }); + firebase + .firestore() + .collection('rooms') + .doc(window.localStorage.getItem('watchPartyRoomId')) + .onSnapshot( + (snap) => { + this.setState(snap.data()); + }, + (err) => console.error(err) + ); + firebase + .firestore() + .collection('rooms') + .doc(window.localStorage.getItem('watchPartyRoomId')) + .collection('users') + .onSnapshot((snap) => { + const isAdmin = snap.docs + .filter((user) => user.id === firebase.auth().currentUser.uid)[0] + .data().admin; + this.setState({ admin: isAdmin }); + }); + firebase + .firestore() + .collection('rooms') + .doc(window.localStorage.getItem('watchPartyRoomId')) + .collection('messages') + .orderBy('time') + .onSnapshot((snap) => { + this.setState({ messages: snap.docs.map((v) => ({ ...v.data(), id: v.id })) }); + const pcc = document.getElementsByClassName('thread-container')[0]; + if (pcc) pcc.scrollTop = pcc.scrollHeight; + }); + } + endParty() { + const data = { + roomId: window.localStorage.getItem('watchPartyRoomId'), + }; + DeleteRoomApi(data).then((res) => { + if (res.status === 200) { + window.localStorage.removeItem('watchPartyRoomId'); + goTo(Create); } - }) - firebase.firestore() - .collection('rooms') - .doc(window.localStorage.getItem('roomId')) - .collection('messages') - .onSnapshot(snap => { - this.setState({messages: snap.docs.map(v => ({ ...v.data(), id: v.id}) )}); }); } + leaveParty() { + const data = { + roomId: window.localStorage.getItem('watchPartyRoomId'), + uid: firebase.auth().currentUser.uid, + }; + LeaveRoomApi(data).then((res) => { + if (res.status === 200) { + window.localStorage.removeItem('watchPartyRoomId'); + goTo(Create); + } + }); + } + shareParty() { + const el = document.createElement('textarea'); + el.value = window.localStorage.getItem('watchPartyRoomId'); + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); + } + sendMessage(message) { + const data = { + roomId: window.localStorage.getItem('watchPartyRoomId'), + name: window.localStorage.getItem('watchPartyUserName'), + uid: firebase.auth().currentUser.uid, + text: message, + time: new Date().toISOString(), + }; + SendMessageApi(data); + } render() { - const {messages, name} = this.state; + const { admin, name, messages, newMessage } = this.state; return ( -
-
- {name} - Watch Party -
-
+
+ + WATCH PARTY + + + {name} + + + + + + {admin && ( + + )} + +
-
- - -
+ console.log(e)} + multiline + rowsMax="3" + size="small" + placeholder="New message... ( to send)" + variant="outlined" + className="chat-message-box" + value={newMessage} + onChange={(e) => this.setState({ newMessage: e.target.value })} + InputProps={{ + id: 'chat-message-box-input', + endAdornment: ( + + + + + + ), + }} + />
); } diff --git a/src/Create.js b/src/Create.js index 036637e..75b0e3f 100644 --- a/src/Create.js +++ b/src/Create.js @@ -1,143 +1,129 @@ import React, { useState } from 'react'; -import firebase from 'firebase/app'; -import 'firebase/auth'; -import { Button, Input, Divider, Typography, message } from 'antd'; -import { PlusCircleFilled, PlayCircleFilled } from '@ant-design/icons'; +import { + Button, + InputAdornment, + TextField, + Typography, + IconButton, + Paper, +} from '@material-ui/core'; +import Save from '@material-ui/icons/Save'; +import { JoinRoomApi, CreateRoomApi } from './Api'; +import { goTo } from 'route-lite'; +import Chat from './Chat'; -const login = async () => firebase.auth().signInAnonymously(); +const saveName = (name) => window.localStorage.setItem('watchPartyUserName', name); +const getName = () => window.localStorage.getItem('watchPartyUserName'); -const Create = props => { - const [userName, setUserName] = useState(window.localStorage.getItem('watchPartyUserName') || ''); - const [roomName, setRoomName] = useState(''); - const [roomCode, setRoomCode] = useState(window.localStorage.getItem('roomId') || ''); +const saveRoomId = (rid) => window.localStorage.setItem('watchPartyRoomId', rid); +const getRoomId = () => window.localStorage.getItem('watchPartyRoomId'); - const requestCreateRoom = async () => { - props.updateLoading(true); - if (userName === '') { - message.error('You forgot your name'); - props.updateLoading(false); - return; - } - if (roomName === '') { - message.error('You forgot to give a party name'); - props.updateLoading(false); - return; - } - if (!props.loggedIn) await login(); - firebase - .auth() - .currentUser.getIdToken() - .then(idToken => { - fetch('http://localhost:5001/watch-party-crx/us-central1/widgets/create', { - method: 'POST', - headers: { - Authorization: `Token ${idToken}:${firebase.auth().currentUser.uid}`, - }, - body: JSON.stringify({ - roomName, - userName, - }), - }) - .then(res => res.json()) - .then(res => { - res.roomId && window.localStorage.setItem('roomId', res.roomId); - window.localStorage.setItem('watchPartyUserName', userName); - window.localStorage.setItem('watchPartyUser', firebase.auth().currentUser.uid); - props.changePage('chat'); - props.updateLoading(false); - }); - }); +const joinRoom = async (data) => { + const apidata = { + roomId: data.joinName.trim(), + userName: data.name.trim(), }; + const confirmedRoomId = await JoinRoomApi(apidata) + .then((res) => res.json()) + .then((res) => res.roomId) + .catch((err) => console.error('Join Room API error', err)); + if (confirmedRoomId === apidata.roomId) { + saveRoomId(confirmedRoomId); + saveName(apidata.userName); + goTo(Chat); + } +}; - const requestJoinRoom = async () => { - props.updateLoading(true); - if (userName === '') { - message.error('You forgot your name'); - props.updateLoading(false); - return; - } - if (roomCode === '') { - message.error('Please enter a party code'); - props.updateLoading(false); - return; - } - if (!props.loggedIn) await login(); - firebase - .auth() - .currentUser.getIdToken() - .then(idToken => { - fetch(`http://localhost:5001/watch-party-crx/us-central1/widgets/join`, { - method: 'POST', - headers: { - Authorization: `Token ${idToken}:${firebase.auth().currentUser.uid}`, - }, - body: JSON.stringify({ - roomId: roomCode.trim(), - userName, - }), - }) - .then(res => { - if (res.status === 200) return res.json(); - if (res.status === 404) message.error("That party doesn't exist"); - return {}; - }) - .then(res => { - res.roomId && window.localStorage.setItem('roomId', res.roomId); - window.localStorage.setItem('watchPartyUserName', userName); - window.localStorage.setItem('watchPartyUser', firebase.auth().currentUser.uid); - props.changePage('chat'); - props.updateLoading(false); - }); - }); +const createRoom = async (data) => { + const apidata = { + roomName: data.createName, + userName: data.name, }; + CreateRoomApi(apidata) + .then((res) => res.json()) + .then((res) => { + saveRoomId(res.roomId); + saveName(data.name); + goTo(Chat); + }); +}; +const Create = (props) => { + const [name, setName] = useState(getName() || ''); + const [createName, setCreateName] = useState(''); + const [joinName, setJoinName] = useState(getRoomId() || ''); + if (getName() && getRoomId()) + joinRoom({ + joinName: getRoomId(), + name: getName(), + }); return ( -
- - Watch Party - - - setUserName(e.target.value)} - placeholder="Your Name" - size="large" - /> - - setRoomName(e.target.value)} - placeholder="Room Name" - size="large" - /> - - - setRoomCode(e.target.value)} - placeholder="Room Code" - size="large" - /> - +
+ + WATCH PARTY + +
+ setName(e.target.value)} + className="name-field" + label="Name" + variant="filled" + InputProps={{ + endAdornment: ( + + saveName(name)}> + + + + ), + }} + /> + + + CREATE PARTY + + setCreateName(e.target.value)} + label="Party Name" + /> + + + + + JOIN PARTY + + setJoinName(e.target.value)} + label="Party Name" + /> + + +
); }; diff --git a/src/Thread.css b/src/Thread.css index 0ecb5dc..1b8469c 100644 --- a/src/Thread.css +++ b/src/Thread.css @@ -1,10 +1,64 @@ .thread-item { width: 100%; + white-space: pre-wrap; + margin-top: 25px !important; + font-size: 12px !important; + position: relative; +} +.thread-item.no-space { + margin-top: 0 !important; } .system-message { display: block; text-align: center; width: 100%; text-align: center; - color: rgba(100,100,100,0.8) !important; -} \ No newline at end of file + font-size: 12px; + margin-top: 7.5px !important; + color: rgba(100, 100, 100, 0.8) !important; +} +.my-message { + display: block; + width: fit-content; + text-align: right; + margin-left: auto !important; + margin-right: 5px !important; + margin-top: 5px !important; + padding: 2.5px 10px !important; + border-radius: 13px; + max-width: 60%; + word-wrap: break-word; + background-color: rgb(49, 49, 49); +} +.party-message { + display: block; + width: fit-content; + max-width: 60%; + word-wrap: break-word; + margin-top: 5px !important; + padding: 2.5px 10px !important; + border-radius: 13px; + background-color: rgb(88, 88, 88); +} +.thread-item .name { + color: rgb(149, 149, 149); + font-size: 10px !important; +} +.time { + position: absolute; + bottom: 50%; + opacity: 0; + transition: all ease-in-out 0.3s; +} +.party-message ~ .time { + right: 0; +} +.party-message:hover ~ .time { + opacity: 1; +} +.my-message ~ .time { + left: 0; +} +.my-message:hover ~ .time { + opacity: 1; +} diff --git a/src/Thread.js b/src/Thread.js index ce8bded..1d873ec 100644 --- a/src/Thread.js +++ b/src/Thread.js @@ -1,13 +1,49 @@ import React from 'react'; -import { Typography } from 'antd'; +import { Typography } from '@material-ui/core'; import './Thread.css'; +import firebase from 'firebase/app'; +import 'firebase/auth'; -const Thread = props => - props.messages.map(m => { - console.log(m); +const Thread = (props) => + props.messages.map((m, midx) => { if (m.uid === '') { - return {m.text} + return ( + + {m.text} + + ); + } else if (m.uid === firebase.auth().currentUser.uid) { + return ( +
0 ? (props.messages[midx - 1].uid !== m.uid ? '' : 'no-space') : '' + }`} + key={m.id} + > + + {m.text} + + {new Date(m.time).toLocaleTimeString()} +
+ ); + } else { + return ( +
0 ? (props.messages[midx - 1].uid !== m.uid ? '' : 'no-space') : '' + }`} + key={m.id} + > + + {midx > 0 ? (props.messages[midx - 1].uid !== m.uid ? m.name : '') : m.name} + + + {m.text} + + {new Date(m.time).toLocaleTimeString()} +
+ ); } }); - export default Thread; \ No newline at end of file +export default Thread; diff --git a/src/hulu.css b/src/hulu.css deleted file mode 100644 index fc14078..0000000 --- a/src/hulu.css +++ /dev/null @@ -1,23 +0,0 @@ -/* #party_close { - display: inline; - margin-right: 0.625rem; -} -#__player__ .Player__container { - width: 75%; - resize: horizontal; -} -#__next { - width: 75%; - resize: horizontal; -} -#party_create { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} -.hidden { - display: none; -} */ diff --git a/src/index.css b/src/index.css index a2149ca..4d6b0e3 100644 --- a/src/index.css +++ b/src/index.css @@ -1,7 +1,138 @@ -@import '~antd/dist/antd.css'; -.party-content-wrapper { - position: relative; - height: 100%; +body { + margin: 0 !important; + background-color: black; + transition: max-width ease-in-out 0.35s; +} +body.visible { + width: 65%; +} +body.visible .watch-party-fab { + right: calc(35% - 4rem) !important; + top: 1.5rem; +} + +body.netflix.visible .AkiraPlayer, /* NETFLIX */ +body.hulu.visible .Player__container.addFocus,/* HULU */ +body.amazon-prime.visible #dv-web-player.dv-player-fullscreen /* AMAZON PRIME */ { + max-width: 65% !important; +} +/* HULU MINIMIZED VIDEO */ +body.hulu.visible #__player__.Player__container.Player__container--modal { + right: calc(35% + 2rem) !important; +} +/* HULU & AMAZON PRIME FIX */ +body.hulu #party-routes-wrapper, +body.amazon-prime #party-routes-wrapper { + width: 35% !important; + height: 100% !important; +} +/* NETFLIX HEADER FIX */ +body.netflix .pinning-header-container { + right: 35% !important; +} + +#party-routes-wrapper { + margin: 0; + position: fixed; + background-color: rgb(27, 27, 27); + bottom: 0; + width: calc(35% - 2rem); + right: -35%; + transition: all ease-in-out 0.3s; + height: calc(100% - 2rem); + padding: 1rem; + color: white; display: flex; - width: 100%; -} \ No newline at end of file + flex-direction: column; +} +#party-routes-wrapper.visible { + right: 0; +} +.watch-party-fab { + z-index: 9999; + position: fixed !important; + bottom: 1rem !important; + right: -2rem !important; + background-color: black !important; + /* background-image: url('/logo192.png'); */ + background-image: url('chrome-extension://__MSG_@@extension_id__/logo192.png'); + background-position: center; + background-repeat: no-repeat; + background-size: 2rem; + transition: all ease-in-out 0.3s !important; +} +.watch-party-fab:hover { + right: 1rem !important; +} +.watch-party-fab .fab-logo { + max-width: 65%; + max-height: 65%; +} + +.party-create-container { + display: flex; + flex-direction: column; + height: 100%; +} +.party-create-container .brand-title { + padding-top: 1.4rem !important; + padding-left: 3.5rem !important; +} +.party-create-container .name-field { + margin-bottom: 2rem !important; +} +.party-create-container .join-card { + padding: 1rem !important; + margin-bottom: 2rem; +} +.party-create-container .join-card .card-field { + margin-bottom: 1rem !important; +} +.party-create-container .party-create-inputs { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + padding: 2rem; +} + +.party-chat-container { + display: flex; + max-height: 100%; + flex-direction: column; + flex: 1; +} + +.thread-container { + max-height: 100%; + flex: 1; + overflow-y: auto; + margin-bottom: 1rem; + margin-top: 1rem; +} +.room-title, +.brand-title { + padding-left: 3.5rem !important; +} +.thread-container::-webkit-scrollbar { + width: 5px; +} +.thread-container::-webkit-scrollbar-track { + background-color: rgb(90, 90, 90); + border-radius: 1rem; +} +.thread-container::-webkit-scrollbar-thumb { + background-color: rgb(118, 182, 255); + border-radius: 13px; +} +textarea::-webkit-scrollbar { + display: none; +} +.chat-message-box > div { + border-radius: 26px; +} + +.party-controls { + margin-top: 1rem; + margin-bottom: 1rem; +} diff --git a/src/index.js b/src/index.js index 23f41fb..82ce100 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; import firebase from 'firebase/app'; -import 'antd/dist/antd.css'; -import './netflix.css'; -import './hulu.css'; -import './index.css'; import App from './App'; +import './index.css'; const firebaseConfig = { apiKey: 'AIzaSyCJLuYpzXLDRmu2ttzFuSGmYcpFxqToWFU', @@ -24,20 +21,15 @@ const PartyWrapper = document.createElement('div'); PartyWrapper.id = 'party_wrapper'; document.body.appendChild(PartyWrapper); -// STYLINGS -if (window.location.href.startsWith('https://www.hulu.com')) { - // HULU -} else if (window.location.href.startsWith('https://www.netflix.com')) { - // NETFLIX - PartyWrapper.classList.add('netflix'); - document.body.classList.add('netflix'); -} else if (window.location.href.includes('amazon.com')) { - // PRIME VIDEO -} else { - // LOCAL HOST - PartyWrapper.classList.add('netflix'); - document.body.classList.add('netflix'); -} +const HREF = window.location.href; + +// https://www.netflix. -- netflix +// https://www.hulu. -- hulu +// https://www.amazon. -- amazon prime + +if (HREF.startsWith('https://www.amazon')) document.body.classList.add('amazon-prime'); +if (HREF.startsWith('https://www.hulu')) document.body.classList.add('hulu'); +if (HREF.startsWith('https://www.netflix')) document.body.classList.add('netflix'); ReactDOM.render( diff --git a/src/netflix.css b/src/netflix.css index 5de81ae..723073e 100644 --- a/src/netflix.css +++ b/src/netflix.css @@ -2,6 +2,7 @@ body.netflix { display: flex; height: 100vh; overflow: hidden; + background-color: black; } body.netflix #appMountPoint { z-index: 999; @@ -41,11 +42,28 @@ body.netflix #appMountPoint { flex-direction: column; } #party_wrapper.netflix .party_chat_container { + max-height: max-content; + overflow-y: auto; + padding-bottom: 1rem; flex: 1; + padding-right: 1rem; } -#party_wrapper.netflix h3{ +#party_wrapper.netflix h3 { color: white; } +#party_wrapper.netflix h4 { + display: flex; + align-items: center; + font-weight: 200; + color: white; +} +#party_wrapper.netflix h4 button { + margin-right: 15px; +} +#party_wrapper.netflix h4 span > svg { + width: 15px; + height: 15px; +} .party_chat_input { position: relative; display: flex; @@ -80,8 +98,11 @@ body.netflix #appMountPoint { justify-content: center; align-items: center; } -#loading_container svg{ +#loading_container svg { color: wheat; width: 40px; height: 40px; -} \ No newline at end of file +} +.ant-popover-inner-content { + padding: 0; +}