├── .env ├── .gitignore ├── .prettierrc ├── app ├── config │ ├── app.config.js │ ├── auth.config.js │ ├── crypto.config.js │ └── db.config.js ├── controllers │ ├── auth.controller.js │ ├── chat.controller.js │ ├── friends.controller.js │ ├── messages.controller.js │ ├── setting.controller.js │ ├── upload.controller.js │ ├── user.controller.js │ └── wholesale.controller.js ├── helpers │ ├── crypto.js │ └── firebase.js ├── middlewares │ ├── authJwt.js │ ├── index.js │ ├── multer.js │ └── verifySignUp.js ├── models │ ├── chat.model.js │ ├── friends.model.js │ ├── index.js │ ├── messages.model.js │ ├── role.model.js │ └── user.model.js ├── routes │ ├── auth.routes.js │ ├── chat.routes.js │ ├── friends.routes.js │ ├── messages.routes.js │ ├── setting.routes.js │ ├── upload.routes.js │ ├── user.routes.js │ └── wholesale.routes.js └── services │ ├── firebase-api-service.js │ └── shopify-api-service.js ├── package-lock.json ├── package.json ├── server.js └── yarn.lock /.env: -------------------------------------------------------------------------------- 1 | ENVIRONMENT=local 2 | APP_URL=* 3 | DB_HOST=localhost 4 | DB_PORT=27017 5 | DB_NAME=pk_admin 6 | DB_URL='' 7 | PORT=5000 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | public 3 | uploads -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 150, 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "trailingComma": "all", 6 | "semi": true, 7 | "arrowParens": "avoid" 8 | } -------------------------------------------------------------------------------- /app/config/app.config.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | 3 | module.exports = { 4 | ENVIRONMENT: process.env.ENVIRONMENT, 5 | APP_URL: process.env.APP_URL, 6 | }; -------------------------------------------------------------------------------- /app/config/auth.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | secret: 'pk-admin-api', 3 | }; 4 | -------------------------------------------------------------------------------- /app/config/crypto.config.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | 3 | module.exports = { 4 | CIV: Buffer.from(process.env.CIV, 'hex'), 5 | CKEY: Buffer.from(process.env.CKEY, 'hex'), 6 | }; 7 | -------------------------------------------------------------------------------- /app/config/db.config.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.DB_HOST, 5 | PORT: process.env.DB_PORT, 6 | DB_NAME: process.env.DB_NAME, 7 | URL: process.env.DB_URL, 8 | }; 9 | -------------------------------------------------------------------------------- /app/controllers/auth.controller.js: -------------------------------------------------------------------------------- 1 | const config = require("../config/auth.config"); 2 | const db = require("../models"); 3 | const User = db.user; 4 | const Role = db.role; 5 | const Friends = db.friends; 6 | 7 | var jwt = require("jsonwebtoken"); 8 | var bcrypt = require("bcryptjs"); 9 | 10 | exports.signup = (req, res) => { 11 | const randColor = () => { 12 | let color = Math.floor(Math.random() * 16777215).toString(16); 13 | color = "#" + color; 14 | return color 15 | } 16 | 17 | const user = new User({ 18 | username: req.body.username, 19 | email: req.body.email, 20 | password: bcrypt.hashSync(req.body.password, 8), 21 | avatarColor: randColor(), 22 | }); 23 | 24 | user.save((err, user) => { 25 | if (err) { 26 | res.status(500).send({ message: err }); 27 | return; 28 | } 29 | 30 | if (req.body.roles) { 31 | Role.find( 32 | { 33 | name: { $in: req.body.roles } 34 | }, 35 | (err, roles) => { 36 | if (err) { 37 | res.status(500).send({ message: err }); 38 | return; 39 | } 40 | 41 | user.roles = roles.map(role => role._id); 42 | let user_role_names = roles.map(role => role.name); 43 | user.save(err => { 44 | if (err) { 45 | res.status(500).send({ message: err }); 46 | return; 47 | } 48 | 49 | var token = jwt.sign({ id: user.id }, config.secret, { 50 | expiresIn: 86400 // 24 hours 51 | }); 52 | 53 | var authorities = []; 54 | 55 | for (let i = 0; i < user_role_names.length; i++) { 56 | authorities.push("ROLE_" + user_role_names[i].name.toUpperCase()); 57 | } 58 | res.status(200).send({ 59 | ...user._doc, 60 | id: user._id, 61 | username: user.username, 62 | email: user.email, 63 | roles: authorities, 64 | accessToken: token, 65 | friendsData: [], 66 | }); 67 | }); 68 | } 69 | ); 70 | } else { 71 | Role.findOne({ name: "user" }, (err, role) => { 72 | if (err) { 73 | res.status(500).send({ message: err }); 74 | return; 75 | } 76 | 77 | user.roles = [role._id]; 78 | user.save(err => { 79 | if (err) { 80 | res.status(500).send({ message: err }); 81 | return; 82 | } 83 | 84 | var token = jwt.sign({ id: user.id }, config.secret, { 85 | expiresIn: 86400 // 24 hours 86 | }); 87 | 88 | var authorities = []; 89 | console.log("_______________", user.roles) 90 | for (let i = 0; i < user.roles.length; i++) { 91 | authorities.push("ROLE_USER"); 92 | } 93 | res.status(200).send({ 94 | ...user._doc, 95 | id: user._id, 96 | username: user.username, 97 | email: user.email, 98 | roles: authorities, 99 | accessToken: token, 100 | friendsData: [], 101 | }); 102 | }); 103 | }); 104 | } 105 | }); 106 | }; 107 | 108 | exports.signin = (req, res) => { 109 | User.findOne({ 110 | email: req.body.email 111 | }) 112 | .populate("roles", "-__v") 113 | .exec(async (err, user) => { 114 | if (err) { 115 | res.status(500).send({ message: err }); 116 | return; 117 | } 118 | 119 | if (!user) { 120 | return res.status(404).send({ message: "User Not found." }); 121 | } 122 | 123 | var passwordIsValid = bcrypt.compareSync( 124 | req.body.password, 125 | user.password 126 | ); 127 | 128 | if (!passwordIsValid) { 129 | return res.status(401).send({ 130 | accessToken: null, 131 | message: "Invalid Password!" 132 | }); 133 | } 134 | 135 | var token = jwt.sign({ id: user.id }, config.secret, { 136 | expiresIn: 86400 // 24 hours 137 | }); 138 | 139 | var authorities = []; 140 | 141 | for (let i = 0; i < user.roles.length; i++) { 142 | authorities.push("ROLE_" + user.roles[i].name.toUpperCase()); 143 | } 144 | 145 | let friendsData; 146 | 147 | try { 148 | console.log(user._id) 149 | let logedUserId = user._id.toString(); 150 | let friends = await Friends.find({ 151 | friends: { $in: [logedUserId] }, 152 | }); 153 | friendsData = JSON.parse(JSON.stringify(friends)) 154 | console.log('friends:', friends) 155 | let userList = [] 156 | await Promise.all(friendsData.map(async (friend, index) => { 157 | const friendId = friend.friends.find((m) => m !== logedUserId); 158 | const user = await User.findOne({ _id: friendId }); 159 | friendsData[index].friend = JSON.parse(JSON.stringify(user)) 160 | })) 161 | 162 | res.status(200).send({ 163 | ...user._doc, 164 | id: user._id, 165 | username: user.username, 166 | email: user.email, 167 | roles: authorities, 168 | accessToken: token, 169 | friendsData: friendsData 170 | }); 171 | } 172 | catch (err) { 173 | console.log(err) 174 | } 175 | 176 | 177 | }); 178 | }; -------------------------------------------------------------------------------- /app/controllers/chat.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../models"); 2 | const Chat = db.chat; 3 | 4 | //new chat 5 | 6 | exports.allAccess = (req, res) => { 7 | res.status(200).send("Public Content."); 8 | }; 9 | 10 | exports.userBoard = (req, res) => { 11 | res.status(200).send("User Content."); 12 | }; 13 | 14 | exports.ownerBoard = (req, res) => { 15 | res.status(200).send("Owner Content."); 16 | }; 17 | 18 | -------------------------------------------------------------------------------- /app/controllers/friends.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../models"); 2 | const Friends = db.friends; 3 | const Users = db.user; 4 | 5 | //new friends 6 | exports.newFriend = async (req, res) => { 7 | const requestedFriend = await Users.findOne({ email: req.body.friendEmail }); 8 | console.log(requestedFriend); 9 | if (!requestedFriend) { 10 | res.status(500).json({ msg: 'notExist' }); 11 | } 12 | else { 13 | let isAlreadyFriend = false; 14 | let friends = await Friends.find({ 15 | friends: { $in: [req.body.senderId] }, 16 | }); 17 | let friendsData = JSON.parse(JSON.stringify(friends)) 18 | await Promise.all(friendsData.map(async (friend) => { 19 | const friendId = friend.friends.find((m) => m !== req.body.senderId); 20 | if (friendId == requestedFriend._id) { 21 | isAlreadyFriend = true 22 | } 23 | })) 24 | 25 | //if this friend's email is mine? 26 | if (requestedFriend._id == req.body.senderId) { 27 | res.status(500).json({ msg: 'impossible' }); 28 | } 29 | //if this email's owner is already friend? 30 | else if (isAlreadyFriend) { 31 | res.status(500).json({ msg: 'alreadyFriend' }); 32 | } 33 | //if requested email does not exist 34 | 35 | 36 | //save new Friend 37 | else { 38 | const newFriend = new Friends({ 39 | friends: [req.body.senderId, requestedFriend._id.toString()], 40 | friend: requestedFriend._id 41 | }); 42 | try { 43 | const savedNewFriend = await newFriend.save(); 44 | await oppositeNewFriend.save(); 45 | res.status(200).json(newFriend); 46 | } 47 | catch (err) { 48 | res.status(500).json(err); 49 | } 50 | } 51 | } 52 | 53 | } 54 | 55 | //get friends of a user 56 | exports.getFriends = async (req, res) => { 57 | try { 58 | // const friends = await Friends.find({ 59 | // friends: { $in: [req.params.userId] }, 60 | // }).populate("friend", "-id -_id -__v -email -password -roles -createdAt -updatedAt").select("-__v"); 61 | // res.status(200).json(friends); 62 | console.log(req.params.userId) 63 | let friends = await Friends.find({ 64 | friends: { $in: [req.params.userId] }, 65 | }); 66 | let friendsData = JSON.parse(JSON.stringify(friends)) 67 | console.log('friends:', friends) 68 | let userList = [] 69 | await Promise.all(friendsData.map(async (friend, index) => { 70 | const friendId = friend.friends.find((m) => m !== req.params.userId); 71 | const user = await Users.findOne({ _id: friendId }) 72 | friendsData[index].friend = JSON.parse(JSON.stringify(user)) 73 | console.log('----------', friendsData[index]) 74 | // userList = userList.push(user) 75 | })) 76 | console.log("==========", friendsData) 77 | // let friendList = friends.populate("friend", "-id -_id -__v -email -password -roles -createdAt -updatedAt").select("-__v"); 78 | res.status(200).json(friendsData); 79 | } 80 | catch (err) { 81 | res.status(500).json(err); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/controllers/messages.controller.js: -------------------------------------------------------------------------------- 1 | const db = require("../models"); 2 | const Message = db.messages; 3 | 4 | //new message 5 | exports.createMessage = async (req, res) => { 6 | const newMessage = new Message(req.body); 7 | try { 8 | await newMessage.save(); 9 | res.status(200).json({msg: 'success'}); 10 | } 11 | catch (err) { 12 | res.status(500).json(err); 13 | } 14 | } 15 | 16 | //get messages 17 | exports.getMessage = async (req, res) => { 18 | try { 19 | // const messages = await Message.find({ 20 | // friendId: req.params.friendId, 21 | // }).populate("sender", " -__v -email -password -roles -createdAt -updatedAt").select("-__v").sort({ 'createdAt': -1 }); 22 | const messages = await Message.find({ 23 | friendId: req.params.friendId, 24 | }).populate("sender", " -__v -email -password -roles -createdAt -updatedAt").select("-__v"); 25 | res.status(200).json(messages); 26 | } 27 | catch (err) { 28 | res.status(500).json(err); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/controllers/setting.controller.js: -------------------------------------------------------------------------------- 1 | const FirebaseApiService = require('../services/firebase-api-service'); 2 | 3 | const firebaseApiService = new FirebaseApiService(); 4 | 5 | exports.getShopifyKeys = async (req, res) => { 6 | try { 7 | const shopifyKeys = await firebaseApiService.getShopifyKeys(); 8 | res.json({ shopifyKeys }); 9 | } catch (err) { 10 | console.log(err); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /app/controllers/upload.controller.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require("fs"); 3 | const stream = require("stream"); 4 | const { encrypt, decrypt } = require('../helpers/crypto'); 5 | const cryptoConfig = require("../config/crypto.config"); 6 | const db = require("../models"); 7 | const Message = db.messages; 8 | 9 | const CryptoAlgorithm = "aes-256-cbc"; 10 | function getEncryptedFilePath(filePath) { 11 | return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath)) + '_' + Date.now() + path.extname(filePath)) 12 | } 13 | 14 | function getDecryptedFilePath(filePath) { 15 | return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath)) + path.extname(filePath)) 16 | } 17 | 18 | function saveEncryptedFile(buffer, filePath, key, iv) { 19 | const encrypted = encrypt(CryptoAlgorithm, buffer, key, iv); 20 | filePath = getEncryptedFilePath(filePath); 21 | if (!fs.existsSync(path.dirname(filePath))) { 22 | fs.mkdirSync(path.dirname(filePath)) 23 | } 24 | fs.writeFileSync(filePath, encrypted); 25 | return filePath; 26 | } 27 | 28 | function getEncryptedFile(filePath, key, iv) { 29 | filePath = getDecryptedFilePath(filePath); 30 | const encrypted = fs.readFileSync(filePath); 31 | const buffer = decrypt(CryptoAlgorithm, encrypted, key, iv); 32 | return buffer; 33 | } 34 | 35 | exports.uploadImage = async (req, res) => { 36 | const files = res.req.files; 37 | if (!files) { 38 | const error = new Error('Please choose files') 39 | res.status(500).json(error); 40 | } 41 | if (req.body?.type == 'message') { 42 | let imgArr = []; 43 | for (let i = 0; i < res.req.files.length; i++) { 44 | let generatedFileName = saveEncryptedFile(res.req.files[i].buffer, path.join("./uploads", res.req.files[i].originalname), cryptoConfig.CKEY, cryptoConfig.CIV); 45 | let size; 46 | if (res.req.files[i].size > 1024 * 1024) { 47 | size = Math.round((res.req.files[i].size / 1024 / 1024) * 100) / 100 + 'MB'; 48 | } else { 49 | size = Math.round((res.req.files[i].size / 1024) * 100) / 100 + 'KB'; 50 | } 51 | let obj = { 52 | originalName: res.req.files[i].originalname, 53 | size: size, 54 | generatedFileName: generatedFileName.split('\\')[1], 55 | mimeType: res.req.files[i].mimetype.split('/')[1] 56 | } 57 | imgArr.push(obj); 58 | } 59 | 60 | req.body.type = "image"; 61 | req.body.content = JSON.stringify(imgArr); 62 | 63 | const newMessage = new Message(req.body); 64 | try { 65 | await newMessage.save(); 66 | res.status(200).json({ msg: newMessage }); 67 | } 68 | catch (err) { 69 | res.status(500).json(err); 70 | } 71 | } 72 | else { 73 | for (let i = 0; i < res.req.files.length; i++) { 74 | let generatedFileName = saveEncryptedFile(res.req.files[i].buffer, path.join("./uploads", res.req.files[i].originalname), cryptoConfig.CKEY, cryptoConfig.CIV); 75 | } 76 | res.status(200).json(files); 77 | } 78 | } 79 | 80 | exports.getImage = async (req, res) => { 81 | console.log("Getting file:", req.params.imageName); 82 | const buffer = getEncryptedFile(path.join(__dirname, "../../uploads", req.params.imageName), cryptoConfig.CKEY, cryptoConfig.CIV); 83 | const readStream = new stream.PassThrough(); 84 | readStream.end(buffer); 85 | res.writeHead(200, { 86 | "Content-disposition": "attachment; imageName=" + req.params.imageName, 87 | "Content-Type": "application/octet-stream", 88 | "Content-Length": buffer.length 89 | }); 90 | res.end(buffer); 91 | } 92 | -------------------------------------------------------------------------------- /app/controllers/user.controller.js: -------------------------------------------------------------------------------- 1 | exports.allAccess = (req, res) => { 2 | res.status(200).send("Public Content."); 3 | }; 4 | 5 | exports.userBoard = (req, res) => { 6 | res.status(200).send("User Content."); 7 | }; 8 | 9 | exports.ownerBoard = (req, res) => { 10 | res.status(200).send("Owner Content."); 11 | }; 12 | 13 | -------------------------------------------------------------------------------- /app/controllers/wholesale.controller.js: -------------------------------------------------------------------------------- 1 | const FirebaseApiService = require('../services/firebase-api-service'); 2 | const ShopifyApiService = require('../services/shopify-api-service'); 3 | 4 | const firebaseApiService = new FirebaseApiService(); 5 | 6 | exports.getProducts = async (req, res) => { 7 | try { 8 | const shopifyKeys = await firebaseApiService.getShopifyKeys(); 9 | const shopifyApiService = new ShopifyApiService(shopifyKeys.adminAccessToken); 10 | const products = await shopifyApiService.getProducts(); 11 | res.json({ products }); 12 | } catch (err) { 13 | console.log(err); 14 | } 15 | }; 16 | 17 | exports.getOrders = async (req, res) => { 18 | try { 19 | const shopifyKeys = await firebaseApiService.getShopifyKeys(); 20 | const shopifyApiService = new ShopifyApiService(shopifyKeys.adminAccessToken); 21 | const orders = await shopifyApiService.getOrders(); 22 | res.json({ orders }); 23 | } catch (err) { 24 | console.log(err); 25 | } 26 | }; 27 | 28 | exports.getCustomers = async (req, res) => { 29 | try { 30 | const shopifyKeys = await firebaseApiService.getShopifyKeys(); 31 | const shopifyApiService = new ShopifyApiService(shopifyKeys.adminAccessToken); 32 | const customers = await shopifyApiService.getCustomers(); 33 | res.json({ customers }); 34 | } catch (err) { 35 | console.log(err); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /app/helpers/crypto.js: -------------------------------------------------------------------------------- 1 | const crypto = require("crypto"); 2 | 3 | module.exports={ 4 | encrypt: (algorithm, buffer, key, iv) => { 5 | const cipher = crypto.createCipheriv(algorithm, key, iv); 6 | const encrypted = Buffer.concat([cipher.update(buffer),cipher.final()]); 7 | return encrypted; 8 | }, 9 | 10 | decrypt: (algorithm, buffer, key, iv) => { 11 | const decipher = crypto.createDecipheriv(algorithm, key, iv); 12 | const decrypted = Buffer.concat([decipher.update(buffer), decipher.final()]); 13 | return decrypted; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/helpers/firebase.js: -------------------------------------------------------------------------------- 1 | // Import the functions you need from the SDKs you need 2 | const { initializeApp } = require('firebase/app'); 3 | // TODO: Add SDKs for Firebase products that you want to use 4 | // https://firebase.google.com/docs/web/setup#available-libraries 5 | 6 | // Your web app's Firebase configuration 7 | // For Firebase JS SDK v7.20.0 and later, measurementId is optional 8 | const firebaseConfig = { 9 | apiKey: 'AIzaSyCs4C76_4lAE04F6ugh78BhkQMZVGxmB0w', 10 | authDomain: 'pk-admin-panel.firebaseapp.com', 11 | projectId: 'pk-admin-panel', 12 | storageBucket: 'pk-admin-panel.appspot.com', 13 | messagingSenderId: '1067101636111', 14 | appId: '1:1067101636111:web:9e56a4bbb176387f02057a', 15 | measurementId: 'G-HLB3QHBD9Y', 16 | }; 17 | 18 | // Initialize Firebase 19 | const firebaseApp = initializeApp(firebaseConfig); 20 | 21 | module.exports = firebaseApp; 22 | -------------------------------------------------------------------------------- /app/middlewares/authJwt.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | const config = require("../config/auth.config.js"); 3 | const db = require("../models"); 4 | const User = db.user; 5 | const Role = db.role; 6 | 7 | verifyToken = (req, res, next) => { 8 | const bearerHeader = req.headers["authorization"]; 9 | 10 | if (!bearerHeader) { 11 | return res.status(403).send({ message: "No token provided!" }); 12 | } 13 | const bearerToken = bearerHeader.split(' ')[1]; 14 | jwt.verify(bearerToken, config.secret, (err, decoded) => { 15 | if (err) { 16 | return res.status(401).send({ message: "Unauthorized!" }); 17 | } 18 | req.userId = decoded.id; 19 | next(); 20 | }); 21 | }; 22 | 23 | isOwner = (req, res, next) => { 24 | User.findById(req.userId).exec((err, user) => { 25 | if (err) { 26 | res.status(500).send({ message: err }); 27 | return; 28 | } 29 | 30 | Role.find( 31 | { 32 | _id: { $in: user.roles }, 33 | }, 34 | (err, roles) => { 35 | if (err) { 36 | res.status(500).send({ message: err }); 37 | return; 38 | } 39 | 40 | for (let i = 0; i < roles.length; i++) { 41 | if (roles[i].name === "owner") { 42 | next(); 43 | return; 44 | } 45 | } 46 | 47 | res.status(403).send({ message: "Require owner Role!" }); 48 | return; 49 | } 50 | ); 51 | }); 52 | }; 53 | 54 | 55 | const authJwt = { 56 | verifyToken, 57 | isOwner, 58 | }; 59 | module.exports = authJwt; 60 | -------------------------------------------------------------------------------- /app/middlewares/index.js: -------------------------------------------------------------------------------- 1 | const authJwt = require("./authJwt"); 2 | const verifySignUp = require("./verifySignUp"); 3 | const store = require('./multer'); 4 | 5 | module.exports = { 6 | authJwt, 7 | verifySignUp, 8 | store 9 | }; -------------------------------------------------------------------------------- /app/middlewares/multer.js: -------------------------------------------------------------------------------- 1 | const multer = require('multer'); 2 | 3 | //set storage 4 | let storage = multer.memoryStorage({ 5 | destination: function (req, file, cb) { 6 | cb(null, __dirname + '../../../app/public/uploads') 7 | }, 8 | filename: function (req, file, cb) { 9 | let ext = file.originalname.substr(file.originalname.lastIndexOf('.')); 10 | cb(null, file.fieldname + '-' + Date.now() + ext); 11 | } 12 | }) 13 | 14 | module.exports = store = multer({ storage: storage }) -------------------------------------------------------------------------------- /app/middlewares/verifySignUp.js: -------------------------------------------------------------------------------- 1 | const db = require("../models"); 2 | const ROLES = db.ROLES; 3 | const User = db.user; 4 | 5 | checkDuplicateUsernameOrEmail = (req, res, next) => { 6 | // Username 7 | // User.findOne({ 8 | // username: req.body.username, 9 | // }).exec((err, user) => { 10 | // if (err) { 11 | // res.status(500).send({ message: err }); 12 | // return; 13 | // } 14 | 15 | // if (user) { 16 | // res.status(400).send({ message: "Failed! Username is already in use!" }); 17 | // return; 18 | // } 19 | // }); 20 | // Email 21 | User.findOne({ 22 | email: req.body.email, 23 | }).exec((err, user) => { 24 | if (err) { 25 | res.status(500).send({ message: err }); 26 | return; 27 | } 28 | 29 | if (user) { 30 | res.status(400).send({ message: "Failed! Email is already in use!" }); 31 | return; 32 | } 33 | 34 | next(); 35 | }); 36 | }; 37 | 38 | checkRolesExisted = (req, res, next) => { 39 | if (req.body.roles) { 40 | for (let i = 0; i < req.body.roles.length; i++) { 41 | if (!ROLES.includes(req.body.roles[i])) { 42 | res.status(400).send({ 43 | message: `Failed! Role ${req.body.roles[i]} does not exist!`, 44 | }); 45 | return; 46 | } 47 | } 48 | } 49 | 50 | next(); 51 | }; 52 | 53 | const verifySignUp = { 54 | checkDuplicateUsernameOrEmail, 55 | checkRolesExisted, 56 | }; 57 | 58 | module.exports = verifySignUp; 59 | -------------------------------------------------------------------------------- /app/models/chat.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Chat = mongoose.model( 4 | "Chat", 5 | new mongoose.Schema({ 6 | chatId: String, 7 | sender: { 8 | type: String 9 | }, 10 | type: { 11 | type: String, 12 | default: 'text' 13 | }, 14 | message: String, 15 | }, { timestamps: true, toObject: { virtuals: true, }, toJSON: { virtuals: true } }) 16 | ); 17 | 18 | module.exports = Chat; -------------------------------------------------------------------------------- /app/models/friends.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Friends = mongoose.model( 4 | "Friends", 5 | new mongoose.Schema({ 6 | friends: { 7 | type: Array, 8 | }, 9 | friend: { 10 | type: mongoose.Schema.Types.ObjectId, 11 | ref: "User" 12 | }, 13 | unReadMessageCnt: { 14 | type: Number, 15 | default: 0 16 | }, 17 | lastMessage: { 18 | type: String, 19 | default: "" 20 | }, 21 | }, { timestamps: true, toObject: { virtuals: true, }, toJSON: { virtuals: true } }) 22 | ); 23 | 24 | module.exports = Friends; -------------------------------------------------------------------------------- /app/models/index.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | mongoose.Promise = global.Promise; 3 | 4 | const db = {}; 5 | 6 | db.mongoose = mongoose; 7 | 8 | db.user = require("./user.model"); 9 | db.role = require("./role.model"); 10 | db.chat = require("./chat.model"); 11 | db.friends = require("./friends.model"); 12 | db.messages = require("./messages.model"); 13 | 14 | db.ROLES = ["user", "owner"]; 15 | 16 | module.exports = db; -------------------------------------------------------------------------------- /app/models/messages.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Message = mongoose.model( 4 | "Message", 5 | new mongoose.Schema({ 6 | friendId: String, 7 | sender: { 8 | type: mongoose.Schema.Types.ObjectId, 9 | ref: "User" 10 | }, 11 | type: { 12 | type: String, 13 | default: 'text' 14 | }, 15 | content: String, 16 | }, { timestamps: true, toObject: { virtuals: true, }, toJSON: { virtuals: true } }) 17 | ); 18 | 19 | module.exports = Message; -------------------------------------------------------------------------------- /app/models/role.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const Role = mongoose.model( 4 | "Role", 5 | new mongoose.Schema({ 6 | name: String 7 | }) 8 | ); 9 | 10 | module.exports = Role; -------------------------------------------------------------------------------- /app/models/user.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const User = mongoose.model( 4 | "User", 5 | new mongoose.Schema({ 6 | username: String, 7 | email: String, 8 | password: String, 9 | roles: [ 10 | { 11 | type: mongoose.Schema.Types.ObjectId, 12 | ref: "Role", 13 | }, 14 | ], 15 | avatar: { 16 | type: String, 17 | default: "" 18 | }, 19 | avatarColor: String, 20 | }, { timestamps: true, toObject: { virtuals: true, }, toJSON: { virtuals: true } }) 21 | ); 22 | 23 | module.exports = User; -------------------------------------------------------------------------------- /app/routes/auth.routes.js: -------------------------------------------------------------------------------- 1 | const { verifySignUp } = require('../middlewares'); 2 | const controller = require('../controllers/auth.controller'); 3 | 4 | module.exports = function (app) { 5 | app.post('/api/auth/signup', [verifySignUp.checkDuplicateUsernameOrEmail, verifySignUp.checkRolesExisted], controller.signup); 6 | app.post('/api/auth/signin', controller.signin); 7 | }; 8 | -------------------------------------------------------------------------------- /app/routes/chat.routes.js: -------------------------------------------------------------------------------- 1 | const { authJwt } = require('../middlewares'); 2 | const controller = require('../controllers/chat.controller'); 3 | 4 | module.exports = function (app) {}; 5 | -------------------------------------------------------------------------------- /app/routes/friends.routes.js: -------------------------------------------------------------------------------- 1 | const { authJwt } = require('../middlewares'); 2 | const controller = require('../controllers/friends.controller'); 3 | 4 | module.exports = function (app) { 5 | app.post('/api/friend', [authJwt.verifyToken], controller.newFriend); 6 | app.get('/api/friend/:userId', [authJwt.verifyToken], controller.getFriends); 7 | }; 8 | -------------------------------------------------------------------------------- /app/routes/messages.routes.js: -------------------------------------------------------------------------------- 1 | const { authJwt } = require('../middlewares'); 2 | const controller = require('../controllers/messages.controller'); 3 | 4 | module.exports = function (app) { 5 | app.post('/api/message', [authJwt.verifyToken], controller.createMessage); 6 | app.get('/api/message/:friendId', [authJwt.verifyToken], controller.getMessage); 7 | }; 8 | -------------------------------------------------------------------------------- /app/routes/setting.routes.js: -------------------------------------------------------------------------------- 1 | const controller = require('../controllers/setting.controller'); 2 | 3 | module.exports = function (app) { 4 | app.get('/api/setting/shopify-keys', controller.getShopifyKeys); 5 | }; 6 | -------------------------------------------------------------------------------- /app/routes/upload.routes.js: -------------------------------------------------------------------------------- 1 | const { store } = require('../middlewares'); 2 | const controller = require('../controllers/upload.controller'); 3 | 4 | module.exports = function (app) { 5 | app.post('/api/upload/image', store.array('images', 12), controller.uploadImage); 6 | app.get('/api/file/image/:imageName', controller.getImage); 7 | }; 8 | -------------------------------------------------------------------------------- /app/routes/user.routes.js: -------------------------------------------------------------------------------- 1 | const { authJwt } = require('../middlewares'); 2 | const controller = require('../controllers/user.controller'); 3 | 4 | module.exports = function (app) { 5 | app.get('/api/test/all', controller.allAccess); 6 | 7 | app.get('/api/test/user', [authJwt.verifyToken], controller.userBoard); 8 | 9 | app.get('/api/test/owner', [authJwt.verifyToken, authJwt.isOwner], controller.ownerBoard); 10 | }; 11 | -------------------------------------------------------------------------------- /app/routes/wholesale.routes.js: -------------------------------------------------------------------------------- 1 | const controller = require('../controllers/wholesale.controller'); 2 | 3 | module.exports = function (app) { 4 | app.get('/api/wholesale/products', controller.getProducts); 5 | app.get('/api/wholesale/orders', controller.getOrders); 6 | app.get('/api/wholesale/customers', controller.getCustomers); 7 | }; 8 | -------------------------------------------------------------------------------- /app/services/firebase-api-service.js: -------------------------------------------------------------------------------- 1 | const { getFirestore, getDoc, doc, updateDoc } = require('firebase/firestore'); 2 | const firebaseApp = require('../helpers/firebase'); 3 | 4 | class FirebaseApiService { 5 | constructor() { 6 | this._db = getFirestore(firebaseApp); 7 | } 8 | 9 | async getShopifyKeys() { 10 | const docRef = doc(this._db, 'keys', 'shopify'); 11 | const docSnap = await getDoc(docRef); 12 | return docSnap.data(); 13 | } 14 | 15 | async saveShopifyKeys(shopifyKeys) { 16 | const docRef = doc(this._db, 'keys', 'shopify'); 17 | await updateDoc(docRef, shopifyKeys); 18 | } 19 | } 20 | 21 | module.exports = FirebaseApiService; 22 | -------------------------------------------------------------------------------- /app/services/shopify-api-service.js: -------------------------------------------------------------------------------- 1 | const { Shopify } = require('@shopify/shopify-api'); 2 | 3 | class ShopifyApiService { 4 | constructor(accessToken) { 5 | this._client = new Shopify.Clients.Rest('purekanawholesale.myshopify.com', accessToken); 6 | } 7 | 8 | async getProducts() { 9 | const products = await this._client.get({ 10 | path: 'products', 11 | }); 12 | 13 | return products.body.products; 14 | } 15 | 16 | async getOrders() { 17 | const orders = await this._client.get({ 18 | path: 'orders', 19 | query: { status: 'any' }, 20 | }); 21 | 22 | return orders.body.orders; 23 | } 24 | 25 | async getCustomers() { 26 | const customers = await this._client.get({ 27 | path: 'customers', 28 | query: { limit: 250 }, 29 | }); 30 | 31 | return customers.body.customers; 32 | } 33 | } 34 | 35 | module.exports = ShopifyApiService; 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pk-admin-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js", 9 | "dev": "nodemon server.js" 10 | }, 11 | "keywords": [ 12 | "node.js", 13 | "express", 14 | "jwt", 15 | "authentication", 16 | "mongodb" 17 | ], 18 | "author": "Eric", 19 | "license": "ISC", 20 | "dependencies": { 21 | "@shopify/shopify-api": "^2.1.0", 22 | "bcryptjs": "^2.4.3", 23 | "body-parser": "^1.19.0", 24 | "cors": "^2.8.5", 25 | "dotenv": "^10.0.0", 26 | "express": "^4.17.1", 27 | "firebase": "^9.6.8", 28 | "fs": "0.0.1-security", 29 | "http": "0.0.1-security", 30 | "https": "^1.0.0", 31 | "jsonwebtoken": "^8.5.1", 32 | "mongoose": "^6.0.12", 33 | "multer": "^1.4.4", 34 | "socket.io": "^4.3.2" 35 | }, 36 | "engines": { 37 | "npm": "8.1.2", 38 | "node": "16.13.2" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const cors = require('cors'); 4 | // const dbConfig = require('./app/config/db.config'); 5 | // const appConfig = require('./app/config/app.config'); 6 | 7 | // const db = require('./app/models'); 8 | // const Users = db.user; 9 | // const Role = db.role; 10 | 11 | const app = express(); 12 | require('dotenv').config(); 13 | 14 | var http = require('http'); 15 | // var https = require('https'); 16 | // var fs = require('fs'); 17 | // const socketIo = require('socket.io'); 18 | 19 | // const corsOptions = { 20 | // origin: ['http://localhost:3000', 'https://admin.purekanawholesale.com/', 'https://api.purekanawholesale.com/'], 21 | // // credentials: true, //access-control-allow-credentials:true 22 | // optionSuccessStatus: 200, 23 | // }; 24 | 25 | // app.use(function (req, res, next) { 26 | // res.header('Access-Control-Allow-Origin', '*'); 27 | // res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 28 | // next(); 29 | // }); 30 | 31 | app.use(cors()); 32 | 33 | // parse requests of content-type - application/json 34 | app.use(bodyParser.json()); 35 | 36 | // parse requests of content-type - application/x-www-form-urlencoded 37 | app.use(bodyParser.urlencoded({ extended: true })); 38 | 39 | app.use('/public', express.static(__dirname + '/app/public')); 40 | 41 | const server = http.createServer(app); 42 | // const io = socketIo(server, { cors: corsOptions }); 43 | 44 | // db.mongoose 45 | // .connect(appConfig.ENVIRONMENT == 'local' ? `mongodb://${dbConfig.HOST}:${dbConfig.PORT}/${dbConfig.DB}` : dbConfig.URL, { 46 | // useNewUrlParser: true, 47 | // useUnifiedTopology: true, 48 | // }) 49 | // .then(() => { 50 | // console.log('Successfully connect to MongoDB.'); 51 | // // initial(); 52 | // }) 53 | // .catch(err => { 54 | // console.error('Connection error', err); 55 | // process.exit(); 56 | // }); 57 | 58 | // function initial() { 59 | // Role.estimatedDocumentCount((err, count) => { 60 | // if (!err && count === 0) { 61 | // new Role({ 62 | // name: 'user', 63 | // }).save(err => { 64 | // if (err) { 65 | // console.log('error', err); 66 | // } 67 | 68 | // console.log("added 'user' to roles collection"); 69 | // }); 70 | 71 | // new Role({ 72 | // name: 'admin', 73 | // }).save(err => { 74 | // if (err) { 75 | // console.log('error', err); 76 | // } 77 | 78 | // console.log("added 'admin' to roles collection"); 79 | // }); 80 | // } 81 | // }); 82 | // } 83 | 84 | //socket IO 85 | 86 | // let users = []; 87 | 88 | // const addUser = (userId, socketId) => { 89 | // !users.some(user => user.userId === userId) && users.push({ userId, socketId }); 90 | // }; 91 | 92 | // const removeUser = socketId => { 93 | // users = users.filter(user => user.socketId !== socketId); 94 | // }; 95 | 96 | // const getUser = userId => { 97 | // return users.find(user => user.userId === userId); 98 | // }; 99 | 100 | // io.on('connection', socket => { 101 | // //add user 102 | // socket.on('addUser', userId => { 103 | // addUser(userId, socket.id); 104 | // console.log('--------EMIT_GET_USER----------'); 105 | // io.emit('getUsers', users); 106 | // }); 107 | 108 | // //send text message 109 | // socket.on('sendTextMessage', pushTextMessage => { 110 | // // const user = getUser(receiverId); 111 | // // io.to(user.socketId).emit("getMessage", { 112 | // // senderId, 113 | // // text, 114 | // // }) 115 | // console.log(pushTextMessage.content); 116 | // io.emit('getMessage', pushTextMessage); 117 | // }); 118 | 119 | // //send image message 120 | // socket.on('sendImageMessage', async pushImageMessage => { 121 | // // const user = getUser(receiverId); 122 | // // io.to(user.socketId).emit("getMessage", { 123 | // // senderId, 124 | // // text, 125 | // // }) 126 | // console.log(pushImageMessage.sender); 127 | // const user = await Users.findOne({ _id: pushImageMessage.sender }); 128 | // let parsedUser = JSON.parse(JSON.stringify(user)); 129 | // let payload = { 130 | // avatar: parsedUser.avatar, 131 | // avatarColor: parsedUser.avatarColor, 132 | // id: parsedUser.id, 133 | // username: parsedUser.username, 134 | // _id: parsedUser._id, 135 | // }; 136 | // pushImageMessage.sender = payload; 137 | // io.emit('getImageMessage', pushImageMessage); 138 | // }); 139 | 140 | // //disconnect user 141 | // socket.on('disconnect', () => { 142 | // console.log('REMOVING...'); 143 | // removeUser(socket.id); 144 | // io.emit('getUsers', users); 145 | // }); 146 | // }); 147 | 148 | // simple route 149 | app.get('/get', (req, res) => { 150 | res.json({ message: 'Welcome to PK Admin application.' }); 151 | }); 152 | 153 | app.post('/data', (req, res) => { 154 | console.log(req.body); 155 | res.json({ message: req.body.msg }); 156 | }); 157 | 158 | require('./app/routes/auth.routes')(app); 159 | require('./app/routes/user.routes')(app); 160 | require('./app/routes/chat.routes')(app); 161 | require('./app/routes/friends.routes')(app); 162 | require('./app/routes/messages.routes')(app); 163 | require('./app/routes/setting.routes')(app); 164 | require('./app/routes/wholesale.routes')(app); 165 | // require('./app/routes/upload.routes')(app); 166 | 167 | // set port, listen for requests 168 | const PORT = process.env.PORT || 5000; 169 | server.listen(PORT, () => { 170 | console.log(`Server is running on port ${PORT}.`); 171 | }); 172 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@firebase/analytics-compat@0.1.6": 6 | "integrity" "sha512-xvdp4/zwOG1f+v9JSpfCQoPJ98HcJR42cEnZ9pRIQLmUy7L7QceIuaF3m+zVtoqa4agBQnJ1dhe58FshOFKOPw==" 7 | "resolved" "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.6.tgz" 8 | "version" "0.1.6" 9 | dependencies: 10 | "@firebase/analytics" "0.7.5" 11 | "@firebase/analytics-types" "0.7.0" 12 | "@firebase/component" "0.5.10" 13 | "@firebase/util" "1.4.3" 14 | "tslib" "^2.1.0" 15 | 16 | "@firebase/analytics-types@0.7.0": 17 | "integrity" "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" 18 | "resolved" "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz" 19 | "version" "0.7.0" 20 | 21 | "@firebase/analytics@0.7.5": 22 | "integrity" "sha512-vrKDh84hBbKPJaU2oAZDewyC79D8opJOQZ5AU3BXBBwEfRjKt3C3jj/Vl6aJUme+RKXlomTw3xcHIOoPzTgBVA==" 23 | "resolved" "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.5.tgz" 24 | "version" "0.7.5" 25 | dependencies: 26 | "@firebase/component" "0.5.10" 27 | "@firebase/installations" "0.5.5" 28 | "@firebase/logger" "0.3.2" 29 | "@firebase/util" "1.4.3" 30 | "tslib" "^2.1.0" 31 | 32 | "@firebase/app-check-compat@0.2.3": 33 | "integrity" "sha512-e2mKkuecr1XgsyTGXKfg83PcV1UdT7+tXYoHIjeBeLrP5gGL4OQbWCzzt6uVQpk1gmJbUktje/rd6Et6cdL+wg==" 34 | "resolved" "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.3.tgz" 35 | "version" "0.2.3" 36 | dependencies: 37 | "@firebase/app-check" "0.5.3" 38 | "@firebase/component" "0.5.10" 39 | "@firebase/logger" "0.3.2" 40 | "@firebase/util" "1.4.3" 41 | "tslib" "^2.1.0" 42 | 43 | "@firebase/app-check-interop-types@0.1.0": 44 | "integrity" "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" 45 | "resolved" "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz" 46 | "version" "0.1.0" 47 | 48 | "@firebase/app-check@0.5.3": 49 | "integrity" "sha512-M2/UO5PgxHCl0wPYWGdF6lO8nqclwuRMCIrc+75xv3/Dr3hhUu4ztF5JNaAV5tktSCt1UrnASG+4rNVifCzSRw==" 50 | "resolved" "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.3.tgz" 51 | "version" "0.5.3" 52 | dependencies: 53 | "@firebase/component" "0.5.10" 54 | "@firebase/logger" "0.3.2" 55 | "@firebase/util" "1.4.3" 56 | "tslib" "^2.1.0" 57 | 58 | "@firebase/app-compat@0.1.19", "@firebase/app-compat@0.x": 59 | "integrity" "sha512-a0TgAXcjF3htSdi10mRwAks1+73nwbmSMXzjlOQDYJ8t3HE7FvHxfB4hjuwHKfgr3MWZjcarsGKVr7LWhUAE8w==" 60 | "resolved" "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.19.tgz" 61 | "version" "0.1.19" 62 | dependencies: 63 | "@firebase/app" "0.7.18" 64 | "@firebase/component" "0.5.10" 65 | "@firebase/logger" "0.3.2" 66 | "@firebase/util" "1.4.3" 67 | "tslib" "^2.1.0" 68 | 69 | "@firebase/app-types@0.7.0", "@firebase/app-types@0.x": 70 | "integrity" "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" 71 | "resolved" "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz" 72 | "version" "0.7.0" 73 | 74 | "@firebase/app@0.7.18", "@firebase/app@0.x": 75 | "integrity" "sha512-jomDaPaEQEWfFUqvxQw4TYSs2gCT2BN0Ec1//3CdMsc1NcppduS31bxsjhn3KdPbtx4opkaZ2FcA+buHtdw9dw==" 76 | "resolved" "https://registry.npmjs.org/@firebase/app/-/app-0.7.18.tgz" 77 | "version" "0.7.18" 78 | dependencies: 79 | "@firebase/component" "0.5.10" 80 | "@firebase/logger" "0.3.2" 81 | "@firebase/util" "1.4.3" 82 | "idb" "3.0.2" 83 | "tslib" "^2.1.0" 84 | 85 | "@firebase/auth-compat@0.2.9": 86 | "integrity" "sha512-VLp7v/IM82JdKPHC3VI10iSO1SgBJSSMD5StT7N/rUF7pvd0cpdjnixKMtsvw5V+G+CGcF99Nf2tRzOZjopT4Q==" 87 | "resolved" "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.9.tgz" 88 | "version" "0.2.9" 89 | dependencies: 90 | "@firebase/auth" "0.19.9" 91 | "@firebase/auth-types" "0.11.0" 92 | "@firebase/component" "0.5.10" 93 | "@firebase/util" "1.4.3" 94 | "node-fetch" "2.6.7" 95 | "selenium-webdriver" "^4.0.0-beta.2" 96 | "tslib" "^2.1.0" 97 | 98 | "@firebase/auth-interop-types@0.1.6": 99 | "integrity" "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" 100 | "resolved" "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz" 101 | "version" "0.1.6" 102 | 103 | "@firebase/auth-types@0.11.0": 104 | "integrity" "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==" 105 | "resolved" "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz" 106 | "version" "0.11.0" 107 | 108 | "@firebase/auth@0.19.9": 109 | "integrity" "sha512-NoB/bCBVFBbJg23C+NqUP29KGaFOZEuLRA4ZKIKYgEfqsNfxMcEW8V+BMaU6n26JecUwNSBi7nPpOh+pWYOsaA==" 110 | "resolved" "https://registry.npmjs.org/@firebase/auth/-/auth-0.19.9.tgz" 111 | "version" "0.19.9" 112 | dependencies: 113 | "@firebase/component" "0.5.10" 114 | "@firebase/logger" "0.3.2" 115 | "@firebase/util" "1.4.3" 116 | "node-fetch" "2.6.7" 117 | "selenium-webdriver" "4.0.0-rc-1" 118 | "tslib" "^2.1.0" 119 | 120 | "@firebase/component@0.5.10": 121 | "integrity" "sha512-mzUpg6rsBbdQJvAdu1rNWabU3O7qdd+B+/ubE1b+pTbBKfw5ySRpRRE6sKcZ/oQuwLh0HHB6FRJHcylmI7jDzA==" 122 | "resolved" "https://registry.npmjs.org/@firebase/component/-/component-0.5.10.tgz" 123 | "version" "0.5.10" 124 | dependencies: 125 | "@firebase/util" "1.4.3" 126 | "tslib" "^2.1.0" 127 | 128 | "@firebase/database-compat@0.1.5": 129 | "integrity" "sha512-UVxkHL24sZfsjsjs+yiKIdYdrWXHrLxSFCYNdwNXDlTkAc0CWP9AAY3feLhBVpUKk+4Cj0I4sGnyIm2C1ltAYg==" 130 | "resolved" "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.5.tgz" 131 | "version" "0.1.5" 132 | dependencies: 133 | "@firebase/component" "0.5.10" 134 | "@firebase/database" "0.12.5" 135 | "@firebase/database-types" "0.9.4" 136 | "@firebase/logger" "0.3.2" 137 | "@firebase/util" "1.4.3" 138 | "tslib" "^2.1.0" 139 | 140 | "@firebase/database-types@0.9.4": 141 | "integrity" "sha512-uAQuc6NUZ5Oh/cWZPeMValtcZ+4L1stgKOeYvz7mLn8+s03tnCDL2N47OLCHdntktVkhImQTwGNARgqhIhtNeA==" 142 | "resolved" "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.4.tgz" 143 | "version" "0.9.4" 144 | dependencies: 145 | "@firebase/app-types" "0.7.0" 146 | "@firebase/util" "1.4.3" 147 | 148 | "@firebase/database@0.12.5": 149 | "integrity" "sha512-1Pd2jYqvqZI7SQWAiXbTZxmsOa29PyOaPiUtr8pkLSfLp4AeyMBegYAXCLYLW6BNhKn3zNKFkxYDxYHq4q+Ixg==" 150 | "resolved" "https://registry.npmjs.org/@firebase/database/-/database-0.12.5.tgz" 151 | "version" "0.12.5" 152 | dependencies: 153 | "@firebase/auth-interop-types" "0.1.6" 154 | "@firebase/component" "0.5.10" 155 | "@firebase/logger" "0.3.2" 156 | "@firebase/util" "1.4.3" 157 | "faye-websocket" "0.11.4" 158 | "tslib" "^2.1.0" 159 | 160 | "@firebase/firestore-compat@0.1.14": 161 | "integrity" "sha512-y/v4eTP44rjeMTy7TXiVa8QgRkE1tpRcdCUyeWqVD9kSHEVG5WY9pHLbHkuoXzSKos5ayM0qlrjpFD79sSCDPw==" 162 | "resolved" "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.14.tgz" 163 | "version" "0.1.14" 164 | dependencies: 165 | "@firebase/component" "0.5.10" 166 | "@firebase/firestore" "3.4.5" 167 | "@firebase/firestore-types" "2.5.0" 168 | "@firebase/util" "1.4.3" 169 | "tslib" "^2.1.0" 170 | 171 | "@firebase/firestore-types@2.5.0": 172 | "integrity" "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==" 173 | "resolved" "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz" 174 | "version" "2.5.0" 175 | 176 | "@firebase/firestore@3.4.5": 177 | "integrity" "sha512-QJF0Z6VL/7boifygyhb6KjLS6pgfZK6FP9rRGdpxWJugQ5b0YV/V3Lr1RdS1A78dPN4eEH9atCkFxUX4z96FeA==" 178 | "resolved" "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.5.tgz" 179 | "version" "3.4.5" 180 | dependencies: 181 | "@firebase/component" "0.5.10" 182 | "@firebase/logger" "0.3.2" 183 | "@firebase/util" "1.4.3" 184 | "@firebase/webchannel-wrapper" "0.6.1" 185 | "@grpc/grpc-js" "^1.3.2" 186 | "@grpc/proto-loader" "^0.6.0" 187 | "node-fetch" "2.6.7" 188 | "tslib" "^2.1.0" 189 | 190 | "@firebase/functions-compat@0.1.9": 191 | "integrity" "sha512-XhcLUVgxwqyk4euz1VO/qM6LUrkbR0vibh/2triR2ciJS2epkpvPICVMxWXaetsKOVpcaTs15eGpJClCRHGLjw==" 192 | "resolved" "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.1.9.tgz" 193 | "version" "0.1.9" 194 | dependencies: 195 | "@firebase/component" "0.5.10" 196 | "@firebase/functions" "0.7.8" 197 | "@firebase/functions-types" "0.5.0" 198 | "@firebase/util" "1.4.3" 199 | "tslib" "^2.1.0" 200 | 201 | "@firebase/functions-types@0.5.0": 202 | "integrity" "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" 203 | "resolved" "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz" 204 | "version" "0.5.0" 205 | 206 | "@firebase/functions@0.7.8": 207 | "integrity" "sha512-WNpKnQqufNkqHkFm1ol4oeF+/mA1y5gtj1csRFZqQS2EeDcq6FCs49abBFpjBOxWz8XDDNlSasCKhIrAAKIFfg==" 208 | "resolved" "https://registry.npmjs.org/@firebase/functions/-/functions-0.7.8.tgz" 209 | "version" "0.7.8" 210 | dependencies: 211 | "@firebase/app-check-interop-types" "0.1.0" 212 | "@firebase/auth-interop-types" "0.1.6" 213 | "@firebase/component" "0.5.10" 214 | "@firebase/messaging-interop-types" "0.1.0" 215 | "@firebase/util" "1.4.3" 216 | "node-fetch" "2.6.7" 217 | "tslib" "^2.1.0" 218 | 219 | "@firebase/installations@0.5.5": 220 | "integrity" "sha512-mYWUxYXPlxcR0YOikPw88TjIS2NK35Z0ivkJL0+FevNnVIsqwGSe12AtPlZB/kzjB0RtHoKW+cWC0V9xiTgJ3Q==" 221 | "resolved" "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.5.tgz" 222 | "version" "0.5.5" 223 | dependencies: 224 | "@firebase/component" "0.5.10" 225 | "@firebase/util" "1.4.3" 226 | "idb" "3.0.2" 227 | "tslib" "^2.1.0" 228 | 229 | "@firebase/logger@0.3.2": 230 | "integrity" "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==" 231 | "resolved" "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz" 232 | "version" "0.3.2" 233 | dependencies: 234 | "tslib" "^2.1.0" 235 | 236 | "@firebase/messaging-compat@0.1.9": 237 | "integrity" "sha512-smcBhvTLfgE2KDtvDj1Pm9zQ7GeyR5BLarYLxtvmhhbV6tpa8g+UUE3pCdqN+y1kx6mIYqNOmEEXv+1YnSiYwQ==" 238 | "resolved" "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.9.tgz" 239 | "version" "0.1.9" 240 | dependencies: 241 | "@firebase/component" "0.5.10" 242 | "@firebase/messaging" "0.9.9" 243 | "@firebase/util" "1.4.3" 244 | "tslib" "^2.1.0" 245 | 246 | "@firebase/messaging-interop-types@0.1.0": 247 | "integrity" "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" 248 | "resolved" "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz" 249 | "version" "0.1.0" 250 | 251 | "@firebase/messaging@0.9.9": 252 | "integrity" "sha512-Fe6+VqFgVuvFOiVerQkPzdmHXnB7urujcKAxK3lRKxgafH89CRvXO1sPnPMvox5/JOCBZrAPok5KA7rOCxBguw==" 253 | "resolved" "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.9.tgz" 254 | "version" "0.9.9" 255 | dependencies: 256 | "@firebase/component" "0.5.10" 257 | "@firebase/installations" "0.5.5" 258 | "@firebase/messaging-interop-types" "0.1.0" 259 | "@firebase/util" "1.4.3" 260 | "idb" "3.0.2" 261 | "tslib" "^2.1.0" 262 | 263 | "@firebase/performance-compat@0.1.5": 264 | "integrity" "sha512-s9mqR0GXJaqvIZD/GsshacpKOGa3NP6Yht33mNEtpL7ERqj35mvD1CBoUwH52eMYAaxlQd9y9JrphQgK3EmWWw==" 265 | "resolved" "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.5.tgz" 266 | "version" "0.1.5" 267 | dependencies: 268 | "@firebase/component" "0.5.10" 269 | "@firebase/logger" "0.3.2" 270 | "@firebase/performance" "0.5.5" 271 | "@firebase/performance-types" "0.1.0" 272 | "@firebase/util" "1.4.3" 273 | "tslib" "^2.1.0" 274 | 275 | "@firebase/performance-types@0.1.0": 276 | "integrity" "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" 277 | "resolved" "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz" 278 | "version" "0.1.0" 279 | 280 | "@firebase/performance@0.5.5": 281 | "integrity" "sha512-eA8mEKVnyY64fwAKxHbJF5t1hNkdR0EZVib0LfEWl/2elPmFcjik097hqLHzdFE88JYCxNGfFaSPo9Lbk/qe6A==" 282 | "resolved" "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.5.tgz" 283 | "version" "0.5.5" 284 | dependencies: 285 | "@firebase/component" "0.5.10" 286 | "@firebase/installations" "0.5.5" 287 | "@firebase/logger" "0.3.2" 288 | "@firebase/util" "1.4.3" 289 | "tslib" "^2.1.0" 290 | 291 | "@firebase/polyfill@0.3.36": 292 | "integrity" "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==" 293 | "resolved" "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz" 294 | "version" "0.3.36" 295 | dependencies: 296 | "core-js" "3.6.5" 297 | "promise-polyfill" "8.1.3" 298 | "whatwg-fetch" "2.0.4" 299 | 300 | "@firebase/remote-config-compat@0.1.5": 301 | "integrity" "sha512-bgpmrCGyOj46c0xNFvivcXRHlaVkbt4mX2etbF9s6jaOILPd4rBHIfAiBpKL64GGwTkrOjWO9/HZun4I01gbpg==" 302 | "resolved" "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.5.tgz" 303 | "version" "0.1.5" 304 | dependencies: 305 | "@firebase/component" "0.5.10" 306 | "@firebase/logger" "0.3.2" 307 | "@firebase/remote-config" "0.3.4" 308 | "@firebase/remote-config-types" "0.2.0" 309 | "@firebase/util" "1.4.3" 310 | "tslib" "^2.1.0" 311 | 312 | "@firebase/remote-config-types@0.2.0": 313 | "integrity" "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" 314 | "resolved" "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz" 315 | "version" "0.2.0" 316 | 317 | "@firebase/remote-config@0.3.4": 318 | "integrity" "sha512-SLlyVVNJ6DnU1AOjNrmv5u9Fge7gUwZVooyxMIkaT3Lj9MBM5MwfJsoG3UyiV4l7yI0iPj34LuKPpMJXOOcs4w==" 319 | "resolved" "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.4.tgz" 320 | "version" "0.3.4" 321 | dependencies: 322 | "@firebase/component" "0.5.10" 323 | "@firebase/installations" "0.5.5" 324 | "@firebase/logger" "0.3.2" 325 | "@firebase/util" "1.4.3" 326 | "tslib" "^2.1.0" 327 | 328 | "@firebase/storage-compat@0.1.10": 329 | "integrity" "sha512-l/mvUhDEJ/0/F2uBqmEqxZk+jvIEwLc9BO6lGPE3TtPdT2896u3GIzbI4XHjSLLUo5bA0ZKz8Z7GVev9CLsHfA==" 330 | "resolved" "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.10.tgz" 331 | "version" "0.1.10" 332 | dependencies: 333 | "@firebase/component" "0.5.10" 334 | "@firebase/storage" "0.9.2" 335 | "@firebase/storage-types" "0.6.0" 336 | "@firebase/util" "1.4.3" 337 | "tslib" "^2.1.0" 338 | 339 | "@firebase/storage-types@0.6.0": 340 | "integrity" "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==" 341 | "resolved" "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz" 342 | "version" "0.6.0" 343 | 344 | "@firebase/storage@0.9.2": 345 | "integrity" "sha512-5xWgVHnE+n+cZAnFYd3NyNAQbp6/t3NL7TdqRGu1OaW5L7ioN7Rhq+L4I2yjIskVCoTaemYQDF+vICjCWoalbA==" 346 | "resolved" "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.2.tgz" 347 | "version" "0.9.2" 348 | dependencies: 349 | "@firebase/component" "0.5.10" 350 | "@firebase/util" "1.4.3" 351 | "node-fetch" "2.6.7" 352 | "tslib" "^2.1.0" 353 | 354 | "@firebase/util@1.4.3", "@firebase/util@1.x": 355 | "integrity" "sha512-gQJl6r0a+MElLQEyU8Dx0kkC2coPj67f/zKZrGR7z7WpLgVanhaCUqEsptwpwoxi9RMFIaebleG+C9xxoARq+Q==" 356 | "resolved" "https://registry.npmjs.org/@firebase/util/-/util-1.4.3.tgz" 357 | "version" "1.4.3" 358 | dependencies: 359 | "tslib" "^2.1.0" 360 | 361 | "@firebase/webchannel-wrapper@0.6.1": 362 | "integrity" "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" 363 | "resolved" "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz" 364 | "version" "0.6.1" 365 | 366 | "@grpc/grpc-js@^1.3.2": 367 | "integrity" "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==" 368 | "resolved" "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz" 369 | "version" "1.5.7" 370 | dependencies: 371 | "@grpc/proto-loader" "^0.6.4" 372 | "@types/node" ">=12.12.47" 373 | 374 | "@grpc/proto-loader@^0.6.0", "@grpc/proto-loader@^0.6.4": 375 | "integrity" "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==" 376 | "resolved" "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz" 377 | "version" "0.6.9" 378 | dependencies: 379 | "@types/long" "^4.0.1" 380 | "lodash.camelcase" "^4.3.0" 381 | "long" "^4.0.0" 382 | "protobufjs" "^6.10.0" 383 | "yargs" "^16.2.0" 384 | 385 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 386 | "integrity" "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 387 | "resolved" "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" 388 | "version" "1.1.2" 389 | 390 | "@protobufjs/base64@^1.1.2": 391 | "integrity" "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 392 | "resolved" "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" 393 | "version" "1.1.2" 394 | 395 | "@protobufjs/codegen@^2.0.4": 396 | "integrity" "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 397 | "resolved" "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" 398 | "version" "2.0.4" 399 | 400 | "@protobufjs/eventemitter@^1.1.0": 401 | "integrity" "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 402 | "resolved" "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" 403 | "version" "1.1.0" 404 | 405 | "@protobufjs/fetch@^1.1.0": 406 | "integrity" "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=" 407 | "resolved" "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" 408 | "version" "1.1.0" 409 | dependencies: 410 | "@protobufjs/aspromise" "^1.1.1" 411 | "@protobufjs/inquire" "^1.1.0" 412 | 413 | "@protobufjs/float@^1.0.2": 414 | "integrity" "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 415 | "resolved" "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" 416 | "version" "1.0.2" 417 | 418 | "@protobufjs/inquire@^1.1.0": 419 | "integrity" "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 420 | "resolved" "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" 421 | "version" "1.1.0" 422 | 423 | "@protobufjs/path@^1.1.2": 424 | "integrity" "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 425 | "resolved" "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" 426 | "version" "1.1.2" 427 | 428 | "@protobufjs/pool@^1.1.0": 429 | "integrity" "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 430 | "resolved" "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" 431 | "version" "1.1.0" 432 | 433 | "@protobufjs/utf8@^1.1.0": 434 | "integrity" "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 435 | "resolved" "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" 436 | "version" "1.1.0" 437 | 438 | "@shopify/network@^1.5.1": 439 | "integrity" "sha512-V+//Et386LnYdtNhQ3e33AKYfU25XEt8H5XYeMqPvJZpVvC9Z1lHKQMpmM/zq13VXjPUjt9/sNxHxMP3I6cbJg==" 440 | "resolved" "https://registry.npmjs.org/@shopify/network/-/network-1.6.4.tgz" 441 | "version" "1.6.4" 442 | 443 | "@shopify/shopify-api@^2.1.0": 444 | "integrity" "sha512-CI+CUc0b2+Iv4AFhKaIAvMpbTddyTIKM3O2Qk0wS1gcj5nRdSFg6JbeVThNOYYu/7rzf93J8qYF1E4OZl920CQ==" 445 | "resolved" "https://registry.npmjs.org/@shopify/shopify-api/-/shopify-api-2.1.0.tgz" 446 | "version" "2.1.0" 447 | dependencies: 448 | "@shopify/network" "^1.5.1" 449 | "@types/jsonwebtoken" "^8.5.0" 450 | "@types/node-fetch" "^2.5.7" 451 | "@types/supertest" "^2.0.10" 452 | "cookies" "^0.8.0" 453 | "jsonwebtoken" "^8.5.1" 454 | "node-fetch" "^2.6.1" 455 | "tslib" "^2.0.3" 456 | "uuid" "^8.3.1" 457 | 458 | "@types/component-emitter@^1.2.10": 459 | "integrity" "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" 460 | "resolved" "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz" 461 | "version" "1.2.11" 462 | 463 | "@types/cookie@^0.4.1": 464 | "integrity" "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" 465 | "resolved" "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" 466 | "version" "0.4.1" 467 | 468 | "@types/cookiejar@*": 469 | "integrity" "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" 470 | "resolved" "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" 471 | "version" "2.1.2" 472 | 473 | "@types/cors@^2.8.12": 474 | "integrity" "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" 475 | "resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" 476 | "version" "2.8.12" 477 | 478 | "@types/jsonwebtoken@^8.5.0": 479 | "integrity" "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==" 480 | "resolved" "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz" 481 | "version" "8.5.8" 482 | dependencies: 483 | "@types/node" "*" 484 | 485 | "@types/long@^4.0.1": 486 | "integrity" "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 487 | "resolved" "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" 488 | "version" "4.0.1" 489 | 490 | "@types/node-fetch@^2.5.7": 491 | "integrity" "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==" 492 | "resolved" "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz" 493 | "version" "2.6.1" 494 | dependencies: 495 | "@types/node" "*" 496 | "form-data" "^3.0.0" 497 | 498 | "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": 499 | "integrity" "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" 500 | "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz" 501 | "version" "16.11.6" 502 | 503 | "@types/superagent@*": 504 | "integrity" "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==" 505 | "resolved" "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz" 506 | "version" "4.1.15" 507 | dependencies: 508 | "@types/cookiejar" "*" 509 | "@types/node" "*" 510 | 511 | "@types/supertest@^2.0.10": 512 | "integrity" "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==" 513 | "resolved" "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz" 514 | "version" "2.0.11" 515 | dependencies: 516 | "@types/superagent" "*" 517 | 518 | "@types/webidl-conversions@*": 519 | "integrity" "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" 520 | "resolved" "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz" 521 | "version" "6.1.1" 522 | 523 | "@types/whatwg-url@^8.2.1": 524 | "integrity" "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==" 525 | "resolved" "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz" 526 | "version" "8.2.1" 527 | dependencies: 528 | "@types/node" "*" 529 | "@types/webidl-conversions" "*" 530 | 531 | "accepts@~1.3.4", "accepts@~1.3.7": 532 | "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" 533 | "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" 534 | "version" "1.3.7" 535 | dependencies: 536 | "mime-types" "~2.1.24" 537 | "negotiator" "0.6.2" 538 | 539 | "ansi-regex@^5.0.1": 540 | "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 541 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 542 | "version" "5.0.1" 543 | 544 | "ansi-styles@^4.0.0": 545 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" 546 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 547 | "version" "4.3.0" 548 | dependencies: 549 | "color-convert" "^2.0.1" 550 | 551 | "append-field@^1.0.0": 552 | "integrity" "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" 553 | "resolved" "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" 554 | "version" "1.0.0" 555 | 556 | "array-flatten@1.1.1": 557 | "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 558 | "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 559 | "version" "1.1.1" 560 | 561 | "asynckit@^0.4.0": 562 | "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 563 | "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 564 | "version" "0.4.0" 565 | 566 | "balanced-match@^1.0.0": 567 | "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 568 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 569 | "version" "1.0.2" 570 | 571 | "base64-arraybuffer@~1.0.1": 572 | "integrity" "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==" 573 | "resolved" "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz" 574 | "version" "1.0.1" 575 | 576 | "base64-js@^1.3.1": 577 | "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 578 | "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 579 | "version" "1.5.1" 580 | 581 | "base64id@~2.0.0", "base64id@2.0.0": 582 | "integrity" "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" 583 | "resolved" "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" 584 | "version" "2.0.0" 585 | 586 | "bcryptjs@^2.4.3": 587 | "integrity" "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 588 | "resolved" "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" 589 | "version" "2.4.3" 590 | 591 | "body-parser@^1.19.0", "body-parser@1.19.0": 592 | "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==" 593 | "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" 594 | "version" "1.19.0" 595 | dependencies: 596 | "bytes" "3.1.0" 597 | "content-type" "~1.0.4" 598 | "debug" "2.6.9" 599 | "depd" "~1.1.2" 600 | "http-errors" "1.7.2" 601 | "iconv-lite" "0.4.24" 602 | "on-finished" "~2.3.0" 603 | "qs" "6.7.0" 604 | "raw-body" "2.4.0" 605 | "type-is" "~1.6.17" 606 | 607 | "brace-expansion@^1.1.7": 608 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 609 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 610 | "version" "1.1.11" 611 | dependencies: 612 | "balanced-match" "^1.0.0" 613 | "concat-map" "0.0.1" 614 | 615 | "bson@^4.2.2", "bson@^4.5.2": 616 | "integrity" "sha512-wIt0bPACnx8Ju9r6IsS2wVtGDHBr9Dxb+U29A1YED2pu8XOhS8aKjOnLZ8sxyXkPwanoK7iWWVhS1+coxde6xA==" 617 | "resolved" "https://registry.npmjs.org/bson/-/bson-4.5.4.tgz" 618 | "version" "4.5.4" 619 | dependencies: 620 | "buffer" "^5.6.0" 621 | 622 | "buffer-equal-constant-time@1.0.1": 623 | "integrity" "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 624 | "resolved" "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" 625 | "version" "1.0.1" 626 | 627 | "buffer-from@^1.0.0": 628 | "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 629 | "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" 630 | "version" "1.1.2" 631 | 632 | "buffer@^5.6.0": 633 | "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" 634 | "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" 635 | "version" "5.7.1" 636 | dependencies: 637 | "base64-js" "^1.3.1" 638 | "ieee754" "^1.1.13" 639 | 640 | "busboy@^0.2.11": 641 | "integrity" "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=" 642 | "resolved" "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz" 643 | "version" "0.2.14" 644 | dependencies: 645 | "dicer" "0.2.5" 646 | "readable-stream" "1.1.x" 647 | 648 | "bytes@3.1.0": 649 | "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 650 | "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" 651 | "version" "3.1.0" 652 | 653 | "cliui@^7.0.2": 654 | "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" 655 | "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" 656 | "version" "7.0.4" 657 | dependencies: 658 | "string-width" "^4.2.0" 659 | "strip-ansi" "^6.0.0" 660 | "wrap-ansi" "^7.0.0" 661 | 662 | "color-convert@^2.0.1": 663 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" 664 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 665 | "version" "2.0.1" 666 | dependencies: 667 | "color-name" "~1.1.4" 668 | 669 | "color-name@~1.1.4": 670 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 671 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 672 | "version" "1.1.4" 673 | 674 | "combined-stream@^1.0.8": 675 | "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" 676 | "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 677 | "version" "1.0.8" 678 | dependencies: 679 | "delayed-stream" "~1.0.0" 680 | 681 | "component-emitter@~1.3.0": 682 | "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 683 | "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" 684 | "version" "1.3.0" 685 | 686 | "concat-map@0.0.1": 687 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 688 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 689 | "version" "0.0.1" 690 | 691 | "concat-stream@^1.5.2": 692 | "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" 693 | "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" 694 | "version" "1.6.2" 695 | dependencies: 696 | "buffer-from" "^1.0.0" 697 | "inherits" "^2.0.3" 698 | "readable-stream" "^2.2.2" 699 | "typedarray" "^0.0.6" 700 | 701 | "content-disposition@0.5.3": 702 | "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" 703 | "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" 704 | "version" "0.5.3" 705 | dependencies: 706 | "safe-buffer" "5.1.2" 707 | 708 | "content-type@~1.0.4": 709 | "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 710 | "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" 711 | "version" "1.0.4" 712 | 713 | "cookie-signature@1.0.6": 714 | "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 715 | "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 716 | "version" "1.0.6" 717 | 718 | "cookie@~0.4.1": 719 | "integrity" "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 720 | "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" 721 | "version" "0.4.1" 722 | 723 | "cookie@0.4.0": 724 | "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 725 | "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" 726 | "version" "0.4.0" 727 | 728 | "cookies@^0.8.0": 729 | "integrity" "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==" 730 | "resolved" "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz" 731 | "version" "0.8.0" 732 | dependencies: 733 | "depd" "~2.0.0" 734 | "keygrip" "~1.1.0" 735 | 736 | "core-js@3.6.5": 737 | "integrity" "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 738 | "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz" 739 | "version" "3.6.5" 740 | 741 | "core-util-is@~1.0.0": 742 | "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 743 | "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" 744 | "version" "1.0.3" 745 | 746 | "cors@^2.8.5", "cors@~2.8.5": 747 | "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" 748 | "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" 749 | "version" "2.8.5" 750 | dependencies: 751 | "object-assign" "^4" 752 | "vary" "^1" 753 | 754 | "debug@~4.3.1": 755 | "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==" 756 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" 757 | "version" "4.3.2" 758 | dependencies: 759 | "ms" "2.1.2" 760 | 761 | "debug@~4.3.2": 762 | "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==" 763 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" 764 | "version" "4.3.2" 765 | dependencies: 766 | "ms" "2.1.2" 767 | 768 | "debug@2.6.9": 769 | "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" 770 | "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 771 | "version" "2.6.9" 772 | dependencies: 773 | "ms" "2.0.0" 774 | 775 | "debug@4.x": 776 | "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==" 777 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" 778 | "version" "4.3.2" 779 | dependencies: 780 | "ms" "2.1.2" 781 | 782 | "delayed-stream@~1.0.0": 783 | "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 784 | "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 785 | "version" "1.0.0" 786 | 787 | "denque@^2.0.1": 788 | "integrity" "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" 789 | "resolved" "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz" 790 | "version" "2.0.1" 791 | 792 | "depd@~1.1.2": 793 | "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 794 | "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" 795 | "version" "1.1.2" 796 | 797 | "depd@~2.0.0": 798 | "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 799 | "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" 800 | "version" "2.0.0" 801 | 802 | "destroy@~1.0.4": 803 | "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 804 | "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" 805 | "version" "1.0.4" 806 | 807 | "dicer@0.2.5": 808 | "integrity" "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=" 809 | "resolved" "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz" 810 | "version" "0.2.5" 811 | dependencies: 812 | "readable-stream" "1.1.x" 813 | "streamsearch" "0.1.2" 814 | 815 | "dotenv@^10.0.0": 816 | "integrity" "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" 817 | "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" 818 | "version" "10.0.0" 819 | 820 | "ecdsa-sig-formatter@1.0.11": 821 | "integrity" "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" 822 | "resolved" "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" 823 | "version" "1.0.11" 824 | dependencies: 825 | "safe-buffer" "^5.0.1" 826 | 827 | "ee-first@1.1.1": 828 | "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 829 | "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 830 | "version" "1.1.1" 831 | 832 | "emoji-regex@^8.0.0": 833 | "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 834 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 835 | "version" "8.0.0" 836 | 837 | "encodeurl@~1.0.2": 838 | "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 839 | "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 840 | "version" "1.0.2" 841 | 842 | "engine.io-parser@~5.0.0": 843 | "integrity" "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==" 844 | "resolved" "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz" 845 | "version" "5.0.1" 846 | dependencies: 847 | "base64-arraybuffer" "~1.0.1" 848 | 849 | "engine.io@~6.0.0": 850 | "integrity" "sha512-Y53UaciUh2Rmx5MiogtMxOQcfh7pnemday+Bb4QDg0Wjmnvo/VTvuEyNGQgYmh8L7VOe8Je1QuiqjLNDelMqLA==" 851 | "resolved" "https://registry.npmjs.org/engine.io/-/engine.io-6.0.1.tgz" 852 | "version" "6.0.1" 853 | dependencies: 854 | "@types/cookie" "^0.4.1" 855 | "@types/cors" "^2.8.12" 856 | "@types/node" ">=10.0.0" 857 | "accepts" "~1.3.4" 858 | "base64id" "2.0.0" 859 | "cookie" "~0.4.1" 860 | "cors" "~2.8.5" 861 | "debug" "~4.3.1" 862 | "engine.io-parser" "~5.0.0" 863 | "ws" "~8.2.3" 864 | 865 | "escalade@^3.1.1": 866 | "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 867 | "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 868 | "version" "3.1.1" 869 | 870 | "escape-html@~1.0.3": 871 | "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 872 | "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 873 | "version" "1.0.3" 874 | 875 | "etag@~1.8.1": 876 | "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 877 | "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 878 | "version" "1.8.1" 879 | 880 | "express@^4.17.1": 881 | "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==" 882 | "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz" 883 | "version" "4.17.1" 884 | dependencies: 885 | "accepts" "~1.3.7" 886 | "array-flatten" "1.1.1" 887 | "body-parser" "1.19.0" 888 | "content-disposition" "0.5.3" 889 | "content-type" "~1.0.4" 890 | "cookie" "0.4.0" 891 | "cookie-signature" "1.0.6" 892 | "debug" "2.6.9" 893 | "depd" "~1.1.2" 894 | "encodeurl" "~1.0.2" 895 | "escape-html" "~1.0.3" 896 | "etag" "~1.8.1" 897 | "finalhandler" "~1.1.2" 898 | "fresh" "0.5.2" 899 | "merge-descriptors" "1.0.1" 900 | "methods" "~1.1.2" 901 | "on-finished" "~2.3.0" 902 | "parseurl" "~1.3.3" 903 | "path-to-regexp" "0.1.7" 904 | "proxy-addr" "~2.0.5" 905 | "qs" "6.7.0" 906 | "range-parser" "~1.2.1" 907 | "safe-buffer" "5.1.2" 908 | "send" "0.17.1" 909 | "serve-static" "1.14.1" 910 | "setprototypeof" "1.1.1" 911 | "statuses" "~1.5.0" 912 | "type-is" "~1.6.18" 913 | "utils-merge" "1.0.1" 914 | "vary" "~1.1.2" 915 | 916 | "faye-websocket@0.11.4": 917 | "integrity" "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==" 918 | "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" 919 | "version" "0.11.4" 920 | dependencies: 921 | "websocket-driver" ">=0.5.1" 922 | 923 | "finalhandler@~1.1.2": 924 | "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" 925 | "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" 926 | "version" "1.1.2" 927 | dependencies: 928 | "debug" "2.6.9" 929 | "encodeurl" "~1.0.2" 930 | "escape-html" "~1.0.3" 931 | "on-finished" "~2.3.0" 932 | "parseurl" "~1.3.3" 933 | "statuses" "~1.5.0" 934 | "unpipe" "~1.0.0" 935 | 936 | "firebase@^9.6.8": 937 | "integrity" "sha512-a/RcgiqK9L5d/ZKpHZ21c3x/KKIo2XwXp2droukbBTuaX0Md8ppHQWYlSqLmWIDR0y2zwN17lrfNVsE6f+4ncA==" 938 | "resolved" "https://registry.npmjs.org/firebase/-/firebase-9.6.8.tgz" 939 | "version" "9.6.8" 940 | dependencies: 941 | "@firebase/analytics" "0.7.5" 942 | "@firebase/analytics-compat" "0.1.6" 943 | "@firebase/app" "0.7.18" 944 | "@firebase/app-check" "0.5.3" 945 | "@firebase/app-check-compat" "0.2.3" 946 | "@firebase/app-compat" "0.1.19" 947 | "@firebase/app-types" "0.7.0" 948 | "@firebase/auth" "0.19.9" 949 | "@firebase/auth-compat" "0.2.9" 950 | "@firebase/database" "0.12.5" 951 | "@firebase/database-compat" "0.1.5" 952 | "@firebase/firestore" "3.4.5" 953 | "@firebase/firestore-compat" "0.1.14" 954 | "@firebase/functions" "0.7.8" 955 | "@firebase/functions-compat" "0.1.9" 956 | "@firebase/installations" "0.5.5" 957 | "@firebase/messaging" "0.9.9" 958 | "@firebase/messaging-compat" "0.1.9" 959 | "@firebase/performance" "0.5.5" 960 | "@firebase/performance-compat" "0.1.5" 961 | "@firebase/polyfill" "0.3.36" 962 | "@firebase/remote-config" "0.3.4" 963 | "@firebase/remote-config-compat" "0.1.5" 964 | "@firebase/storage" "0.9.2" 965 | "@firebase/storage-compat" "0.1.10" 966 | "@firebase/util" "1.4.3" 967 | 968 | "form-data@^3.0.0": 969 | "integrity" "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==" 970 | "resolved" "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" 971 | "version" "3.0.1" 972 | dependencies: 973 | "asynckit" "^0.4.0" 974 | "combined-stream" "^1.0.8" 975 | "mime-types" "^2.1.12" 976 | 977 | "forwarded@0.2.0": 978 | "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 979 | "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" 980 | "version" "0.2.0" 981 | 982 | "fresh@0.5.2": 983 | "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 984 | "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 985 | "version" "0.5.2" 986 | 987 | "fs.realpath@^1.0.0": 988 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 989 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 990 | "version" "1.0.0" 991 | 992 | "fs@0.0.1-security": 993 | "integrity" "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" 994 | "resolved" "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" 995 | "version" "0.0.1-security" 996 | 997 | "get-caller-file@^2.0.5": 998 | "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 999 | "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 1000 | "version" "2.0.5" 1001 | 1002 | "glob@^7.1.3": 1003 | "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" 1004 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" 1005 | "version" "7.2.0" 1006 | dependencies: 1007 | "fs.realpath" "^1.0.0" 1008 | "inflight" "^1.0.4" 1009 | "inherits" "2" 1010 | "minimatch" "^3.0.4" 1011 | "once" "^1.3.0" 1012 | "path-is-absolute" "^1.0.0" 1013 | 1014 | "http-errors@~1.7.2", "http-errors@1.7.2": 1015 | "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==" 1016 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" 1017 | "version" "1.7.2" 1018 | dependencies: 1019 | "depd" "~1.1.2" 1020 | "inherits" "2.0.3" 1021 | "setprototypeof" "1.1.1" 1022 | "statuses" ">= 1.5.0 < 2" 1023 | "toidentifier" "1.0.0" 1024 | 1025 | "http-parser-js@>=0.5.1": 1026 | "integrity" "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" 1027 | "resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" 1028 | "version" "0.5.6" 1029 | 1030 | "http@0.0.1-security": 1031 | "integrity" "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" 1032 | "resolved" "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz" 1033 | "version" "0.0.1-security" 1034 | 1035 | "https@^1.0.0": 1036 | "integrity" "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" 1037 | "resolved" "https://registry.npmjs.org/https/-/https-1.0.0.tgz" 1038 | "version" "1.0.0" 1039 | 1040 | "iconv-lite@0.4.24": 1041 | "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" 1042 | "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 1043 | "version" "0.4.24" 1044 | dependencies: 1045 | "safer-buffer" ">= 2.1.2 < 3" 1046 | 1047 | "idb@3.0.2": 1048 | "integrity" "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" 1049 | "resolved" "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz" 1050 | "version" "3.0.2" 1051 | 1052 | "ieee754@^1.1.13": 1053 | "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1054 | "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" 1055 | "version" "1.2.1" 1056 | 1057 | "immediate@~3.0.5": 1058 | "integrity" "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" 1059 | "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" 1060 | "version" "3.0.6" 1061 | 1062 | "inflight@^1.0.4": 1063 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 1064 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 1065 | "version" "1.0.6" 1066 | dependencies: 1067 | "once" "^1.3.0" 1068 | "wrappy" "1" 1069 | 1070 | "inherits@^2.0.3", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2", "inherits@2.0.3": 1071 | "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1072 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 1073 | "version" "2.0.3" 1074 | 1075 | "ipaddr.js@1.9.1": 1076 | "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1077 | "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 1078 | "version" "1.9.1" 1079 | 1080 | "is-fullwidth-code-point@^3.0.0": 1081 | "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1082 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 1083 | "version" "3.0.0" 1084 | 1085 | "isarray@~1.0.0": 1086 | "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1087 | "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 1088 | "version" "1.0.0" 1089 | 1090 | "isarray@0.0.1": 1091 | "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1092 | "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" 1093 | "version" "0.0.1" 1094 | 1095 | "jsonwebtoken@^8.5.1": 1096 | "integrity" "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==" 1097 | "resolved" "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" 1098 | "version" "8.5.1" 1099 | dependencies: 1100 | "jws" "^3.2.2" 1101 | "lodash.includes" "^4.3.0" 1102 | "lodash.isboolean" "^3.0.3" 1103 | "lodash.isinteger" "^4.0.4" 1104 | "lodash.isnumber" "^3.0.3" 1105 | "lodash.isplainobject" "^4.0.6" 1106 | "lodash.isstring" "^4.0.1" 1107 | "lodash.once" "^4.0.0" 1108 | "ms" "^2.1.1" 1109 | "semver" "^5.6.0" 1110 | 1111 | "jszip@^3.6.0": 1112 | "integrity" "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==" 1113 | "resolved" "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz" 1114 | "version" "3.7.1" 1115 | dependencies: 1116 | "lie" "~3.3.0" 1117 | "pako" "~1.0.2" 1118 | "readable-stream" "~2.3.6" 1119 | "set-immediate-shim" "~1.0.1" 1120 | 1121 | "jwa@^1.4.1": 1122 | "integrity" "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==" 1123 | "resolved" "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" 1124 | "version" "1.4.1" 1125 | dependencies: 1126 | "buffer-equal-constant-time" "1.0.1" 1127 | "ecdsa-sig-formatter" "1.0.11" 1128 | "safe-buffer" "^5.0.1" 1129 | 1130 | "jws@^3.2.2": 1131 | "integrity" "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==" 1132 | "resolved" "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" 1133 | "version" "3.2.2" 1134 | dependencies: 1135 | "jwa" "^1.4.1" 1136 | "safe-buffer" "^5.0.1" 1137 | 1138 | "kareem@2.3.2": 1139 | "integrity" "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" 1140 | "resolved" "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz" 1141 | "version" "2.3.2" 1142 | 1143 | "keygrip@~1.1.0": 1144 | "integrity" "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==" 1145 | "resolved" "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz" 1146 | "version" "1.1.0" 1147 | dependencies: 1148 | "tsscmp" "1.0.6" 1149 | 1150 | "lie@~3.3.0": 1151 | "integrity" "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==" 1152 | "resolved" "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" 1153 | "version" "3.3.0" 1154 | dependencies: 1155 | "immediate" "~3.0.5" 1156 | 1157 | "lodash.camelcase@^4.3.0": 1158 | "integrity" "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1159 | "resolved" "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" 1160 | "version" "4.3.0" 1161 | 1162 | "lodash.includes@^4.3.0": 1163 | "integrity" "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1164 | "resolved" "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" 1165 | "version" "4.3.0" 1166 | 1167 | "lodash.isboolean@^3.0.3": 1168 | "integrity" "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1169 | "resolved" "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" 1170 | "version" "3.0.3" 1171 | 1172 | "lodash.isinteger@^4.0.4": 1173 | "integrity" "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1174 | "resolved" "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" 1175 | "version" "4.0.4" 1176 | 1177 | "lodash.isnumber@^3.0.3": 1178 | "integrity" "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1179 | "resolved" "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" 1180 | "version" "3.0.3" 1181 | 1182 | "lodash.isplainobject@^4.0.6": 1183 | "integrity" "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1184 | "resolved" "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" 1185 | "version" "4.0.6" 1186 | 1187 | "lodash.isstring@^4.0.1": 1188 | "integrity" "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1189 | "resolved" "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" 1190 | "version" "4.0.1" 1191 | 1192 | "lodash.once@^4.0.0": 1193 | "integrity" "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1194 | "resolved" "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" 1195 | "version" "4.1.1" 1196 | 1197 | "long@^4.0.0": 1198 | "integrity" "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1199 | "resolved" "https://registry.npmjs.org/long/-/long-4.0.0.tgz" 1200 | "version" "4.0.0" 1201 | 1202 | "media-typer@0.3.0": 1203 | "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1204 | "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 1205 | "version" "0.3.0" 1206 | 1207 | "memory-pager@^1.0.2": 1208 | "integrity" "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 1209 | "resolved" "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" 1210 | "version" "1.5.0" 1211 | 1212 | "merge-descriptors@1.0.1": 1213 | "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1214 | "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" 1215 | "version" "1.0.1" 1216 | 1217 | "methods@~1.1.2": 1218 | "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1219 | "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 1220 | "version" "1.1.2" 1221 | 1222 | "mime-db@1.50.0": 1223 | "integrity" "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" 1224 | "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz" 1225 | "version" "1.50.0" 1226 | 1227 | "mime-types@^2.1.12", "mime-types@~2.1.24": 1228 | "integrity" "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==" 1229 | "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz" 1230 | "version" "2.1.33" 1231 | dependencies: 1232 | "mime-db" "1.50.0" 1233 | 1234 | "mime@1.6.0": 1235 | "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1236 | "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 1237 | "version" "1.6.0" 1238 | 1239 | "minimatch@^3.0.4": 1240 | "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" 1241 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 1242 | "version" "3.1.2" 1243 | dependencies: 1244 | "brace-expansion" "^1.1.7" 1245 | 1246 | "minimist@^1.2.5": 1247 | "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1248 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" 1249 | "version" "1.2.5" 1250 | 1251 | "mkdirp@^0.5.4": 1252 | "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" 1253 | "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" 1254 | "version" "0.5.5" 1255 | dependencies: 1256 | "minimist" "^1.2.5" 1257 | 1258 | "mongodb-connection-string-url@^2.0.0": 1259 | "integrity" "sha512-Qf9Zw7KGiRljWvMrrUFDdVqo46KIEiDuCzvEN97rh/PcKzk2bd6n9KuzEwBwW9xo5glwx69y1mI6s+jFUD/aIQ==" 1260 | "resolved" "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.1.0.tgz" 1261 | "version" "2.1.0" 1262 | dependencies: 1263 | "@types/whatwg-url" "^8.2.1" 1264 | "whatwg-url" "^9.1.0" 1265 | 1266 | "mongodb@4.1.3": 1267 | "integrity" "sha512-lHvTqODBiSpuqjpCj48DOyYWS6Iq6ElJNUiH9HWdQtONyOfjgsKzJULipWduMGsSzaNO4nFi/kmlMFCLvjox/Q==" 1268 | "resolved" "https://registry.npmjs.org/mongodb/-/mongodb-4.1.3.tgz" 1269 | "version" "4.1.3" 1270 | dependencies: 1271 | "bson" "^4.5.2" 1272 | "denque" "^2.0.1" 1273 | "mongodb-connection-string-url" "^2.0.0" 1274 | optionalDependencies: 1275 | "saslprep" "^1.0.3" 1276 | 1277 | "mongoose@^6.0.12": 1278 | "integrity" "sha512-BvsZk7zEEhb1AgQFLtxN9C+7qgy5edRuA3ZDDwHU+kHG/HM44vI6FdKV5m6HVdAUeCHHQTiVv+YQh8BRsToSHw==" 1279 | "resolved" "https://registry.npmjs.org/mongoose/-/mongoose-6.0.12.tgz" 1280 | "version" "6.0.12" 1281 | dependencies: 1282 | "bson" "^4.2.2" 1283 | "kareem" "2.3.2" 1284 | "mongodb" "4.1.3" 1285 | "mpath" "0.8.4" 1286 | "mquery" "4.0.0" 1287 | "ms" "2.1.2" 1288 | "regexp-clone" "1.0.0" 1289 | "sift" "13.5.2" 1290 | "sliced" "1.0.1" 1291 | 1292 | "mpath@0.8.4": 1293 | "integrity" "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" 1294 | "resolved" "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz" 1295 | "version" "0.8.4" 1296 | 1297 | "mquery@4.0.0": 1298 | "integrity" "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==" 1299 | "resolved" "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz" 1300 | "version" "4.0.0" 1301 | dependencies: 1302 | "debug" "4.x" 1303 | "regexp-clone" "^1.0.0" 1304 | "sliced" "1.0.1" 1305 | 1306 | "ms@^2.1.1": 1307 | "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1308 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 1309 | "version" "2.1.3" 1310 | 1311 | "ms@2.0.0": 1312 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1313 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 1314 | "version" "2.0.0" 1315 | 1316 | "ms@2.1.1": 1317 | "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1318 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" 1319 | "version" "2.1.1" 1320 | 1321 | "ms@2.1.2": 1322 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1323 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1324 | "version" "2.1.2" 1325 | 1326 | "multer@^1.4.4": 1327 | "integrity" "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==" 1328 | "resolved" "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz" 1329 | "version" "1.4.4" 1330 | dependencies: 1331 | "append-field" "^1.0.0" 1332 | "busboy" "^0.2.11" 1333 | "concat-stream" "^1.5.2" 1334 | "mkdirp" "^0.5.4" 1335 | "object-assign" "^4.1.1" 1336 | "on-finished" "^2.3.0" 1337 | "type-is" "^1.6.4" 1338 | "xtend" "^4.0.0" 1339 | 1340 | "negotiator@0.6.2": 1341 | "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1342 | "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" 1343 | "version" "0.6.2" 1344 | 1345 | "node-fetch@^2.6.1", "node-fetch@2.6.7": 1346 | "integrity" "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==" 1347 | "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" 1348 | "version" "2.6.7" 1349 | dependencies: 1350 | "whatwg-url" "^5.0.0" 1351 | 1352 | "object-assign@^4", "object-assign@^4.1.1": 1353 | "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1354 | "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 1355 | "version" "4.1.1" 1356 | 1357 | "on-finished@^2.3.0", "on-finished@~2.3.0": 1358 | "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" 1359 | "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" 1360 | "version" "2.3.0" 1361 | dependencies: 1362 | "ee-first" "1.1.1" 1363 | 1364 | "once@^1.3.0": 1365 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1366 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1367 | "version" "1.4.0" 1368 | dependencies: 1369 | "wrappy" "1" 1370 | 1371 | "pako@~1.0.2": 1372 | "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1373 | "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" 1374 | "version" "1.0.11" 1375 | 1376 | "parseurl@~1.3.3": 1377 | "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1378 | "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 1379 | "version" "1.3.3" 1380 | 1381 | "path-is-absolute@^1.0.0": 1382 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1383 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1384 | "version" "1.0.1" 1385 | 1386 | "path-to-regexp@0.1.7": 1387 | "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1388 | "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" 1389 | "version" "0.1.7" 1390 | 1391 | "process-nextick-args@~2.0.0": 1392 | "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1393 | "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" 1394 | "version" "2.0.1" 1395 | 1396 | "promise-polyfill@8.1.3": 1397 | "integrity" "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" 1398 | "resolved" "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz" 1399 | "version" "8.1.3" 1400 | 1401 | "protobufjs@^6.10.0": 1402 | "integrity" "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==" 1403 | "resolved" "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz" 1404 | "version" "6.11.2" 1405 | dependencies: 1406 | "@protobufjs/aspromise" "^1.1.2" 1407 | "@protobufjs/base64" "^1.1.2" 1408 | "@protobufjs/codegen" "^2.0.4" 1409 | "@protobufjs/eventemitter" "^1.1.0" 1410 | "@protobufjs/fetch" "^1.1.0" 1411 | "@protobufjs/float" "^1.0.2" 1412 | "@protobufjs/inquire" "^1.1.0" 1413 | "@protobufjs/path" "^1.1.2" 1414 | "@protobufjs/pool" "^1.1.0" 1415 | "@protobufjs/utf8" "^1.1.0" 1416 | "@types/long" "^4.0.1" 1417 | "@types/node" ">=13.7.0" 1418 | "long" "^4.0.0" 1419 | 1420 | "proxy-addr@~2.0.5": 1421 | "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" 1422 | "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" 1423 | "version" "2.0.7" 1424 | dependencies: 1425 | "forwarded" "0.2.0" 1426 | "ipaddr.js" "1.9.1" 1427 | 1428 | "punycode@^2.1.1": 1429 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1430 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 1431 | "version" "2.1.1" 1432 | 1433 | "qs@6.7.0": 1434 | "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1435 | "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" 1436 | "version" "6.7.0" 1437 | 1438 | "range-parser@~1.2.1": 1439 | "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1440 | "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 1441 | "version" "1.2.1" 1442 | 1443 | "raw-body@2.4.0": 1444 | "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==" 1445 | "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" 1446 | "version" "2.4.0" 1447 | dependencies: 1448 | "bytes" "3.1.0" 1449 | "http-errors" "1.7.2" 1450 | "iconv-lite" "0.4.24" 1451 | "unpipe" "1.0.0" 1452 | 1453 | "readable-stream@^2.2.2": 1454 | "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" 1455 | "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" 1456 | "version" "2.3.7" 1457 | dependencies: 1458 | "core-util-is" "~1.0.0" 1459 | "inherits" "~2.0.3" 1460 | "isarray" "~1.0.0" 1461 | "process-nextick-args" "~2.0.0" 1462 | "safe-buffer" "~5.1.1" 1463 | "string_decoder" "~1.1.1" 1464 | "util-deprecate" "~1.0.1" 1465 | 1466 | "readable-stream@~2.3.6": 1467 | "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" 1468 | "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" 1469 | "version" "2.3.7" 1470 | dependencies: 1471 | "core-util-is" "~1.0.0" 1472 | "inherits" "~2.0.3" 1473 | "isarray" "~1.0.0" 1474 | "process-nextick-args" "~2.0.0" 1475 | "safe-buffer" "~5.1.1" 1476 | "string_decoder" "~1.1.1" 1477 | "util-deprecate" "~1.0.1" 1478 | 1479 | "readable-stream@1.1.x": 1480 | "integrity" "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=" 1481 | "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" 1482 | "version" "1.1.14" 1483 | dependencies: 1484 | "core-util-is" "~1.0.0" 1485 | "inherits" "~2.0.1" 1486 | "isarray" "0.0.1" 1487 | "string_decoder" "~0.10.x" 1488 | 1489 | "regexp-clone@^1.0.0", "regexp-clone@1.0.0": 1490 | "integrity" "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1491 | "resolved" "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz" 1492 | "version" "1.0.0" 1493 | 1494 | "require-directory@^2.1.1": 1495 | "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1496 | "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1497 | "version" "2.1.1" 1498 | 1499 | "rimraf@^3.0.0", "rimraf@^3.0.2": 1500 | "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" 1501 | "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1502 | "version" "3.0.2" 1503 | dependencies: 1504 | "glob" "^7.1.3" 1505 | 1506 | "safe-buffer@^5.0.1", "safe-buffer@>=5.1.0", "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2": 1507 | "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1508 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 1509 | "version" "5.1.2" 1510 | 1511 | "safer-buffer@>= 2.1.2 < 3": 1512 | "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1513 | "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1514 | "version" "2.1.2" 1515 | 1516 | "saslprep@^1.0.3": 1517 | "integrity" "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==" 1518 | "resolved" "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz" 1519 | "version" "1.0.3" 1520 | dependencies: 1521 | "sparse-bitfield" "^3.0.3" 1522 | 1523 | "selenium-webdriver@^4.0.0-beta.2", "selenium-webdriver@4.0.0-rc-1": 1524 | "integrity" "sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw==" 1525 | "resolved" "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz" 1526 | "version" "4.0.0-rc-1" 1527 | dependencies: 1528 | "jszip" "^3.6.0" 1529 | "rimraf" "^3.0.2" 1530 | "tmp" "^0.2.1" 1531 | "ws" ">=7.4.6" 1532 | 1533 | "semver@^5.6.0": 1534 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1535 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1536 | "version" "5.7.1" 1537 | 1538 | "send@0.17.1": 1539 | "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" 1540 | "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz" 1541 | "version" "0.17.1" 1542 | dependencies: 1543 | "debug" "2.6.9" 1544 | "depd" "~1.1.2" 1545 | "destroy" "~1.0.4" 1546 | "encodeurl" "~1.0.2" 1547 | "escape-html" "~1.0.3" 1548 | "etag" "~1.8.1" 1549 | "fresh" "0.5.2" 1550 | "http-errors" "~1.7.2" 1551 | "mime" "1.6.0" 1552 | "ms" "2.1.1" 1553 | "on-finished" "~2.3.0" 1554 | "range-parser" "~1.2.1" 1555 | "statuses" "~1.5.0" 1556 | 1557 | "serve-static@1.14.1": 1558 | "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==" 1559 | "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" 1560 | "version" "1.14.1" 1561 | dependencies: 1562 | "encodeurl" "~1.0.2" 1563 | "escape-html" "~1.0.3" 1564 | "parseurl" "~1.3.3" 1565 | "send" "0.17.1" 1566 | 1567 | "set-immediate-shim@~1.0.1": 1568 | "integrity" "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 1569 | "resolved" "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" 1570 | "version" "1.0.1" 1571 | 1572 | "setprototypeof@1.1.1": 1573 | "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1574 | "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" 1575 | "version" "1.1.1" 1576 | 1577 | "sift@13.5.2": 1578 | "integrity" "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" 1579 | "resolved" "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz" 1580 | "version" "13.5.2" 1581 | 1582 | "sliced@1.0.1": 1583 | "integrity" "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1584 | "resolved" "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz" 1585 | "version" "1.0.1" 1586 | 1587 | "socket.io-adapter@~2.3.2": 1588 | "integrity" "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" 1589 | "resolved" "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz" 1590 | "version" "2.3.2" 1591 | 1592 | "socket.io-parser@~4.0.4": 1593 | "integrity" "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==" 1594 | "resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz" 1595 | "version" "4.0.4" 1596 | dependencies: 1597 | "@types/component-emitter" "^1.2.10" 1598 | "component-emitter" "~1.3.0" 1599 | "debug" "~4.3.1" 1600 | 1601 | "socket.io@^4.3.2": 1602 | "integrity" "sha512-6S5tV4jcY6dbZ/lLzD6EkvNWI3s81JO6ABP/EpvOlK1NPOcIj3AS4khi6xXw6JlZCASq82HQV4SapfmVMMl2dg==" 1603 | "resolved" "https://registry.npmjs.org/socket.io/-/socket.io-4.3.2.tgz" 1604 | "version" "4.3.2" 1605 | dependencies: 1606 | "accepts" "~1.3.4" 1607 | "base64id" "~2.0.0" 1608 | "debug" "~4.3.2" 1609 | "engine.io" "~6.0.0" 1610 | "socket.io-adapter" "~2.3.2" 1611 | "socket.io-parser" "~4.0.4" 1612 | 1613 | "sparse-bitfield@^3.0.3": 1614 | "integrity" "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=" 1615 | "resolved" "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" 1616 | "version" "3.0.3" 1617 | dependencies: 1618 | "memory-pager" "^1.0.2" 1619 | 1620 | "statuses@>= 1.5.0 < 2", "statuses@~1.5.0": 1621 | "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1622 | "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" 1623 | "version" "1.5.0" 1624 | 1625 | "streamsearch@0.1.2": 1626 | "integrity" "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1627 | "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" 1628 | "version" "0.1.2" 1629 | 1630 | "string_decoder@~0.10.x": 1631 | "integrity" "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1632 | "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" 1633 | "version" "0.10.31" 1634 | 1635 | "string_decoder@~1.1.1": 1636 | "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" 1637 | "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" 1638 | "version" "1.1.1" 1639 | dependencies: 1640 | "safe-buffer" "~5.1.0" 1641 | 1642 | "string-width@^4.1.0", "string-width@^4.2.0": 1643 | "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" 1644 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1645 | "version" "4.2.3" 1646 | dependencies: 1647 | "emoji-regex" "^8.0.0" 1648 | "is-fullwidth-code-point" "^3.0.0" 1649 | "strip-ansi" "^6.0.1" 1650 | 1651 | "strip-ansi@^6.0.0", "strip-ansi@^6.0.1": 1652 | "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" 1653 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1654 | "version" "6.0.1" 1655 | dependencies: 1656 | "ansi-regex" "^5.0.1" 1657 | 1658 | "tmp@^0.2.1": 1659 | "integrity" "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==" 1660 | "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" 1661 | "version" "0.2.1" 1662 | dependencies: 1663 | "rimraf" "^3.0.0" 1664 | 1665 | "toidentifier@1.0.0": 1666 | "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1667 | "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" 1668 | "version" "1.0.0" 1669 | 1670 | "tr46@^2.1.0": 1671 | "integrity" "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==" 1672 | "resolved" "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" 1673 | "version" "2.1.0" 1674 | dependencies: 1675 | "punycode" "^2.1.1" 1676 | 1677 | "tr46@~0.0.3": 1678 | "integrity" "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1679 | "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" 1680 | "version" "0.0.3" 1681 | 1682 | "tslib@^2.0.3", "tslib@^2.1.0": 1683 | "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1684 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" 1685 | "version" "2.3.1" 1686 | 1687 | "tsscmp@1.0.6": 1688 | "integrity" "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" 1689 | "resolved" "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" 1690 | "version" "1.0.6" 1691 | 1692 | "type-is@^1.6.4", "type-is@~1.6.17", "type-is@~1.6.18": 1693 | "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" 1694 | "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 1695 | "version" "1.6.18" 1696 | dependencies: 1697 | "media-typer" "0.3.0" 1698 | "mime-types" "~2.1.24" 1699 | 1700 | "typedarray@^0.0.6": 1701 | "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1702 | "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" 1703 | "version" "0.0.6" 1704 | 1705 | "unpipe@~1.0.0", "unpipe@1.0.0": 1706 | "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1707 | "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 1708 | "version" "1.0.0" 1709 | 1710 | "util-deprecate@~1.0.1": 1711 | "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1712 | "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1713 | "version" "1.0.2" 1714 | 1715 | "utils-merge@1.0.1": 1716 | "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1717 | "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 1718 | "version" "1.0.1" 1719 | 1720 | "uuid@^8.3.1": 1721 | "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1722 | "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" 1723 | "version" "8.3.2" 1724 | 1725 | "vary@^1", "vary@~1.1.2": 1726 | "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1727 | "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 1728 | "version" "1.1.2" 1729 | 1730 | "webidl-conversions@^3.0.0": 1731 | "integrity" "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1732 | "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" 1733 | "version" "3.0.1" 1734 | 1735 | "webidl-conversions@^6.1.0": 1736 | "integrity" "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" 1737 | "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" 1738 | "version" "6.1.0" 1739 | 1740 | "websocket-driver@>=0.5.1": 1741 | "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" 1742 | "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" 1743 | "version" "0.7.4" 1744 | dependencies: 1745 | "http-parser-js" ">=0.5.1" 1746 | "safe-buffer" ">=5.1.0" 1747 | "websocket-extensions" ">=0.1.1" 1748 | 1749 | "websocket-extensions@>=0.1.1": 1750 | "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" 1751 | "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" 1752 | "version" "0.1.4" 1753 | 1754 | "whatwg-fetch@2.0.4": 1755 | "integrity" "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" 1756 | "resolved" "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz" 1757 | "version" "2.0.4" 1758 | 1759 | "whatwg-url@^5.0.0": 1760 | "integrity" "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=" 1761 | "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" 1762 | "version" "5.0.0" 1763 | dependencies: 1764 | "tr46" "~0.0.3" 1765 | "webidl-conversions" "^3.0.0" 1766 | 1767 | "whatwg-url@^9.1.0": 1768 | "integrity" "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==" 1769 | "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz" 1770 | "version" "9.1.0" 1771 | dependencies: 1772 | "tr46" "^2.1.0" 1773 | "webidl-conversions" "^6.1.0" 1774 | 1775 | "wrap-ansi@^7.0.0": 1776 | "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" 1777 | "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 1778 | "version" "7.0.0" 1779 | dependencies: 1780 | "ansi-styles" "^4.0.0" 1781 | "string-width" "^4.1.0" 1782 | "strip-ansi" "^6.0.0" 1783 | 1784 | "wrappy@1": 1785 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1786 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1787 | "version" "1.0.2" 1788 | 1789 | "ws@>=7.4.6", "ws@~8.2.3": 1790 | "integrity" "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" 1791 | "resolved" "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz" 1792 | "version" "8.2.3" 1793 | 1794 | "xtend@^4.0.0": 1795 | "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1796 | "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 1797 | "version" "4.0.2" 1798 | 1799 | "y18n@^5.0.5": 1800 | "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1801 | "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 1802 | "version" "5.0.8" 1803 | 1804 | "yargs-parser@^20.2.2": 1805 | "integrity" "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 1806 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" 1807 | "version" "20.2.9" 1808 | 1809 | "yargs@^16.2.0": 1810 | "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" 1811 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" 1812 | "version" "16.2.0" 1813 | dependencies: 1814 | "cliui" "^7.0.2" 1815 | "escalade" "^3.1.1" 1816 | "get-caller-file" "^2.0.5" 1817 | "require-directory" "^2.1.1" 1818 | "string-width" "^4.2.0" 1819 | "y18n" "^5.0.5" 1820 | "yargs-parser" "^20.2.2" 1821 | --------------------------------------------------------------------------------