├── .firebaserc ├── .gitignore ├── dbschema.js ├── firebase.json └── functions ├── .gitignore ├── handlers ├── screams.js └── users.js ├── index.js ├── package-lock.json ├── package.json └── util ├── admin.js ├── config.js ├── fbAuth.js └── validators.js /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "socialape-d081e" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | firebase-debug.log* 8 | 9 | # Firebase cache 10 | .firebase/ 11 | 12 | # Firebase config 13 | 14 | # Uncomment this if you'd like others to create their own Firebase project. 15 | # For a team working on the same Firebase project(s), it is recommended to leave 16 | # it commented so all members can deploy to the same project(s) in .firebaserc. 17 | # .firebaserc 18 | 19 | # Runtime data 20 | pids 21 | *.pid 22 | *.seed 23 | *.pid.lock 24 | 25 | # Directory for instrumented libs generated by jscoverage/JSCover 26 | lib-cov 27 | 28 | # Coverage directory used by tools like istanbul 29 | coverage 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (http://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | node_modules/ 48 | 49 | # Optional npm cache directory 50 | .npm 51 | 52 | # Optional eslint cache 53 | .eslintcache 54 | 55 | # Optional REPL history 56 | .node_repl_history 57 | 58 | # Output of 'npm pack' 59 | *.tgz 60 | 61 | # Yarn Integrity file 62 | .yarn-integrity 63 | 64 | # dotenv environment variables file 65 | .env 66 | -------------------------------------------------------------------------------- /dbschema.js: -------------------------------------------------------------------------------- 1 | let db = { 2 | users: [ 3 | { 4 | userId: 'dh23ggj5h32g543j5gf43', 5 | email: 'user@email.com', 6 | handle: 'user', 7 | createdAt: '2019-03-15T10:59:52.798Z', 8 | imageUrl: 'image/dsfsdkfghskdfgs/dgfdhfgdh', 9 | bio: 'Hello, my name is user, nice to meet you', 10 | website: 'https://user.com', 11 | location: 'Lonodn, UK' 12 | } 13 | ], 14 | screams: [ 15 | { 16 | userHandle: 'user', 17 | body: 'This is a sample scream', 18 | createdAt: '2019-03-15T10:59:52.798Z', 19 | likeCount: 5, 20 | commentCount: 3 21 | } 22 | ], 23 | comments: [ 24 | { 25 | userHandle: 'user', 26 | screamId: 'kdjsfgdksuufhgkdsufky', 27 | body: 'nice one mate!', 28 | createdAt: '2019-03-15T10:59:52.798Z' 29 | } 30 | ], 31 | notifications: [ 32 | { 33 | recipient: 'user', 34 | sender: 'john', 35 | read: 'true | false', 36 | screamId: 'kdjsfgdksuufhgkdsufky', 37 | type: 'like | comment', 38 | createdAt: '2019-03-15T10:59:52.798Z' 39 | } 40 | ] 41 | }; 42 | const userDetails = { 43 | // Redux data 44 | credentials: { 45 | userId: 'N43KJ5H43KJHREW4J5H3JWMERHB', 46 | email: 'user@email.com', 47 | handle: 'user', 48 | createdAt: '2019-03-15T10:59:52.798Z', 49 | imageUrl: 'image/dsfsdkfghskdfgs/dgfdhfgdh', 50 | bio: 'Hello, my name is user, nice to meet you', 51 | website: 'https://user.com', 52 | location: 'Lonodn, UK' 53 | }, 54 | likes: [ 55 | { 56 | userHandle: 'user', 57 | screamId: 'hh7O5oWfWucVzGbHH2pa' 58 | }, 59 | { 60 | userHandle: 'user', 61 | screamId: '3IOnFoQexRcofs5OhBXO' 62 | } 63 | ] 64 | }; 65 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /functions/handlers/screams.js: -------------------------------------------------------------------------------- 1 | const { db } = require('../util/admin'); 2 | 3 | exports.getAllScreams = (req, res) => { 4 | db.collection('screams') 5 | .orderBy('createdAt', 'desc') 6 | .get() 7 | .then((data) => { 8 | let screams = []; 9 | data.forEach((doc) => { 10 | screams.push({ 11 | screamId: doc.id, 12 | body: doc.data().body, 13 | userHandle: doc.data().userHandle, 14 | createdAt: doc.data().createdAt, 15 | commentCount: doc.data().commentCount, 16 | likeCount: doc.data().likeCount, 17 | userImage: doc.data().userImage 18 | }); 19 | }); 20 | return res.json(screams); 21 | }) 22 | .catch((err) => { 23 | console.error(err); 24 | res.status(500).json({ error: err.code }); 25 | }); 26 | }; 27 | 28 | exports.postOneScream = (req, res) => { 29 | if (req.body.body.trim() === '') { 30 | return res.status(400).json({ body: 'Body must not be empty' }); 31 | } 32 | 33 | const newScream = { 34 | body: req.body.body, 35 | userHandle: req.user.handle, 36 | userImage: req.user.imageUrl, 37 | createdAt: new Date().toISOString(), 38 | likeCount: 0, 39 | commentCount: 0 40 | }; 41 | 42 | db.collection('screams') 43 | .add(newScream) 44 | .then((doc) => { 45 | const resScream = newScream; 46 | resScream.screamId = doc.id; 47 | res.json(resScream); 48 | }) 49 | .catch((err) => { 50 | res.status(500).json({ error: 'something went wrong' }); 51 | console.error(err); 52 | }); 53 | }; 54 | // Fetch one scream 55 | exports.getScream = (req, res) => { 56 | let screamData = {}; 57 | db.doc(`/screams/${req.params.screamId}`) 58 | .get() 59 | .then((doc) => { 60 | if (!doc.exists) { 61 | return res.status(404).json({ error: 'Scream not found' }); 62 | } 63 | screamData = doc.data(); 64 | screamData.screamId = doc.id; 65 | return db 66 | .collection('comments') 67 | .orderBy('createdAt', 'desc') 68 | .where('screamId', '==', req.params.screamId) 69 | .get(); 70 | }) 71 | .then((data) => { 72 | screamData.comments = []; 73 | data.forEach((doc) => { 74 | screamData.comments.push(doc.data()); 75 | }); 76 | return res.json(screamData); 77 | }) 78 | .catch((err) => { 79 | console.error(err); 80 | res.status(500).json({ error: err.code }); 81 | }); 82 | }; 83 | // Comment on a comment 84 | exports.commentOnScream = (req, res) => { 85 | if (req.body.body.trim() === '') 86 | return res.status(400).json({ comment: 'Must not be empty' }); 87 | 88 | const newComment = { 89 | body: req.body.body, 90 | createdAt: new Date().toISOString(), 91 | screamId: req.params.screamId, 92 | userHandle: req.user.handle, 93 | userImage: req.user.imageUrl 94 | }; 95 | console.log(newComment); 96 | 97 | db.doc(`/screams/${req.params.screamId}`) 98 | .get() 99 | .then((doc) => { 100 | if (!doc.exists) { 101 | return res.status(404).json({ error: 'Scream not found' }); 102 | } 103 | return doc.ref.update({ commentCount: doc.data().commentCount + 1 }); 104 | }) 105 | .then(() => { 106 | return db.collection('comments').add(newComment); 107 | }) 108 | .then(() => { 109 | res.json(newComment); 110 | }) 111 | .catch((err) => { 112 | console.log(err); 113 | res.status(500).json({ error: 'Something went wrong' }); 114 | }); 115 | }; 116 | // Like a scream 117 | exports.likeScream = (req, res) => { 118 | const likeDocument = db 119 | .collection('likes') 120 | .where('userHandle', '==', req.user.handle) 121 | .where('screamId', '==', req.params.screamId) 122 | .limit(1); 123 | 124 | const screamDocument = db.doc(`/screams/${req.params.screamId}`); 125 | 126 | let screamData; 127 | 128 | screamDocument 129 | .get() 130 | .then((doc) => { 131 | if (doc.exists) { 132 | screamData = doc.data(); 133 | screamData.screamId = doc.id; 134 | return likeDocument.get(); 135 | } else { 136 | return res.status(404).json({ error: 'Scream not found' }); 137 | } 138 | }) 139 | .then((data) => { 140 | if (data.empty) { 141 | return db 142 | .collection('likes') 143 | .add({ 144 | screamId: req.params.screamId, 145 | userHandle: req.user.handle 146 | }) 147 | .then(() => { 148 | screamData.likeCount++; 149 | return screamDocument.update({ likeCount: screamData.likeCount }); 150 | }) 151 | .then(() => { 152 | return res.json(screamData); 153 | }); 154 | } else { 155 | return res.status(400).json({ error: 'Scream already liked' }); 156 | } 157 | }) 158 | .catch((err) => { 159 | console.error(err); 160 | res.status(500).json({ error: err.code }); 161 | }); 162 | }; 163 | 164 | exports.unlikeScream = (req, res) => { 165 | const likeDocument = db 166 | .collection('likes') 167 | .where('userHandle', '==', req.user.handle) 168 | .where('screamId', '==', req.params.screamId) 169 | .limit(1); 170 | 171 | const screamDocument = db.doc(`/screams/${req.params.screamId}`); 172 | 173 | let screamData; 174 | 175 | screamDocument 176 | .get() 177 | .then((doc) => { 178 | if (doc.exists) { 179 | screamData = doc.data(); 180 | screamData.screamId = doc.id; 181 | return likeDocument.get(); 182 | } else { 183 | return res.status(404).json({ error: 'Scream not found' }); 184 | } 185 | }) 186 | .then((data) => { 187 | if (data.empty) { 188 | return res.status(400).json({ error: 'Scream not liked' }); 189 | } else { 190 | return db 191 | .doc(`/likes/${data.docs[0].id}`) 192 | .delete() 193 | .then(() => { 194 | screamData.likeCount--; 195 | return screamDocument.update({ likeCount: screamData.likeCount }); 196 | }) 197 | .then(() => { 198 | res.json(screamData); 199 | }); 200 | } 201 | }) 202 | .catch((err) => { 203 | console.error(err); 204 | res.status(500).json({ error: err.code }); 205 | }); 206 | }; 207 | // Delete a scream 208 | exports.deleteScream = (req, res) => { 209 | const document = db.doc(`/screams/${req.params.screamId}`); 210 | document 211 | .get() 212 | .then((doc) => { 213 | if (!doc.exists) { 214 | return res.status(404).json({ error: 'Scream not found' }); 215 | } 216 | if (doc.data().userHandle !== req.user.handle) { 217 | return res.status(403).json({ error: 'Unauthorized' }); 218 | } else { 219 | return document.delete(); 220 | } 221 | }) 222 | .then(() => { 223 | res.json({ message: 'Scream deleted successfully' }); 224 | }) 225 | .catch((err) => { 226 | console.error(err); 227 | return res.status(500).json({ error: err.code }); 228 | }); 229 | }; 230 | -------------------------------------------------------------------------------- /functions/handlers/users.js: -------------------------------------------------------------------------------- 1 | const { admin, db } = require("../util/admin"); 2 | 3 | const config = require("../util/config"); 4 | const { uuid } = require("uuidv4"); 5 | 6 | const firebase = require("firebase"); 7 | firebase.initializeApp(config); 8 | 9 | const { 10 | validateSignupData, 11 | validateLoginData, 12 | reduceUserDetails, 13 | } = require("../util/validators"); 14 | 15 | // Sign users up 16 | exports.signup = (req, res) => { 17 | const newUser = { 18 | email: req.body.email, 19 | password: req.body.password, 20 | confirmPassword: req.body.confirmPassword, 21 | handle: req.body.handle, 22 | }; 23 | 24 | const { valid, errors } = validateSignupData(newUser); 25 | 26 | if (!valid) return res.status(400).json(errors); 27 | 28 | const noImg = "no-img.png"; 29 | 30 | let token, userId; 31 | db.doc(`/users/${newUser.handle}`) 32 | .get() 33 | .then((doc) => { 34 | if (doc.exists) { 35 | return res.status(400).json({ handle: "this handle is already taken" }); 36 | } else { 37 | return firebase 38 | .auth() 39 | .createUserWithEmailAndPassword(newUser.email, newUser.password); 40 | } 41 | }) 42 | .then((data) => { 43 | userId = data.user.uid; 44 | return data.user.getIdToken(); 45 | }) 46 | .then((idToken) => { 47 | token = idToken; 48 | const userCredentials = { 49 | handle: newUser.handle, 50 | email: newUser.email, 51 | createdAt: new Date().toISOString(), 52 | //TODO Append token to imageUrl. Work around just add token from image in storage. 53 | imageUrl: `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${noImg}?alt=media`, 54 | userId, 55 | }; 56 | return db.doc(`/users/${newUser.handle}`).set(userCredentials); 57 | }) 58 | .then(() => { 59 | return res.status(201).json({ token }); 60 | }) 61 | .catch((err) => { 62 | console.error(err); 63 | if (err.code === "auth/email-already-in-use") { 64 | return res.status(400).json({ email: "Email is already is use" }); 65 | } else { 66 | return res 67 | .status(500) 68 | .json({ general: "Something went wrong, please try again" }); 69 | } 70 | }); 71 | }; 72 | // Log user in 73 | exports.login = (req, res) => { 74 | const user = { 75 | email: req.body.email, 76 | password: req.body.password, 77 | }; 78 | 79 | const { valid, errors } = validateLoginData(user); 80 | 81 | if (!valid) return res.status(400).json(errors); 82 | 83 | firebase 84 | .auth() 85 | .signInWithEmailAndPassword(user.email, user.password) 86 | .then((data) => { 87 | return data.user.getIdToken(); 88 | }) 89 | .then((token) => { 90 | return res.json({ token }); 91 | }) 92 | .catch((err) => { 93 | console.error(err); 94 | // auth/wrong-password 95 | // auth/user-not-user 96 | return res 97 | .status(403) 98 | .json({ general: "Wrong credentials, please try again" }); 99 | }); 100 | }; 101 | 102 | // Add user details 103 | exports.addUserDetails = (req, res) => { 104 | let userDetails = reduceUserDetails(req.body); 105 | 106 | db.doc(`/users/${req.user.handle}`) 107 | .update(userDetails) 108 | .then(() => { 109 | return res.json({ message: "Details added successfully" }); 110 | }) 111 | .catch((err) => { 112 | console.error(err); 113 | return res.status(500).json({ error: err.code }); 114 | }); 115 | }; 116 | // Get any user's details 117 | exports.getUserDetails = (req, res) => { 118 | let userData = {}; 119 | db.doc(`/users/${req.params.handle}`) 120 | .get() 121 | .then((doc) => { 122 | if (doc.exists) { 123 | userData.user = doc.data(); 124 | return db 125 | .collection("screams") 126 | .where("userHandle", "==", req.params.handle) 127 | .orderBy("createdAt", "desc") 128 | .get(); 129 | } else { 130 | return res.status(404).json({ errror: "User not found" }); 131 | } 132 | }) 133 | .then((data) => { 134 | userData.screams = []; 135 | data.forEach((doc) => { 136 | userData.screams.push({ 137 | body: doc.data().body, 138 | createdAt: doc.data().createdAt, 139 | userHandle: doc.data().userHandle, 140 | userImage: doc.data().userImage, 141 | likeCount: doc.data().likeCount, 142 | commentCount: doc.data().commentCount, 143 | screamId: doc.id, 144 | }); 145 | }); 146 | return res.json(userData); 147 | }) 148 | .catch((err) => { 149 | console.error(err); 150 | return res.status(500).json({ error: err.code }); 151 | }); 152 | }; 153 | // Get own user details 154 | exports.getAuthenticatedUser = (req, res) => { 155 | let userData = {}; 156 | db.doc(`/users/${req.user.handle}`) 157 | .get() 158 | .then((doc) => { 159 | if (doc.exists) { 160 | userData.credentials = doc.data(); 161 | return db 162 | .collection("likes") 163 | .where("userHandle", "==", req.user.handle) 164 | .get(); 165 | } 166 | }) 167 | .then((data) => { 168 | userData.likes = []; 169 | data.forEach((doc) => { 170 | userData.likes.push(doc.data()); 171 | }); 172 | return db 173 | .collection("notifications") 174 | .where("recipient", "==", req.user.handle) 175 | .orderBy("createdAt", "desc") 176 | .limit(10) 177 | .get(); 178 | }) 179 | .then((data) => { 180 | userData.notifications = []; 181 | data.forEach((doc) => { 182 | userData.notifications.push({ 183 | recipient: doc.data().recipient, 184 | sender: doc.data().sender, 185 | createdAt: doc.data().createdAt, 186 | screamId: doc.data().screamId, 187 | type: doc.data().type, 188 | read: doc.data().read, 189 | notificationId: doc.id, 190 | }); 191 | }); 192 | return res.json(userData); 193 | }) 194 | .catch((err) => { 195 | console.error(err); 196 | return res.status(500).json({ error: err.code }); 197 | }); 198 | }; 199 | // Upload a profile image for user 200 | exports.uploadImage = (req, res) => { 201 | const BusBoy = require("busboy"); 202 | const path = require("path"); 203 | const os = require("os"); 204 | const fs = require("fs"); 205 | 206 | const busboy = new BusBoy({ headers: req.headers }); 207 | 208 | let imageToBeUploaded = {}; 209 | let imageFileName; 210 | // String for image token 211 | let generatedToken = uuid(); 212 | 213 | busboy.on("file", (fieldname, file, filename, encoding, mimetype) => { 214 | console.log(fieldname, file, filename, encoding, mimetype); 215 | if (mimetype !== "image/jpeg" && mimetype !== "image/png") { 216 | return res.status(400).json({ error: "Wrong file type submitted" }); 217 | } 218 | // my.image.png => ['my', 'image', 'png'] 219 | const imageExtension = filename.split(".")[filename.split(".").length - 1]; 220 | // 32756238461724837.png 221 | imageFileName = `${Math.round( 222 | Math.random() * 1000000000000 223 | ).toString()}.${imageExtension}`; 224 | const filepath = path.join(os.tmpdir(), imageFileName); 225 | imageToBeUploaded = { filepath, mimetype }; 226 | file.pipe(fs.createWriteStream(filepath)); 227 | }); 228 | busboy.on("finish", () => { 229 | admin 230 | .storage() 231 | .bucket() 232 | .upload(imageToBeUploaded.filepath, { 233 | resumable: false, 234 | metadata: { 235 | metadata: { 236 | contentType: imageToBeUploaded.mimetype, 237 | //Generate token to be appended to imageUrl 238 | firebaseStorageDownloadTokens: generatedToken, 239 | }, 240 | }, 241 | }) 242 | .then(() => { 243 | // Append token to url 244 | const imageUrl = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media&token=${generatedToken}`; 245 | return db.doc(`/users/${req.user.handle}`).update({ imageUrl }); 246 | }) 247 | .then(() => { 248 | return res.json({ message: "image uploaded successfully" }); 249 | }) 250 | .catch((err) => { 251 | console.error(err); 252 | return res.status(500).json({ error: "something went wrong" }); 253 | }); 254 | }); 255 | busboy.end(req.rawBody); 256 | }; 257 | 258 | exports.markNotificationsRead = (req, res) => { 259 | let batch = db.batch(); 260 | req.body.forEach((notificationId) => { 261 | const notification = db.doc(`/notifications/${notificationId}`); 262 | batch.update(notification, { read: true }); 263 | }); 264 | batch 265 | .commit() 266 | .then(() => { 267 | return res.json({ message: "Notifications marked read" }); 268 | }) 269 | .catch((err) => { 270 | console.error(err); 271 | return res.status(500).json({ error: err.code }); 272 | }); 273 | }; 274 | -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | const app = require('express')(); 3 | const FBAuth = require('./util/fbAuth'); 4 | 5 | const cors = require('cors'); 6 | app.use(cors()); 7 | 8 | const { db } = require('./util/admin'); 9 | 10 | const { 11 | getAllScreams, 12 | postOneScream, 13 | getScream, 14 | commentOnScream, 15 | likeScream, 16 | unlikeScream, 17 | deleteScream 18 | } = require('./handlers/screams'); 19 | const { 20 | signup, 21 | login, 22 | uploadImage, 23 | addUserDetails, 24 | getAuthenticatedUser, 25 | getUserDetails, 26 | markNotificationsRead 27 | } = require('./handlers/users'); 28 | 29 | // Scream routes 30 | app.get('/screams', getAllScreams); 31 | app.post('/scream', FBAuth, postOneScream); 32 | app.get('/scream/:screamId', getScream); 33 | app.delete('/scream/:screamId', FBAuth, deleteScream); 34 | app.get('/scream/:screamId/like', FBAuth, likeScream); 35 | app.get('/scream/:screamId/unlike', FBAuth, unlikeScream); 36 | app.post('/scream/:screamId/comment', FBAuth, commentOnScream); 37 | 38 | // users routes 39 | app.post('/signup', signup); 40 | app.post('/login', login); 41 | app.post('/user/image', FBAuth, uploadImage); 42 | app.post('/user', FBAuth, addUserDetails); 43 | app.get('/user', FBAuth, getAuthenticatedUser); 44 | app.get('/user/:handle', getUserDetails); 45 | app.post('/notifications', FBAuth, markNotificationsRead); 46 | 47 | exports.api = functions.region('europe-west1').https.onRequest(app); 48 | 49 | exports.createNotificationOnLike = functions 50 | .region('europe-west1') 51 | .firestore.document('likes/{id}') 52 | .onCreate((snapshot) => { 53 | return db 54 | .doc(`/screams/${snapshot.data().screamId}`) 55 | .get() 56 | .then((doc) => { 57 | if ( 58 | doc.exists && 59 | doc.data().userHandle !== snapshot.data().userHandle 60 | ) { 61 | return db.doc(`/notifications/${snapshot.id}`).set({ 62 | createdAt: new Date().toISOString(), 63 | recipient: doc.data().userHandle, 64 | sender: snapshot.data().userHandle, 65 | type: 'like', 66 | read: false, 67 | screamId: doc.id 68 | }); 69 | } 70 | }) 71 | .catch((err) => console.error(err)); 72 | }); 73 | exports.deleteNotificationOnUnLike = functions 74 | .region('europe-west1') 75 | .firestore.document('likes/{id}') 76 | .onDelete((snapshot) => { 77 | return db 78 | .doc(`/notifications/${snapshot.id}`) 79 | .delete() 80 | .catch((err) => { 81 | console.error(err); 82 | return; 83 | }); 84 | }); 85 | exports.createNotificationOnComment = functions 86 | .region('europe-west1') 87 | .firestore.document('comments/{id}') 88 | .onCreate((snapshot) => { 89 | return db 90 | .doc(`/screams/${snapshot.data().screamId}`) 91 | .get() 92 | .then((doc) => { 93 | if ( 94 | doc.exists && 95 | doc.data().userHandle !== snapshot.data().userHandle 96 | ) { 97 | return db.doc(`/notifications/${snapshot.id}`).set({ 98 | createdAt: new Date().toISOString(), 99 | recipient: doc.data().userHandle, 100 | sender: snapshot.data().userHandle, 101 | type: 'comment', 102 | read: false, 103 | screamId: doc.id 104 | }); 105 | } 106 | }) 107 | .catch((err) => { 108 | console.error(err); 109 | return; 110 | }); 111 | }); 112 | 113 | exports.onUserImageChange = functions 114 | .region('europe-west1') 115 | .firestore.document('/users/{userId}') 116 | .onUpdate((change) => { 117 | console.log(change.before.data()); 118 | console.log(change.after.data()); 119 | if (change.before.data().imageUrl !== change.after.data().imageUrl) { 120 | console.log('image has changed'); 121 | const batch = db.batch(); 122 | return db 123 | .collection('screams') 124 | .where('userHandle', '==', change.before.data().handle) 125 | .get() 126 | .then((data) => { 127 | data.forEach((doc) => { 128 | const scream = db.doc(`/screams/${doc.id}`); 129 | batch.update(scream, { userImage: change.after.data().imageUrl }); 130 | }); 131 | return batch.commit(); 132 | }); 133 | } else return true; 134 | }); 135 | 136 | exports.onScreamDelete = functions 137 | .region('europe-west1') 138 | .firestore.document('/screams/{screamId}') 139 | .onDelete((snapshot, context) => { 140 | const screamId = context.params.screamId; 141 | const batch = db.batch(); 142 | return db 143 | .collection('comments') 144 | .where('screamId', '==', screamId) 145 | .get() 146 | .then((data) => { 147 | data.forEach((doc) => { 148 | batch.delete(db.doc(`/comments/${doc.id}`)); 149 | }); 150 | return db 151 | .collection('likes') 152 | .where('screamId', '==', screamId) 153 | .get(); 154 | }) 155 | .then((data) => { 156 | data.forEach((doc) => { 157 | batch.delete(db.doc(`/likes/${doc.id}`)); 158 | }); 159 | return db 160 | .collection('notifications') 161 | .where('screamId', '==', screamId) 162 | .get(); 163 | }) 164 | .then((data) => { 165 | data.forEach((doc) => { 166 | batch.delete(db.doc(`/notifications/${doc.id}`)); 167 | }); 168 | return batch.commit(); 169 | }) 170 | .catch((err) => console.error(err)); 171 | }); 172 | -------------------------------------------------------------------------------- /functions/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@firebase/app": { 7 | "version": "0.3.12", 8 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.12.tgz", 9 | "integrity": "sha512-JXwTfVPJM1GP+4us9eMbobKYtFOfu16+mW8tDbjiV+5B3uzpHGROC+fPedIBosPbDgA2xeVrm0HTpNHTnq+tcQ==", 10 | "requires": { 11 | "@firebase/app-types": "0.3.6", 12 | "@firebase/util": "0.2.10", 13 | "dom-storage": "2.1.0", 14 | "tslib": "1.9.3", 15 | "xmlhttprequest": "1.8.0" 16 | } 17 | }, 18 | "@firebase/app-types": { 19 | "version": "0.3.6", 20 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.6.tgz", 21 | "integrity": "sha512-zomffkbQhck6oidzSfFLvoMx7u7BiYVcJRnUPl0qSM5KDqlCZcFZYXxdCIzpjCXY37IR2qO1desqofYNqjJ4gg==" 22 | }, 23 | "@firebase/auth": { 24 | "version": "0.9.5", 25 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.9.5.tgz", 26 | "integrity": "sha512-2bZIyAcYU/t2rQgfa/41mz7dpYiCuuh1nQEJ/8vmdkPBn41HcF1tSRoBU5BAD0w6Of7stux/DkLTnAQBQuZFxw==", 27 | "requires": { 28 | "@firebase/auth-types": "0.5.4" 29 | } 30 | }, 31 | "@firebase/auth-types": { 32 | "version": "0.5.4", 33 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.5.4.tgz", 34 | "integrity": "sha512-9935/Jb/cX+NtTmU21xXFEIkmCSOafUQc1Hq7H4960JDSm0ykdwG5oVe/fiVcar9zBjKsBFL0gFrhIX5ULSWWQ==" 35 | }, 36 | "@firebase/database": { 37 | "version": "0.3.15", 38 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.15.tgz", 39 | "integrity": "sha512-Z2dsbc93U8icTLBpqbblycQ3pV438OhIZMPcMNj3XXHLN3g1uu3f1V73XSkS1gbvwag2N8gJPo9rZOL00Vte6w==", 40 | "requires": { 41 | "@firebase/database-types": "0.3.7", 42 | "@firebase/logger": "0.1.9", 43 | "@firebase/util": "0.2.10", 44 | "faye-websocket": "0.11.1", 45 | "tslib": "1.9.3" 46 | } 47 | }, 48 | "@firebase/database-types": { 49 | "version": "0.3.7", 50 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.7.tgz", 51 | "integrity": "sha512-SD4Pvr2SeMEiVKjPpRaFGdXMOYjQ+7RzR6sVVw1c7yI5SfwTy/0SXyNaDTy1qIlhIfaBWr+ZaZ1FzZlOAFzSDQ==" 52 | }, 53 | "@firebase/firestore": { 54 | "version": "1.1.0", 55 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.1.0.tgz", 56 | "integrity": "sha512-0nacRkhYV/QIeFY0gIh/q2I3/XO/nIaoNgBliqCKPxvPCFYzJ9U7mx0HD14TnNPwWLrCBRQibqJzHmcUirij2g==", 57 | "requires": { 58 | "@firebase/firestore-types": "1.1.0", 59 | "@firebase/logger": "0.1.9", 60 | "@firebase/webchannel-wrapper": "0.2.15", 61 | "grpc": "1.19.0", 62 | "tslib": "1.9.3" 63 | }, 64 | "dependencies": { 65 | "grpc": { 66 | "version": "1.19.0", 67 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.19.0.tgz", 68 | "integrity": "sha512-xX+jZ1M3YXjngsRj/gTxB4EwM0WoWUr54DmyNq9xTeg1oSuVaTPD/PK9wnZKOJWTt1pkeFspXqwJPhddZNxHOA==", 69 | "requires": { 70 | "lodash.camelcase": "^4.3.0", 71 | "lodash.clone": "^4.5.0", 72 | "nan": "^2.0.0", 73 | "node-pre-gyp": "^0.12.0", 74 | "protobufjs": "^5.0.3" 75 | }, 76 | "dependencies": { 77 | "abbrev": { 78 | "version": "1.1.1", 79 | "bundled": true 80 | }, 81 | "ansi-regex": { 82 | "version": "2.1.1", 83 | "bundled": true 84 | }, 85 | "aproba": { 86 | "version": "1.2.0", 87 | "bundled": true 88 | }, 89 | "are-we-there-yet": { 90 | "version": "1.1.5", 91 | "bundled": true, 92 | "requires": { 93 | "delegates": "^1.0.0", 94 | "readable-stream": "^2.0.6" 95 | } 96 | }, 97 | "balanced-match": { 98 | "version": "1.0.0", 99 | "bundled": true 100 | }, 101 | "brace-expansion": { 102 | "version": "1.1.11", 103 | "bundled": true, 104 | "requires": { 105 | "balanced-match": "^1.0.0", 106 | "concat-map": "0.0.1" 107 | } 108 | }, 109 | "chownr": { 110 | "version": "1.1.1", 111 | "bundled": true 112 | }, 113 | "code-point-at": { 114 | "version": "1.1.0", 115 | "bundled": true 116 | }, 117 | "concat-map": { 118 | "version": "0.0.1", 119 | "bundled": true 120 | }, 121 | "console-control-strings": { 122 | "version": "1.1.0", 123 | "bundled": true 124 | }, 125 | "core-util-is": { 126 | "version": "1.0.2", 127 | "bundled": true 128 | }, 129 | "debug": { 130 | "version": "2.6.9", 131 | "bundled": true, 132 | "requires": { 133 | "ms": "2.0.0" 134 | } 135 | }, 136 | "deep-extend": { 137 | "version": "0.6.0", 138 | "bundled": true 139 | }, 140 | "delegates": { 141 | "version": "1.0.0", 142 | "bundled": true 143 | }, 144 | "detect-libc": { 145 | "version": "1.0.3", 146 | "bundled": true 147 | }, 148 | "fs-minipass": { 149 | "version": "1.2.5", 150 | "bundled": true, 151 | "requires": { 152 | "minipass": "^2.2.1" 153 | } 154 | }, 155 | "fs.realpath": { 156 | "version": "1.0.0", 157 | "bundled": true 158 | }, 159 | "gauge": { 160 | "version": "2.7.4", 161 | "bundled": true, 162 | "requires": { 163 | "aproba": "^1.0.3", 164 | "console-control-strings": "^1.0.0", 165 | "has-unicode": "^2.0.0", 166 | "object-assign": "^4.1.0", 167 | "signal-exit": "^3.0.0", 168 | "string-width": "^1.0.1", 169 | "strip-ansi": "^3.0.1", 170 | "wide-align": "^1.1.0" 171 | } 172 | }, 173 | "glob": { 174 | "version": "7.1.2", 175 | "bundled": true, 176 | "requires": { 177 | "fs.realpath": "^1.0.0", 178 | "inflight": "^1.0.4", 179 | "inherits": "2", 180 | "minimatch": "^3.0.4", 181 | "once": "^1.3.0", 182 | "path-is-absolute": "^1.0.0" 183 | } 184 | }, 185 | "has-unicode": { 186 | "version": "2.0.1", 187 | "bundled": true 188 | }, 189 | "iconv-lite": { 190 | "version": "0.4.23", 191 | "bundled": true, 192 | "requires": { 193 | "safer-buffer": ">= 2.1.2 < 3" 194 | } 195 | }, 196 | "ignore-walk": { 197 | "version": "3.0.1", 198 | "bundled": true, 199 | "requires": { 200 | "minimatch": "^3.0.4" 201 | } 202 | }, 203 | "inflight": { 204 | "version": "1.0.6", 205 | "bundled": true, 206 | "requires": { 207 | "once": "^1.3.0", 208 | "wrappy": "1" 209 | } 210 | }, 211 | "inherits": { 212 | "version": "2.0.3", 213 | "bundled": true 214 | }, 215 | "ini": { 216 | "version": "1.3.5", 217 | "bundled": true 218 | }, 219 | "is-fullwidth-code-point": { 220 | "version": "1.0.0", 221 | "bundled": true, 222 | "requires": { 223 | "number-is-nan": "^1.0.0" 224 | } 225 | }, 226 | "isarray": { 227 | "version": "1.0.0", 228 | "bundled": true 229 | }, 230 | "minimatch": { 231 | "version": "3.0.4", 232 | "bundled": true, 233 | "requires": { 234 | "brace-expansion": "^1.1.7" 235 | } 236 | }, 237 | "minimist": { 238 | "version": "1.2.0", 239 | "bundled": true 240 | }, 241 | "minipass": { 242 | "version": "2.3.5", 243 | "bundled": true, 244 | "requires": { 245 | "safe-buffer": "^5.1.2", 246 | "yallist": "^3.0.0" 247 | } 248 | }, 249 | "minizlib": { 250 | "version": "1.1.1", 251 | "bundled": true, 252 | "requires": { 253 | "minipass": "^2.2.1" 254 | } 255 | }, 256 | "mkdirp": { 257 | "version": "0.5.1", 258 | "bundled": true, 259 | "requires": { 260 | "minimist": "0.0.8" 261 | }, 262 | "dependencies": { 263 | "minimist": { 264 | "version": "0.0.8", 265 | "bundled": true 266 | } 267 | } 268 | }, 269 | "ms": { 270 | "version": "2.0.0", 271 | "bundled": true 272 | }, 273 | "needle": { 274 | "version": "2.2.4", 275 | "bundled": true, 276 | "requires": { 277 | "debug": "^2.1.2", 278 | "iconv-lite": "^0.4.4", 279 | "sax": "^1.2.4" 280 | } 281 | }, 282 | "node-pre-gyp": { 283 | "version": "0.12.0", 284 | "bundled": true, 285 | "requires": { 286 | "detect-libc": "^1.0.2", 287 | "mkdirp": "^0.5.1", 288 | "needle": "^2.2.1", 289 | "nopt": "^4.0.1", 290 | "npm-packlist": "^1.1.6", 291 | "npmlog": "^4.0.2", 292 | "rc": "^1.2.7", 293 | "rimraf": "^2.6.1", 294 | "semver": "^5.3.0", 295 | "tar": "^4" 296 | } 297 | }, 298 | "nopt": { 299 | "version": "4.0.1", 300 | "bundled": true, 301 | "requires": { 302 | "abbrev": "1", 303 | "osenv": "^0.1.4" 304 | } 305 | }, 306 | "npm-bundled": { 307 | "version": "1.0.5", 308 | "bundled": true 309 | }, 310 | "npm-packlist": { 311 | "version": "1.1.12", 312 | "bundled": true, 313 | "requires": { 314 | "ignore-walk": "^3.0.1", 315 | "npm-bundled": "^1.0.1" 316 | } 317 | }, 318 | "npmlog": { 319 | "version": "4.1.2", 320 | "bundled": true, 321 | "requires": { 322 | "are-we-there-yet": "~1.1.2", 323 | "console-control-strings": "~1.1.0", 324 | "gauge": "~2.7.3", 325 | "set-blocking": "~2.0.0" 326 | } 327 | }, 328 | "number-is-nan": { 329 | "version": "1.0.1", 330 | "bundled": true 331 | }, 332 | "object-assign": { 333 | "version": "4.1.1", 334 | "bundled": true 335 | }, 336 | "once": { 337 | "version": "1.4.0", 338 | "bundled": true, 339 | "requires": { 340 | "wrappy": "1" 341 | } 342 | }, 343 | "os-homedir": { 344 | "version": "1.0.2", 345 | "bundled": true 346 | }, 347 | "os-tmpdir": { 348 | "version": "1.0.2", 349 | "bundled": true 350 | }, 351 | "osenv": { 352 | "version": "0.1.5", 353 | "bundled": true, 354 | "requires": { 355 | "os-homedir": "^1.0.0", 356 | "os-tmpdir": "^1.0.0" 357 | } 358 | }, 359 | "path-is-absolute": { 360 | "version": "1.0.1", 361 | "bundled": true 362 | }, 363 | "process-nextick-args": { 364 | "version": "2.0.0", 365 | "bundled": true 366 | }, 367 | "rc": { 368 | "version": "1.2.8", 369 | "bundled": true, 370 | "requires": { 371 | "deep-extend": "^0.6.0", 372 | "ini": "~1.3.0", 373 | "minimist": "^1.2.0", 374 | "strip-json-comments": "~2.0.1" 375 | } 376 | }, 377 | "readable-stream": { 378 | "version": "2.3.6", 379 | "bundled": true, 380 | "requires": { 381 | "core-util-is": "~1.0.0", 382 | "inherits": "~2.0.3", 383 | "isarray": "~1.0.0", 384 | "process-nextick-args": "~2.0.0", 385 | "safe-buffer": "~5.1.1", 386 | "string_decoder": "~1.1.1", 387 | "util-deprecate": "~1.0.1" 388 | } 389 | }, 390 | "rimraf": { 391 | "version": "2.6.2", 392 | "bundled": true, 393 | "requires": { 394 | "glob": "^7.0.5" 395 | } 396 | }, 397 | "safe-buffer": { 398 | "version": "5.1.2", 399 | "bundled": true 400 | }, 401 | "safer-buffer": { 402 | "version": "2.1.2", 403 | "bundled": true 404 | }, 405 | "sax": { 406 | "version": "1.2.4", 407 | "bundled": true 408 | }, 409 | "semver": { 410 | "version": "5.6.0", 411 | "bundled": true 412 | }, 413 | "set-blocking": { 414 | "version": "2.0.0", 415 | "bundled": true 416 | }, 417 | "signal-exit": { 418 | "version": "3.0.2", 419 | "bundled": true 420 | }, 421 | "string-width": { 422 | "version": "1.0.2", 423 | "bundled": true, 424 | "requires": { 425 | "code-point-at": "^1.0.0", 426 | "is-fullwidth-code-point": "^1.0.0", 427 | "strip-ansi": "^3.0.0" 428 | } 429 | }, 430 | "string_decoder": { 431 | "version": "1.1.1", 432 | "bundled": true, 433 | "requires": { 434 | "safe-buffer": "~5.1.0" 435 | } 436 | }, 437 | "strip-ansi": { 438 | "version": "3.0.1", 439 | "bundled": true, 440 | "requires": { 441 | "ansi-regex": "^2.0.0" 442 | } 443 | }, 444 | "strip-json-comments": { 445 | "version": "2.0.1", 446 | "bundled": true 447 | }, 448 | "tar": { 449 | "version": "4.4.8", 450 | "bundled": true, 451 | "requires": { 452 | "chownr": "^1.1.1", 453 | "fs-minipass": "^1.2.5", 454 | "minipass": "^2.3.4", 455 | "minizlib": "^1.1.1", 456 | "mkdirp": "^0.5.0", 457 | "safe-buffer": "^5.1.2", 458 | "yallist": "^3.0.2" 459 | } 460 | }, 461 | "util-deprecate": { 462 | "version": "1.0.2", 463 | "bundled": true 464 | }, 465 | "wide-align": { 466 | "version": "1.1.3", 467 | "bundled": true, 468 | "requires": { 469 | "string-width": "^1.0.2 || 2" 470 | } 471 | }, 472 | "wrappy": { 473 | "version": "1.0.2", 474 | "bundled": true 475 | }, 476 | "yallist": { 477 | "version": "3.0.3", 478 | "bundled": true 479 | } 480 | } 481 | }, 482 | "protobufjs": { 483 | "version": "5.0.3", 484 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 485 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 486 | "requires": { 487 | "ascli": "~1", 488 | "bytebuffer": "~5", 489 | "glob": "^7.0.5", 490 | "yargs": "^3.10.0" 491 | } 492 | } 493 | } 494 | }, 495 | "@firebase/firestore-types": { 496 | "version": "1.1.0", 497 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.1.0.tgz", 498 | "integrity": "sha512-Sh7gDIHZDoSVHe9droJ026BD7UFO2pC63pQutZzfEH5sDxDlP1xAO5NMnahQN8//tviaOeKee/YSGYy4yMwOAg==" 499 | }, 500 | "@firebase/functions": { 501 | "version": "0.4.2", 502 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.2.tgz", 503 | "integrity": "sha512-A07HUykgO8BsBXxt55PI0Z8GgZulaTD/o/of3hCIUF4uq4bexhRSgrIa6y7ELKhn3OEZ1Fu72C/22smHYb9tqA==", 504 | "requires": { 505 | "@firebase/functions-types": "0.3.1", 506 | "@firebase/messaging-types": "0.2.7", 507 | "isomorphic-fetch": "2.2.1", 508 | "tslib": "1.9.3" 509 | } 510 | }, 511 | "@firebase/functions-types": { 512 | "version": "0.3.1", 513 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.3.1.tgz", 514 | "integrity": "sha512-noMm5ZpleVC28a+wdloeAPDDUs8Q5EnD6XkGaUvVYBHXrGosD5zHuIFf+urBEdj8LrzFfEU9wsWYYAvWAswSLA==" 515 | }, 516 | "@firebase/logger": { 517 | "version": "0.1.9", 518 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.9.tgz", 519 | "integrity": "sha512-SJrhuNfPJvbRtLbo5q5+D+xLj9m1PSyiYvd1/SYiVFKQOyhUbjQECEp5QSSjBYrHuo7wguRkhG2L66sv456+Dg==" 520 | }, 521 | "@firebase/messaging": { 522 | "version": "0.3.14", 523 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.14.tgz", 524 | "integrity": "sha512-5FMwJ9SHy476kPMqxJk2UhGoBFnbYvhfHImCfHmCHtmPO4Lxq28P+k7gBfdgkww641gVYj4pMBJim76q7pp+ow==", 525 | "requires": { 526 | "@firebase/messaging-types": "0.2.7", 527 | "@firebase/util": "0.2.10", 528 | "tslib": "1.9.3" 529 | } 530 | }, 531 | "@firebase/messaging-types": { 532 | "version": "0.2.7", 533 | "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.7.tgz", 534 | "integrity": "sha512-RAnGP9SU2t9PE6Yk3tyJbe5KL6lvJXanDF2654Bf3zeWpCD6LYKfgJ9sOf4bQo0uKkmWsh8YnjzsbbVT6WUtsA==" 535 | }, 536 | "@firebase/polyfill": { 537 | "version": "0.3.8", 538 | "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.8.tgz", 539 | "integrity": "sha512-FNzKXiP2AwZ7CRQuwek+jx828CxltiWbUU5QOXpKHDyWwcE4dTIwdB9UxQda8gB8u7fnbYF8Y+v7jYP1RAYuNA==", 540 | "requires": { 541 | "core-js": "2.6.5", 542 | "promise-polyfill": "8.1.0", 543 | "whatwg-fetch": "2.0.4" 544 | }, 545 | "dependencies": { 546 | "whatwg-fetch": { 547 | "version": "2.0.4", 548 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", 549 | "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" 550 | } 551 | } 552 | }, 553 | "@firebase/storage": { 554 | "version": "0.2.11", 555 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.11.tgz", 556 | "integrity": "sha512-xUyTQhMgEV/jeeJtBDhwIvRfKPtEKDBWz7vsbIa1IbAsCqOmqQ1LJuF05OUWjN9Mbnjs8APwIMwE0PBySHvv3A==", 557 | "requires": { 558 | "@firebase/storage-types": "0.2.7", 559 | "tslib": "1.9.3" 560 | } 561 | }, 562 | "@firebase/storage-types": { 563 | "version": "0.2.7", 564 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.7.tgz", 565 | "integrity": "sha512-iMG0PhYQjzq/WJq+8XPaxV1oLukJOaxfQ6x2ImUyoMhAbU+KlAg9loRwgr0tl3x2XNm4NxhT0uG82HN11w6gBA==" 566 | }, 567 | "@firebase/util": { 568 | "version": "0.2.10", 569 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.10.tgz", 570 | "integrity": "sha512-qqbMugbZ54dp/T/qE/AAN24v3qbnHntbPzvdJmvTEqfdrcjXA+qrIPLdSb/WGaWjYYJgFrpe64sg5PyJ1O6mjQ==", 571 | "requires": { 572 | "tslib": "1.9.3" 573 | } 574 | }, 575 | "@firebase/webchannel-wrapper": { 576 | "version": "0.2.15", 577 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.15.tgz", 578 | "integrity": "sha512-ePQsq/dxRHFevC6AZ2EiWImOgDm+/tuSyEjdEEwB4pdGBB1KL/9UYnPZ2USj6fYRhEwhnheYpgbLzcw/c2vJzQ==" 579 | }, 580 | "@google-cloud/common": { 581 | "version": "0.31.1", 582 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.31.1.tgz", 583 | "integrity": "sha512-MgaF8VmDaoyIqzZUXIbcohTb5sQn+PYlYmcpb0/E8psUpVe+kaBwLq/Z8pcFtACCr6PNT36n+a6s1kG35bAuCA==", 584 | "optional": true, 585 | "requires": { 586 | "@google-cloud/projectify": "^0.3.2", 587 | "@google-cloud/promisify": "^0.4.0", 588 | "@types/duplexify": "^3.5.0", 589 | "@types/request": "^2.47.0", 590 | "arrify": "^1.0.1", 591 | "duplexify": "^3.6.0", 592 | "ent": "^2.2.0", 593 | "extend": "^3.0.1", 594 | "google-auth-library": "^3.0.0", 595 | "pify": "^4.0.0", 596 | "retry-request": "^4.0.0" 597 | } 598 | }, 599 | "@google-cloud/firestore": { 600 | "version": "1.3.0", 601 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-1.3.0.tgz", 602 | "integrity": "sha512-KUKcHUU+FwwBmJH1LqJcd+XtLPzMcS/Vni6/WCJGHBGrOBmXCey4i3Gc41ZsuSk1Qx4msH5f+4h0b3t6YLyydg==", 603 | "optional": true, 604 | "requires": { 605 | "bun": "^0.0.12", 606 | "deep-equal": "^1.0.1", 607 | "functional-red-black-tree": "^1.0.1", 608 | "google-gax": "^0.25.0", 609 | "lodash.merge": "^4.6.1", 610 | "through2": "^3.0.0" 611 | } 612 | }, 613 | "@google-cloud/paginator": { 614 | "version": "0.2.0", 615 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-0.2.0.tgz", 616 | "integrity": "sha512-2ZSARojHDhkLvQ+CS32K+iUhBsWg3AEw+uxtqblA7xoCABDyhpj99FPp35xy6A+XlzMhOSrHHaxFE+t6ZTQq0w==", 617 | "optional": true, 618 | "requires": { 619 | "arrify": "^1.0.1", 620 | "extend": "^3.0.1", 621 | "split-array-stream": "^2.0.0", 622 | "stream-events": "^1.0.4" 623 | } 624 | }, 625 | "@google-cloud/projectify": { 626 | "version": "0.3.3", 627 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.3.tgz", 628 | "integrity": "sha512-7522YHQ4IhaafgSunsFF15nG0TGVmxgXidy9cITMe+256RgqfcrfWphiMufW+Ou4kqagW/u3yxwbzVEW3dk2Uw==", 629 | "optional": true 630 | }, 631 | "@google-cloud/promisify": { 632 | "version": "0.4.0", 633 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.4.0.tgz", 634 | "integrity": "sha512-4yAHDC52TEMCNcMzVC8WlqnKKKq+Ssi2lXoUg9zWWkZ6U6tq9ZBRYLHHCRdfU+EU9YJsVmivwGcKYCjRGjnf4Q==", 635 | "optional": true 636 | }, 637 | "@google-cloud/storage": { 638 | "version": "2.4.3", 639 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-2.4.3.tgz", 640 | "integrity": "sha512-Ol0Ed1zYNYixq+wPPaFNIVjT5+KJldBI6vyRDXnrAu5Yu66PU4iMJvEztUVfckz6vsihwApBMeXxdDUyJzMM2w==", 641 | "optional": true, 642 | "requires": { 643 | "@google-cloud/common": "^0.31.0", 644 | "@google-cloud/paginator": "^0.2.0", 645 | "@google-cloud/promisify": "^0.4.0", 646 | "arrify": "^1.0.0", 647 | "async": "^2.0.1", 648 | "compressible": "^2.0.12", 649 | "concat-stream": "^2.0.0", 650 | "duplexify": "^3.5.0", 651 | "extend": "^3.0.0", 652 | "gcs-resumable-upload": "^1.0.0", 653 | "hash-stream-validation": "^0.2.1", 654 | "mime": "^2.2.0", 655 | "mime-types": "^2.0.8", 656 | "once": "^1.3.1", 657 | "pumpify": "^1.5.1", 658 | "snakeize": "^0.1.0", 659 | "stream-events": "^1.0.1", 660 | "teeny-request": "^3.11.3", 661 | "through2": "^3.0.0", 662 | "xdg-basedir": "^3.0.0" 663 | } 664 | }, 665 | "@grpc/grpc-js": { 666 | "version": "0.3.6", 667 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.3.6.tgz", 668 | "integrity": "sha512-SmLNuPGlUur64bNS9aHZguqWDVQ8+Df1CGn+xsh7l6T2wiP5ArOMlywZ3TZo6z/rwKtGQgUJY9ZrPYUmHEXd/Q==", 669 | "optional": true, 670 | "requires": { 671 | "semver": "^5.5.0" 672 | } 673 | }, 674 | "@grpc/proto-loader": { 675 | "version": "0.4.0", 676 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.4.0.tgz", 677 | "integrity": "sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==", 678 | "optional": true, 679 | "requires": { 680 | "lodash.camelcase": "^4.3.0", 681 | "protobufjs": "^6.8.6" 682 | } 683 | }, 684 | "@protobufjs/aspromise": { 685 | "version": "1.1.2", 686 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 687 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", 688 | "optional": true 689 | }, 690 | "@protobufjs/base64": { 691 | "version": "1.1.2", 692 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 693 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", 694 | "optional": true 695 | }, 696 | "@protobufjs/codegen": { 697 | "version": "2.0.4", 698 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 699 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", 700 | "optional": true 701 | }, 702 | "@protobufjs/eventemitter": { 703 | "version": "1.1.0", 704 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 705 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", 706 | "optional": true 707 | }, 708 | "@protobufjs/fetch": { 709 | "version": "1.1.0", 710 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 711 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 712 | "optional": true, 713 | "requires": { 714 | "@protobufjs/aspromise": "^1.1.1", 715 | "@protobufjs/inquire": "^1.1.0" 716 | } 717 | }, 718 | "@protobufjs/float": { 719 | "version": "1.0.2", 720 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 721 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", 722 | "optional": true 723 | }, 724 | "@protobufjs/inquire": { 725 | "version": "1.1.0", 726 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 727 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", 728 | "optional": true 729 | }, 730 | "@protobufjs/path": { 731 | "version": "1.1.2", 732 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 733 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", 734 | "optional": true 735 | }, 736 | "@protobufjs/pool": { 737 | "version": "1.1.0", 738 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 739 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", 740 | "optional": true 741 | }, 742 | "@protobufjs/utf8": { 743 | "version": "1.1.0", 744 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 745 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", 746 | "optional": true 747 | }, 748 | "@types/body-parser": { 749 | "version": "1.17.0", 750 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 751 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 752 | "requires": { 753 | "@types/connect": "*", 754 | "@types/node": "*" 755 | } 756 | }, 757 | "@types/bytebuffer": { 758 | "version": "5.0.40", 759 | "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.40.tgz", 760 | "integrity": "sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==", 761 | "optional": true, 762 | "requires": { 763 | "@types/long": "*", 764 | "@types/node": "*" 765 | } 766 | }, 767 | "@types/caseless": { 768 | "version": "0.12.2", 769 | "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", 770 | "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", 771 | "optional": true 772 | }, 773 | "@types/connect": { 774 | "version": "3.4.32", 775 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 776 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 777 | "requires": { 778 | "@types/node": "*" 779 | } 780 | }, 781 | "@types/cors": { 782 | "version": "2.8.4", 783 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.4.tgz", 784 | "integrity": "sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw==", 785 | "requires": { 786 | "@types/express": "*" 787 | } 788 | }, 789 | "@types/duplexify": { 790 | "version": "3.6.0", 791 | "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz", 792 | "integrity": "sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A==", 793 | "optional": true, 794 | "requires": { 795 | "@types/node": "*" 796 | } 797 | }, 798 | "@types/express": { 799 | "version": "4.16.1", 800 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", 801 | "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", 802 | "requires": { 803 | "@types/body-parser": "*", 804 | "@types/express-serve-static-core": "*", 805 | "@types/serve-static": "*" 806 | } 807 | }, 808 | "@types/express-serve-static-core": { 809 | "version": "4.16.1", 810 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", 811 | "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", 812 | "requires": { 813 | "@types/node": "*", 814 | "@types/range-parser": "*" 815 | } 816 | }, 817 | "@types/form-data": { 818 | "version": "2.2.1", 819 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", 820 | "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", 821 | "optional": true, 822 | "requires": { 823 | "@types/node": "*" 824 | } 825 | }, 826 | "@types/jsonwebtoken": { 827 | "version": "7.2.8", 828 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz", 829 | "integrity": "sha512-XENN3YzEB8D6TiUww0O8SRznzy1v+77lH7UmuN54xq/IHIsyWjWOzZuFFTtoiRuaE782uAoRwBe/wwow+vQXZw==", 830 | "requires": { 831 | "@types/node": "*" 832 | } 833 | }, 834 | "@types/lodash": { 835 | "version": "4.14.123", 836 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", 837 | "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==" 838 | }, 839 | "@types/long": { 840 | "version": "4.0.1", 841 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 842 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", 843 | "optional": true 844 | }, 845 | "@types/mime": { 846 | "version": "2.0.1", 847 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 848 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" 849 | }, 850 | "@types/node": { 851 | "version": "8.10.44", 852 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.44.tgz", 853 | "integrity": "sha512-HY3SK7egERHGUfY8p6ztXIEQWcIPHouYhCGcLAPQin7gE2G/fALFz+epnMwcxKUS6aKqTVoAFdi+t1llQd3xcw==" 854 | }, 855 | "@types/range-parser": { 856 | "version": "1.2.3", 857 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 858 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 859 | }, 860 | "@types/request": { 861 | "version": "2.48.1", 862 | "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", 863 | "integrity": "sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==", 864 | "optional": true, 865 | "requires": { 866 | "@types/caseless": "*", 867 | "@types/form-data": "*", 868 | "@types/node": "*", 869 | "@types/tough-cookie": "*" 870 | } 871 | }, 872 | "@types/serve-static": { 873 | "version": "1.13.2", 874 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 875 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 876 | "requires": { 877 | "@types/express-serve-static-core": "*", 878 | "@types/mime": "*" 879 | } 880 | }, 881 | "@types/tough-cookie": { 882 | "version": "2.3.5", 883 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", 884 | "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", 885 | "optional": true 886 | }, 887 | "abort-controller": { 888 | "version": "2.0.3", 889 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-2.0.3.tgz", 890 | "integrity": "sha512-EPSq5wr2aFyAZ1PejJB32IX9Qd4Nwus+adnp7STYFM5/23nLPBazqZ1oor6ZqbH+4otaaGXTlC8RN5hq3C8w9Q==", 891 | "optional": true, 892 | "requires": { 893 | "event-target-shim": "^5.0.0" 894 | } 895 | }, 896 | "accepts": { 897 | "version": "1.3.5", 898 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 899 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 900 | "requires": { 901 | "mime-types": "~2.1.18", 902 | "negotiator": "0.6.1" 903 | } 904 | }, 905 | "agent-base": { 906 | "version": "4.3.0", 907 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 908 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 909 | "optional": true, 910 | "requires": { 911 | "es6-promisify": "^5.0.0" 912 | } 913 | }, 914 | "ansi-regex": { 915 | "version": "2.1.1", 916 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 917 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 918 | }, 919 | "array-flatten": { 920 | "version": "1.1.1", 921 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 922 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 923 | }, 924 | "arrify": { 925 | "version": "1.0.1", 926 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 927 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 928 | "optional": true 929 | }, 930 | "ascli": { 931 | "version": "1.0.1", 932 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 933 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 934 | "requires": { 935 | "colour": "~0.7.1", 936 | "optjs": "~3.2.2" 937 | } 938 | }, 939 | "async": { 940 | "version": "2.6.2", 941 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", 942 | "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", 943 | "optional": true, 944 | "requires": { 945 | "lodash": "^4.17.11" 946 | } 947 | }, 948 | "balanced-match": { 949 | "version": "1.0.0", 950 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 951 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 952 | }, 953 | "base64-js": { 954 | "version": "1.3.0", 955 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 956 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", 957 | "optional": true 958 | }, 959 | "bignumber.js": { 960 | "version": "7.2.1", 961 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", 962 | "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", 963 | "optional": true 964 | }, 965 | "body-parser": { 966 | "version": "1.18.3", 967 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 968 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 969 | "requires": { 970 | "bytes": "3.0.0", 971 | "content-type": "~1.0.4", 972 | "debug": "2.6.9", 973 | "depd": "~1.1.2", 974 | "http-errors": "~1.6.3", 975 | "iconv-lite": "0.4.23", 976 | "on-finished": "~2.3.0", 977 | "qs": "6.5.2", 978 | "raw-body": "2.3.3", 979 | "type-is": "~1.6.16" 980 | }, 981 | "dependencies": { 982 | "debug": { 983 | "version": "2.6.9", 984 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 985 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 986 | "requires": { 987 | "ms": "2.0.0" 988 | } 989 | }, 990 | "ms": { 991 | "version": "2.0.0", 992 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 993 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 994 | } 995 | } 996 | }, 997 | "brace-expansion": { 998 | "version": "1.1.11", 999 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1000 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1001 | "requires": { 1002 | "balanced-match": "^1.0.0", 1003 | "concat-map": "0.0.1" 1004 | } 1005 | }, 1006 | "buffer-equal-constant-time": { 1007 | "version": "1.0.1", 1008 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1009 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 1010 | }, 1011 | "buffer-from": { 1012 | "version": "1.1.1", 1013 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 1014 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 1015 | "optional": true 1016 | }, 1017 | "bun": { 1018 | "version": "0.0.12", 1019 | "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", 1020 | "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", 1021 | "optional": true, 1022 | "requires": { 1023 | "readable-stream": "~1.0.32" 1024 | } 1025 | }, 1026 | "busboy": { 1027 | "version": "0.3.0", 1028 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.0.tgz", 1029 | "integrity": "sha512-e+kzZRAbbvJPLjQz2z+zAyr78BSi9IFeBTyLwF76g78Q2zRt/RZ1NtS3MS17v2yLqYfLz69zHdC+1L4ja8PwqQ==", 1030 | "requires": { 1031 | "dicer": "0.3.0" 1032 | } 1033 | }, 1034 | "bytebuffer": { 1035 | "version": "5.0.1", 1036 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 1037 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 1038 | "requires": { 1039 | "long": "~3" 1040 | }, 1041 | "dependencies": { 1042 | "long": { 1043 | "version": "3.2.0", 1044 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 1045 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 1046 | } 1047 | } 1048 | }, 1049 | "bytes": { 1050 | "version": "3.0.0", 1051 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 1052 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 1053 | }, 1054 | "camelcase": { 1055 | "version": "2.1.1", 1056 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 1057 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 1058 | }, 1059 | "cliui": { 1060 | "version": "3.2.0", 1061 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 1062 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 1063 | "requires": { 1064 | "string-width": "^1.0.1", 1065 | "strip-ansi": "^3.0.1", 1066 | "wrap-ansi": "^2.0.0" 1067 | } 1068 | }, 1069 | "code-point-at": { 1070 | "version": "1.1.0", 1071 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 1072 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 1073 | }, 1074 | "colour": { 1075 | "version": "0.7.1", 1076 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 1077 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 1078 | }, 1079 | "compressible": { 1080 | "version": "2.0.16", 1081 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", 1082 | "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", 1083 | "optional": true, 1084 | "requires": { 1085 | "mime-db": ">= 1.38.0 < 2" 1086 | } 1087 | }, 1088 | "concat-map": { 1089 | "version": "0.0.1", 1090 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1091 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 1092 | }, 1093 | "concat-stream": { 1094 | "version": "2.0.0", 1095 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 1096 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 1097 | "optional": true, 1098 | "requires": { 1099 | "buffer-from": "^1.0.0", 1100 | "inherits": "^2.0.3", 1101 | "readable-stream": "^3.0.2", 1102 | "typedarray": "^0.0.6" 1103 | }, 1104 | "dependencies": { 1105 | "readable-stream": { 1106 | "version": "3.2.0", 1107 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", 1108 | "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", 1109 | "optional": true, 1110 | "requires": { 1111 | "inherits": "^2.0.3", 1112 | "string_decoder": "^1.1.1", 1113 | "util-deprecate": "^1.0.1" 1114 | } 1115 | }, 1116 | "string_decoder": { 1117 | "version": "1.2.0", 1118 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 1119 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 1120 | "optional": true, 1121 | "requires": { 1122 | "safe-buffer": "~5.1.0" 1123 | } 1124 | } 1125 | } 1126 | }, 1127 | "configstore": { 1128 | "version": "4.0.0", 1129 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", 1130 | "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", 1131 | "optional": true, 1132 | "requires": { 1133 | "dot-prop": "^4.1.0", 1134 | "graceful-fs": "^4.1.2", 1135 | "make-dir": "^1.0.0", 1136 | "unique-string": "^1.0.0", 1137 | "write-file-atomic": "^2.0.0", 1138 | "xdg-basedir": "^3.0.0" 1139 | } 1140 | }, 1141 | "content-disposition": { 1142 | "version": "0.5.2", 1143 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 1144 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 1145 | }, 1146 | "content-type": { 1147 | "version": "1.0.4", 1148 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1149 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1150 | }, 1151 | "cookie": { 1152 | "version": "0.3.1", 1153 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 1154 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 1155 | }, 1156 | "cookie-signature": { 1157 | "version": "1.0.6", 1158 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1159 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 1160 | }, 1161 | "core-js": { 1162 | "version": "2.6.5", 1163 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", 1164 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" 1165 | }, 1166 | "core-util-is": { 1167 | "version": "1.0.2", 1168 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1169 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 1170 | "optional": true 1171 | }, 1172 | "cors": { 1173 | "version": "2.8.5", 1174 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1175 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1176 | "requires": { 1177 | "object-assign": "^4", 1178 | "vary": "^1" 1179 | } 1180 | }, 1181 | "crypto-random-string": { 1182 | "version": "1.0.0", 1183 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 1184 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 1185 | "optional": true 1186 | }, 1187 | "debug": { 1188 | "version": "3.2.6", 1189 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1190 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1191 | "optional": true, 1192 | "requires": { 1193 | "ms": "^2.1.1" 1194 | } 1195 | }, 1196 | "decamelize": { 1197 | "version": "1.2.0", 1198 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 1199 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 1200 | }, 1201 | "deep-equal": { 1202 | "version": "1.1.1", 1203 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", 1204 | "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", 1205 | "optional": true, 1206 | "requires": { 1207 | "is-arguments": "^1.0.4", 1208 | "is-date-object": "^1.0.1", 1209 | "is-regex": "^1.0.4", 1210 | "object-is": "^1.0.1", 1211 | "object-keys": "^1.1.1", 1212 | "regexp.prototype.flags": "^1.2.0" 1213 | } 1214 | }, 1215 | "define-properties": { 1216 | "version": "1.1.3", 1217 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1218 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1219 | "requires": { 1220 | "object-keys": "^1.0.12" 1221 | } 1222 | }, 1223 | "depd": { 1224 | "version": "1.1.2", 1225 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1226 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1227 | }, 1228 | "destroy": { 1229 | "version": "1.0.4", 1230 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1231 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1232 | }, 1233 | "dicer": { 1234 | "version": "0.3.0", 1235 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 1236 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 1237 | "requires": { 1238 | "streamsearch": "0.1.2" 1239 | } 1240 | }, 1241 | "dom-storage": { 1242 | "version": "2.1.0", 1243 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 1244 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 1245 | }, 1246 | "dot-prop": { 1247 | "version": "4.2.0", 1248 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 1249 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 1250 | "optional": true, 1251 | "requires": { 1252 | "is-obj": "^1.0.0" 1253 | } 1254 | }, 1255 | "duplexify": { 1256 | "version": "3.7.1", 1257 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 1258 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 1259 | "optional": true, 1260 | "requires": { 1261 | "end-of-stream": "^1.0.0", 1262 | "inherits": "^2.0.1", 1263 | "readable-stream": "^2.0.0", 1264 | "stream-shift": "^1.0.0" 1265 | }, 1266 | "dependencies": { 1267 | "isarray": { 1268 | "version": "1.0.0", 1269 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1270 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1271 | "optional": true 1272 | }, 1273 | "readable-stream": { 1274 | "version": "2.3.6", 1275 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1276 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1277 | "optional": true, 1278 | "requires": { 1279 | "core-util-is": "~1.0.0", 1280 | "inherits": "~2.0.3", 1281 | "isarray": "~1.0.0", 1282 | "process-nextick-args": "~2.0.0", 1283 | "safe-buffer": "~5.1.1", 1284 | "string_decoder": "~1.1.1", 1285 | "util-deprecate": "~1.0.1" 1286 | } 1287 | }, 1288 | "string_decoder": { 1289 | "version": "1.1.1", 1290 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1291 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1292 | "optional": true, 1293 | "requires": { 1294 | "safe-buffer": "~5.1.0" 1295 | } 1296 | } 1297 | } 1298 | }, 1299 | "ecdsa-sig-formatter": { 1300 | "version": "1.0.11", 1301 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1302 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1303 | "requires": { 1304 | "safe-buffer": "^5.0.1" 1305 | } 1306 | }, 1307 | "ee-first": { 1308 | "version": "1.1.1", 1309 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1310 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1311 | }, 1312 | "encodeurl": { 1313 | "version": "1.0.2", 1314 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1315 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1316 | }, 1317 | "encoding": { 1318 | "version": "0.1.12", 1319 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 1320 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 1321 | "requires": { 1322 | "iconv-lite": "~0.4.13" 1323 | } 1324 | }, 1325 | "end-of-stream": { 1326 | "version": "1.4.1", 1327 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 1328 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 1329 | "optional": true, 1330 | "requires": { 1331 | "once": "^1.4.0" 1332 | } 1333 | }, 1334 | "ent": { 1335 | "version": "2.2.0", 1336 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 1337 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", 1338 | "optional": true 1339 | }, 1340 | "es-abstract": { 1341 | "version": "1.17.5", 1342 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 1343 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 1344 | "requires": { 1345 | "es-to-primitive": "^1.2.1", 1346 | "function-bind": "^1.1.1", 1347 | "has": "^1.0.3", 1348 | "has-symbols": "^1.0.1", 1349 | "is-callable": "^1.1.5", 1350 | "is-regex": "^1.0.5", 1351 | "object-inspect": "^1.7.0", 1352 | "object-keys": "^1.1.1", 1353 | "object.assign": "^4.1.0", 1354 | "string.prototype.trimleft": "^2.1.1", 1355 | "string.prototype.trimright": "^2.1.1" 1356 | } 1357 | }, 1358 | "es-to-primitive": { 1359 | "version": "1.2.1", 1360 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1361 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1362 | "requires": { 1363 | "is-callable": "^1.1.4", 1364 | "is-date-object": "^1.0.1", 1365 | "is-symbol": "^1.0.2" 1366 | } 1367 | }, 1368 | "es6-promise": { 1369 | "version": "4.2.8", 1370 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 1371 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 1372 | "optional": true 1373 | }, 1374 | "es6-promisify": { 1375 | "version": "5.0.0", 1376 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 1377 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 1378 | "optional": true, 1379 | "requires": { 1380 | "es6-promise": "^4.0.3" 1381 | } 1382 | }, 1383 | "escape-html": { 1384 | "version": "1.0.3", 1385 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1386 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1387 | }, 1388 | "etag": { 1389 | "version": "1.8.1", 1390 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1391 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1392 | }, 1393 | "event-target-shim": { 1394 | "version": "5.0.1", 1395 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1396 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1397 | "optional": true 1398 | }, 1399 | "express": { 1400 | "version": "4.16.4", 1401 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 1402 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 1403 | "requires": { 1404 | "accepts": "~1.3.5", 1405 | "array-flatten": "1.1.1", 1406 | "body-parser": "1.18.3", 1407 | "content-disposition": "0.5.2", 1408 | "content-type": "~1.0.4", 1409 | "cookie": "0.3.1", 1410 | "cookie-signature": "1.0.6", 1411 | "debug": "2.6.9", 1412 | "depd": "~1.1.2", 1413 | "encodeurl": "~1.0.2", 1414 | "escape-html": "~1.0.3", 1415 | "etag": "~1.8.1", 1416 | "finalhandler": "1.1.1", 1417 | "fresh": "0.5.2", 1418 | "merge-descriptors": "1.0.1", 1419 | "methods": "~1.1.2", 1420 | "on-finished": "~2.3.0", 1421 | "parseurl": "~1.3.2", 1422 | "path-to-regexp": "0.1.7", 1423 | "proxy-addr": "~2.0.4", 1424 | "qs": "6.5.2", 1425 | "range-parser": "~1.2.0", 1426 | "safe-buffer": "5.1.2", 1427 | "send": "0.16.2", 1428 | "serve-static": "1.13.2", 1429 | "setprototypeof": "1.1.0", 1430 | "statuses": "~1.4.0", 1431 | "type-is": "~1.6.16", 1432 | "utils-merge": "1.0.1", 1433 | "vary": "~1.1.2" 1434 | }, 1435 | "dependencies": { 1436 | "debug": { 1437 | "version": "2.6.9", 1438 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1439 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1440 | "requires": { 1441 | "ms": "2.0.0" 1442 | } 1443 | }, 1444 | "ms": { 1445 | "version": "2.0.0", 1446 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1447 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1448 | } 1449 | } 1450 | }, 1451 | "extend": { 1452 | "version": "3.0.2", 1453 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1454 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1455 | "optional": true 1456 | }, 1457 | "fast-text-encoding": { 1458 | "version": "1.0.0", 1459 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", 1460 | "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==", 1461 | "optional": true 1462 | }, 1463 | "faye-websocket": { 1464 | "version": "0.11.1", 1465 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", 1466 | "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", 1467 | "requires": { 1468 | "websocket-driver": ">=0.5.1" 1469 | } 1470 | }, 1471 | "finalhandler": { 1472 | "version": "1.1.1", 1473 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 1474 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 1475 | "requires": { 1476 | "debug": "2.6.9", 1477 | "encodeurl": "~1.0.2", 1478 | "escape-html": "~1.0.3", 1479 | "on-finished": "~2.3.0", 1480 | "parseurl": "~1.3.2", 1481 | "statuses": "~1.4.0", 1482 | "unpipe": "~1.0.0" 1483 | }, 1484 | "dependencies": { 1485 | "debug": { 1486 | "version": "2.6.9", 1487 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1488 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1489 | "requires": { 1490 | "ms": "2.0.0" 1491 | } 1492 | }, 1493 | "ms": { 1494 | "version": "2.0.0", 1495 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1496 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1497 | } 1498 | } 1499 | }, 1500 | "firebase": { 1501 | "version": "5.9.0", 1502 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.9.0.tgz", 1503 | "integrity": "sha512-9iGXemLoEeoN1WqV8GRlYCfshfcAB0GDO2l1ZwPVuGxpwSZohXEbec63/qJhnTCf50QIpO8NP1ICZwhC/4wU4A==", 1504 | "requires": { 1505 | "@firebase/app": "0.3.12", 1506 | "@firebase/auth": "0.9.5", 1507 | "@firebase/database": "0.3.15", 1508 | "@firebase/firestore": "1.1.0", 1509 | "@firebase/functions": "0.4.2", 1510 | "@firebase/messaging": "0.3.14", 1511 | "@firebase/polyfill": "0.3.8", 1512 | "@firebase/storage": "0.2.11" 1513 | } 1514 | }, 1515 | "firebase-admin": { 1516 | "version": "7.0.0", 1517 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-7.0.0.tgz", 1518 | "integrity": "sha512-uYJVRuq8/b9PeJrgZwE2OIfr/MQAVhWxUpOa4AnWEEjzM7hzw2CQjY2iFzH6o0/7rTyAiGeFPQQQLBMg/xuQ6w==", 1519 | "requires": { 1520 | "@firebase/app": "^0.3.4", 1521 | "@firebase/database": "^0.3.6", 1522 | "@google-cloud/firestore": "^1.0.1", 1523 | "@google-cloud/storage": "^2.3.0", 1524 | "@types/node": "^8.0.53", 1525 | "jsonwebtoken": "8.1.0", 1526 | "node-forge": "0.7.4" 1527 | } 1528 | }, 1529 | "firebase-functions": { 1530 | "version": "2.2.0", 1531 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-2.2.0.tgz", 1532 | "integrity": "sha512-83rJvXreTH98q1XEEUZ4G9nFZ0sUVaqkxPC+v25L9FuXsWgAFpW7G28K0MJ9DBPNo/RaeNNw0zvZVtDw11CEbQ==", 1533 | "requires": { 1534 | "@types/cors": "^2.8.1", 1535 | "@types/express": "^4.11.1", 1536 | "@types/jsonwebtoken": "^7.2.6", 1537 | "@types/lodash": "^4.14.34", 1538 | "cors": "^2.8.4", 1539 | "express": "^4.16.2", 1540 | "jsonwebtoken": "^8.2.1", 1541 | "lodash": "^4.6.1" 1542 | }, 1543 | "dependencies": { 1544 | "jsonwebtoken": { 1545 | "version": "8.5.0", 1546 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", 1547 | "integrity": "sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==", 1548 | "requires": { 1549 | "jws": "^3.2.1", 1550 | "lodash.includes": "^4.3.0", 1551 | "lodash.isboolean": "^3.0.3", 1552 | "lodash.isinteger": "^4.0.4", 1553 | "lodash.isnumber": "^3.0.3", 1554 | "lodash.isplainobject": "^4.0.6", 1555 | "lodash.isstring": "^4.0.1", 1556 | "lodash.once": "^4.0.0", 1557 | "ms": "^2.1.1", 1558 | "semver": "^5.6.0" 1559 | } 1560 | } 1561 | } 1562 | }, 1563 | "forwarded": { 1564 | "version": "0.1.2", 1565 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1566 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1567 | }, 1568 | "fresh": { 1569 | "version": "0.5.2", 1570 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1571 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1572 | }, 1573 | "fs.realpath": { 1574 | "version": "1.0.0", 1575 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1576 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1577 | }, 1578 | "function-bind": { 1579 | "version": "1.1.1", 1580 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1581 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1582 | }, 1583 | "functional-red-black-tree": { 1584 | "version": "1.0.1", 1585 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1586 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1587 | "optional": true 1588 | }, 1589 | "gaxios": { 1590 | "version": "1.8.2", 1591 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.2.tgz", 1592 | "integrity": "sha512-Mp6zmABg+0CxJA4b7DEWQ4ZWQzEaWxRNmHAcvCO+HU3dfoFTY925bdpZrTkLWPEtKjS9RBJKrJInzb+VtvAVYA==", 1593 | "optional": true, 1594 | "requires": { 1595 | "abort-controller": "^2.0.2", 1596 | "extend": "^3.0.2", 1597 | "https-proxy-agent": "^2.2.1", 1598 | "node-fetch": "^2.3.0" 1599 | } 1600 | }, 1601 | "gcp-metadata": { 1602 | "version": "0.9.3", 1603 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz", 1604 | "integrity": "sha512-caV4S84xAjENtpezLCT/GILEAF5h/bC4cNqZFmt/tjTn8t+JBtTkQrgBrJu3857YdsnlM8rxX/PMcKGtE8hUlw==", 1605 | "optional": true, 1606 | "requires": { 1607 | "gaxios": "^1.0.2", 1608 | "json-bigint": "^0.3.0" 1609 | } 1610 | }, 1611 | "gcs-resumable-upload": { 1612 | "version": "1.0.0", 1613 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-1.0.0.tgz", 1614 | "integrity": "sha512-InuVkmj7srAb64w/vSaCU162jk7p4UHmibvfFjT1opO1tiK8Yy88/BeEYn2bCVMv6LH0Sw29L70ejG6oPeq8Ig==", 1615 | "optional": true, 1616 | "requires": { 1617 | "abort-controller": "^2.0.2", 1618 | "configstore": "^4.0.0", 1619 | "gaxios": "^1.5.0", 1620 | "google-auth-library": "^3.0.0", 1621 | "pumpify": "^1.5.1", 1622 | "stream-events": "^1.0.4" 1623 | } 1624 | }, 1625 | "glob": { 1626 | "version": "7.1.6", 1627 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1628 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1629 | "requires": { 1630 | "fs.realpath": "^1.0.0", 1631 | "inflight": "^1.0.4", 1632 | "inherits": "2", 1633 | "minimatch": "^3.0.4", 1634 | "once": "^1.3.0", 1635 | "path-is-absolute": "^1.0.0" 1636 | } 1637 | }, 1638 | "google-auth-library": { 1639 | "version": "3.1.0", 1640 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.0.tgz", 1641 | "integrity": "sha512-EntjrOgSffw5EhZGoV8+ROPwEK/aQpoMZaULw3bKailEGdjaUI25PmmFc4AN6vG/Q24YEUiuLxtTXa1Usar5Eg==", 1642 | "optional": true, 1643 | "requires": { 1644 | "base64-js": "^1.3.0", 1645 | "fast-text-encoding": "^1.0.0", 1646 | "gaxios": "^1.2.1", 1647 | "gcp-metadata": "^0.9.3", 1648 | "gtoken": "^2.3.2", 1649 | "https-proxy-agent": "^2.2.1", 1650 | "jws": "^3.1.5", 1651 | "lru-cache": "^5.0.0", 1652 | "semver": "^5.5.0" 1653 | } 1654 | }, 1655 | "google-gax": { 1656 | "version": "0.25.6", 1657 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.25.6.tgz", 1658 | "integrity": "sha512-+CVtOSLQt42mwVvJJirhBiAvWsp8zKeb9zW5Wy3wyvb3VG9OugHzZpwvYO9D4yNPPspe7L9CpIs80I5nUJlS8w==", 1659 | "optional": true, 1660 | "requires": { 1661 | "@grpc/grpc-js": "^0.3.0", 1662 | "@grpc/proto-loader": "^0.4.0", 1663 | "duplexify": "^3.6.0", 1664 | "google-auth-library": "^3.0.0", 1665 | "google-proto-files": "^0.20.0", 1666 | "grpc": "^1.16.0", 1667 | "grpc-gcp": "^0.1.1", 1668 | "is-stream-ended": "^0.1.4", 1669 | "lodash.at": "^4.6.0", 1670 | "lodash.has": "^4.5.2", 1671 | "protobufjs": "^6.8.8", 1672 | "retry-request": "^4.0.0", 1673 | "semver": "^6.0.0", 1674 | "walkdir": "^0.3.2" 1675 | }, 1676 | "dependencies": { 1677 | "semver": { 1678 | "version": "6.3.0", 1679 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1680 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1681 | "optional": true 1682 | } 1683 | } 1684 | }, 1685 | "google-p12-pem": { 1686 | "version": "1.0.4", 1687 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", 1688 | "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", 1689 | "optional": true, 1690 | "requires": { 1691 | "node-forge": "^0.8.0", 1692 | "pify": "^4.0.0" 1693 | }, 1694 | "dependencies": { 1695 | "node-forge": { 1696 | "version": "0.8.1", 1697 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.1.tgz", 1698 | "integrity": "sha512-C/42HVb5eRtnDgRKOFx4bJH6LwbGQwbEHOC/trQwQSR6xWAUR/jlWoUJnxOmFTvdmDIZtjl2VH4dl3VpQuIz5g==", 1699 | "optional": true 1700 | } 1701 | } 1702 | }, 1703 | "google-proto-files": { 1704 | "version": "0.20.0", 1705 | "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.20.0.tgz", 1706 | "integrity": "sha512-ORU+XhOeDv/UPtnCYLkO1ItmfhRCRPR3ZoeVQ7GfVzEs7PVitPIhsYlY5ZzG8XXnsdmtK27ENurfQ1jhAWpZHg==", 1707 | "optional": true, 1708 | "requires": { 1709 | "@google-cloud/promisify": "^0.4.0", 1710 | "protobufjs": "^6.8.0", 1711 | "walkdir": "^0.3.0" 1712 | } 1713 | }, 1714 | "graceful-fs": { 1715 | "version": "4.1.15", 1716 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1717 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 1718 | "optional": true 1719 | }, 1720 | "grpc": { 1721 | "version": "1.24.2", 1722 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.2.tgz", 1723 | "integrity": "sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==", 1724 | "optional": true, 1725 | "requires": { 1726 | "@types/bytebuffer": "^5.0.40", 1727 | "lodash.camelcase": "^4.3.0", 1728 | "lodash.clone": "^4.5.0", 1729 | "nan": "^2.13.2", 1730 | "node-pre-gyp": "^0.14.0", 1731 | "protobufjs": "^5.0.3" 1732 | }, 1733 | "dependencies": { 1734 | "abbrev": { 1735 | "version": "1.1.1", 1736 | "bundled": true, 1737 | "optional": true 1738 | }, 1739 | "ansi-regex": { 1740 | "version": "2.1.1", 1741 | "bundled": true, 1742 | "optional": true 1743 | }, 1744 | "aproba": { 1745 | "version": "1.2.0", 1746 | "bundled": true, 1747 | "optional": true 1748 | }, 1749 | "are-we-there-yet": { 1750 | "version": "1.1.5", 1751 | "bundled": true, 1752 | "optional": true, 1753 | "requires": { 1754 | "delegates": "^1.0.0", 1755 | "readable-stream": "^2.0.6" 1756 | } 1757 | }, 1758 | "balanced-match": { 1759 | "version": "1.0.0", 1760 | "bundled": true, 1761 | "optional": true 1762 | }, 1763 | "brace-expansion": { 1764 | "version": "1.1.11", 1765 | "bundled": true, 1766 | "optional": true, 1767 | "requires": { 1768 | "balanced-match": "^1.0.0", 1769 | "concat-map": "0.0.1" 1770 | } 1771 | }, 1772 | "chownr": { 1773 | "version": "1.1.3", 1774 | "bundled": true, 1775 | "optional": true 1776 | }, 1777 | "code-point-at": { 1778 | "version": "1.1.0", 1779 | "bundled": true, 1780 | "optional": true 1781 | }, 1782 | "concat-map": { 1783 | "version": "0.0.1", 1784 | "bundled": true, 1785 | "optional": true 1786 | }, 1787 | "console-control-strings": { 1788 | "version": "1.1.0", 1789 | "bundled": true, 1790 | "optional": true 1791 | }, 1792 | "core-util-is": { 1793 | "version": "1.0.2", 1794 | "bundled": true, 1795 | "optional": true 1796 | }, 1797 | "debug": { 1798 | "version": "3.2.6", 1799 | "bundled": true, 1800 | "optional": true, 1801 | "requires": { 1802 | "ms": "^2.1.1" 1803 | } 1804 | }, 1805 | "deep-extend": { 1806 | "version": "0.6.0", 1807 | "bundled": true, 1808 | "optional": true 1809 | }, 1810 | "delegates": { 1811 | "version": "1.0.0", 1812 | "bundled": true, 1813 | "optional": true 1814 | }, 1815 | "detect-libc": { 1816 | "version": "1.0.3", 1817 | "bundled": true, 1818 | "optional": true 1819 | }, 1820 | "fs-minipass": { 1821 | "version": "1.2.7", 1822 | "bundled": true, 1823 | "optional": true, 1824 | "requires": { 1825 | "minipass": "^2.6.0" 1826 | } 1827 | }, 1828 | "fs.realpath": { 1829 | "version": "1.0.0", 1830 | "bundled": true, 1831 | "optional": true 1832 | }, 1833 | "gauge": { 1834 | "version": "2.7.4", 1835 | "bundled": true, 1836 | "optional": true, 1837 | "requires": { 1838 | "aproba": "^1.0.3", 1839 | "console-control-strings": "^1.0.0", 1840 | "has-unicode": "^2.0.0", 1841 | "object-assign": "^4.1.0", 1842 | "signal-exit": "^3.0.0", 1843 | "string-width": "^1.0.1", 1844 | "strip-ansi": "^3.0.1", 1845 | "wide-align": "^1.1.0" 1846 | } 1847 | }, 1848 | "glob": { 1849 | "version": "7.1.4", 1850 | "bundled": true, 1851 | "optional": true, 1852 | "requires": { 1853 | "fs.realpath": "^1.0.0", 1854 | "inflight": "^1.0.4", 1855 | "inherits": "2", 1856 | "minimatch": "^3.0.4", 1857 | "once": "^1.3.0", 1858 | "path-is-absolute": "^1.0.0" 1859 | } 1860 | }, 1861 | "has-unicode": { 1862 | "version": "2.0.1", 1863 | "bundled": true, 1864 | "optional": true 1865 | }, 1866 | "iconv-lite": { 1867 | "version": "0.4.24", 1868 | "bundled": true, 1869 | "optional": true, 1870 | "requires": { 1871 | "safer-buffer": ">= 2.1.2 < 3" 1872 | } 1873 | }, 1874 | "ignore-walk": { 1875 | "version": "3.0.3", 1876 | "bundled": true, 1877 | "optional": true, 1878 | "requires": { 1879 | "minimatch": "^3.0.4" 1880 | } 1881 | }, 1882 | "inflight": { 1883 | "version": "1.0.6", 1884 | "bundled": true, 1885 | "optional": true, 1886 | "requires": { 1887 | "once": "^1.3.0", 1888 | "wrappy": "1" 1889 | } 1890 | }, 1891 | "inherits": { 1892 | "version": "2.0.4", 1893 | "bundled": true, 1894 | "optional": true 1895 | }, 1896 | "ini": { 1897 | "version": "1.3.5", 1898 | "bundled": true, 1899 | "optional": true 1900 | }, 1901 | "is-fullwidth-code-point": { 1902 | "version": "1.0.0", 1903 | "bundled": true, 1904 | "optional": true, 1905 | "requires": { 1906 | "number-is-nan": "^1.0.0" 1907 | } 1908 | }, 1909 | "isarray": { 1910 | "version": "1.0.0", 1911 | "bundled": true, 1912 | "optional": true 1913 | }, 1914 | "minimatch": { 1915 | "version": "3.0.4", 1916 | "bundled": true, 1917 | "optional": true, 1918 | "requires": { 1919 | "brace-expansion": "^1.1.7" 1920 | } 1921 | }, 1922 | "minimist": { 1923 | "version": "1.2.0", 1924 | "bundled": true, 1925 | "optional": true 1926 | }, 1927 | "minipass": { 1928 | "version": "2.9.0", 1929 | "bundled": true, 1930 | "optional": true, 1931 | "requires": { 1932 | "safe-buffer": "^5.1.2", 1933 | "yallist": "^3.0.0" 1934 | } 1935 | }, 1936 | "minizlib": { 1937 | "version": "1.3.3", 1938 | "bundled": true, 1939 | "optional": true, 1940 | "requires": { 1941 | "minipass": "^2.9.0" 1942 | } 1943 | }, 1944 | "mkdirp": { 1945 | "version": "0.5.1", 1946 | "bundled": true, 1947 | "optional": true, 1948 | "requires": { 1949 | "minimist": "0.0.8" 1950 | }, 1951 | "dependencies": { 1952 | "minimist": { 1953 | "version": "0.0.8", 1954 | "bundled": true, 1955 | "optional": true 1956 | } 1957 | } 1958 | }, 1959 | "ms": { 1960 | "version": "2.1.2", 1961 | "bundled": true, 1962 | "optional": true 1963 | }, 1964 | "needle": { 1965 | "version": "2.4.0", 1966 | "bundled": true, 1967 | "optional": true, 1968 | "requires": { 1969 | "debug": "^3.2.6", 1970 | "iconv-lite": "^0.4.4", 1971 | "sax": "^1.2.4" 1972 | } 1973 | }, 1974 | "node-pre-gyp": { 1975 | "version": "0.14.0", 1976 | "bundled": true, 1977 | "optional": true, 1978 | "requires": { 1979 | "detect-libc": "^1.0.2", 1980 | "mkdirp": "^0.5.1", 1981 | "needle": "^2.2.1", 1982 | "nopt": "^4.0.1", 1983 | "npm-packlist": "^1.1.6", 1984 | "npmlog": "^4.0.2", 1985 | "rc": "^1.2.7", 1986 | "rimraf": "^2.6.1", 1987 | "semver": "^5.3.0", 1988 | "tar": "^4.4.2" 1989 | } 1990 | }, 1991 | "nopt": { 1992 | "version": "4.0.1", 1993 | "bundled": true, 1994 | "optional": true, 1995 | "requires": { 1996 | "abbrev": "1", 1997 | "osenv": "^0.1.4" 1998 | } 1999 | }, 2000 | "npm-bundled": { 2001 | "version": "1.0.6", 2002 | "bundled": true, 2003 | "optional": true 2004 | }, 2005 | "npm-packlist": { 2006 | "version": "1.4.6", 2007 | "bundled": true, 2008 | "optional": true, 2009 | "requires": { 2010 | "ignore-walk": "^3.0.1", 2011 | "npm-bundled": "^1.0.1" 2012 | } 2013 | }, 2014 | "npmlog": { 2015 | "version": "4.1.2", 2016 | "bundled": true, 2017 | "optional": true, 2018 | "requires": { 2019 | "are-we-there-yet": "~1.1.2", 2020 | "console-control-strings": "~1.1.0", 2021 | "gauge": "~2.7.3", 2022 | "set-blocking": "~2.0.0" 2023 | } 2024 | }, 2025 | "number-is-nan": { 2026 | "version": "1.0.1", 2027 | "bundled": true, 2028 | "optional": true 2029 | }, 2030 | "object-assign": { 2031 | "version": "4.1.1", 2032 | "bundled": true, 2033 | "optional": true 2034 | }, 2035 | "once": { 2036 | "version": "1.4.0", 2037 | "bundled": true, 2038 | "optional": true, 2039 | "requires": { 2040 | "wrappy": "1" 2041 | } 2042 | }, 2043 | "os-homedir": { 2044 | "version": "1.0.2", 2045 | "bundled": true, 2046 | "optional": true 2047 | }, 2048 | "os-tmpdir": { 2049 | "version": "1.0.2", 2050 | "bundled": true, 2051 | "optional": true 2052 | }, 2053 | "osenv": { 2054 | "version": "0.1.5", 2055 | "bundled": true, 2056 | "optional": true, 2057 | "requires": { 2058 | "os-homedir": "^1.0.0", 2059 | "os-tmpdir": "^1.0.0" 2060 | } 2061 | }, 2062 | "path-is-absolute": { 2063 | "version": "1.0.1", 2064 | "bundled": true, 2065 | "optional": true 2066 | }, 2067 | "process-nextick-args": { 2068 | "version": "2.0.1", 2069 | "bundled": true, 2070 | "optional": true 2071 | }, 2072 | "protobufjs": { 2073 | "version": "5.0.3", 2074 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 2075 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 2076 | "optional": true, 2077 | "requires": { 2078 | "ascli": "~1", 2079 | "bytebuffer": "~5", 2080 | "glob": "^7.0.5", 2081 | "yargs": "^3.10.0" 2082 | } 2083 | }, 2084 | "rc": { 2085 | "version": "1.2.8", 2086 | "bundled": true, 2087 | "optional": true, 2088 | "requires": { 2089 | "deep-extend": "^0.6.0", 2090 | "ini": "~1.3.0", 2091 | "minimist": "^1.2.0", 2092 | "strip-json-comments": "~2.0.1" 2093 | } 2094 | }, 2095 | "readable-stream": { 2096 | "version": "2.3.6", 2097 | "bundled": true, 2098 | "optional": true, 2099 | "requires": { 2100 | "core-util-is": "~1.0.0", 2101 | "inherits": "~2.0.3", 2102 | "isarray": "~1.0.0", 2103 | "process-nextick-args": "~2.0.0", 2104 | "safe-buffer": "~5.1.1", 2105 | "string_decoder": "~1.1.1", 2106 | "util-deprecate": "~1.0.1" 2107 | } 2108 | }, 2109 | "rimraf": { 2110 | "version": "2.7.1", 2111 | "bundled": true, 2112 | "optional": true, 2113 | "requires": { 2114 | "glob": "^7.1.3" 2115 | } 2116 | }, 2117 | "safe-buffer": { 2118 | "version": "5.1.2", 2119 | "bundled": true, 2120 | "optional": true 2121 | }, 2122 | "safer-buffer": { 2123 | "version": "2.1.2", 2124 | "bundled": true, 2125 | "optional": true 2126 | }, 2127 | "sax": { 2128 | "version": "1.2.4", 2129 | "bundled": true, 2130 | "optional": true 2131 | }, 2132 | "semver": { 2133 | "version": "5.7.1", 2134 | "bundled": true, 2135 | "optional": true 2136 | }, 2137 | "set-blocking": { 2138 | "version": "2.0.0", 2139 | "bundled": true, 2140 | "optional": true 2141 | }, 2142 | "signal-exit": { 2143 | "version": "3.0.2", 2144 | "bundled": true, 2145 | "optional": true 2146 | }, 2147 | "string-width": { 2148 | "version": "1.0.2", 2149 | "bundled": true, 2150 | "optional": true, 2151 | "requires": { 2152 | "code-point-at": "^1.0.0", 2153 | "is-fullwidth-code-point": "^1.0.0", 2154 | "strip-ansi": "^3.0.0" 2155 | } 2156 | }, 2157 | "string_decoder": { 2158 | "version": "1.1.1", 2159 | "bundled": true, 2160 | "optional": true, 2161 | "requires": { 2162 | "safe-buffer": "~5.1.0" 2163 | } 2164 | }, 2165 | "strip-ansi": { 2166 | "version": "3.0.1", 2167 | "bundled": true, 2168 | "optional": true, 2169 | "requires": { 2170 | "ansi-regex": "^2.0.0" 2171 | } 2172 | }, 2173 | "strip-json-comments": { 2174 | "version": "2.0.1", 2175 | "bundled": true, 2176 | "optional": true 2177 | }, 2178 | "tar": { 2179 | "version": "4.4.13", 2180 | "bundled": true, 2181 | "optional": true, 2182 | "requires": { 2183 | "chownr": "^1.1.1", 2184 | "fs-minipass": "^1.2.5", 2185 | "minipass": "^2.8.6", 2186 | "minizlib": "^1.2.1", 2187 | "mkdirp": "^0.5.0", 2188 | "safe-buffer": "^5.1.2", 2189 | "yallist": "^3.0.3" 2190 | } 2191 | }, 2192 | "util-deprecate": { 2193 | "version": "1.0.2", 2194 | "bundled": true, 2195 | "optional": true 2196 | }, 2197 | "wide-align": { 2198 | "version": "1.1.3", 2199 | "bundled": true, 2200 | "optional": true, 2201 | "requires": { 2202 | "string-width": "^1.0.2 || 2" 2203 | } 2204 | }, 2205 | "wrappy": { 2206 | "version": "1.0.2", 2207 | "bundled": true, 2208 | "optional": true 2209 | }, 2210 | "yallist": { 2211 | "version": "3.1.1", 2212 | "bundled": true, 2213 | "optional": true 2214 | } 2215 | } 2216 | }, 2217 | "grpc-gcp": { 2218 | "version": "0.1.1", 2219 | "resolved": "https://registry.npmjs.org/grpc-gcp/-/grpc-gcp-0.1.1.tgz", 2220 | "integrity": "sha512-MAt0Ae9QuL2Lbbt2d+kDta5AxqRD1JVXtBcJuQKp9GeFL5TxPw/hxIyDNyivPjKEXjbG3cBGwSE3CXq6a3KHEQ==", 2221 | "optional": true, 2222 | "requires": { 2223 | "grpc": "^1.16.0", 2224 | "protobufjs": "^6.8.8" 2225 | } 2226 | }, 2227 | "gtoken": { 2228 | "version": "2.3.3", 2229 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 2230 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 2231 | "optional": true, 2232 | "requires": { 2233 | "gaxios": "^1.0.4", 2234 | "google-p12-pem": "^1.0.0", 2235 | "jws": "^3.1.5", 2236 | "mime": "^2.2.0", 2237 | "pify": "^4.0.0" 2238 | } 2239 | }, 2240 | "has": { 2241 | "version": "1.0.3", 2242 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2243 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2244 | "requires": { 2245 | "function-bind": "^1.1.1" 2246 | } 2247 | }, 2248 | "has-symbols": { 2249 | "version": "1.0.1", 2250 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 2251 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 2252 | }, 2253 | "hash-stream-validation": { 2254 | "version": "0.2.1", 2255 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", 2256 | "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", 2257 | "optional": true, 2258 | "requires": { 2259 | "through2": "^2.0.0" 2260 | }, 2261 | "dependencies": { 2262 | "isarray": { 2263 | "version": "1.0.0", 2264 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2265 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2266 | "optional": true 2267 | }, 2268 | "readable-stream": { 2269 | "version": "2.3.6", 2270 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2271 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2272 | "optional": true, 2273 | "requires": { 2274 | "core-util-is": "~1.0.0", 2275 | "inherits": "~2.0.3", 2276 | "isarray": "~1.0.0", 2277 | "process-nextick-args": "~2.0.0", 2278 | "safe-buffer": "~5.1.1", 2279 | "string_decoder": "~1.1.1", 2280 | "util-deprecate": "~1.0.1" 2281 | } 2282 | }, 2283 | "string_decoder": { 2284 | "version": "1.1.1", 2285 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2286 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2287 | "optional": true, 2288 | "requires": { 2289 | "safe-buffer": "~5.1.0" 2290 | } 2291 | }, 2292 | "through2": { 2293 | "version": "2.0.5", 2294 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2295 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2296 | "optional": true, 2297 | "requires": { 2298 | "readable-stream": "~2.3.6", 2299 | "xtend": "~4.0.1" 2300 | } 2301 | } 2302 | } 2303 | }, 2304 | "http-errors": { 2305 | "version": "1.6.3", 2306 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 2307 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 2308 | "requires": { 2309 | "depd": "~1.1.2", 2310 | "inherits": "2.0.3", 2311 | "setprototypeof": "1.1.0", 2312 | "statuses": ">= 1.4.0 < 2" 2313 | } 2314 | }, 2315 | "http-parser-js": { 2316 | "version": "0.5.0", 2317 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", 2318 | "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" 2319 | }, 2320 | "https-proxy-agent": { 2321 | "version": "2.2.4", 2322 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 2323 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 2324 | "optional": true, 2325 | "requires": { 2326 | "agent-base": "^4.3.0", 2327 | "debug": "^3.1.0" 2328 | } 2329 | }, 2330 | "iconv-lite": { 2331 | "version": "0.4.23", 2332 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 2333 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 2334 | "requires": { 2335 | "safer-buffer": ">= 2.1.2 < 3" 2336 | } 2337 | }, 2338 | "imurmurhash": { 2339 | "version": "0.1.4", 2340 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2341 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2342 | "optional": true 2343 | }, 2344 | "inflight": { 2345 | "version": "1.0.6", 2346 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2347 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2348 | "requires": { 2349 | "once": "^1.3.0", 2350 | "wrappy": "1" 2351 | } 2352 | }, 2353 | "inherits": { 2354 | "version": "2.0.3", 2355 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2356 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2357 | }, 2358 | "invert-kv": { 2359 | "version": "1.0.0", 2360 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 2361 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 2362 | }, 2363 | "ipaddr.js": { 2364 | "version": "1.8.0", 2365 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 2366 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 2367 | }, 2368 | "is-arguments": { 2369 | "version": "1.0.4", 2370 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 2371 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 2372 | "optional": true 2373 | }, 2374 | "is-callable": { 2375 | "version": "1.1.5", 2376 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 2377 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 2378 | }, 2379 | "is-date-object": { 2380 | "version": "1.0.2", 2381 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 2382 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 2383 | }, 2384 | "is-fullwidth-code-point": { 2385 | "version": "1.0.0", 2386 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2387 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2388 | "requires": { 2389 | "number-is-nan": "^1.0.0" 2390 | } 2391 | }, 2392 | "is-obj": { 2393 | "version": "1.0.1", 2394 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 2395 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 2396 | "optional": true 2397 | }, 2398 | "is-regex": { 2399 | "version": "1.0.5", 2400 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 2401 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 2402 | "requires": { 2403 | "has": "^1.0.3" 2404 | } 2405 | }, 2406 | "is-stream": { 2407 | "version": "1.1.0", 2408 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 2409 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 2410 | }, 2411 | "is-stream-ended": { 2412 | "version": "0.1.4", 2413 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 2414 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", 2415 | "optional": true 2416 | }, 2417 | "is-symbol": { 2418 | "version": "1.0.3", 2419 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 2420 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 2421 | "requires": { 2422 | "has-symbols": "^1.0.1" 2423 | } 2424 | }, 2425 | "isarray": { 2426 | "version": "0.0.1", 2427 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2428 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2429 | "optional": true 2430 | }, 2431 | "isomorphic-fetch": { 2432 | "version": "2.2.1", 2433 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 2434 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", 2435 | "requires": { 2436 | "node-fetch": "^1.0.1", 2437 | "whatwg-fetch": ">=0.10.0" 2438 | }, 2439 | "dependencies": { 2440 | "node-fetch": { 2441 | "version": "1.7.3", 2442 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 2443 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 2444 | "requires": { 2445 | "encoding": "^0.1.11", 2446 | "is-stream": "^1.0.1" 2447 | } 2448 | } 2449 | } 2450 | }, 2451 | "json-bigint": { 2452 | "version": "0.3.0", 2453 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", 2454 | "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", 2455 | "optional": true, 2456 | "requires": { 2457 | "bignumber.js": "^7.0.0" 2458 | } 2459 | }, 2460 | "jsonwebtoken": { 2461 | "version": "8.1.0", 2462 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", 2463 | "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", 2464 | "requires": { 2465 | "jws": "^3.1.4", 2466 | "lodash.includes": "^4.3.0", 2467 | "lodash.isboolean": "^3.0.3", 2468 | "lodash.isinteger": "^4.0.4", 2469 | "lodash.isnumber": "^3.0.3", 2470 | "lodash.isplainobject": "^4.0.6", 2471 | "lodash.isstring": "^4.0.1", 2472 | "lodash.once": "^4.0.0", 2473 | "ms": "^2.0.0", 2474 | "xtend": "^4.0.1" 2475 | } 2476 | }, 2477 | "jwa": { 2478 | "version": "1.4.0", 2479 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.0.tgz", 2480 | "integrity": "sha512-mt6IHaq0ZZWDBspg0Pheu3r9sVNMEZn+GJe1zcdYyhFcDSclp3J8xEdO4PjZolZ2i8xlaVU1LetHM0nJejYsEw==", 2481 | "requires": { 2482 | "buffer-equal-constant-time": "1.0.1", 2483 | "ecdsa-sig-formatter": "1.0.11", 2484 | "safe-buffer": "^5.0.1" 2485 | } 2486 | }, 2487 | "jws": { 2488 | "version": "3.2.1", 2489 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz", 2490 | "integrity": "sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g==", 2491 | "requires": { 2492 | "jwa": "^1.2.0", 2493 | "safe-buffer": "^5.0.1" 2494 | } 2495 | }, 2496 | "lcid": { 2497 | "version": "1.0.0", 2498 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2499 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2500 | "requires": { 2501 | "invert-kv": "^1.0.0" 2502 | } 2503 | }, 2504 | "lodash": { 2505 | "version": "4.17.15", 2506 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 2507 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 2508 | }, 2509 | "lodash.at": { 2510 | "version": "4.6.0", 2511 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", 2512 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=", 2513 | "optional": true 2514 | }, 2515 | "lodash.camelcase": { 2516 | "version": "4.3.0", 2517 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 2518 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 2519 | }, 2520 | "lodash.clone": { 2521 | "version": "4.5.0", 2522 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 2523 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" 2524 | }, 2525 | "lodash.has": { 2526 | "version": "4.5.2", 2527 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", 2528 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", 2529 | "optional": true 2530 | }, 2531 | "lodash.includes": { 2532 | "version": "4.3.0", 2533 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2534 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 2535 | }, 2536 | "lodash.isboolean": { 2537 | "version": "3.0.3", 2538 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2539 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 2540 | }, 2541 | "lodash.isinteger": { 2542 | "version": "4.0.4", 2543 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2544 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 2545 | }, 2546 | "lodash.isnumber": { 2547 | "version": "3.0.3", 2548 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2549 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 2550 | }, 2551 | "lodash.isplainobject": { 2552 | "version": "4.0.6", 2553 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2554 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 2555 | }, 2556 | "lodash.isstring": { 2557 | "version": "4.0.1", 2558 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2559 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 2560 | }, 2561 | "lodash.merge": { 2562 | "version": "4.6.2", 2563 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2564 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2565 | "optional": true 2566 | }, 2567 | "lodash.once": { 2568 | "version": "4.1.1", 2569 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2570 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 2571 | }, 2572 | "long": { 2573 | "version": "4.0.0", 2574 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 2575 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", 2576 | "optional": true 2577 | }, 2578 | "lru-cache": { 2579 | "version": "5.1.1", 2580 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2581 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2582 | "optional": true, 2583 | "requires": { 2584 | "yallist": "^3.0.2" 2585 | } 2586 | }, 2587 | "make-dir": { 2588 | "version": "1.3.0", 2589 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 2590 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 2591 | "optional": true, 2592 | "requires": { 2593 | "pify": "^3.0.0" 2594 | }, 2595 | "dependencies": { 2596 | "pify": { 2597 | "version": "3.0.0", 2598 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2599 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2600 | "optional": true 2601 | } 2602 | } 2603 | }, 2604 | "media-typer": { 2605 | "version": "0.3.0", 2606 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2607 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2608 | }, 2609 | "merge-descriptors": { 2610 | "version": "1.0.1", 2611 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2612 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2613 | }, 2614 | "methods": { 2615 | "version": "1.1.2", 2616 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2617 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2618 | }, 2619 | "mime": { 2620 | "version": "2.4.0", 2621 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", 2622 | "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", 2623 | "optional": true 2624 | }, 2625 | "mime-db": { 2626 | "version": "1.38.0", 2627 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 2628 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 2629 | }, 2630 | "mime-types": { 2631 | "version": "2.1.22", 2632 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 2633 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 2634 | "requires": { 2635 | "mime-db": "~1.38.0" 2636 | } 2637 | }, 2638 | "minimatch": { 2639 | "version": "3.0.4", 2640 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2641 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2642 | "requires": { 2643 | "brace-expansion": "^1.1.7" 2644 | } 2645 | }, 2646 | "ms": { 2647 | "version": "2.1.1", 2648 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2649 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2650 | }, 2651 | "nan": { 2652 | "version": "2.14.0", 2653 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 2654 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 2655 | }, 2656 | "negotiator": { 2657 | "version": "0.6.1", 2658 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2659 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 2660 | }, 2661 | "node-fetch": { 2662 | "version": "2.3.0", 2663 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", 2664 | "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", 2665 | "optional": true 2666 | }, 2667 | "node-forge": { 2668 | "version": "0.7.4", 2669 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", 2670 | "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" 2671 | }, 2672 | "number-is-nan": { 2673 | "version": "1.0.1", 2674 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2675 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2676 | }, 2677 | "object-assign": { 2678 | "version": "4.1.1", 2679 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2680 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2681 | }, 2682 | "object-inspect": { 2683 | "version": "1.7.0", 2684 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 2685 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 2686 | }, 2687 | "object-is": { 2688 | "version": "1.1.2", 2689 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", 2690 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", 2691 | "optional": true, 2692 | "requires": { 2693 | "define-properties": "^1.1.3", 2694 | "es-abstract": "^1.17.5" 2695 | } 2696 | }, 2697 | "object-keys": { 2698 | "version": "1.1.1", 2699 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2700 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 2701 | }, 2702 | "object.assign": { 2703 | "version": "4.1.0", 2704 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 2705 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 2706 | "requires": { 2707 | "define-properties": "^1.1.2", 2708 | "function-bind": "^1.1.1", 2709 | "has-symbols": "^1.0.0", 2710 | "object-keys": "^1.0.11" 2711 | } 2712 | }, 2713 | "on-finished": { 2714 | "version": "2.3.0", 2715 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2716 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2717 | "requires": { 2718 | "ee-first": "1.1.1" 2719 | } 2720 | }, 2721 | "once": { 2722 | "version": "1.4.0", 2723 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2724 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2725 | "requires": { 2726 | "wrappy": "1" 2727 | } 2728 | }, 2729 | "optjs": { 2730 | "version": "3.2.2", 2731 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 2732 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 2733 | }, 2734 | "os-locale": { 2735 | "version": "1.4.0", 2736 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2737 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2738 | "requires": { 2739 | "lcid": "^1.0.0" 2740 | } 2741 | }, 2742 | "parseurl": { 2743 | "version": "1.3.2", 2744 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2745 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2746 | }, 2747 | "path-is-absolute": { 2748 | "version": "1.0.1", 2749 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2750 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2751 | }, 2752 | "path-to-regexp": { 2753 | "version": "0.1.7", 2754 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2755 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2756 | }, 2757 | "pify": { 2758 | "version": "4.0.1", 2759 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 2760 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 2761 | "optional": true 2762 | }, 2763 | "process-nextick-args": { 2764 | "version": "2.0.0", 2765 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2766 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 2767 | "optional": true 2768 | }, 2769 | "promise-polyfill": { 2770 | "version": "8.1.0", 2771 | "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", 2772 | "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==" 2773 | }, 2774 | "protobufjs": { 2775 | "version": "6.8.9", 2776 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.9.tgz", 2777 | "integrity": "sha512-j2JlRdUeL/f4Z6x4aU4gj9I2LECglC+5qR2TrWb193Tla1qfdaNQTZ8I27Pt7K0Ajmvjjpft7O3KWTGciz4gpw==", 2778 | "optional": true, 2779 | "requires": { 2780 | "@protobufjs/aspromise": "^1.1.2", 2781 | "@protobufjs/base64": "^1.1.2", 2782 | "@protobufjs/codegen": "^2.0.4", 2783 | "@protobufjs/eventemitter": "^1.1.0", 2784 | "@protobufjs/fetch": "^1.1.0", 2785 | "@protobufjs/float": "^1.0.2", 2786 | "@protobufjs/inquire": "^1.1.0", 2787 | "@protobufjs/path": "^1.1.2", 2788 | "@protobufjs/pool": "^1.1.0", 2789 | "@protobufjs/utf8": "^1.1.0", 2790 | "@types/long": "^4.0.0", 2791 | "@types/node": "^10.1.0", 2792 | "long": "^4.0.0" 2793 | }, 2794 | "dependencies": { 2795 | "@types/node": { 2796 | "version": "10.17.19", 2797 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", 2798 | "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", 2799 | "optional": true 2800 | } 2801 | } 2802 | }, 2803 | "proxy-addr": { 2804 | "version": "2.0.4", 2805 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 2806 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 2807 | "requires": { 2808 | "forwarded": "~0.1.2", 2809 | "ipaddr.js": "1.8.0" 2810 | } 2811 | }, 2812 | "pump": { 2813 | "version": "2.0.1", 2814 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2815 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2816 | "optional": true, 2817 | "requires": { 2818 | "end-of-stream": "^1.1.0", 2819 | "once": "^1.3.1" 2820 | } 2821 | }, 2822 | "pumpify": { 2823 | "version": "1.5.1", 2824 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 2825 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 2826 | "optional": true, 2827 | "requires": { 2828 | "duplexify": "^3.6.0", 2829 | "inherits": "^2.0.3", 2830 | "pump": "^2.0.0" 2831 | } 2832 | }, 2833 | "qs": { 2834 | "version": "6.5.2", 2835 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2836 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2837 | }, 2838 | "range-parser": { 2839 | "version": "1.2.0", 2840 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2841 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2842 | }, 2843 | "raw-body": { 2844 | "version": "2.3.3", 2845 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2846 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2847 | "requires": { 2848 | "bytes": "3.0.0", 2849 | "http-errors": "1.6.3", 2850 | "iconv-lite": "0.4.23", 2851 | "unpipe": "1.0.0" 2852 | } 2853 | }, 2854 | "readable-stream": { 2855 | "version": "1.0.34", 2856 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2857 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2858 | "optional": true, 2859 | "requires": { 2860 | "core-util-is": "~1.0.0", 2861 | "inherits": "~2.0.1", 2862 | "isarray": "0.0.1", 2863 | "string_decoder": "~0.10.x" 2864 | } 2865 | }, 2866 | "regexp.prototype.flags": { 2867 | "version": "1.3.0", 2868 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 2869 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 2870 | "optional": true, 2871 | "requires": { 2872 | "define-properties": "^1.1.3", 2873 | "es-abstract": "^1.17.0-next.1" 2874 | } 2875 | }, 2876 | "retry-request": { 2877 | "version": "4.0.0", 2878 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz", 2879 | "integrity": "sha512-S4HNLaWcMP6r8E4TMH52Y7/pM8uNayOcTDDQNBwsCccL1uI+Ol2TljxRDPzaNfbhOB30+XWP5NnZkB3LiJxi1w==", 2880 | "optional": true, 2881 | "requires": { 2882 | "through2": "^2.0.0" 2883 | }, 2884 | "dependencies": { 2885 | "isarray": { 2886 | "version": "1.0.0", 2887 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2888 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2889 | "optional": true 2890 | }, 2891 | "readable-stream": { 2892 | "version": "2.3.6", 2893 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2894 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2895 | "optional": true, 2896 | "requires": { 2897 | "core-util-is": "~1.0.0", 2898 | "inherits": "~2.0.3", 2899 | "isarray": "~1.0.0", 2900 | "process-nextick-args": "~2.0.0", 2901 | "safe-buffer": "~5.1.1", 2902 | "string_decoder": "~1.1.1", 2903 | "util-deprecate": "~1.0.1" 2904 | } 2905 | }, 2906 | "string_decoder": { 2907 | "version": "1.1.1", 2908 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2909 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2910 | "optional": true, 2911 | "requires": { 2912 | "safe-buffer": "~5.1.0" 2913 | } 2914 | }, 2915 | "through2": { 2916 | "version": "2.0.5", 2917 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2918 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2919 | "optional": true, 2920 | "requires": { 2921 | "readable-stream": "~2.3.6", 2922 | "xtend": "~4.0.1" 2923 | } 2924 | } 2925 | } 2926 | }, 2927 | "safe-buffer": { 2928 | "version": "5.1.2", 2929 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2930 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2931 | }, 2932 | "safer-buffer": { 2933 | "version": "2.1.2", 2934 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2935 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2936 | }, 2937 | "semver": { 2938 | "version": "5.6.0", 2939 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 2940 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 2941 | }, 2942 | "send": { 2943 | "version": "0.16.2", 2944 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 2945 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 2946 | "requires": { 2947 | "debug": "2.6.9", 2948 | "depd": "~1.1.2", 2949 | "destroy": "~1.0.4", 2950 | "encodeurl": "~1.0.2", 2951 | "escape-html": "~1.0.3", 2952 | "etag": "~1.8.1", 2953 | "fresh": "0.5.2", 2954 | "http-errors": "~1.6.2", 2955 | "mime": "1.4.1", 2956 | "ms": "2.0.0", 2957 | "on-finished": "~2.3.0", 2958 | "range-parser": "~1.2.0", 2959 | "statuses": "~1.4.0" 2960 | }, 2961 | "dependencies": { 2962 | "debug": { 2963 | "version": "2.6.9", 2964 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2965 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2966 | "requires": { 2967 | "ms": "2.0.0" 2968 | } 2969 | }, 2970 | "mime": { 2971 | "version": "1.4.1", 2972 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2973 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 2974 | }, 2975 | "ms": { 2976 | "version": "2.0.0", 2977 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2978 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2979 | } 2980 | } 2981 | }, 2982 | "serve-static": { 2983 | "version": "1.13.2", 2984 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 2985 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 2986 | "requires": { 2987 | "encodeurl": "~1.0.2", 2988 | "escape-html": "~1.0.3", 2989 | "parseurl": "~1.3.2", 2990 | "send": "0.16.2" 2991 | } 2992 | }, 2993 | "setprototypeof": { 2994 | "version": "1.1.0", 2995 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2996 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2997 | }, 2998 | "signal-exit": { 2999 | "version": "3.0.2", 3000 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3001 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3002 | "optional": true 3003 | }, 3004 | "snakeize": { 3005 | "version": "0.1.0", 3006 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 3007 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", 3008 | "optional": true 3009 | }, 3010 | "split-array-stream": { 3011 | "version": "2.0.0", 3012 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 3013 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 3014 | "optional": true, 3015 | "requires": { 3016 | "is-stream-ended": "^0.1.4" 3017 | } 3018 | }, 3019 | "statuses": { 3020 | "version": "1.4.0", 3021 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 3022 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 3023 | }, 3024 | "stream-events": { 3025 | "version": "1.0.5", 3026 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 3027 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 3028 | "optional": true, 3029 | "requires": { 3030 | "stubs": "^3.0.0" 3031 | } 3032 | }, 3033 | "stream-shift": { 3034 | "version": "1.0.0", 3035 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 3036 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", 3037 | "optional": true 3038 | }, 3039 | "streamsearch": { 3040 | "version": "0.1.2", 3041 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 3042 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 3043 | }, 3044 | "string-width": { 3045 | "version": "1.0.2", 3046 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3047 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3048 | "requires": { 3049 | "code-point-at": "^1.0.0", 3050 | "is-fullwidth-code-point": "^1.0.0", 3051 | "strip-ansi": "^3.0.0" 3052 | } 3053 | }, 3054 | "string.prototype.trimend": { 3055 | "version": "1.0.1", 3056 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 3057 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 3058 | "requires": { 3059 | "define-properties": "^1.1.3", 3060 | "es-abstract": "^1.17.5" 3061 | } 3062 | }, 3063 | "string.prototype.trimleft": { 3064 | "version": "2.1.2", 3065 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 3066 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 3067 | "requires": { 3068 | "define-properties": "^1.1.3", 3069 | "es-abstract": "^1.17.5", 3070 | "string.prototype.trimstart": "^1.0.0" 3071 | } 3072 | }, 3073 | "string.prototype.trimright": { 3074 | "version": "2.1.2", 3075 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 3076 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 3077 | "requires": { 3078 | "define-properties": "^1.1.3", 3079 | "es-abstract": "^1.17.5", 3080 | "string.prototype.trimend": "^1.0.0" 3081 | } 3082 | }, 3083 | "string.prototype.trimstart": { 3084 | "version": "1.0.1", 3085 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 3086 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 3087 | "requires": { 3088 | "define-properties": "^1.1.3", 3089 | "es-abstract": "^1.17.5" 3090 | } 3091 | }, 3092 | "string_decoder": { 3093 | "version": "0.10.31", 3094 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 3095 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 3096 | "optional": true 3097 | }, 3098 | "strip-ansi": { 3099 | "version": "3.0.1", 3100 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3101 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3102 | "requires": { 3103 | "ansi-regex": "^2.0.0" 3104 | } 3105 | }, 3106 | "stubs": { 3107 | "version": "3.0.0", 3108 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 3109 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", 3110 | "optional": true 3111 | }, 3112 | "teeny-request": { 3113 | "version": "3.11.3", 3114 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", 3115 | "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", 3116 | "optional": true, 3117 | "requires": { 3118 | "https-proxy-agent": "^2.2.1", 3119 | "node-fetch": "^2.2.0", 3120 | "uuid": "^3.3.2" 3121 | } 3122 | }, 3123 | "through2": { 3124 | "version": "3.0.1", 3125 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", 3126 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", 3127 | "optional": true, 3128 | "requires": { 3129 | "readable-stream": "2 || 3" 3130 | }, 3131 | "dependencies": { 3132 | "readable-stream": { 3133 | "version": "3.2.0", 3134 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", 3135 | "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", 3136 | "optional": true, 3137 | "requires": { 3138 | "inherits": "^2.0.3", 3139 | "string_decoder": "^1.1.1", 3140 | "util-deprecate": "^1.0.1" 3141 | } 3142 | }, 3143 | "string_decoder": { 3144 | "version": "1.2.0", 3145 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 3146 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 3147 | "optional": true, 3148 | "requires": { 3149 | "safe-buffer": "~5.1.0" 3150 | } 3151 | } 3152 | } 3153 | }, 3154 | "tslib": { 3155 | "version": "1.9.3", 3156 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 3157 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 3158 | }, 3159 | "type-is": { 3160 | "version": "1.6.16", 3161 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 3162 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 3163 | "requires": { 3164 | "media-typer": "0.3.0", 3165 | "mime-types": "~2.1.18" 3166 | } 3167 | }, 3168 | "typedarray": { 3169 | "version": "0.0.6", 3170 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3171 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3172 | "optional": true 3173 | }, 3174 | "unique-string": { 3175 | "version": "1.0.0", 3176 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 3177 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 3178 | "optional": true, 3179 | "requires": { 3180 | "crypto-random-string": "^1.0.0" 3181 | } 3182 | }, 3183 | "unpipe": { 3184 | "version": "1.0.0", 3185 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3186 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3187 | }, 3188 | "util-deprecate": { 3189 | "version": "1.0.2", 3190 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3191 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3192 | "optional": true 3193 | }, 3194 | "utils-merge": { 3195 | "version": "1.0.1", 3196 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3197 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3198 | }, 3199 | "uuid": { 3200 | "version": "3.3.2", 3201 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 3202 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 3203 | "optional": true 3204 | }, 3205 | "uuidv4": { 3206 | "version": "6.0.7", 3207 | "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.0.7.tgz", 3208 | "integrity": "sha512-4mpYRFNqO22EckzxPSJ/+xjn9GgO6SAqEJ33yt23Y+HZZoZOt/6l4U4iIjc86ZfxSN2fSCGGmHNb3kiACFNd1g==", 3209 | "requires": { 3210 | "uuid": "7.0.3" 3211 | }, 3212 | "dependencies": { 3213 | "uuid": { 3214 | "version": "7.0.3", 3215 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", 3216 | "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" 3217 | } 3218 | } 3219 | }, 3220 | "vary": { 3221 | "version": "1.1.2", 3222 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3223 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3224 | }, 3225 | "walkdir": { 3226 | "version": "0.3.2", 3227 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.3.2.tgz", 3228 | "integrity": "sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==", 3229 | "optional": true 3230 | }, 3231 | "websocket-driver": { 3232 | "version": "0.7.0", 3233 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", 3234 | "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", 3235 | "requires": { 3236 | "http-parser-js": ">=0.4.0", 3237 | "websocket-extensions": ">=0.1.1" 3238 | } 3239 | }, 3240 | "websocket-extensions": { 3241 | "version": "0.1.3", 3242 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", 3243 | "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" 3244 | }, 3245 | "whatwg-fetch": { 3246 | "version": "3.0.0", 3247 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", 3248 | "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" 3249 | }, 3250 | "window-size": { 3251 | "version": "0.1.4", 3252 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 3253 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 3254 | }, 3255 | "wrap-ansi": { 3256 | "version": "2.1.0", 3257 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 3258 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 3259 | "requires": { 3260 | "string-width": "^1.0.1", 3261 | "strip-ansi": "^3.0.1" 3262 | } 3263 | }, 3264 | "wrappy": { 3265 | "version": "1.0.2", 3266 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3267 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3268 | }, 3269 | "write-file-atomic": { 3270 | "version": "2.4.2", 3271 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", 3272 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", 3273 | "optional": true, 3274 | "requires": { 3275 | "graceful-fs": "^4.1.11", 3276 | "imurmurhash": "^0.1.4", 3277 | "signal-exit": "^3.0.2" 3278 | } 3279 | }, 3280 | "xdg-basedir": { 3281 | "version": "3.0.0", 3282 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 3283 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 3284 | "optional": true 3285 | }, 3286 | "xmlhttprequest": { 3287 | "version": "1.8.0", 3288 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 3289 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 3290 | }, 3291 | "xtend": { 3292 | "version": "4.0.1", 3293 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 3294 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 3295 | }, 3296 | "y18n": { 3297 | "version": "3.2.1", 3298 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 3299 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 3300 | }, 3301 | "yallist": { 3302 | "version": "3.0.3", 3303 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 3304 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", 3305 | "optional": true 3306 | }, 3307 | "yargs": { 3308 | "version": "3.32.0", 3309 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 3310 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 3311 | "requires": { 3312 | "camelcase": "^2.0.1", 3313 | "cliui": "^3.0.3", 3314 | "decamelize": "^1.1.1", 3315 | "os-locale": "^1.4.0", 3316 | "string-width": "^1.0.1", 3317 | "window-size": "^0.1.4", 3318 | "y18n": "^3.2.0" 3319 | } 3320 | } 3321 | } 3322 | } 3323 | -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "scripts": { 5 | "serve": "firebase serve --only functions", 6 | "shell": "firebase functions:shell", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "dependencies": { 12 | "busboy": "^0.3.0", 13 | "cors": "^2.8.5", 14 | "express": "^4.16.4", 15 | "firebase": "^5.9.0", 16 | "firebase-admin": "~7.0.0", 17 | "firebase-functions": "^2.2.0", 18 | "uuidv4": "^6.0.7" 19 | }, 20 | "private": true 21 | } 22 | -------------------------------------------------------------------------------- /functions/util/admin.js: -------------------------------------------------------------------------------- 1 | const admin = require('firebase-admin'); 2 | 3 | admin.initializeApp(); 4 | 5 | const db = admin.firestore(); 6 | 7 | module.exports = { admin, db }; 8 | -------------------------------------------------------------------------------- /functions/util/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apiKey: 'AIzaSyBGE61bBXSyRfOccvujvR8VjWfB1BjW-Og', 3 | authDomain: 'socialape-d081e.firebaseapp.com', 4 | databaseURL: 'https://socialape-d081e.firebaseio.com', 5 | projectId: 'socialape-d081e', 6 | storageBucket: 'socialape-d081e.appspot.com', 7 | messagingSenderId: '354040522108' 8 | }; 9 | -------------------------------------------------------------------------------- /functions/util/fbAuth.js: -------------------------------------------------------------------------------- 1 | const { admin, db } = require('./admin'); 2 | 3 | module.exports = (req, res, next) => { 4 | let idToken; 5 | if ( 6 | req.headers.authorization && 7 | req.headers.authorization.startsWith('Bearer ') 8 | ) { 9 | idToken = req.headers.authorization.split('Bearer ')[1]; 10 | } else { 11 | console.error('No token found'); 12 | return res.status(403).json({ error: 'Unauthorized' }); 13 | } 14 | 15 | admin 16 | .auth() 17 | .verifyIdToken(idToken) 18 | .then((decodedToken) => { 19 | req.user = decodedToken; 20 | return db 21 | .collection('users') 22 | .where('userId', '==', req.user.uid) 23 | .limit(1) 24 | .get(); 25 | }) 26 | .then((data) => { 27 | req.user.handle = data.docs[0].data().handle; 28 | req.user.imageUrl = data.docs[0].data().imageUrl; 29 | return next(); 30 | }) 31 | .catch((err) => { 32 | console.error('Error while verifying token ', err); 33 | return res.status(403).json(err); 34 | }); 35 | }; 36 | -------------------------------------------------------------------------------- /functions/util/validators.js: -------------------------------------------------------------------------------- 1 | const isEmail = (email) => { 2 | const regEx = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 3 | if (email.match(regEx)) return true; 4 | else return false; 5 | }; 6 | 7 | const isEmpty = (string) => { 8 | if (string.trim() === '') return true; 9 | else return false; 10 | }; 11 | 12 | exports.validateSignupData = (data) => { 13 | let errors = {}; 14 | 15 | if (isEmpty(data.email)) { 16 | errors.email = 'Must not be empty'; 17 | } else if (!isEmail(data.email)) { 18 | errors.email = 'Must be a valid email address'; 19 | } 20 | 21 | if (isEmpty(data.password)) errors.password = 'Must not be empty'; 22 | if (data.password !== data.confirmPassword) 23 | errors.confirmPassword = 'Passwords must match'; 24 | if (isEmpty(data.handle)) errors.handle = 'Must not be empty'; 25 | 26 | return { 27 | errors, 28 | valid: Object.keys(errors).length === 0 ? true : false 29 | }; 30 | }; 31 | 32 | exports.validateLoginData = (data) => { 33 | let errors = {}; 34 | 35 | if (isEmpty(data.email)) errors.email = 'Must not be empty'; 36 | if (isEmpty(data.password)) errors.password = 'Must not be empty'; 37 | 38 | return { 39 | errors, 40 | valid: Object.keys(errors).length === 0 ? true : false 41 | }; 42 | }; 43 | 44 | exports.reduceUserDetails = (data) => { 45 | let userDetails = {}; 46 | 47 | if (!isEmpty(data.bio.trim())) userDetails.bio = data.bio; 48 | if (!isEmpty(data.website.trim())) { 49 | // https://website.com 50 | if (data.website.trim().substring(0, 4) !== 'http') { 51 | userDetails.website = `http://${data.website.trim()}`; 52 | } else userDetails.website = data.website; 53 | } 54 | if (!isEmpty(data.location.trim())) userDetails.location = data.location; 55 | 56 | return userDetails; 57 | }; 58 | --------------------------------------------------------------------------------